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;
}