Quaddisplay 2

Тема в разделе "Arduino & Shields", создана пользователем arssev1, 2 апр 2021.

  1. arssev1

    arssev1 Гик

    Вопрос по QuadDisplay 2 от Амперки:
    В примере есть такой кусок кода:
    Код (C++):
    qd.displayDigits(QD_O, QD_f, QD_f, QD_NONE);
    Он выводит на дисплей надпись Off.
    Мне надо вывести букву H, потом ничего, потом оду переменную int и вторую переменную int
    Код (C++):
    qd.displayDigits(QD_H, QD_NONE, QD_, QD_)
    Как вписать в эти пропуски правильно переменные int, чтоб заработало?
    Спасибо!
     
  2. arssev1

    arssev1 Гик

    Попробовал отрисовать это все в строку и подставить ее в скобки, но из этой затеи ничего не вышло совсем...
    Код (C++):
    char drawHum[3];
    sprintf(drawHum, "QD_H, QD_NONE, QD_%d, QD_%d", humTens, humOnes);
    qd.displayDigits(drawHum);
    А вообще вот весь код
    Код (C++):
    #include "DHT.h" //библиотки для DHT11, дисплея и часов
    #include <QuadDisplay2.h>
    #include "RTClib.h"

    #define DHTPIN A0
    #define DHTTYPE DHT11
    #define QDPIN 9
    #define BUTTONPIN 4

    QuadDisplay qd(QDPIN);
    DHT dht(DHTPIN, DHTTYPE);
    RTC_DS1307 rtc;

    int mode = 0; //режим 0 - время, 1 - дата, 2 - температура, 3 - влажность
    int flag = 0;
    long previousMillis = 0;
    char timeBuf[5]; //для вывода времени
    char dateBuf[5]; //для вывода даты
    char drawHum[3]; //неработающий кусок для влажности

    void setup() {
      pinMode(BUTTONPIN, INPUT);
      dht.begin();
      qd.begin();
      rtc.begin();
    }

    void loop() {
      if(digitalRead(BUTTONPIN) == HIGH & flag == 0) { //если нажали кнопку
        mode++; //переключаем режим
        flag = 1;
        previousMillis = 3001; //костыль для быстрого обновления данных на дисплее
        tone(3, 4000, 50); //запищим
        if(mode > 2) mode = 0; //вообще > 3, но влажность пока не знаю как прикуртить
      }

      if(digitalRead(BUTTONPIN) == LOW && flag == 1) flag = 0; //обнуляем flag

      if(mode == 0 && millis() - previousMillis > 3000) { //если режим 0 и с момента обновления дисплея прошло 3 секунды
        previousMillis = millis(); //обновим таймер
        dispTime(); //отобразим время
      }

      else if (mode == 1 && millis() - previousMillis > 3000) { //если режим 1 и --//--
        previousMillis = millis();
        dispDate(); //отобразим дату
      }

      else if (mode == 2 && millis() - previousMillis > 3000) { //если режим 2 и --//--
        previousMillis = millis();
        dispTemp(); //отобразим температуру
      }
      else if (mode == 3 && millis() - previousMillis > 3000) { //если режим 3 и --//--
        previousMillis = millis();
        dispHum(); //отобразим влажность
      }
    }

    void dispTime (void) {
      DateTime now = rtc.now();
      sprintf(timeBuf, "%02d.%02d", now.hour(), now.minute());
      qd.displayFloat(atof(timeBuf), 2, true);
    }

    void dispDate (void) {
      DateTime now = rtc.now();
      sprintf(dateBuf, "%02d.%02d", now.day(), now.month());
      qd.displayFloat(atof(dateBuf), 2, true);
    }

    void dispTemp (void) {
      int temp = dht.readTemperature();
      qd.displayTemperatureC(temp);
    }

    void dispHum (void) {
      int hum = dht.readHumidity();
      int humOnes = hum % 10;
      int humTens = hum / 10;
      sprintf(drawHum, "QD_H, QD_NONE, QD_%d, QD_%d", humTens, humOnes);
    }
    Может заодно подскажет кто, как убрать дребезг кнопки, а то пользоваться из-за этого невозможно практически, а как от него избавиться - ума не приложу... И еще, может, если кому не лень, покажете где еще я костылей навтыкал и можно было сделать лучше. Спасибо!
     
    Последнее редактирование: 2 апр 2021
  3. b707

    b707 Гуру

    для этого есть куча примеров кода
    И готовых библиотек
     
  4. arssev1

    arssev1 Гик

    А про вывод на дисплей символов и цифр одновременно не подскажите? С кнопками я уже разобрался, а вот с чего этот топик начинал - затык до сих пор
     
  5. b707

    b707 Гуру

    вы в код библиотеки заглянули бы
    откуда вы взяли. что она умеет работать со строкой?

    вот так попробуйте
    Код (C++):
    int hum = dht.readHumidity();
      byte humOnes = hum % 10;
      byte humTens = hum / 10;
    qd.displayDigits(QD_H, QD_NONE, numerals[humTens], numerals[humOnes]);
     
  6. akl

    akl Гуру

    это дичь какая-то.
    надо делать так
    Код (C++):
    char drawHum[4]; //во-первых, нужно 4 ячейки
    drawHum[0]=QD_H;
    drawHum[1]=QD_NONE;
    drawHum[2]=humTens;
    drawHum[3]=humOnes;
    qd.displayDigits(drawHum[0],drawHum[1],drawHum[2],drawHum[3]);
    то есть нет - b707 правее - надо еще на массив с цифрами это отобразить то есть
    Код (C++):
    qd.displayDigits(drawHum[0],drawHum[1],numerals[drawHum[2]],numerals[drawHum[3]]);
    ну или как у него написано - нафига этот массив drawHum[] непонятно ваще
     
    Последнее редактирование: 6 апр 2021
    b707 нравится это.
  7. b707

    b707 Гуру

    так работать не будет.
    Чтобы вывести на дисплей "1" в правую позицию - надо записать в drawHum[3] отнюдь не единицу, а значение QD_1, определеннов библиотеке как
    Код (C++):
    #define QD_1 0b10011111
    для вывода цифр на дисплей в библиотеке определен массив numerals. которых хранит коды всех цифр:
    Код (C++):
    const static uint8_t numerals[] = { QD_0, QD_1, QD_2, QD_3, QD_4, QD_5, QD_6, QD_7, QD_8, QD_9 };
     
  8. b707

    b707 Гуру

    добавка - массив numerals, насколько я вижу - статический внутри .cpp файла. в скетче он будет недоступен. его нужно добавить в свой код вручную
     
    akl нравится это.
  9. arssev1

    arssev1 Гик

    Спасибо! Теперь все работает, но заметил, что DHT11 как будто бы нагревает сам себя на пару градусов точно. Слишком часто опрашиваю его?
    Код (C++):
    #include "DHT.h" //библиотки для DHT11, дисплея и часов
    #include <QuadDisplay2.h>
    #include "RTClib.h"
    #include <ezButton.h>

    #define DHTPIN A0
    #define DHTTYPE DHT11
    #define QDPIN 9
    #define BUTTONPIN 4
    #define BUZZERPIN 3

    QuadDisplay qd(QDPIN);
    DHT dht(DHTPIN, DHTTYPE);
    RTC_DS1307 rtc;
    ezButton button(BUTTONPIN);

    int mode = 0; //режим 0 - время, 1 - дата, 2 - температура, 3 - влажность
    int previousMode;
    long previousMillis = 0;
    char timeBuf[5]; //для вывода времени
    char dateBuf[5]; //для вывода даты
    const static uint8_t numerals[] = {QD_0, QD_1, QD_2, QD_3, QD_4, QD_5, QD_6, QD_7, QD_8, QD_9};

    void setup() {
      button.setDebounceTime(100);
      button.setCountMode(COUNT_FALLING);
      dht.begin();
      qd.begin();
      rtc.begin();
    }

    void loop() {
      button.loop();
      mode = button.getCount();
      if(mode > 3) button.resetCount();

      if(previousMode != mode) {
        tone(BUZZERPIN, 4000, 50);
        previousMillis = 3001;
      }

      if(mode == 0 && millis() - previousMillis > 3000) { //если режим 0 и с момента обновления дисплея прошло 3 секунды
        previousMillis = millis(); //обновим таймер
        dispTime(); //отобразим время
      }

      else if (mode == 1 && millis() - previousMillis > 3000) { //если режим 1 и --//--
        previousMillis = millis();
        dispDate(); //отобразим дату
      }

      else if (mode == 2 && millis() - previousMillis > 3000) { //если режим 2 и --//--
        previousMillis = millis();
        dispTemp(); //отобразим температуру
      }
      else if (mode == 3 && millis() - previousMillis > 3000) { //если режим 3 и --//--
        previousMillis = millis();
        dispHum(); //отобразим влажность
      }

      previousMode = mode;
    }

    void dispTime (void) {
      DateTime now = rtc.now();
      sprintf(timeBuf, "%02d.%02d", now.hour(), now.minute());
      qd.displayFloat(atof(timeBuf), 2, true);
    }

    void dispDate (void) {
      DateTime now = rtc.now();
      sprintf(dateBuf, "%02d.%02d", now.day(), now.month());
      qd.displayFloat(atof(dateBuf), 2, true);
    }

    void dispTemp (void) {
      int temp = dht.readTemperature();
      qd.displayTemperatureC(temp);
    }

    void dispHum (void) {
      int hum = dht.readHumidity();
      int humOnes = hum % 10;
      int humTens = hum / 10;
      qd.displayDigits(QD_H, QD_NONE, numerals[humTens], numerals[humOnes]);
    }
     
  10. b707

    b707 Гуру

    сам не пробовал, но читал кучу отзывов, что DHT11 - Г. редкостное...
     
  11. alp69

    alp69 Форумчанин

    Обычный показометр.