使用Arduino IDE开发ESP8266 pub数据到node-red的MQTT

NodeMCU:MCU是ESP8266上的固件。它是ESP-12具有基于Lua的固件,用于开发基于物联网的应用程序。
ESP8266(NodeMCU):SDA:D2(I2C->数据);SCL:D1(I2C->时钟)

使用Arduino IDE开发ESP8266 pub数据到node-red的MQTT_第1张图片

1.在node-red安装node-red-contrib-aedes,建立mqtt服务器。
使用Arduino IDE开发ESP8266 pub数据到node-red的MQTT_第2张图片
使用Arduino IDE开发ESP8266 pub数据到node-red的MQTT_第3张图片
用MQTTBox工具进行测试是否正确安装好mqtt服务器。

2.在Arduino IDE
2.1.加载NodeMCU开发库
2.1.1在Aduino-IDE中打开文件/首选项/附加开发板管理器网址:http://arduino.esp8266.com/stable/package_esp8266com_index.json
2.1.2转到工具 -> 开发板 ->开发板管理器。搜索 ESP8266,然后单击安装。下载很慢,搜索8266_package_2.6.3.exe离线安装。
2.1.3转到工具 -> 板 -> 节点MCU,选nodeMCU

2.2加载库安装PubSubClient.h
使用Arduino IDE开发ESP8266 pub数据到node-red的MQTT_第4张图片
3.导入红外温度传感器MLX90614库
把WaveShare_MLX90614.h,WaveShare_MLX90614.cpp与ino文件放在同一目录下即可。

#include 
#include 
#include 
#include "WaveShare_MLX90614.h"

#define LED 5 //GPIO 5 D1
//wifi
const char* ssid = "Msy2.4G";
const char* password = ;

// MQTT Broker
const char *mqtt_broker = "192.168.1.116";
const char *topic = "esp8266/temp"; //MQTT协议要求Topic必须是一个以斜杠“/”分隔的字符串,例如:“/home/living-room/temperature”。
const char *mqtt_username = "mqtt";
const char *mqtt_password = ;
const int mqtt_port = 1883;

WiFiClient wifiClient;
PubSubClient  mqttClient(wifiClient);
WaveShare_MLX90614   MLX90614 = WaveShare_MLX90614();

// the setup function runs once when you press reset or power the board
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);  //initialize digital pin LED_BUILTIN as an output.
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);   //设置ESP8266工作模式为无线终端模式=
  MLX90614.begin();  
  
  connectWifi();         //连接到wifi  
  connectMQTTServer();   //连接MQTT服务器
}

// the loop function runs over and over again forever
void loop() {
  Serial.print(" \tObject Temp: "); Serial.print(MLX90614.readObjectTemp()); Serial.println(" C");
  Serial.println();
  
  if (WiFi.status() == WL_CONNECTED) {
    digitalWrite(LED_BUILTIN, LOW);// turn the LED on
  }
    if (mqttClient.connected()) {    // 如果开发板成功连接服务器    
        mqttClient.publish(topic, readTempStr());
        mqttClient.loop();           // 保持客户端心跳
  } else {                           // 如果开发板未能成功连接服务器
     connectMQTTServer();            // 则尝试连接服务器
  }
  delay(3000);                    
}

// ESP8266连接wifi
void connectWifi(){
  WiFi.begin(ssid,password);
  Serial.println();
  Serial.println();
  Serial.print("Wait for WiFi... ");
  
  while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.println("WiFi not Connect..");
      digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
      delay(500);                       // wait for a second
      digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
      delay(500); 
  }
  
  Serial.println("");
  Serial.println("ESP8266 WiFi connected");
  Serial.println("IP address: " + WiFi.localIP().toString());
  delay(500);
}

void connectMQTTServer(){
  mqttClient.setServer(mqtt_broker, mqtt_port);  // 设置MQTT服务器和端口号
  String mqttClient_id = "esp8266-" + WiFi.macAddress();  // 根据ESP8266的MAC地址生成客户端ID(避免与其它ESP8266的客户端ID重名)

  while (!mqttClient.connected()) {
      Serial.printf("The mqttClient %s connects to the public mqtt broker\n", mqttClient_id.c_str());
      if (mqttClient.connect(mqttClient_id.c_str(), mqtt_username, mqtt_password)) {
        Serial.println("");
        Serial.println("Public emqx mqtt broker connected");
      } else {
          Serial.print("failed with state ");
          Serial.print(mqttClient.state());
          delay(2000);
      }
  }  
}

/*chat编程模式实践
使用MQTT协议将MLX90614红外温度传感器读取到的物体温度发布Publish到指定的主题Topic中。
1.MLX90614.readObjectTemp()函数来获取温度值,这个函数的返回值类型是浮点型float,而MQTT库中的publish()函数并不支持直接传递浮点数作为参数,因此需要将其转换为字符串。
2.注意是,由于String对象是动态分配内存的,因此可能会引起一些内存管理问题,对于内存较小的嵌入式系统,使用字符数组来代替String对象。
3.由于sprintf()函数可能会引起缓冲区溢出等问题,因此保证tempStr数组足够大,以容纳转换后的字符串。同时,为避免多次调用readTempStr()函数导致tempStr数组被重复写入,将该数组定义为static类型,从而使其只在程序运行期间分配一次内存
*/
static char tempStr[10];//使用字符数组来代替String对象,char tempStr[10]修改为全局变量或是静态变量static
char* readTempStr() {
  float temp = MLX90614.readObjectTemp();
  sprintf(tempStr, "%.2f", temp);//sprintf()函数将浮点数转换为字符串,并存储到tempStr数组中,返回tempStr数组的指针
  return tempStr;//tempStr是一个全局静态变量,因此在readTempStr()函数外部访问它,从而将温度值传递给mqttClient.publish()函数。
}

编译后下载运行,请注意如打开串口调试工具,务必关闭串口工具在下载固件,不然报错。

在homeassistant的node-red的log(localip:8123/hassio/addon/a0d7b954_nodered/logs)下查到 Dashboard version 3.4.0 started at /endpoint/ui,查看温度数据在localip:1880/endpoint/ui/
使用Arduino IDE开发ESP8266 pub数据到node-red的MQTT_第5张图片

你可能感兴趣的:(服务器)