домашняя метеостанция

Тема в разделе "Arduino & Shields", создана пользователем Slaiterx, 20 июн 2016.

Метки:
  1. Slaiterx

    Slaiterx Гик

    немогу разобратся почему температуру показывает с часов без десятых градуса
    ардуино уно датчик 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);
    }
     
  2. Slaiterx

    Slaiterx Гик

    скетч писал сам по примерам из библиотек возможно чтото лишнее есть тыкните если что
     
  3. DIYMan

    DIYMan Гуру

    У вас

    void printDigits(int digits)

    работает с целыми числами, а

    rtc.getTemperature()

    возвращает число с плавающей точкой. При передаче числа с плавающей точкой в функцию printDigits происходит неявное приведение к целому числу, в результате дробная часть - отбрасывается.
     
    ZAZ-965 нравится это.
  4. Slaiterx

    Slaiterx Гик

    спасибо тебе добрый человек
     
    Последнее редактирование: 20 июн 2016
  5. ZAZ-965

    ZAZ-965 Гуру

    @Slaiterx, DS3231 хоть и имеет разрешение 0,25°с, но точность то ± 3°с
     
  6. Slaiterx

    Slaiterx Гик

    да только теперь как привести все данные к одному виду а то у влажности два знака после запятой у температуры с DHT22 один знак после запятой а у датчика температуры в часах тоже два знака после запятой
     
  7. ZAZ-965

    ZAZ-965 Гуру

    @Slaiterx, какую библиотеку LiquidCrystal_I2C используете?
     
  8. Slaiterx

    Slaiterx Гик

    Скачал откудато непомню уже первые были не рабочие
     
  9. ZAZ-965

    ZAZ-965 Гуру

    Возможно второй параметр в функции lcd.print(t, 1) - это количество знаков после запятой.
    Попробуйте
    Код (C++):
      lcd.print(t, 2);
      lcd.setCursor(11, 2);
      lcd.print("C");
     
    Последнее редактирование: 20 июн 2016
  10. Slaiterx

    Slaiterx Гик

    Вечером попробую спасибо за подсказку
     
  11. Slaiterx

    Slaiterx Гик

    все равно датчик температуры выводит 2 знака после запятой
     
  12. ZAZ-965

    ZAZ-965 Гуру

    Что-то я запутался. А сколько надо? И прикрепите архив с вашей библиотекой LiquidCrystal_I2C.
     
  13. Slaiterx

    Slaiterx Гик

    заметил тут интересный момент если убрать резистор с датчика DHT22 показывает данные ближе к правильным
     
  14. Slaiterx

    Slaiterx Гик

    [​IMG]
    нашел вот такое подключение
     
  15. Slaiterx

    Slaiterx Гик

  16. Slaiterx

    Slaiterx Гик

    я уже решил эту проблему сдвигом знака градуса и процента
     
  17. Slaiterx

    Slaiterx Гик

    Код (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);
    }
    последний вариант