7-сегментный индикатор мигает
Я хочу отобразить датчик температуры и влажности DHT22 на 3-разрядном 7-сегментном дисплее. Он всегда показывает значение датчика, и через 2-3 секунды дисплей выключается, затем включается дисплей и так далее.
Мне нужна помощь, чтобы понять, где ошибка в коде, чтобы дисплей всегда был включен.
#include <SevSeg.h>
#include <EEPROM.h>
#include "DHT.h"
#define COMMON_ANODE 0
#define DHTPIN A0 // what pin we're connected to
#define DHTTYPE DHT22 // DHT 22 (AM2302)
DHT dht(DHTPIN, DHTTYPE);
int chk;
float hum; //Stores humidity value
float temp; //Stores temperature value
SevSeg sevseg;
void setup(){
byte numDigits = 3;
byte digitPins[] = {1,2,3};
byte segmentPins[] = {4,5,6,7,8,9,10,11};
sevseg.begin(COMMON_ANODE, numDigits, digitPins, segmentPins);
dht.begin();
}
void loop(){
temp= dht.readTemperature();
sevseg.setNumber(temp,1);
sevseg.refreshDisplay();
}
@nawfal ahmed, 👍1
2 ответа
У вас мультиплексный дисплей. Мультиплексированные дисплеи должны постоянно обновляться, иначе они будут отображать последнюю отображаемую цифру (если она была) в течение длительного периода времени.
Чтение из DHT займет некоторое время. Это время прервет обновления дисплея, в результате чего он на некоторое время остановится во время чтения.
Почему это происходит каждые несколько секунд? Все, что я могу предположить, это то, что используемая вами библиотека DHT ограничивает фактические показания каждые несколько секунд, а между этими периодами она просто возвращает ранее сохраненное значение.
Чтобы обойти это, вам следует подумать об обновлении дисплея из прерывания таймера (при условии, что ваша библиотека DHT не отключает прерывания).
Хороший способ избежать мерцания экрана — обновлять его только при необходимости. Обновление дисплея вызывает его мерцание. Если вы измените свой основной цикл, как показано ниже, дисплей будет обновляться только при необходимости (когда текущее показание отличается от последнего показания). Вероятно, также неплохо считывать температуру каждые 2 секунды или около того, что можно контролировать с помощью простой задержки().
float temp, last_temp = 0;
void loop() {
temp = dht.readTemperature();
if (temp != last_temp)
{
sevseg.setNumber(temp,1);
sevseg.refreshDisplay();
}
last_temp = temp;
delay(2000);
}
Автор библиотеки SevSeg говорит: «[Ваша программа должна повторно запускать функцию refreshDisplay() для отображения числа](https://github.com/DeanIsMe/SevSeg)», он даже предупреждает, что задержки приведут к нежелательным эффектам... Я пытался это и не сработало., @brasofilo
- Регулируемая температура
- Как отображать переменные на 0,96-дюймовом OLED-дисплее с библиотекой u8glib?
- Как отобразить символ º на ЖК-дисплее?
- Путаница между SPI и I2C для SSD1306 OLED
- Потенциометр 10 кОм против резистора 10 кОм на ЖК-дисплее
- Не могу заставить 4 значный 7 сегментный дисплей показывать разные значения
- Сделать CS (chip select) для работаты в SPI (для и SD карты и OLED)
- Запуск 7-контактного OLED-дисплея с 4 контактами (I2C)
Большое спасибо Majenko, можете ли вы отправить пример кода для решения, @nawfal ahmed
большое спасибо, я хотел бы поделиться своей идеей, которую я попробовал на этой неделе со всеми своими друзьями, я просто ремонтирую библиотеку DHT22 и уменьшаю время задержки, и тогда 7 сегментов, мигающих каждые 2 секунды, исчезнут., @nawfal ahmed