Данные DHT11 на MAX7219 показывают 0.
Я хочу распечатать данные с 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();
}
}
@Andrew Coz, 👍2
Обсуждение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);
,
@Andrew Coz
Смотрите также:
- max7219 связанный дисплей, показывающий зеркальный текст
- Разница между 3,3 В и 5 В
- Путаница с проводкой SPI
- Возможно ли сделать таймер с точностью до 1 миллисекунды ? Использование светодиода MAX7219
- Гирляндное соединение нескольких блоков матрицы 4x(8x8) MAX7219
- Код считывания датчика DHT22 странно интерпретирует отрицательные значения (распространенная проблема)
- Почему светодиоды заметно мерцают?
- Библиотека Parola и часы DS3231
Переменная
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