SMART HOME ARDUINO EMBEDDED WEB SERVER BERBASIS MIKROKONTROLLER ARDUINO MEGA 2560 DAN ETHERNET
SHIELD
MAKALAH
Diajukan Untuk Memenuhi Persyaratan Menyelesaikan Mata Kuliah PROJECT AKHIR
Oleh:
AHMAD JATI WIDODO (0220120049) ARDHINATA BAYU KURNIAWAN (0220120051)
DAMAR ARDYANSYAH (0220120053)
PROGRAM STUDI
TEKNIK PRODUKSI DAN PROSES MANUFAKTUR KONSENTRASI MEKATRONIKA
POLITEKNIK MANUFAKTUR ASTRA JAKARTA
BAB I PENDAHULUAN 1.1 Latar belakang
Semakin berkembangnya teknologi yang pesat saat ini menuntut mahasiswa untuk membuat inovasi-inovasi yang berguna bagi masyarakat. Semua inovasi dilakukan guna mempermudah masyarakat dalam menjalankan aktivitasnya. Aktivitas sehari-hari masyarakat di dalam rumah seperti halnya menyalakan lampu dan perangkat lainnya masih menggunakan tombol / saklar fisik. Dimana masih perlu sentuhan atau penekanan secara fisik dari manusia ke tombol. Jarak antara letak tombol dan letak manusia pada saat akan menyalakan perangkat tersebut tidak jarang terlampau jauh. Sehingga membuat manusia mengeluarkan tenaga lebih untuk menjangkau letak tombol tersebut.
Smart Home Arduino Embedded Web Server adalah sebuah inovasi di mana dapat meringankan manusia dalam hal mengontrol perangkat rumah tangga. Masyarakat dapat mengontrol perangkat rumah tangga meskipun tidak berada di dalam rumah. Hanya perlu gadget atau perangkat handphone yang mendukung koneksi wifi (wireless) dan mempunyai aplikasi web browser, manusia dapat mengontrol perangkat rumah tangga secara fleksibel.
Pada proyek ini, penulis akan membahas bagaimana web server dijalankan hingga dapat di akses oleh client/user yang kemudian dapat mengontrol perangkat yang dikontrol oleh Arduino Mega 2560 dengan bantuan Ethernet Shield.
1.2 Tujuan penelitian
Tujuan dari pembuatan Smart Home Arduino Embedded Web Server ini adalah:
1. Membuat prototype Smart Home menggunakan Arduino Mega 2560 yang dapat diakses oleh web client.
2. Membuat sistem kontrol Smart Home agar dapat berfungsi sebagaimana fungsinya.
1.3 Manfaat
Manfaat dari pembuatan Smart Home Arduino Embedded Web Server ini adalah:
1. Mahasiswa dapat mengerti teknologi informasi dan
komunikasi yang dikombinasikan dengan sistem otomasi berbasis web.
2 BAB II
2.1 Pengertian MikronkontrollerMikrokontroler disebut juga MCU atau μC adalah salah satu komponen elektronik atau IC yang memiliki beberapa sifat seperti komputer, yaitu: CPU (Central Processing Unit) atau unit pemprosesan terpusat, kode memori, data memori, I/O (port untuk input dan output), bentuknya yang kecil dan harganya murah sehingga dapat dicangkokkan (embedded) di dalam berbagai peralatan rumah tangga, kantor, industri atau robot. Mikrokontroller dapat diprogrammelalui program software yang dapat menulis, membaca dan dihapus isi mikrokontroler tersebut. Mikrokontroler sering digunakan dalam beberapaperalatan otomatik seperti pengontrol mesin di mobil, pengontrol jarak jauh, mesin cuci otomatis, pengkondisian udara (AC) peralatan perkantoran dll. Keuntungan dari penggunaan mikrokontroler yaitu memperkecil ukuran peralatan, mengurangi biaya dan konsumsi listrik.
2.1.1 Bagian-bagian mikrokontroller
Secara umum mikro kontroller terbagia atas beberapa bagian yang memiliki fungsinya masing masing. komponen-komponen dari suatu mikrokontroler yang mempunyai fasilitas lengkap beserta peranti eksternal yang biasanya dihubungkan ke/dari mikrokontroler. Tidak semua mikrokontroler mempunyai semua komponen tersebut, misalnya konverter A/D dan D/A hanya terdapat pada beberapa jenis mikrokontroler tertentu. Dalam suatu mikrokontroler biasanya terdapat tiga buah memori, yaitu RAM, ROM dan EEPROM. RAM dan ROM hampir selalu ada pada setiap mikrokontroler, sedangkan EEPROM hanya terdapat pada beberapa jenis mikrokontroler tertentu. Bagian-bagian dari mikro kontroller dapat ditunjukan pada gambar
a. CPU (Central Processing Unit) pada mikrokontroler berupa mikroprosesor yang berfungsi sebagai otak dari mikrokontroler. Mikroprocessor adalah peranti yang berfungsi untuk memproses data, yaitu berupa fungsi logika dan aritmatika.
b. RAM digunakan sebagai penyimpan data sementara yang berupa register-register. Register adalah tempat penyimpanan data yang berkaitan dengan banyak hal, misalnya variabel dalam program, keadaan input/output, serta pengaturan timer/counter dan komunikasi serial. Telah disebutkan sebelumnya data pada RAM akan hilang saat catu daya dicabut.
c. ROM digunakan sebagai tempat penyimpanan program. ROM yang banyak dipakai pada mikrokontroler saat ini adalah flash PEROM (Programmable Erasable ROM), yang mirip seperti memori pada flash disk, namun bedanya adalah flash PEROM hanya dapat dihapus dan ditulis secara sekaligus. EEPROM biasanya digunakan untuk menyimpan data yang tidak boleh hilang meski catu daya dihapus. Meski fungsinya mirip EEPROM biasanya lebih sedikit digunakan dibanding RAM karena kecepatan akses EEPROM yang lebih lambat. Contoh penggunaannya adalah penyimpanan data password. atau setting suatu sistem.
d. Timer/counter adalah peranti untuk mencacah sinyal dari clock ataupun sinyal dari suatu kejadian. Jika sinyal yang dicacah berasal dari clock maka peranti ini berfungsi
sebagai pewaktu, sedangkan jika berasal dari clock maka peranti ini berfungsi sebagai pencacah. Pewaktu bisa digunakan untuk bermacam-macam kegunaan, misalnya untuk menghasilkan tundaan waktu dan untuk mengukur selang waktu suatu proses.
e. Peranti antarmuka ke input/output pada mikrokontroler disebut sebagai port. Pada satu port I/O digital terdiri beberapa pin, biasanya berjumlah 8 atau satu byte, dengan masing-masing pin dapat mentransfer satu bit data biner (logika 0 dan 1) dari/ke mikrokontroler. Selain port I/O digital, pada suatu mikrokontroler juga dapat berkomunikasi dengan peranti lain menggunakan komunikasi serial. Terdapat berbagai standar atau protokol untuk komunikasi serial seperti SPI (Serial Peripherial Interface), I2C (Inter-Integrated Circuit), 1-wire, 2-1-wire, UART (Universal Asynchronous Receiver Transmitter) dan USART (Universal Synchronous-Asynchronous Receiver Transmitter).
2.2 Konsep dan Perancangan
Sebelum dilakukan pembuatan Smart Home Arduino Embedded Web Server, maka perlu adanya konsep dan perancangan. Konsep dan perancangan yang dilakukan meliputi konsep jaringan yang digunakan, kemudian menentukan perangkat input dan output yang digunakan, sampai dengan perancangan wiring yang akan digunakam. Berikut adalah tahapan – tahapan yang dilakukan pada konsep dan perancangan Smart Home Arduino Embedded Web Server.
2.2.1 Perangkat yang digunakan
Pada pembuatan Smart Home Arduino Embedded Web Server ini, membutuhkan beberapa komponen penyusun agar dapat bekerja sesuai dengan apa yang diinginkan. Berikut merupakan daftar komponen yang digunakan:
1. Arduino Mega 2560
2. Arduino Ethernet Shield + Micro SD Card (Max 2 Gb) 3. 5VDC Relay 4 Channel
4. LinkSys Wifi Router 5. Kabel LAN
6. USB Printer
7. Laptop (Untuk pemrograman)
Ke tujuh komponen tersebut merupakan komponen utama yang digunakan dalam pembuatan Smart Home Arduino Embedded Web Server.
2.2.2 Software yang digunakan
Pada proses pembuatan Smart Home Arduino Embedded Web Server ini
membutuhkan beberapa software untuk mendukung dalam proses pembuatan sistem kontronya. Diantaranya:
1. Notepad ++
Notepad++ digunakan untuk membuat script program halaman web yang akan di embedd pada MicroSD Card yang di pasang pada Arduino Ethernet Shield. Berikut merupakan tampilan pada aplikasi Notepad ++
Notepad++ mendukung banyak bahasa pemrograman website. Diantaranya adalah bahasa html, php, java, Assembly, asp, C, C#, dan masih banyak lainnya. Pada pembuatan proyek ini, penulis menggunakan bahasa html.
2. Arduino IDE
Arduino IDE merupakan software yang digunakan untuk membuat program mikrokontroller arduino mega 2560. Bahasa yang digunakan adalah bahasa pemrograman C yang telah dimodifikasi oleh developer arduino menjadi bahasa C Arduino yang mempunyai ciri khas tersendiri dan berbeda dengan bahasa C pada umunya. Arduino IDE dilengkapi dengan library yang sangat membantu Programmer pada proses pembuatan program. Berikut adalah tampilan dari software Arduino IDE.
3. Linksys Basic Setup
Linksys Basic Setup merupakan software tertanam pada wifi router yang dapat diakses dengan IP default yang dapat digunakan untuk mengatur konfigurasi dari wifi router itu sendiri. IP default yang digunakan adalah “192.168.1.1” (hilangkan tanda petik). Cara mengakses adalah dengan menyambungkan komputer / laptop dengan wifi router menggunakan kabel LAN atau dengan cara menyambungkan komputer / laptop tersebut dengan jaringan yang telah dibuat pada wifi router itu sendiri. Kemudian buka aplikasi browser dan masukkan IP default tersebut dan enter. Berikut merupakan tampilan dari Linksys Basic Setup.
4. Browser
Browser di sini digunakan untuk melihat hasil pembuatan halaman web serta digunakan untuk akses Linksys basi setup. Terdapat banyak aplikasi browser diantaranya adalah Google Chrome, Mozilla Firefox, UC Browser, Internet Explorer dan masih banyak lagi lainnya. Berikut adalah contoh dari tampilan web browser Mozilla Firefox.
2.2.3 Topologi jaringan
Berikut adalah ilustrasi jaringan yang digunakan oleh Smart Home Arduino Embedded Web Server.
Berdasarkan topologi jaringan diatas, sistem kontrol Smart Home dibagi menjadi beberapa bagian, yaitu:
1. Perangkat Input: a. Push Button
b. Client / User (Komputer / Laptop) 2. Perangkat Proses:
a. Arduino Mega 2560 b. Arduino Ethernet Shield c. Linksys Wifi Router 3. Perangkat Output:
a. 5VDC Relay 4 channel b. Lampu
c. Stop kontak (terminal)
2.2.4 Pembuatan Wiring Sistem Kontrol
Dan berikut merupakan tabel I/O yang digunakan pada Arduino Mega 2560:
2.2.5 Konfigurasi IP Smart Home
Dalam melakukan konfigurasi IP smart home terdapat 2 langkah, yaitu konfigurasi set-up wi-fi router dan konfigurasi Arduino.
Berikut ini adalah langkah langkah dalam melakukan konfigurasi router Wi-fi . Buka browser lalu masukan address 192.168.1.1 maka akan muncul basic set-up Linksys Wi-fi router seperti pada gambar . Set-up ini digunakan untuk mengkonfigurasi alamat IP public Router Wi-fi dengan cara diisikan pada kolom Internet Ip address .
Setelah melakukan konfigurasi pada Internet Ip address kemudian pilih pada tab application & gaming untuk melakukan konfigurasi Ip yang di-forward oleh router wi-fi yang juga sebagai Ip address pada ethernet shield arduino. Berikut merupakan gambar konfigurasi Ip yang di-forward wi-fi router.
2.2.6 Pembuatan Program HTML (Terlampir)
Setelah melakukan konfigurasi pada router wifi , kemudian melakukan pembuatan program html untuk membuat tampilan pada Ip address yang telah ditentukan, berikut adalah program html pada smart home berbasis arduino. Pembuatan program html menggukanan software notepad++ kemudian di atur pada tap language dipilih bahasa html.
Berikut adalah gambar setelah membuat program html maka tampilan web server pada ip 192.168.1.101
2.2.7 Pembuatan Program Arduino (Terlampir)
Setelah membuat program html yang digunakan untuk tampilan web server selanjutnya adalah membuat program arduino sebagai sistem kontrol dari Smart Home. Program arduino di tulis pada software Arduino IDE. Berikut merupakan tampilan program pada Arduino.
2.3 Pengujian
Berikut ini adalah pengujian yang dilakukan pada smart home setelah dilakukan program dan konfigurasi IP . Pengujian ini dikendalikan melalui aplikasi browser untuk mengakses IP yang telah dikonfigurasi.
1. Tampilan ketika dalam keadaan semua lampu mati.
2.
3.
5. Tampilan ketika dalam keadaan Lampu 1 nyala. 6.
3
BAB III
14. PENUTUP
3.1 kesimpulan
15. Pembuatan Smart Home Arduino Embedded Web Server
menggunakan perangkat kontrol Arduino Mega 2560 dan Ethernet Shield. Web server yang disimpan pada media penyimpana SD Card dapat diakses melalui web browser yang kemudian dapat mengontrol perangkat rumah tangga.
3.2 saran
16. Kedepannya, Smart Home dapat diakses melalui
jaringan internet dari seluruh tempat. Sehingga tidak lagi
menggunakan embedded web server melalui media penyimpanan Micro SD Card, tetapi sudah disimpan dalam web hosting sehingga dapat diakses dengan menggunakan jaringan internet.
17. 18. Refernsi 19. http://www.vedcmalang.com/pppptkboemlg/index.php/ menuutama/listrik-electro/1045-part-2 20. http://www.vedcmalang.com/pppptkboemlg/index.php/ menuutama/listrik-electro/1053-part-3
21. LAMPIRAN 1. Program HTML
22. <!DOCTYPE html> 23. <html>
24. <head>
25. <title>Smart Home Mekatronika 2015</title> 26. <script> 27. strLED1 = ""; 28. strLED2 = ""; 29. strLED3 = ""; 30. strLED4 = ""; 31. var LED1_state = 0; 32. var LED2_state = 0; 33. var LED3_state = 0; 34. var LED4_state = 0; 35. function GetArduinoIO() 36. {
37. nocache = "&nocache=" + Math.random() * 1000000; 38. var request = new XMLHttpRequest();
39. request.onreadystatechange = function() 40. {
41. if (this.readyState == 4) { 42. if (this.status == 200) {
43. if (this.responseXML != null) {
44. // XML file received - contains analog values, switch values and LED states 45. var count; 46. //LED1 47. if (this.responseXML.getElementsByTagName('LED')[0].childNodes[0].nodeValue === "on0") { 48. document.getElementById("LED1").innerHTML = "Lampu 1 ON (D22)"; 49. LED1_state = 1; 50. } 51. if (this.responseXML.getElementsByTagName('LED')[0].childNodes[0].nodeValue === "off0") { 52. document.getElementById("LED1").innerHTML = "Lampu 1 OFF (D22)";
53. LED1_state = 0; 54. } 55. //LED2 56. if (this.responseXML.getElementsByTagName('LED') [1].childNodes[0].nodeValue === "on1") { 57. document.getElementById("LED2").innerHTML = "Lampu 2 ON (D23)"; 58. LED2_state = 1; 59. } 60. if (this.responseXML.getElementsByTagName('LED')[1].childNodes[0].nodeValue === "off1") { 61. document.getElementById("LED2").innerHTML = "Lampu 2 OFF (D23)";
62. LED2_state = 0; 63. } 64. //LED3 65. if (this.responseXML.getElementsByTagName('LED') [2].childNodes[0].nodeValue === "on2") { 66. document.getElementById("LED3").innerHTML = "Lampu 3 ON (D24)"; 67. LED3_state = 1; 68. } 69. if (this.responseXML.getElementsByTagName('LED')[2].childNodes[0].nodeValue === "off2") { 70. document.getElementById("LED3").innerHTML = "Lampu 3 OFF (D24)";
71. LED3_state = 0; 72. }
73. //LED4
74. if (this.responseXML.getElementsByTagName('LED')
[3].childNodes[0].nodeValue === "on3") {
75. document.getElementById("LED4").innerHTML = "Stop Kontak ON (D25)"; 76. LED4_state = 1;
77. }
78. if (this.responseXML.getElementsByTagName('LED')[3].childNodes[0].nodeValue === "off3") { 79. document.getElementById("LED4").innerHTML = "Stop Kontak OFF (D25)";
80. LED4_state = 0; 81. }
82. } 83. } 84. }
85. }
86. // send HTTP GET request with LEDs to switch on/off if any
87. request.open("GET", "ajax_inputs" + strLED1 + strLED2 + strLED3 + strLED4 + nocache, true); 88. request.send(null); 89. setTimeout('GetArduinoIO()', 1000); 90. strLED1 = ""; 91. strLED2 = ""; 92. strLED3 = ""; 93. strLED4 = ""; 94. } 95. function GetButton1() 96. { 97. if (LED1_state === 1) { 98. LED1_state = 0; 99. strLED1 = "&LED1=0"; 100. } 101. else { 102. LED1_state = 1; 103. strLED1 = "&LED1=1"; 104. } 105. } 106. function GetButton2() 107. { 108. if (LED2_state === 1) { 109. LED2_state = 0; 110. strLED2 = "&LED2=0"; 111. } 112. else { 113. LED2_state = 1; 114. strLED2 = "&LED2=1"; 115. } 116. } 117. function GetButton3() 118. { 119. if (LED3_state === 1) { 120. LED3_state = 0; 121. strLED3 = "&LED3=0"; 122. } 123. else { 124. LED3_state = 1; 125. strLED3 = "&LED3=1"; 126. } 127. } 128. function GetButton4() 129. { 130. if (LED4_state === 1) { 131. LED4_state = 0; 132. strLED4 = "&LED4=0"; 133. } 134. else { 135. LED4_state = 1; 136. strLED4 = "&LED4=1"; 137. } 138. } 139. </script> 140. <style> 141. .IO_box { 142. float: left; 143. margin: 0 20px 20px 0; 144. border: 1px solid blue; 145. padding: 0 5px 0 5px; 146. width: 120px; 147. } 148. h1 { 149. font-size: 120%; 150. color: blue; 151. margin: 0 0 10px 0; 152. } 153. h2 { 154. font-size: 85%; 155. color: #5734E6; 156. margin: 5px 0 5px 0;
157. } 158. p, form, button { 159. font-size: 80%; 160. color: #252525; 161. } 162. .small_text { 163. font-size: 70%; 164. color: #737373; 165. } 166. marquee_text{ 167. font-size: 100%; 168. color: #252525; 169. } 170. </style> 171. </head> 172. <body onload="GetArduinoIO()">
173. <marquee direction="up" behavior="scroll" scrollamount="2" scrolldelay="100" height="40px">Selamat Datang di Smart Home Web Controller</marquee>
174. <h1>Politeknik Manufaktur Astra</h1>
175. <h1>Smart Home - Mekatronika</h1> 176. <h1>2015</h1><br>
177. <div class="IO_box"> 178. <h2>Lampu 1</h2>
179. <button type="button" id="LED1" onclick="GetButton1()">Lampu 1 OFF (D22)</button><br /><br /> 180. </div>
181. <div class="IO_box"> 182. <h2>Lampu 2</h2>
183. <button type="button" id="LED2" onclick="GetButton2()">Lampu 2 OFF (D23)</button><br /><br /> 184. </div>
185. <div class="IO_box"> 186. <h2>Lampu 3</h2>
187. <button type="button" id="LED3" onclick="GetButton3()">Lampu 3 OFF (D24)</button><br /><br /> 188. </div>
189. <div class="IO_box"> 190. <h2>Stop Kontak</h2>
191. <button type="button" id="LED4" onclick="GetButton4()">Stop Kontak OFF (D25)</button><br /><br /> 192. </div>
193. </body><br> 194.</html
195.
2. Program Arduino
196. /*
197. * Program Name : Arduino Smart Home Ethernet Controller
198. * Author : Ahmad Jati Widodo 199. * Year : 2015
200. * Focus : Mechatronics
201. * Study : Politeknik Manufaktur Astra, Jakarta
202. */
203.
204. #include <SPI.h> 205. #include <Ethernet.h> 206. #include <SD.h>
207. // size of buffer used to capture HTTP requests
208. #define REQ_BUF_SZ 60
209.
210. // MAC address from Ethernet shield sticker under board
211. byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
212. IPAddress ip(192, 168, 1, 106); // IP address, may need to change depending on network 213. EthernetServer server(80); // create a server at port 80
214. File webFile; // the web page file on the SD card
215. char HTTP_req[REQ_BUF_SZ] = {0}; // buffered HTTP request stored as null terminated string 216. char req_index = 0; // index into HTTP_req buffer
217. boolean LED_state[4] = {0}; // stores the states of the LEDs 218.
219. void setup()
220. {
221. // disable Ethernet chip
222. pinMode(10, OUTPUT);
223. digitalWrite(10, HIGH);
224.
225. Serial.begin(9600); // for debugging
226.
227. // initialize SD card
228. Serial.println("Initializing SD card...");
229. if (!SD.begin(4)) {
230. Serial.println("ERROR - SD card initialization failed!"); 231. return; // init failed
232. }
233. Serial.println("SUCCESS - SD card initialized."); 234. // check for index.htm file
235. if (!SD.exists("index.htm")) {
236. Serial.println("ERROR - Can't find index.htm file!"); 237. return; // can't find index file
238. }
239. Serial.println("SUCCESS - Found index.htm file.");
240. // switches 241. pinMode(5, INPUT); 242. pinMode(6, INPUT); 243. pinMode(7, INPUT); 244. pinMode(8, INPUT); 245. // LEDs 246. pinMode(22, OUTPUT); 247. pinMode(23, OUTPUT); 248. pinMode(24, OUTPUT); 249. pinMode(25, OUTPUT); 250.
251. Ethernet.begin(mac, ip); // initialize Ethernet device 252. server.begin(); // start to listen for clients
253. }
254.
255. void loop()
257. EthernetClient client = server.available(); // try to get client 258.
259. if (client) { // got client?
260. boolean currentLineIsBlank = true; 261. while (client.connected()) {
262. if (client.available()) { // client data available to read
263. char c = client.read(); // read 1 byte (character) from client 264. // limit the size of the stored received HTTP request
265. // buffer first part of HTTP request in HTTP_req array (string)
266. // leave last element in array as 0 to null terminate string (REQ_BUF_SZ - 1) 267. if (req_index < (REQ_BUF_SZ - 1)) {
268. HTTP_req[req_index] = c; // save HTTP request character 269. req_index++;
270. }
271. // last line of client request is blank and ends with \n 272. // respond to client only after last line received 273. if (c == '\n' && currentLineIsBlank) {
274. // send a standard http response header 275. client.println("HTTP/1.1 200 OK");
276. // remainder of header follows below, depending on if 277. // web page or XML page is requested
278. // Ajax request - send XML file
279. if (StrContains(HTTP_req, "ajax_inputs")) { 280. // send rest of HTTP header
281. client.println("Content-Type: text/xml"); 282. client.println("Connection: keep-alive"); 283. client.println();
284. SetLEDs();
285. // send XML file containing input states 286. XML_response(client);
287. }
288. else { // web page request 289. // send rest of HTTP header
290. client.println("Content-Type: text/html"); 291. client.println("Connection: keep-alive"); 292. client.println();
293. // send web page
294. webFile = SD.open("index.htm"); // open web page file 295. if (webFile) {
296. while(webFile.available()) {
297. client.write(webFile.read()); // send web page to client 298. }
299. webFile.close(); 300. }
301. }
302. // display received HTTP request on serial port 303. Serial.print(HTTP_req);
304. // reset buffer index and all buffer elements to 0 305. req_index = 0;
306. StrClear(HTTP_req, REQ_BUF_SZ); 307. break;
308. }
309. // every line of text received from the client ends with \r\n 310. if (c == '\n') {
311. // last character on line of received text 312. // starting new line with next character read 313. currentLineIsBlank = true;
314. }
315. else if (c != '\r') {
316. // a text character was received from client 317. currentLineIsBlank = false;
318. }
319. } // end if (client.available()) 320. } // end while (client.connected())
321. delay(5); // give the web browser time to receive the data 322. client.stop(); // close the connection
323. } // end if (client)
324.
325. // read buttons and debounce
326. ButtonDebounce();
327. }
328.
329. // function reads the push button switch states, debounces and latches the LED states 330. // toggles the LED states on each push - release cycle
331. // hard coded to debounce two switches on pins 2 and 3; and two LEDs on pins 6 and 7 332. // function adapted from Arduino IDE built-in example:
333. // File --> Examples --> 02.Digital --> Debounce
334. void ButtonDebounce(void)
335. {
336. static byte buttonState[4] = {LOW, LOW, LOW, LOW}; // the current reading from the input pin 337. static byte lastButtonState[4] = {LOW, LOW, LOW, LOW}; // the previous reading from the input pin
338.
339. // the following variables are long's because the time, measured in miliseconds, 340. // will quickly become a bigger number than can be stored in an int.
341. static long lastDebounceTime[4] = {0}; // the last time the output pin was toggled 342. long debounceDelay = 50; // the debounce time; increase if the output flickers
343. 344. byte reading[4]; 345. 346. reading[0] = digitalRead(5); 347. reading[1] = digitalRead(6); 348. reading[2] = digitalRead(7); 349. reading[3] = digitalRead(8); 350.
351. for (int i = 0; i < 4; i++) {
352. if (reading[i] != lastButtonState[i]) { 353. // reset the debouncing timer 354. lastDebounceTime[i] = millis();
355. }
356.
357. if ((millis() - lastDebounceTime[i]) > debounceDelay) { 358. // whatever the reading is at, it's been there for longer
359. // than the debounce delay, so take it as the actual current state:
360.
361. // if the button state has changed: 362. if (reading[i] != buttonState[i]) { 363. buttonState[i] = reading[i];
364.
365. // only toggle the LED if the new button state is HIGH 366. if (buttonState[i] == HIGH) {
367. LED_state[i] = !LED_state[i]; 368. }
369. }
370. }
371. } // end for() loop
372.
373. // set the LEDs
374. digitalWrite(22, LED_state[0]); 375. digitalWrite(23, LED_state[1]); 376. digitalWrite(24, LED_state[2]); 377. digitalWrite(25, LED_state[3]);
378.
379. // save the reading. Next time through the loop, 380. // it'll be the lastButtonState:
381. lastButtonState[0] = reading[0]; 382. lastButtonState[1] = reading[1]; 383. lastButtonState[2] = reading[2]; 384. lastButtonState[3] = reading[3];
385. } 386.
387. // checks if received HTTP request is switching on/off LEDs
388. // also saves the state of the LEDs
389. void SetLEDs(void)
390. {
391. // LED 1 (pin 22)
392. if (StrContains(HTTP_req, "LED1=1")) { 393. LED_state[0] = 1; // save LED state 394. digitalWrite(22, HIGH);
395. }
396. else if (StrContains(HTTP_req, "LED1=0")) { 397. LED_state[0] = 0; // save LED state 398. digitalWrite(22, LOW);
399. }
400. // LED 2 (pin 23)
401. if (StrContains(HTTP_req, "LED2=1")) { 402. LED_state[1] = 1; // save LED state 403. digitalWrite(23, HIGH);
404. }
405. else if (StrContains(HTTP_req, "LED2=0")) { 406. LED_state[1] = 0; // save LED state 407. digitalWrite(23, LOW);
408. }
409. // LED 3 (pin 24)
410. if (StrContains(HTTP_req, "LED3=1")) { 411. LED_state[2] = 1; // save LED state 412. digitalWrite(24, HIGH);
413. }
414. else if (StrContains(HTTP_req, "LED3=0")) { 415. LED_state[2] = 0; // save LED state 416. digitalWrite(24, LOW);
417. }
418. // Stop Kontak (pin 25)
419. if (StrContains(HTTP_req, "LED4=1")) { 420. LED_state[3] = 1; // save LED state 421. digitalWrite(25, HIGH);
422. }
423. else if (StrContains(HTTP_req, "LED4=0")) { 424. LED_state[3] = 0; // save LED state 425. digitalWrite(25, LOW);
426. }
427. }
428.
429. // send the XML file with analog values, switch status
430. // and LED status
431. void XML_response(EthernetClient cl)
432. {
433. int analog_val; // stores value read from analog inputs 434. int count; // used by 'for' loops
435. int sw_arr[] = {5, 6, 7, 8}; // pins interfaced to switches
436.
437. cl.print("<?xml version = \"1.0\" ?>"); 438. cl.print("<inputs>");
439.
440. // button LED states
441. // LED1 442. cl.print("<LED>"); 443. if (LED_state[0]) { 444. cl.print("on0"); 445. } 446. else { 447. cl.print("off0"); 448. }
449. cl.println("</LED>");
450.
451. // button LED states
452. // LED2 453. cl.print("<LED>"); 454. if (LED_state[1]) { 455. cl.print("on1"); 456. } 457. else { 458. cl.print("off1"); 459. } 460. cl.println("</LED>"); 461.
462. // button LED states
463. // LED3 464. cl.print("<LED>"); 465. if (LED_state[2]) { 466. cl.print("on2"); 467. } 468. else { 469. cl.print("off2"); 470. } 471. cl.println("</LED>"); 472. 473. // button SK states 474. // Stop Kontak 475. cl.print("<LED>"); 476. if (LED_state[3]) { 477. cl.print("on3"); 478. } 479. else { 480. cl.print("off3"); 481. } 482. cl.println("</LED>"); 483. cl.print("</inputs>"); 484. } 485.
486. // sets every element of str to 0 (clears array) 487. void StrClear(char *str, char length)
488. {
489. for (int i = 0; i < length; i++) { 490. str[i] = 0;
491. }
492. }
493.
494. // searches for the string sfind in the string str 495. // returns 1 if string found
496. // returns 0 if string not found
497. char StrContains(char *str, char *sfind)
498. { 499. char found = 0; 500. char index = 0; 501. char len; 502. 503. len = strlen(str); 504. 505. if (strlen(sfind) > len) { 506. return 0; 507. }
508. while (index < len) {
509. if (str[index] == sfind[found]) {
510. found++;
511. if (strlen(sfind) == found) { 512. return 1;
513. } 514. } 515. else { 516. found = 0; 517. } 518. index++; 519. } 520. 521. return 0; 522. } 523. 524.