Термометр Arduino и дисплей влажности с 7-сегментным светодиодным дисплеем
Я хочу использовать Arduino Uno, семисегментный светодиодный дисплей (четыре цифры) и библиотеку SevSeg, чтобы см. температуру и влажность (альтернативно).
Прежде всего я пробую этот код:
#define COMMON_ANODE 1
#define COMMON_CATODE 0
#include "DHT.h"
#define DHTPIN A5 // аналогичный вывод для данных
#define DHTTYPE DHT22 // DHT 22 (AM2302)
#include "SevSeg.h"
// Crea un'istanza dell'oggetto
SevSeg sevseg;
DHT dht(DHTPIN, DHTTYPE);
unsigned long timer; // таймер
unsigned long INTERVAL = 5000; // интервал повтора (30 секунд)
int segA = 6; // Одиннадцатый дисплей PIN 7Segment x 4
int segB = 2; // Седьмой дисплей PIN 7Segment x 4
int segC = 10; // Четвертый PIN дисплея 7Segment x 4
int segD = 12; // Второй дисплей PIN 7Segment x 4
int segE = 13; // Первый пин 7-сегментного дисплея x 4
int segF = 5; // Десятый дисплей PIN 7Segment x 4
int segG = 9; // Пятый дисплей PIN 7Segment x 4
int segDP = 11; // Третий дисплей PIN 7Segment x 4
int digit1 = 7; // Двенадцатый PIN - PWM, который включает первую цифру
int digit2 = 4; // Девятый PIN - PWM, который включает вторую цифру
int digit3 = 3; // Восьмой PIN - ШИМ, который включает третью цифру
int digit4 = 8; // Шестой PIN - ШИМ, который включает четвертую цифру
void setup()
{
dht.begin();
int numberOfDigits = 4; //Количество цифр дисплея
// Инициализировать пины
sevseg.Begin(COMMON_CATODE,digit1,digit2,digit3,digit4,segA,segB,segC,segD,segE,segF,segG,segDP);
// Установить яркость (значение от 0 до 100)
sevseg.Brightness(90);
timer = millis(); // запуск таймера
}
void loop()
{
if ((millis()-timer) > INTERVAL) {
// Сбрасываем таймер и получаем/отображаем текущую температуру
timer += INTERVAL;
// Следите за датчиком температуры
float t = dht.readTemperature();
float h = dht.readHumidity();
//La converto in un numero intero a 4 cifre
int a=t*100;
sevseg.NewNum(a,2);
}
sevseg.PrintOutput();
}
И это работает очень хорошо!
Но я не вижу температуру (сначала) И влажность (после) и снова температуру (сначала) И влажность (после)...
Я пробовал много способов, но... ничего!! Вы можете мне помочь?
@Michele Borsaro, 👍0
1 ответ
▲ 1
Вам необходимо поддерживать состояние, которое сообщает вашей программе, что вы отображаете: температуру или влажность. Каждый раз, когда таймер истекает, вам нужно переходить из одного состояния в другое, а затем отображать соответствующее значение в зависимости от состояния.
Что-то вроде:
bool displaying = false; // false = температура, true = влажность
void loop() {
if ((millis()-timer) >= INTERVAL) {
timer = millis();
display = !display; // Переключение между отображаемыми значениями
if (display) {
float h = dht.readHumidity();
sevseg.NewNum(h * 100, 2);
} else {
float t = dht.readTemperature();
sevseg.NewNum(t * 100, 2);
}
}
sevseg.PrintOutput();
}
,
@Majenko
Смотрите также:
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
Очень интересный способ! После работы, примерно в 8 вечера :-) попробую ваше предложение!, @Michele Borsaro
Все, что вы реализуете, - это очень простой конечный автомат (один только с двумя состояниями). Вы можете найти это интересное чтение: http://hacking.majenko.co.uk/finite-state-machine, @Majenko
Привет! Спасибо за ваше предложение! Я попробовал это пять минут назад, и это работает. Хороший и простой способ решить проблему, но если я хочу использовать этот способ для 3 значений, т. е. температуры в градусах Цельсия, влажности и температуры в градусах Кельвина, могу ли я использовать «булановский» способ или я должен использовать «переключатель- case" конструкция (как в статье)?, @Michele Borsaro
Логическое значение может хранить только два состояния — истинное или ложное — и поэтому его можно использовать только для выбора между двумя элементами. Для большего вам нужно изменить логическое значение на другой тип, который может хранить больше значений, а затем выбирать между ними. Произнесите «int» и используйте значения 0, 1 и 2. Так что да, как в статье., @Majenko
@MicheleBorsaro Если этот ответ решил вашу проблему, вы должны принять его. Это ожидаемое поведение на этом сайте. (Примите первый/лучший ответ, который решит вашу проблему. Когда у вас будет репутация, вы также должны подумать о том, чтобы проголосовать за полезные ответы, хотя это необязательно.), @Duncan C