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

Тема в разделе "Arduino & Shields", создана пользователем Максим B, 30 мар 2015.

  1. Максим B

    Максим B Гуру

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


    }
     
  2. Максим B

    Максим B Гуру

    Ну вот до сих пор пока не знаю куда копать (((
     
  3. X-Dron

    X-Dron Гик


    мой код для DS3231, может найдете что полезное.
    Код (Text):
    #include <DI.h>
    #include <Meander.h>
    #include <Timer_P.h>
    #include <DS3231.h>
    #include <Wire.h>
    #include <EEPROM.h>
    #include "TM1637.h"

    //Массив, содержащий время компиляции
    char compileTime[] = __TIME__;
    char compileDate[] = __DATE__;

    #define DISPLAY_CLK_PIN 11
    #define DISPLAY_DIO_PIN 12
    #define MODE_KEY_PIN 5
    #define PLUS_KEY_PIN 6
    #define MINUS_KEY_PIN 7

    TM1637 display(DISPLAY_CLK_PIN, DISPLAY_DIO_PIN);
    DS3231 Clock(SDA, SCL);
    Time RTC_Time;
    DI ModeKey(MODE_KEY_PIN, 10), PlusKey(PLUS_KEY_PIN, 10), MinusKey(MINUS_KEY_PIN, 10);
    Timer_P DisplayPeriod, AutoID_Timer, SecsSetted;
    Meander P_s;
    int Mode=0, HourToSet, MinuteToSet, OutPeriod=200;
    boolean ModeKey_old, PlusKey_old, MinusKey_old, Mode2_old, Mode3_old, SecsSetted_old;

    void setup()
    {
      //Serial.begin(115200);
      // Start the I2C interface
      Clock.begin();
      //Включаем и настраиваем индикатор
      display.set();
      display.init();

      //Получаем число из строки, зная номер первого символа
      byte hour = getInt(compileTime, 0);
      byte minute = getInt(compileTime, 3);
      byte second = getInt(compileTime, 6);
     
      unsigned int hash =  hour * 60 * 60 + minute  * 60 + second;
      if (EEPROMReadInt(0) != hash) {
        //Сохраняем новый хэш
        EEPROMWriteInt(0, hash);
        Clock.adjust(compileDate, compileTime);
      }
      pinMode(13, OUTPUT);
    }

    void loop()
    {
      //Запускаем меандр
      P_s.MeanderV(OutPeriod*2, OutPeriod);
      ModeKey.DI_Refresh();
      PlusKey.DI_Refresh();
      MinusKey.DI_Refresh();

      DisplayPeriod.TimerV(!DisplayPeriod.Q0(), 0, 2, OutPeriod); // Самосбрасывающийся таймер периода
      AutoID_Timer.TimerV(!AutoID_Timer.Q0() && (PlusKey.DI_Read() || MinusKey.DI_Read()) && !(PlusKey.DI_Read() && MinusKey.DI_Read()) , 0, 2, OutPeriod*2);
      SecsSetted.TimerV((Mode==1 && ((PlusKey.DI_Read() &&!PlusKey_old) || (MinusKey.DI_Read() && !MinusKey_old))),0,1,1500);

      if (ModeKey.DI_Read() && !ModeKey_old) Mode = (++Mode)%4; //Перебор режимов
      if (!SecsSetted.Q0() && SecsSetted_old) Mode = 2;
      if (Mode ==2  && !Mode2_old) MinuteToSet = RTC_Time.min;
      if (Mode ==3  && !Mode3_old) HourToSet = RTC_Time.hour;

      if (Mode==1 && ((PlusKey.DI_Read() &&!PlusKey_old) || (MinusKey.DI_Read() && !MinusKey_old))) Clock.setSecond(0);
      if (Mode!=2 && Mode2_old) Clock.setMinute(MinuteToSet);
      if (Mode!=3 && Mode3_old) Clock.setHour(HourToSet);
      if ((PlusKey.DI_Read() || MinusKey.DI_Read()) && !(PlusKey.DI_Read() && MinusKey.DI_Read()) && Mode == 2){
        if (PlusKey.DI_Read() && (!PlusKey_old || AutoID_Timer.Q0())) MinuteToSet=(++MinuteToSet)%60;
        if (MinusKey.DI_Read() && (!MinusKey_old || AutoID_Timer.Q0())) MinuteToSet=--MinuteToSet;
        if (MinuteToSet < 0) MinuteToSet = 59;
      }

      if ((PlusKey.DI_Read() || MinusKey.DI_Read()) && !(PlusKey.DI_Read() && MinusKey.DI_Read()) && Mode == 3){
        if (PlusKey.DI_Read() && (!PlusKey_old || AutoID_Timer.Q0())) HourToSet=(++HourToSet)%24;
        if (MinusKey.DI_Read() && (!MinusKey_old || AutoID_Timer.Q0())) HourToSet=--HourToSet;
        if (HourToSet < 0) HourToSet = 24;
      }

      if (DisplayPeriod.Q0()){
          // Get data from the DS3231
          int8_t timeDisp[4];
          //Запрашиваем время
          RTC_Time = Clock.getTime();
       
          //Получаем десятки часов с помощью целочисленного деления
          timeDisp[0] = RTC_Time.hour / 10;
          timeDisp[1] = RTC_Time.hour % 10;
          timeDisp[2] = RTC_Time.min / 10;
          timeDisp[3] = RTC_Time.min % 10;
       
          switch (Mode) {
            case 1:
              //if (P_s.Q0()){
                  timeDisp[0] = 16;
                  timeDisp[1] = 16;
                  timeDisp[2] = 16;
                  timeDisp[3] = 16;
              //}
              break;
            case 2:
              if (P_s.Q0()){
                  timeDisp[2] = MinuteToSet / 10;
                  timeDisp[3] = MinuteToSet % 10;
              }else{
                  timeDisp[2] = 16;
                  timeDisp[3] = 16;
              }
              break;
            case 3:
              if (P_s.Q0()){
                  timeDisp[0] = HourToSet / 10;
                  timeDisp[1] = HourToSet % 10;
              }else{
                  timeDisp[0] = 16;
                  timeDisp[1] = 16;
              }      
              break;
          }
          display.display(timeDisp);
          display.point(((RTC_Time.sec % 2 ? POINT_ON : POINT_OFF) && !SecsSetted.Q0()) || (!P_s.Q0() && SecsSetted.Q0()));
       
          // Send Day-of-Week
          //Serial.print(Clock.getDOWStr());
          //Serial.print(" ");

          // Send date
          //Serial.print(Clock.getDateStr());
          //Serial.print(" -- ");

          // Send time
          //Serial.println(Clock.getTimeStr());
      }
      ModeKey_old = ModeKey.DI_Read();
      PlusKey_old = PlusKey.DI_Read();
      MinusKey_old = MinusKey.DI_Read();
      SecsSetted_old = SecsSetted.Q0();
      Mode2_old = (Mode==2);
      Mode3_old = (Mode==3);
      digitalWrite(13, P_s.Q0());
    }

    //Содержимое функции объяснено ниже
    char getInt(const char* string, int startIndex) {
      return int(string[startIndex] - '0') * 10 + int(string[startIndex+1]) - '0';
    }

    //Запись двухбайтового числа в память
    void EEPROMWriteInt(int address, int value)
    {
      EEPROM.write(address, lowByte(value));
      EEPROM.write(address + 1, highByte(value));
    }
    //Чтение числа из памяти
    unsigned int EEPROMReadInt(int address)
    {
      byte lowByte = EEPROM.read(address);
      byte highByte = EEPROM.read(address + 1);
      return (highByte << 8) | lowByte;
    }
    Модифицированная библиотека TM1637.h, добавлен код для погашенной цифры (16)
    https://yadi.sk/d/k1LxU9fVfhtAP
    Модифицированная библиотека DS3231.h, добавлены методы adjust(compileDate, compileTime), setHour(HourToSet), setMinute(MinuteToSet), Clock.setSecond(0)
    https://yadi.sk/d/yXTxXqXIfhthT
    Набор классов моей библиотеки
    https://yadi.sk/d/hGQy8xu1fZNks
     
  4. Максим B

    Максим B Гуру

    Спасибо, обязательно поковыряю
     
  5. DrProg

    DrProg Вечный нерд

    Бегло просмотрел код, вероятно мне скоро понадобится делать что то подобное. Пока первый вопрос пришедший в голову: а что вы записываете и читаете в EEPROM?
     
  6. X-Dron

    X-Dron Гик

  7. Максим B

    Максим B Гуру