| 要实现智能家居的HomeAssistant的数据传输,无线wifi是必不可少的,这也是ESP32系列的最突出的特点,接下来我们就测试一下2.4G Wifi的连接能力,ESP的相关例程已经很多,我们用如下测试一下: 
 wifi连接失败了:复制代码#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名称设置错误了,我这里是输入错误名称中的一个瞎画线导致的,改了之后就连接成功了:
 
 在管理器也能看到多了一个新的ESP32的设备:
 
 这款C5芯片支持5G连接,这里不需要我们过多的配置,直接连接5G网络就可以,我们尝试wifi 5G链接试一下:
 
 这个时候在路由器管理界面中可以看到ESP的5G接入:
 
 以上是我们对STA模式的功能测试,也就是ESP作为设备连接wifi的能力,目前来看至少对于双频段都是支持的。到这里我们完成了最终目标最基础的两个功能,下面我们将他们串联起来,并通过mqtt把数据送到HA。
 这里我们使用树莓派搭载的HAOS作为数据接收方,并通过在HA系统中注册设备和实体作为展示,我们创建传感器实体:
 
 然后就是将wifi和传感器数据采集在加入mqtt的命令生成,就完成我们的智能设备的数据上传了:复制代码    - 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}}"
 
 注意对应的库需要下载安装一下,串口打印如下:复制代码#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实现。
 
 
 
 
 
 
 
 
 
 
 
 
 |