khhoa gửi vào
- 18967 lượt xem
Với tinh thần học hỏi và chia sẻ, mặc dù chưa được hoàn thiện lắm mình cũng xin chia xẻ với các bạn 1 project mình đang tạp tò làm Project điều khiển thiết bị qua Internet với Arduino và module Ethernet Shield. Đối với mạng LAN thì đơn giản các bạn chỉ cần đấu nối như sơ đồ và nạp code vào là chạy.
Chuẩn bị
Nếu các bạn muốn điều khiển qua Internet thì phải NAT port Modem internet (cái này các bạn tự tìm hiểu nhé)
Với project này bạn có thể :
- Thay đổi IP
- Cần phải nhập Pass để điều khiển ( pass mình đặt là "hihaho" )
- Khôi phục lại trạng thái relay khi mất điện
- Thay đổi mức kích relay là 0 hay 1
- Có thời gian timeout - khi không làm gì (nếu timeout=0 thì không cần mật khẩu)
Còn một số ý tưởng nữa nhưng chưa có thời gian làm.
Do mới nghiên cứu Arduino và không biết gì nhiều về lập trình WEB nên chắc cũng còn nhiều thiếu xót mong các bạn thông cảm và đóng góp ý kiến để hoàn thiện hơn
Đấu nối
Code
/* Điều khiển từ xa qua Internet với Arduino và Ethernet Shield Viết bởi Nguyen Ngoc TCD Email: khhoant@gmail.com Tài liệu tra cứu từ trang Web : arduino.vn và www.arduino.cc và các trang khác nữa (nhiều không nhớ nổi, góp nhặt mỗi nơi 1 ít) *** Các lệnh *** Reset reset Arduino rcv=on khôi phục lại trạng thái trước khi mất điện rcv=off không khôi phục, tất cả relay đều tắt ip=192.168.1.100 đặt địa chỉ IP sub= subnet mark (chưa làm) gw gateway (chưa làm) timeOut=10 thời gian thoát khi không làm gì từ 1 ->255 phút, =0 không kiểm tra Pass logout thoát on=0 Kích Relay = mức 0 on=1 Kích Relay = mức 1 *** Địa chỉ EEPROM *** 0 Khôi phục lại trạng thái khi mất điện 1 -> 12 IP 13 Mức kích Relay (0 hay 1) 14 timeOut 101 -> 104 Lưu trạng thái Relay */ #include <avr/wdt.h> #include <EEPROM.h> #include <Dhcp.h> #include <Dns.h> #include <Ethernet.h> #include <EthernetClient.h> #include <EthernetServer.h> #include <EthernetUdp.h> #include <SPI.h> int relay1 = 2; //relay1 int relay2 = 3; //relay2 int relay3 = 4; //relay3 int relay4 = 5; //relay4 int relay1Status,relay2Status,relay3Status,relay4Status; int mo; int timeOut; //byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; byte mac[] = {0x3C, 0xDA, 0x2A, 0xD2, 0x39, 0x97}; //byte ip[] = { 192, 168, 1, 99 }; //byte gateway[] = { 192, 168, 1, 1 }; //byte subnet[] = { 255, 255, 255, 0 }; IPAddress ip(192, 168, 1, 99); EthernetServer server(80); String readString; String ipAdd,sub,gw; String pass="hihaho"; int ktraPass = 1; int ipAdd1,ipAdd2,ipAdd3,ipAdd4; int sub1,sub2,sub3,sub4; int gw1,gw2,gw3,gw4; long time1,time2; void setup() { Serial.begin(9600); while (!Serial) {} pinMode(relay1, OUTPUT); pinMode(relay2, OUTPUT); pinMode(relay3, OUTPUT); pinMode(relay4, OUTPUT); ipAdd1 = EEPROM.read(1); ipAdd2 = EEPROM.read(2); ipAdd3 = EEPROM.read(3); ipAdd4 = EEPROM.read(4); if (ipAdd1==0 && ipAdd2==0 && ipAdd3==0 && ipAdd4==0) { ipAdd1=192; ipAdd2=168; ipAdd3=1; ipAdd4=100; } if (ipAdd1==255 && ipAdd2==255 && ipAdd3==255 && ipAdd4==255) { ipAdd1=192; ipAdd2=168; ipAdd3=1; ipAdd4=100; } /* * Phần này lười chưa làm * Cái này mình không rành về IP lắm nên không biết đặt điều kiện như thế nào sub1 = EEPROM.read(5);if (sub1==0){sub=255;} sub2 = EEPROM.read(6);if (sub1==0){sub=255;} sub3 = EEPROM.read(7);//if (sub1==0){sub=255;} sub4 = EEPROM.read(8); gw1 = EEPROM.read(9); gw2 = EEPROM.read(10); gw3 = EEPROM.read(11); gw4 = EEPROM.read(12); */ mo =EEPROM.read(13); if(mo!=1){mo=0;} Serial.print("EEPROM.read(13) mo = ");Serial.println(EEPROM.read(13)); Serial.print("EEPROM.read (0) Khoi phuc trang thai = ");Serial.println(EEPROM.read(0)); timeOut =EEPROM.read(14); Serial.print("EEPROM.read(14) timeOut = ");Serial.println(EEPROM.read(14)); if(EEPROM.read(0)) { // Ktra giá trị lưu nếu = 1 thì lấy trạng thái relay đã lưu trước đó relay1Status = EEPROM.read(101);relay2Status = EEPROM.read(102); relay3Status = EEPROM.read(103);relay4Status = EEPROM.read(104); Serial.print("Trang thai Relay 1234 : "); Serial.print(relay1Status);Serial.print(relay2Status); Serial.print(relay3Status);Serial.println(relay4Status); digitalWrite(relay1, relay1Status);digitalWrite(relay2, relay2Status); digitalWrite(relay3, relay3Status);digitalWrite(relay4, relay4Status); } else // Ktra giá trị lưu nếu = 0 thì đặt trạng thái relay là tắt { relay1Status = relay2Status = relay3Status = relay4Status = !mo; digitalWrite(relay1, relay1Status);digitalWrite(relay2, relay2Status); digitalWrite(relay3, relay3Status);digitalWrite(relay4, relay4Status); } // Start Ethernet communication with the server: IPAddress ip(ipAdd1, ipAdd2, ipAdd3, ipAdd4); Ethernet.begin(mac, ip); server.begin(); Serial.print("Dia chi IP la : ");Serial.println(Ethernet.localIP()); } void ResetBoard( uint8_t time) { wdt_enable(time); while(1) {} } void loop() { // Create a connection to the client EthernetClient client = server.available(); if (client) { while (client.connected()) { if (client.available()) { char c = client.read(); //Read the characters from HTTP if (readString.length() < 100) {readString += c;}//Enter the characters in the string //If the HTTP request was successful if (c == '\n') { Serial.println(readString); //write to the serial monitor for debugging client.println("HTTP/1.1 200 OK"); //Sending new page client.println("Content-Type: text/html"); client.println(); client.println("<HTML>"); client.println("<HEAD>"); client.println("<TITLE>Dieu khien</TITLE>"); client.println("</HEAD>"); client.println("<BODY>"); client.println("<CENTER>"); client.println("<H1>Remote Control</H1>"); /* Khai báo 1 cái nút màu vàng to tổ bố * <input style= * "width: 300px; padding: 20px; cursor: pointer; box-shadow: 6px 6px 5px #999; * -webkit-box-shadow: 6px 6px 5px #999; -moz-box-shadow: 6px 6px 5px #999; * font-weight: bold; background: #ffff00; color: #000; border-radius: 10px; * border: 1px solid #999; font-size: 150%;" * type="button" value="Put Your Text Here" * onclick="window.location.href='http://www.hyperlinkcode.com/button-links.php'" /> */ //========= Kiem tra pass ========== time2=millis(); if (timeOut==0){ktraPass=0;} else {if ((time2-time1)/60000 >= timeOut) {ktraPass=1;}} if (ktraPass==0) { time1=millis(); //Relay 1 /* Không đủ bộ nhớ để khai báo màu mè cho button client.println("<input type=\"button\" style=\"color:blue;background-color:Green;font-size:160%;\" value=\"Mo\" onclick=\"window.location.href='/mo1'\" />"); client.println("<input type=\"button\" style=\"background-color:Red;\" value=\"Mo\" onclick=\"window.location.href='/mo1'\" />"); client.println("<input type=\"button\" style=\"background-color:Red;\" value=\"Tat\" onclick=\"window.location.href='/tat1'\" />"); */ client.println("<input type=\"button\"value=\"Mo\"onclick=\"location.href='/m1'\">"); client.println("<input type=\"button\"value=\"Tat\"onclick=\"location.href='/tt1'\">"); if (readString.indexOf("m1") >0){digitalWrite(relay1, 0);relay1Status = mo; } if (readString.indexOf("tt1") >0){digitalWrite(relay1, 1);relay1Status = !mo;} client.println("<a>1</a>"); if (relay1Status == mo ){client.println("<a>Mo</a><br />");} if (relay1Status == !mo){client.println("<a>Tat</a><br />");} client.println("<br />"); //Relay 2 client.println("<input type=\"button\"value=\"Mo\"onclick=\"location.href='/m2'\">"); client.println("<input type=\"button\"value=\"Tat\"onclick=\"location.href='/tt2'\">"); if (readString.indexOf("m2") >0){digitalWrite(relay2, 0);relay2Status = mo; } if (readString.indexOf("tt2") >0){digitalWrite(relay2, 1);relay2Status = !mo;} client.println("<a>2</a>"); if (relay2Status == mo ){client.println("<a>Mo</a><br />");} if (relay2Status == !mo){client.println("<a>Tat</a><br />");} client.println("<br />"); //Relay 3 client.println("<input type=\"button\"value=\"Mo\"onclick=\"location.href='/m3'\">"); client.println("<input type=\"button\"value=\"Tat\"onclick=\"location.href='/tt3'\">"); if (readString.indexOf("m3") >0){digitalWrite(relay3, 0);relay3Status = mo; } if (readString.indexOf("tt3") >0){digitalWrite(relay3, 1);relay3Status = !mo;} client.println("<a>3</a>"); if (relay3Status == mo ){client.println("<a>Mo</a><br />");} if (relay3Status == !mo){client.println("<a>Tat</a><br />");} client.println("<br />"); //Relay 4 client.println("<input type=\"button\"value=\"Mo\"onclick=\"location.href='/m4'\">"); client.println("<input type=\"button\"value=\"Tat\"onclick=\"location.href='/tt4'\">"); if (readString.indexOf("m4") >0){digitalWrite(relay4, 0);relay4Status = mo; } if (readString.indexOf("tt4") >0){digitalWrite(relay4, 1);relay4Status = !mo;} client.println("<a>4</a>"); if (relay4Status == mo ){client.println("<a>Mo</a><br />");} if (relay4Status == !mo){client.println("<a>Tat</a><br />");} // Tải lại client.println("<br />"); client.println("<input type=\"button\"value=\"Tai lai\"onclick=\"location.href='/'\">"); /*************** * Khối lệnh * *************** */ if (readString.indexOf("rcv=on") >0){EEPROM.update(0, 1);} // Khôi phục if (readString.indexOf("rcv=off") >0){EEPROM.update(0, 0);} // Không khôi phục if (readString.indexOf("mo=0") >0){EEPROM.update(13, 0);} if (readString.indexOf("mo=1") >0){EEPROM.update(13, 1);} if (readString.indexOf("timeOut=")>0) { timeOut = readString.substring(readString.indexOf("=")+1).toInt(); if(timeOut<256){EEPROM.update(14, timeOut);} } if (readString.indexOf("logout") >0){ktraPass=1;} if (readString.indexOf("Reset") >0){ResetBoard(WDTO_60MS);} //resetFunc //============== Đọc địa chỉ IP ============= if (readString.indexOf("ip=") >0) { ipAdd = readString.substring(readString.indexOf("=")+1,readString.indexOf("HTTP")-1); Serial.println(ipAdd); ipAdd1 = ipAdd.substring(0,ipAdd.indexOf(".")).toInt();// ipAdd1 = ipAdds1.toInt(); ipAdd = ipAdd.substring(ipAdd.indexOf(".")+1); ipAdd2 = ipAdd.substring(0,ipAdd.indexOf(".")).toInt(); ipAdd = ipAdd.substring(ipAdd.indexOf(".")+1); ipAdd3 = ipAdd.substring(0,ipAdd.indexOf(".")).toInt(); ipAdd4 = ipAdd.substring(ipAdd.indexOf(".")+1).toInt(); //======== Luu IP vao EEPROM ========== if(ipAdd1>0 && ipAdd1<256 && ipAdd2<256 && ipAdd3<256 && ipAdd4<256) {EEPROM.update(1, ipAdd1);EEPROM.update(2, ipAdd2);EEPROM.update(3, ipAdd3);EEPROM.update(4, ipAdd4);} } } else // Chưa nhập mật khẩu { Serial.println("Sai mat khau"); client.println("<form action=\"/action_page.php\">"); client.println("<p>Pass:<input name=\"d\" type=\"password\"><input type=\"submit\" /></p>"); client.println("</form>"); if (readString.indexOf(pass) >0) { ktraPass=0; time1=millis(); client.println("<body onload = \"location.href='/'\">"); //client.println("<body onload = \"location.reload (true)\" >"); //client.println("<body onload = \"location.reload (false)\" >"); } else {ktraPass=1;} } client.println("</BODY>"); client.println("</HTML>"); delay(1); client.stop(); //======== Luu trang thai vao EEPROM ========== EEPROM.update(101, relay1Status);EEPROM.update(102, relay2Status); EEPROM.update(103, relay3Status);EEPROM.update(104, relay4Status); readString=""; } } } } }