【Follow me第二季第2期】+ UNO R4 WIFI传感器上传HA
[复制链接]
- 安装PubSubClient
- 设备自动注册参考。
- homeassist MQTT Discovery设备自发现参考。
- 用MQTTX客户端注册设备。
Config No.1:
config topic: homeassistant/sensor/HA/HA-UNO-R4-WIFI-currentTemp/config
payload:
{
"device_class": "temperature",
"unique_id": "HA-UNO-R4-WIFI-currentTemp",
"name": "Temperature",
"icon": "mdi:thermometer",
"state_topic": "homeassistant/sensor/HA-UNO-R4-WIFI/sensorBedroom/state",
"value_template":"{{ value_json.temperature}}",
"unit_of_measurement": "℃",
"device": {
"identifiers": "HA-UNO-R4-WIFI",
"manufacturer": "宏伟大业有限公司",
"model": "HA",
"name": "HA-UNO-R4-WIFI",
"sw_version": "1.0"
}
}
Config No.2:
config topic: homeassistant/sensor/HA/HA-UNO-R4-WIFI-currentHumi/config
payload:
{
"device_class": "humidity",
"unique_id": "HA-UNO-R4-WIFI-currentHumi",
"name": "Humidity",
"icon": "mdi:water-percent",
"state_topic": "homeassistant/sensor/HA-UNO-R4-WIFI/sensorBedroom/state",
"value_template": "{{ value_json.humidity}}",
"unit_of_measurement": "%",
"device": {
"identifiers": "HA-UNO-R4-WIFI",
"manufacturer": "宏伟大业有限公司",
"model": "HA",
"name": "HA-UNO-R4-WIFI",
"sw_version": "1.0"
}
}
Config No.3:
config topic: homeassistant/sensor/HA/HA-UNO-R4-WIFI-currentLumi/config
payload:
{
"unique_id": "HA-UNO-R4-WIFI-currentLumi",
"name": "Luminance",
"icon": "mdi:thermometer",
"state_topic": "homeassistant/sensor/HA-UNO-R4-WIFI/sensorBedroom/state",
"value_template": "{{ value_json.luminance}}",
"unit_of_measurement": "Lux",
"device": {
"identifiers": "HA-UNO-R4-WIFI",
"manufacturer": "宏伟大业有限公司",
"model": "HA",
"name": "HA-UNO-R4-WIFI",
"sw_version": "1.0"
}
}
Config No.4:
config topic: homeassistant/sensor/HA/HA-UNO-R4-WIFI-currentInfra/config
payload:
{
"unique_id": "HA-UNO-R4-WIFI-currentInfra",
"name": "Infrared",
"icon": "mdi:thermometer",
"state_topic": "homeassistant/sensor/HA-UNO-R4-WIFI/sensorBedroom/state",
"value_template": "{{ value_json.infrared}}",
"unit_of_measurement": " ",
"device": {
"identifiers": "HA-UNO-R4-WIFI",
"manufacturer": "宏伟大业有限公司",
"model": "HA",
"name": "HA-UNO-R4-WIFI",
"sw_version": "1.0"
}
}
发布传感器数据:
state topic: homeassistant/sensor/HA-UNO-R4-WIFI/sensorBedroom/state
Payload:
{"temperature": 23.20,"humidity": 43.70,"luminance": 56,"infrared": 100 }
E、uno-r4-wifi编写测试程序,发布传感器数据。
测试代码:
#include "Adafruit_SHT4x.h"
#include "Adafruit_LTR329_LTR303.h"
#include <WiFiS3.h>
#include <PubSubClient.h>
#include <WiFiClient.h>
//#include "arduino_secrets.h"
///////please enter your sensitive data in the Secret tab/arduino_secrets.h
char ssid[] = "xxxx"; // your network SSID (name)
char pass[] = "xxxx"; // your network password (use for WPA, or use as key for WEP)
// Add your MQTT Broker IP address, example:
const char* mqtt_server = "192.168.14.104"; //先测试本机mqtt服务,该地址在windows下通过ipconfig查看,要和esp32连接在同一个网络
//const char* mqtt_server = "YOUR_MQTT_BROKER_IP_ADDRESS";
const char *id = "UNO-R4-WIFI";
const char *user = "test";
const char *passwd = "test2024";
WiFiClient espClient;
PubSubClient client(espClient); // MQTT服务设置了非账号密码不能使用,所有在connect的时候要设置账号密码
long lastMsg = 0;
char msg[50];
int value = 0;
// LED Pin
const int ledPin = 13;
int status = WL_IDLE_STATUS; // the WiFi radio's status
Adafruit_LTR329 ltr = Adafruit_LTR329();
Adafruit_SHT4x sht4 = Adafruit_SHT4x();
#define TJC Serial1
void SendEnd(){
TJC.write(0xff);
TJC.write(0xff);
TJC.write(0xff);
}
unsigned long nowtime,nettime,tjctime;
void Sht40Init(){
Serial.println("Adafruit SHT4x test");
if (! sht4.begin()) {
Serial.println("Couldn't find SHT4x");
while (1) delay(1);
}
Serial.println("Found SHT4x sensor");
Serial.print("Serial number 0x");
Serial.println(sht4.readSerial(), HEX);
// You can have 3 different precisions, higher precision takes longer
sht4.setPrecision(SHT4X_HIGH_PRECISION);
switch (sht4.getPrecision()) {
case SHT4X_HIGH_PRECISION:
Serial.println("High precision");
break;
case SHT4X_MED_PRECISION:
Serial.println("Med precision");
break;
case SHT4X_LOW_PRECISION:
Serial.println("Low precision");
break;
}
// You can have 6 different heater settings
// higher heat and longer times uses more power
// and reads will take longer too!
sht4.setHeater(SHT4X_NO_HEATER);
switch (sht4.getHeater()) {
case SHT4X_NO_HEATER:
Serial.println("No heater");
break;
case SHT4X_HIGH_HEATER_1S:
Serial.println("High heat for 1 second");
break;
case SHT4X_HIGH_HEATER_100MS:
Serial.println("High heat for 0.1 second");
break;
case SHT4X_MED_HEATER_1S:
Serial.println("Medium heat for 1 second");
break;
case SHT4X_MED_HEATER_100MS:
Serial.println("Medium heat for 0.1 second");
break;
case SHT4X_LOW_HEATER_1S:
Serial.println("Low heat for 1 second");
break;
case SHT4X_LOW_HEATER_100MS:
Serial.println("Low heat for 0.1 second");
break;
}
}
void Lrt329Init(){
Serial.println("Adafruit LTR-329 advanced test");
if ( ! ltr.begin() ) {
Serial.println("Couldn't find LTR sensor!");
while (1) delay(10);
}
Serial.println("Found LTR sensor!");
ltr.setGain(LTR3XX_GAIN_2);
Serial.print("Gain : ");
switch (ltr.getGain()) {
case LTR3XX_GAIN_1: Serial.println(1); break;
case LTR3XX_GAIN_2: Serial.println(2); break;
case LTR3XX_GAIN_4: Serial.println(4); break;
case LTR3XX_GAIN_8: Serial.println(8); break;
case LTR3XX_GAIN_48: Serial.println(48); break;
case LTR3XX_GAIN_96: Serial.println(96); break;
}
ltr.setIntegrationTime(LTR3XX_INTEGTIME_100);
Serial.print("Integration Time (ms): ");
switch (ltr.getIntegrationTime()) {
case LTR3XX_INTEGTIME_50: Serial.println(50); break;
case LTR3XX_INTEGTIME_100: Serial.println(100); break;
case LTR3XX_INTEGTIME_150: Serial.println(150); break;
case LTR3XX_INTEGTIME_200: Serial.println(200); break;
case LTR3XX_INTEGTIME_250: Serial.println(250); break;
case LTR3XX_INTEGTIME_300: Serial.println(300); break;
case LTR3XX_INTEGTIME_350: Serial.println(350); break;
case LTR3XX_INTEGTIME_400: Serial.println(400); break;
}
ltr.setMeasurementRate(LTR3XX_MEASRATE_200);
Serial.print("Measurement Rate (ms): ");
switch (ltr.getMeasurementRate()) {
case LTR3XX_MEASRATE_50: Serial.println(50); break;
case LTR3XX_MEASRATE_100: Serial.println(100); break;
case LTR3XX_MEASRATE_200: Serial.println(200); break;
case LTR3XX_MEASRATE_500: Serial.println(500); break;
case LTR3XX_MEASRATE_1000: Serial.println(1000); break;
case LTR3XX_MEASRATE_2000: Serial.println(2000); break;
}
}
void printWifiData() {
// print your board's IP address:
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);
// print your MAC address:
byte mac[6];
WiFi.macAddress(mac);
Serial.print("MAC address: ");
printMacAddress(mac);
}
void printCurrentNet() {
// print the SSID of the network you're attached to:
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
// print the MAC address of the router you're attached to:
byte bssid[6];
WiFi.BSSID(bssid);
Serial.print("BSSID: ");
printMacAddress(bssid);
// print the received signal strength:
long rssi = WiFi.RSSI();
Serial.print("signal strength (RSSI):");
Serial.println(rssi);
// print the encryption type:
byte encryption = WiFi.encryptionType();
Serial.print("Encryption Type:");
Serial.println(encryption, HEX);
Serial.println();
}
void printMacAddress(byte mac[]) {
for (int i = 0; i < 6; i++) {
if (i > 0) {
Serial.print(":");
}
if (mac[i] < 16) {
Serial.print("0");
}
Serial.print(mac[i], HEX);
}
Serial.println();
}
void CheckWifi(){
// check for the WiFi module:
if (WiFi.status() == WL_NO_MODULE) {
Serial.println("Communication with WiFi module failed!");
// don't continue
while (true);
}
String fv = WiFi.firmwareVersion();
if (fv < WIFI_FIRMWARE_LATEST_VERSION) {
Serial.println("Please upgrade the firmware");
}
// attempt to connect to WiFi network:
while (status != WL_CONNECTED) {
Serial.print("Attempting to connect to WPA SSID: ");
Serial.println(ssid);
// Connect to WPA/WPA2 network:
status = WiFi.begin(ssid, pass);
// wait 10 seconds for connection:
delay(10000);
}
// you're connected now, so print out the data:
Serial.print("You're connected to the network");
printCurrentNet();
printWifiData();
}
void callback(char* topic, byte* message, unsigned int length) {
Serial.print("Message arrived on topic: ");
Serial.print(topic);
Serial.print(". Message: ");
String messageTemp;
for (int i = 0; i < length; i++) {
Serial.print((char)message[i]);
messageTemp += (char)message[i];
}
Serial.println();
// Feel free to add more if statements to control more GPIOs with MQTT
// If a message is received on the topic esp32/output, you check if the message is either "on" or "off".
// Changes the output state according to the message
if (String(topic) == "esp32/output") {
Serial.print("Changing output to ");
if(messageTemp == "on"){
Serial.println("on");
digitalWrite(ledPin, HIGH);
}
else if(messageTemp == "off"){
Serial.println("off");
digitalWrite(ledPin, LOW);
}
}
}
/* 重连mqtt服务器 */
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
//MQTT服务设置了非账号密码不能使用,所有在connect的时候要设置账号密码
if (client.connect(id, user, passwd)) {
Serial.println("connected");
// 订阅mqtt主题
client.subscribe("esp32/output");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void setup() {
// put your setup code here, to run once:
//初始化串行通信,设置波特率为9600bps
TJC.begin(115200); //与串口屏通信
Serial.begin(115200);
while (!Serial)
delay(10); // will pause Zero, Leonardo, etc until serial console opens
tjctime = millis();//获取当前已运行的时间
nettime = tjctime;
Sht40Init();
Lrt329Init();
pinMode(ledPin, OUTPUT);
CheckWifi(); //连接WiFi
client.setServer(mqtt_server, 1883);
client.setCallback(callback); // 绑定回调函数
}
int a = 0;
//初始化金银铜牌数量
int gold = 0;
int silver = 0;
int bronze = 0;
// char url[]=
void loop() {
char str[100];
sensors_event_t humidity, temp;
bool valid;
uint16_t visible_plus_ir, infrared;
if (!client.connected()) {
reconnect();
}
client.loop();
nowtime = millis();
if(nowtime >= tjctime + 3000){
tjctime = millis();
char tempString[8];
// Convert the value to a char array
char humString[8];
sht4.getEvent(&humidity, &temp);// populate temp and humidity objects with fresh data
sprintf(str, "temp.val=%d",(int)(temp.temperature*100));
TJC.print(str);
SendEnd();
// Serial.print(str);
sprintf(str, "humd.val=%d",(int)(humidity.relative_humidity*100));
TJC.print(str);
SendEnd();
// Serial.print(str);
// Serial.print("Temperature: "); Serial.print(temp.temperature); Serial.println(" degrees C");
// Serial.print("Humidity: "); Serial.print(humidity.relative_humidity); Serial.println("% rH");
if (ltr.newDataAvailable()) {
valid = ltr.readBothChannels(visible_plus_ir, infrared);
if (valid) {
// Serial.print("CH0 Visible + IR: ");
// Serial.print(visible_plus_ir);
// Serial.print("\t\tCH1 Infrared: ");
// Serial.println(infrared);
sprintf(str, "lumi.val=%d",visible_plus_ir);
TJC.print(str);
SendEnd();
sprintf(str, "infrared.val=%d",infrared);
TJC.print(str);
SendEnd();
}
}
sprintf(str, "gold.val=%d",a);
TJC.print(str);
SendEnd();
sprintf(str, "silver.val=%d",a);
TJC.print(str);
SendEnd();
sprintf(str, "bronze.val=%d",a);
TJC.print(str);
SendEnd();
a++;
//mqtt send sensor {"temperature": 23.20,"humidity": 43.70,"luminance": 56,"infrared": 100 }
dtostrf((float)temp.temperature,2,2,tempString);
Serial.print("Temperature: ");
Serial.println(tempString);
dtostrf((float)humidity.relative_humidity,2,2,humString);
Serial.print("Humidity: ");
Serial.println(humString);
sprintf(str, "{\"temperature\":%s,\"humidity\":%s,\"luminance\":%d,\"infrared\":%d}",tempString,humString,visible_plus_ir,infrared);
Serial.println(str);
client.publish("homeassistant/sensor/HA-UNO-R4-WIFI/sensorBedroom/state", str); // 发布信息,第一个参数是主题
}
}
|