RTC1307 добавить настройку кнопками

mkvmaks
Offline
Зарегистрирован: 07.07.2013

Всем привет. Пытаюсь реализовать настроку часов кнопками (для примера пока использую только 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("	");
       

}

 

bwn
Offline
Зарегистрирован: 25.08.2014

Включить в set_time() строки 19 и 21, в 19 числа заменить на переменные. Сейчас по вашей логике вы будете пытаться устанавливать время при каждом проходе loop().
В loop() предусмотреть условие, по которому устанавливать время. При true, переходим в set_time(), считываем переменные времени, ждем нажатия кнопки. Если нажали - переменная часов+1, далее строки 19 и 21, прошел период ожидания - возврат. Возникает вопрос - часы+1 и сразу запись или надо как то иначе? Если не сделаете возврат по периоду - можете вечно ожидать нажатия кнопки.

Ваш вариант - в loop() поймали кнопку (предусмотреть антидребезг и блокировку), перешли в set_time(), считали переменные времени, прибавили к часам единицу, занесли время как в строках 19 и 21, возврат. Если не предусмотрите блокировку от повторного нажатия, получите значения превышающие час+1. МК достаточно шустрый.

maksmkv
Offline
Зарегистрирован: 07.04.2013

Спасибо, попробую разобраться.

maksmkv
Offline
Зарегистрирован: 07.04.2013
Так правильно поправил??? 
#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("	");
       

}

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

69 строка, хмм... Зачем это так. За что! :)

 

bwn
Offline
Зарегистрирован: 25.08.2014

Из строк 53-62 оставить только 57. 66 думаю тоже не нужна. По 69 kisoft уже сказал, в loop() вернется автоматически. И нужно предусмотреть задержку (можно гнусный delay(), но не кошерно) иначе пока держите кнопку выполнится несколько раз.

Да, и время считать забыли перед изменением.