Advertisement

基于ESP8266的家用智能wifi家电控制(附带app设计)

阅读量:

一、需求和思路

1.空调不带wifi,遥控总是找不到,手机没有红外线,只好做一个基于esp8266的局域网红外遥控,顺便做个app。

2.使用esp8266开发板,红外模块一个。

3.使用Android studio制作遥控app。

二、esp8266控制程序

复制代码
 /* * nodemcu引脚对应数字:     
    
  * 16=D0; 
    
  *  4=D2;
    
  *  0=D3;
    
  *  2=D4;
    
  * 14=D5;
    
  * 12=D6;
    
  * 13=D7;
    
  * 15=D8;
    
  *  3=D9;
    
  *  1=D10;
    
  * 舵机  ->D2--模拟输出
    
 */
    
  
    
 #include <ESP8266WiFi.h>
    
 #include <Servo.h>
    
 #include <Arduino.h>
    
 #include <IRremoteESP8266.h>
    
 #include <IRsend.h>
    
  
    
  
    
 const uint16_t kIrLed = 4;
    
 IRsend irsend(kIrLed);   
    
 //Timestamp : 000155.307Library   : v2.7.19
    
 //Protocol  : COOLIXCode      : 0xB29F40 (24 Bits)Mesg Desc.: Power: On, Mode: 0 (Cool), Fan: 4 (Min), Temp: 24C, Zone Follow: Off, Sensor Temp: Off
    
 uint16_t rawData[119] ={1212, 496,  1186, 478,  418, 1270,  1210, 474,  1212, 498,  396, 1268,  416, 1268,  1210, 500,  394, 1294,  416, 1244,  444, 1266,  394, 7880,  1186, 478,  1230, 456,  414, 1294,  1186, 480,  1206, 500,  394, 1292,  394, 1270,  1206, 482,  414, 1268,  416, 1294,  394, 1270,  418, 7856,  1232, 452,  1210, 502,  418, 1268,  1208, 478,  1184, 502,  392, 1274,  414, 1294,  1210, 454,  416, 1292,  392, 1296,  416, 1268,  392, 7884,  1184, 500,  1186, 504,  414, 1270,  1184, 506,  1206, 478,  394, 1294,  392, 1294,  1198, 488,  392, 1294,  392, 1296,  390, 1294,  414, 7860,  1208, 478,  1210, 478,  392, 1294,  1208, 480,  1206, 480,  392, 1294,  394, 1294,  1206, 478,  418, 1270,  394, 1292,  392, 1296,  392};  
    
 // COOLIX B29F40uint64_t data = 0xB29F40;
    
 uint16_t Geli_FanOpen[119] = {1268, 418,  1268, 418,  448, 1238,  1268, 418,  1268, 418,  450, 1238,  448, 1238,  450, 1236,  450, 1238,  448, 1238,  1268, 418,  448, 7828,  1268, 418,  1268, 418,  450, 1236,  1268, 418,  1270, 418,  448, 1238,  450, 1236,  450, 1238,  448, 1238,  448, 1238,  1268, 418,  450, 7828,  1268, 418,  1268, 418,  450, 1236,  1268, 418,  1268, 418,  450, 1236,  448, 1238,  450, 1236,  450, 1236,  450, 1236,  1268, 418,  450, 7826,  1266, 418,  1268, 418,  452, 1234,  1244, 442,  1246, 442,  452, 1234,  452, 1234,  452, 1234,  452, 1234,  452, 1234,  1244, 442,  452, 7824,  1246, 440,  1268, 418,  450, 1236,  1270, 418,  1268, 416,  448, 1238,  446, 1240,  424, 1260,  426, 1260,  430, 1256,  1222, 464,  430};
    
 uint16_t Geli_FanClose[95] = {1268, 418,  1268, 418,  448, 1238,  1268, 418,  1270, 418,  450, 1238,  448, 1240,  448, 1238,  448, 1238,  450, 1236,  448, 1238,  1268, 7008,  1268, 418,  1268, 418,  450, 1238,  1268, 418,  1268, 418,  448, 1238,  448, 1236,  450, 1238,  450, 1236,  450, 1236,  450, 1238,  1268, 7010,  1266, 418,  1268, 418,  450, 1236,  1268, 418,  1268, 418,  450, 1236,  452, 1234,  452, 1236,  452, 1234,  452, 1234,  452, 1234,  1244, 7030,  1244, 440,  1246, 440,  474, 1212,  1270, 416,  1248, 440,  448, 1238,  448, 1238,  448, 1238,  446, 1240,  424, 1260,  426, 1260,  1222};
    
 uint16_t Geli_FanType[95] = {1268, 418,  1268, 418,  448, 1238,  1268, 418,  1268, 418,  448, 1238,  448, 1238,  448, 1238,  448, 1238,  1268, 418,  448, 1238,  448, 7828,  1266, 418,  1268, 418,  448, 1238,  1266, 418,  1268, 418,  448, 1238,  448, 1238,  446, 1238,  472, 1214,  1268, 418,  448, 1238,  448, 7824,  1268, 418,  1268, 418,  448, 1238,  1266, 420,  1268, 418,  450, 1236,  448, 1238,  448, 1238,  448, 1236,  1268, 418,  450, 1236,  448, 7822,  1268, 418,  1268, 418,  450, 1234,  1244, 440,  1268, 418,  472, 1212,  450, 1236,  472, 1214,  446, 1238,  1242, 444,  426, 1260,  430}; 
    
 uint16_t Geli_FanTimer[71] = {1266, 418,  1268, 418,  448, 1238,  1266, 420,  1268, 418,  448, 1238,  448, 1240,  446, 1238,  1268, 418,  448, 1238,  448, 1238,  448, 7828,  1268, 420,  1268, 418,  448, 1238,  1268, 418,  1268, 418,  448, 1238,  448, 1238,  448, 1238,  1268, 418,  448, 1240,  472, 1214,  448, 7826,  1266, 420,  1268, 418,  448, 1238,  1268, 418,  1266, 420,  448, 1238,  448, 1238,  448, 1236,  1270, 416,  450, 1236,  450, 1236,  450};
    
 #include <ESP8266WiFi.h>
    
 #include <Servo.h>
    
  
    
  
    
 #ifndef STASSID
    
 #define STASSID "你的wifi"    //WiFi名称
    
 #define STAPSK  "你的wifi密码"  //WiFi密码
    
 #endif
    
  
    
 #define ANGLE_ON  76    //开灯时的舵机角度
    
 #define ANGLE_OFF 270   //关灯时的舵机角度
    
 #define ANGLE_NONE 90  //置空时的舵机角度
    
  
    
 const char* ssid = STASSID;
    
 const char* password = STAPSK;
    
 int angle=ANGLE_NONE;//舵机角度
    
 Servo myservo;  //创造一个servo结构体
    
  
    
 //创建服务器实例,指定要监听的端口为80端口
    
 WiFiServer server(80);
    
  
    
 void setup() {
    
   Serial.begin(74880);
    
   myservo.attach(4); //舵机信号线,接analogIn脚
    
   myservo.write(angle);// 0~180°
    
   //连接WiFi
    
   Serial.println();
    
   Serial.println();
    
   Serial.print(F("WiFi start connect "));//用F函数将会把字符串放入RAM中,输出至串口
    
   Serial.println(ssid);
    
  
    
   WiFi.mode(WIFI_STA);//设置为接收WiFi模式
    
   WiFi.begin(ssid, password);
    
  
    
   while (WiFi.status() != WL_CONNECTED) {
    
     
    
     delay(500);
    
     Serial.print(F("."));
    
   }
    
   Serial.println();
    
   Serial.println(F("WiFi已连接!"));
    
  
    
   //开启模块的服务器
    
   server.begin();
    
   Serial.println(F("模块服务端已开启!"));
    
  
    
   //打印模块的IP地址
    
   Serial.println(WiFi.localIP());
    
 }
    
  
    
 void loop() {
    
   //监测客户端是否连接
    
   WiFiClient client = server.available();
    
   if (!client) {
    
     return;//如果未连接就重新循环监测
    
   }
    
 //  Serial.println(F("new client"));
    
  
    
   client.setTimeout(1000); // default is 1000
    
  
    
   //读取请求内容的第一行
    
   String req = client.readStringUntil('\r');
    
   Serial.println(F("请求: "));
    
   Serial.println(req);
    
  
    
   //匹配 请求-->信号变量
    
   if (req.indexOf(F("/gpio/0")) != -1) {
    
     angle = ANGLE_ON;//如果/gpio/0在请求内容中,发出开灯的信号
    
     myservo.write(angle);// 0~180°
    
     delay(1000);
    
     myservo.write(ANGLE_NONE);//将舵机重新置空,以免一直受力损坏
    
   } 
    
   else if (req.indexOf(F("/gpio/1")) != -1) { //电扇摇头
    
     irsend.sendRaw(rawData, 119, 38);
    
   } 
    
   else if (req.indexOf(F("/gpio/2")) != -1) { //电扇开机
    
     irsend.sendRaw(Geli_FanOpen, 119, 38);
    
   } 
    
   else if (req.indexOf(F("/gpio/3")) != -1) { //电扇定时
    
     irsend.sendRaw(Geli_FanTimer, 71, 38);
    
   } 
    
   else if (req.indexOf(F("/gpio/4")) != -1) {  //电扇关机
    
     irsend.sendRaw(Geli_FanClose, 95, 38);
    
   } 
    
   else if (req.indexOf(F("/gpio/5")) != -1) {  //电扇风类
    
     irsend.sendRaw(Geli_FanType, 95, 38);
    
   } 
    
   else {
    
     Serial.println(F("无效请求"));
    
   }
    
   //读取或忽略余下的请求内容
    
   while (client.available()) {
    
     client.read();
    
   }
    
   
    
   //向客户端发送回答,HTML网页代码内容
    
   //nagle算法会将它们分组为一个数据包
    
   client.print(F("<!DOCTYPE html>\r\n<html xmlns='http://www.w3.org/1999/xhtml'>\r\n"));
    
   client.print(F("<head>\r\n<meta charset='utf-8'/>\r\n<title>WiFi智能控制</title>\r\n"));
    
   client.print(F("<style type='text/css'>.state{text-align:center;font-size:10px;}"));
    
   client.print(F(".on{text-align:center;font-size:20px;alink='#1a9e5f'}.off{text-align:center;font-size:20px;alink='#da4f43'}"));
    
   client.print(F("</style><body><div class='state'>灯状态:"));
    
   client.print((angle>ANGLE_NONE) ? F("关</div>") : F("开</div>"));
    
   client.print(F("<br><br><div class='on'><a href='http://"));//<br>换行
    
   client.print(WiFi.localIP());
    
   client.print(F("/gpio/0'>电脑开</a></div><br><br><div class='off'><a href='http://"));
    
   client.print(WiFi.localIP());
    
   client.print(F("/gpio/1'>电扇摇头</a></div><br><br><div class='off'><a href='http://"));
    
   client.print(WiFi.localIP());
    
   client.print(F("/gpio/2'>电扇开机</a></div><br><br><div class='off'><a href='http://"));
    
   client.print(WiFi.localIP());
    
   client.print(F("/gpio/3'>电扇定时</a></div><br><br><div class='off'><a href='http://"));
    
   client.print(WiFi.localIP());
    
   client.print(F("/gpio/4'>电扇关机</a></div><br><br><div class='off'><a href='http://"));
    
   client.print(WiFi.localIP());
    
   client.print(F("/gpio/5'>电扇风类</a></div></body></html>"));
    
  
    
   // 客户端实际上将被“刷新”,然后断开连接
    
   // 当函数返回并且“客户端”对象被销毁时
    
   // 刷新=确保书面数据被服务端接收
    
   Serial.println(F("客户端已挂起!"));
    
 }
    
    
    
    

注意:1、程序中的遥控代码来自于esp8266的红外接收模块,详情见另外一篇文章。app设计见另一篇文章。

2、程序下载进芯片之后灯带其连接上家里的wifi,就可以去路由器界面查看其ip地址,然后直接访问其ip地址,就会出现控制页面,点击相应按钮,把红外发射器对准要控制的电器,即可控制。

3、我把红外发射器的数据线接在了D14引脚。

全部评论 (0)

还没有任何评论哟~