参考链接:
https://www.bilibili.com/video/BV1gE411D7xP?p=1
https://www.oschina.net/p/blinker?hmsr=aladdin1e1
0x00 环境搭建:Arduino IDE + ESP8266 + 点灯.blinker
Arduino IDE:
下载:https://www.arduino.cc/en/software
ESP8266 Boards:https://pan.baidu.com/s/17C1USjDVSmCSlMGLUuV-rQ 提取码:a12l
ESP8266:
某宝
点灯.blinker:
应用商店下载
配置及下载blinker Arduino库:https://github.com/blinker-iot/blinker-doc/wiki/%E4%BD%BF%E7%94%A8esp8266&WiFi%E6%8E%A5%E5%85%A5
0x01 ESP开发板引脚
LDE使用D4引脚。



接线:
0x02 WiFi通信
路由器属于AP(Access Point,无线接入点),平板、手机和其他可以无线联网的设备属于STA(Station,站点)。
下面是ESP8266的WiFi模块通信的实现过程,写出来凑点字数
Esp8266有AP和STA两种模式。
STA模式:**
#include <ESP8266WiFi.h> // 加载ESP8266EiFi库const char *STAid = "小守的破手机"; // 要连接的路由器名称const char *STApassword = "*********"; // 要连接的路由器密码int LED = 2; // 设置指示灯GPIO2,D4void setup(){pinMode(LED, OUTPUT); // 设置LED为输出模式digitalWrite(LED, 0); // 设置指示灯的初始状态为熄灭WiFi.mode(WIFI_STA); // 设置Esp8266为STA模式WiFi.begin(STAid, STApassword); // 配置连接信息,开始连接// 运行自定义函数,在未连接到路由器的过程中,闪烁LED的灯,直到连接成功,点亮LED灯gotoWiFi();}void loop(){if(WiFi.status() != WL_CONNECTED){ // 判断连接是否断开,断开则重新连接WiFi.disconnect(); // 清除之前的连接配置信息WiFi.begin(STAid, STApassword); // 配置连接信息,重新连接gotoWiFi(); // 根据LED指示灯判断连接状态}}void gotoWiFi(){// while循环监听连接状态,连接成功前,闪烁LED灯while(WiFi.status() != WL_CONNECTED){ // 如果没有连接上,持续执行,使LED灯闪烁bool is = digitalRead(LED); // is接收当前LED的电平状态digitalWrite(LED, !is); // 设置LED电平状态与之前相反delay(500);}digitalWrite(LED, 1); // 此时连接成功,置LED电平状态为高电平,点亮LED}
AP模式:**
#include <ESP8266WiFi.h>const char *id = "ESP8266"; // AP的SSID,即WiFi名称const char *password = "123456"; // AP的密码int LED = 2; // IO2, D5void setup(){// 开启窗口监视器Serial.begin(115200);Serial.println("");pinMode(LED, OUTPUT);digitalWrite(LED, 0);WiFi.mode(WIFI_AP); // 设置ESP8266为AP模式WiFi.softAP(id, password); // 配置AP信息,并开启AP// 默认IP为192.168.4.1,可以自定义AP的IP段IPAddress softLocal(192,168,1,1); // IP地址,设置IP第四字段IPAddress softGateway(192,168,1,1); // IP网关,设置IP第三字段IPAddress softSubnet(255,255,255,0);// 配置自定义的IP信息WiFi.softAPConfig(softLocal, softGateway, softSubnet);IPAddress myIP = WiFi.softAPIP(); // 用变量myIP接收AP当前的IP地址Serial.println(myIP); // 打印输出myIP的IP地址}void loop(){int gotoAP = WiFi.softAPgetStationNum(); // 获取当前连接到AP的设备数量// 如果没有设备连接到AP,熄灭LED灯,否则点亮LED灯if(gotoAP == 0){ // 连接数为0,说明没有设备连接digitalWrite(LED, 0); // 熄灭LED}else{digitalWrite(LED, 1); // 点亮LED}}
STA模式UDP通信
#include <ESP8266WiFi.h>#include <WiFiUdp.h>const char *STAid = "小守的破手机"; // 要连接的路由器名称const char *STApassword = "*********"; // 要连接的路由器密码// UDP设置项unsigned int listen_Port = 41001; // 监听端口unsigned int sent_Port = 41002; // 发送端口char read_data[512]; // 缓存数据WiFiUDP Udp; // 定义UDP对象int deng = 2;void setup(){Serial.begin(115200);Serial.println();pinMode(deng, OUTPUT);digitalWrite(deng, 0);WiFi.mode(WIFI_STA); // 设置为STA模式WiFi.begin(STAid, STApassword); // 配置连接信息,开始连接// 运行自定义函数,在未连接到路由器的过程中,打印输出...,直到连接成功gotoWiFi();Serial.println("路由器连接成功");Udp.begin(listen_Port);}void loop(){//检测WiFi连接状态if(WiFi.status() != WL_CONNECTED){WiFi.disconnect();WiFi.begin(STAid, STApassword);gotoWiFi();}else{Udp_Handler(Read_Udp());}}void gotoWiFi(){while(WiFi.status() != WL_CONNECTED){delay(500);Serial.print(".");}Serial.println("");}// 接收数据,将数据以字符串形式返回,方便处理String Read_Udp(){String data = "";int packetSize = Udp.parsePacket();if(packetSize){memset(read_data, 0x00, sizeof(read_data));Udp.read(read_data, 511);Udp.flush();for(int i = 0; i < packetSize; i++){data += read_data[i];}Serial.println(data);}return data;}// 分析处理数据void Udp_Handler(String data){if(data != ""){if(data == "打开"){digitalWrite(deng, 1);myPrint("打开", 1);}else if(data == "关闭"){digitalWrite(deng, 0);myPrint("关闭", 1);}}}// 发送数据// 第一个参数,使用string类型作为发送内容// 第二个参数,a为真,指定发送, 对发送方返回数据, a为假,广播发送,群发信息void myPrint(String data, bool a){if(a){Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());}else{Udp.beginPacket("", sent_Port);}Udp.print(data);Udp.endPacket();}
0x03 blinker远程点灯
手机和ESP8266按上面的教程配置好之后,就可以直接实现远程点灯。手机有网就行,ESP8266通过WiFi联网。
代码:**
#define BLINKER_WIFI#include <Blinker.h>#define LED_BUILTIN 2 // IO2, D4// 修改成自己的key、ssid和pswdchar auth[] = "2a09f**5a59a";char ssid[] = "Lif**ver";char pswd[] = "000**000";// 新建组件对象BlinkerButton Button1("btn-abc");BlinkerNumber Number1("num-abc");BlinkerText Text1("tex-ltw");int counter = 0;// 按下按键即会执行该函数void button1_callback(const String & state){BLINKER_LOG("get button state: ", state);digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));if(digitalRead(LED_BUILTIN)){Text1.print("灯已打开");}else{Text1.print("灯已关闭");}}// 如果未绑定的组件被触发,则会执行其中内容void dataRead(const String & data){BLINKER_LOG("Blinker readString: ", data);counter++;Number1.print(counter);}void setup(){// 初始化串口Serial.begin(115200);BLINKER_DEBUG.stream(Serial);BLINKER_DEBUG.debugAll();// 初始化有LED的IOpinMode(LED_BUILTIN, OUTPUT);digitalWrite(LED_BUILTIN, LOW);Text1.print("灯已关闭");// 初始化blinkerBlinker.begin(auth, ssid, pswd);Blinker.attachData(dataRead);Button1.attach(button1_callback);}void loop() {Blinker.run();}
直接使用blinker给的示例即可,修修改改就可以了~~~
效果图:
