要实现智能家居的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实现。
|