shengjz0303 发表于 2025-10-18 18:31:21

【FireBeetle 2 ESP32-C5】无线wifi功能测试及基于mqtt的HA数...

       要实现智能家居的HomeAssistant的数据传输,无线wifi是必不可少的,这也是ESP32系列的最突出的特点,接下来我们就测试一下2.4G Wifi的连接能力,ESP的相关例程已经很多,我们用如下测试一下:
#include <WiFi.h>

int led = 15;

char ssid[] = "XXX";      
char pass[] = "XXX";

void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
}

pinMode(led,OUTPUT);
digitalWrite(led,HIGH);

WiFi.mode(WIFI_STA);// 设置为STA模式

Serial.println("connect to WPA SSID: ");
Serial.println(ssid);

WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.println("..........");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());

// Get WiFi channel and band
uint8_t channel = WiFi.channel();
Serial.print("Channel: ");
Serial.println(channel);
if (channel <= 14) {
    Serial.println("Band: 2.4GHz");
} else {
    Serial.println("Band: 5GHz");
}

}

void loop() {
// put your main code here, to run repeatedly:
delay(5000);
}
       wifi连接失败了:


       是不识别吗?不是的,出现这个原因的主要问题是连接的wifi名称设置错误了,我这里是输入错误名称中的一个瞎画线导致的,改了之后就连接成功了:

       在管理器也能看到多了一个新的ESP32的设备:

       这款C5芯片支持5G连接,这里不需要我们过多的配置,直接连接5G网络就可以,我们尝试wifi 5G链接试一下:

       这个时候在路由器管理界面中可以看到ESP的5G接入:

       以上是我们对STA模式的功能测试,也就是ESP作为设备连接wifi的能力,目前来看至少对于双频段都是支持的。到这里我们完成了最终目标最基础的两个功能,下面我们将他们串联起来,并通过mqtt把数据送到HA。
       这里我们使用树莓派搭载的HAOS作为数据接收方,并通过在HA系统中注册设备和实体作为展示,我们创建传感器实体:
    - unique_id: Home_SHT40Tem
      name: "SHT40Tem"
      state_topic: "HAOS/sensor/sensorSHT40/state"
      unit_of_measurement: "°C"
      value_template: "{{ value_json.SHT40Tem}}"

    - unique_id: Home_SHT40Hum
      name: "SHT40Hum"
      state_topic: "HAOS/sensor/sensorSHT40/state"
      unit_of_measurement: "%"
      value_template: "{{ value_json.SHT40Hum}}"       然后就是将wifi和传感器数据采集在加入mqtt的命令生成,就完成我们的智能设备的数据上传了:
#include <WiFi.h>
#include <ArduinoMqttClient.h>
#include <WiFiClient.h>
#include <Arduino_JSON.h>
#include "Adafruit_SHT4x.h"

int led = 15;
Adafruit_SHT4x sht4;


char ssid[] = "XXX";      
char pass[] = "XXX";

const char broker[] = "192.168.1.188";
int      port   = 1883;
const char state_topic1[]= "HAOS/sensor/sensorSHT40/state";

WiFiClient espClient;
MqttClient mqttClient(espClient);
JSONVar dataObj;

const long interval = 1000;
unsigned long previousMillis = 0;

void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
}

pinMode(led,OUTPUT);
digitalWrite(led,HIGH);

Wire.begin(9, 10); // GPIO9 为 SDA,GPIO10 为 SCL
Serial.println("I2C initialized");

if (! sht4.begin(&Wire)) {
    Serial.println(F("SHT40 sensor not found!"));
    while (1) ;
}
   else
{
    Serial.print(F("SHT40 detected!\t"));
    Serial.print(F("Serial number:\t"));
    Serial.println(sht4.readSerial(), HEX);   
}

sht4.setPrecision(SHT4X_HIGH_PRECISION);
switch (sht4.getPrecision()) {
   case SHT4X_HIGH_PRECISION:
       Serial.println(F("SHT40 set to High precision"));
       break;
   case SHT4X_MED_PRECISION:
       Serial.println(F("SHT40 set to Medium precision"));
       break;
   case SHT4X_LOW_PRECISION:
       Serial.println(F("SHT40 set to Low precision"));
       break;
}
// 6 different heater settings
sht4.setHeater(SHT4X_NO_HEATER);
switch (sht4.getHeater()) {
   case SHT4X_NO_HEATER:
       Serial.println(F("SHT40 Heater turned OFF"));
       break;
   case SHT4X_HIGH_HEATER_1S:
       Serial.println(F("SHT40 Heater: High heat for 1 second"));
       break;
   case SHT4X_HIGH_HEATER_100MS:
       Serial.println(F("SHT40 Heater: High heat for 0.1 second"));
       break;
   case SHT4X_MED_HEATER_1S:
       Serial.println(F("SHT40 Heater: Medium heat for 1 second"));
       break;
   case SHT4X_MED_HEATER_100MS:
       Serial.println(F("SHT40 Heater: Medium heat for 0.1 second"));
       break;
   case SHT4X_LOW_HEATER_1S:
       Serial.println(F("SHT40 Heater: Low heat for 1 second"));
       break;
   case SHT4X_LOW_HEATER_100MS:
       Serial.println(F("SHT40 Heater: Low heat for 0.1 second"));
       break;
}

WiFi.mode(WIFI_STA);// 设置为STA模式

Serial.println("connect to WPA SSID: ");
Serial.println(ssid);

WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.println("..........");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());

// Get WiFi channel and band
uint8_t channel = WiFi.channel();
Serial.print("Channel: ");
Serial.println(channel);
if (channel <= 14) {
    Serial.println("Band: 2.4GHz");
} else {
    Serial.println("Band: 5GHz");
}

mqttClient.setId("clientId");
mqttClient.setUsernamePassword("admin", "admin");
Serial.print("connect to the MQTT broker: ");
Serial.println(broker);

if (!mqttClient.connect(broker, port)) {
    Serial.print("MQTT connection failed! Error code = ");
    Serial.println(mqttClient.connectError());

    while (1);
}

Serial.println("connected to the MQTT succeed!");
Serial.println();


}

void loop() {
// put your main code here, to run repeatedly:

sensors_event_t humidity, temp;
sht4.getEvent(&humidity, &temp);// populate temp and humidity objects with fresh data

float tem = temp.temperature;
Serial.println("Temp *C = " + String(tem));
float hum = humidity.relative_humidity;
Serial.println("Hum. % = " + String(hum));

dataObj["SHT40Hum"] = hum;
dataObj["SHT40Tem"] = tem;
String jsonString1 = JSON.stringify(dataObj);

mqttClient.beginMessage(state_topic1);
mqttClient.print(jsonString1);
mqttClient.endMessage();

delay(5000);
}
       注意对应的库需要下载安装一下,串口打印如下:

       HA管理界面可以看到数据上传收到了:

       到这里就实现了一个可以给智能家居管理系统HA传输数据的终端了,基于ESP特色的wifi实现。











页: [1]
查看完整版本: 【FireBeetle 2 ESP32-C5】无线wifi功能测试及基于mqtt的HA数...