最近和同事们学习物联网控制。
一个原来只会写软件的程序员突然接触硬件,碰了很多的壁。于是,我就萌生了把这个过程写成详细的学习过程的想法,方便有兴趣的同学查阅。
本学习过程由易到难,分为下面几篇文章:
一、准备硬件

这篇文章介绍如何在线点亮esp8266 12F的内置灯(下一个教程再介绍如何远程控制点亮家里220V的灯),所以首先要准备一个:ESP8266-12F,如下图所示:
这样的硬件网上一大堆,如下图。基本上就是十几块钱一个。
大家如果在购买前有困惑的话,可以把链接发给我,看看是否适合。
之所以首选ESP8266-12F,是因为它自带了WIFI功能,学习成本足够低,能够满足我们学习物联网的基本要求,可以制作很多有趣的产品。
二、安装代码编译、上传工具
这里选择Arduino IDE,下载地址:www.arduino.cc/en/software
安装过程这里大家自行操作,没有什么特殊之处。
三、安装ESP8266驱动和MQTT客户端连接库
由于访问GitHub障碍的问题,正常情况下在arduino IDE开发工具中安装ESP8266驱动非常难成功,我这里准备了一键安装包,可以一键安装ESP8266驱动和MQTT客户端库。
请先到 bmob-cdn-31082.bmobpay.com/iot/esp8266… 这里下载安装文件。
解压缩,然后双击一键安装ESP8266驱动和MQTT库.bat文件,启动安装。
注意,安装过程需要关闭arduino ide开发工具。
安装完成之后,再启动arduino ide开发工具,选择菜单工具 -> 开发板 -> esp8266,选择适合你的开发板驱动,如下图所示:
我们把esp8266-12F开发板插到电脑的USB口上,这时候,再选择这个开发板对应的COM口(不同的电脑不一样),如下图所示,我们就可以把代码烧录到这个开发板中了。
四、获取Bmob后端云MQTT服务的信息
打开 www.bmobapp.com ,注册,创建应用,然后就可以获取到属于你自己应用的MQTT服务的信息(MQTT服务器地址、端口、对应的主题、用户名和密码),如下图所示:
需要注意的是,Bmob后端云的IOT云为了方便开发者开发真正的产品,而不仅仅是一个娱乐的玩具,主题的名称分割为三部分:第一部分目前是固定的字符串device;第二部分是产品名称,由开发者自由定义,本案例中,我们设定为LINE;第三部分是客户端id,用来标识设备信息,通常用网卡地址。
五、编写代码(直接拷贝)
在arduino ide中,写入下面的代码,记得根据你的实际情况,修改wifi的名称、密码、Bmob云的APPID(对应上图中的用户名)、APPPASSWORD(对应上图中的密码):
/*
* 网址:https://www.bmobapp.com
* wechat:18102215493
*/
// 加载WIFI头文件
#include <ESP8266WiFi.h>
// 加载MQTT库文件
#include <PubSubClient.h>
// 你的WIFI名称,需要修改
const char* WIFI_SSID = "kelike";
// 你的WIFI密码,需要修改
const char* WIFI_PASSWORD = "kelike888";
// Bmob云的物联网地址
const char* MQTT_SERVER = "broker.codenow.cn";
// Bmob云的物联网端口
const int MQTT_PORT = 1883;
// 灯光引脚
const int LED = 2;
// 用户名,到Bmob云->创建的应用-> IOT -> 连接信息 中获取
#define APPID "603b85d874d1b5ea"
// 密码,到Bmob云->创建的应用-> IOT -> 连接信息 中获取
#define APPPASSWORD "19a66167a0eadaca"
// 你自己定义的设备类型,方便记忆就好,这里的LINE表示灯光的意思
#define TYPE "LINE"
WiFiClient espClient;
PubSubClient client(espClient);
// 打开灯泡
void turnOnLed() {
Serial.println("打开灯光");
digitalWrite(LED, LOW);
}
// 关闭灯泡
void turnOffLed() {
Serial.println("关闭灯光");
digitalWrite(LED, HIGH);
}
// 配置esp8266的WIFI账号和密码
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(WIFI_SSID);
// 设置WIFI的账号和密码
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
// 检测WIFI是否联通
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi已连接");
}
// MQTT服务的回调
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print(topic);
Serial.print(" 主题收到消息");
String message = "";
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
Serial.print(message);
Serial.println();
if (message == "on") {
//如果接收到on字符串,调用开灯方法
turnOnLed();//开灯函数
} else if (message == "off") {
//如果接收到off字符串,调用关灯方法
turnOffLed();
}
message = "";
}
void reconnect() {
while (!client.connected()) {
Serial.print("正在尝试MQTT连接...");
String client_id = "esp8266client";
client_id += String(WiFi.macAddress());
if (client.connect(client_id.c_str(), APPID, APPPASSWORD)) {
Serial.println("正常连接");
//这是你的主题名称
String topic = "devices/" + String(TYPE) + "/" + String(APPID) + "/" + client_id;
client.subscribe(topic.c_str());
} else {
Serial.print("连接异常,rc=");
Serial.print(client.state());
Serial.println(" 5秒后重试");
// 5秒重试
delay(5000);
}
}
}
void setup() {
pinMode(LED, OUTPUT);
// 设置波特率
Serial.begin(115200);
// 配置WIFI并连接上网
setup_wifi();
// 连接MQTT服务
client.setServer(MQTT_SERVER, MQTT_PORT);
// 设置MQTT消息回掉
client.setCallback(callback);
digitalWrite(LED, HIGH);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
}
六、编译和烧录代码
接下来,我们就可以对代码进行编译,如果一切顺利,你会看到下面的界面:
查看串口输出的时候,记得选择波特率位115200(代码中设置的)。
七、远程控制开关灯
我们回到Bmob后端云,会发现开发板已经连接上线了,如下图所示:
找到你的设备,在这条记录上点击详情链接,在参数输入框中输入 on 字符串,再点击“推送消息”按钮,如下图,你会发现你的开发板设备的内置灯亮了。如果你输入 off 字符串再推送消息,内置灯瞬间又灭了。
八、附件
如果大家在玩的过程中遇到问题,可以联系本人获取安装包、源码或者硬件的购买地址,欢迎加V一起玩转物联网开发。