ESP8266-01S驱动SHT40温湿度传感器
前几天弄了一个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() { } 如果你也需要在网页上显示请参照上一篇文章,不需要的话可以把与网页相关的代码删掉。 ...