Добрый день, решил собрать часы с выводом температуры и влажности,я в этом новичке, вроде все получилось но спустя какой то время дисплей за место данной информации начинает выдавать кракозябли. С чем это связано? Еще хотелось узнать как сделать когда время =*** делалось какое либо действие? вот код: Код (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); } }
Типа будильника? Получать время и сравнивать часы и минуты, если совпадают, то запускать процедуру. http://lesson.iarduino.ru/page/podk...lnogo-vremeni-ds1302-ds1307-ds3231-k-arduino/
у меня такое было. Причина - слишком длинные провода до дисплея. При кратковременном пропадании контакта (пошевелили плату) в линии даных тоже срывается синхронизация и дальше идет только мусор. Попробуй раз в N минут сбрасывать дисплей: Код (C++): lcd.init(); delay(50); lcd.clrscr();
поучительно но не нашел как в итоге сделать, я новичке в программирование и большую половину команд не понимаю, пока собираю все копиистом отталкиваясь от минимальных знаний) я часы ели ели подружил с датчиком температуры а LCD неделю заводил пока не наткнулся на скетч сканера портов i2c)))
вот что у меня получилось) Код (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); } }
Чтобы не плодить темы. Использую библиотеку RTC. Никак не могу сообразить, как с 00 минут и через каждые 10 т.е. например в H:00, далее H:10, Н:20 и т.д. минут выполнять действие?
Как вариант % оператор - Возвращает остаток от деления одного целого (int) операнда на другой. x = 7 % 5; // x имеет значение 2 x = 9 % 5; // x имеет значение 4 x = 5 % 5; // x имеет значение 0 x = 4 % 5; // x имеет значение 4
Можно например (как вариант) получать количество минут и если оно точно кратно 10 выполнять действие, но тут два момента. 1) Опрос должен сработать хотя бы раз в минуту. Мало ли какие задержки еще в программе. 2) Нужно сделать флаг срабатывания, чтобы сработало только один раз в течение минуты. а когда время изменится флаг убирать.
Поясню хотелку. Программка для радиолюбительского CW-маяка. Для автономной и точной по времени работы на даче летом хотелось сделать так, чтобы маяк включился в 9:00, передал текст и через каждые 10 минут это повторял до выключения например в 22:00. Сам текст уже передается, задействован pro mini. Теперь хочется расписание подключить))
Ладно, по простому. Задаем глобальную переменную 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; //.... } Это пример. Соответственно, где точки добавляем нужный код или редактируем
Я до флагов еще не дошел, но мысль была примерно такая же, только я переменную int пытался сделать. Хорошо, когда кто-то может подсказать, я только начал и сразу залез в сложности, спасибо! Сегодня буду экспериментировать. И еще вопрос, в какой программе у вас такой красивый код получается?)
Попытался скомпилировать скетч из сообщения "вот что у меня получилось", ошибка: 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.
нет, перевод прочитал самостоятельно. В первом случае библиотеки "dht11.h" дествительно нет, но библиотека "dht.h" присутствует, это и удивляет (второй пример). Библиотеки обновлены. Если не сложно, выложи свои библиотеки, и укажи версию ардуино.
Скетч запустил, два дня бьюсь, чтобы установить время в 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?