279|0

46

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【Follow me第二季第2期】+ UNO R4 WIFI传感器上传HA [复制链接]

 
  1. 安装PubSubClient

 

  1. 设备自动注册参考
  2. homeassist MQTT Discovery设备自发现参考。
  3. 用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); // 发布信息,第一个参数是主题

  }
}

 

点赞 关注
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表