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

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

Во втором вы каждые полсекунды заходите и тут же вылетаете. В первом значение на полсекунды замораживается, а строки с 7 по 11 подозреваю, вы просто не видите.
Мне почему и не нравится ваш подход, где все в loop. Вы должны заходить в функцию отображения и принимать рещение об инверсии по миллис. А все остальное время крутиться в loop и отслеживать кнопки и прочее.
Примерно, как здесь. В начале у dimax на собаке сделано, а дальше есть у меня на миллис. Идея примерно такая же. Включено-выключено, но нет делаев.

 

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

bwn пишет:

Мне почему и не нравится ваш подход, где все в loop. 

 

Я просто не умею по другому, вообще не предстовляю как это можно сделать. Я вообще не программист, и никогда раньше этим не занимался(( а так хотелось((

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

А я и вовсе металлург, потом барыга-директор, а ныне ЛПХшник. В школе не информатику, а логарифмическую линеку изучал, и что из этого? Выведите это мигание в отдельную функцию и возвращайтесь в нее каждые полсекунды, по типу как я ссылку сбросил. Ваша даже проще выходит, не надо if-else.

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

что то я слабо что понял... можно примерчик как замутить. хотя бы схематично

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

Примерно так:
Есть постоянно крутящийся loop, при каждом проходе он вызывает последовательно объявленные функции. Пример на который давал ссылку, есть функция с параметром (чтобы гибко менять интервал, для постоянного интервала параметр не нужен). Мы попадаем в функцию, проверяем условие,  false, вернулись в loop и занялись другими делами. И так пока не станет true. После чего отработали функцию и начали все сначала. Ничто не запрещает вызывать функцию из функции.
Как пример, использование собаки. Выводим сброс в отдельную функцию, вызываем и сбрасываем при каждом проходе loop. Если вошли в меню организованное на while, то делаем и из него вызов той же функции сброса.
Вашу задачу разделил бы на функции считывания времени, отображения, мигания, выбора режима, установки минут, установки часов, сохранения значений.
Установку часов и минут закольцевал бы при помощи while (не лазать в loop и не вносить путаницу).
В итоге, при выборе режима установки, считываем значения времени, заходим в установку минут и крутимся в ожидании кнопок, при этом вызываем функцию мигания, установили требуемые минуты, нажали set (или еще как) и перешли в функцию установки часов (там все делаем аналогично). При выходе из установки часов, вызвали функцию записи времени и вернулись loop.  Выход можно организовать как по событию (кнопки), так и по таймеру (десять секунд ни одна кнопка не нажата, возврат).
Вернувшись в loop, считываем время, отображаем, ждем события от кнопок.

Поподробнее с миллис.

P/S при таком подходе, приходится начинать писать с более низкоуровневых функций, которые потом начинаем группировать в loop и между собой. Зато при изменении программы не требуется перелопачивать всю портянку, а достаточно написать еще одну функцию и добавить ее вызов из нужных мест.

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

Здравствуйте многоуважаемый Bwn! Подскажите пожалуйсто, я двигаюсь в правельном направлении?

#include <ButtonHelper.h>
#include "Wire.h"
#include <DS3231.h>
DS3231 rtc(SDA, SCL);
Time RTC_Time;

#define DS3231_ADDRESS 0x68
int latchPin = 11;
int clockPin = 13;
int dataPin = 12;


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


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




void readButt(){
  Set.read(); // обновл¤ем состо¤ние переменных кнопки Set.
  Up.read(); // обновл¤ем состо¤ние переменных кнопки Up.
  Down.read(); // обновл¤ем состо¤ние переменных кнопки Down.
}

void printDate(){
Wire.beginTransmission(DS3231_ADDRESS);
Wire.write(0);
Wire.endTransmission();
Wire.requestFrom(DS3231_ADDRESS, 7);
int second = bcdToDec(Wire.read());
int minute = bcdToDec(Wire.read());
int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
int dow = bcdToDec(Wire.read()); //0-6 -> sunday — Saturday
int day = bcdToDec(Wire.read());
int month = bcdToDec(Wire.read());
int year = bcdToDec(Wire.read());

digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin,MSBFIRST, second);
shiftOut(dataPin, clockPin,MSBFIRST, minute); 
shiftOut(dataPin, clockPin,MSBFIRST, hour);
digitalWrite(latchPin, HIGH);
}


void setDateTime(){
if (Set.timer){
byte second = 0; //0-59
byte minute = 03; //0-59
byte hour = 19; //0-23
byte dow = 2; //1-7
byte day = 8; //1-31
byte month = 11; //1-12
byte year = 11; //0-99
Wire.beginTransmission(DS3231_ADDRESS);
Wire.write(0); //stop Oscillator
Wire.write(decToBcd(second));
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour));
Wire.write(decToBcd(day)); //число
Wire.write(decToBcd(dow)); //день недели
Wire.write(decToBcd(month));
Wire.write(decToBcd(year));
Wire.write(0); //start 
Wire.endTransmission();
}
}

void loop(){
  printDate();
  setDateTime();
  readButt();
}

  byte decToBcd(byte val){return ( (val/10*16) + (val%10) );}
  byte bcdToDec(byte val){return ( (val/16*10) + (val%16) );}

 

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

Tails_MP пишет:

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

голова болит, пошел спать((

класс титановый велосипед для delay без delay().

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

В целом да. В setDate  вам надо попадать по какому то действию кнопки, а функцию разбить на: считывание данных с RTC, потом изменение минут-часов кнопками, запись новых значений в RTC, возврат в loop.
Строки с 37 по 47 лучше вынести  в отдельную типа readRtc. Чтобы не маяться со значениями, секунды минуты часы, объявить глобальными переменными. И не понял, зачем там int, вроде все в byte  должно помещаться, кроме года.

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

bwn пишет:

Строки с 37 по 47 лучше вынести  в отдельную типа readRtc. Чтобы не маяться со значениями, секунды минуты часы, объявить глобальными переменными.

пробовал вынести 

почему то не получилось. Точнее знаю почему, но не знаю как исправить. А получилось вот что, секунды, минуты и часы в printDate оказались не задекларированы, как сделать ссылку из printDate в readRtc.

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

 

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

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

Когда вошли в printDate, из нее сперва заходим  в readRtc, а далее отображаем обновленные глобальные минуты-часы. Глобальные переменные после объявления доступны из любой части скетча.
А readRtc у вас будет использоваться два раза - при отображении и корректировке времени. Можно ее прямо написать два раза, но в следующий раз может потребоваться десять и т.д.

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

bwn пишет:

Когда вошли в printDate, из нее сперва заходим  в readRtc, а далее отображаем обновленные глобальные минуты-часы.

что то я нихрена не догнал((( компилируется, но не одно значение не отображает. не один светодиод не горит.

#include <ButtonHelper.h>
#include "Wire.h"
#include <DS3231.h>
DS3231 rtc(SDA, SCL);
Time RTC_Time;

#define DS3231_ADDRESS 0x68
int latchPin = 11;
int clockPin = 13;
int dataPin = 12;

byte second ; //0-59
byte minute ; //0-59
byte hour ; //0-23

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


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




void readButt(){
  Set.read(); // обновл¤ем состо¤ние переменных кнопки Set.
  Up.read(); // обновл¤ем состо¤ние переменных кнопки Up.
  Down.read(); // обновл¤ем состо¤ние переменных кнопки Down.
}

void readRtc(){
  Wire.beginTransmission(DS3231_ADDRESS);
  Wire.write(0);
  Wire.endTransmission();
  Wire.requestFrom(DS3231_ADDRESS, 7);
  byte second = bcdToDec(Wire.read());
  byte minute = bcdToDec(Wire.read());
  byte hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
}

void printTime(){
  readRtc();
//Wire.beginTransmission(DS3231_ADDRESS);
//Wire.write(0);
//Wire.endTransmission();
//Wire.requestFrom(DS3231_ADDRESS, 7);
//byte second = bcdToDec(Wire.read());
//byte minute = bcdToDec(Wire.read());
//byte hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
//int dow = bcdToDec(Wire.read()); //0-6 -> sunday — Saturday
//int day = bcdToDec(Wire.read());
//int month = bcdToDec(Wire.read());
//int year = bcdToDec(Wire.read());

digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin,MSBFIRST, second);
shiftOut(dataPin, clockPin,MSBFIRST, minute); 
shiftOut(dataPin, clockPin,MSBFIRST, hour);
digitalWrite(latchPin, HIGH);
}


void setDateTime(){
if (Set.timer){
byte second = 0; //0-59
byte minute = 03; //0-59
byte hour = 19; //0-23
//byte dow = 2; //1-7
//byte day = 8; //1-31
//byte month = 11; //1-12
//byte year = 11; //0-99
Wire.beginTransmission(DS3231_ADDRESS);
Wire.write(0); //stop Oscillator
Wire.write(decToBcd(second));
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour));
//Wire.write(decToBcd(day)); //число
//Wire.write(decToBcd(dow)); //день недели
//Wire.write(decToBcd(month));
//Wire.write(decToBcd(year));
Wire.write(0); //start 
Wire.endTransmission();
}
}

void loop(){
  printTime();
  setDateTime();
  readButt();
  readRtc();
}

  byte decToBcd(byte val)
  {
    return ( (val/10*16) + (val%10) );
    }
  byte bcdToDec(byte val)
  {
    return ( (val/16*10) + (val%16) );
    }

 

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

Вот так тоже компилируется и загружается, но время сразу замирает на месте, это  из за того что конвертация глобальных переменных (секунды, минуты, часы) происходит всего один раз в начале скетча, а если пихнуть конвертацию в void loop ,то он говарит что bcdToDec не задекларировано, это из за того что конвертация глобыльных переменных (секунды, минуты, часы) должна произойти раньше чем void loop. Вот такой замкнутый круг....

#include <ButtonHelper.h>
#include "Wire.h"
#include <DS3231.h>
DS3231 rtc(SDA, SCL);
Time RTC_Time;

#define DS3231_ADDRESS 0x68

int latchPin = 11;
int clockPin = 13;
int dataPin = 12;

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


  byte decToBcd(byte val)
  {
    return ( (val/10*16) + (val%10) );
    }
  byte bcdToDec(byte val)
  {
    return ( (val/16*10) + (val%16) );
    }

int second = bcdToDec(Wire.read());
int minute = bcdToDec(Wire.read());
int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time



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




void readButt(){
  Set.read(); // обновл¤ем состо¤ние переменных кнопки Set.
  Up.read(); // обновл¤ем состо¤ние переменных кнопки Up.
  Down.read(); // обновл¤ем состо¤ние переменных кнопки Down.
}

void readRtc(){
Wire.beginTransmission(DS3231_ADDRESS);
Wire.write(0);
Wire.endTransmission();
Wire.requestFrom(DS3231_ADDRESS, 7);
//int second = bcdToDec(Wire.read());
//int minute = bcdToDec(Wire.read());
//int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
int dow = bcdToDec(Wire.read()); //0-6 -> sunday — Saturday
int day = bcdToDec(Wire.read());
int month = bcdToDec(Wire.read());
int year = bcdToDec(Wire.read());
int getTemp = bcdToDec(Wire.read());
}

void printTime(){
  readRtc();
/*Wire.beginTransmission(DS3231_ADDRESS);
Wire.write(0);
Wire.endTransmission();
Wire.requestFrom(DS3231_ADDRESS, 7);
int second = bcdToDec(Wire.read());
int minute = bcdToDec(Wire.read());
int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
int dow = bcdToDec(Wire.read()); //0-6 -> sunday — Saturday
int day = bcdToDec(Wire.read());
int month = bcdToDec(Wire.read());
int year = bcdToDec(Wire.read());
int getTemp = bcdToDec(Wire.read());
*/
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin,MSBFIRST, second);
shiftOut(dataPin, clockPin,MSBFIRST, minute); 
shiftOut(dataPin, clockPin,MSBFIRST, hour);
digitalWrite(latchPin, HIGH);
}


void setDateTime(){
if (Set.timer){
byte second = 0; //0-59
byte minute = 03; //0-59
byte hour = 19; //0-23
Wire.beginTransmission(DS3231_ADDRESS);
Wire.write(0); //stop Oscillator
Wire.write(decToBcd(second));
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour));
Wire.write(0); //start 
Wire.endTransmission();
}
}

void loop(){
  readRtc();
  printTime();
  setDateTime();
  readButt();
}

/*
  byte decToBcd(byte val)
  {
    return ( (val/10*16) + (val%10) );
    }
  byte bcdToDec(byte val)
  {
    return ( (val/16*10) + (val%16) );
    }
*/

 

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

А что на это говорит?

#include <ButtonHelper.h>
#include "Wire.h"
#include <DS3231.h>
DS3231 rtc(SDA, SCL);
Time RTC_Time;

#define DS3231_ADDRESS 0x68
int latchPin = 11;
int clockPin = 13;
int dataPin = 12;

  byte second;
  byte minute;
  byte hour;
  byte dow;
  byte day;
  byte month;
  byte year;


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


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


void readButt(){
  Set.read(); // обновл¤ем состо¤ние переменных кнопки Set.
  Up.read(); // обновл¤ем состо¤ние переменных кнопки Up.
  Down.read(); // обновл¤ем состо¤ние переменных кнопки Down.
}

void readRtc() {
  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 hour time
  dow = bcdToDec(Wire.read()); //0-6 -> sunday — Saturday
  day = bcdToDec(Wire.read());
  month = bcdToDec(Wire.read());
  year = bcdToDec(Wire.read());
}
  

void printDate(){
  readRtc();
//Wire.beginTransmission(DS3231_ADDRESS);
//Wire.write(0);
//Wire.endTransmission();
//Wire.requestFrom(DS3231_ADDRESS, 7);
//int second = bcdToDec(Wire.read());
//int minute = bcdToDec(Wire.read());
//int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
//int dow = bcdToDec(Wire.read()); //0-6 -> sunday — Saturday
//int day = bcdToDec(Wire.read());
//int month = bcdToDec(Wire.read());
//int year = bcdToDec(Wire.read());

digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin,MSBFIRST, second);
shiftOut(dataPin, clockPin,MSBFIRST, minute); 
shiftOut(dataPin, clockPin,MSBFIRST, hour);
digitalWrite(latchPin, HIGH);
}


void setDateTime(){
//if (Set.timer){
//byte second = 0; //0-59
//byte minute = 03; //0-59
//byte hour = 19; //0-23
//byte dow = 2; //1-7
//byte day = 8; //1-31
//byte month = 11; //1-12
//byte year = 11; //0-99
//Wire.beginTransmission(DS3231_ADDRESS);
//Wire.write(0); //stop Oscillator
//Wire.write(decToBcd(second));
//Wire.write(decToBcd(minute));
//Wire.write(decToBcd(hour));
//Wire.write(decToBcd(day)); //число
//Wire.write(decToBcd(dow)); //день недели
//Wire.write(decToBcd(month));
//Wire.write(decToBcd(year));
//Wire.write(0); //start 
//Wire.endTransmission();
//}
}

void loop(){
  printDate();
  setDateTime();
  readButt();
}

  byte decToBcd(byte val){return ( (val/10*16) + (val%10) );}
  byte bcdToDec(byte val){return ( (val/16*10) + (val%16) );}

У меня всех библиотек нет, ругается на кнопки.

В коде из 61 поста должны быть одни нули. Переменные объявлены два раза, есть глобальные сек,мин,часов и локальные с теми же именами. Функция присваивает значения  локальным, а вывод производите глобальных.

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

объ¤вл¤ем объект класса BUTTON кнопку с именем BUTTON_01, подключенную к пину 5.

нда. ладно, народ тырит код, но что бы пиздили комменты #4 к коду - такое первый раз наблюдаю. :D

 

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

Клапауций 232 пишет:

объ¤вл¤ем объект класса BUTTON кнопку с именем BUTTON_01, подключенную к пину 5.

нда. ладно, народ тырит код, но что бы пиздили комменты #4 к коду - такое первый раз наблюдаю. :D

 

Так он вроде где то на твоем кнопочном лисапеде ездит. Оттуда и комменты.

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

bwn пишет:

Так он вроде где то на твоем кнопочном лисапеде ездит. Оттуда и комменты.

я так и подозревал, но в этот код этот коммент вообще не лепится.

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

Клапауций 232 пишет:

bwn пишет:

Так он вроде где то на твоем кнопочном лисапеде ездит. Оттуда и комменты.

я так и подозревал, но в этот код этот коммент вообще не лепится.

Он мне сослался, что лисапед там: #include <ButtonHelper.h>. Я "...h" делать не умею, дальше не залезал.

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

bwn пишет:

Он мне сослался, что лисапед там: #include <ButtonHelper.h>. Я "...h" делать не умею, дальше не залезал.

я тоже не умею - тупо вписал код велосипеда в файл .h и оно работает, хотя не должно.

но не суть - если титановый велосипед, то где он?

это что ли #include <ButtonHelper.h>? - смысл было переименовывать class_BUTTON.h

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

Клапауций 232 пишет:

bwn пишет:

Он мне сослался, что лисапед там: #include <ButtonHelper.h>. Я "...h" делать не умею, дальше не залезал.

я тоже не умею - тупо вписал код велосипеда в файл .h и оно работает, хотя не должно.

но не суть - если титановый велосипед, то где он?

это что ли #include <ButtonHelper.h>? - смысл было переименовывать class_BUTTON.h

Это у ТС спрашивай, работа кнопок его устраивала, я к ним не подходил. Только на лисапед ссылку давал.

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

Клапауций 232 пишет:

объ¤вл¤ем объект класса BUTTON кнопку с именем BUTTON_01, подключенную к пину 5.

нда. ладно, народ тырит код, но что бы пиздили комменты #4 к коду - такое первый раз наблюдаю. :D

 

ты же их для общего пользования выложил (за что тебе большое спасибо), так сказать для народа... Дак почему же ты говариш что я ворую твой код? а комменты просто не убрал, и написал что бы для себя было удобнеей. Вам то они все равно не нужны, Вы в коде и так все видите. На счет *.h просто создал текстовый файл с таким расширением, скопировал туда код, и указал его как библеотеку. Как сделать правильно, или как было Задумано Вами не знаю, по крайне мере вроде как все работает и меня устраивает, если знаете как можно сделать лучше, как правильно с радостью выслушаю и сделаю как лучше, ибо я не программист и буду рад любой помощи.

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

bwn пишет:

А что на это говорит?

говарит что все работает

bwn пишет:

 

В коде из 61 поста должны быть одни нули. Переменные объявлены два раза, есть глобальные сек,мин,часов и локальные с теми же именами. Функция присваивает значения  локальным, а вывод производите глобальных.

ошибку понял, спасибо за подсказку

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

Tails_MP пишет:

ты же их для общего пользования выложил (за что тебе большое спасибо), так сказать для народа... Дак почему же ты говариш что я ворую твой код? а комменты просто не убрал, и написал что бы для себя было удобнеей. Вам то они все равно не нужны, Вы в коде и так все видите.

конечно - всё для народа, всё для людей.

но...

если ты желаешь опубликовать свой код с использованием сторонних библиотек/классов/пр., то для того, что бы кто-то смог понять, что ты используешь в #include  и найти ошибки в твоём коде - плохая идея переименовывать class_BUTTON.h в нечто только тебе понятное.

*т.е. ты понимаешь, что даже я - автор class_BUTTON.h не понял, зачем ты юзаешь ButtonHelper.h с моими комментами. тем более, мало у кого возникнет желание возиться и переименовывать свой class_BUTTON.h в твой ButtonHelper.h или в твоём коде - заменять ButtonHelper.h на class_BUTTON.h

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

Клапауций 232 пишет:

если ты желаешь опубликовать свой код с использованием сторонних библиотек/классов/пр., то для того, что бы кто-то смог понять, что ты используешь в #include  и найти ошибки в твоём коде - плохая идея переименовывать class_BUTTON.h в нечто только тебе понятное.

*т.е. ты понимаешь, что даже я - автор class_BUTTON.h не понял, зачем ты юзаешь ButtonHelper.h с моими комментами. тем более, мало у кого возникнет желание возиться и переименовывать свой class_BUTTON.h в твой ButtonHelper.h или в твоём коде - заменять ButtonHelper.h на class_BUTTON.h

Полностью поддерживаю.

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

я в 38 посте спрашивал как нормально пихнуть этот класс в библиотеку, на этот счет мне ничего не ответили, и я сделал как сумел.

если название должно быть class_BUTTON.h то так я и сделаю. а подключать то так же как библиотеку его? то есть все тоже самое но сменить имя?

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

Tails_MP пишет:

я в 38 посте спрашивал как нормально пихнуть этот класс в библиотеку, на этот счет мне ничего не ответили, и я сделал как сумел.

и, кто кроме тебя об этом знает?

ты мог просто прочитать тему, откуда класс взял #186

Tails_MP пишет:

если название должно быть class_BUTTON.h то так я и сделаю. а подключать то так же как библиотеку его? то есть все тоже самое но сменить имя?

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

как подключать, сказал выше.

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

Клапауций 232 , обязательно сделаю как Вы сказали. Пока дальше заниматься некогда, надеюсь на выходных будет побольше времени и смогу продолжить написание кода.

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

Приветствую всех. Долго не мог продолжить, и как только начал, сразу затык...

1 - как остановить void printDate() при входе в режим настройки

2 - не получилось организовать switch...case в режиме настройки

3 - и так и не смог сделать адекватный блинк, не на собаке, не на милис

4 - так и не смог присвоить переменным "h" и "m" значение часов и минут

вот такое г... получилось пока

#include <TimeHelpers.h>
#include <class_BUTTON.h>
#include "Wire.h"
#include <DS3231.h>
DS3231 rtc(SDA, SCL);
Time RTC_Time;

#define DS3231_ADDRESS 0x68
int latchPin = 11;
int clockPin = 13;
int dataPin = 12;

  byte second;
  byte minute;
  byte hour;
  byte dow;
  byte day;
  byte month;
  byte year;

int regim = 0; //режим настройки часов
int h=0; //переменная для хранения часов
int m=0; //переменная для хранения минут
#define  BLINK_INTERVAL 500
#define  PRINT_INTERVAL _SEC_(1)

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


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

//==============================================================
void readButt(){
  Set.read(); // обновл§ем состо§ние переменных кнопки Set.
  Up.read(); // обновл§ем состо§ние переменных кнопки Up.
  Down.read(); // обновл§ем состо§ние переменных кнопки Down.
}
//======================================================
void readRtc() {
  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 hour time
  dow = bcdToDec(Wire.read()); //0-6 -> sunday Ч Saturday
  day = bcdToDec(Wire.read());
  month = bcdToDec(Wire.read());
  year = bcdToDec(Wire.read());
}
  
//=====================================================
void printDate(){
  readRtc();
DO_EVERY(PRINT_INTERVAL,{
  Serial.print("Время - ");
Serial.println(rtc.getTimeStr());
});
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin,MSBFIRST, second);
shiftOut(dataPin, clockPin,MSBFIRST, minute); 
shiftOut(dataPin, clockPin,MSBFIRST, hour);
digitalWrite(latchPin, HIGH);
}

//=============================================

void setDateTime(){

if (Set.timer){regim++;}
if(regim>2){regim=1;}

if(regim==1){
    DO_EVERY(PRINT_INTERVAL,{
    Serial.println("Regim-1");
    Serial.println(h);
    blinkH();
    });
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin,MSBFIRST, second);
    shiftOut(dataPin, clockPin,MSBFIRST, minute);
    shiftOut(dataPin, clockPin,MSBFIRST, h);
    digitalWrite(latchPin, HIGH);
    if (Up.click_down) {h = ++h;
    if(h > 23)  {h = 0;}}
    if (Down.click_down) {h = --h;
    if(h < 0)  {h = 23;}}
    if (Set.doubleclick) {rtc.setTime(h, minute, 00);
    regim=0;}}


if(regim==2){
    DO_EVERY(PRINT_INTERVAL,{
    Serial.println("Regim-2");
    Serial.println(m);
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin,MSBFIRST, second);
    shiftOut(dataPin, clockPin,MSBFIRST, m);
    shiftOut(dataPin, clockPin,MSBFIRST, h);
    digitalWrite(latchPin, HIGH);});
    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 = ++m;
    if(m > 59)  {m = 0;}}
    if (Down.click_down) {m = --m;
    if(m < 0)  {m = 59;}}
    if (Set.doubleclick) {rtc.setTime(h, m, 00);
    regim=0;}}}
/*
void setDateTime(){
 
if (Set.timer) 
{regim++;
if(regim>3){regim=0;}

   DO_EVERY(PRINT_INTERVAL,{
    Serial.println("Режим установки времени");
     Serial.println(regim);
  });
  int h = hour;
  int m = minute;
  
switch (regim) {
    case 1:
      DO_EVERY(BLINK_INTERVAL,{
      blinkH();
      Serial.println("Настройка часов");
  });
    if (Up.click_down) {h = ++h;
    if(h > 23)  {h = 0;}}
    if (Down.click_down) {h = --h;
    if(h < 0)  {h = 23;}}
      break;
      
    case 2:
       DO_EVERY(BLINK_INTERVAL,{
       blinkM();
       Serial.println("Настройка минут");
  });
    if (Up.click_down) {m = ++m;
    if(m > 59)  {m = 0;}}
    if (Down.click_down) {m = --m;
    if(m < 0)  {m = 59;}}
      break;
  }

//byte second = 0; //0-59
//byte minute = 03; //0-59
//byte hour = 19; //0-23
//byte dow = 2; //1-7
//byte day = 8; //1-31
//byte month = 11; //1-12
//byte year = 11; //0-99
//Wire.beginTransmission(DS3231_ADDRESS);
//Wire.write(0); //stop Oscillator
//Wire.write(decToBcd(second));
//Wire.write(decToBcd(minute));
//Wire.write(decToBcd(hour));
//Wire.write(decToBcd(day)); //число
//Wire.write(decToBcd(dow)); //день недели
//Wire.write(decToBcd(month));
//Wire.write(decToBcd(year));
//Wire.write(0); //start 
//Wire.endTransmission();
//}
}
}
*/
//======================================
void blinkH(){
  readRtc();
DO_EVERY(BLINK_INTERVAL,{
Serial.println("Blink_H_ON");
  static boolean flagBlink = 0;
    static unsigned long prevTime = 0;
  if (millis() - prevTime > 500)
  prevTime = millis();
flagBlink =! flagBlink;
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin,MSBFIRST, second);
shiftOut(dataPin, clockPin,MSBFIRST, minute); 
shiftOut(dataPin, clockPin,MSBFIRST, 0);
digitalWrite(latchPin, HIGH); 
 });
}
//========================================

void blinkM(){
  readRtc();
DO_EVERY(BLINK_INTERVAL,{
Serial.println("Blink_M_ON");
 });
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin,MSBFIRST, second);
shiftOut(dataPin, clockPin,MSBFIRST, 0); 
shiftOut(dataPin, clockPin,MSBFIRST, hour);
digitalWrite(latchPin, HIGH);
}
//=========================================

void loop(){
  printDate();
  setDateTime();
  readButt();
}

  byte decToBcd(byte val){return ( (val/10*16) + (val%10) );}
  byte bcdToDec(byte val){return ( (val/16*10) + (val%16) );}

 

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

1 - нашел исправил (можно ведь так?)

2 - не разобрался

3 - пока на delay()

4 - получилось, но это явно не то как должно быть

Помогите.... Плиииизззз.....((((

#include <TimeHelpers.h>
#include <class_BUTTON.h>
#include "Wire.h"
#include <DS3231.h>
DS3231 rtc(SDA, SCL);
Time RTC_Time;

#define DS3231_ADDRESS 0x68
int latchPin = 11;
int clockPin = 13;
int dataPin = 12;

  byte second;
  byte minute;
  byte hour;
  byte dow;
  byte day;
  byte month;
  byte year;

int h=0; //переменная для хранения часов
int m=0; //переменная для хранения минут
int regim = 0; //режим настройки часов

#define  BLINK_INTERVAL 500
#define  PRINT_INTERVAL _SEC_(1)

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


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

//==============================================================
void readButt(){
  Set.read(); // обновл§ем состо§ние переменных кнопки Set.
  Up.read(); // обновл§ем состо§ние переменных кнопки Up.
  Down.read(); // обновл§ем состо§ние переменных кнопки Down.
}
//======================================================
void readRtc() {
  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 hour time
  dow = bcdToDec(Wire.read()); //0-6 -> sunday Ч Saturday
  day = bcdToDec(Wire.read());
  month = bcdToDec(Wire.read());
  year = bcdToDec(Wire.read());
}
  
//=====================================================
void printTime(){
  readRtc();
DO_EVERY(BLINK_INTERVAL,{
  Serial.print("Время - ");
Serial.println(rtc.getTimeStr());
});
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin,MSBFIRST, second);
shiftOut(dataPin, clockPin,MSBFIRST, minute); 
shiftOut(dataPin, clockPin,MSBFIRST, hour);
digitalWrite(latchPin, HIGH);
}

//=============================================

void setDateTime(){
if (Set.timer)
{
  regim++;
  (Set.retention);{   //задержка 5 сек что бы прировнять переменным h и m значение часов (1раз)
    h=hour;
    m=minute;}
  }
if(regim>2){regim=1;}

if(regim==1){
    DO_EVERY(BLINK_INTERVAL,{
    Serial.println("Regim-1");
    Serial.println(h);
    blinkH();
    });
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin,MSBFIRST, second);
    shiftOut(dataPin, clockPin,MSBFIRST, m);
    shiftOut(dataPin, clockPin,MSBFIRST, h);
    digitalWrite(latchPin, HIGH);
    
    if (Up.click_down) {h = ++h;
    if(h > 23)  {h = 0;}}
    if (Down.click_down) {h = --h;
    if(h < 0)  {h = 23;}}
    if (Set.doubleclick) {rtc.setTime(h, m, 00);
    regim=0;}}


if(regim==2){
    DO_EVERY(BLINK_INTERVAL,{
    Serial.println("Regim-2");
    Serial.println(m);
    blinkM();
    });
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin,MSBFIRST, second);
    shiftOut(dataPin, clockPin,MSBFIRST, m);
    shiftOut(dataPin, clockPin,MSBFIRST, h);
    digitalWrite(latchPin, HIGH);
    
    if (Up.click_down) {m = ++m;
    if(m > 59)  {m = 0;}}
    if (Down.click_down) {m = --m;
    if(m < 0)  {m = 59;}}
    if (Set.doubleclick) {rtc.setTime(h, m, 00);
    regim=0;}}}

//======================================
void blinkH(){
  readRtc();
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin,MSBFIRST, second);
shiftOut(dataPin, clockPin,MSBFIRST, m); 
shiftOut(dataPin, clockPin,MSBFIRST, 0);
digitalWrite(latchPin, HIGH); 
delay(250);
}
//========================================

void blinkM(){
  readRtc();
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin,MSBFIRST, second);
shiftOut(dataPin, clockPin,MSBFIRST, 0); 
shiftOut(dataPin, clockPin,MSBFIRST, h);
digitalWrite(latchPin, HIGH);
delay(250);
}
//=========================================

void loop(){
  if (regim==0){printTime();}
  readButt();
  setDateTime();
}

  byte decToBcd(byte val){return ( (val/10*16) + (val%10) );}
  byte bcdToDec(byte val){return ( (val/16*10) + (val%16) );}

 

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

Огороды пока.((((

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

вот и я понимаю что бред... а раздуплица не могу пока. правда и сидел не долго. времени мало.

подумаю еще, может чего выйдет

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

Сам бы сделал иначе, вход в установку не постоянный, а по событию. А в функции установки кручусь в while, пока не понадобиться перейти к следующему или вернуться в основной цикл.

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

Почему не получается перейти из режима в режим? Нажимаю Set на 3 сек, попадаю в первый режим, тут же перескакиваю на второй и зависаю... В чем может быть дело?

//Бинарные часы. 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=0;   //режим отображения и установки

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.println(rtc.getTimeStr());
      });
      if(Set.timer){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");
      });
      h=hour;   //присваиваем переменной значение часов
      m=minute;   //присваиваем переменной значение минут
      regim++;


   while(regim==1){
    read_Button();
    DO_EVERY(PRINT_INTERVAL,{
    Serial.println("Regim-1");
    Serial.println(h);
    });
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin,MSBFIRST, second);
    shiftOut(dataPin, clockPin,MSBFIRST, m);
    shiftOut(dataPin, clockPin,MSBFIRST, h);
    digitalWrite(latchPin, HIGH);
     
    if (Up.click_down) {h = ++h;
    if(h > 23)  {h = 0;}}
    if (Down.click_down) {h = --h;
    if(h < 0)  {h = 23;}}
    if(Set.click_down){
      ++regim;//переход в режим установки минут
    }
    if(Set.timer){rec_RTC();}}

   while(regim==2){
    read_Button();
    DO_EVERY(PRINT_INTERVAL,{
    Serial.println("Regim-2");
    Serial.println(m);
    });
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin,MSBFIRST, second);
    shiftOut(dataPin, clockPin,MSBFIRST, m);
    shiftOut(dataPin, clockPin,MSBFIRST, h);
    digitalWrite(latchPin, HIGH);
     
    if (Up.click_down) {m = ++m;
    if(m > 59)  {m = 0;}}
    if (Down.click_down) {m = --m;
    if(m < 0)  {m = 59;}}
    if(Set.click_down){
     --regim;//переход в режим установки часов
    }
    if(Set.timer){rec_RTC();}}

      
}   

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

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

   void blink_H(){   //мигаем переменной часов в установке
    
   }

   void blin_M(){   //мигаем переменной минут в установке
    
   }
   


void loop() {

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

}

    

 

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

Код не рассматривал, если переход во второй режим тоже по Set, надо делать задержку или менять логику перехода во второй режим, иначе событие воспринимается два раза.

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

да переход по Set. и как сделать что бы он не перескакивал?

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

Вот еще непонятки. 

    так вообще чего то не срабатывает

if(Set.retention && Up.retention && Down.retention){regim=0;}

а тут...

    if(Set.retention || Up.retention || Down.retention){regim=0;} //если 30 сек ничего не нажато, переходим в отображение времени без сохранения

тут почему то не учитываются кнопки Up и Down. пробовал и так && и так &.

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

И мигание получилось без задержки. т.е оно мигает, но очень быстро и бледно.

 

//Бинарные часы. 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=0;   //режим отображения и установки

byte flag_HRead;

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.println(rtc.getTimeStr());
      });
      if(Set.timer){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");
      });
      h=hour;   //присваиваем переменной значение часов
      m=minute;   //присваиваем переменной значение минут
      regim++;
      if(regim>2){regim=1;}


   while(regim==1){
    read_Button();
    DO_EVERY(PRINT_INTERVAL,{
    Serial.println("Regim-1");
    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 = ++h;
    if(h > 23)  {h = 0;}}
    if (Down.click_down) {h = --h;
    if(h < 0)  {h = 23;}}

    if(Set.timer){rec_RTC();}
    if(Set.retention || Up.retention || Down.retention){regim=0;} //если 30 сек ничего не нажато, переходим в отображение времени без сохранения
    }

   while(regim==2){
    read_Button();
    DO_EVERY(PRINT_INTERVAL,{
    Serial.println("Regim-2");
    Serial.println(m);
    });
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin,MSBFIRST, second);
    shiftOut(dataPin, clockPin,MSBFIRST, m);
    shiftOut(dataPin, clockPin,MSBFIRST, h);
    digitalWrite(latchPin, HIGH);
     
    if (Up.click_down) {m = ++m;
    if(m > 59)  {m = 0;}}
    if (Down.click_down) {m = --m;
    if(m < 0)  {m = 59;}}

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

      
}   

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

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

   void blink_H(unsigned long interval){   //мигаем переменной часов в установке
        DO_EVERY(PRINT_INTERVAL,{
    Serial.println("BLINK_H");
    });
    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);
    flag_HRead = 1;
    }
   }
  }
   
   void blin_M(){   //мигаем переменной минут в установке
    
   }
   


void loop() {

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

    

 

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

Вы перед ифами проверьте через сериал, какие они значения принимают, а дальше искать, где косяк.

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

а как это сделать? ^__^

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

Serial.println(Set.retention); и т.д. Теоретически так.

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

они по отдельности все нормально делают, а вместе не хотят работать. только одна кнопка проверяется

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

а с переходом в другой режим по кнопке Set, не получится ли такой фигни как на форуме развели что при одних условиях генерируется сразу два события. Ну это когда я удерживаю кнопку Set для перехода в режим настройки, и тут же переключаюсь с первого на второй режим их за того что кнопка нажата, а при click_down у меня должен переключаться с режима настройки часов на настройку минут, и т.д. Клапуции!!! Помоги мне разобраться с твоим творением! Оно мне очень нравится и я не хочу от него отказываться. Кстати ты и с проверко сразу трех кнопок наверно тоже знаеш что делать...

И еще маленький вопрос по поводу класса. timer и retention перепутаны названиями что ли? или это я дурак? просто у меня  timer  отслеживает нажатия и удержание, а retention отслеживает бездействие. В описании класса в статье и в самом классе наоборот. Я что то не понимаю?

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

ну и обвязка... и все ради одной кнопки... 

ладно, переделал как надо)

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

теперь как то так 

//Бинарные часы. 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=0;   //режим отображения и установки

byte flag_HRead;

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.println(rtc.getTimeStr());
      });
      if(Set.retention){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");
      });
      h=hour;   //присваиваем переменной значение часов
      m=minute;   //присваиваем переменной значение минут
      regim++;
      if(regim>2){regim=1;}


   while(regim==1){
    read_Button();
    DO_EVERY(PRINT_INTERVAL,{
    Serial.println("Regim-1");
      Serial.println(Set.timer);
      Serial.println(Up.timer);
      Serial.println(Down.timer);
    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 = ++h;
    if(h > 23)  {h = 0;}}
    if (Down.click_down) {h = --h;
    if(h < 0)  {h = 23;}}

    if(Set.retention){rec_RTC();}
    if(Set.timer)
    {
    Serial.println("Set не трогал 5 сек");
    //else if(Up.retention)Serial.println("Up не трогал 5 сек");
    //else if(Down.retention)Serial.println("Down не трогал 5 сек");
    }
    }

   while(regim==2){
    read_Button();
    DO_EVERY(PRINT_INTERVAL,{
    Serial.println("Regim-2");
    Serial.println(m);
    });
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin,MSBFIRST, second);
    shiftOut(dataPin, clockPin,MSBFIRST, m);
    shiftOut(dataPin, clockPin,MSBFIRST, h);
    digitalWrite(latchPin, HIGH);
     
    if (Up.click_down) {m = ++m;
    if(m > 59)  {m = 0;}}
    if (Down.click_down) {m = --m;
    if(m < 0)  {m = 59;}}

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

      
}   

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

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

   void blink_H(unsigned long interval){   //мигаем переменной часов в установке
        DO_EVERY(PRINT_INTERVAL,{
    Serial.println("BLINK_H");
    });
    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);
    flag_HRead = 1;
    }
   }
  }
   
   void blin_M(){   //мигаем переменной минут в установке
    
   }
   


void loop() {

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

    

 

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

Tails_MP пишет:

Клапуции!!! Помоги мне разобраться с твоим творением! Оно мне очень нравится и я не хочу от него отказываться. Кстати ты и с проверко сразу трех кнопок наверно тоже знаеш что делать...

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

Tails_MP пишет:

И еще маленький вопрос по поводу класса. timer и retention перепутаны названиями что ли? или это я дурак? 

если ты считаешь, что какие-то переменные имеют неправильный смысл в переводе с канонического ангельского на язык аборигенов снежной Суберии, то просто смотришь сюда: #1

static const byte bounce_            =   50; // длительность отслеживания дребезга.
static const byte doubleclick_       =  200; // длительность отслеживания двойного клика.
static const unsigned long timer_    = 5000; // длительность отслеживания неактивности.
static const unsigned int retention_ = 2000; // длительность отслеживания нажатия и удержания.

Tails_MP пишет:

просто у меня  timer  отслеживает нажатия и удержание, а retention отслеживает бездействие.

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


#include <class_BUTTON.h>

BUTTON BUTTON_01( 3);

void setup() {
pinMode(14, OUTPUT); // LED_01
digitalWrite(14, 1);
}

void loop() {

BUTTON_01.read();

if (BUTTON_01.retention) {digitalWrite(14, 0);} // включение светодиода при удержании кнопки в течении 2-х секунд.
if (BUTTON_01.timer)     {digitalWrite(14, 1);} // отключение светодиода при неактивности кнопки в течении 5 секунд.

}

Tails_MP пишет:

В описании класса в статье

какой статье?

ты точно читаешь тему класс титановый велосипед для тактовой кнопки. ?

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

Но ведь зашел таки, и суток не прошло) Я точно читаю класс титановый велосипед. С timer и retention разобрался. Было не правильное подключение кнопок, сделал как это было задумано у тебя (подтянул кнопки к +5 вольт через резисторы), а у меня было к минусу. Вопрос в том как проверить состояние сразу трех кнопок на timer. Вот так оно не работает. 

if(Set.retention && Up.retention && Down.retention){

//делаем что то если хотябы одна кнопка не нажата 5 сек

}

 И как зайти в Set_RTC по удержанию кнопки Up.timer, и не перескачить с режима установки часов-минут

по нажатию кнопки Set.click_down?

Вы уж простите что я что то не понимаю, просто прошу помощи у умных и образованных людей

которые в отличие от меня понимают в программировании.

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

Tails_MP пишет:

Вопрос в том как проверить состояние сразу трех кнопок на timer. Вот так оно не работает. 

if(Set.retention && Up.retention && Down.retention) {}

никак: *.retention - это не состояние, а событие актуальное один цикл работы программы.

для срабатывания условия Set.retention && Up.retention && Down.retention нужно нажать три кнопки с точностью обработки одного цикла программы, что вручную сделать практически невозможно... или не пользоваться кнопками никогда.

Tails_MP пишет:

И как зайти в Set_RTC по удержанию кнопки Up.timer, и не перескачить с режима установки часов-минут

по нажатию кнопки Set.click_down?

никак: Up.timer - это событие происходящее после неактивности кнопки, а не удержания

если ты имел ввиду *.retention, то if (Up.retention) {Set_RTC;}

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

случайное сообщение

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

Tails_MP пишет:

Тьюу ты... вот так имел ввиду

Вопрос в том как проверить состояние сразу трех кнопок на timer. Вот так оно не работает. 

if(Set.timer && Up.timer && Down.timer){

//делаем что то если хотябы одна кнопка не нажата 5 сек

}

 И как зайти в Set_RTC по удержанию кнопки Set.retention, и не перескачить с режима установки часов-минут

по нажатию кнопки Set.click_down?

Вы уж простите что я что то не понимаю, просто прошу помощи у умных и образованных людей

которые в отличие от меня понимают в программировании.

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

что там у тебя за глюки?

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

Почему при переключения режима я попадаю куда надо но программа зависает и ни чего не работает.

происходит вот что. Режим установки работает нормально, я удерживаю Set три секунды и попадаю в режим 2(установка часов), устанавливаю время, нажимаю Set.click_down попадаю в режим 3 (установка минут), опять нажимаю Set.click_down включается второй режим, но он почему то висит и ни чего не работает
 

//Бинарные часы. 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){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");
      });
      h=hour;   //присваиваем переменной значение часов
      m=minute;   //присваиваем переменной значение минут
      regim++;


   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 = ++h;
    if(h > 23)  {h = 0;}}
    if (Down.click_down) {h = --h;
    if(h < 0)  {h = 23;}}

    if(Set.retention){rec_RTC();}
    if(Set.click_down){
      regim = ++regim;
    }
    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 = ++m;
    if(m > 59)  {m = 0;}}
    if (Down.click_down) {m = --m;
    if(m < 0)  {m = 59;}}

    if(Set.retention){rec_RTC();}
    if(Set.click_down){
      regim = --regim;
     }
    }

      
}   

   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();}
 Serial.println(regim);
}

    

 

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

Tails_MP пишет:

Почему при переключения режима я попадаю куда надо но программа зависает и ни чего не работает.

кароче. кнопки у тебя работают-нажимаются? - нажимаются. что ты там накрутил себе в логике кода - ищи тараканов самостоятельно.

и, убери нахрен delay(250);