RTC (DS1307) с ARDUINO
- Войдите на сайт для отправки комментариев
Вс, 29/01/2012 - 18:00
#include <LiquidCrystal.h> #include <WProgram.h> #include <Wire.h> #include <DS1307.h> //Переменные для сохранения данных часов int hr_00; //часы int mn_00; //минуты int sc_00; //секунды int DD_00; //дни int MM_00; //месяцы int YY_00; //годы char delitel = ':'; //разделитель времени для отображения void setup() { LiquidCrystal lcd(7, 6, 5, 4, 3, 2); lcd.begin(16,2); lcd.clear(); delay(1); } void loop() { read_rtc1307();//прочитать время в переменные rtc1307LCD(); //отобразить переменные времени на экран delay(1); } void read_rtc1307() { hr_00=RTC.get(DS1307_HR,true); mn_00=RTC.get(DS1307_MIN,false); sc_00=RTC.get(DS1307_SEC,false); DD_00=RTC.get(DS1307_DATE,false); MM_00=RTC.get(DS1307_MTH,false); YY_00=RTC.get(DS1307_YR,false); } void rtc1307LCD() { LiquidCrystal lcd(7, 6, 5, 4, 3, 2); lcd.begin(16,2); lcd.setCursor (0,0); lcd.print (hr_00); lcd.setCursor (2,0); lcd.print (delitel); lcd.setCursor (3,0); lcd.print (mn_00); lcd.setCursor (5,0); lcd.print (delitel); lcd.setCursor (6,0); lcd.print (sc_00); lcd.setCursor (0,1); lcd.print (DD_00); lcd.setCursor (2,1); lcd.print ('-'); lcd.setCursor (3,1); lcd.print (MM_00); lcd.setCursor (4,1); lcd.print ('-'); lcd.setCursor (5,1); lcd.print (YY_00); delay(1000); lcd.clear(); }
Все работает, но проблема немогу придумать как сделать установку часов, минут и т.д с кнопок.
А еще каждую секунду экра поддергивается. Помогите пожалуйста, я начинающий.........................
void rtc1307LCD() {
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
lcd.begin(16,2);
lcd.setCursor (0,0);
[...]
delay(1000);
lcd.clear();
}
Расскажите, из каких соображений производится инициализация объекта lcd при каждом выводе на дисплей?
И зачем вы стираете выведенную информацию после секундной задержки?
А без иницилизации нечего и неработало.
производится инициализация объекта lcd при каждом выводе на дисплей?
подсказка - есть секция setup, у вас там уже все прописано. По поводу установок - нужно писать управляемую менюшку и "окно" ввода инфо. Пробуйте, учитесь, я тут где то выкладывал код для большой менюшки.
А не подскажете где можно увидеть это меню, ну я думал сделать меню на основе switch case...... ну что неполучилось.
http://arduino.ru/forum/programmirovanie/menyu-dlya-tekstovogo-lcd-pomogite-optimizirovat
Спасибо. А мой код сверху можете взглянуть и сказать, что не так.................
Вместо
void var2LCD() {
lcd.clear(); //Очистка экрана
//Координаты ; Текст
lcd.setCursor (0,0); lcd.print (hr_00);
lcd.setCursor (2,0); lcd.print (delitel);
lcd.setCursor (3,0); lcd.print (mn_00);
lcd.setCursor (5,0); lcd.print (delitel);
lcd.setCursor (6,0); lcd.print (sc_00);
lcd.setCursor (0,1); lcd.print (DD_00);
lcd.setCursor (2,1); lcd.print ('-');
lcd.setCursor (3,1); lcd.print (MM_00);
lcd.setCursor (5,1); lcd.print ('-');
lcd.setCursor (6,1); lcd.print (YY_00);
}
Я бы написал
В крайнем случае так:
Спасибо. А что означает
А немогли бы посмотреть на мои кнопки установок времени, может что то нетак я прописал..............
"%" означает, что дальше идут символы форматирования
"02" - спецификатор ширины поля (2 символа), 0 указывает на то, что пустые позиции заполняются нулями.
"d" - вывод в формате целого числа
"-" - все, что стоит после спецификатора типа до следующего знака процента поступает на выход без изменения.
Подробнее прочитайте хотя бы здесь:
cppworld.h16.ru/stdc/stdio.htm
Спасибо. Буду изучать..........
Все заработало как надо, теперь работаю над кнопками установки времени...........
Не пойму почему все компилируется правильно но в желелезе неработает, подскажите пожалуйста где я неправильно написал код..........
Можно понатыкать Serial.println() с разными буквами и посмотреть где застревает
Все заработало как надо, теперь работаю над кнопками установки времени...........
И с чего бы вашей программе работать, если вы почти не оставили ей шансов среагировать на нажатие кнопок. Сделать это она может лишь в короткие промежутки времени между длительными блокировками микроконтроллера.
lcd.begin(16,2); - здесь производится инициализация дисплея. С очисткой от имеющейся на нем информации.
[...]
lcd.print(buffer);
delay (1000);
lcd.clear(); - здесь вы выводите информацию, ждете секунду (а по существу блокируете микроконтроллер на все это время), а потом стираете все.
Лучше сделать так: в начале процедуры стереть информацию с экрана (lcd.clear();), потом сформировать выводимый текст и вывести его на дисплей (lcd.print(buffer);). И ВСЕ! никаких инициализаций дисплея не требуется - она должна выполняться ОДИН РАЗ - в setup(). И НИКАКИХ delay(1000) - это самый надежный способ угробить любой работающий алгоритм.
Чтобы не слишком часто выполнять вывод на экран, в главном цикле (функция loop()) вызов процедуры read_rtc1307() делайте не каждый раз, а, например, по итогам проверки текущего времени:
if(millis()%1000==0) read_rtc1307();
(вывод каждую тысячную миллисекунду)
или if(millis()%1000<2) read_rtc1307();
(во втором случае - вывод каждую тысячную и тысяча первую миллисекунду (сделано с запасом, т.к. я не знаю, за сколько миллисекунд у вас прокручивается цикл )
Более аккуратный вариант - ввести переменную, в которой будет храниться время (в миллисекундах) последнего вывода на дисплей и определять момент очередного обновления текста на дисплее по количеству миллисекунд, прошедших с момента последнего обновления:
if(millis()-lastLcdModiified>1000) read_rtc1307();
и в начале процедуры read_rtc1307(): lastLcdModiified = millis();
Только после того, как избавитесь от вызванных безумными задержками ( = блокировками микроконтроллера) побочных эффектов (грубо: кнопка нажимается, а контроллер никак на это не реагирует), начинайте отлавливать другие баги.
И, поскольку опыта в программировании у вас пока с Гулькин ..., не пытайтесь реализовать сразу весь алгоритм - с работающей основы и добавляйте по одной реакции/функции. Только отладив очередной блок операторов, переходите к вводу нового. Иначе просто утонете в отладке.
Спасибо за дельный совет, буду пробывать.
Осталось разобратся с кнопками и с конструкцией switch case..................
что значит - не работает?
Время не отображается?
Или функция set_rtc1307 не вызывается?
Что означает вот этот оператор (строка 65):
if(digitalRead(8) == HIGH&&X == 0)
Почему пин 8 не проинициализирован как вход?
Почему пин 11 объявлен в качестве входа, но не используется в программе?
Не задумывались о том, чтобы выводить отладочную информацию в окно терминала (в setup() создать объект Serial и во всех отлаживаемых местах поставить Serial.println("Отладочное сообщение"))?
Зачем вам нужен счет с 0 до 60? Всегда полагал, что секунды и минуты изменяются в диапазоне от 0 до 59. Ну, можно еще от 1 до 60. Но от 0 до 60 зачем?
А по существу вопроса: перепишите строки 18-19 в виде
if (bbuttonPresses > 60)
buttonPresses = -1;
Спасибо за помощь. Зачем мне от 0 до 60 ?....это простоя делал с кнопкапками экспиременты, но а так для часов я собирался изменять диапазон от 0 до 59. Я в плотную изучаю ввод с кнопок, что бы у меня больше невозникало "глупых" вопросов. Все свои "удачные" экспиременты записываю в свою электронно - бумажную записную книжку, что бы если что где то вдруг забыл можно было бы подглядеть..................