LCD (16,2.I2C), DC1302, DHT11.

Тема в разделе "Глядите, что я сделал", создана пользователем Stivin, 5 фев 2016.

  1. Stivin

    Stivin Нуб

    Добрый день, решил собрать часы с выводом температуры и влажности,я в этом новичке, вроде все получилось но спустя какой то время дисплей за место данной информации начинает выдавать кракозябли.
    С чем это связано?
    Еще хотелось узнать как сделать когда время =*** делалось какое либо действие?

    вот код:
    Код (C++):
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    #include <dht11.h>
    dht11 DHT;
    #include <RTC.h>
    #define DHT11_PIN 4
    LiquidCrystal_I2C lcd(0x3F,16,2);
    RTC time;

    void setup()
    {
    lcd.init();
    lcd.backlight();
    lcd.setCursor(8, 1);
    lcd.print("|");
    lcd.setCursor(11, 1);
    lcd.print("%|");
    lcd.setCursor(15, 1);
    lcd.print("t");
    delay(1000);
    Serial.begin(9600);
    time.begin(RTC_DS1302,10,13,12); // pin 10 = rst, pin 13 = clk, pin 12 = dat
    }

    void loop()
    {
    if(millis()%1000==0){
    lcd.setCursor(0,0);
    lcd.print(time.gettime("d-m-Y,D"));
    lcd.setCursor(0,1);
    lcd.print(time.gettime("H:i:s"));
    int chk;
    chk = DHT.read(DHT11_PIN);
    lcd.setCursor(9, 1);
    lcd.print(DHT.humidity, 1);
    lcd.setCursor(13, 1);
    lcd.print(DHT.temperature,1);
    delay(1);
    }
    }
    IMG_0868.JPG IMG_0869.JPG
     
  2. Vad33

    Vad33 Капитан-оригинал

    Видимо какой то контакт плохо подсоединен.
     
    Stivin нравится это.
  3. Stivin

    Stivin Нуб

    все пропаял, вроде пока ок.
    А по поводу действий по времени не подскажите?
     
  4. Vad33

    Vad33 Капитан-оригинал

    Последнее редактирование: 5 фев 2016
    Stivin нравится это.
  5. Tomasina

    Tomasina Сушитель лампочек Модератор

    у меня такое было. Причина - слишком длинные провода до дисплея.
    При кратковременном пропадании контакта (пошевелили плату) в линии даных тоже срывается синхронизация и дальше идет только мусор.
    Попробуй раз в N минут сбрасывать дисплей:
    Код (C++):
    lcd.init();
    delay(50);
    lcd.clrscr();
     
    Stivin и ИгорьК нравится это.
  6. Stivin

    Stivin Нуб

    спс все в норме, устранил пайкой всех контактов.
     
  7. Stivin

    Stivin Нуб

    поучительно но не нашел как в итоге сделать, я новичке в программирование и большую половину команд не понимаю, пока собираю все копиистом отталкиваясь от минимальных знаний) я часы ели ели подружил с датчиком температуры а LCD неделю заводил пока не наткнулся на скетч сканера портов i2c)))
     
  8. Stivin

    Stivin Нуб

    вот что у меня получилось)
    Код (C++):

    #define BUZZER_PIN  7
    int led = 9;
    int ldr = A0;
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    LiquidCrystal_I2C lcd(0x3F,16,2);

    #include <dht11.h>
    dht11 DHT;
    #define DHT11_PIN 8

    #include <RTC.h>
    RTC time;

    byte degree[8] =
    {
       B00100,
       B01010,
       B01010,
       B01110,
       B10001,
       B10001,
       B01110,
    };
    byte water[8] =
    {
       B00100,
       B00100,
       B01110,
       B01110,
       B11101,
       B11001,
       B01110,
    };

    void setup()
    {
    pinMode(BUZZER_PIN, OUTPUT);
    pinMode(led, OUTPUT);
    lcd.init();
    lcd.createChar(1, degree);
    lcd.createChar(2, water);
    lcd.setCursor(8, 1);
    lcd.print("|");
    lcd.setCursor(11, 1);
    lcd.print("\2|");
    lcd.setCursor(15, 1);
    lcd.print("\1");
    delay(1000);
    Serial.begin(9600);
    time.begin(RTC_DS1302,10,13,12); // pin 10 = rst, pin 13 = clk, pin 12 = dat
    // изменение времени и даты в чипе DS1302
    //time.settime(0,45,11,5,2,2016,5);  // 0  сек, 17 мин, 15 час, 1, октября, 2015 года, четверг
    ///
    }

    void loop()
    {
    if (time.hours==12 && time.minutes==30 && time.seconds==0)
      {
        tone(BUZZER_PIN, 3000, 50);
      delay(50);
      tone(BUZZER_PIN, 3000, 50);
      delay(50);
      tone(BUZZER_PIN, 3000, 50);
      delay(50);
      tone(BUZZER_PIN, 3000, 50);
      delay(50);
      tone(BUZZER_PIN, 3000, 50);
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Valim na Obed!!!");
        lcd.setCursor(0, 1);
        lcd.print(time.gettime("H:i"));
        delay(10000);
        tone(BUZZER_PIN, 3000, 50);
      delay(50);
      tone(BUZZER_PIN, 3000, 50);
      delay(50);
      tone(BUZZER_PIN, 3000, 50);
      delay(50);
      tone(BUZZER_PIN, 3000, 50);
      delay(50);
      tone(BUZZER_PIN, 3000, 50);
        lcd.clear();
    lcd.setCursor(8, 1);
    lcd.print("|");
    lcd.setCursor(11, 1);
    lcd.print("\2|");
    lcd.setCursor(15, 1);
    lcd.print("\1");
    time.gettime();
      }
      if (time.hours==17 && time.minutes==30 && time.seconds==0)
      {
        tone(BUZZER_PIN, 3000, 50);
      delay(50);
      tone(BUZZER_PIN, 3000, 50);
      delay(50);
      tone(BUZZER_PIN, 3000, 50);
      delay(50);
      tone(BUZZER_PIN, 3000, 50);
      delay(50);
      tone(BUZZER_PIN, 3000, 50);
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Valim Domoi!!!");
        lcd.setCursor(0, 1);
        lcd.print(time.gettime("H:i"));
        delay(10000);
        tone(BUZZER_PIN, 3000, 50);
      delay(50);
      tone(BUZZER_PIN, 3000, 50);
      delay(50);
      tone(BUZZER_PIN, 3000, 50);
      delay(50);
      tone(BUZZER_PIN, 3000, 50);
      delay(50);
      tone(BUZZER_PIN, 3000, 50);
        lcd.clear();
    lcd.setCursor(8, 1);
    lcd.print("|");
    lcd.setCursor(11, 1);
    lcd.print("\2|");
    lcd.setCursor(15, 1);
    lcd.print("\1");
    time.gettime();
      }
    if (analogRead(ldr) < 300) analogWrite(led, 255);
    else analogWrite(led, 100);
    if(millis()%1000==0){
    time.period(255);
    lcd.setCursor(0,0);
    lcd.print(time.gettime("d-m-Y,w-D"));
    lcd.setCursor(0,1);
    lcd.print(time.gettime("H:i:s"));
    int chk;
    chk = DHT.read(DHT11_PIN);
    lcd.setCursor(9, 1);
    lcd.print(DHT.humidity, 1);
    lcd.setCursor(13, 1);
    lcd.print(DHT.temperature,1);
    delay(1);
    }
    }
     
     
  9. Iguana

    Iguana Нерд

    Чтобы не плодить темы. Использую библиотеку RTC. Никак не могу сообразить, как с 00 минут и через каждые 10 т.е. например в H:00, далее H:10, Н:20 и т.д. минут выполнять действие?
     
    Последнее редактирование: 20 фев 2016
  10. ImrDuke

    ImrDuke Гик

    Как вариант
    % оператор - Возвращает остаток от деления одного целого (int) операнда на другой.
    x = 7 % 5; // x имеет значение 2
    x = 9 % 5; // x имеет значение 4
    x = 5 % 5; // x имеет значение 0
    x = 4 % 5; // x имеет значение 4
     
  11. Vad33

    Vad33 Капитан-оригинал

    Можно например (как вариант) получать количество минут и если оно точно кратно 10 выполнять действие,
    но тут два момента.
    1) Опрос должен сработать хотя бы раз в минуту. Мало ли какие задержки еще в программе.
    2) Нужно сделать флаг срабатывания, чтобы сработало только один раз в течение минуты.
    а когда время изменится флаг убирать.
     
  12. Iguana

    Iguana Нерд

    Поясню хотелку.
    Программка для радиолюбительского CW-маяка. Для автономной и точной по времени работы на даче летом хотелось сделать так, чтобы маяк включился в 9:00, передал текст и через каждые 10 минут это повторял до выключения например в 22:00. Сам текст уже передается, задействован pro mini. Теперь хочется расписание подключить))
     
  13. Vad33

    Vad33 Капитан-оригинал

    Ладно, по простому.
    Задаем глобальную переменную flag
    Потом в рабочем цикле считываете дату время
    Код (C++):

    #include <RTC.h>
    RTC    time;
    //...
    boolean flag = false;
    //...

    void setup() {
      //...
      time.begin(RTC_DS1307);
    }

    void loop() {
      //....
      time.gettime();
      if (time.Hours >= 9 && time.Hours < 22 && (time.minutes % 10 == 0)) {
        if (!flag)
        { flag = true;
          //.... тут
          //...  передаем
          //...  что нужно
        }
      } else flag = false;
      //....
    }
     
    Это пример.
    Соответственно, где точки добавляем нужный код или редактируем
     
    Iguana нравится это.
  14. Iguana

    Iguana Нерд

    Я до флагов еще не дошел, но мысль была примерно такая же, только я переменную int пытался сделать. Хорошо, когда кто-то может подсказать, я только начал и сразу залез в сложности, спасибо! Сегодня буду экспериментировать.
    И еще вопрос, в какой программе у вас такой красивый код получается?)
     
  15. Vad33

    Vad33 Капитан-оригинал

    В каком смысле красивый?
     
  16. Viacon

    Viacon Нуб

    Попытался скомпилировать скетч из сообщения "вот что у меня получилось", ошибка:
    Arduino: 1.6.12 (Windows 7), Плата:"Arduino/Genuino Uno"
    D:\Modul DS3231\Time_Temp\Time_Temp.ino:11:20: fatal error: dht11.h: No such file or directory
    compilation terminated.
    exit status 1
    Ошибка компиляции для платы Arduino/Genuino Uno.
    - В какую сторону смотреть? подскажите...
    Пробовал изменить строку: #include <dht11.h>
    на #include <dht.h> - то-же самое:
    Modul DS3231\Time_Temp\Time_Temp.ino:11:18: fatal error: dht.h: No such file or directory
    compilation terminated.
    exit status 1
    Ошибка компиляции для платы Arduino/Genuino Uno.
     
    Последнее редактирование: 23 ноя 2016
  17. Vad33

    Vad33 Капитан-оригинал

    Нужно смотреть в сторону обучения программированию и изучения английского.
     
  18. alp69

    alp69 Форумчанин

    "Данный файл или каталог отсутствует, компиляция прекращена."
    Гуглопереводчик Вас забанил?;)
     
  19. Viacon

    Viacon Нуб

    нет, перевод прочитал самостоятельно. В первом случае библиотеки "dht11.h" дествительно нет, но библиотека "dht.h" присутствует, это и удивляет (второй пример). Библиотеки обновлены.

    Если не сложно, выложи свои библиотеки, и укажи версию ардуино.
     
    Последнее редактирование: 23 ноя 2016
  20. Viacon

    Viacon Нуб

    Скетч запустил, два дня бьюсь, чтобы установить время в DS3132, скетч и библиотеку прикладываю.
    Куда смотреть?
    // функции даты и времени с использованием часов реального времени DS1307, подключенные по I2C. В скетче используется библиотека Wire lib
    // http://arduino-diy.com/arduino-chasy-realnogo-vremeni-DS1307

    #include <Wire.h>

    #include "RTClib.h"

    #include <LiquidCrystal_I2C.h>

    #include <DS3231.h>

    RTC_DS1307 RTC;

    LiquidCrystal_I2C lcd(0x27,20,4);

    void setup () {

    Serial.begin(57600);

    Wire.begin();

    RTC.begin();

    lcd.init(); // Инициализация lcd
    lcd.backlight(); // Включаем подсветку
    lcd.print("Loading");
    delay(1000); // ждем
    lcd.print(".");
    delay(500); // ждем
    lcd.print(".");
    delay(500); // ждем
    lcd.print(".");
    delay(500); // ждем
    lcd.print(".");
    delay(500); // ждем
    lcd.print(".");
    delay(500); // ждем
    lcd.print(".");
    delay(500); // ждем
    lcd.print(".");
    delay(500); // ждем
    lcd.print(".");
    delay(500); // ждем
    lcd.print(".");
    delay(500); // ждем
    lcd.print(".");
    delay(500); // ждем
    lcd.print(".");
    delay(500); // ждем
    lcd.print("OK");
    delay(500); // ждем
    lcd.clear(); //очистка экрана
    if (! RTC.isrunning()) {

    Serial.println("RTC is NOT running!");

    }

    // Serial.print(rtc.getTemp(), C); //вывод температуры в сериал (не удалось...)
    // Поиск возможности установить время и дату:
    // rtc.setDOW(FRIDAY);
    // rtc.setTime(12, 0, 0);
    // rtc.setDate(25, 11, 2016);
    // clock.setDateTime(__DATE__, __TIME__);
    // clock.setDateTime(2016, 3, 1 , 20, 33, 00);
    // Clock.setYear(16); //Задаем год 2016 - две последние цифры
    // Clock.setMonth(1); //Задаем месяц 0-12
    // Clock.setDate(24); //Задаем ден месяца 0-31
    // Clock.setDoW(7); //Задаем день недели 1-7 7-воскресенье
    // Clock.setHour(18); //Задаем время - часы
    // Clock.setMinute(23); //Задаем время - минуты
    // Clock.setSecond(00); //Задаем время - секунды
    // time.settime(0, 0, 15, 25, 11, 2016, 6) // (сек,мин,час,д,м,г,дн)
    // setTime(17, 35, 30, 28, 12, 2015);//выставляем текущее время
    // time.settime(0,3,20,25,11,16); //(сек,мин,час,д,м,г,дн) должен присутствовать хотябы 1 параметр
    // часы указываются в 24-часовом формате, год указывается от 0 до 99, день недели указывается числом: 1-ПН, 2-ВТ, ... 6-СБ, 0-ВС.
    // если предыдущий(ие) параметр(ы) надо оставить без изменений, то указывается отрицательное значение

    }

    void loop () {

    DateTime now = RTC.now();

    // Serial.print(now.day(), DEC); // вывод день
    Serial.print(now.day()/10); // вывод данных с "0" впереди едениц,
    Serial.print(now.day()%10); // если выводятся только еденицы
    lcd.setCursor(0, 0);
    // lcd.print(now.day(), DEC);
    lcd.print(now.day()/10);
    lcd.print(now.day()%10);
    Serial.print('.');
    lcd.print(".");
    // Serial.print(now.month(), DEC); // вывод месяц
    Serial.print(now.month()/10); // вывод данных с "0" впереди едениц,
    Serial.print(now.month()%10); // если выводятся только еденицы
    // lcd.print(now.month(), DEC);
    lcd.print(now.month()/10);
    lcd.print(now.month()%10);

    Serial.print('.');
    lcd.print(".");

    Serial.print(now.year(), DEC); // вывод год
    lcd.print(now.year(), DEC);

    Serial.println(); // перевод на новую строку
    lcd.setCursor(0, 1); // перевод на новую строку

    // Serial.print(now.hour(), DEC); // вывод часов
    Serial.print(now.hour()/10); // вывод данных с "0" впереди едениц,
    Serial.print(now.hour()%10); // если выводятся только еденицы
    // lcd.print(now.hour(), DEC);
    lcd.print(now.hour()/10); // вывод данных с "0" впереди едениц,
    lcd.print(now.hour()%10); // если выводятся только еденицы

    Serial.print(':');
    lcd.print(":");

    // Serial.print(now.minute(), DEC); // вывод минут
    Serial.print(now.minute()/10); // вывод данных с "0" впереди едениц,
    Serial.print(now.minute()%10); // если выводятся только еденицы
    // lcd.print(now.minute(), DEC);
    lcd.print(now.minute()/10); // вывод данных с "0" впереди едениц,
    lcd.print(now.minute()%10); // если выводятся только еденицы

    Serial.print(':');
    lcd.print(":");

    // Serial.print(now.second(), DEC); // вывод секунд
    Serial.print(now.second()/10); // вывод данных с "0" впереди едениц,
    Serial.print(now.second()%10); // если выводятся только еденицы
    // lcd.print(now.second(), DEC)
    lcd.print(now.second()/10); // вывод данных с "0" впереди едениц,
    lcd.print(now.second()%10); // если выводятся только еденицы
    // lcd.clear(); //очистка экрана
    // lcd.setCursor(0, 2);

    Serial.println(); // перевод на новую строку

    Serial.print(" since 1970 = ");

    Serial.print(now.unixtime());

    Serial.print("s = ");

    Serial.print(now.unixtime() / 86400L);

    Serial.println("d");

    // рассчитываем дату: 7 дней и 30 секунд

    DateTime future (now.unixtime() + 7 * 86400L + 30);

    Serial.print(" now + 7d + 30s: ");

    Serial.print(future.day(), DEC);

    Serial.print('/');

    Serial.print(future.month(), DEC);

    Serial.print('/');

    Serial.print(future.year(), DEC);

    Serial.print(' ');

    Serial.print(future.hour(), DEC);

    Serial.print(':');

    Serial.print(future.minute(), DEC);

    Serial.print(':');

    Serial.print(future.second(), DEC);

    Serial.println();

    Serial.println();

    // lcd.setCursor(0, 2); // перевод на новую строку

    delay(1000);

    }
    Нашёл решение:
    RTC.adjust(DateTime(__DATE__, __TIME__));
    Работает при компиляции и заливке скетча - результат -15 сек

    Вот только данные видимо записываются только в ардуинку, а не в часовой модуль - при отсоединении питания и вновь при подаче - данные по времени на экране вновь появляются те, что были при первом запуске (после загрузки скетча). Кто может подсказать как установить время на DS3132? И считывать именно с DS3132?
     

    Вложения:

    • DS3231.zip
      Размер файла:
      28,2 КБ
      Просмотров:
      354
    Последнее редактирование: 28 ноя 2016