首页 > 解决方案 > 我正在编写一个代码来读取 DHT11 值并控制 4 个继电器但温度。传感器每次都向我显示“nan”

问题描述

我正在使用 NodeMCU (ESP8266-12E) 进行温度读数的家庭自动化项目。我正在使用带有 DHT11.h 库的 DHT11 传感器,但我的温度传感器向我显示“nan”而不是任何值。我不知道我在哪里落后。

我的代码如下:

#include "DHT.h" // including the library of DHT11 temperature and humidity sensor

#define DHTTYPE DHT11 // DHT 11

#include <ESP8266WiFi.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"

#define Relay1 D1
#define Relay2 D2
#define Relay3 D3
#define Relay4 D4

#define DHTPIN D0
    DHT dht(DHTPIN, DHTTYPE);

float temp_f;
String webString = "";

unsigned long previousMillis = 0;
const long interval = 2300;

#define WLAN_SSID "internet" // Your SSID
#define WLAN_PASS "*********" // Your password

/************************* Adafruit.io Setup *********************************/

#define AIO_SERVER "io.adafruit.com" //Adafruit Server
#define AIO_SERVERPORT 1883
#define AIO_USERNAME "foo" // Username
#define AIO_KEY "bar" // Auth Key

//WIFI CLIENT
WiFiClient client;

Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);

// Setup a feed called 'photocell' for publishing.
// Notice MQTT paths for AIO follow the form: <username>/feeds/<feedname>
const char TEMP_FEED[] PROGMEM = AIO_USERNAME "/feeds/photocell";
Adafruit_MQTT_Publish photocell = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME"/feeds/photocell");

Adafruit_MQTT_Subscribe Light1 = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME"/feeds/Relay1"); // Feeds name should be same everywhere
Adafruit_MQTT_Subscribe Light2 = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME"/feeds/Relay2");
Adafruit_MQTT_Subscribe Light3 = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME"/feeds/Relay3");
Adafruit_MQTT_Subscribe Light4 = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME"/feeds/Relay4");

void MQTT_connect();

void setup()
{
    Serial.begin(115200);
    delay(10);
    dht.begin();

    // Print temperature sensor details.

    pinMode(Relay1, OUTPUT);
    pinMode(Relay2, OUTPUT);
    pinMode(Relay3, OUTPUT);
    pinMode(Relay4, OUTPUT);

    // Connect to WiFi access point.
    Serial.println();
    Serial.println();
    Serial.print("Connecting to ");
    Serial.println(WLAN_SSID);

    WiFi.begin(WLAN_SSID, WLAN_PASS);
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }
    Serial.println();

    Serial.println("WiFi connected");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());

    temp_f = dht.readTemperature(true);
    Serial.println();
    Serial.print("Initial Temp: ");
    Serial.println(temp_f);
    Serial.println();

    mqtt.subscribe(&Light1);
    mqtt.subscribe(&Light3);
    mqtt.subscribe(&Light2);
    mqtt.subscribe(&Light4);
}

int delayTime = 300000; //Wait 5 minutes before sending data to web
int startDelay = 0;

void loop()
{
    MQTT_connect();
    if (millis() - startDelay < delayTime) {
        Serial.println("waiting delaytime");
    }
    else {
        temp_f = dht.readTemperature(true); //Get temp in Farenheit
        startDelay = millis();
        Serial.print(F("\nSending temp: "));
        Serial.print(temp_f);
        Serial.print("...");
        if (!photocell.publish(temp_f)) { //Publish to Adafruit
            Serial.println(F("Failed"));
        }
        else {
            Serial.println(F("Sent!"));
        }
    }

    /* //int t = dht.readTemperature(true); 
    // t = t/100000000;
    Serial.print(F("\nSending photocell val "));
    Serial.print(t);
    Serial.print("...");

    if (! photocell.publish(t)) {
        Serial.println(F("Failed"));
    } else {
        Serial.println(F("OK!"));
    }*/

    Adafruit_MQTT_Subscribe* subscription;
    while ((subscription = mqtt.readSubscription(2000))) {
        if (subscription == &Light1) {
            Serial.print(F("Got: "));
            Serial.println((char*)Light1.lastread);
            int Light1_State = atoi((char*)Light1.lastread);
            digitalWrite(Relay1, Light1_State);
        }
        if (subscription == &Light2) {
            Serial.print(F("Got: "));
            Serial.println((char*)Light2.lastread);
            int Light2_State = atoi((char*)Light2.lastread);
            digitalWrite(Relay2, Light2_State);
        }
        if (subscription == &Light3) {
            Serial.print(F("Got: "));
            Serial.println((char*)Light3.lastread);
            int Light3_State = atoi((char*)Light3.lastread);
            digitalWrite(Relay3, Light3_State);
        }
        if (subscription == &Light4) {
            Serial.print(F("Got: "));
            Serial.println((char*)Light4.lastread);
            int Light4_State = atoi((char*)Light4.lastread);
            digitalWrite(Relay4, Light4_State);
        }
    }

    // this is our 'wait for incoming subscription packets and callback em' busy subloop
    // try to spend your time here:
    mqtt.processPackets(500);
}

void MQTT_connect()
{
    int8_t ret;

    if (mqtt.connected()) {
        return;
    }

    Serial.print("Connecting to MQTT... ");

    uint8_t retries = 3;

    while ((ret = mqtt.connect()) != 0) {
        Serial.println(mqtt.connectErrorString(ret));
        Serial.println("Retrying MQTT connection in 5 seconds...");
        mqtt.disconnect();
        delay(5000);
        retries--;
        if (retries == 0) {
            while (1);
        }
    }
    Serial.println("MQTT Connected!");
}

标签: mqttarduino-esp8266

解决方案


您尝试在 setup() 中读取温度和湿度。但是您需要在dht.begin之后和读取之前在最小值处等待 2 秒,因为传感器读数也可能长达 2 秒

所以在第一次阅读之前添加延迟(2000) ..


推荐阅读