пишите для красоты, или в этом есть какой-то скрытый смысл?
Смысла нет. просто раньше почему то по другому не работало, ну или я что то не так делал. Сейчас переписал, все нормально. А на счет красоты... просто как умею)
Чисто интересно, Вы и библиотеку для часов используете, и напрямую регистры часов читаете. Функционал библиотеки чем-то не устраивает?
Все устраивает. Просто я не знаю как еще можно получить переменные часов и минут вот из этого 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); потому чтобез него мигает совсем не красиво. если подскажете как буду очень благодарен.
Ну вот. теперь читаю время из ртс с помощью библиотеки. Так вроде даже короче. И мигать вроде получилось без делей. И еще добавил дату и температуру, хотя наверно это излишне. Посмотрите кто может опытным взглядом, что можно улучшить и исправить?
//Бинарные часы. 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();}
}
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.
Может лучше сохранить данные из rtc.getTime() в локальную переменную, а потом читать значения из переменной, вместо того что бы несколько раз вызывать эту функцию?
делей уберу. кнопки работают и нажимаются. а вот с режимами реально не понимаю. по сериал пишет режим 2, но он почему то не в цикле
while . почему включен режим 2, но while не запуускается.
но он почему то не в цикле
ок. какую функцию у тебя выполняют циклы?
почему бы просто не рулить кнопками переменными режимов и при изменении переменной что-то делать
Извиняюсь если уже отвечали, Вы инкремент и декримент, подобным образом:
пишите для красоты, или в этом есть какой-то скрытый смысл?
Чисто интересно, Вы и библиотеку для часов используете, и напрямую регистры часов читаете. Функционал библиотеки чем-то не устраивает?
m = ++m;
пишите для красоты, или в этом есть какой-то скрытый смысл?
Если m не является эеземпляром класса для которого как-то особо определены операции ++ и =, то никакого смысла в такой записи нет и быть не может.
Вы инкремент и декримент, подобным образом:
1
m = ++m;
пишите для красоты, или в этом есть какой-то скрытый смысл?
Смысла нет. просто раньше почему то по другому не работало, ну или я что то не так делал. Сейчас переписал, все нормально. А на счет красоты... просто как умею)
Чисто интересно, Вы и библиотеку для часов используете, и напрямую регистры часов читаете. Функционал библиотеки чем-то не устраивает?
Все устраивает. Просто я не знаю как еще можно получить переменные часов и минут вот из этого rtc.getTimeStr() ,что бы передавать их еще на сдвиговые регистры (74нс595) потом, а записывать время в ртс так rtc.setTime(h, m, 0); и коротко и удобно.
Сделал сейчас вот так.
Вот так может и выглядит глупо и не красиво, но за то режимы переключаются как надо. Если скажете как лучше, обязательно приму к сведению и попробую переделать. Дальше попробую разобраться с delay(250); потому чтобез него мигает совсем не красиво. если подскажете как буду очень благодарен.
Можно ссылку на библиотеку ds3231, которую Вы используете или, хотя бы, полное название библиотеки?
не помню где скачивал. обычная библиотека. на мою если надо http://my-files.ru/wpseik
Просто я не знаю как еще можно получить переменные часов и минут ... , а потом записывать время в ртс ...
Примерно так:
Ну вот. теперь читаю время из ртс с помощью библиотеки. Так вроде даже короче. И мигать вроде получилось без делей. И еще добавил дату и температуру, хотя наверно это излишне. Посмотрите кто может опытным взглядом, что можно улучшить и исправить?
Вроде больше не используется? Можно убрать.
В тексте одно, а в комментарии другое.
Год указан в ввиде константы, что будет в следующем году и дальше?
Логичнее, для переменных использовать тип byte, для флага - bool, а порты объявить либо как константы, либо через #define.
Может лучше сохранить данные из rtc.getTime() в локальную переменную, а потом читать значения из переменной, вместо того что бы несколько раз вызывать эту функцию?