RTC1307 добавить настройку кнопками
- Войдите на сайт для отправки комментариев
Пнд, 30/03/2015 - 01:24
Всем привет. Пытаюсь реализовать настроку часов кнопками (для примера пока использую только 1 кнопку).
Вот код. Как правильно реализовать задуманное??? Считал время во временные переменные, по нажатию кнопки сменил часы - а как теперь записать???
#include <Wire.h>
#include "DS1307.h"
//Переменные для сохранения данных часов
int hr_00 =0; //часы
int mn_00 =0; //минуты
int sc_00 =0; //секунды
const int buttonPin = 2; // Кнопка настройки времени
int buttonState = 0;
DS1307 clock;//define a object of DS1307 class
void setup()
{
Serial.begin(9600);
clock.begin();
//clock.fillByYMD(2013,1,19);//Jan 19,2013
//clock.fillByHMS(15,28,30);//15:28 30"
//clock.fillDayOfWeek(SAT);//Saturday
//clock.setTime();//write time to the RTC chip
pinMode(buttonPin, INPUT);
}
void loop()
{
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
hr_00=clock.hour+1;
}
printTime();
}
void read_rtc1307() //чтение времени в переменные
{
clock.getTime();
hr_00=clock.hour;
mn_00=clock.minute;
sc_00=clock.second;
}
void set_time()
{
}
/*Function: Display time on the serial monitor*/
void printTime()
{
read_rtc1307();
clock.getTime();
Serial.print(clock.hour, DEC);
Serial.print(":");
Serial.print(clock.minute, DEC);
Serial.print(":");
Serial.print(clock.second, DEC);
Serial.println(" ");
}
Включить в set_time() строки 19 и 21, в 19 числа заменить на переменные. Сейчас по вашей логике вы будете пытаться устанавливать время при каждом проходе loop().
В loop() предусмотреть условие, по которому устанавливать время. При true, переходим в set_time(), считываем переменные времени, ждем нажатия кнопки. Если нажали - переменная часов+1, далее строки 19 и 21, прошел период ожидания - возврат. Возникает вопрос - часы+1 и сразу запись или надо как то иначе? Если не сделаете возврат по периоду - можете вечно ожидать нажатия кнопки.
Ваш вариант - в loop() поймали кнопку (предусмотреть антидребезг и блокировку), перешли в set_time(), считали переменные времени, прибавили к часам единицу, занесли время как в строках 19 и 21, возврат. Если не предусмотрите блокировку от повторного нажатия, получите значения превышающие час+1. МК достаточно шустрый.
Спасибо, попробую разобраться.
Так правильно поправил??? #include <Wire.h> #include "DS1307.h" //Переменные для сохранения данных часов int hr_00 =0; //часы int mn_00 =0; //минуты int sc_00 =0; //секунды const int buttonPin = 2; // Кнопка настройки времени int buttonState = 0; const int buttonPin3 = 3; // Кнопка добавления 1-го часа DS1307 clock;//define a object of DS1307 class void setup() { Serial.begin(9600); clock.begin(); //clock.fillByYMD(2013,1,19);//Jan 19,2013 //clock.fillByHMS(15,28,30);//15:28 30" //clock.fillDayOfWeek(SAT);//Saturday //clock.setTime();//write time to the RTC chip pinMode(buttonPin, INPUT); } void loop() { buttonState = digitalRead(buttonPin); if (buttonState == HIGH) { set_time(); } printTime(); } void read_rtc1307() //чтение времени в переменные { clock.getTime(); hr_00=clock.hour; mn_00=clock.minute; sc_00=clock.second; } void set_time() { buttonState = digitalRead(buttonPin3); if (buttonState == HIGH) { hr_00=hr_00+1; } else { hr_00=hr_00; } //здесь еще код отображения на дисплее clock.begin(); clock.fillByHMS(hr_00,mn_00,sc_00);//15:28 30" clock.setTime();//write time to the RTC chip void loop(); } /*Function: Display time on the serial monitor*/ void printTime() { read_rtc1307(); clock.getTime(); Serial.print(clock.hour, DEC); Serial.print(":"); Serial.print(clock.minute, DEC); Serial.print(":"); Serial.print(clock.second, DEC); Serial.println(" "); }69 строка, хмм... Зачем это так. За что! :)
Из строк 53-62 оставить только 57. 66 думаю тоже не нужна. По 69 kisoft уже сказал, в loop() вернется автоматически. И нужно предусмотреть задержку (можно гнусный delay(), но не кошерно) иначе пока держите кнопку выполнится несколько раз.
Да, и время считать забыли перед изменением.