物联网是最近几年比较火的一个话题,什么是物联网?
物联网(Internet of Things,简称IoT)是指通过各种信息传感器、射频识别技术、全球定位系统、红外感应器、激光扫描器等各种装置与技术,实时采集任何需要监控、 连接、互动的物体或过程,采集其声、光、热、电、力学、化学、生物、位置等各种需要的信息,通过各类可能的网络接入,实现物与物、物与人的泛在连接,实现对物品和过程的智能化感知、识别和管理。物联网是一个基于互联网、传统电信网等的信息承载体,它让所有能够被独立寻址的普通物理对象形成互联互通的网络。
简单的来说就是通过有线和无线的方式组成一个网络系统,并将所有硬件设备纳入这个网络系统之中,从而达到各个设备之间自由交互信息、控制等目的。
特别说明:通过网络远程控制LED的方式有很多,本文介绍的这种方式是基于blinker的服务器和APP实现的。
1 工作原理
Blinker厂家有自己的一个服务器,我们的设备(esp8266、esp32、手机等)都可以通过网络接入到这个服务器,手机app我们看不到源码不确定是以什么样的方式接入的,我主要讲一下MCU(esp8266、esp32等)这边,MCU是通过WIFI连接到互联网的,然后通过MQTT协议接入到Blinker的服务器,MCU作为客户端,服务器作为服务端。具体MQTT的实现原理这里不多说了,光是MQTT这一个话题都可以写好多文章了,想深入了解的同学可以自行查阅资料。
当MQTT连成功之后,MCU会一直侦听,等待服务器下发数据。这个时候我们可以通过手机app操作,比如点一下开灯,服务器收到这个开灯命令后会通过MQTT发送命令到MCU,MCU接收到数据并解析命令后执行点灯的操作。服务器在这里相当于一个中转站,把手机的操作转发到设备端,实现了手机和设备之间的互动。不过有一点要说明的是,设备和服务器是通过MQTT连接的,而手机app和服务器则不一定是用MQTT,个人觉得用http的可能性更大,但是看不到源码,所以实际上是怎么通讯的就不清楚了,这个也不是很重要,并不影响实际的使用。
2 硬件准备
我这里以ESP8266和ESP32为例讲解,其他MCU方法和原理都是一样的,所以根据自己的MCU选择其中一种即可。
硬件配置如下:
模块 | 型号 | 说明 |
---|---|---|
ESP8266 | ESP-12F | 这是安信可的一款模组,内部主要是用乐鑫的ESP8266EX再加上一个片外FLASH组成,开发板型号是NodeMCU-12F(CH340版本) |
ESP32 | ESP-WROOM-32 | MCU是乐鑫的一款芯片,开发板型号ESP32 DEVKITV1 |
具体的硬件参数和电路原理图这里就不发出来了,不同厂家做的开发板引脚可能会有点差别。
3 软件准备
版本说明:
本文测试时各软件使用的版本如下:
软件 | 版本 | 备注 |
---|---|---|
Arduino IDE | 1.8.16 | Blinker需要配合1.8.x及以上版本的Arduino IDE |
ESP8266 package | 3.0.2 | Blinker需配合使用3.0.0或以上release版本的ESP8266 package |
ESP32 package | 2.0.1 | Blinker需配合使用2.0.0或以上版本的ESP32 package |
Blinker arduino package | 0.3.9 | 当前最新版本,以后可能会有更新 |
Blinker APP | 2.5.2(安卓版) | 当前最新版本,以后可能会有更新 |
3.1 Arduino IDE环境搭建
Arduino开发板库安装
esp8266和esp32开发板环境搭建具体就不说了,不懂的同学可以看下我之前发布的博客。
esp8266开发入门教程(基于Arduino)——环境安装
Blinker库安装
1)下载Blinker Arduino库压缩包
Blinker Arduino库可以在官网下载,也可以在Github或者我的网盘上下载。
Blinker Arduino库官网下载:https://diandeng.tech/dev
Blinker Arduino库Github下载:https://github.com/blinker-iot/blinker-library/archive/master.zip
Blinker Arduino库云盘下载:https://pan.baidu.com/s/1VlyYBs1-pEA-L9fUI-t_dA
提取码:m660
2)安装Blinker库
打开Arduino IDE,点击 项目 -> 加载库 -> 添加.ZIP库,选择下载好的压缩包,等待安装完成即可。
3.2 手机安装Blinker APP
安装包可以在官网下载,也可以在手机的应用商店下载。
Blinker APP官网下载:https://diandeng.tech/dev
4 Blinker APP注册
4.1 注册账号
打开安装好的Blinker APP,注册一个账号并登录。
4.2 新建一个设备
登录账号进入之后,如果没有设备,先点击 “添加设备”
,我们这里选 “独立设备”
。
然后选择接入方式,我们这里选 “网络接入”
。
服务器我们这里选 “点灯科技”
,直接用Blinker的服务器。
然后我们就得到了一个设备密钥(Secret Key),这个密钥要在后面写到我们的应用代码里面的,这里可以先不管,返回设备列表,在设备的详细信息里面也可以看到设备密钥。
打开我们新建的设备,这个设备的控制界面是可以自定义的,按键和窗口这些都可以自己调整,我这里只是为了测试图方便就直接导入一个现成的示例。
在设备的详细信息里面可以修改设备的名称,也可以看到设备密钥,这个密钥在后面写代码的时候要用到。
5 Arduino代码编写
示例代码如下:
提示:设备密钥、WIFI账号和密码要根据自己修改,代码中的定义仅供参考。密钥可以在手机Blinker APP的设备信息里面查看。
注:该代码esp8266和esp32通用
#define BLINKER_WIFI
#include <Blinker.h>
char auth[] = "testkey"; // 设备密钥
char ssid[] = "test"; // WIFI账号
char pswd[] = "12345678"; // WIFI密码
#define LED_PIN 5 // LED引脚
// 新建组件对象
BlinkerButton Button1("btn-abc");
BlinkerNumber Number1("num-abc");
int counter = 0;
// 按下按键即会执行该函数
void button1_callback(const String & state)
{
BLINKER_LOG("get button state: ", state);
digitalWrite(LED_PIN, !digitalRead(LED_PIN)); // 翻转LED灯状态
}
// 如果未绑定的组件被触发,则会执行其中内容
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_PIN, OUTPUT);
digitalWrite(LED_PIN, HIGH);
// 初始化blinker
Blinker.begin(auth, ssid, pswd);
Blinker.attachData(dataRead);
Button1.attach(button1_callback);
}
void loop() {
Blinker.run();
}
注:上面的例子只展示了应用部分,因为很多地方都是直接调用API,所以我们不容易了解到设备和服务器之间到底是怎么实现通讯的,数据的接收和解析是怎样做的。如果要完整理解这个过程可以去看下Blinker的库,上面这个代码用到的API在库里面都能看到函数原形,也能看到里面的数据是怎么处理的。不过这里就不往下讲了,内容比较多,感兴趣的同学自己去看代码吧。
6 运行测试
通过串口打印的log可以看到esp8266的运行情况。
大致的过程是这样的:启动之后先是连接wifi,然后通过HTTP向服务器获取连接MQTT所需的一些账户信息。然后是通过MQTT连接上服务器,至此初始化完成。
如果中途出现什么错误,可以通过查看log查找失败的原因。
打开手机Blinker APP,可以看到这个设备的状态是 “在线”
,在手机APP上点击 “点我开关灯”
按键,可以看到LED灯的状态会翻转,APP和串口也会输出相应的log。
点击 “点我计数”
按键,可以看到APP和串口都会输出相应的log。
至此,整个测试流程就完成了。
上面点灯和按键的功能其实都是自定义的,从APP显示的log或者MCU串口输出的log都可以看到,所谓的点灯命令和按键计数都只是发送了一条json格式的数据。比如这个按键功能,就是发了一条{"num-abc":{"val":1}}数据,当服务器和MCU都把val当成是计数次数的时候,它的含义就是计数,而实际上我们也可以把这个数据改成其他功能或者增添修改更多的命令,只要保证服务器和MCU双方的协议一致即可。
结束语
好了,关于如何基于esp8266实现手机APP控制LED的编程和使用方法就讲到这里,其实这只是其中一种方式,我们还可以通过http或者tcp等方式来实现网络通讯,也不局限于控制LED点灯,我们也可以控制多种灯,或者其他外设。只要数据的传输通了,我们就可以自定义很多命令和功能。
时间关系我这里就讲这么多,后续有时间的话我会考虑再介绍一下其他的方式。
想了解更多Arduino的内容,可以关注一下博主,后续我还会继续分享更多的经验给大家。
还有什么问题的话,欢迎在评论区留言。如果这篇文章能够帮到你,就…你懂得。