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