Часы с кукушкой

Feofan
Offline
Зарегистрирован: 28.05.2017

Читайте в uint8_t. При выводе в serial используйте BIN и обозначьте где какой регистр.
К примеру:
Control 1000110
Status 10
или
0x0E бла....
0x0F лала....

P.S.
Быть может вместо "магического" значения 0x5D нагляднее использовать B1011101?

P.P.S.
И про задержку kost82 говорил, >=20ms.

Leopoll
Offline
Зарегистрирован: 16.06.2016

Частично разобрался. При отключении Vcc возникает низкий уровень на выводе SQW, который и вызывает прерывание. Процесс зацикливается.
Однако, если програмно с помощью флага исключить это ложное срабатывание, оказывается что прерывание по будильнику по прежнему не работает. То ли я косячу, то ли действительно  ни i2c  ни будильники от Vbat не работают на самом деле. Control  01011101

kost82
Offline
Зарегистрирован: 30.11.2015

Подайте питание на модуль напрямую и померяйте ток, скорее всего без передачи по I2C он будет не такой большой. 250мкА - это скорей всего во время передачи данных

Feofan
Offline
Зарегистрирован: 28.05.2017

Цитата:
При отключении Vcc возникает низкий уровень на выводе SQW, который и вызывает прерывание.
При исправном питании от Vbat такого быть не должно.

Цитата:
ни i2c ни будильники от Vbat не работают
I2C, при питании от Vbat, не проверял, а Alarm2 дергает согласно настройке - от 1-й до 1440 минут

Цитата:
Control  01011101
Желательно также Status

Update
Снимите начальные состояния Control и Status сразу после включения, до всех действий с RTC, сразу после соединения по I2C и перед выключением. Они совпадают?

Leopoll
Offline
Зарегистрирован: 16.06.2016

Feofan пишет:

При исправном питании от Vbat такого быть не должно.

Батарейка 3.7в показывает.

Тут вот что нашел:

Цитата:

когда вы питаете модуль от батарейки (без внешнего источника питания), то линии SDA, SCL, INT/SQW, 32kHz не подтягиваются к положительному полюсу батарейки, так как на модуле стоит диод VD1, и соответственно передача данных не возможна.

Необходимо подтянуть эти линии через резисторы со стороны Arduino к положительному полюсу источника питания Arduino. Но при этом модуль будет подпитываться через эти резисторы и на линию питания от батарейки переключаться не будет, чтобы этого избежать надо удалить подтягивающие резисторы R1-R4 на модуле часов.

Кстати, диод я таки выпаял, без него все равно 3-4 мА получается. Правда еще LED остался.

Feofan
Offline
Зарегистрирован: 28.05.2017

Посыпаю голову пеплом, ввёл в заблуждение. Посмотрел свою схему. Сигнал /SQW от DS3231 поступает на компаратор MAX983ESA+, который постоянно подключен к Vcc и управляет остальными ключами питания. Моё утверждение

Feofan пишет:
При исправном питании от Vbat такого быть не должно
ложно.

kost82
Offline
Зарегистрирован: 30.11.2015

Фото готового изделия будет?

Leopoll
Offline
Зарегистрирован: 16.06.2016

Пока до этого далеко. Принципиально хочу добиться, чтобы rtc работало от батарейки.

kost82
Offline
Зарегистрирован: 30.11.2015

Они не будут так работать. Судя по схеме батарейка соединена только с микросхемой DS3231, вся переферия питается от vcc

Feofan
Offline
Зарегистрирован: 28.05.2017

Можно пробовать ставить/перекидывать резистор подтяжки SQW на Vbat. Но в этом случае вполне ожидаем ток Vbat через защитные диоды MCU (соединение SQW <-> MCU).

Leopoll
Offline
Зарегистрирован: 16.06.2016

Совершенно точно работало от батарейки в режиме прямоугольного сигнала.
Не получается пока организовать процесс прерывание-вкл vcc-сброс бита-выкл vcc

Feofan
Offline
Зарегистрирован: 28.05.2017

Посмотрите схему от kost82 - без внешней подтяжки к Vcc оно не "сигналит".
Arduino должна спать и пробуждаться по прерыванию от SQW?

Leopoll
Offline
Зарегистрирован: 16.06.2016

Вроде заработало. Сделал таки внешнюю подтяжку SQW к Vcc. Внутренней подтяжки оказалось недостаточно. 

#include <Wire.h>
#include <DS3231.h>
#include <avr/sleep.h>

DS3231 clock;
RTCDateTime dt;

void setup() {
  Serial.begin(9600);
  pinMode(PIN_LED, OUTPUT);
  pinMode(6, OUTPUT);
  digitalWrite ( 6, HIGH);
  Serial.println("Initialize DS3231");
  set_sleep_mode (SLEEP_MODE_PWR_DOWN);

  clock.begin();
    
  Wire.beginTransmission(0x68);
  Wire.write(0x0E);// 
  Wire.write(B01000101);//         Устанавливаем регистр Control 01011101
  Wire.endTransmission();

  clock.armAlarm1(false);
  clock.clearAlarm1();
  clock.setAlarm1(0, 0, 0, 0, DS3231_EVERY_SECOND); //Будильник каждую секунду
  //clock.setAlarm1(0, 0, 0, 0, DS3231_MATCH_S);// Будильник каждую минуту

  pinMode (2, INPUT_PULLUP);
  attachInterrupt(0, myEventListener, FALLING);
  digitalWrite ( 6, LOW);
  delay(100);
 
  sleep_mode();
    }


void loop() {
 
  digitalWrite ( 6, HIGH);// подаем питание на модуль
  delay (50);
    dt = clock.getDateTime();
    int myHour = dt.hour;                                     
    Serial.println ( myHour );

   clock.isAlarm1(true);
   digitalWrite ( 6, LOW);     // отключаем питание модуля
   delay(100);
 
   sleep_mode();
 
  }

void myEventListener() {
  
Serial.println ("  --INT--  ");


Потребление в спящем режиме всей системы 4.5 мА. Если убрать светодиод и стабилизатор напряжения с ардуины, или использовать другой МК, должно выйти достаточно экономично. Возможно еще надо выпаять на RTC подтягивающий к земле резистор SQW.

kost82
Offline
Зарегистрирован: 30.11.2015

Leopoll пишет:

Потребление в спящем режиме всей системы 4.5 мА. Если убрать светодиод и стабилизатор напряжения с ардуины, или использовать другой МК, должно выйти достаточно экономично. Возможно еще надо выпаять на RTC подтягивающий к земле резистор SQW.

Если уберете подтяжку SQW - оставите "в воздухе" пин на который повешены прерывания - не лучшая идея. Нужно убрать цепь подзарядки батарейки часов. Ардуину можно взять Pro Mini, она без стабилизатора напряжения. Светодиоды везде повыкусывать.

Судя по коду ардуина просыпается каждую секунду, зачем? Раз в час для вашей задачи было бы достаточно.

Leopoll
Offline
Зарегистрирован: 16.06.2016

kost82 пишет:

Если уберете подтяжку SQW - оставите "в воздухе" пин на который повешены прерывания

Я же написал, что SQW подтянут резистором к Vcc ардуины. А через резистор подтяжки к земле со стороны RTC будет утекать ток на питание микросхемы RTC.

Цитата:

Нужно убрать цепь подзарядки батарейки часов.

Уже.

Цитата:

Ардуину можно взять Pro Mini, она без стабилизатора напряжения.

Таки она со стабилизатором, который к тому же потребляет ток даже при питании по Vcc.

Цитата:

Судя по коду ардуина просыпается каждую секунду, зачем? Раз в час для вашей задачи было бы достаточно.

Разумеется это только в отладочных целях.

Feofan
Offline
Зарегистрирован: 28.05.2017

Leopoll пишет:
Сделал таки внешнюю подтяжку SQW к Vcc. Внутренней подтяжки оказалось недостаточно.
Надо разорвать соединение между SQW к "внутренним/родным" резистором.

Leopoll пишет:
Возможно еще надо выпаять на RTC подтягивающий к земле резистор SQW.
Согласно схеме модуля, на SQW нет резистора к GND.

kost82 пишет:
Pro Mini, она без стабилизатора напряжения
На всех ProMini, что попадались, есть вход RAW и, соответственно, стабилизатор.

kost82
Offline
Зарегистрирован: 30.11.2015

Да, действительно стабилизатор там есть, зато нет usb-uart микросхемы. И есть версия на 3,3 вольта, которая может питаться от двух батареек. RTC, кстати тоже.

Leopoll
Offline
Зарегистрирован: 16.06.2016

Feofan пишет:
Согласно схеме модуля, на SQW нет резистора к GND.

Сорри, к конечно резистор к Vcc.

Feofan пишет:
Надо разорвать соединение между SQW к "внутренним/родным" резистором.

Именно это и имел ввиду.

Как ожидаемо выяснилось, если подтянуть к Vcc ардуины SDA и SCL, то можно и вообще не подавать питание на RTC.

Как думаете лучше будет, выковыривать лишнее из Pro Mini, или взять Attiny85? Есть шанс уложиться в в 8кБ, (сейчас 3.5 кБ). 

Feofan
Offline
Зарегистрирован: 28.05.2017

За/против Attiny не скажу, не пробовал. ProMini, в отличие от Nano, не имеет встроенного USB-TTL - соответственно потребуется адаптер USB-TTL или программатор USBasp.

kost82
Offline
Зарегистрирован: 30.11.2015

Или прошить при помощи другой ардуины с USB

Leopoll
Offline
Зарегистрирован: 16.06.2016

А можете подсказать, как по i2c записать/считать один бит?

В случает с портом, это PORTB |= (1 << PB5); например. А с i2c как работать? Полностью считать байт, применить маску и записать обратно? больше десятка строчек кода?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Leopoll пишет:

А можете подсказать, как по i2c записать/считать один бит?

В случает с портом, это PORTB |= (1 << PB5); например. А с i2c как работать? Полностью считать байт, применить маску и записать обратно? больше десятка строчек кода?

i2c рассчитан на передачу целого количества байтов. Соответственно, записать/считать один бит нельзя. Но можно трактовать считанный байт как команду на изменение бита.

"как работать?" -  зависит от того, что Вам нужно. Аналогия с портом - неуместна, т.к. порт находится на том же устройстве, а i2c соединяет разные устройства.

Green
Offline
Зарегистрирован: 01.10.2015

Как бы, никто не мешает иметь ус-во, при адресации которого будет что то там сбрасываться: старт, запись, стоп - всё. Не?

Leopoll
Offline
Зарегистрирован: 16.06.2016

Ладно, думал можно упростить, значит не выйдет. Не принципиально.
Есть более важный вопрос. 

Итак, у меня сейчас Pro Mini, который засыпает и просыпается по прерыванию от ножки SQW c RTC. Теперь мне надо сделать 2 или 4 кнопки, чтобы можно было корректировать время в RTC без подключения к компу. И надо, чтобы нажатие на эти кнопки тоже будило МК. Как это грамотно реализовать?

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

Green
Offline
Зарегистрирован: 01.10.2015

Даю на водку: PCINT.

Leopoll
Offline
Зарегистрирован: 16.06.2016

А это работает в режиме Powerdown?

kost82
Offline
Зарегистрирован: 30.11.2015

Как вариант - организовать цикл while в сетап, который будет работать при наличии единицы на каком нибудь пине. К этому пину прицепить тумблер или кнопку с фиксацией. Замыкаем тумблер и рестартим ардуино.

Leopoll
Offline
Зарегистрирован: 16.06.2016

Ну вот, скетч работает как и хотелось. Итого, на сегодняшний момент, PRO Mini, DS3231, TM1637 ( все-таки решил, что дисплей нужен ), две кнопки для коррекции времени. В режиме простоя потребление 250 мкА, но это я еще стабилизатор не обрезал. Извиняюсь, что использовал для кнопок библиотеку Guver, но она хорошо подходит и понятно описана. PCInt отлично будят из режима PowerDown. Скетч не вышел за пределы 8кБ, но по количеству выводов я в Attiny85 не вписываюсь. Сейчас работает на ATMega88. 

#include <Wire.h>
#include <DS3231.h>
#include <avr/sleep.h>
#include "TM1637.h"
#include <Sodaq_PcInt.h>

#define startHour 8         // С какого по какой час звонить
#define endHour   22

#define CLK PD0//pins definitions for TM1637 and can be changed to other ports       
#define DIO PD1
TM1637 tm1637(CLK,DIO);
int8_t TimeDisp[] = {0x00,0x00,0x00,0x00};

#include "GyverButton.h"
GButton butt1(PD3);
GButton butt2(PD4);


DS3231 clock;
RTCDateTime dt;

bool isButton = false;
bool isSQW = false;
byte myHour ;
byte myMinute ;
unsigned long timeButton;
bool isFalseInt = false;

void setup() {
   
  
  //-------------- ДИСПЛЕЙ---------------
  tm1637.init();
  tm1637.set(BRIGHT_TYPICAL);//BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7;
  pinMode (PB0, OUTPUT);                               // Питание дисплея
  digitalWrite (PB0, LOW);
  digitalWrite (PD0, LOW); 
  digitalWrite (PD1, LOW);
  // -------------- RTC --------------------

  clock.begin();

  Wire.beginTransmission(0x68);
  Wire.write(0x0E);// 
  Wire.write(B01000101);//         Устанавливаем регистр Control 01011101, чтобы SQW работал от батареи
  Wire.endTransmission();

  clock.armAlarm1(false);
  clock.clearAlarm1();
 // clock.setAlarm1(0, 0, 0, 0, DS3231_EVERY_SECOND); //Будильник каждую секунду
 // clock.setAlarm1(0, 0, 0, 0, DS3231_MATCH_S);// Будильник каждую минуту
  clock.setAlarm1(0, 0, 0, 0, DS3231_MATCH_M_S);// Будильник каждый час
  
  pinMode (PD2, INPUT_PULLUP);           //  Установка прерывания для сигнала SQW
  attachInterrupt(0, myEventListener, FALLING);
  
  pinMode (PD3, INPUT_PULLUP );     //Кнопки
  PcInt::attachInterrupt (PD3, buttonInt);
  pinMode (PD4, INPUT_PULLUP );
  PcInt::attachInterrupt (PD4, buttonInt);
  
  pinMode (PD5, OUTPUT); // Вывод на звонок
 
 //------------------------------------------- 
  
  
    }
void minutechange(){
     if ( myMinute >= 70 ){
      myHour++;
      if ( myHour == 25 ) myHour = 1;
      myMinute -= 60;
      TimeDisp[0] = (myHour - 1) / 10;
      TimeDisp[1] = (myHour - 1) % 10; 
        }
     if ( myMinute < 10 ){
      myHour--;
      if ( myHour == 0 ) myHour = 24;
      myMinute += 60;
      TimeDisp[0] = (myHour - 1) / 10;
      TimeDisp[1] = (myHour - 1) % 10; 
        } 
    timeButton = millis();  

    TimeDisp[2] = (myMinute - 10) / 10;
    TimeDisp[3] = (myMinute - 10) % 10;
    tm1637.display(TimeDisp);  
}

void loop() {
  
  
  delay (50);
// ADCSRA = 1;
  
  if (isButton){              //------------ Если нажата кнопка--------------
          
    digitalWrite (PB0, HIGH);  // Питание на дисплей
    delay (50);
    dt = clock.getDateTime();
 
    myHour = dt.hour;
    myMinute = dt.minute + 10;
    TimeDisp[0] = myHour / 10;
    TimeDisp[1] = myHour % 10; 
    myHour +=1;
    minutechange(); 
    byte count = 0;
     
    delay (100);
    
   while ( millis() < ( timeButton + 5000) ){
    
    butt1.tick();  // 
    butt2.tick();  // 
    
    if (butt1.isRelease()) count = 0;
    
    if (butt1.isClick()) {           // одиночное нажатие
    myMinute++; 
    minutechange();
    }
    
    if (butt1.isStep()) {            // обработчик удержания с шагами
    count ++;
    if ( count < 10 )myMinute++; 
      else myMinute += 10;
    minutechange();
     }
        
     if (butt2.isClick()) {           // одиночное нажатие
    myMinute--; 
    minutechange();
    
    }
    if (butt2.isStep()) {            // обработчик удержания с шагами
    count ++;
    if ( count < 10 )myMinute--; 
      else myMinute -= 10;
    minutechange();
                      
  } 
    }
    
    digitalWrite (PB0, LOW); // Выключаем дисплей
    digitalWrite (PD0, LOW); 
    digitalWrite (PD1, LOW);
    clock.setDateTime( 0, 0, 0 , myHour - 1, myMinute - 10, 00); 
    isFalseInt = true;      // При установки времени происходит ложное срабатывание на SQW
    clock.isAlarm1(true);
    
    isButton = false;
    
    
  }
  if ( isSQW ) {                        // -----Если сработало прерывание SQW---------------
    
    isSQW = false;
   if ( isFalseInt ) {isFalseInt = false;}
   else {
  
    dt = clock.getDateTime();
 
    myHour = dt.hour;
    myMinute = dt.minute;
   
    bell ( myHour );
   }
   clock.isAlarm1(true);
   
    }
    
   ADCSRA = 0;
   delay(100);
   set_sleep_mode (SLEEP_MODE_PWR_DOWN);
   sleep_mode();
   sleep_disable();
   
  }
void bell (byte myHour){
      if ( myHour >= startHour and myHour <= endHour ){
      if ( myHour > 12 ) myHour -= 12;  
      for ( byte i = 1; i <= myHour; i++ ){
      digitalWrite (PD5, HIGH );
      delay ( 500 );
      digitalWrite (PD5, LOW );
      delay (500);
      }
    }
}
void buttonInt(void) {
     isButton = true;
  
}
void myEventListener() {
     isSQW = true; 
  
 }
 

 

Leopoll
Offline
Зарегистрирован: 16.06.2016

Можно навскидку ткнуть, где можно наиболее просто оптимизировать код? Сейчас занимает 7700 байт, а хотелось бы еще небольшой функционал прикрутить. Использование регистров вместо pinMode, digitalWrite дает 40 байт. Отказ от PCINT дает 700 байт, тогда можно повесить одну из двух кнопок на INT1, но вторая кнопка будить не будет. Некритично, но не красиво. Есть еще несложные варианты?

b707
Offline
Зарегистрирован: 26.05.2017

а зачем для PCINT отдельная библиотека? Напрямую работать не проще?

Интересные моменты у вас в коде попадаются... судя по коду, у вас в часе 70 минут :)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

сделай кнопки аналоговыми и повесь на 1 аналоговый вход.  я бы даже 3 сделал, Up, Set и Down.

TM1637 попробуй мой, вдруг меньше кода получица. 

Leopoll
Offline
Зарегистрирован: 16.06.2016

b707 пишет:

 судя по коду, у вас в часе 70 минут :)

Ну зачем же так. Чтобы при уменьшении минут не получать отрицательные значения и можно было использовать тип byte, сначала прибавляю 10, потом отнимаю обратно. Но экономии это особо не дало.

b707
Offline
Зарегистрирован: 26.05.2017

Leopoll пишет:

b707 пишет:

 судя по коду, у вас в часе 70 минут :)

Ну зачем же так. Чтобы при уменьшении минут не получать отрицательные значения и можно было использовать тип byte, сначала прибавляю 10, потом отнимаю обратно.

поясните, как это. Зачем вообще в коде часов отнимать что-то от минут?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Leopoll пишет:

Чтобы при уменьшении минут не получать отрицательные значения и можно было использовать тип byte, сначала прибавляю 10, потом отнимаю обратно. 

ШО? О_О

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017
byte hour, min, sec;
.
.
.
if (min>0)
  min--;
else  
  min=59;
  

 

b707
Offline
Зарегистрирован: 26.05.2017

DetSimen пишет:

ШО? О_О

а вот оно:

void minutechange(){
     if ( myMinute >= 70 ){
      myHour++;
      if ( myHour == 25 ) myHour = 1;
      myMinute -= 60;
      TimeDisp[0] = (myHour - 1) / 10;
      TimeDisp[1] = (myHour - 1) % 10; 
        }
     if ( myMinute < 10 ){
      myHour--;
      if ( myHour == 0 ) myHour = 24;
      myMinute += 60;
      TimeDisp[0] = (myHour - 1) / 10;
      TimeDisp[1] = (myHour - 1) % 10; 
        } 
    timeButton = millis();  

    TimeDisp[2] = (myMinute - 10) / 10;
    TimeDisp[3] = (myMinute - 10) % 10;
    tm1637.display(TimeDisp);  
}

если ТС расскажет мне, что он тут пытался изобразить - я думаю мы сократим эту процедуру до 3-5 строк. Вот и получится та "оптимизация", которой он жаждал

Leopoll
Offline
Зарегистрирован: 16.06.2016

DetSimen пишет:

сделай кнопки аналоговыми и повесь на 1 аналоговый вход. 

Так они же тогда будить не будут?

А можно ссылочку на ваш TM1637?

Конечно, код наверно не блещет. Кнопки нужны для установки/коррекции времени часов. Соответственно, если минут 00, при нажатии на кнопку (-) будет отрицательное значение. А функция с проверкой minutechange() включается только потом. Все для того чтобы использовать тип byte вместо int. Но, действительно, выигрыш копеечный, а код читается плохо.

Leopoll
Offline
Зарегистрирован: 16.06.2016

b707 пишет:

если ТС расскажет мне, что он тут пытался изобразить - я думаю мы сократим эту процедуру до 3-5 строк. Вот и получится та "оптимизация", которой он жаждал

После установки минут, если минут больше 60 - прибавляем 1 час. минуты сбрасываем на - 60. (не на ноль, так как они могут меняться с шагом 1 и с шагом 10).

Дальше, если часов больше 23, то часы сбрасываем на 0.

То же самое в обратную сторону. 

 

b707
Offline
Зарегистрирован: 26.05.2017

Leopoll пишет:

Все для того чтобы использовать тип byte вместо int. Но, действительно, выигрыш копеечный, а код читается плохо.

причем выигрыш тут в оперативке, а в обьеме кода будет проигрыш, причем заметный

А всего лишь при нажатии кнопки "-" нужно СНАЧАЛА проверить минуты на равенство нулю и только потом отнимать или нет.

А так вы через весь код протащили какую-то бредятину с часом из 70 минут

Leopoll
Offline
Зарегистрирован: 16.06.2016

Так конечно правильно, но эту проверку надо будет делать в каждом из четырех обработчиков кнопок. А так она одна на всех в функции minutechange().

b707
Offline
Зарегистрирован: 26.05.2017

Ой, сам туплю... Почему int8_t не взяли вместо int? - размер как у байта, а при этом не понадобилось бы вся эта пляска с отслеживанием перехода через ноль

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Leopoll пишет:

Так конечно правильно, но эту проверку надо будет делать в каждом из четырех обработчиков кнопок. А так она одна на всех в функции minutechange().

Я изо всех сил надеюсь, што ты просто угараешь

Leopoll
Offline
Зарегистрирован: 16.06.2016

Ok, сделал тип int8_t. Функцию переписал.

void minutechange(){
     if ( myMinute >= 60 ){
      myHour++;
      if ( myHour == 24 ) myHour = 0;
      myMinute -= 60;
        }
        
     if ( myMinute < 0 ){
      myHour--;
      if ( myHour == -1 ) myHour = 23;
      myMinute += 60;
       } 
       
    timeButton = millis();
      
    TimeDisp[0] = myHour / 10;
    TimeDisp[1] = myHour % 10; 
    TimeDisp[2] = myMinute / 10;
    TimeDisp[3] = myMinute % 10;
    tm1637.display(TimeDisp);  
}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017
// глобальные часы, минуты, секунды
//
uint8_t glbHour = 20;
uint8_t glbMin	= 18;
uint8_t glbSec	=  0;

bool IncGlobalTime(void) {  // должна вызывацца каждую секунду 
	if (glbSec < 59) {
		glbSec++;
		return false;  // минуты НЕ изменились
	}

	glbSec = 0;

	if (glbMin < 59) {
		glbMin++;
		goto exit;
	}

	glbMin = 0;

	if (glbHour < 23) 
		glbHour++;
	else 
		glbHour = 0;

exit:
	return true;  // время изменилось, надо отображать
}

// если вызывать строго раз в секунду, то время будет всегда правильное
//
   if (IncGlobalTime()) Display.PrintTime(glbHour, glbMin);

 

Leopoll
Offline
Зарегистрирован: 16.06.2016

Спасибо, но у меня другая задача. Дисплей не должен отображать время постоянно. Он нужен только чтобы корректировать время в RTC. Кнопки плюс и минус меняют время, потом происходит запись этого времени в RTC. Поэтому значение на дисплее меняется только кнопками. При нажатии (+), минуты начинают прибавляться, если доходит до 60, прибавляется час. При нажатии (-) в обратную сторону. 

Вот, кстати, пробую вашу библиотеку. Не могу понять как правильно полностью включать и выключать дисплей ( именно полностью, чтобы не сажать батарейку). Чтобы его отключить, надо установить LOW на 5V, CLK, DIO. Чтобы включить 5V подаю обратно, но команда Display.PrintTime() включает его на долю секунды и он снова гаснет. Как включить правильно?

Библиотека 150 байт сэкономила, да и код получше читается. Спасибо.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Leopoll пишет:

Вот, кстати, пробую вашу библиотеку. Не могу понять как правильно полностью включать и выключать дисплей ( именно полностью, чтобы не сажать батарейку). Чтобы его отключить, надо установить LOW на 5V, CLK, DIO. Чтобы включить 5V подаю обратно, но команда Display.PrintTime() включает его на долю секунды и он снова гаснет. Как включить правильно?

Нинаю, передо мной такая задача не стояла.  Ну я бы пустил 5В на дисплей через транзистор и отключал бы его, перед сном.  Ну и перед сном можно сделать Display.Clear() и перевести на вход CLK и DIO.  При пробуждении проделать всё не совсем в обратном порядке: снфчала подать +5 на экран, потом перевести ноги CLKи DIO на выходы, а потом уже вызывать Display.PrintTime()

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Так, все. У мня седня чота джин больно забористый, паду-ка я спать, все вопросы завтра.  Кто хочет, может мня даже с 52х летием проздравить. :-)  

Leopoll
Offline
Зарегистрирован: 16.06.2016

Однозначно, поздравляю. Если б в Питере, собственного производства налить бы мог.

b707
Offline
Зарегистрирован: 26.05.2017

DetSimen пишет:

Кто хочет, может мня даже с 52х летием проздравить. :-)  

хочет - хочет! Поздравляю!

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

Так, все. У мня седня чота джин больно забористый, паду-ка я спать, все вопросы завтра.  Кто хочет, может мня даже с 52х летием проздравить. :-)  

Поздравляю!