4.家用開關控制

四個插座控制(依Arduino  UNO腳位,還可再增加11腳位)

繼電器連接

A => D4

B => D5

C => D6

D => D7

#include <SoftwareSerial.h>

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

#define TX 3   //ESP8266 TX接3

#define RX 2  //ESP8266 RX接2

#define SSID " "    //這裡填入你家AP的SSID

#define PASSWORD " "   //這裡填入你家AP的密碼

SoftwareSerial esp8266(TX,RX); 

LiquidCrystal_I2C lcd(0x3F,16,2);  //或 0x27

#define DEBUG true

int a=-1;

int b=-1;

int c=-1;

int d=-1;

void setup() {

  Serial.begin(9600); //start hardware serial port

  esp8266.begin(9600); //start soft serial port

  lcd.init();                     

  lcd.backlight(); 

  pinMode(13,OUTPUT);  //連線指示燈

  String cmd="AT+CWJAP=\"";

  cmd+=SSID;

  cmd+="\",\"";

  cmd+=PASSWORD;

  cmd+="\"";

  cmd+="\r\n";

  sendData("AT+RST\r\n",2000,DEBUG); //重啟ESP8266

  sendData("AT+CWMODE=1\r\n",100,DEBUG); // 設定為STA模式

  sendData(cmd,10000,DEBUG); // 取得連線(視AP連線效能作調整,預設7000毫秒)

  sendData("AT+CIFSR\r\n",100,DEBUG); // 獲得IP

  sendData("AT+CIPMUX=1\r\n",100,DEBUG); // 開啟多除連接模式

  sendData("AT+CIPSERVER=1,8080\r\n",100,DEBUG); // 設定連接埠為8080

  pinMode(4,OUTPUT);

  pinMode(5,OUTPUT);

  pinMode(6,OUTPUT);

  pinMode(7,OUTPUT);

 

  }

void loop() {

digitalWrite(13,1);  //當ESP8266 連上AP,自動亮燈 

  if (esp8266.available()) { 

    if (esp8266.find("+IPD,")) {  //收到客戶端的連線要求, 進行回應

      lcd.setCursor(0,1);

      lcd.print("busy...");

      delay(1000);

      // +IPD, 後的字元是連線 ID (ASCII碼), 用 read() 讀取後減 48 為數字

      int connectionId = esp8266.read()-48;

      esp8266.find("X="); 

      char s= esp8266.read();

       if(s=='A'){

        a=a*(-1);

        if(a>0){

         digitalWrite(4,1); 

        }else{

         digitalWrite(4,0);

         s='a';

        }

      }

       if(s=='B'){

        b=b*(-1);

        if(b>0){

         digitalWrite(5,1); 

        }else{

         digitalWrite(5,0);

         s='b';

        }

      }

       if(s=='C'){

        c=c*(-1);

        if(c>0){

         digitalWrite(6,1); 

        }else{

         digitalWrite(6,0);

         s='c';

        }

      }

       if(s=='D'){

        d=d*(-1);

        if(d>0){

         digitalWrite(7,1); 

        }else{

         digitalWrite(7,0);

         s='d';

        }

      }

       if(s=='S'){

        digitalWrite(4,0);

        digitalWrite(5,0);

        digitalWrite(6,0);

        digitalWrite(7,0);

        a=-1;

         b=-1;

          c=-1;

           d=-1;

      

        }

      

      

      String webpage="HTTP/1.1 200 OK\r\n";

      webpage += "\r\n"; 

      webpage += "X=";

      webpage += s;  

     

      

      String cipSend = "AT+CIPSEND=";

      cipSend += connectionId;

      cipSend += ",";

      cipSend +=webpage.length();

      cipSend +="\r\n";

      sendData(cipSend,100,DEBUG);

      sendData(webpage,10000,DEBUG); //延遲時間800毫秒可以自行調整

      String closeCommand = "AT+CIPCLOSE=";

      closeCommand+=connectionId; // append connection id

      closeCommand+="\r\n";   

      sendData(closeCommand,100,DEBUG);

      }

    }

  }

String sendData(String command, const int timeout, boolean debug) {

  String response="";

  esp8266.print(command); // send the read character to the esp8266

  long int time=millis();

   do{

    while(esp8266.available()) {

      // The esp has data so display its output to the serial window

      char c=esp8266.read(); // read the next character.

      response += c;

      } 

      if(command.charAt(3)=='C'&&command.charAt(4)=='I'&&command.charAt(5)=='F'){

      lcd.setCursor(0,0);

      int k = response.length();

      for(int j=11;j<k-8;j++){

       lcd.print(response[j]);  

      }

             

      }

      if(response.charAt(response.length()-2)=='O'&&response.charAt(response.length()-1)=='K'){

        time=0;

      lcd.setCursor(0,1);

      lcd.print("OK       ");

      }

    }while ((time+timeout) > millis());

  if (debug) {Serial.print(response);}

  return response;

  }