参考链接:
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,D4
void 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, D5
void 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和pswd
char 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的IO
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
Text1.print("灯已关闭");
// 初始化blinker
Blinker.begin(auth, ssid, pswd);
Blinker.attachData(dataRead);
Button1.attach(button1_callback);
}
void loop() {
Blinker.run();
}
直接使用blinker给的示例即可,修修改改就可以了~~~
效果图: