Данные DHT11 на MAX7219 показывают 0.

max7219 dht11 arduino-uno-r4-wifi

Я хочу распечатать данные с DHT11 (температура и влажность) на светодиодном дисплее MAX7219, но он показывает только 0. С другой стороны, последовательный монитор показывает и влажность, и температуру, что означает, что моя схема работает нормально, и есть что-то ошибся с кодом. Может ли кто-нибудь указать, что нужно исправить, чтобы все заработало? Спасибо. Вот код

#include <WiFi.h>
#include <NTPClient.h>
#include <DHT.h> 
#include <WiFiUdp.h>
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
//#define HARDWARE_TYPE MD_MAX72XX::GENERIC_H
#define MAX_DEVICES 4
#define CLK_PIN   5 
#define DATA_PIN  7 
#define CS_PIN    6 
MD_Parola Display = MD_Parola(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP);
const char* ssid     = "6666";
const char* password = "6666";
String Time, hour, minute;
String Formatted_date;
long currentMillis = 0;
long previousMillis = 0;
int interval = 1000;
#define DHTPIN  A2         /*Signal pin for DHT11 Sensor*/
#define DHTTYPE    DHT11  
DHT dht(DHTPIN, DHTTYPE);
void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print("Connecting.");
  }
  Serial.println("");
  Serial.println("WiFi connected.");
  timeClient.begin();
  timeClient.setTimeOffset(0);
  
  Display.begin();
  Display.setIntensity(0);
  Display.displayClear();

   dht.begin();
   Serial.println("Status\tHumidity (%)\tTemperature (C)");
}
void loop()
 {
   obtainTime();
}
void obtainTime() {
  while(!timeClient.update()) {
    timeClient.forceUpdate();
  }
  currentMillis = millis();
  if (currentMillis - previousMillis > interval)  {
previousMillis = millis();
Formatted_date = timeClient.getFormattedDate();
Serial.println(Formatted_date);
hour = Formatted_date.substring(11, 13);
minute = Formatted_date.substring(14, 16);

Time = hour + ":" + minute;
Serial.println(Time);
Display.setTextAlignment(PA_CENTER);
Display.print(Time);

delay(3000);
// The DHT11 returns at most one measurement every 3s
  float h = dht.readHumidity();
  //Read the moisture content in %.
  float t = dht.readTemperature();
  //Read the temperature in degrees Celsius


Serial.println(t);
Serial.println(h);
Display.setTextAlignment(PA_CENTER);
Display.print(t);
delay(5000);
Display.displayClear();

}
                     

} 

, 👍2

Обсуждение

Переменная t является числом с плавающей запятой. Попробуйте временно изменить это: Display.print(t); на Display.print(42);, чтобы проверить, равна ли отображаемая температура чему-то другому нулю. Также посмотрите библиотеку Parola, чтобы узнать, какой тип данных может обрабатывать метод print(). Возможно также попробуйте минимальный скетч типа Parola «Hello World», чтобы увидеть, ведет ли простой скетч ожидаемый результат. Было бы неплохо, если бы вы отформатировали свой код в IDE перед публикацией, чтобы его было легче читать., @6v6gt

Спасибо. Конечно, я попробую. Я попробовал это, и это сработало. символ temp_result[6]; dtostrf (т, 2,1, temp_result); Display.setTextAlignment(PA_CENTER); Display.print(temp_result); Однако не уверен, что делает «char temp_result[6]». Есть идеи?, @Andrew Coz

Хорошо. Итак, вы преобразовали число с плавающей запятой t в "строку c" с помощью dtostrf() , то есть в массив символов с нулевым завершением, а затем использовали его в методе print() для parola, и это работает. Вывод состоит в том, что parola не может напрямую обрабатывать типы данных с плавающей запятой. Я думаю, теперь вы можете написать свой ответ на исходный вопрос, чтобы закрыть проблему., @6v6gt

Сделанный. Спасибо за вашу помощь., @Andrew Coz


1 ответ


3

Оказалось, что MD_Parola не может напрямую обрабатывать числа с плавающей запятой. Я исправил проблему, преобразовав числа с плавающей запятой t и h в строки с помощью dtostrf()

 float h = dht.readHumidity();
 float t = dht.readTemperature();
  
char temp_result[6];
dtostrf(t,2,1,temp_result);
 
 
char hum_result[6];
dtostrf(h,2,0,hum_result);
Serial.println(t);
Serial.println(h);
Display.setTextAlignment(PA_CENTER);
//Display.print(temp_result);
Display.print((String)temp_result+" "+"C");
delay(5000);
//Display.print(hum_result);
Display.print((String)hum_result+" "+"%");
delay(5000);

,