基于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引脚。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值