2023年3月18日 星期六

實作 Ethernet Shield 網路家用電路控制

本實作介紹如何使用 Arduino Ethernet Shield W5100 乙太網路擴充板,除指定相關網路參數例如MAC、IP位址等進行網路連線外,並以網頁表單資料傳送的方式透過網路擴充板與繼電器模組控制家電電源的啟閉,達到遠端控制家電之目的。

本實作除了之前介紹過的Ethernet Shield(W5100)乙太網路擴充板外,新增一個2 Relay的雙電路繼電器模組,繼電器(Relay) 是一種電流控制模組,具有輸入迴路和輸出迴路,常用於自動控制電路中,能夠把較小的電流去控制較大電流的一種「自動開關」。



  • 繼電器型號: Jqc/3FF/S Z, 2 Channel
  • 工作電壓: 5 V DC; 負載: 10 A, AC 250 V/15 A, 125 V
  •  50 x 37 x 18 mm (L * W * H); Color: Blue relays on a black PCB; Weight: 35 g
  • 腳位接點:VCC:系統電源正極,GND:系統電源負極,IN1--IN2:繼電器控制端埠。


Ethernet Shield 擴充板在使用時就直接插在 Arduino UNO即可。

接著,將筆者將繼電器模組以銅柱加高的方式組合於乙太網路擴充板之上。

下列程式碼主要讓 Arduino 透過Ethernet Shield(W5100)乙太網路擴充板建立網頁伺服器,,當客戶端連線內部網址 192.168.1.97 時,回應客戶端 (瀏覽器) 一個家用電路開關設定頁面讓使用者點選,然後經由網頁表單以GET方式回傳設定參數來控制繼電器模組。.
#include <SPI.h>
#include <Ethernet.h>
 
// 設定MAC地址
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
// 設定IP地址
IPAddress ip(192, 168, 0, 97);
//設定DNS
//IPAddress dnServer(168, 95, 1, 1);
// 設定閘道
IPAddress gateway(192, 168, 0, 1);
// 設定遮罩
IPAddress subnet(255, 255, 255, 0);
// 初始化Ethernet程式庫,HTTP默認端口為80
EthernetServer server(80);

String readString = String(50); //宣告接收字串的變數
const int Control1=2;  //第一組控制接腳  
const int Control2=3;  //第二組控制接腳

void setup() {
    pinMode(Control1,OUTPUT);
    pinMode(Control2,OUTPUT); 
    digitalWrite(Control1,LOW);
    digitalWrite(Control2,LOW);
      
// 初始化串口通訊
  Serial.begin(9600);
 
// 開始ethernet連接,並作為服務器初始化
Ethernet.begin(mac, ip, gateway, subnet);
server.begin();

  Serial.print( "server is at " );
  Serial.println(Ethernet.localIP());
}
 
void loop() {
  // 監聽客戶端傳來的數據
  EthernetClient client = server.available();
  //如果有新連線請求
  if (client) {
    Serial.println( "new client" );
      
      //輸出網頁控制內容
      client.print("<html>");
      client.print("<head>");     
      client.print("<meta http-equiv=content-type content=text/html; charset=UTF-8>");  
      client.print("<style>"); 
      client.print("body,input{font-family: verdana, Times New Roman,微軟正黑體,新細明體;}");     
      client.print("p{text-align:center;font-size:60px;}");
      client.print("table{text-align:center;border-collapse:collapse}");        
      client.print("th,td,input{align:center;margin:2px;padding:10px;font-size:40px}");     
      client.print("th{color:white;}");        
      client.print("</style>");      
      client.print("</head>");        
      client.print("<body>");    
      client.print("<p>網路遙控電路</p>");   
      client.print("<table border=1 align=center width=75% height=50%>");       
      client.print("<tr>");  
      client.print("<th colspan=2 bgcolor=red>第一組電路</th>");         
      client.print("</tr>"); 
      client.print("<tr>"); 
      client.print("<td>");       
      client.print("<form method=get>");      
      client.print("<input type=hidden name=L value=0>");   
      client.print("<input type=submit value=開啟ON>");            
      client.print("</form>");
      client.print("</td>");       
      client.print("<td>");    
      client.print("<form method=get>");
      client.print("<input type=hidden name=L value=1>");   
      client.print("<input type=submit value=關閉OFF>");            
      client.print("</form>");     
      client.print("</td>"); 
      client.print("</tr>");         

      client.print("<tr>");  
      client.print("<th colspan=2 bgcolor=orange>第二組</th>");         
      client.print("</tr>"); 
      client.print("<tr>"); 
      client.print("<td>");       
      client.print("<form method=get>");      
      client.print("<input type=hidden name=L value=2>");   
      client.print("<input type=submit value=開啟ON>");            
      client.print("</form>");
      client.print("</td>");       
      client.print("<td>");    
      client.print("<form method=get>");
      client.print("<input type=hidden name=L value=3>");   
      client.print("<input type=submit value=關閉OFF>");            
      client.print("</form>");     
      client.print("</td>"); 
      client.print("</tr>");             
     
      client.print("</table>");
      client.print("</body></html>");     
    
    // 只要通訊連線中.....
    while (client.connected()) {
      //確認客戶端有發出請求並已連接
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
         readString.concat(c);  //讀取GRT查詢參數      
             if (c == '\n')
             {                      
              //第一組電路控制判斷
                if (readString.substring(8,9) == "0")    
                   digitalWrite(Control1,HIGH);
                else if (readString.substring(8,9) == "1")    
                   digitalWrite(Control1,LOW);
               //第一組電路控制判斷
                else if (readString.substring(8,9) == "2")    
                   digitalWrite(Control2,HIGH);  
                else if (readString.substring(8,9) == "3")    
                   digitalWrite(Control2,LOW);
                
                //清空判斷字串參數          
                readString="";
                 // 斷開連接
                client.stop(); 
                Serial.println( "client disonnected" );                 
           }
        }
    }
  }
}
本實作暫時先以紅綠、兩個LED替代要控制的家電用品。