ESP8266-ESP-01S

  • 前言
  • 一、预期功能
  • 二、功能逐步实现
    • 1. 端口控制实现
    • 2. WiFi联网
    • 3. 天猫精灵接入(小爱、小度同理)
    • 4. APP界面控件编辑
  • 三、防坑提示
    • 1.管脚编号、管脚名称、GPIO编号及开发板编码关系
    • 2.:微信配网条件
    • 3.:点灯科技APP使用
    • 4.:别忘了添加库
  • 四、完整代码及功能演示
    • 1.完整代码
    • 2.功能演示

前言

最近闲来无事便想做点类似智能家居控制的事情,经过一番了解之后发现利用ESP8266模块处理是一个热门方案,因为本人对于这方面是小白一个,经过一周多的摸索,终于基本上达到了自己的预期,其间也发现这中间对新手还是有很多巨坑的,所以就在这里做一篇相对完整展示的文章,顺带也强迫自己复盘输出,强化下知识。

一、预期功能

因为是小白,发现网上资料又很多也杂,所以基本看了一遍Arduino基础后决定采用需求导向模式实现,思路如下:朴素的功能需求→细化拆分为关键功能模块→每个功能模块的解决方案(其实就类似盖房子啦)

二、功能逐步实现

1. 端口控制实现

任何利用MCU的控制最终都要落地到利用端口实现,因为已经有Relay控制板,所以这个端口要根据板子的设定来确定:

第1种和第3种就不讲了,讲下第二种,因为Relay板子比较简单,所以直接翻开身子一眼就看穿了,(*^\▽^*) →GPIO0:

#define Y 0//定义输出端口GPIO0
void setup()
{Serial.begin(115200);    // 初始化有ESP-01S板子内置的LED及输出端口Y的IOpinMode(LED_BUILTIN, OUTPUT);digitalWrite(LED_BUILTIN, 1);pinMode(Y, OUTPUT);digitalWrite(Y, 1);
}
void loop()
{digitalWrite(LED_BUILTIN, 0);digitalWrite(Y,0); delay(1000);                     digitalWrite(LED_BUILTIN, 1);digitalWrite(Y,1); delay(1000);
}

2. WiFi联网

这里搜了下资料发现常用的基本有5种联网方式,下面也做了一个简单的总结:

不过由于方式太多,篇幅有限,这里就只演示主流的微信配网的方式,其它的可自行另外搜索专题资料:

#include <ESP8266WiFi.h>//WIFI库,配网必需
/* 微信智能配网 */
void smartConfig()
{WiFi.mode(WIFI_STA);//设置STA模式Serial.println("\r\nWait for Smartconfig...");//打印log信息WiFi.beginSmartConfig();//开始SmartConfig,等待手机端发出用户名和密码while(1){Serial.println(".");//指示灯闪烁,提示需要配网digitalWrite(LED_BUILTIN,HIGH);delay(1000);digitalWrite(LED_BUILTIN,LOW);delay(1000);if(WiFi.smartConfigDone())//配网成功,接收到SSID和密码{Serial.println("SmartConfig Success");Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str());Serial.printf("PSW:%s\r\n", WiFi.psk().c_str());WiFi.setAutoConnect(true);  // 设置自动连接,这个语句是最重要的语句。//指示灯快速闪烁5次,提示联网成功for (int i = 0; i < 5; i++){digitalWrite(LED_BUILTIN,LOW);delay(400);digitalWrite(LED_BUILTIN,HIGH);}break;      }delay(1000); // 这个地方一定要加延时,否则极易崩溃重启}
}
void setup()
{//网络连接if (!autoConfig()){Serial.println("Start module");smartConfig();}WiFi.begin(WiFi.SSID().c_str(),WiFi.psk().c_str());
}

代码写完之后只需要关注微信公众号“安信可科技”进行如下操作即可:


输入密码即可

3. 天猫精灵接入(小爱、小度同理)

这里就是用点灯科技的语音接入代码直接套用就好了,不懂的就看官网吧:点灯科技-天猫精灵接入

#define BLINKER_PRINT Serial
#define BLINKER_WIFI
#define BLINKER_ALIGENIE_OUTLET
#include <Blinker.h>char auth[] = "设备秘钥";
char ssid[] = "WiFi SSID";
char pswd[] = "WiFi PSWD";bool oState = false;void aligeniePowerState(const String & state)
{BLINKER_LOG("need set power state: ", state);if (state == BLINKER_CMD_ON) {digitalWrite(LED_BUILTIN, HIGH);BlinkerAliGenie.powerState("on");BlinkerAliGenie.print();oState = true;}else if (state == BLINKER_CMD_OFF) {digitalWrite(LED_BUILTIN, LOW);BlinkerAliGenie.powerState("off");BlinkerAliGenie.print();oState = false;}
}void aligenieQuery(int32_t queryCode)          //天猫精灵语音命令反馈
{BLINKER_LOG("AliGenie Query codes: ", queryCode);switch (queryCode){case BLINKER_CMD_QUERY_ALL_NUMBER :BLINKER_LOG("AliGenie Query All");BlinkerAliGenie.powerState(oState ? "on" : "off");BlinkerAliGenie.print();         //将以上属性发送给天猫精灵break;case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :BLINKER_LOG("AliGenie Query Power State");BlinkerAliGenie.powerState(oState ? "on" : "off");BlinkerAliGenie.print();break;default :BlinkerAliGenie.powerState(oState ? "on" : "off");BlinkerAliGenie.print();break;}
}void dataRead(const String & data)
{BLINKER_LOG("Blinker readString: ", data);Blinker.vibrate();uint32_t BlinkerTime = millis();Blinker.print(BlinkerTime);Blinker.print("millis", BlinkerTime);
}void setup()
{Serial.begin(115200);#if defined(BLINKER_PRINT)BLINKER_DEBUG.stream(BLINKER_PRINT);#endifpinMode(LED_BUILTIN, OUTPUT);digitalWrite(LED_BUILTIN, LOW);Blinker.begin(auth, ssid, pswd);Blinker.attachData(dataRead);BlinkerAliGenie.attachPowerState(aligeniePowerState);BlinkerAliGenie.attachQuery(aligenieQuery);
}void loop()
{Blinker.run();
}

4. APP界面控件编辑

同样的点灯科技代码套入,只需要注意一点就是界面编辑时控件名称要和代码中的一致:

// 新建组件对象
BlinkerButton Button1("btn-on");
// 按下按键即会执行该函数
void button1_callback(const String & state)     //点灯app内控制按键触发
{BLINKER_LOG("get button state:", state);if(state == "on"){Button1.print("on");Button1.color("#00A90C");Button1.text("已打开");
//     Button1.icon("icon_1");digitalWrite(LED_BUILTIN, 0);digitalWrite(X,0);delay(20);                      //回调函数中不能用delay,应为blinker.delayoState = true;                //开关状态保存,主要用于同步给天猫精灵Blinker.vibrate();}else if(state == "off"){Button1.print("off");Button1.color("#808080");Button1.text("已关闭");
//     Button1.icon("icon_2");digitalWrite(LED_BUILTIN, 1);digitalWrite(X,1); delay(20);                      //回调函数中不能用delay,应为blinker.delayoState = false;                //开关状态保存,主要用于接入天猫精灵Blinker.vibrate();}}
// 如果未绑定的组件被触发,则会执行其中内容
void dataRead(const String & data)
{BLINKER_LOG("Blinker readString: ", data);counter++;Number1.print(counter);Blinker.vibrate();uint32_t BlinkerTime = millis();Blinker.print(BlinkerTime);Blinker.print("millis", BlinkerTime);
}

界面如下(显示文本“连接中”可是有秒用的,自己体会吧*^▽^*):

三、防坑提示

1.管脚编号、管脚名称、GPIO编号及开发板编码关系

记得一点就是用程序里凡是要用到引脚的位置都用IO编号对应的数字或者主板编号的字符串就好了,例如:使用GPIO0时,可用如下代码初始化,
pinMode(0, OUTPUT) <==>pinMode(‘D3’, OUTPUT);

下表为他们的对应关系:

2.:微信配网条件

①代码里的秘钥一定是正确的;
②你的手机一定是连接着你想要模块儿连接的WiFi;
③手机和模块都在WiFi范围内;

3.:点灯科技APP使用

①获取秘钥时一定使用《阿里云》,不要使用点灯科技的云,否则不支持天猫精灵;
②利用天猫精灵中添加设备→搜索“点灯科技”→绑定账号→设备同步功能接入天猫精灵

4.:别忘了添加库

代码实现离不开的库:binker、DHT、ESP8266

四、完整代码及功能演示

1.完整代码

#define BLINKER_PRINT Serial
#define BLINKER_WIFI
#define BLINKER_ALIGENIE_OUTLET
#include <Blinker.h>
#include <ESP8266WiFi.h>//WIFI库,配网必需
#include <DHT.h>
#define DHTPIN 2//定义单总线协议传输的数据引脚
#define Y 0//定义输出端口GPIO0
#define DHTTYPE DHT11// DHT 11温湿度计
char auth[] = "*********";    //这里填入你在点灯里面获取的秘钥// 新建组件对象,要和APP组件中的“数据键名”一致
BlinkerButton Button1("btn-on");
BlinkerNumber Number1("num-abc");
int counter = 0;
bool oState = false;//读取DHTXX传感器相关定义和变量
BlinkerNumber HUMI("humi");        //定义湿度数据键名
BlinkerNumber TEMP("temp");        //定义湿度数据键名int count = 0;     //时间计数
bool WIFI_Status = true;   //WIFI状态标志位//配置网络
bool autoConfig()
{WiFi.begin();for (int i = 0; i < 20; i++){int wstatus = WiFi.status();if (wstatus == WL_CONNECTED){Serial.println("AutoConfig Success");Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str());Serial.printf("PSW:%s\r\n", WiFi.psk().c_str());WiFi.printDiag(Serial);return true;break;}else{Serial.print("AutoConfig Waiting......");Serial.println(wstatus);delay(1000);}//指示灯快速闪烁,提示尝试连接网络digitalWrite(LED_BUILTIN,HIGH);delay(200);digitalWrite(LED_BUILTIN,LOW);delay(200);digitalWrite(LED_BUILTIN,HIGH);delay(200);}Serial.println("AutoConfig Faild!" );return false;//WiFi.printDiag(Serial);
}/* 微信智能配网 */
void smartConfig()
{WiFi.mode(WIFI_STA);//设置STA模式Serial.println("\r\nWait for Smartconfig...");//打印log信息WiFi.beginSmartConfig();//开始SmartConfig,等待手机端发出用户名和密码while(1){Serial.println(".");//指示灯闪烁,提示需要配网digitalWrite(LED_BUILTIN,HIGH);delay(1000);digitalWrite(LED_BUILTIN,LOW);delay(1000);if(WiFi.smartConfigDone())//配网成功,接收到SSID和密码{Serial.println("SmartConfig Success");Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str());Serial.printf("PSW:%s\r\n", WiFi.psk().c_str());WiFi.setAutoConnect(true);  // 设置自动连接,这个语句是最重要的语句。//指示灯快速闪烁5次,提示联网成功for (int i = 0; i < 5; i++){digitalWrite(LED_BUILTIN,LOW);delay(400);digitalWrite(LED_BUILTIN,HIGH);}break;      }delay(1000); // 这个地方一定要加延时,否则极易崩溃重启}
}// 按下按键即会执行该函数
void button1_callback(const String & state)     //点灯app内控制按键触发
{BLINKER_LOG("get button state:", state);if(state == "on"){Button1.print("on");Button1.color("#808080");Button1.text("已关闭");
//     Button1.icon("icon_1");digitalWrite(LED_BUILTIN, 0);digitalWrite(Y,0);delay(20);                      //回调函数中不能用delay,应为blinker.delayoState = true;                //开关状态保存,主要用于同步给天猫精灵Blinker.vibrate();}else if(state == "off"){Button1.print("off");Button1.color("#00A90C");Button1.text("已打开");
//     Button1.icon("icon_2");digitalWrite(LED_BUILTIN, 1);digitalWrite(Y,1); delay(20);                      //回调函数中不能用delay,应为blinker.delayoState = false;                //开关状态保存,主要用于接入天猫精灵Blinker.vibrate();}}//温湿度获取
DHT dht(DHTPIN, DHTTYPE);         //生成DHT对象,参数是引脚和DHT的类型int humi_read = 0, temp_read = 0;  //定义整型全局变量 储存传感器读取的温湿度数据// 心跳包函数
void heartbeat()
{//将设备端采集的温湿度数据,通过心跳包同步数据的方式,显示到APP上HUMI.print(humi_read);         //给blinkerapp回传湿度数据TEMP.print(temp_read);         //给blinkerapp回传温度数据
}void dataStorage()
{Blinker.dataStorage("temp", temp_read);Blinker.dataStorage("humi", humi_read);
}void aligeniePowerState(const String & state)
{BLINKER_LOG("need set power state: ", state);if (state == BLINKER_CMD_ON) {digitalWrite(LED_BUILTIN, 0);digitalWrite(Y, 0);BlinkerAliGenie.powerState("on");BlinkerAliGenie.print();oState = true;}else if (state == BLINKER_CMD_OFF) {digitalWrite(LED_BUILTIN, 1);digitalWrite(Y, 1);BlinkerAliGenie.powerState("off");BlinkerAliGenie.print();oState = false;}
}void aligenieQuery(int32_t queryCode)                     //天猫精灵语音命令反馈
{BLINKER_LOG("AliGenie Query codes: ", queryCode);switch (queryCode){case BLINKER_CMD_QUERY_ALL_NUMBER :BLINKER_LOG("AliGenie Query All");BlinkerAliGenie.powerState(oState ? "on" : "off");BlinkerAliGenie.temp(temp_read);BlinkerAliGenie.humi(humi_read);BlinkerAliGenie.print();break;case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :BLINKER_LOG("AliGenie Query Power State");BlinkerAliGenie.powerState(oState ? "on" : "off");BlinkerAliGenie.print();break;case BLINKER_CMD_QUERY_TEMP_NUMBER:BLINKER_LOG("AliGenie Query Temperature");BlinkerAliGenie.temp(temp_read);BlinkerAliGenie.print();                       //将以上属性发送给天猫精灵,使得可以接收到温湿度的数据break;case BLINKER_CMD_QUERY_HUMI_NUMBER:BLINKER_LOG("AliGenie Query Temperature");BlinkerAliGenie.humi(humi_read);BlinkerAliGenie.print();                       //将以上属性发送给天猫精灵,使得可以接收到温湿度的数据break;  default :BlinkerAliGenie.powerState(oState ? "on" : "off");BlinkerAliGenie.print();BlinkerAliGenie.temp(20);BlinkerAliGenie.humi(20);break;}
}// 如果未绑定的组件被触发,则会执行其中内容
void dataRead(const String & data)
{BLINKER_LOG("Blinker readString: ", data);counter++;Number1.print(counter);Blinker.vibrate();uint32_t BlinkerTime = millis();Blinker.print(BlinkerTime);Blinker.print("millis", BlinkerTime);
}void setup()
{Serial.begin(115200);#if defined(BLINKER_PRINT)BLINKER_DEBUG.stream(BLINKER_PRINT);#endif// 初始化有LED及输出端口Y的IOpinMode(LED_BUILTIN, OUTPUT);digitalWrite(LED_BUILTIN, 1);pinMode(Y, OUTPUT);digitalWrite(Y, 1);//网络连接if (!autoConfig()){Serial.println("Start module");smartConfig();}// 初始化blinkerBlinker.begin(auth,WiFi.SSID().c_str(),WiFi.psk().c_str()); //根据配网得到的WIFI信息和设备秘钥,连接到Blinker云Blinker.attachHeartbeat(heartbeat);//将传感器获取的数据传给blinker app上dht.begin();//初始化DHT传感器Blinker.attachData(dataRead);//在回调函数中反馈该控制状态BlinkerAliGenie.attachPowerState(aligeniePowerState);BlinkerAliGenie.attachQuery(aligenieQuery);         //每次呼出天猫精灵,就会调用aligenieQuery()函数Button1.attach(button1_callback);
}void loop()
{Blinker.run();int h = dht.readHumidity();                      //读取DHT11传感器的湿度 并赋值给hint t = dht.readTemperature();                   //读取DHT11传感器的温度 并赋值给tif (isnan(h) || isnan(t))                        //判断是否成功读取到温湿度数据{BLINKER_LOG("Failed to read from DHT sensor!");//读取温湿度失败!}else{//打印BLINKER_LOG("Humidity: : ", h, " %");BLINKER_LOG("Temperature: ", t, " °C");humi_read = h;//将读取到的湿度赋值给全局变量humi_readtemp_read = t;//将读取到的温度赋值给全局变量temp_read}Blinker.delay(1000);
}

欢迎有问题的小伙伴私信哦!!!

2.功能演示

B站:

15块钱实现智能家居语音控制(白送完整代码)

【小白之路-1】详解ESP8266 ESP-01SRealy继电器模块天猫精灵语音控制实现(含微信配网及新手防坑提示)相关推荐

  1. Esp8266进阶之路11 企业者的福音之8266接入阿里智能,点亮一盏LED灯,期待天猫精灵语音控制的不约而至!

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 序号 SDK版本 内容 链接 1 nonos2.0 搭建 ...

  2. 吃透Chisel语言.15.Chisel模块详解(二)——Chisel模块嵌套和ALU实现

    Chisel模块详解(二)--Chisel模块嵌套和ALU实现 稍微复杂点的硬件设计就需要用嵌套的模块层级来构建了,上一篇文章中实现的计数器其实就是个例子,计数器内部嵌套了一个寄存器.一个Mux和一个 ...

  3. python stdout_详解使用python的logging模块在stdout输出的两种方法

    详解使用python的logging模块在stdout输出 前言: 使用python的logging模块时,除了想将日志记录在文件中外,还希望在前台执行python脚本时,可以将日志直接输出到标准输出 ...

  4. 使用ESP8266通过Blinker平台接入天猫精灵控制电视/空调

    目录 `演示视频` 1.准备工作 1.1 `原理` 1.2 `使用的硬件以及硬件连接图` 1.3 `开发环境准备` 2.解码空调红外键值 2.1 `把ESP8266红外接收的实例,上传到NodeMCU ...

  5. php对接AliGenie天猫精灵服务器控制智能硬件esp8266① 在阿里云购买搭建私有云服务器,配置 SSL 证书 ,做好准备工作!

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. php对接AliGenie天猫精灵服务器控制智能硬件esp82 ...

  6. 【入门篇】ESP8266直连智能音箱(天猫精灵)控制智能灯

    本系列博客学习由非官方人员 刘一周 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 本系列博客内容是通过乐鑫ESP8266直连天猫精灵,实现语音控制智能灯 ...

  7. php对接AliGenie天猫精灵服务器控制智能硬件esp8266② 全面认识第三方授权机制 oauth2.0 协议,如何在 php 上搭建 oauth2.0服务端!(附带demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. php对接AliGenie天猫精灵服务器控制智能硬件esp82 ...

  8. php对接AliGenie天猫精灵服务器控制智能硬件esp8266③ 渗入熟悉AliGenie 对接协议,揭开第三方云平台是如何让天猫精灵是发送消息到私有服务器的!

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. php对接AliGenie天猫精灵服务器控制智能硬件esp82 ...

  9. ESP8266固件SDK开发之微信配网(AIRKISS)原理(一)

    一.ESP8266开发可以有两种方式: 1.AT指令编程开发 2.基于SDK编程开发 二.ESP8266配网方式有三种: 1.网页配网 2.APP配网 3.微信配网 AIRKISS 这里,微信配网是最 ...

最新文章

  1. 2019年上半年收集到的人工智能LSTM干货文章
  2. C#中的文本乱码问题
  3. 【随】WCF传输大数据的设置
  4. Navsoso引领HUD抬头导航潮流
  5. Atitit Atitit.软件兼容性原理----------API兼容 Qa7
  6. 3D打印机改装雕刻机经验分享
  7. 利用蒙特卡洛模拟求积分
  8. java 颜色平滑渐变算法_颜色渐变算法
  9. TCP/IP协议栈扫盲班
  10. 更新appid失败,登录用户不是该小程序的开发者
  11. 电脑技术员联盟 GhostXp Sp3 装机版V5.1
  12. 二十、从句_限定性定语从句
  13. 深度学习基础之优化器(optimizer)的介绍
  14. 电脑出现initialization failure:0x0000000c如何解决
  15. 通过xmail构建本地电子邮件测试环境
  16. android环境监测,基于Wi―Fi和Android家居环境监测与实现
  17. 新内核版本ioctl的变化 _IO, _IOR, _IOW, _IOWR 幻数的理解
  18. cad计算机忘了保存,cad自动保存在哪里
  19. 警告:[SetPropertiesRule]Setting property 'source' to xxx did not find a matching property.的消除
  20. 基于高并发的数据采集器

热门文章

  1. http 521.li 784.html,index.html
  2. 用QT开发软件怎么实现一键换肤
  3. 【附源码】Python计算机毕业设计纳雍县梦金园珠宝店管理系统
  4. Taro React组件开发(2) —— RuiEditor 富文本编辑器【兼容H5和微信小程序】
  5. mysql语句创建临时表并存入数据_mysql实例:在存储过程中创建临时表并储存数据...
  6. MRcroGL使用笔记1自定义颜色和图的左右翻转
  7. 幸福列车 [HDU - 1434 ]
  8. Java 将知乎问题下所有的回答保存到本地
  9. 修改maven本地仓库
  10. python通达信接口_GitHub - QUANTAXIS/pytdx: Python通达信数据接口