smart home - arduino embedded web server laporan.docx

41
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

Upload: leonardus-retho

Post on 27-Jan-2016

76 views

Category:

Documents


14 download

DESCRIPTION

rte

TRANSCRIPT

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

2015

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 Mikronkontroller

Mikrokontroler 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-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 25602. Arduino Ethernet Shield + Micro SD Card (Max 2 Gb)3. 5VDC Relay 4 Channel4. LinkSys Wifi Router5. Kabel LAN6. USB Printer7. 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

Berikut ini adalah diagram wiring pada project smart home .

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.

OK NG1 D5 PUSH BUTTON MENYALAKAN LAMPU D22 LAMPU LAMPU 1 MENYALA v2 D6 PUSH BUTTON MENYALAKAN LAMPU D23 LAMPU LAMPU 2 MENYALA v3 D7 PUSH BUTTON MENYALAKAN LAMPU D24 LAMPU LAMPU 3 MENYALA v4 D8 PUSH BUTTON MENYALAKAN STOP KONTAK D25 STOP KONTAK STOP KONTAK AKTIF v

HASILNO ALAMAT INPUT PERANGKAT FUNGSI ALAMAT OUTPUT PERANGKAT PARAMETER

1. Tampilan ketika dalam keadaan semua lampu mati.

2. Tampilan ketika dalam keadaan Lampu 1 nyala.

3. Tampilan ketika dalam keadaan Lampu 2 nyala.

4. Tampilan ketika dalam keadaan Lampu 3 nyala.

5. Tampilan ketika dalam keadaan Stop Kontak aktif.

3 BAB III

PENUTUP

3.1 kesimpulan

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

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.

Refernsi

http://www.vedcmalang.com/pppptkboemlg/index.php/menuutama/listrik-electro/

1045-part-2

http://www.vedcmalang.com/pppptkboemlg/index.php/menuutama/listrik-electro/

1053-part-3

LAMPIRAN

1. Program HTML

<!DOCTYPE html><html> <head> <title>Smart Home Mekatronika 2015</title> <script> strLED1 = "";

strLED2 = "";strLED3 = "";strLED4 = "";

var LED1_state = 0;var LED2_state = 0;var LED3_state = 0;var LED4_state = 0;

function GetArduinoIO() { nocache = "&nocache=" + Math.random() * 1000000; var request = new XMLHttpRequest(); request.onreadystatechange = function() { if (this.readyState == 4) { if (this.status == 200) { if (this.responseXML != null) { // XML file received - contains analog values, switch values and LED states var count;

//LED1 if (this.responseXML.getElementsByTagName('LED')[0].childNodes[0].nodeValue === "on0") { document.getElementById("LED1").innerHTML = "Lampu 1 ON (D22)"; LED1_state = 1; } if (this.responseXML.getElementsByTagName('LED')[0].childNodes[0].nodeValue === "off0") { document.getElementById("LED1").innerHTML = "Lampu 1 OFF (D22)"; LED1_state = 0; }

//LED2if (this.responseXML.getElementsByTagName('LED')[1].childNodes[0].nodeValue ===

"on1") { document.getElementById("LED2").innerHTML = "Lampu 2 ON (D23)"; LED2_state = 1; } if (this.responseXML.getElementsByTagName('LED')[1].childNodes[0].nodeValue === "off1") { document.getElementById("LED2").innerHTML = "Lampu 2 OFF (D23)"; LED2_state = 0; }

//LED3if (this.responseXML.getElementsByTagName('LED')[2].childNodes[0].nodeValue ===

"on2") { document.getElementById("LED3").innerHTML = "Lampu 3 ON (D24)"; LED3_state = 1; } if (this.responseXML.getElementsByTagName('LED')[2].childNodes[0].nodeValue === "off2") { document.getElementById("LED3").innerHTML = "Lampu 3 OFF (D24)"; LED3_state = 0; }

//LED4if (this.responseXML.getElementsByTagName('LED')[3].childNodes[0].nodeValue ===

"on3") { document.getElementById("LED4").innerHTML = "Stop Kontak ON (D25)"; LED4_state = 1; } if (this.responseXML.getElementsByTagName('LED')[3].childNodes[0].nodeValue === "off3") { document.getElementById("LED4").innerHTML = "Stop Kontak OFF (D25)"; LED4_state = 0; } } } }

} // send HTTP GET request with LEDs to switch on/off if any request.open("GET", "ajax_inputs" + strLED1 + strLED2 + strLED3 + strLED4 + nocache, true); request.send(null); setTimeout('GetArduinoIO()', 1000); strLED1 = "";

strLED2 = "";strLED3 = "";strLED4 = "";

} function GetButton1() { if (LED1_state === 1) { LED1_state = 0; strLED1 = "&LED1=0"; } else { LED1_state = 1; strLED1 = "&LED1=1"; } }

function GetButton2() { if (LED2_state === 1) { LED2_state = 0; strLED2 = "&LED2=0"; } else { LED2_state = 1; strLED2 = "&LED2=1"; } }

function GetButton3() { if (LED3_state === 1) { LED3_state = 0; strLED3 = "&LED3=0"; } else { LED3_state = 1; strLED3 = "&LED3=1"; } }

function GetButton4() { if (LED4_state === 1) { LED4_state = 0; strLED4 = "&LED4=0"; } else { LED4_state = 1; strLED4 = "&LED4=1"; } } </script> <style> .IO_box { float: left; margin: 0 20px 20px 0; border: 1px solid blue; padding: 0 5px 0 5px; width: 120px; } h1 { font-size: 120%; color: blue; margin: 0 0 10px 0; } h2 { font-size: 85%; color: #5734E6; margin: 5px 0 5px 0; }

p, form, button { font-size: 80%; color: #252525; } .small_text { font-size: 70%; color: #737373; }

marquee_text{font-size: 100%;color: #252525;

} </style> </head> <body onload="GetArduinoIO()">

<marquee direction="up" behavior="scroll" scrollamount="2" scrolldelay="100" height="40px">Selamat Datang di Smart Home Web Controller</marquee> <h1>Politeknik Manufaktur Astra</h1>

<h1>Smart Home - Mekatronika</h1><h1>2015</h1><br>

<div class="IO_box"> <h2>Lampu 1</h2> <button type="button" id="LED1" onclick="GetButton1()">Lampu 1 OFF (D22)</button><br /><br /> </div>

<div class="IO_box"> <h2>Lampu 2</h2> <button type="button" id="LED2" onclick="GetButton2()">Lampu 2 OFF (D23)</button><br /><br /> </div>

<div class="IO_box"> <h2>Lampu 3</h2> <button type="button" id="LED3" onclick="GetButton3()">Lampu 3 OFF (D24)</button><br /><br /> </div>

<div class="IO_box"> <h2>Stop Kontak</h2> <button type="button" id="LED4" onclick="GetButton4()">Stop Kontak OFF (D25)</button><br /><br /> </div> </body><br></html

2. Program Arduino

/* * Program Name : Arduino Smart Home Ethernet Controller * Author : Ahmad Jati Widodo * Year : 2015 * Focus : Mechatronics * Study : Politeknik Manufaktur Astra, Jakarta */

#include <SPI.h>#include <Ethernet.h>#include <SD.h>// size of buffer used to capture HTTP requests#define REQ_BUF_SZ 60

// MAC address from Ethernet shield sticker under boardbyte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };IPAddress ip(192, 168, 1, 106); // IP address, may need to change depending on networkEthernetServer server(80); // create a server at port 80File webFile; // the web page file on the SD cardchar HTTP_req[REQ_BUF_SZ] = {0}; // buffered HTTP request stored as null terminated stringchar req_index = 0; // index into HTTP_req bufferboolean LED_state[4] = {0}; // stores the states of the LEDs

void setup(){ // disable Ethernet chip pinMode(10, OUTPUT); digitalWrite(10, HIGH); Serial.begin(9600); // for debugging // initialize SD card Serial.println("Initializing SD card..."); if (!SD.begin(4)) { Serial.println("ERROR - SD card initialization failed!"); return; // init failed } Serial.println("SUCCESS - SD card initialized."); // check for index.htm file if (!SD.exists("index.htm")) { Serial.println("ERROR - Can't find index.htm file!"); return; // can't find index file } Serial.println("SUCCESS - Found index.htm file."); // switches pinMode(5, INPUT); pinMode(6, INPUT); pinMode(7, INPUT); pinMode(8, INPUT); // LEDs pinMode(22, OUTPUT); pinMode(23, OUTPUT); pinMode(24, OUTPUT); pinMode(25, OUTPUT); Ethernet.begin(mac, ip); // initialize Ethernet device server.begin(); // start to listen for clients}

void loop(){

EthernetClient client = server.available(); // try to get client

if (client) { // got client? boolean currentLineIsBlank = true; while (client.connected()) { if (client.available()) { // client data available to read char c = client.read(); // read 1 byte (character) from client // limit the size of the stored received HTTP request // buffer first part of HTTP request in HTTP_req array (string) // leave last element in array as 0 to null terminate string (REQ_BUF_SZ - 1) if (req_index < (REQ_BUF_SZ - 1)) { HTTP_req[req_index] = c; // save HTTP request character req_index++; } // last line of client request is blank and ends with \n // respond to client only after last line received if (c == '\n' && currentLineIsBlank) { // send a standard http response header client.println("HTTP/1.1 200 OK"); // remainder of header follows below, depending on if // web page or XML page is requested // Ajax request - send XML file if (StrContains(HTTP_req, "ajax_inputs")) { // send rest of HTTP header client.println("Content-Type: text/xml"); client.println("Connection: keep-alive"); client.println(); SetLEDs(); // send XML file containing input states XML_response(client); } else { // web page request // send rest of HTTP header client.println("Content-Type: text/html"); client.println("Connection: keep-alive"); client.println(); // send web page webFile = SD.open("index.htm"); // open web page file if (webFile) { while(webFile.available()) { client.write(webFile.read()); // send web page to client } webFile.close(); } } // display received HTTP request on serial port Serial.print(HTTP_req); // reset buffer index and all buffer elements to 0 req_index = 0; StrClear(HTTP_req, REQ_BUF_SZ); break; } // every line of text received from the client ends with \r\n if (c == '\n') { // last character on line of received text // starting new line with next character read currentLineIsBlank = true; } else if (c != '\r') { // a text character was received from client currentLineIsBlank = false; } } // end if (client.available()) } // end while (client.connected())

delay(5); // give the web browser time to receive the data client.stop(); // close the connection } // end if (client) // read buttons and debounce ButtonDebounce();}

// function reads the push button switch states, debounces and latches the LED states// toggles the LED states on each push - release cycle// hard coded to debounce two switches on pins 2 and 3; and two LEDs on pins 6 and 7// function adapted from Arduino IDE built-in example:// File --> Examples --> 02.Digital --> Debouncevoid ButtonDebounce(void){ static byte buttonState[4] = {LOW, LOW, LOW, LOW}; // the current reading from the input pin static byte lastButtonState[4] = {LOW, LOW, LOW, LOW}; // the previous reading from the input pin // the following variables are long's because the time, measured in miliseconds, // will quickly become a bigger number than can be stored in an int. static long lastDebounceTime[4] = {0}; // the last time the output pin was toggled long debounceDelay = 50; // the debounce time; increase if the output flickers byte reading[4]; reading[0] = digitalRead(5); reading[1] = digitalRead(6); reading[2] = digitalRead(7); reading[3] = digitalRead(8); for (int i = 0; i < 4; i++) { if (reading[i] != lastButtonState[i]) { // reset the debouncing timer lastDebounceTime[i] = millis(); } if ((millis() - lastDebounceTime[i]) > debounceDelay) { // whatever the reading is at, it's been there for longer // than the debounce delay, so take it as the actual current state: // if the button state has changed: if (reading[i] != buttonState[i]) { buttonState[i] = reading[i]; // only toggle the LED if the new button state is HIGH if (buttonState[i] == HIGH) { LED_state[i] = !LED_state[i]; } } } } // end for() loop // set the LEDs digitalWrite(22, LED_state[0]); digitalWrite(23, LED_state[1]); digitalWrite(24, LED_state[2]); digitalWrite(25, LED_state[3]); // save the reading. Next time through the loop, // it'll be the lastButtonState: lastButtonState[0] = reading[0]; lastButtonState[1] = reading[1]; lastButtonState[2] = reading[2]; lastButtonState[3] = reading[3];

}

// checks if received HTTP request is switching on/off LEDs// also saves the state of the LEDsvoid SetLEDs(void){ // LED 1 (pin 22) if (StrContains(HTTP_req, "LED1=1")) { LED_state[0] = 1; // save LED state digitalWrite(22, HIGH); } else if (StrContains(HTTP_req, "LED1=0")) { LED_state[0] = 0; // save LED state digitalWrite(22, LOW); } // LED 2 (pin 23) if (StrContains(HTTP_req, "LED2=1")) { LED_state[1] = 1; // save LED state digitalWrite(23, HIGH); } else if (StrContains(HTTP_req, "LED2=0")) { LED_state[1] = 0; // save LED state digitalWrite(23, LOW); } // LED 3 (pin 24) if (StrContains(HTTP_req, "LED3=1")) { LED_state[2] = 1; // save LED state digitalWrite(24, HIGH); } else if (StrContains(HTTP_req, "LED3=0")) { LED_state[2] = 0; // save LED state digitalWrite(24, LOW); } // Stop Kontak (pin 25) if (StrContains(HTTP_req, "LED4=1")) { LED_state[3] = 1; // save LED state digitalWrite(25, HIGH); } else if (StrContains(HTTP_req, "LED4=0")) { LED_state[3] = 0; // save LED state digitalWrite(25, LOW); }}

// send the XML file with analog values, switch status// and LED statusvoid XML_response(EthernetClient cl){ int analog_val; // stores value read from analog inputs int count; // used by 'for' loops int sw_arr[] = {5, 6, 7, 8}; // pins interfaced to switches cl.print("<?xml version = \"1.0\" ?>"); cl.print("<inputs>"); // button LED states // LED1 cl.print("<LED>"); if (LED_state[0]) { cl.print("on0"); } else { cl.print("off0"); }

cl.println("</LED>"); // button LED states // LED2 cl.print("<LED>"); if (LED_state[1]) { cl.print("on1"); } else { cl.print("off1"); } cl.println("</LED>");

// button LED states // LED3 cl.print("<LED>"); if (LED_state[2]) { cl.print("on2"); } else { cl.print("off2"); } cl.println("</LED>"); // button SK states // Stop Kontak cl.print("<LED>"); if (LED_state[3]) { cl.print("on3"); } else { cl.print("off3"); } cl.println("</LED>"); cl.print("</inputs>");}

// sets every element of str to 0 (clears array)void StrClear(char *str, char length){ for (int i = 0; i < length; i++) { str[i] = 0; }}

// searches for the string sfind in the string str// returns 1 if string found// returns 0 if string not foundchar StrContains(char *str, char *sfind){ char found = 0; char index = 0; char len;

len = strlen(str); if (strlen(sfind) > len) { return 0; } while (index < len) { if (str[index] == sfind[found]) { found++; if (strlen(sfind) == found) { return 1;

} } else { found = 0; } index++; }

return 0;}