V dengan 2 resistor seperti tampak pada Gambar III.30 (a) di atas. Pin-pin masukan CC1100 yang dimaksud adalah SI, CS, dan SCK. Sehingga konfigurasi antar muka pin-pin pada mikrokontroler dan transceiver dapat dilihat pada Gambar III.30 (b) di atas. Semua interkoneksi dari ATMega128 ke CC1100 diberi tanda kotak dengan artian interkoneksi tersebut membutuhkan rangkaian pada Gambar III.30 (a). Pin GDO2 CC1100 terhubung ke mikrokontroler pada 2 pin, pin masukan (PINB.5) dan pin interupsi (INT0). Maksud interkoneksi ini akan dijelaskan lebih lanjut pada bagian perancangan perangkat lunak. Skematik PCB antarmuka dapat dilihat pada Gambar III.31 di bawah ini.
Gambar III.31. Desain rangkaian sub-sistem transceiver RF.
III.7.2 Implementasi
Gambar III.32. Tata letak komponen sub-sistem transceiver RF.
64
Implementasi rangkaian antarmuka transceiver RF dilakukan secara manual dengan menggunakan PCB Matriks dengan pertimbangan kesederhanaan rangkaian dan waktu implementasi. Sedangkan untuk PCB modul transceiver CC1100, tata letak dan daftar komponennya dapat dilihat pada Gambar III.32 dan Tabel III.7 di bawah ini. Implementasi sub-sistem transceiver berupa rangkaian antarmuka dan interkoneksi dengan modul CC1100 dapat dilihat pada Gambar III.33 di bawah ini. Setelah semua sub-sistem terimplementasi, langkah selanjutnya adalah proses interkoneksi antar sub-sistem dan integrasi sistem. Tabel III.7. Daftar komponen sub-sistem transceiver RF. Komponen Nilai @ 433 MHz Keterangan C51 100 nF Decoupling capacitor C81, C101 27 pF Crystal loading capacitor C121, C131 3.9 pF RF balun / matching capacitor C122 8.2 pF RF LC filter capacitor C123 5.6 pF RF LC filter capacitor C124, C125 220 pF RF DC blocking capacitor L121, L131 27 nH RF balun / matching inductor L122 22 nH RF LC filter inductor L123 27 nH RF LC filter inductor R171 56 kΩ Internal bias resistor for current reference XTAL 26 MHz Crystal oscillator
Gambar III.33. Implementasi sub-sistem transceiver RF.
65
III.8
Integrasi dan Interkoneksi Perangkat Keras
Langkah terakhir dalam perancangan dan implementasi perangkat keras adalah interkoneksi antar sub-sistem dan integrasi sistem. Catu tegangan dari sub-sistem catu daya yang disalurkan melalui sub-sistem pengolah data, menjadi masukan pada sub-sistem sensor dan pengondisi sinyal, transceiver RF, dan penyimpan data. Untuk jalur data, data sensor-sensor terkondisi pada sub-sistem sensor dan pengondisi sinyal, data 4-wire transceiver CC1100, dan data memori eksternal, terhubung dengan sub-sistem pengolah data. Bentuk fisik interkoneksi antar subsistem, dengan menggunakan kabel pita, dapat dilihat pada Gambar III.34.
(a) Sub-sistem sensor
(b) Sub-sistem catu daya
(c) Sub-sistem transceiver RF (d) Sub-sistem penyimpan data Gambar III.34. Interkoneksi antar sub-sistem dengan sub-sistem pengolah data. Integrasi sub-sistem menjadi sistem perangkat keras (node sensor) secara keseluruhan dapat dilihat pada Gambar III.35 di bawah ini. Setelah implementasi satu node, maka dilakukan ekspansi dengan mengimplementasi 3 node tambahan untuk membangun jaringan satu klaster. Dalam jaringan satu klaster ini, satu node akan bertindak sebagai kepala klaster dan ketiga node lainnya sebagai anggota klaster. Secara fungsional, pada kepala klaster terdapat sub-sistem penyimpan
66
data yang tidak terdapat pada node lain. Hal ini dilakukan sebagai antisipasi ketidakcukupan kapasitas memori utama pada mikrokontroler. Namun fungsi subsistem penyimpan data ini belum tentu dibutuhkan. Sedangkan untuk sub-sistem lain, kepala klaster dan node sensor memiliki konfigurasi yang sama.
Gambar III.35. Integrasi sub-sistem. Hasil implementasi empat node tersebut dapat dilihat pada Gambar III.36 di bawah ini. Pada pengujian sub-sistem di Bab IV, keempat node ini disebut dengan Board-1 hingga Board-4.
Gambar III.36. Implementasi empat node.
67
III.9
Perangkat Lunak
Perangkat lunak sistem yang dibuat adalah program untuk mikrokontroler. Pembuatan program dilakukan pada software CodeVision AVR, seperti tampak pada Gambar III.37 (a). Bahasa program yang digunakan adalah bahasa C. Untuk memindahkan program yang telah dibuat ke memori flash mikrokontroler, maka setelah program tersebut di-compile, seperti tampak pada Gambar III.37 (b), bebas kesalahan bahasa pemrograman, maka program ditransfer menuju mikrokontroler melalui koneksi pemrograman ISP dengan alat STK200. Jika terdapat kesalahan pemrograman, maka software CVAVR akan memberitahu letak kesalahannya.
(a) CodeWizard AVR (b) Hasil compile program Gambar III.37. Tampilan Code Vision AVR. Pada dasarnya perangkat lunak mikrokontroler yang dikembangkan dengan Code Vision AVR memiliki bagian-bagian utama sebagai berikut: -
Header dan definisi
-
Deklarasi variabel dan fungsi
-
Modul-modul fungsi
-
Inisialisasi modul perangkat keras
-
Program utama 68
#include <mega128.h> #include <math.h> #include <mem.h> #include <delay.h> // Standard Input/Output functions #include <stdio.h> #include <stdlib.h> // Pin I/O For CC1100 Config #define CS PORTB.0 #define SCK PORTB.1 #define DOUT PORTB.2 #define DIN PINB.3 #define GDO0 PINB.4 #define GDO2 PINB.5 // Pin Output For LED #define LED0 PORTD.5 #define LED1 PORTD.6 #define LED2 PORTD.7 // Variable Declaration bit flag_int0,flag_int1,flag_timer0,flag_timer1,flag_timer2,flag_timer3,flag_cs; char m,n,chipstat,datread,datstat,datrburst,packet,crc; char temp[8],display[16],data_sync[8],data_ack[6],sampah[16]; ---dan seterusnya---
Program C di atas adalah contoh header, definisi, dan deklarasi variabel pada perangkat lunak. Header memuat file-file panduan (library) yang terkait dengan program yang dibuat. Bagian definisi memuat interkoneksi pin-pin mikrokontroler dengan variabel-variabel pada program. Bagian modul fungsi dan program utama akan dijelaskan dengan rinci di bagian selanjutnya. Sedangkan untuk perangkat keras, modul-modul fungsional mikrokontroler yang harus diinisialisasi, terkait dengan pengaturan sebagai berikut. -
Pin keluaran pada PORTB.0,1,2 dan PORTD.5,6,7
-
Interupsi eksternal pada INT0 dan INT1 (rising edge)
-
Timer-0, clock 250 kHz, interupsi overflow, nilai awal = 0x05 (1ms)
-
Timer-1, clock 8 MHz, fungsi ICP (rising edge)
-
Timer-2, clock 8 MHz, interupsi overflow, nilai awal = 0xF7 (1us)
-
Timer-3, clock 125 kHz, interupsi overflow, nilai awal = 0x9E57 (200ms)
-
Transmitter USART dengan baud-rate 9600bps
-
ADC dengan clock 62.500 kHz dan referensi AREF sebesar 4.6 V
Sesuai dengan segmentasi sistem di awal bab ini, maka perancangan perangkat lunak dibagi secara bertahap menjadi beberapa proses, yaitu algoritma pengukuran dan format data sensor, konfigurasi register CC1100, komunikasi 1 dan 2-arah, dan perancangan protokol MAC. Berikut adalah penjelasannya. 69
III.9.1 Algoritma Pengukuran dan Format Data Sensor Data analog sensor yang sudah terkondisi harus diubah menjadi data digital oleh ADC. Kanal ADC yang terpakai adalah 2 buah untuk data tekanan dan temperatur. Implementasi program C dapat dilihat di bawah ini.
#define ADC_VREF_TYPE 0x00 // Read the AD conversion result unsigned int read_adc(unsigned char adc_input) { ADMUX=adc_input|ADC_VREF_TYPE; // Start the AD conversion ADCSRA|=0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCW; } void baca_adc(void) { //read all adc input in one time directly dtk=0; ratadc1=0; ratadc2=0; read_adc(0x0E); while(dtk<32) { adc1=read_adc(0); adc2=read_adc(1);
//pressure //temperature
ratadc1=ratadc1+adc1; ratadc2=ratadc2+adc2; dtk++; } ratadc1=ratadc1/32; ratadc2=ratadc2/32; }
Untuk mengurangi fluktuasi nilai akibat kesalahan konversi ADC, maka digunakan teknik perata-rataan pada data integer hasil konversi. Data yang telah dirata-rata, diubah menjadi data rentang analog dengan tipe float. Offset sebesar 5 mV akibat teknik perata-rataan dikompensasikan terhadap data digital. Langkah terakhir adalah mengubah kembali data digital tegangan menjadi data sensor dengan hubungan masukan-keluaran yang telah diketahui. Untuk data tekanan, data tegangan diubah menjadi satuan mbar, sedangkan untuk data temperatur, data tegangan dibagi penguatan op-amp dan diubah menjadi satuan celcius. Implementasi program C untuk data tekanan dan temperatur dapat dilihat di bawah ini.
70
void baca_press(void) { vadc1=ratadc1*4.60/1024L; vadc1=vadc1+0.0051; volt1=vadc1-0.5; tekanan=volt1*258.5; } void baca_temp(void) { vadc2=ratadc2*4.60/1024L; vadc2=vadc2+0.0051; volt2=vadc2*0.1282; suhu=volt2*100; }
//kompensasi ofset averaging //kompensasi ofset sensor //tekanan udara dalam mbar
//kompensasi ofset averaging //dibagi 7.8 kali gain op-amp //suhu udara dalam celcius
Sedangkan untuk data sensor kelembaban terkondisi berupa gelombang pulsa, digunakan fungsi ICP mikrokontroler untuk menghitung frekuensi pulsa tersebut. Ketika rising edge dari pulsa level positif, program interupsi Timer-1 memasukkan isi register ICR1 pada variabel, begitu pula yang terjadi pada rising edge pulsa positif berikutnya di variabel yang berbeda, misalkan isi_reg1 dan isi_reg2. Periode pulsa adalah selisih isi_reg2 dan isi_reg1. Berdasarkan persamaan pada Gambar III.6, maka nilai kelembaban ( %RH) dapat dihitung.
void baca_hum(void) { unsigned int a,temp_L,temp_H,isi_reg1,isi_reg2,selisih; float perioda,waktu,frequency; flag_timer1=0; a=0; waktu=0; while (flag_timer1!=1); //abaikan 1st conversion flag_timer1=0; while (a<32) { while (flag_timer1!=1); //nunggu sampai satu temp_L = ICR1L; temp_H = ICR1H; isi_reg1=((temp_H<<8)|temp_L); flag_timer1=0; wile (flag_timer1!=1); temp_L = ICR1L; temp_H = ICR1H; isi_reg2=((temp_H<<8)|temp_L); flag_timer1=0; selisih=isi_reg2-isi_reg1; waktu+=selisih; a++; } waktu= waktu/32; perioda= waktu*0.000000125; frequency=1/perioda; //freq=f(RH), y = -13,351x + 7389 lembab=7389-frequency; lembab=lembab*0.0749; //humidity dalam %RH }
71
Setelah data digital 3 sensor telah siap, maka hal yang dipikirkan selanjutnya adalah format data sensor tersebut. Format ini terkait urutan data dan tipe data yang digunakan. Mengacu pada singkatan PTU untuk Pressure, Temperature, dan Humidity, maka urutan data yang dirancang adalah data tekanan, data temperatur, dan data kelembaban. Sedangkan untuk tipe data, ada beberapa pilihan, yaitu: •
Tipe data heksadesimal Dengan tipe data heksadesimal, maka panjang data yang dirancang adalah 10-bit (tekanan) + 10-bit (temperatur) + 16-bit (kelembaban) = 36-bit = 6 byte. Panjang data yang dihasilkan minimal, namun pada sisi penerima data, diperlukan proses untuk mengubah data heksa ini menjadi data displai sensor. Kesulitan juga terjadi pada masing-masing node untuk melakukan kompensasi offset sensor, karena karakteristik masing-masing sensor berbeda-beda.
•
Tipe data ASCII Dengan tipe data ASCII, 1 karakter direpresentasikan sebesar 1 byte. Sehingga untuk rentang data tekanan 0 – 1034 mbar, rentang data temperatur 0.0 – 100.0 oC, dan rentang data kelembaban 0 – 100 %RH, panjang data adalah 12 byte. Panjang data yang dihasilkan maksimal, namun tidak diperlukan proses tambahan pada sisi penerima data sehingga data dapat langsung ditampilkan. Kelemahan tipe ini adalah kebergantungan panjang data pada rentang data sensor yang digunakan.
•
Tipe data IEEE-754 (floating point 32-bit) Dengan tipe data floating point ini, tiap bilangan data direpresentasikan sama panjang yaitu 4 byte. Sehingga untuk 3 data sensor, panjang data total adalah 12 byte. Selain panjang data yang dihasilkan maksimal, masih diperlukan juga proses tambahan pada sisi penerima data. Kelebihan tipe ini adalah, panjang data yang sama untuk data bilangan apapun. Hal ini menyebabkan mikrokontroler dapat mengolah data sensor apapun tanpa pengaturan ulang.
Berdasarkan kelebihan dan kekurangan tiap pilihan, maka tipe data yang dipilih adalah tipe data IEEE-754 (floating point 32-bit) karena fleksibilitasnya menangani berbagai data sensor dengan representasi yang sama, yaitu 4 byte. Panjang data yang sama ini akan memberi keuntungan pada implementasinya.
72
Dengan menggunakan IEEE-754 Calculator [20], dapat disimulasikan proses konversi data sensor ke tipe floating point sebagai berikut. o Data tekanan
: 910,208
Æ 44 63 8D 52
o Data temperatur
: 26,959
Æ 41 D7 AD BB
o Data kelembaban : 73,127
Æ 42 92 41 3C
Implementasi program C dapat dilihat di bawah ini. Fungsi single adalah adalah untuk mengubah data tekanan, temperatur, dan kelembaban menjadi tipe floating point dan memasukkan data-data tersebut pada variabel deret bertipe char. Sedangkan fungsi elgnis berlaku sebaliknya, untuk mengubah data floating point pada variabel-variabel deret menjadi data sensor yang siap ditampilkan.
void single(void) { unsigned int addr1,addr2,addr3; unsigned char i; int k; addr1=&tekanan; addr1+=3; for(k=0;k<4;k++){ i=peekb(addr1); display[k+2]=i; addr1--; }; addr2=&suhu; addr2+=3; for(k=0;k<4;k++){ i=peekb(addr2); display[k+6]=i; addr2--; }; addr3=&lembab; addr3+=3; for(k=0;k<4;k++){ i=peekb(addr3); display[k+10]=i; addr3--; }; }
void elgnis (int z) { unsigned int addr4,addr5,addr6; int k; addr4=&nanaket; addr4+=3; for(k=0;k<4;k++){ pokeb(addr4,display[k+z]); addr4--; }; addr5=&uhus; addr5+=3; z=z+4; for(k=0;k<4;k++){ pokeb(addr5,display[k+z]); addr5--; }; addr6=&babmel; addr6+=3; z=z+4; for(k=0;k<4;k++){ pokeb(addr6,display[k+z]); addr6--; }; //Setting printf features: //float,width,precision printf("%-8.0f ",nanaket); printf("%-8.1f ",uhus); printf("%-8.0f ",babmel); }
III.9.2 Konfigurasi Register Transceiver RF Karena menggunakan transceiver yang berupa evaluation kit, maka untuk menggunakannya, diperlukan akses untuk mengisi register internal transceiver dan memberi perintah sesuai protokol MAC yang dikembangkan. Diagram pewaktuan untuk mengakses register CC1100 dapat dilihat pada Gambar III.38.
73
Gambar III.38. Diagram pewaktuan akses register CC1100. Untuk dapat menulis ke dan membaca dari register CC1100, diperlukan 2 pin kontrol (CSn dan SCLK) dan 2 pin data (SI dan SO). Pada sisi mikrokontroler, pin CSn, SCLK, dan SI adalah keluaran, dan pin SO adalah masukan. Terdapat 2 bagian akses, yaitu penulisan alamat register ke CC1100, dan penulisan / pembacaan isi register oleh mikrokontroler. Pin CSn adalah penanda aktivitas baca / tulis register dapat dilakukan. Setiap bit data yang ditulis oleh pin SI atau dibaca oleh pin SO, dilakukan saat clock pada pin SCLK naik positif. Berdasarkan diagram pewaktuan di atas, maka urutan aksi yang dilakukan untuk mengakses register CC1100 dapat dirinci sebagai berikut. 1. Inisialisasi – CSn (1) Æ CSn (0), pertanda aksi dapat dilakukan – Waktu tunda 200 µs 2. Penulisan alamat register – SI = A7 = 0 (R/W bit) – Waktu tunda 5 µs – SCLK (0) Æ SCLK (1), clock naik – Waktu tunda 5 µs – SCLK (1) Æ SCLK (0), clock turun 3. Perulangan no.2 untuk bit alamat A6 sampai A0 4. Waktu tunda 10 µs (antara alamat dan data) 5. Perulangan no.2 dan no.3 untuk bit data D7 sampai D0 6. CSn (0) Æ CSn (1) 74
void write_single_CC1100(char addwrite, char datwrite) { char temp1,temp2; char s,t; addwrite=addwrite | 0x00; //Write Bit = 0, Burst Bit = 0 chipstat=0x00; CS=0; delay_us(200); while (DIN!=0); for (s=0;s<8;s++) { temp1=addwrite & 0x80; if(temp1==0x80) DOUT=1; else DOUT=0; delay_us(5); SCK=1; addwrite=addwrite << 1; if(temp1==0x80) addwrite=addwrite | 0x01; else addwrite=addwrite & 0xFE; chipstat=chipstat <<1; if(DIN==1) chipstat=chipstat | 0x01; else chipstat=chipstat | 0x00; delay_us(5); SCK=0; } delay_us(5); //Delay between Address and Data chipstat=0x00; for (t=0;t<8;t++) { temp2=datwrite & 0x80; if(temp2==0x80) DOUT=1; else DOUT=0; delay_us(5); SCK=1; datwrite=datwrite << 1; if(temp2==0x80) datwrite=datwrite | 0x01; else datwrite=datwrite & 0xFE; chipstat=chipstat <<1; if(DIN==1) chipstat=chipstat | 0x01; else chipstat=chipstat | 0x00; delay_us(5); SCK=0; } delay_us(5); CS=1; }
Implementasi program C dapat dilihat di atas. Proses tersebut merupakan konfigurasi aksi untuk menulis data ke suatu register secara single. Secara umum, terdapat beberapa macam konfigurasi akses register CC1100 yaitu: – Read / Write Single byte Register – Read / Write Burst Register – Write Command Strobe – Read Status Register
75
Perbedaan antar akses register di atas adalah pada nilai bit alamat A7 sebagai bit tulis (A7=0) atau bit baca (A7=1), dan bit alamat A6 sebagai bit aksi secara single (A6 =0) atau bit aksi secara konsekutif atau burst (A6=1). Hasil implementasi setiap macam akses register tersebut dapat dilihat di Lampiran C, dan performansinya akan diuji pada Bab IV. Setelah semua register dapat diakses dengan berbagai macam cara, maka langkah selanjutnya adalah menentukan nilai/isi dari setiap register CC1100. Penentuan ini berkaitan dengan karakteristik transceiver yang diinginkan. Terdapat 33 buah register yang harus ditentukan nilainya, baik melalui perancangan maupun menggunakan nilai awalnya. Parameter-parameter penting transceiver yang menentukan nilai dari register adalah sebagai berikut. •
Panjang paket variabel dengan panjang maksimum 16 byte
•
Perhitungan CRC pada akhir paket
•
Skema Modulasi = FSK
•
Deviasi frekuensi = 20 kHz
•
Frekuensi sinyal pembawa = 433 MHz
•
Lebar kanal tapis penerima = 100 kHz
•
Data-rate = 38,4 kbps
•
Jarak antar kanal = 200 kHz
•
Nomer kanal = 0
•
Daya keluaran = -10 dBm
Tidak semua register harus diubah nilainya, namun ada beberapa register yang cukup mengandalkan nilai awalnya. Dalam proses penentuan nilai register dari parameter-parameter di atas, digunakan bantuan software SmartRF Studio v.6.9. Nilai lengkap semua register CC1100 dapat dilihat pada Tabel III.8 di bawah ini. Selain nilai register, dirancang pula format paket data yang digunakan untuk proses pertukaran data, seperti dapat dilihat pada Gambar III.39 di bawah ini. Pengaturan Preambule, Sync word, dan CRC dilakukan di level register. Data field berisi data 3 sensor (tekanan, temperatur, kelembaban) ditambah 2 byte informasi berisi level RSSI, kualitas LQI, dan status CRC.
76
Gambar III.39. Format paket data. Tabel III.8. Nilai register-register CC1100. No. Register Alamat Nilai No. Register 1. IOCFG2 0x00 0x07 7. CHANNR IOCFG0 0x02 0x0A 8. DEVIATN 2. SYNC1 0x04 0xD3 9. MCSM2 SYNC0 0x05 0x91 MCSM1 3. PKTLEN 0x06 0x10 MCSM0 PKTCTRL1 0x07 0x0C 10. FOCCFG PKTCTRL0 0x08 0x05 BSCCFG 4. FSCTRL1 0x0B 0x08 11. AGCCTRL2 FSCTRL0 0x0C 0x00 AGCCTRL1 5. FREQ2 0x0D 0x10 AGCCTRL0 FREQ1 0x0E 0xA7 12. FREND1 FREQ0 0x0F 0x62 FREND0 6. MDMCFG4 0x10 0xCA 13. FSCAL3 MDMCFG3 0x11 0x83 FSCAL2 MDMCFG2 0x12 0x83 FSCAL1 MDMCFG1 0x13 0x22 FSCAL0 MDMCFG0 0x14 0xF8 14. PATABLE
void init_CC1100(void) { CS=1; SCK=0; LED0=1; LED1=1; LED2=1; printf("CC1100 Configuration - Adam / 23205342\r\n"); delay_ms(1000); //Wait for Chip to be ready } void endconfig_CC1100(void) { delay_ms(1000); //end of config LED0=0; printf("End of Configuration\r\n"); }
77
Alamat 0x0A 0x15 0x16 0x17 0x18 0x19 0x1A 0x1B 0x1C 0x1D 0x21 0x22 0x23 0x24 0x25 0x26 Index-0
Nilai 0x00 0x34 0x07 0x0E 0x18 0x15 0x6C 0x03 0x40 0x91 0x56 0x10 0xE9 0x2A 0x00 0x1F 0x26
Modul tambahan untuk inisialisasi dan penutup proses, diimplementasi pada program C di atas. Hasil implementasi program C untuk proses konfigurasi register CC1100 secara keseluruhan dapat dilihat di bawah ini. Setelah inisialisasi, IC CC1100 di-reset terlebih dahulu untuk menghapus nilai register sebelumnya. Penulisan nilai register dilakukan dengan cara single, sedangkan penulisan pengaturan daya keluaran dilakukan dengan cara burst.
init_CC1100(); write_strobe_CC1100(0x30); delay_ms(1); write_single_CC1100(0x00, write_single_CC1100(0x02, write_single_CC1100(0x04, write_single_CC1100(0x05, write_single_CC1100(0x06, write_single_CC1100(0x07, write_single_CC1100(0x08, write_single_CC1100(0x0A, write_single_CC1100(0x0B, write_single_CC1100(0x0C, write_single_CC1100(0x0D, write_single_CC1100(0x0E, write_single_CC1100(0x0F, write_single_CC1100(0x10, write_single_CC1100(0x11, write_single_CC1100(0x12, write_single_CC1100(0x13, write_single_CC1100(0x14, write_single_CC1100(0x15, write_single_CC1100(0x16, write_single_CC1100(0x17, write_single_CC1100(0x18, write_single_CC1100(0x19, write_single_CC1100(0x1A, write_single_CC1100(0x1B, write_single_CC1100(0x1C, write_single_CC1100(0x1D, write_single_CC1100(0x21, write_single_CC1100(0x22, write_single_CC1100(0x23, write_single_CC1100(0x24, write_single_CC1100(0x25, write_single_CC1100(0x26,
//Reset Chip
0x07); 0x0A); 0xD3); 0x91); 0x10); 0x0C); 0x05); 0x00); 0x08); 0x00); 0x10); 0xA7); 0x62); 0xCA); 0x83); 0x83); 0x22); 0xF8); 0x34); 0x07); 0x0E); 0x18); 0x15); 0x6C); 0x03); 0x40); 0x91); 0x56); 0x10); 0xE9); 0x2A); 0x00); 0x1F);
//Setting //Setting //Setting //Setting //Setting //Setting //Setting //Setting //Setting //Setting //Setting //Setting //Setting //Setting //Setting //Setting //Setting //Setting //Setting //Setting //Setting //Setting //Setting //Setting //Setting //Setting //Setting //Setting //Setting //Setting //Setting //Setting //Setting
//Setting PATABLE Output Power -10 dBm temp[0]=0x26; //-10 dBm CC1100 temp[1]=0x00; temp[2]=0x00; temp[3]=0x00; temp[4]=0x00; temp[5]=0x00; temp[6]=0x00; temp[7]=0x00; write_burst_CC1100(0x3E, temp, 8); delay_us(5); write_strobe_CC1100(0x33); delay_ms(1); endconfig_CC1100();
//SCAL
78
IOCFG2 (CRC Detect) IOCFG0 (PLL Locked) SYNC1 SYNC0 PKTLEN (16 Bytes) PKTCTRL1 PKTCTRL0 (Variable Length) CHANNR FSCTRL1 FSCTRL0 FREQ2 FREQ1 FREQ0 MDMCFG4 MDMCFG3 MDMCFG2 MDMCFG1 MDMCFG0 DEVIATN MCSM2 MCSM1 MCSM0 FOCCFG BSCCFG AGCCTRL2 AGCCTRL1 AGCCTRL0 FREND1 FREND0 FSCAL3 FSCAL2 FSCAL1 FSCAL0
III.9.3 Komunikasi 1 dan 2-arah Untuk melakukan komunikasi nirkabel dalam pertukaran data, perlu disusun algoritma proses pengiriman dan penerimaan paket data. Ada beberapa hal yang dijadikan pertimbangan desain, antara lain:
Keadaan dasar (default state) dari transceiver adalah mode IDLE.
Kapasitas buffer RX dan TX FIFO sebesar 64 byte.
Kalibrasi PLL transceiver.
Fungsi pin serbaguna GDO0 dan GDO2.
Berdasarkan pertimbangan di atas, maka algoritma pengiriman paket data yang dirancang dapat dirinci sebagai berikut. 1. Pembersihan buffer FIFO RX dan TX untuk mencegah penumpukan akibat adanya data yang tertinggal. 2. Transfer data 3 sensor yang pada awalnya terletak di variabel deret ke buffer FIFO TX. 3. Kalibrasi PLL transceiver. 4. Pindah keadaan dari IDLE ke TX, transceiver mulai mengirim paket data. 5. Cek status pengiriman paket melalui pin serbaguna GDO2. 6. Kembali ke keadaan IDLE. Hasil implementasi program C untuk proses pengiriman paket data dapat dilihat di bawah ini.
void RFSendPacket(char *txbuffer, char length) { //IDLE STATE write_single_CC1100(0x00, 0x06); write_strobe_CC1100(0x3A); write_strobe_CC1100(0x3B); write_burst_CC1100(0x3F, txbuffer, length); //TX STATE write_strobe_CC1100(0x31); delay_ms(1); write_strobe_CC1100(0x35); delay_ms(1); while (GDO0!=1); while (GDO2!=1); while (GDO2!=0); //BACK TO IDLE STATE write_strobe_CC1100(0x36); delay_us(1); write_single_CC1100(0x00, 0x07); }
79
// // // //
Setting IOCFG2 (Sync TX'ed) Flush RX FIFO Buffer Flush TX FIFO Buffer Write TX data
// SFSTXON with AUTOCAL // Change state to TX // PLL Lock Detector Check // Wait GDO2 to go high // Wait GDO2 to clear // Change state to IDLE // Setting IOCFG2 (CRC Detect)
Sedangkan algoritma penerimaan paket data, dapat dirinci sebagai berikut. 1. Cek status penerimaan paket melalui pin serbaguna GDO2. 2. Ambil data 3 sensor yang pada buffer FIFO RX ke suatu variabel deret. 3. Cek status pemindahan paket melalui pin serbaguna GDO2. 4. Kembali ke keadaan IDLE. 5. Pembersihan buffer FIFO RX dan TX untuk mencegah penumpukan akibat adanya data yang tertinggal. Hasil implementasi program C untuk proses penerimaan paket data dapat dilihat di bawah ini.
char RFReceivePacket(char *rxbuffer) { char pktlen; //RX STATE while (GDO2!=1); read_single_CC1100(0x3F); pktlen=datread+2; read_burst_CC1100(0x3F, rxbuffer, pktlen); while (GDO2!=0); //BACK TO IDLE STATE write_strobe_CC1100(0x36); delay_us(1); write_strobe_CC1100(0x3A); write_strobe_CC1100(0x3B); return datread; }
// Length(1)+Type(1)+Payload // // // // //
Wait GDO0 to go high Read the packet length Add 2 bytes append status Read RX data Wait GDO0 to clear
// Change state to IDLE // Flush RX FIFO Buffer // Flush TX FIFO Buffer
Terdapat pula modul tambahan untuk menghitung nilai RSSI, seperti dapat dilihat di bawah ini. Level RSSI pada paket terima, berupa data heksadesimal sehingga harus diubah ke bentuk yang dapat mudah dibaca. Proses komunikasi 1 dan 2arah, sebagai penerapan algoritma di atas, dilakukan melalui pengujian di Bab IV.
void rssi(int rssidec) { if (rssidec>=128) { rssidec = (int) (rssidec-256); rssidec = rssidec/2; rssidbm = rssidec-75; } else { rssidec = rssidec/2; rssidbm = rssidec-75; } }
80
III.9.4 Protokol MAC Protokol MAC yang dikembangkan adalah berbasis TDMA. Proses pertukaran data antar node dilakukan berdasarkan pewaktuan-pewaktuan yang disepakati dan dimengerti semua node dalam jaringan. Pada topologi tipe klaster, anggota jaringan adalah kepala klaster dan node-node sensor disekitarnya. Secara garis besar, seperti tampak pada Gambar III.40 di bawah ini, protokol ini terdiri dari 3 bagian, yaitu round, frame, dan timeslot.
Gambar III.40. Protokol MAC berbasis TDMA.
Secara fungsional, protokol MAC ini terdiri dari 2 fase, yaitu fase set-up dan fase steady-state. Pada fase set-up, terjadi pembentukan jaringan antara kepala klaster dan node sensor disekitarnya. Fase ini terdiri dari 3 frame, yaitu: 1. Kepala klaster mengirim pesan SETUP ke semua node dengan tujuan untuk memberi tahu keberadaan kepala klaster dan untuk proses sinkronisasi node. 2. Masing-masing node sensor, yang menerima pesan SETUP, melakukan sinkronisasi dan kemudian membalas dengan mengirim pesan JOIN ke kepala klaster sebagai bentuk keikutsertaan node sensor tersebut dalam jaringan. 3. Berdasarkan jumlah pesan JOIN yang diterima, kepala klaster membentuk frame-frame yang merupakan jadwal untuk tiap-tiap node dalam melakukan pertukaran data dengan kepala klaster. Jadwal ini kemudian disebar kembali melalui pesan SLOT ke semua node untuk dimengerti dan diikuti. Sedangkan pada fase steady-state, node sensor yang berkewajiban, melakukan pertukaran data dengan kepala klaster dengan skema SYNC-DATA-ACK. Node lain yang tidak berkepentingan, memasuki mode tidur untuk menghemat daya.
81
Dalam 1 frame, terdapat 10 timeslot yang merupakan pewaktuan aksi protokol MAC. Satu timeslot memiliki panjang waktu 200 ms (timer value: 9e57h), sehingga 1 frame memiliki panjang waktu 2 detik. Aksi protokol berupa kirim dan terima paket data dilakukan dengan skema 1 aksi / timeslot. Jadi, ketika node-1 mengirim paket ke node-2 pada timeslot-1 dan kedua node sudah sinkron satu sama lain, maka node-2 akan menerima data pada timeslot-2. Definisi “menerima data” dalam hal ini bukanlah berarti transceiver menerima gelombang termodulasi data, namun berarti data dari buffer FIFO RX transceiver diambil ke variabel internal mikrokontroler. Karena skema validasi data terima adalah CRC filtering, maka ketika transceiver sedang dalam mode RX, data apapun dengan CRC benar, akan masuk ke buffer FIFO RX. Jadi sebenarnya dalam kasus node-1 mengirim data ke node-2 di atas, paket data node-1 pada timeslot-1 sudah diterima oleh node-2 sesaat setelah paket tersebut terkirim, dengan asumsi waktu tunda propagasi gelombang diabaikan. Namun paket tersebut baru diambil oleh mikrokontroler pada timeslot-2.
Gambar III.41. Fase SET-UP bagian-1. Gambar III.41 di atas adalah penjelasan lebih rinci mengenai fase set-up bagian pertama. Format paket data SETUP adalah | Length | Type | Head ID | Time Slot |. Head ID merupakan nomer node dari kepala klaster. Kita pilih ID = 00 sebagai identitas dari kepala klaster. Time Slot berisi nilai yang menunjukkan jumlah timeslot tersisa dalam 1 frame setelah dikurangi timeslot pengiriman paket SETUP tersebut. Karena 1 frame = 10 timeslot dan paket dikirim di timeslot-1, maka isi variabel Time Slot = 10 – 1 = 9. 82
Konsep kerja protokol MAC pada fase SET-UP bagian-1 ini adalah node sensor ibarat seekor anak ayam yang mencari-cari induknya. Node sensor berada pada mode RX di sepanjang frame dan mengecek data terima di buffer FIFO RX pada setiap timeslot. Ketika node sensor menerima pesan SETUP dari kepala klaster, maka node sensor mengetahui bahwa telah ada kepala klaster yang ingin membangun jaringan dan langkah selanjutnya adalah sinkronisasi untuk menyamakan pewaktuan timeslot node sensor dengan kepala klaster.
Gambar III.42. Proses sinkronisasi node.
Gambar III.42 di atas adalah metode sinkronisasi yang dirancang. Timeslot x dan timeslot x+1 adalah pewaktuan node sensor, sedangkan timeslot 1 adalah milik kepala klaster. Ketika pesan SETUP diterima node sensor saat a,diantara x dan x+1, maka akan dijalankan program interupsi, sesuai Gambar III.30 (b), untuk memasukkan nilai pewaktu timeslot pada variabel tertentu. Ketika node tiba pada timeslot x+1 dan mengetahui ada pesan SETUP yang diterima, maka dilakukan perhitungan sebagai berikut. (III.1) Inti perhitungan di atas adalah menghitung selisih waktu timeslot node sensor dan kepala klaster. Pada timeslot x+2, nilai y ini digunakan sebagai waktu tunda node untuk menyamakan dengan timeslot kepala klaster. Setelah itu, node sensor dikatakan sudah sinkron dengan kepala klaster. Pada implementasi perangkat lunak, perlu dibuat fungsi-fungsi berbasis pewaktu mikrokontroler dengan nilai waktu tertentu. Pewaktu mikrokontroler yang digunakan adalah Timer-0, Timer-2, dan Timer-3. Fungsi ini diperlukan untuk 83
pewaktuan timeslot dalam frame dan satuan waktu tunda. Fungsi pewaktuan yang dibuat adalah pewaktu 1 ms, 1 µs, dan 200 ms. Hasil implementasi program C dapat dilihat di bawah ini.
void timer0_1ms (unsigned int loop1) { TCCR0=0x03; //Start Timer with clock 250kHz flag_timer0=0; k=0; while (k
Untuk aksi protokol MAC berupa pengiriman dan penerimaan pesan SETUP, implementasi program C dapat dilihat di bawah ini. Tipe data SETUP adalah 01 dengan panjang paket 4 byte.
void Send_SETUP (char head, char time) { //Packet Data Array data_setup[0]=0x03; // Packet Length 3 bytes data_setup[1]=0x01; // Type of Data = 01 data_setup[2]=head; // Cluster Head ID data_setup[3]=time; // Timeslots Remaining //Transmitt SETUP Data timer3_200ms(1);
// Start timeslot-1
84
m=data_setup[0]+1; RFSendPacket(data_setup, m); printf("Head ID: %02x\r\n",data_setup[2]); LED1=!LED1; timer3_200ms(1); // Start timeslot-2 } void Receive_SETUP (void) { //Receive SETUP Message packet=(RFReceivePacket(data_setup))+2; sync_sender=data_setup[1]; //Get Sender ID sync_count=data_setup[2]-2; //Get 9, 9-2=7 sync=(int)sync_count; sync=sync*200; //SETUP Calculation timer_sync=timer_high; timer_sync=((timer_sync<<8)|timer_low); timer1=abs(timer_sync-40535); //200 ms timer2=timer1*8; //t dalam us //Synchronization timer3_200ms(1); TCCR3B=0x00; timer2_1us(timer2); timer0_1ms(sync); TCCR3B=0x03;
//Goto next timeslot //Stop Timer-3 //sync timeslot-3 //Goto timeslot-10 //Start Timer-3
}
Untuk mengakomodasi mode tidur (sleep mode) dari node ketika tidak ada aktivitas jaringan, perlu diimplementasi fungsi penghematan daya pada transceiver. Mode tidur yang dibuat ada 2 macam, SLEEP-1 dengan waktu tidur 800 ms dan SLEEP-2 dengan waktu tidur 1600 ms. Konsumsi arus saat tidur adalah 1/100 kali saat aktif (XOFF = 0,2mA, TX / RX = 15 – 30 mA).
void Sleep_1 (void) { LED1=!LED1; write_strobe_CC1100(0x32); timer3_200ms(2); write_strobe_CC1100(0x36); write_strobe_CC1100(0x33); delay_ms(1); timer3_200ms(2); LED2=!LED2; } void Sleep_2 (void) { LED1=!LED1; write_strobe_CC1100(0x32); timer3_200ms(6); write_strobe_CC1100(0x36); write_strobe_CC1100(0x33); delay_ms(1); timer3_200ms(2); LED2=!LED2; }
// // // //
SXOFF Start timeslot-7 to 8 IDLE SCAL
// Start timeslot-9 to 10
// // // //
SXOFF Start timeslot-3 to 8 IDLE SCAL
// Start timeslot-9 to 10
85
Gambar III.43. Fase SET-UP bagian-2.
Gambar III.43 di atas adalah penjelasan lebih rinci mengenai fase set-up bagian kedua. Format paket data JOIN adalah | Length | Type | Head ID | Node ID |. Konsep kerja protokol MAC pada fase SET-UP bagian-2 ini adalah kepala klaster mencari node sensor yang ingin bergabung dalam jaringan. Node sensor yang ingin bergabung, mengirim pesan JOIN ke kepala klaster pada timeslot ke-x. Nilai x ditentukan oleh ID masing-masing node dengan hubungan x = 2(ID) – 1. Jadi node ID = 2 akan beraksi pada timeslot ke-3, dan begitu seterusnya. Hal ini dimaksudkan agar tidak terjadi tabrakan antar node dalam mengirim paket data. Untuk aksi protokol MAC berupa pengiriman dan penerimaan pesan JOIN, implementasi program C dapat dilihat di bawah ini. Tipe data JOIN adalah 02 dengan panjang paket 4 byte. void Send_JOIN (char head, char member) { //Packet Data Array data_join[0]=0x03; // Packet Length 3 bytes data_join[1]=0x02; // Type of Data = 02 data_join[2]=head; // Cluster Head ID data_join[3]=member; // Join Member ID //Transmitt JOIN Data right=(member*2)-1; // Collision Avoidance left=9-right; // For Delay m=data_join[0]+1; timer3_200ms(right); // Start timeslot-1 delay_ms(20); RFSendPacket(data_join, m); printf("Member ID: %02x\r\n",data_join[3]); LED1=!LED1; timer3_200ms(1); // Start timeslot-2 } void Receive_JOIN (void)
86
{
//RX Sequence packet=(RFReceivePacket(data_join))+2; printf("Member ID: %02x ",data_join[2]); //RSSI Display i=(int) data_join[packet-2]; rssi(i); printf("RSSI=%i\r\n",rssidbm); LED1=!LED1; }
Gambar III.44. Fase SET-UP bagian-3. Gambar III.44 di atas adalah penjelasan lebih rinci mengenai fase set-up bagian ketiga. Konsep kerja protokol MAC pada fase SET-UP terakhir ini adalah penyebaran jadwal transfer data untuk node anggota jaringan. Format paket data SLOT adalah | Length | Type | Head ID | Slot-1 | Slot-2 | Slot-3 | Slot-4 | Slot-5 |. Algoritma pembentukan jadwal / frame / slot ini adalah pengurutan nomer ID node sensor yang mengirimkan pesan JOIN. Jadi jika kepala klaster secara berurutan menerima pesan JOIN dari node dengan ID = 01, 03, dan 06, maka dari 5 slot yang tersedia, hanya 3 slot awal yang terisi, yaitu Slot-1 = 01, Slot-2 = 03, dan Slot-3 = 06, dan begitu seterusnya. Sedangkan pada sisi node sensor, pada pesan SLOT yang diterima, jadwal / frame node sensor dalam transfer data adalah sama dengan urutan Slot yang isinya ID node tersebut. Node-3 akan mengirim data pada frame ke-5 jika ternyata ID node berada pada Slot-5, dan seterusnya. Dengan terbentuknya formasi frame / slot ini, maka jaringan sudah dikatakan terbentuk, dan kemudian semua node memasuki fase steady-state. Untuk aksi protokol MAC berupa pengiriman dan penerimaan pesan SLOT, implementasi program C dapat dilihat di bawah ini. Tipe data SLOT adalah 03 dengan panjang paket 8 byte. 87
void Send_SLOT (char head, char slot1, char slot2, char slot3, char slot4, char slot5) { //Packet Data Array data_slot[0]=0x07; // Packet Length 7 bytes data_slot[1]=0x03; // Type of Data = 03 data_slot[2]=head; // Cluster Head ID data_slot[3]=slot1; // Member Slot-1 data_slot[4]=slot2; // Member Slot-2 data_slot[5]=slot3; // Member Slot-3 data_slot[6]=slot4; // Member Slot-4 data_slot[7]=slot5; // Member Slot-5 //Transmitt JOIN Data m=data_slot[0]+1; timer3_200ms(1); // Start timeslot-1 delay_ms(20); RFSendPacket(data_slot, m); printf("SLOT: "); for(i=3;i<m;i++) printf("%02x ",data_slot[i]); printf("\r\n"); printf("\r\n"); LED1=!LED1; timer3_200ms(1); // Start timeslot-2 } void Receive_SLOT (void) { //RX Sequence packet=RFReceivePacket(data_slot); printf("SLOT: "); for(i=2;i<packet;i++) printf("%02x ",data_slot[i]); printf("\r\n"); printf("\r\n"); LED1=!LED1; }
Gambar III.45. Fase Steady-state. Gambar III.45 di atas adalah penjelasan lebih rinci mengenai fase steady-state dari protokol yang dikembangkan. Node sensor yang sedang memiliki jadwal transfer data, akan melakukan skema SYNC-DATA-ACK dengan kepala klaster kemudian menuju mode tidur-1, sedangkan node sensor lain yang tidak berkepentingan akan menuju mode tidur-2. 88
Format paket data pada skema SYNC-DATA-ACK yang digunakan adalah: SYNC : | Length | Type | Head ID | Period | Frame | Round | DATA : | Length | Type | Pressure | Temperature | Humidity | ACK : | Length | Type | Head ID | Counter | Pesan SYNC memiliki tipe data = 4 dengan panjang paket 6 byte. Paket ini berisi data trafik jaringan pada bagian Period, Frame, dan Round. Period berisi informasi mengenai periode aggregasi data node. Frame dan Round berisi status urutan frame dalam satu round dan jumlah round yang sudah dijalankan. Siklus jaringan yang dirancang terdiri dari 6 round. Round pertama adalah fase set-up yang terdiri dari 3 frame seperti telah dijelaskan sebelumnya. Lima round berikutnya adalah fase steady-state. Setelah round ke-6, maka jaringan kembali ke round ke-1 untuk melakukan pembentukan ulang jaringan. Pembentukan ulang ini terkait dengan skalabilitas sistem terhadap penambahan atau pengurangan jumlah node. Pada 6 round berikutnya, frame node sensor lama yang mati akan terganti, dan sebaliknya, node sensor baru akan bergabung dan mendapatkan frame / slot. Dalam 5 round fase steady-state, tiap round terdiri dari 10 frame, yang terdiri dari 5 frame periode data, dan 5 frame periode tanpa data. Pada jaringan yang lebih besar, jumlah frame periode data dapat ditambah untuk mengakomodasi kebutuhan node-node dalam jaringan. Karena perangkat keras node sensor yang diimplementasi sebanyak 3 buah, maka 5 frame periode data sudah cukup dengan 2 frame kosong untuk kemungkinan penambahan node. Pada frame periode tanpa data, semua node memasuki mode tidur-2 setelah menerima pesan SYNC. Paket DATA memiliki tipe data = 5 dengan panjang paket 14 byte. Paket ini berisi data 3 sensor (tekanan, temperatur, kelembaban) dengan masing-masing data memiliki panjang 4 byte. Pesan ACK memiliki tipe data = 6 dengan panjang paket 4 byte. Paket ini berisi notifikasi penerimaan data dari kepala klaster ke node pengirim dan informasi jumlah data yang sudah diterima oleh kepala klaster. Pada pengembangan layer di atas data-link, terutama pada protokol routing, salah satu cara untuk mengukur kinerja jaringan adalah dengan membandingkan jumlah data
89
yang diterima kepala klaster dengan jumlah round yang telah dijalankan. Implementasi program C paket-paket data pada fase steady-state dapat dilihat di bawah ini.
void Send_SYNC_Data (char sync_from, char data, char slot_right, char slot_left) { //Packet Data Array data_sync[0]=0x05; // Packet Length 5 bytes data_sync[1]=0x04; // Tipe Data = 4 data_sync[2]=sync_from; // Cluster Head ID data_sync[3]=data; // Data:01, No Data:00 data_sync[4]=slot_right; // Current Timeslot data_sync[5]=slot_left; // Remaining Timeslot //Transmitt SYNC Data m=data_sync[0]+1; timer3_200ms(1); //Start timeslot-1 delay_ms(20); RFSendPacket(data_sync, m); printf("SYNC "); for(i=4;i<m;i++) printf("%02x ",data_sync[i]); LED1=!LED1; timer3_200ms(1); //Start timeslot-2 } void Receive_SYNC (void) { //RX Sequence packet=RFReceivePacket(data_sync); printf("SYNC "); for(i=3;i<packet;i++) printf("%02x ",data_sync[i]); LED1=!LED1; } void Send_DATA (void) { //Packet Data Array display[0]=0x0D; // Packet Length 13 bytes display[1]=0x05; // Type of Data = 05 baca_adc(); baca_press(); baca_temp(); baca_hum(); single(); //Sensor Data Section// m=display[0]+1; timer3_200ms(1); //Start timeslot-3 delay_ms(20); RFSendPacket(display, m); printf("DATA: "); elgnis(2); timer3_200ms(1); //Start timeslot-4 } void Receive_DATA (void) { //RX Sequence packet=RFReceivePacket(display); printf("DATA: "); elgnis(1); } void Send_ACK (char ack_from) { //Packet Data Array data_ack[0]=0x03; // Packet Length 3 bytes data_ack[1]=0x06; // Type of Data = 06
90
data_ack[2]=ack_from; // Cluster Head ID data_ack[3]=temp[7]; // Data Counter temp[7]++; //Transmitt ACK Data m=data_ack[0]+1; timer3_200ms(1); //Start timeslot-5 delay_ms(20); RFSendPacket(data_ack, m); printf("ACK %02x\r\n",data_ack[3]); LED2=!LED2; timer3_200ms(1); //Start timeslot-6 } void Receive_ACK (void) { //RX Sequence packet=RFReceivePacket(data_ack); printf("ACK %02x\r\n",data_ack[2]); LED2=!LED2; }
Jika penjelasan pada Gambar III.41 – 45 didasarkan pada tahapan proses pada protokol MAC berbasis TDMA dan implementasinya berupa modul-modul generator paket-paket data yang digunakan pada protokol, maka pada program utama mikrokontroler, proses implementasi didasarkan pada fungsional node, baik sebagai kepala klaster, maupun node sensor. Perancangan program utama berupa diagram alir untuk node sensor dan kepala klaster secara berurutan dapat dilihat pada Gambar III.46 dan Gambar III.47 di bawah ini. Sedangkan bentuk implementasi program C dapat dilihat pada Lampiran C. Metode pengembangan program utama ini didasarkan pada keadaan (state) pada protokol MAC dan syarat / kondisi yang menyertainya. Suatu proses dapat berpindah ke proses lainnya jika satu atau lebih kondisi telah dipenuhi. Selain itu, jalannya proses pada protokol diatur oleh modul-modul pewaktuan yang telah dijelaskan sebelumnya. Dengan demikian maka proses perancangan dan implementasi bagian perangkat keras dan perangkat lunak dari sistem pemantauan tanaman yang dikembangkan. Proses selanjutnya adalah pengujian dan karakterisasi sub-sistem, baik pada perangkat keras dan perangkat lunak, dan pengujian sistem secara keseluruhan.
91
Gambar III.46. Diagram alir program utama untuk Node Sensor.
92
Gambar III.47. Diagram alir program utama untuk Kepala Klaster.
93