Вопрос по 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, чтоб заработало? Спасибо!
Попробовал отрисовать это все в строку и подставить ее в скобки, но из этой затеи ничего не вышло совсем... Код (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); } Может заодно подскажет кто, как убрать дребезг кнопки, а то пользоваться из-за этого невозможно практически, а как от него избавиться - ума не приложу... И еще, может, если кому не лень, покажете где еще я костылей навтыкал и можно было сделать лучше. Спасибо!
А про вывод на дисплей символов и цифр одновременно не подскажите? С кнопками я уже разобрался, а вот с чего этот топик начинал - затык до сих пор
вы в код библиотеки заглянули бы откуда вы взяли. что она умеет работать со строкой? вот так попробуйте Код (C++): int hum = dht.readHumidity(); byte humOnes = hum % 10; byte humTens = hum / 10; qd.displayDigits(QD_H, QD_NONE, numerals[humTens], numerals[humOnes]);
это дичь какая-то. надо делать так Код (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[] непонятно ваще
так работать не будет. Чтобы вывести на дисплей "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 };
добавка - массив numerals, насколько я вижу - статический внутри .cpp файла. в скетче он будет недоступен. его нужно добавить в свой код вручную
Спасибо! Теперь все работает, но заметил, что 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]); }