-
-
-
Tổng tiền thanh toán:
-
Điều khiển từ xa với Arduino và Ethernet Shield
11/10/2018
Điều khiển từ xa với Arduino và Ethernet Shield
Mô tả dự án:
Hôm nay mình 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.
1
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" cheeky)
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
01 bo Arduino (Nano, UNO, Pro Mini)
01 module ethernet shield
01 module 04 relay
2
Đấu nối
3
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="";
}
}
}
}
}