После выполнения RTC.write(tm) - часы не идут дальше

Всем привет. После выполнения кода:

void setup_time(){
  if (!settingTime) {
    hour_new = tm.Hour;
    minute_new = tm.Minute;
  }
    
  if (butt1.isClick()) {tone(SPEAKER, 1000, 10); settingTime = !settingTime;};
  if (butt2.isClick()) {tone(SPEAKER, 1000, 10); hour_new = (hour_new + 1) % 24; tm.Hour = hour_new;  RTC.write(tm);};
  if (butt3.isClick()) {tone(SPEAKER, 1000, 10); minute_new = (minute_new + 1) % 60; tm.Minute = minute_new; RTC.write(tm);};
  if (butt4.isClick()) {tone(SPEAKER, 1000, 10); numMenu = 1; setnumMenu = 0; };
}

А именно плес выполнения tm.Hour = hour_new; RTC.write™;, tm.Minute = minute_new; RTC.write™; часы остановились на измененных значениях. Что не так сделал??? Спасибо

Много чего сделано не так. Вы:

  1. скетч выложили не полностью;
  2. не сказали какими именно библиотеками пользуетесь;
  3. не сказали какая именно RTC используется;
  4. Не сказали какая именно ардуина используется;
  5. не выложили схему подключения.

Делайте всё перечисленное. Или не делайте, но тогда в теме будет только глум над Вами и тыкание пальцем в небо.

  1. В loop, запускаю:
void loop() {
      RTC.read(tm);
setup_time();
}

Далее захожу в функцию:

void setup_time(){
  if (!settingTime) {
    hour_new = tm.Hour;
    minute_new = tm.Minute;
  }
    
  if (butt1.isClick()) {tone(SPEAKER, 1000, 10); settingTime = !settingTime;};
  if (butt2.isClick()) {tone(SPEAKER, 1000, 10); hour_new = (hour_new + 1) % 24; tm.Hour = hour_new;  RTC.write(tm);};
  if (butt3.isClick()) {tone(SPEAKER, 1000, 10); minute_new = (minute_new + 1) % 60; tm.Minute = minute_new; RTC.write(tm);};
  if (butt4.isClick()) {tone(SPEAKER, 1000, 10); numMenu = 1; setnumMenu = 0; };
}

Использую библиотеки:

#include <Wire.h>
#include <TimeLib.h>
#include <DS1307RTC.h>
#include <GyverButton.h>
  1. RTC 1307
  2. Arduino nano
  3. Сама DS1307 успешно работает и время идет, а вот если записываю данные, то перестает работать. Предполагаю, что не правильно использую дагнную запись RTC.write™; .

Ну, запускайте и заходите дальше.

Я написал Вам что делать, Вы забили - Ваше право - мы свободные люди.

Убрал все лишнее, оставил только нажатие кнопки и изменение вручную значений tm.Hour и tm.Minute .

void loop() {
    //Читаем текущее время
      RTC.read(tm);
      Serial.print(tm.Hour);
      Serial.print(tm.Minute);

    int analog = analogRead(A7);
      butt1.tick(analog < 100 && analog >= 0);
      
if (butt1.isClick()){tm.Minute = 32; tm.Hour = 21; RTC.write(tm); };

Значения меняются, но часы дальше не идут. В самой библиотеке уже есть конвертер из DEC в BIN и обращение к i2c rtc1307. Читал про то, что надо выставить бит CH=0, но пока не нашел что это, т.к. в исходном коде самой библиотеки этого нет, но она то как-то время выставляет. Спасибо

А до установки времени они идут?

да все хорошо идут и даже после отключения питания.

Библиотека, поди, тактирование отключает на RTC при write().
Пробуйте другие.

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

1 лайк

ага, а вы потом на этих библиотеках денег заработаете )))

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

#include <Wire.h>
#include <RTClib.h>
#include <GyverButton.h>
#include <EEPROM.h>

#define segmentA 2
#define segmentB 3
#define segmentC 4
#define segmentD 5
#define segmentE 6
#define segmentF 7
#define segmentG 8
#define segmentDP 9

//задержка вкл/выкл сегментов
int time_delay = 4;

#define DIGIT_1PIN 10  //(1)     //1234
#define DIGIT_2PIN 11  //(2)
#define DIGIT_3PIN 12  //(3)
#define DIGIT_4PIN 13  //(4)

//кнопки
GButton butt1;  //mode
GButton butt2;  //UP
GButton butt3;  //DOWN
GButton butt4;  //SET

//Динамик
#define SPEAKER A1

//РЕЛЕ
int Relay = A2; 

//для RTC
RTC_DS1307 rtc;

    
int hour_new = 0;
int minute_new = 0;
bool settingTime = false;

int numMenu = 0; //Выбор меню  0 - ничего не отображать, 1 - отображать часы.
int setnumMenu = 0; //Выбор меню  0 - ничего не отображать, 2 - настройка часов , 3 - настройка таймеров



void show_number(int num)  
{
  switch(num)
  {
    case 0:  
      digitalWrite(segmentA, HIGH); 
      digitalWrite(segmentB, HIGH); 
      digitalWrite(segmentC, HIGH);
      digitalWrite(segmentD, HIGH);
      digitalWrite(segmentE, HIGH);
      digitalWrite(segmentF, HIGH);
      digitalWrite(segmentG, LOW); 
    break;
    case 1:  
      digitalWrite(segmentA, LOW);  
      digitalWrite(segmentB, HIGH);
      digitalWrite(segmentC, HIGH);
      digitalWrite(segmentD, LOW);  
      digitalWrite(segmentE, LOW);
      digitalWrite(segmentF, LOW);
      digitalWrite(segmentG, LOW);
    break;
    case 2:
      digitalWrite(segmentA, HIGH);
      digitalWrite(segmentB, HIGH);
      digitalWrite(segmentC, LOW);
      digitalWrite(segmentD, HIGH);
      digitalWrite(segmentE, HIGH);
      digitalWrite(segmentF, LOW);
      digitalWrite(segmentG, HIGH);
    break;
    case 3:
      digitalWrite(segmentA, HIGH);
      digitalWrite(segmentB, HIGH);
      digitalWrite(segmentC, HIGH);
      digitalWrite(segmentD, HIGH);
      digitalWrite(segmentE, LOW);
      digitalWrite(segmentF, LOW);
      digitalWrite(segmentG, HIGH);
    break;
    case 4:
      digitalWrite(segmentA, LOW);
      digitalWrite(segmentB, HIGH);
      digitalWrite(segmentC, HIGH);
      digitalWrite(segmentD, LOW);
      digitalWrite(segmentE, LOW);
      digitalWrite(segmentF, HIGH);
      digitalWrite(segmentG, HIGH);
    break;
    case 5:
      digitalWrite(segmentA, HIGH);
      digitalWrite(segmentB, LOW);
      digitalWrite(segmentC, HIGH);
      digitalWrite(segmentD, HIGH);
      digitalWrite(segmentE, LOW);
      digitalWrite(segmentF, HIGH);
      digitalWrite(segmentG, HIGH);
    break;
    case 6:
      digitalWrite(segmentA, HIGH);
      digitalWrite(segmentB, LOW);
      digitalWrite(segmentC, HIGH);
      digitalWrite(segmentD, HIGH);
      digitalWrite(segmentE, HIGH);
      digitalWrite(segmentF, HIGH);
      digitalWrite(segmentG, HIGH);
    break;
    case 7:
      digitalWrite(segmentA, HIGH);
      digitalWrite(segmentB, HIGH);
      digitalWrite(segmentC, HIGH);
      digitalWrite(segmentD, LOW);
      digitalWrite(segmentE, LOW);
      digitalWrite(segmentF, LOW);
      digitalWrite(segmentG, LOW);
    break;
    case 8:
      digitalWrite(segmentA, HIGH);
      digitalWrite(segmentB, HIGH);
      digitalWrite(segmentC, HIGH);
      digitalWrite(segmentD, HIGH);
      digitalWrite(segmentE, HIGH);
      digitalWrite(segmentF, HIGH);
      digitalWrite(segmentG, HIGH);
    break;
    case 9:
      digitalWrite(segmentA, HIGH);
      digitalWrite(segmentB, HIGH);
      digitalWrite(segmentC, HIGH);
      digitalWrite(segmentD, HIGH);
      digitalWrite(segmentE, LOW);
      digitalWrite(segmentF, HIGH);
      digitalWrite(segmentG, HIGH);
    break;  
    default:
      digitalWrite(segmentA, LOW);
      digitalWrite(segmentB, HIGH);
      digitalWrite(segmentC, HIGH);
      digitalWrite(segmentD, HIGH);
      digitalWrite(segmentE, HIGH);
      digitalWrite(segmentF, LOW);
      digitalWrite(segmentG, HIGH);
    break;
  }
}

void show_h(){        //H
    digitalWrite(segmentA, LOW);
    digitalWrite(segmentB, HIGH);
    digitalWrite(segmentC, HIGH);
    digitalWrite(segmentD, LOW);
    digitalWrite(segmentE, HIGH);
    digitalWrite(segmentF, HIGH);
    digitalWrite(segmentG, HIGH);
}

void show_min(){        //-
    digitalWrite(segmentA, LOW);
    digitalWrite(segmentB, LOW);
    digitalWrite(segmentC, LOW);
    digitalWrite(segmentD, LOW);
    digitalWrite(segmentE, LOW);
    digitalWrite(segmentF, LOW);
    digitalWrite(segmentG, HIGH);
}

void display_digits_off(){
    digitalWrite(segmentA, LOW);
    digitalWrite(segmentB, LOW);
    digitalWrite(segmentC, LOW);
    digitalWrite(segmentD, LOW);
    digitalWrite(segmentE, LOW);
    digitalWrite(segmentF, LOW);
    digitalWrite(segmentG, LOW);
}



//Основные функции
void mode_display_time(){    //функция отображения текущего времени
      DateTime now = rtc.now();     
      int now_time = now.hour()*100 + now.minute();
      int a = now_time / 1000;
      int b = now_time % 1000/100;
      int c = now_time % 100/10;
      int d = now_time % 10;
      
                digitalWrite(DIGIT_1PIN,HIGH);
                digitalWrite(DIGIT_2PIN,LOW);
                digitalWrite(DIGIT_3PIN,LOW);
                digitalWrite(DIGIT_4PIN,LOW);
                show_number(a);
                delay(time_delay);
                digitalWrite(DIGIT_1PIN,LOW);
                digitalWrite(DIGIT_2PIN,HIGH);
                digitalWrite(DIGIT_3PIN,LOW);
                digitalWrite(DIGIT_4PIN,LOW);
                show_number(b);
                delay(time_delay);
                digitalWrite(DIGIT_1PIN,LOW);
                digitalWrite(DIGIT_2PIN,LOW);
                digitalWrite(DIGIT_3PIN,HIGH);
                digitalWrite(DIGIT_4PIN,LOW);
                show_number(c);
                delay(time_delay);
                digitalWrite(DIGIT_1PIN,LOW);
                digitalWrite(DIGIT_2PIN,LOW);
                digitalWrite(DIGIT_3PIN,LOW);
                digitalWrite(DIGIT_4PIN,HIGH);
                show_number(d);
                delay(time_delay);
                digitalWrite(DIGIT_1PIN,LOW);
                digitalWrite(DIGIT_2PIN,LOW);
                digitalWrite(DIGIT_3PIN,LOW);
                digitalWrite(DIGIT_4PIN,LOW);  

                butt4.setTimeout(1000);             
                if (butt4.isHold()){tone(SPEAKER, 1000, 10); setnumMenu = 1;} 
}


void setup_time(){
  DateTime now = rtc.now();  
  if (!settingTime) {
    hour_new = now.hour();
    minute_new = now.minute();
    Serial.print("No");
  }
  
  if (butt1.isClick()) {tone(SPEAKER, 1000, 10); settingTime = !settingTime; Serial.print("Yes");};
  if (butt2.isClick()) {tone(SPEAKER, 1000, 10); hour_new = (hour_new + 1) % 24; rtc.adjust(DateTime(now.year(), now.month(), now.day(), hour_new, now.minute(), now.second()));  Serial.print(hour_new); };
  if (butt3.isClick()) {tone(SPEAKER, 1000, 10); minute_new = (minute_new + 1) % 60; rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), minute_new, now.second())); Serial.print(minute_new);};
  if (butt4.isClick()) {tone(SPEAKER, 1000, 10); numMenu = 1; setnumMenu = 0; };
}


  

void setup() {
  pinMode(segmentA, OUTPUT); 
  pinMode(segmentB, OUTPUT);
  pinMode(segmentC, OUTPUT);
  pinMode(segmentD, OUTPUT);
  pinMode(segmentE, OUTPUT);
  pinMode(segmentF, OUTPUT);
  pinMode(segmentG, OUTPUT);
  
  pinMode(DIGIT_1PIN, OUTPUT);
  pinMode(DIGIT_2PIN, OUTPUT);
  pinMode(DIGIT_3PIN, OUTPUT);
  pinMode(DIGIT_4PIN, OUTPUT);

  pinMode(Relay, OUTPUT);

  Serial.begin(9600);
  Wire.begin();
  rtc.begin();

 // rtc.adjust(DateTime(2023, 8, 30, 22, 07, 0));
}

void loop() { 
      DateTime now = rtc.now();  
      Serial.println(now.hour());
      Serial.println(now.minute());
      Serial.println(now.second());
      //Чтение кнопок
      int analog = analogRead(A7);
      butt1.tick(analog < 100 && analog >= 0);
      butt2.tick(analog < 210 && analog > 150);
      butt3.tick(analog < 330 && analog > 280);
      butt4.tick(analog < 450 && analog > 370);

      switch(numMenu)
      {
        case 0:  if ((numMenu == 0 ) && (setnumMenu == 0)) { display_digits_off(); } break;
        case 1:  if ((numMenu == 1 ) && (setnumMenu == 0)) { mode_display_time();  } break;
      }
      
      if ((numMenu == 1 ) && (setnumMenu == 1)) { setup_time(); }



  if (butt1.isClick()) {tone(SPEAKER, 1000, 10); numMenu = numMenu + 1; if (numMenu > 1) {numMenu = 0;}} // меню 1 показать время на 500 мс. - Нажата кнопка MODE
    
}

Просто “гуру” сейчас напишут, что код говно, я с этим соглашусь полностью, но пока делаю по простому, далее постараюсь сделать все лучше.