Термометр 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();   
  }

И это работает очень хорошо!

Но я не вижу температуру (сначала) И влажность (после) и снова температуру (сначала) И влажность (после)...

Я пробовал много способов, но... ничего!! Вы можете мне помочь?

, 👍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();   
}
,

Очень интересный способ! После работы, примерно в 8 вечера :-) попробую ваше предложение!, @Michele Borsaro

Все, что вы реализуете, - это очень простой конечный автомат (один только с двумя состояниями). Вы можете найти это интересное чтение: http://hacking.majenko.co.uk/finite-state-machine, @Majenko

Привет! Спасибо за ваше предложение! Я попробовал это пять минут назад, и это работает. Хороший и простой способ решить проблему, но если я хочу использовать этот способ для 3 значений, т. е. температуры в градусах Цельсия, влажности и температуры в градусах Кельвина, могу ли я использовать «булановский» способ или я должен использовать «переключатель- case" конструкция (как в статье)?, @Michele Borsaro

Логическое значение может хранить только два состояния — истинное или ложное — и поэтому его можно использовать только для выбора между двумя элементами. Для большего вам нужно изменить логическое значение на другой тип, который может хранить больше значений, а затем выбирать между ними. Произнесите «int» и используйте значения 0, 1 и 2. Так что да, как в статье., @Majenko

@MicheleBorsaro Если этот ответ решил вашу проблему, вы должны принять его. Это ожидаемое поведение на этом сайте. (Примите первый/лучший ответ, который решит вашу проблему. Когда у вас будет репутация, вы также должны подумать о том, чтобы проголосовать за полезные ответы, хотя это необязательно.), @Duncan C