16浏览
查看: 16|回复: 0

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

[复制链接]
       要实现智能家居的HomeAssistant的数据传输,无线wifi是必不可少的,这也是ESP32系列的最突出的特点,接下来我们就测试一下2.4G Wifi的连接能力,ESP的相关例程已经很多,我们用如下测试一下:
  1. #include <WiFi.h>
  2. int led = 15;
  3. char ssid[] = "XXX";        
  4. char pass[] = "XXX";
  5. void setup() {
  6.   // put your setup code here, to run once:
  7.   Serial.begin(115200);
  8.   while (!Serial) {
  9.     ; // wait for serial port to connect. Needed for native USB port only
  10.   }
  11.   
  12.   pinMode(led,OUTPUT);
  13.   digitalWrite(led,HIGH);
  14.   WiFi.mode(WIFI_STA);  // 设置为STA模式
  15.   Serial.println("connect to WPA SSID: ");
  16.   Serial.println(ssid);
  17.   WiFi.begin(ssid, pass);
  18.   while (WiFi.status() != WL_CONNECTED) {
  19.     delay(500);
  20.     Serial.println("..........");
  21.   }
  22.   Serial.println("");
  23.   Serial.println("WiFi connected");
  24.   Serial.println("IP address: ");
  25.   Serial.println(WiFi.localIP());
  26.   
  27.   // Get WiFi channel and band
  28.   uint8_t channel = WiFi.channel();
  29.   Serial.print("Channel: ");
  30.   Serial.println(channel);
  31.   if (channel <= 14) {
  32.     Serial.println("Band: 2.4GHz");
  33.   } else {
  34.     Serial.println("Band: 5GHz");
  35.   }
  36. }
  37. void loop() {
  38.   // put your main code here, to run repeatedly:
  39.   delay(5000);
  40. }
复制代码
      wifi连接失败了:

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

       是不识别吗?不是的,出现这个原因的主要问题是连接的wifi名称设置错误了,我这里是输入错误名称中的一个瞎画线导致的,改了之后就连接成功了:
【FireBeetle 2 ESP32-C5】无线wifi功能测试及基于mqtt的HA数...图2

       在管理器也能看到多了一个新的ESP32的设备:
【FireBeetle 2 ESP32-C5】无线wifi功能测试及基于mqtt的HA数...图3

       这款C5芯片支持5G连接,这里不需要我们过多的配置,直接连接5G网络就可以,我们尝试wifi 5G链接试一下:
【FireBeetle 2 ESP32-C5】无线wifi功能测试及基于mqtt的HA数...图4

       这个时候在路由器管理界面中可以看到ESP的5G接入:
【FireBeetle 2 ESP32-C5】无线wifi功能测试及基于mqtt的HA数...图5

       以上是我们对STA模式的功能测试,也就是ESP作为设备连接wifi的能力,目前来看至少对于双频段都是支持的。到这里我们完成了最终目标最基础的两个功能,下面我们将他们串联起来,并通过mqtt把数据送到HA。
       这里我们使用树莓派搭载的HAOS作为数据接收方,并通过在HA系统中注册设备和实体作为展示,我们创建传感器实体:
  1.     - unique_id: Home_SHT40Tem
  2.       name: "SHT40Tem"
  3.       state_topic: "HAOS/sensor/sensorSHT40/state"
  4.       unit_of_measurement: "°C"
  5.       value_template: "{{ value_json.SHT40Tem}}"
  6.     - unique_id: Home_SHT40Hum
  7.       name: "SHT40Hum"
  8.       state_topic: "HAOS/sensor/sensorSHT40/state"
  9.       unit_of_measurement: "%"
  10.       value_template: "{{ value_json.SHT40Hum}}"
复制代码
      然后就是将wifi和传感器数据采集在加入mqtt的命令生成,就完成我们的智能设备的数据上传了:
  1. #include <WiFi.h>
  2. #include <ArduinoMqttClient.h>
  3. #include <WiFiClient.h>
  4. #include <Arduino_JSON.h>
  5. #include "Adafruit_SHT4x.h"
  6. int led = 15;
  7. Adafruit_SHT4x sht4;
  8. char ssid[] = "XXX";        
  9. char pass[] = "XXX";
  10. const char broker[] = "192.168.1.188";
  11. int        port     = 1883;
  12. const char state_topic1[]  = "HAOS/sensor/sensorSHT40/state";
  13. WiFiClient espClient;
  14. MqttClient mqttClient(espClient);
  15. JSONVar dataObj;
  16. const long interval = 1000;
  17. unsigned long previousMillis = 0;
  18. void setup() {
  19.   // put your setup code here, to run once:
  20.   Serial.begin(115200);
  21.   while (!Serial) {
  22.     ; // wait for serial port to connect. Needed for native USB port only
  23.   }
  24.   
  25.   pinMode(led,OUTPUT);
  26.   digitalWrite(led,HIGH);
  27.   Wire.begin(9, 10); // GPIO9 为 SDA,GPIO10 为 SCL
  28.   Serial.println("I2C initialized");
  29.   if (! sht4.begin(&Wire)) {
  30.     Serial.println(F("SHT40 sensor not found!"));
  31.     while (1) ;
  32.   }
  33.    else
  34.   {
  35.     Serial.print(F("SHT40 detected!\t"));
  36.     Serial.print(F("Serial number:\t"));
  37.     Serial.println(sht4.readSerial(), HEX);   
  38.   }
  39.   sht4.setPrecision(SHT4X_HIGH_PRECISION);
  40.   switch (sht4.getPrecision()) {
  41.      case SHT4X_HIGH_PRECISION:
  42.        Serial.println(F("SHT40 set to High precision"));
  43.        break;
  44.      case SHT4X_MED_PRECISION:
  45.        Serial.println(F("SHT40 set to Medium precision"));
  46.        break;
  47.      case SHT4X_LOW_PRECISION:
  48.        Serial.println(F("SHT40 set to Low precision"));
  49.        break;
  50.   }
  51. // 6 different heater settings
  52.   sht4.setHeater(SHT4X_NO_HEATER);
  53.   switch (sht4.getHeater()) {
  54.      case SHT4X_NO_HEATER:
  55.        Serial.println(F("SHT40 Heater turned OFF"));
  56.        break;
  57.      case SHT4X_HIGH_HEATER_1S:
  58.        Serial.println(F("SHT40 Heater: High heat for 1 second"));
  59.        break;
  60.      case SHT4X_HIGH_HEATER_100MS:
  61.        Serial.println(F("SHT40 Heater: High heat for 0.1 second"));
  62.        break;
  63.      case SHT4X_MED_HEATER_1S:
  64.        Serial.println(F("SHT40 Heater: Medium heat for 1 second"));
  65.        break;
  66.      case SHT4X_MED_HEATER_100MS:
  67.        Serial.println(F("SHT40 Heater: Medium heat for 0.1 second"));
  68.        break;
  69.      case SHT4X_LOW_HEATER_1S:
  70.        Serial.println(F("SHT40 Heater: Low heat for 1 second"));
  71.        break;
  72.      case SHT4X_LOW_HEATER_100MS:
  73.        Serial.println(F("SHT40 Heater: Low heat for 0.1 second"));
  74.        break;
  75.   }  
  76.   WiFi.mode(WIFI_STA);  // 设置为STA模式
  77.   Serial.println("connect to WPA SSID: ");
  78.   Serial.println(ssid);
  79.   WiFi.begin(ssid, pass);
  80.   while (WiFi.status() != WL_CONNECTED) {
  81.     delay(500);
  82.     Serial.println("..........");
  83.   }
  84.   Serial.println("");
  85.   Serial.println("WiFi connected");
  86.   Serial.println("IP address: ");
  87.   Serial.println(WiFi.localIP());
  88.   
  89.   // Get WiFi channel and band
  90.   uint8_t channel = WiFi.channel();
  91.   Serial.print("Channel: ");
  92.   Serial.println(channel);
  93.   if (channel <= 14) {
  94.     Serial.println("Band: 2.4GHz");
  95.   } else {
  96.     Serial.println("Band: 5GHz");
  97.   }
  98.   mqttClient.setId("clientId");
  99.   mqttClient.setUsernamePassword("admin", "admin");
  100.   Serial.print("connect to the MQTT broker: ");
  101.   Serial.println(broker);
  102.   if (!mqttClient.connect(broker, port)) {
  103.     Serial.print("MQTT connection failed! Error code = ");
  104.     Serial.println(mqttClient.connectError());
  105.     while (1);
  106.   }
  107.   Serial.println("connected to the MQTT succeed!");
  108.   Serial.println();
  109. }
  110. void loop() {
  111.   // put your main code here, to run repeatedly:
  112.   sensors_event_t humidity, temp;
  113.   sht4.getEvent(&humidity, &temp);// populate temp and humidity objects with fresh data
  114.   
  115.   float tem = temp.temperature;
  116.   Serial.println("Temp *C = " + String(tem));
  117.   float hum = humidity.relative_humidity;
  118.   Serial.println("Hum. % = " + String(hum));
  119.   dataObj["SHT40Hum"] = hum;
  120.   dataObj["SHT40Tem"] = tem;
  121.   String jsonString1 = JSON.stringify(dataObj);
  122.   mqttClient.beginMessage(state_topic1);
  123.   mqttClient.print(jsonString1);
  124.   mqttClient.endMessage();
  125.   delay(5000);
  126. }
复制代码
      注意对应的库需要下载安装一下,串口打印如下:
【FireBeetle 2 ESP32-C5】无线wifi功能测试及基于mqtt的HA数...图6

       HA管理界面可以看到数据上传收到了:
【FireBeetle 2 ESP32-C5】无线wifi功能测试及基于mqtt的HA数...图7

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











您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail