前几天弄了一个ESP8266-01S驱动DHT11的温湿度检测系统,但是DHT11误差太大了,精度也只到个位数。环境中实际湿度是70%,它居然测出来30%-50%,还时不时漂一下。我课程答辩的时候被这玩意儿狠狠坑了一把,于是买了一个精度较高的SHT40,据说是工业级的。
在网上找不到用ESP8266-01S的驱动SHT40的相关代码,倒是有很多ESP8266-12F(NodeMCU)和ESP32的。不过我还要用网页显示数据,于是直接拿之前的代码照着官方给的例程改改,效果不错。

接线
下载程序的时候像我上一篇文章所说的那样接线
下面给出的是程序运行的时候接线,下载完程序之后把GPIO0改成接SHT40的SDA蛤,ESP8266-01S引脚太少了所以勉为其难地复用一下
| SHT40 | ESP8266 |
|---|---|
| VCC | 3V3 |
| GND | GND |
| SDA | GPIO0 |
| SCL | GPIO2 |
代码
#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到第一次读取到数据之间时间比较漫长,请耐心等待。