前几天弄了一个ESP8266-01S驱动DHT11的温湿度检测系统,但是DHT11误差太大了,精度也只到个位数。环境中实际湿度是70%,它居然测出来30%-50%,还时不时漂一下。我课程答辩的时候被这玩意儿狠狠坑了一把,于是买了一个精度较高的SHT40,据说是工业级的。

在网上找不到用ESP8266-01S的驱动SHT40的相关代码,倒是有很多ESP8266-12F(NodeMCU)和ESP32的。不过我还要用网页显示数据,于是直接拿之前的代码照着官方给的例程改改,效果不错。

效果图


接线

下载程序的时候像我上一篇文章所说的那样接线
下面给出的是程序运行的时候接线,下载完程序之后把GPIO0改成接SHT40的SDA蛤,ESP8266-01S引脚太少了所以勉为其难地复用一下

SHT40ESP8266
VCC3V3
GNDGND
SDAGPIO0
SCLGPIO2

代码

#ifdef ESP32
  #include <WiFi.h>
  #include <ESPAsyncWebServer.h>
  #include <LittleFS.h>
#else
  #include <Arduino.h>
  #include <ESP8266WiFi.h>
  #include <Hash.h>
  #include <ESPAsyncTCP.h>
  #include <ESPAsyncWebServer.h>
  #include <LittleFS.h>
  #include <FS.h>
#endif
#include <Wire.h>
#include <SensirionI2cSht4x.h>

#ifdef NO_ERROR
#undef NO_ERROR
#endif
#define NO_ERROR 0

SensirionI2cSht4x sensor;

static char errorMessage[64];
static int16_t error;

// Replace with your network credentials
const char* ssid = "TP-LINK_302";
const char* password = "302302302";

float aTemperature = 0.0;
float aHumidity = 0.0;

// Create AsyncWebServer object on port 80
AsyncWebServer server(80);

String readSHT40Temperature() {
  // Read temperature as Celsius (the default)

    delay(20);
    error = sensor.measureLowestPrecision(aTemperature, aHumidity);
    if (error != NO_ERROR) {
        Serial.print("Error trying to execute measureLowestPrecision(): ");
        errorToString(error, errorMessage, sizeof errorMessage);
        Serial.println(errorMessage);
        return "";
    }
    else
    {
        Serial.print("aTemperature: ");
        Serial.print(aTemperature);
        Serial.print("\t\n");
        return String(aTemperature);
    }
}

String readSHT40Humidity() {

    delay(20);
    error = sensor.measureLowestPrecision(aTemperature, aHumidity);
    if (error != NO_ERROR) {
        Serial.print("Error trying to execute measureLowestPrecision(): ");
        errorToString(error, errorMessage, sizeof errorMessage);
        Serial.println(errorMessage);
        return "";
    }
    else
    {
        Serial.print("aHumidity: ");
        Serial.print(aHumidity);
        Serial.print("\t\n");
        return String(aHumidity);
    }
}

void setup(){
  // Serial port for debugging purposes
  Serial.begin(115200);

  while (!Serial) {
        delay(100);
    }
  Wire.begin(0,2);
  sensor.begin(Wire, SHT40_I2C_ADDR_44);

  sensor.softReset();

  delay(10);
  uint32_t serialNumber = 0;
  error = sensor.serialNumber(serialNumber);
  if (error != NO_ERROR) {
        Serial.print("Error trying to execute serialNumber(): ");
        errorToString(error, errorMessage, sizeof errorMessage);
        Serial.println(errorMessage);
        return;
    }
  Serial.print("serialNumber: ");
  Serial.print(serialNumber);
  Serial.println();

  // Initialize LittleFS
  if(!LittleFS.begin()){
    Serial.println("An Error has occurred while mounting LittleFS");
        return;
  }

  // Connect to Wi-Fi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi..");
  }

  // Print ESP32 Local IP Address
  Serial.println(WiFi.localIP());

  // Route for root / web page
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(LittleFS, "/index.html");
  });
  server.on("/temperature", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", readSHT40Temperature().c_str());
  });
  server.on("/humidity", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", readSHT40Humidity().c_str());
  });

  // Start server
  server.begin();
}
 
void loop()
{
  
}

如果你也需要在网页上显示请参照上一篇文章,不需要的话可以把与网页相关的代码删掉。

成功连接wifi到第一次读取到数据之间时间比较漫长,请耐心等待。