Установка бинарных часов DS3231

Tails_MP
Tails_MP аватар
Offline
Зарегистрирован: 11.11.2015

делей уберу. кнопки работают и нажимаются. а вот с режимами реально не понимаю. по сериал пишет режим 2, но он почему то не в цикле 

while . почему включен режим 2, но while не запуускается.

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

Tails_MP пишет:

но он почему то не в цикле 

ок. какую функцию у тебя выполняют циклы?

почему бы просто не рулить кнопками переменными режимов и при изменении переменной что-то делать

fogary
Offline
Зарегистрирован: 05.03.2016

Извиняюсь если уже отвечали, Вы инкремент и декримент, подобным образом:

m = ++m;

пишите для красоты, или в этом есть какой-то скрытый смысл?

Чисто интересно, Вы и библиотеку для часов используете, и напрямую регистры часов читаете. Функционал библиотеки чем-то не устраивает?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

fogary пишет:

m = ++m;

пишите для красоты, или в этом есть какой-то скрытый смысл?

Если m не является эеземпляром класса для которого как-то особо определены операции ++ и =, то никакого смысла в такой записи нет и быть не может.

Tails_MP
Tails_MP аватар
Offline
Зарегистрирован: 11.11.2015

Вы инкремент и декримент, подобным образом:

1 m = ++m;

пишите для красоты, или в этом есть какой-то скрытый смысл?

Смысла нет. просто раньше почему то по другому не работало, ну или я что то не  так делал. Сейчас переписал, все нормально. А на счет красоты... просто как умею)

Чисто интересно, Вы и библиотеку для часов используете, и напрямую регистры часов читаете. Функционал библиотеки чем-то не устраивает?

Все устраивает. Просто я не знаю как еще можно получить переменные часов и минут вот из этого rtc.getTimeStr() ,что бы передавать их еще на сдвиговые регистры (74нс595) потом, а записывать время в ртс так rtc.setTime(h, m, 0); и коротко и удобно.

 

 

Сделал сейчас вот так.

//Бинарные часы. Atmega328 16MHz

#include <TimeHelpers.h> //подключаем библиотеки
#include <class_BUTTON.h>
#include <Wire.h>
#include <DS3231.h>

#define DS3231_ADDRESS 0x68
#define BLINK_INTERVAL 500
#define PRINT_INTERVAL _SEC_(1)
#define SERIAL_SPEED 9600

DS3231 rtc(SDA, SCL);
Time RTC_Time;

byte second, minute, hour;   //переменные времени
byte decToBcd (byte val){return((val/10*16)+(val%10));}
byte bcdToDec(byte val){return ((val/16*10)+(val%16));}

int regim=1;   //режим отображения и установки

byte flag_HRead;
byte flag_MRead;

int h=0;   //переменные хранения часов и минут
int m=0;

int latchPin = 11; //порты для вывода на регистры
int clockPin = 13;
int dataPin = 12;

BUTTON Set(5);   // объявляем объект класса BUTTON кнопку с именем Set, подключенную к пину 5.
BUTTON Up(6);    // объявляем объект класса BUTTON кнопку с именем Up, подключенную к пину 6.
BUTTON Down(7);  // объявляем объект класса BUTTON кнопку с именем Down, подключенную к пину 7.
 



void setup() {
    Serial.begin(SERIAL_SPEED);
    Wire.begin();
    rtc.begin();
    pinMode(latchPin, OUTPUT);
    pinMode(clockPin, OUTPUT);
    pinMode(dataPin, OUTPUT);
}

   void read_RTC(){   //чтение данных с RTC
      Wire.beginTransmission(DS3231_ADDRESS);
      Wire.write(0);
      Wire.endTransmission();
      Wire.requestFrom(DS3231_ADDRESS, 7);
      second = bcdToDec(Wire.read());
      minute = bcdToDec(Wire.read());
      hour = bcdToDec(Wire.read() & 0b111111); //24 формат времени
   }

   void print_RTC(){   //показ времени
      read_RTC();
      read_Button();
      DO_EVERY(PRINT_INTERVAL,{
      Serial.print("regim - ");
     // Serial.println(regim);
      Serial.println(rtc.getTimeStr());
      });
      if(Set.retention){
         h=hour;   //присваиваем переменной значение часов
         m=minute;   //присваиваем переменной значение минут
        set_RTC();}   //переходим в режим установки
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin,MSBFIRST, second);
      shiftOut(dataPin, clockPin,MSBFIRST, minute);
      shiftOut(dataPin, clockPin,MSBFIRST, hour);
      digitalWrite(latchPin, HIGH);
   }

   void set_RTC(){   //установка RTC
      DO_EVERY(PRINT_INTERVAL,{
      Serial.println("set_RTC");
      });
      regim=2;


   while(regim==2){
    read_Button();
    DO_EVERY(PRINT_INTERVAL,{
    Serial.print("regim - ");
    //Serial.println(regim);
    Serial.print("часов - ");
    Serial.println(h);
    });
    blink_H(flag_HRead * 250);   //вызываем блинк ртс
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin,MSBFIRST, second);
    shiftOut(dataPin, clockPin,MSBFIRST, m);
    shiftOut(dataPin, clockPin,MSBFIRST, 0);
    digitalWrite(latchPin, HIGH);
     
    if (Up.click_down) {h++;   //увеличиваем часы
    if(h > 23)  {h = 0;}}      //если больше 23 переходим к 0
    if (Down.click_down) {h--;  //уменьшаем часы
    if(h < 0)  {h = 23;}}     //если меньше 0 переходим к 23

      if(Set.click_down){ //если нажать сет
      regim++;}   //прибавляем режим
      
    if(Set.retention){rec_RTC();} //удерживаем Set 3 сек. сохраняем время и выходим из режима установки

    if(Set.timer){Serial.println("Set не трогал 30 сек");}
    }

   while(regim==3){
    read_Button();
    DO_EVERY(PRINT_INTERVAL,{
    Serial.print("regim - ");
    //Serial.println(regim);
    Serial.print("минут - ");
    Serial.println(m);
    });
    blink_M(flag_MRead * 250);
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin,MSBFIRST, second);
    shiftOut(dataPin, clockPin,MSBFIRST, 0);
    shiftOut(dataPin, clockPin,MSBFIRST, h);
    digitalWrite(latchPin, HIGH);
     
    if (Up.click_down) {
      m++;
    if(m > 59)  {m = 0;}}
    if (Down.click_down) {
      m--;
    if(m < 0)  {m = 59;}}

    if(Set.click_down){
       regim--;
       set_RTC();
      }

    if(Set.retention){rec_RTC();}
    }

      
}   

   void rec_RTC(){   //запись данных в RTC
    rtc.setTime(h, m, 0);
    regim=1;
   }

   void read_Button(){   //чтение состояния кнопок
    Set.read();
    Up.read();
    Down.read();
   }

   void blink_H(unsigned long interval){   //мигаем переменной часов в установке
    static unsigned long prevTime=0;
    if(millis() - prevTime > interval){
    static boolean flagH = 0;
    prevTime = millis();
    flagH =! flagH;
    if(flagH){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin,MSBFIRST, second);
    shiftOut(dataPin, clockPin,MSBFIRST, m);
    shiftOut(dataPin, clockPin,MSBFIRST, h);
    digitalWrite(latchPin, HIGH);
    delay(250);
    flag_HRead = 1;
    }
   }
  }
   
   void blink_M(unsigned long interval){   //мигаем переменной минут в установке
    static unsigned long prevTime=0;
    if(millis() - prevTime > interval){
    static boolean flagM = 0;
    prevTime = millis();
    flagM =! flagM;
    if(flagM){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin,MSBFIRST, second);
    shiftOut(dataPin, clockPin,MSBFIRST, m);
    shiftOut(dataPin, clockPin,MSBFIRST, h);
    digitalWrite(latchPin, HIGH);
    delay(250);
    flag_MRead = 1;
    }
   }
  }
   


void loop() {

   if(regim==1){print_RTC();}

}

    

 

Вот так может и выглядит глупо и не красиво, но за то режимы переключаются как надо. Если скажете как лучше, обязательно приму к сведению и попробую переделать. Дальше попробую разобраться с delay(250); потому чтобез него мигает совсем не красиво. если подскажете как буду очень благодарен.

 

fogary
Offline
Зарегистрирован: 05.03.2016

Можно ссылку на библиотеку ds3231, которую Вы используете или, хотя бы, полное название библиотеки?

Tails_MP
Tails_MP аватар
Offline
Зарегистрирован: 11.11.2015

не помню где скачивал. обычная библиотека. на мою если надо http://my-files.ru/wpseik

fogary
Offline
Зарегистрирован: 05.03.2016

Tails_MP пишет:

Просто я не знаю как еще можно получить переменные часов и минут ... , а потом записывать время в ртс ...

Примерно так:

#include <DS3231.h>

...

DS3231 Clock(SDA, SCL);
Time RTC_Time;

void setup()
{
  ...

  Clock.begin();

  ...
}

void loop()
{
  //Для запроса времени в структуру "Time"
  RTC_Time = Clock.getTime();

  byte hour = RTC_Time.hour;
  byte minute = RTC_Time.min;
  byte second = RTC_Time.sec;

  ...

  Clock.setTime(hour, min, sec); 

  ...
}

 

Tails_MP
Tails_MP аватар
Offline
Зарегистрирован: 11.11.2015

Ну вот. теперь читаю время из ртс с помощью библиотеки. Так вроде даже короче. И мигать вроде получилось без делей. И еще добавил дату и температуру, хотя наверно это излишне. Посмотрите кто может опытным взглядом, что можно улучшить и исправить?

//Бинарные часы. Atmega328 16MHz

#include <TimeHelpers.h> //подключаем библиотеки
#include <class_BUTTON.h>
#include <DS3231.h>

#define DS3231_ADDRESS 0x68
#define BLINK_INTERVAL 500
#define PRINT_INTERVAL _SEC_(1)
#define SERIAL_SPEED 9600

DS3231 rtc(SDA, SCL);
Time RTC_Time;

byte mon, date;  //переменные даты
byte second, minute, hour;   //переменные времени
byte decToBcd (byte val){return((val/10*16)+(val%10));}
byte bcdToDec(byte val){return ((val/16*10)+(val%16));}

int regim=1;   //режим отображения и установки

int flagRead=0;   //переменные для блинка

int h=0;   //переменные хранения часов и минут
int m=0;

int mo=0;   //переменные хранения месяца и числа
int da=0;

int latchPin = 11; //порты для вывода на регистры
int clockPin = 13;
int dataPin = 12;

BUTTON Set(5);   // объявляем объект класса BUTTON кнопку с именем Set, подключенную к пину 5.
BUTTON Up(6);    // объявляем объект класса BUTTON кнопку с именем Up, подключенную к пину 6.
BUTTON Down(7);  // объявляем объект класса BUTTON кнопку с именем Down, подключенную к пину 7.
 



void setup() {
    Serial.begin(SERIAL_SPEED);
    rtc.begin();
    pinMode(latchPin, OUTPUT);
    pinMode(clockPin, OUTPUT);
    pinMode(dataPin, OUTPUT);
}

   void read_RTC(){   //чтение данных с RTC
      RTC_Time = rtc.getTime();
      mon = RTC_Time.mon;
      date = RTC_Time.date;
      hour = RTC_Time.hour;
      minute = RTC_Time.min;
      second = RTC_Time.sec;
   }

   void print_RTC(){   //показ времени
      read_RTC();
      read_Button();
      DO_EVERY(PRINT_INTERVAL,{
      Serial.print("regim - ");
     // Serial.println(regim);
      Serial.println(rtc.getTimeStr());
      });
      
      if(Set.retention){
         h=hour;   //присваиваем переменной значение часов
         m=minute;   //присваиваем переменной значение минут
        set_RTC();}   //переходим в режим установки
        
       if(Up.retention){
        mo=mon;
        da=date;
        set_Data();}
        
       if(Up.click_up){data();}
       
       if(Down.click_up){temp();}
       
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin,MSBFIRST, second);
      shiftOut(dataPin, clockPin,MSBFIRST, minute);
      shiftOut(dataPin, clockPin,MSBFIRST, hour);
      digitalWrite(latchPin, HIGH);
   }

   void read_Button(){   //чтение состояния кнопок
    Set.read();
    Up.read();
    Down.read();
   }



   void set_RTC(){   //установка RTC
      DO_EVERY(PRINT_INTERVAL,{
      Serial.println("set_RTC");
      });
      regim=2;


   while(regim==2){
    read_Button();
    DO_EVERY(PRINT_INTERVAL,{
    Serial.print("regim - ");
    //Serial.println(regim);
    Serial.print("часов - ");
    Serial.println(h);
    });
    blink_H(flagRead * 250);   //вызываем блинк ртс
    if (Up.click_down) {h++;   //увеличиваем часы
    if(h > 23)  {h = 0;}}      //если больше 23 переходим к 0
    if (Down.click_down) {h--;  //уменьшаем часы
    if(h < 0)  {h = 23;}}     //если меньше 0 переходим к 23

      if(Set.click_down){ //если нажать сет
      regim++;}   //прибавляем режим
      
    if(Set.retention){rec_RTC();} //удерживаем Set 3 сек. сохраняем время и выходим из режима установки

    if(Set.timer){Serial.println("Set не трогал 30 сек");}
    }

   while(regim==3){
    read_Button();
    DO_EVERY(PRINT_INTERVAL,{
    Serial.print("regim - ");
    //Serial.println(regim);
    Serial.print("минут - ");
    Serial.println(m);
    });
    blink_M(flagRead * 250);
    if (Up.click_down) {
      m++;
    if(m > 59)  {m = 0;}}
    if (Down.click_down) {
      m--;
    if(m < 0)  {m = 59;}}

    if(Set.click_down){
       regim--;
       set_RTC();
      }

    if(Set.retention){rec_RTC();}
    }

      
}   

   void rec_RTC(){   //запись данных в RTC
    rtc.setTime(h, m, 0);
    regim=1;
   }

   void blink_H(unsigned long interval){   //мигаем переменной часов в установке
    static unsigned long prevTime=0;
    if(millis() - prevTime > interval){
    static boolean flag = 0;
    prevTime = millis();
    flag =! flag;
    if(flag){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin,MSBFIRST, second);
    shiftOut(dataPin, clockPin,MSBFIRST, m);
    shiftOut(dataPin, clockPin,MSBFIRST, h);
    digitalWrite(latchPin, HIGH);
    flagRead = 1;
    }
    else{
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin,MSBFIRST, second);
    shiftOut(dataPin, clockPin,MSBFIRST, m);
    shiftOut(dataPin, clockPin,MSBFIRST, 0);
    digitalWrite(latchPin, HIGH);
    flagRead = 1;
     }
    }
   }
  
   void blink_M(unsigned long interval){   //мигаем переменной минут в установке
    static unsigned long prevTime=0;
    if(millis() - prevTime > interval){
    static boolean flag = 0;
    prevTime = millis();
    flag =! flag;
    if(flag){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin,MSBFIRST, second);
    shiftOut(dataPin, clockPin,MSBFIRST, m);
    shiftOut(dataPin, clockPin,MSBFIRST, h);
    digitalWrite(latchPin, HIGH);
    flagRead = 1;
    }
    else{
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin,MSBFIRST, second);
    shiftOut(dataPin, clockPin,MSBFIRST, 0);
    shiftOut(dataPin, clockPin,MSBFIRST, h);
    digitalWrite(latchPin, HIGH);
    flagRead = 1;
    }
   }
  }




   void set_Data(){   //установка Даты
      DO_EVERY(PRINT_INTERVAL,{
      Serial.println("set_Data");
      });
      regim=2;


   while(regim==2){
    read_Button();
    DO_EVERY(PRINT_INTERVAL,{
    Serial.print("regim - ");
    //Serial.println(regim);
    Serial.print("месяц - ");
    Serial.println(mo);
    });
    blink_MO(flagRead * 250);   //вызываем блинк ртс
    if (Up.click_down) {mo++;   //увеличиваем часы
    if(mo > 12)  {mo = 1;}}      //если больше 23 переходим к 0
    if (Down.click_down) {mo--;  //уменьшаем часы
    if(mo < 1)  {mo = 12;}}     //если меньше 0 переходим к 23

      if(Set.click_down){ //если нажать сет
      regim++;}   //прибавляем режим
      
    if(Set.retention){rec_Data();} //удерживаем Set 3 сек. сохраняем время и выходим из режима установки

    if(Set.timer){Serial.println("Set не трогал 30 сек");}
    }

   while(regim==3){
    read_Button();
    DO_EVERY(PRINT_INTERVAL,{
    Serial.print("regim - ");
    //Serial.println(regim);
    Serial.print("число - ");
    Serial.println(da);
    });
    blink_DA(flagRead * 250);
    if (Up.click_down) {
      da++;
    if(da > 31)  {da = 1;}}
    if (Down.click_down) {
      da--;
    if(da < 1)  {da = 31;}}

    if(Set.click_down){
       regim--;
       set_Data();
      }

    if(Set.retention){rec_Data();}
    }
      
}

   void rec_Data(){   //запись данных в RTC
    rtc.setDate(da, mo, 2016);
    regim=1;
   }

    void blink_MO(unsigned long interval){   //мигаем переменной месяца в установке
    static unsigned long prevTime=0;
    if(millis() - prevTime > interval){
    static boolean flag = 0;
    prevTime = millis();
    flag =! flag;
    if(flag){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin,MSBFIRST, da);
    shiftOut(dataPin, clockPin,MSBFIRST, mo);
    digitalWrite(latchPin, HIGH);
    flagRead = 1;}
    
    else{
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin,MSBFIRST, da);
    shiftOut(dataPin, clockPin,MSBFIRST, 0);
    digitalWrite(latchPin, HIGH);
    flagRead = 1;
    }
   }
  }

    void blink_DA(unsigned long interval){   //мигаем переменной числа в установке
    static unsigned long prevTime=0;
    if(millis() - prevTime > interval){
    static boolean flagDA = 0;
    prevTime = millis();
    flagDA =! flagDA;
    if(flagDA){
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin,MSBFIRST, da);
    shiftOut(dataPin, clockPin,MSBFIRST, mo);
    digitalWrite(latchPin, HIGH);
    flagRead = 1;
    }
    else{
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin,MSBFIRST, 0);
    shiftOut(dataPin, clockPin,MSBFIRST, mo);
    digitalWrite(latchPin, HIGH);
    flagRead = 1;
    }
   }
  }



   void temp(){    //показ температуры
        digitalWrite(latchPin, LOW);
        shiftOut(dataPin, clockPin,MSBFIRST, 0);
        shiftOut(dataPin, clockPin,MSBFIRST, rtc.getTemp());
        shiftOut(dataPin, clockPin,MSBFIRST, 0);
        digitalWrite(latchPin, HIGH);
        Serial.println("Temp");
        Serial.println(rtc.getTemp());
        delay(2000);
        print_RTC();
   }

   void data(){     //показ даты (месяц. число.)
        digitalWrite(latchPin, LOW);
        shiftOut(dataPin, clockPin,MSBFIRST, 0);
        shiftOut(dataPin, clockPin,MSBFIRST, rtc.getTime().date);
        shiftOut(dataPin, clockPin,MSBFIRST, rtc.getTime().mon);
        digitalWrite(latchPin, HIGH);
        Serial.print("Data ");
        Serial.print(rtc.getTime().date);
        Serial.print(" - ");
        Serial.print(rtc.getTime().mon);
        Serial.print(" - ");
        Serial.println(rtc.getTime().year);
        delay(2000);
        print_RTC();
   }



void loop() {

   if(regim==1){print_RTC();}

}

    

 

fogary
Offline
Зарегистрирован: 05.03.2016
	#define DS3231_ADDRESS 0x68

Вроде больше не используется? Можно убрать.

 

if (Up.click_down) {mo++;   //увеличиваем часы
    if(mo > 12)  {mo = 1;}}      //если больше 23 переходим к 0
if (Down.click_down) {mo--;  //уменьшаем часы
    if(mo < 1)  {mo = 12;}}     //если меньше 0 переходим к 23

В тексте одно, а в комментарии другое.

 

void rec_Data(){   //запись данных в RTC
    rtc.setDate(da, mo, 2016);
    regim=1;
}

Год указан в ввиде константы, что будет в следующем году и дальше?

 

int regim=1;   //режим отображения и установки

int flagRead=0;   //переменные для блинка

int h=0;   //переменные хранения часов и минут
int m=0;
int mo=0;   //переменные хранения месяца и числа
int da=0;

int latchPin = 11; //порты для вывода на регистры
int clockPin = 13;
int dataPin = 12;

Логичнее, для переменных использовать тип byte, для флага - bool, а порты объявить либо как константы, либо через #define.

 

void data(){     //показ даты (месяц. число.)
        digitalWrite(latchPin, LOW);
        shiftOut(dataPin, clockPin,MSBFIRST, 0);
        shiftOut(dataPin, clockPin,MSBFIRST, rtc.getTime().date);
        shiftOut(dataPin, clockPin,MSBFIRST, rtc.getTime().mon);
        digitalWrite(latchPin, HIGH);
        Serial.print("Data ");
        Serial.print(rtc.getTime().date);
        Serial.print(" - ");
        Serial.print(rtc.getTime().mon);
        Serial.print(" - ");
        Serial.println(rtc.getTime().year);
        delay(2000);
        print_RTC();
}

Может лучше сохранить данные из rtc.getTime() в локальную переменную, а потом читать значения из переменной, вместо того что бы несколько раз вызывать эту функцию?