немогу разобратся почему температуру показывает с часов без десятых градуса ардуино уно датчик DHT22 часы DS3231 и дисплей 2004 i2c Код (C++): //метеостанция с часами и выводом температуры с модуля часов и датчиком DHT22 #include <DHT.h> #include <Wire.h> #include "Sodaq_DS3231.h" #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x3f, 20, 4); // инициализация дисплея #define DHTPIN A0 #define DHTTYPE DHT22 // DHT 22 (AM2302) //инициализация датчика DHT dht(DHTPIN, DHTTYPE); char weekDay[][4] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; void setup () { Serial.begin(57600); Wire.begin(); rtc.begin(); lcd.init(); lcd.backlight(); lcd.home(); dht.begin(); lcd.clear(); Serial.println("RTC is NOT running!"); } void loop () { digitalClockDisplay(); delay(200); rtc.convertTemperature(); } void digitalClockDisplay() { // читаем время дату DateTime now = rtc.now(); // читаем влажность float h = dht.readHumidity(); // читаем температуру float t = dht.readTemperature(); // Выводим показания влажности и температуры lcd.setCursor(1, 1); lcd.print("B ="); lcd.setCursor(5, 1); lcd.print(h, 1); lcd.setCursor(10, 1); lcd.print("%"); lcd.setCursor(1, 2); lcd.print("T ="); lcd.setCursor(5, 2); lcd.print(t, 1); lcd.setCursor(10, 2); lcd.print("C"); lcd.setCursor(1, 3); lcd.print("T ="); lcd.setCursor(5, 3); printDigits(rtc.getTemperature()); lcd.setCursor(10, 3); lcd.print("C"); lcd.setCursor(0, 0); printDigits(now.hour()); lcd.setCursor(2, 0); lcd.print(":"); lcd.setCursor(3, 0); printDigits(now.minute()); lcd.setCursor(5, 0); lcd.print(":"); lcd.setCursor(6, 0); printDigits(now.second()); lcd.setCursor(10, 0); printDigits(now.date()); lcd.setCursor(12, 0); lcd.print("."); lcd.setCursor(13, 0); printDigits(now.month()); lcd.setCursor(15, 0); lcd.print("."); lcd.setCursor(16, 0); printDigits(now.year()); } void printDigits(int digits) { if (digits < 10) { lcd.print('0'); } lcd.print(digits); }
У вас void printDigits(int digits) работает с целыми числами, а rtc.getTemperature() возвращает число с плавающей точкой. При передаче числа с плавающей точкой в функцию printDigits происходит неявное приведение к целому числу, в результате дробная часть - отбрасывается.
да только теперь как привести все данные к одному виду а то у влажности два знака после запятой у температуры с DHT22 один знак после запятой а у датчика температуры в часах тоже два знака после запятой
Возможно второй параметр в функции lcd.print(t, 1) - это количество знаков после запятой. Попробуйте Код (C++): lcd.print(t, 2); lcd.setCursor(11, 2); lcd.print("C");
заметил тут интересный момент если убрать резистор с датчика DHT22 показывает данные ближе к правильным
Код (C++): //метеостанция с часами и выводом температуры с модуля часов и датчиком DHT22 #include <DHT.h> #include <Wire.h> #include "Sodaq_DS3231.h" #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x3f, 20, 4); // инициализация дисплея #define DHTPIN A0 #define DHTTYPE DHT22 // DHT 22 (AM2302) //инициализация датчика DHT dht(DHTPIN, DHTTYPE); char weekDay[][4] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; void setup () { Serial.begin(57600); Wire.begin(); rtc.begin(); lcd.init(); lcd.backlight(); lcd.home(); dht.begin(); lcd.clear(); Serial.println("RTC is NOT running!"); } void loop () { digitalClockDisplay(); rtc.convertTemperature(); } void digitalClockDisplay() { // читаем время дату DateTime now = rtc.now(); // читаем влажность DHT22 float h = dht.readHumidity(); // читаем температуру DHT22 float t = dht.readTemperature(); // читаем температуру с часов float t2 = rtc.getTemperature(); // Выводим показания влажности и температуры lcd.setCursor(1, 1); lcd.print("B<="); lcd.setCursor(5, 1); lcd.print(h);//Влажность с датчика DHT22 lcd.setCursor(10, 1); lcd.print("%"); lcd.setCursor(1, 2); lcd.print("T<="); lcd.setCursor(5, 2); lcd.print(t);//температура с датчика DHT22 lcd.setCursor(10, 2); lcd.print("C outside"); lcd.setCursor(1, 3); lcd.print("T>="); lcd.setCursor(5, 3); lcd.print(t2);//температура с часов lcd.setCursor(10, 3); lcd.print("C inside"); //выводим показания времени и даты lcd.setCursor(0, 0); printDigits(now.hour()); lcd.setCursor(2, 0); lcd.print(":"); lcd.setCursor(3, 0); printDigits(now.minute()); lcd.setCursor(5, 0); lcd.print(":"); lcd.setCursor(6, 0); printDigits(now.second()); lcd.setCursor(9, 0); printDigits(now.date()); lcd.setCursor(11, 0); lcd.print("."); lcd.setCursor(12, 0); printDigits(now.month()); lcd.setCursor(14, 0); lcd.print("."); lcd.setCursor(15, 0); printDigits(now.year()); lcd.setCursor(19, 0); lcd.print("r"); lcd.setCursor(13, 1); lcd.print(weekDay[now.dayOfWeek()]); } //дорисовываем нули перед значением из одного символа void printDigits(int digits) { if (digits < 10) { lcd.print('0'); } lcd.print(digits); } последний вариант