Pengkodean Sistem HASIL DAN PEMBAHASAN

81 Gambar 4.5. Flowchart Ethernet Shield

4.3 Pengkodean Sistem

Pada tahap ini, peneliti membuat kode program untuk merealisasikan rancang bangun prototipe yang sebelumnya telah dibuat. Peneliti membuat dua kode program yiatu untuk alat monitoring lingkungannya dengan IDE Arduino dengan bahasa pemrograman C serta kode program untuk mengambil dan mengirim data hasil monitoring ke server dengan bahasa pemrograman PHP. Kode program pada alat yang dibuat terdiri dari beberapa fungsi, yaitu: 1. Fungsi untuk mendeteksi tingkat radioaktivitas gamma gross, 2. Fungsi untuk mendeteksi kondisi suhu dan kelembaban udara, 3. Fungsi untuk mendeteksi arah dan kecepatan angin serta curah hujan, 4. Fungsi untuk mengirim data monitoring ke server. 82 Berikut adalah potongan kode program Arduino untuk alat monitoring lingkungan tersebut: 1. Kode program untuk mendeteksi tingkat radioaktivitas gamma gross ISR TIMER2_COMPA_vect { unsigned int counterValue = TCNT1; g timerToSec++; if counterValue lastCounterValue { overflow was occured accCount += 65535; accCount += counterValue; accCount -= lastCounterValue; } else { accCount += counterValue; accCount -= lastCounterValue; } lastCounterValue = counterValue; if timerToUpdate == timerToSec { sum of all count in buffer countForCps = countForCps - counts[countBufPos] + accCount; store last count value into ring-buffer counts[countBufPos] = accCount; accCount = 0; number of stored count in ring-buffer if filledCount NUM_COUNT filledCount++; calculate cps float c = countForCps; c = c filledCount NUM_COUNT; cps[countBufPos] = c; modify ring-buffer position countBufPos++; if countBufPos = NUM_COUNT { countBufPos = 0; } timerToUpdate += UPDATE_IF_COUNT; } one second ellapsed if timerToSec = TIMER_TO_SEC { timerToSec = 0; timerToUpdate = UPDATE_IF_COUNT; 83 requestToSend++; nseconds ++; totalCount += countForCps; } Penjelasan: Untuk menghitung CPS counter per second dari radioaktivitas gamma gross, maka digunakan fungsi ISRTimer yang telah tersedia pada Arduino. Fungsi tersebut akan menghitung nilai counter yang terjadi saat sensor mendeteksi adanya peningkatan radioaktivitas. 2. Kode program untuk mendeteksi kondisi suhu dan kelembaban udara ndht = 0; do { chk = DHT.read21DHT21_PIN; ndht++; } while chk = DHTLIB_OK ndht 100; switch chk { case DHTLIB_OK: data.concatOK, ; break; case DHTLIB_ERROR_CHECKSUM: data.concatChecksum error, ; break; case DHTLIB_ERROR_TIMEOUT: data.concatTime out error, ; break; default: data.concatUnknown error, ; break; } float lembab = DHT.humidity; float temp = DHT.temperature; Penjelasan: Untuk menghitung suhu dan kelembaban, pada source code ini digunakan class humidity dan temperature yang terdapat pada library DHT21. 84 3. Kode program untuk mendeteksi arah angin String windDirection{ sensorValue = analogReadwindrichtungsPin; lesen Sensor an Pin 3 analog sensorVolt = mapsensorValue, 1, 1024, 1, 5000; wandeln Werte aus den Bereich 0 - 1024 in 0 bis 5000 um String Direction = ; String Dir = ; float v = 0; Serial.print Tegangan mV= ; Serial.println sensorVolt; ifsensorVolt = 3797 sensorVolt =3850{ v = sensorVolt; Dir= North; Direction = Dir + v; Serial.printlnNorth; } else ifsensorVolt = 1960 sensorVolt =1995{ v = sensorVolt; Dir= NorthNorthEast; Direction = Dir + v; Direction = NorthNorthEast; Serial.printlnNorthNorthEast; } else ifsensorVolt = 2219 sensorVolt =2260{ v = sensorVolt; Dir= NorthEast; Direction = Dir + v; Direction = NorthEast; Serial.printlnNorthEast; } else ifsensorVolt =391 sensorVolt =426{ v = sensorVolt; Dir= EastNorthEast; Direction = Dir + v; Direction = EastNorthEast; Serial.printlnEastNorthEast; } else ifsensorVolt = 431 sensorVolt =455{ v = sensorVolt; Dir= East; Direction = Dir + v; Direction = East; Serial.printlnEast; } else ifsensorVolt = 303 sensorVolt =330{ v = sensorVolt; Dir= EastSouthEast; Direction = Dir + v; Direction = EastSouthEast; Serial.printlnEastSouthEast; } else ifsensorVolt = 875 sensorVolt =905{ 85 v = sensorVolt; Dir= SouthEast; Direction = Dir + v; Direction = SouthEast; Serial.printlnSouthEast; } else ifsensorVolt = 592 sensorVolt =625{ v = sensorVolt; Dir= SouthSouthEast; Direction = Dir + v; Direction = SouthSouthEast; Serial.printlnSouthSouthEast; } else ifsensorVolt = 1374 sensorVolt =1420{ v = sensorVolt; Dir= South; Direction = Dir + v; Direction = South; Serial.printlnSouth; } else ifsensorVolt = 1173 sensorVolt =1200{ v = sensorVolt; Dir= SouthSouthWest; Direction = Dir + v; Direction = SouthSouthWest; Serial.printlnSouthSouthWest; } else ifsensorVolt = 3055 sensorVolt =3084{ v = sensorVolt; Dir= SouthWest; Direction = Dir + v; Direction = SouthWest; Serial.printlnSoutWest; } else ifsensorVolt = 2913 sensorVolt =2940{ v = sensorVolt; Dir= WestSouthWest; Direction = Dir + v; Direction = WestSouthWest; Serial.printlnWestSouthWest; } else ifsensorVolt = 4609 sensorVolt =4628{ v = sensorVolt; Dir= West; Direction = Dir + v; Direction = West; Serial.printlnWest; } else ifsensorVolt = 4032 sensorVolt =4056{ v = sensorVolt; Dir= WestNorthWest; Direction = Dir + v; Direction = WestNorthWest; Serial.printlnWestNorthWest; } else ifsensorVolt = 4320 sensorVolt =4784{ 86 v = sensorVolt; Dir= NorthWest; Direction = Dir + v; Direction = NorthWest; Serial.printlnNorthWest; } else ifsensorVolt = 3421 sensorVolt =3450{ v = sensorVolt; Dir= NorthNorthWest; Direction = Dir + v; Direction = NorthNorthWest; Serial.printlnNorthNorthWest; } return Direction; } Penjelasan: Fungsi windDirection akan menghitung tegangan yang terdeteksi oleh sensor kemudian akan ditentukan arah angin yang terdeteksi berdasarkan tegangan tersebut. 4. Kode program untuk mendeteksi kecepatan angin ifdef USE_WIND_DEVICES class WindSpeedDevice { public: WindSpeedDevice byte pin { _pin = pin; _windSpeed = 0; if pin == 2 { attachInterrupt 0, windSpeedInterrupt0, RISING ; } else if pin == 3 { attachInterrupt 1, windSpeedInterrupt1, RISING ; } else { sendErrorMEC_INVALID_PIN; } } returns wind speed in meters per second float value { We need to check the times here because the interrupt wont trigger in the case of an immediate stop. This is unlikely with actual wind, but we still want it to say 0 if you grab it and stop it. if _pin == 2 { if millis - g_lastWindTime0 1492 87 g_windSpeed0 = 0; _windSpeed = g_windSpeed0; } else if_pin == 3 { if millis - g_lastWindTime1 1492 g_windSpeed1 = 0; _windSpeed = g_windSpeed1; } return _windSpeed 0.447038; ms } private: float _windSpeed; int _pin; }; endif USE_WIND_DEVICES Penjelasan: Source code ini menggunakan class WindSpeedDevice yang terdapat pada library WireGarden. Fungsi ini akan menghitung kecepatan angin dan menghasilkan kecepatan dalam meter per detik. 5. Kode program untuk mendeteksi curah hujan ifdef USE_RAIN_GAUGE_DEVICE interrupt for computing rainfall void rainInterrupt0 { unsigned long time = millis; int tDiff = time - g_lastRainTime0; if tDiff 100 { if enough time since last time debounce g_rainCount0++; g_lastRainTime0 = time; } } additional interrupt for computing rainfall void rainInterrupt1 { unsigned long time = millis; int tDiff = time - g_lastRainTime1; if tDiff 100 { if enough time since last time debounce g_rainCount1++; g_lastRainTime1 = time; } } class RainGaugeDevice : public Device { public: 88 RainGaugeDevice byte pin : Device pin { _totalRain = 0; _rainFactor = 0.011; Each time the rain gauge tips, its 0.011 in of rain _pin = pin; if pin == 2 { attachInterrupt 0, rainInterrupt0, RISING ; } else if pin == 3 { attachInterrupt 1, rainInterrupt1, RISING ; } else { sendErrorMEC_INVALID_PIN; } } float value { int rainCount = 0; if _pin == 2 { rainCount = g_rainCount0; } else if_pin == 3 { rainCount = g_rainCount1; } _totalRain = rainCount _rainFactor; return _totalRain; } private: float _rainFactor; float _totalRain; int _pin; }; endif Penjelasan: Source code ini menggunakan class RainGaugeDevice yang terdapat pada library WireGarden. Fungsi ini akan menghitung curah hujan dalam satuan inchi. 6. Kode program untuk mengirim data monitoring ke server radiasi = radiasiCol + counter + smd + avgCps + sama + suhuCol + counter + smd + temp + sama + kelembabanCol + counter + smd + lembab + kecCol + counter + smd + windSpeedValue + sama + arahCol + counter + smd + arahAngin + sama + curahCol + counter + smd + rainValue; 89 post via ethernet if client.connectserver, 80 { ifdef DEBUG Serial.printlnConnected to server; Serial.printlnradiasi; endif counter++; client.printPOST cobains.php?; client.print HTTP1.1; client.printlnHost: 169.254.251.155; client.printlnUser-Agent: Arduino1.0; client.printlnContent-Type:applicationx-www-form- urlencoded;; client.printlnConnection: close; client.printContent-Length: ; client.printlnradiasi.length; client.println; client.printlndata; } else{ ifdef DEBUG Serial.printlnConnection failed; endif } Penjelasan: Kode program diatas akan menjalankan program untuk mengirim data hasil monitoring dengan HTTP Protocol dengan method POST. Selain kode progam pada sensor-sensor, ehternet shield dan modul Arduino, pada server juga perlu dibuat suatu program untuk menerima 90 GET data hasil monitoring dari alat lalu mengirim data tersebut ke database yang telah dibuat INSERT data. Oleh karena itu, penulis juga menulis program tersebut dengan bahasa pemrograman web server side yaitu PHP. Berikut dibawah ini potongan dari kode program PHP tersebut. ?php username = root; password = ; database = monitoringlingkungan; localhost = localhost; dbh=mysql_connectlocalhost,username,password; selected=mysql_select_dbdatabase,dbh; tablename = monling_data_cacah; counter=1; id_radiasi= 1; id_suhu= 4; id_kelembaban= 5; id_arah= 2; id_cepat= 3; id_hujan= 7; while isset_GET[data.counter]{ query = INSERT INTO tablename cacah_sens_id, cacah_data, cacah_waktu VALUES id_radiasi,._GET[data.counter]., now,id_suhu,._GET[suhu.counter].,now,id_ke lembaban, ._GET[kelembaban.counter].,now,id_arah,._GET [windDir.counter].,now,id_cepat,._GET[windSpee d.counter]., now,id_hujan, ._GET[curahHujan.counter]., now; result=mysql_queryquery; 91 ifresult{echo berhasil;} else{echo gagal;} counter++; }? Penjelasan: Pada kode program diatas terdapat inisialisasi database dan tabel yang dituju untuk data hasil monitoring. Untuk menerima data tersebut, maka digunakan fungsi _GET[radiasi] , lalu untuk memasukkan data tersebut maka querynya adalah query = INSERT INTO tablename VALUES . 92

4.4 Pengujian Alat