【Joytag 学ESP8266】通过MQTT 控制ESP8266 LED

原文信息

标题:【Joytag 学ESP8266】通过MQTT 控制ESP8266 LED
连接:http://forum.godpub.com/thread-124-1-1.html
备注:狗趴论坛首发,转载请注明出处。

**简介

**前边一系列文章中,我们在香蕉派M3上装mosquitto, mosquitto-clients,并介绍了如何使用。
我们还介绍了如何使用Arduino IDE开发ESP8266,以下为电梯直达:
【Joytag 香蕉派】在香蕉派M3上安装和使用Mosquitto
【Joytag 香蕉派】Mosquitto, mosquitto-clients 初接触
【Joytag 学ESP8266】使用Arduino IDE开发ESP8266
这个例子中,我们使用Arduino MQTT client for ESP8266,配合服务器端,以及mosquitto-clients工具,来实现远程控制“开发快”(小E)上的LED灯。

Arduino Client for MQTT

本例中,我们使用的是Arduino Client for MQTT,
github地址:https://github.com/knolleary/pubsubclient
官网地址:http://pubsubclient.knolleary.net/index.html
撰写本文时,最新版本是2.6.0

可以使用github下载安装,或者使用Arduino IDE的Library Manager来安装和管理。

Arduino 代码

代码中隐去了WIFI设置信息,以及MQTT Broker信息。
读者可以根据自己的情况设置。
文中只点亮和关闭红色LED,读者可以自己完善来实现更多功能。
[list=1]
*]#include <ESP8266WiFi.h>
*]#include <PubSubClient.h>
*]
]const char ssid = “xxxx”;
]const char password = “xxxxxxx”;
]const char mqtt_server = “x.x.x.x”;
*]
*]WiFiClient espClient;
*]PubSubClient client(espClient);
*]
*]#define PIN_RED 12
*]#define PIN_GREEN 15
*]#define PIN_BLUE 14
*]
*]void setup_wifi() {
*] delay(10);
*]
*] Serial.println();
*] Serial.print(“Connecting to “);
*] Serial.println(ssid);
*]
*] WiFi.begin(ssid, password);
*] while (WiFi.status() != WL_CONNECTED) {
*] delay(500);
*] Serial.print(”.”);
*] }
*]
*] Serial.println("");
*] Serial.println(“WiFi connected”);
*] Serial.println("IP address: ");
*] Serial.println(WiFi.localIP());
*]}
]
]void callback(char topic, byte
payload, unsigned int length) {
*] Serial.print(“Message arrived “);
*] Serial.print(topic);
*] Serial.print(”] “);
*] for (int i = 0; i < length; i++) {
] Serial.print((char)payload);
*] }
*] Serial.println();
*]
*]
*] if(strncmp((const char *)payload, “LEDON”, length)==0){
*] Serial.println(“ON”);
*] digitalWrite(PIN_RED, LOW);
*] }
*] else if(strncmp((const char *)payload, “LEDOFF”, length)==0)
*] digitalWrite(PIN_RED, HIGH);
*] else{
*] //do nothing
*] }
*]}
*]
*]void reconnect() {
*] while (!client.connected()) {
*] Serial.print(“Attempting MQTT connection…”);
*] if (client.connect(“ESP8266Client”)) {
*] Serial.println(“connected”);
*] // Once connected, publish an announcement…
*] client.publish(“JoyTag/MQTT/outTopic”, “Reconnected”);
*] // … and resubscribe
*] client.subscribe(“JoyTag/MQTT/inTopic”);
*] } else {
*] Serial.print(“failed, rc=”);
*] Serial.print(client.state());
*] Serial.println(” try again in 5 seconds”);
*] delay(5000);
*] }
*] }
*]}
*]
*]void setup() {
*] pinMode(PIN_RED, OUTPUT);
*] pinMode(PIN_GREEN, OUTPUT);
*] pinMode(PIN_BLUE, OUTPUT);
*]
*] digitalWrite(PIN_RED, HIGH);
*] digitalWrite(PIN_GREEN, HIGH);
*] digitalWrite(PIN_BLUE, HIGH);
*]
*] Serial.begin(115200);
*] setup_wifi();
*] client.setServer(mqtt_server, 1883);
*] client.setCallback(callback);
*]}
*]
*]void loop() {
*]
*] if (!client.connected()) {
*] reconnect();
*] }
*] client.loop();
*]}
[/list]
复制代码

香蕉派上控制LED

香蕉派上控制LED,非常简单,只需在MQTT Broker的对应主题下发布消息即可。
[list=1]
*]mosquitto_pub -t “JoyTag/MQTT/inTopic” -m LEDON -h x.x.x.x
*] mosquitto_pub -t “JoyTag/MQTT/inTopic” -m LEDOFF -h x.x.x.x
[/list]
复制代码

第一条命令发出后,“开发快”(小E)上的LED灯亮起了红色。
第二条命令发出后,“开发快”(小E)上的LED灯熄灭。
是不是很简单呢?

总结

这个例子中,我们使用Arduino MQTT client for ESP8266,配合服务器端,以及mosquitto-clients工具,来实现远程控制“开发快”(小E)上的LED灯。
谨以本文抛砖引玉,希望大家折腾出更好玩的东西。

后续更多精彩内容,请关注狗趴论坛:http://www.godpub.com*