Điều khiển từ xa với Arduino và Ethernet Shield

Mô tả dự án: 

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" 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

Đấ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: [email protected]
 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="";             
        }         
      }
    }
  }
}

 

lên
8 thành viên đã đánh giá bài viết này hữu ích.
Chuyên mục: 
Các dự án được truyền cảm hứng

Đọc cảm biến nhiệt độ, độ ẩm từ DHT11 up lên server làm webapp

Hôm nay, mình sẽ dùng cảm biến DHT11 để đọc nhiệt độ, độ ẩm, từ đó đẩy lên Internet thông qua iNut Cảm biến. Đồng thời sẽ quay màn hình quá trình làm webapp devil.

lên
6 thành viên đã đánh giá bài viết này hữu ích.