Помогите со скетчем часов.

Витаминыч
Offline
Зарегистрирован: 09.12.2016

Есть рабочий скетч часов на дисплее ТМ1637. Не могу понять, как осуществляется коректировка времени после включения. Подскажите пожалуйста.

//Demo for 4-Digit Display only by Catalex
//Hardware: A 4-Digit Display 
//Board: Catduino or Arduino UNO R3,Arduino Mega2560...
//IDE:   Arduino-1.0
//Function: Display the time on the digital tube.
/*********************************************************************/
#include <TimerOne.h>
#include "TM1637.h"
#define ON 1       //   -что это означает?
#define OFF 0     //   -что это означает?
#define brightness 6  // яркость, от 0 до 7
int8_t TimeDisp[] = {0x00,0x00,0x00,0x00};
unsigned char ClockPoint = 1;
unsigned char Update;
unsigned char halfsecond = 0;
unsigned char second;
unsigned char minute = 0;
unsigned char hour = 12;
#define CLK 3//pins definitions for TM1637 and can be changed to other ports    
#define DIO 2
TM1637 tm1637(CLK,DIO);
void setup()
{
  tm1637.set();
  tm1637.init();
  Timer1.initialize(500000);//timing for 500ms
  Timer1.attachInterrupt(TimingISR);//declare the interrupt serve routine:TimingISR
  tm1637.init();
  tm1637.set(brightness);  
}
void loop()
{
  if(Update == ON)
  {
    TimeUpdate();
    tm1637.display(TimeDisp);
  }  
}
void TimingISR()
{
  halfsecond ++;
  Update = ON;
  if(halfsecond == 2){
    second ++;
    if(second == 60)
    {
      minute ++;
      if(minute == 60)
      {
        hour ++;
        if(hour == 24)hour = 0;
        minute = 0;
      }
      second = 0;
    }
    halfsecond = 0;  
  }
 // Serial.println(second);
  ClockPoint = (~ClockPoint) & 0x01;
}
void TimeUpdate(void)
{
  if(ClockPoint)tm1637.point(POINT_ON);
  else tm1637.point(POINT_OFF); 
  TimeDisp[0] = hour / 10;
  TimeDisp[1] = hour % 10;
  TimeDisp[2] = minute / 10;
  TimeDisp[3] = minute % 10;
  Update = OFF;
}
Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Для начала правильно вставляйте код - Вставка программного кода в тему/комментарий

Цитата:

#define ON 1       //   -что это означает?
#define OFF 0     //   -что это означает?

Это означает, что если в коде где-то будет встречаться ON или OFF - они будут заменятся препроцессором на 1 и 0 соответственно.

Строка  if(Update == ON)  будет заменена на  if(Update == 1)

Строка  Update = ON;  будет заменена на  Update = 1; 

Строка  Update = OFF;  будет заменена на  Update = 0; 

Цитата:

Не могу понять, как осуществляется коректировка времени после включения.

Никак, этого не предусмотрено в скетче.

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

А насколько эти таймеры точны?

Код надо вставлять так:

 //Demo for 4-Digit Display only by Catalex
//Hardware: A 4-Digit Display 
//Board: Catduino or Arduino UNO R3,Arduino Mega2560...
//IDE:   Arduino-1.0
//Function: Display the time on the digital tube.
//Store: http://www.aliexpress.com/store/1199788
/*********************************************************************/
#include <TimerOne.h>
#include "TM1637.h"
#define ON 1       //   -что это означает?
#define OFF 0     //   -что это означает?
#define brightness 6  // яркость, от 0 до 7
int8_t TimeDisp[] = {0x00,0x00,0x00,0x00};
unsigned char ClockPoint = 1;
unsigned char Update;
unsigned char halfsecond = 0;
unsigned char second;
unsigned char minute = 0;
unsigned char hour = 12;
#define CLK 3//pins definitions for TM1637 and can be changed to other ports    
#define DIO 2
TM1637 tm1637(CLK,DIO);
void setup()
{
  tm1637.set();
  tm1637.init();
  Timer1.initialize(500000);//timing for 500ms
  Timer1.attachInterrupt(TimingISR);//declare the interrupt serve routine:TimingISR
  tm1637.init();
  tm1637.set(brightness);  
}
void loop()
{
  if(Update == ON)
  {
    TimeUpdate();
    tm1637.display(TimeDisp);
  }  
}
void TimingISR()
{
  halfsecond ++;
  Update = ON;
  if(halfsecond == 2){
    second ++;
    if(second == 60)
    {
      minute ++;
      if(minute == 60)
      {
        hour ++;
        if(hour == 24)hour = 0;
        minute = 0;
      }
      second = 0;
    }
    halfsecond = 0;  
  }
 // Serial.println(second);
  ClockPoint = (~ClockPoint) & 0x01;
}
void TimeUpdate(void)
{
  if(ClockPoint)tm1637.point(POINT_ON);
  else tm1637.point(POINT_OFF); 
  TimeDisp[0] = hour / 10;
  TimeDisp[1] = hour % 10;
  TimeDisp[2] = minute / 10;
  TimeDisp[3] = minute % 10;
  Update = OFF;
}

 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

ua6em пишет:

А насколько эти таймеры точны?

Аппаратные таймеры - это самые точные счетчики в микроконтроллерах. Но их точность зависит от точности тактирования (кварца).

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

Jeka_M пишет:

ua6em пишет:

А насколько эти таймеры точны?

Аппаратные таймеры - это самые точные счетчики в микроконтроллерах. Но их точность зависит от точности тактирования (кварца).

То-есть эта библиотека (#include <TimerOne.h>) реализует аппаратные таймеры?

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Нет, аппаратные таймеры заложены в архитектруе микроконтроллера. Они реализованы на аппаратном уровне (физически), поэтому так и называются. Настраиваются через регистры. А эта библиотека просто прослойка для облегчения инициализации и работы с аппаратным Таймером1. В даташите на каждый микроконтроллер есть описание этих таймеров, как и прочей аппаратной периферии (функционирует независимо от ядра).

Эти же таймеры используются для генерации ШИМ.

Витаминыч
Offline
Зарегистрирован: 09.12.2016

Уважаемый форумчане! Если Вас не затруднит, помогите пожалуйста древнему человеку вставить в скетч две кнопочки для коррекции часов и минут, если возможно. Буду очень благодарен!

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

Витаминыч пишет:

Уважаемый форумчане! Если Вас не затруднит, помогите пожалуйста древнему человеку вставить в скетч две кнопочки для коррекции часов и минут, если возможно. Буду очень благодарен!

класс титановый велосипед для тактовой кнопки.

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

Витаминыч пишет:

Уважаемый форумчане! Если Вас не затруднит, помогите пожалуйста древнему человеку вставить в скетч две кнопочки для коррекции часов и минут, если возможно. Буду очень благодарен!

Две или четыре?

Витаминыч
Offline
Зарегистрирован: 09.12.2016

Две кнопочки крректировки, часики и минутки. Достаточно.

okta
Offline
Зарегистрирован: 10.01.2015

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

valera678
Offline
Зарегистрирован: 04.11.2016
#include "CyberLib.h"

#include "TM1637.h"
#define CLK 11   // пин 11
#define DIO 12   // пин 12
TM1637 tm1637(CLK,DIO);
#define ON 1
#define OFF 0

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

#include <IRstD.h> 
IRrecvstd irrecvstd(4); 
decode_resultsstd res_std;

#define MAXMILLIS 4294967295
unsigned long timme;
unsigned long timelapsed = 0;
int chas = 0;
int minuta = 0;
int secunda = 0;

///////////// B1 ////////////////////
uint8_t B1_flag = ReadEEPROM_Byte(1);
uint8_t B1chas_vkl = ReadEEPROM_Byte(2);
uint8_t B1minut_vkl = ReadEEPROM_Byte(3);

uint8_t val_shim = ReadEEPROM_Byte(4);

uint8_t flag_disp = 0;
uint8_t flag_zel_led = 0;

int buzzerPin = 5;

int8_t TimeDisp[] = {0x00,0x00,0x00,0x00};
int8_t BudDisp[] = {0x00,0x00,0x00,0x00};
unsigned char ClockPoint = 1;


void setup() 
{
  tm1637.set(val_shim);
  tm1637.init();
  pinMode(buzzerPin, OUTPUT);
  D7_Out;  
  D7_Low;
  D10_Out;

  if(B1_flag) D10_High;
  else D10_Low;
  
  Serial.begin(57600);
  irrecvstd.enableIRInstd();

  rtc.begin();
}


void loop() 
{
   if(irrecvstd.decodestd(&res_std)) 
    {
       if(res_std.valuestd == 429496722) // Прибавление часов
         {
           analogWrite(buzzerPin, 255);
           chas++;
           if(chas > 23) chas = 0;
           rtc.setTime(chas, minuta, secunda);
           disp();
           analogWrite(buzzerPin, 0);
         }

       if(res_std.valuestd == 1886430554) // Убавление часов
         {
           analogWrite(buzzerPin, 255);
           chas--;
           if(chas < 1) chas = 0;
           rtc.setTime(chas, minuta, secunda);
           disp();
           analogWrite(buzzerPin, 0);
         } 

       if(res_std.valuestd == 1886397914) // Прибавление минут
         {
           analogWrite(buzzerPin, 255);
           minuta++;
           if(minuta > 59) minuta = 0;
           rtc.setTime(chas, minuta, secunda);
           disp();
           analogWrite(buzzerPin, 0);
         }  

       if(res_std.valuestd == 1886446874) // Убавление минут
         {
           analogWrite(buzzerPin, 255);
           minuta--;
           if(minuta < 1 || minuta > 60) minuta = 0;
           rtc.setTime(chas, minuta, secunda);
           disp();
           analogWrite(buzzerPin, 0);
         } 

       if(flag_disp && res_std.valuestd == 551521650) // Прибавление часов будильника
         {
           analogWrite(buzzerPin, 255);
           B1chas_vkl++;
           if(B1chas_vkl > 23) B1chas_vkl = 0;
           WriteEEPROM_Byte(2, B1chas_vkl);
           disp();
           analogWrite(buzzerPin, 0);
         } 

       if(flag_disp && res_std.valuestd == 551547150) // Убавление часов будильника
         {
           analogWrite(buzzerPin, 255);
           B1chas_vkl--;
           if(B1chas_vkl < 1 || B1chas_vkl > 24) B1chas_vkl = 0;
           WriteEEPROM_Byte(2, B1chas_vkl);
           disp();
           analogWrite(buzzerPin, 0);
         }  

       if(flag_disp && res_std.valuestd == 551489010) // Прибавление минут будильника
         {
           analogWrite(buzzerPin, 255);
           B1minut_vkl++;
           if(B1minut_vkl > 59) B1minut_vkl = 0;
           WriteEEPROM_Byte(3, B1minut_vkl);
           disp();
           analogWrite(buzzerPin, 0);
         }

       if(flag_disp && res_std.valuestd == 551514510) // Убавление минут будильника
         {
           analogWrite(buzzerPin, 255);
           B1minut_vkl--;
           if(B1minut_vkl < 1 || B1minut_vkl > 60) B1minut_vkl = 0;
           WriteEEPROM_Byte(3, B1minut_vkl);
           disp();
           analogWrite(buzzerPin, 0);
         }  


       if(res_std.valuestd == 551505585) // Вкл/Откл будильник
         {
           analogWrite(buzzerPin, 255);

           B1chas_vkl = ReadEEPROM_Byte(2);
           B1minut_vkl = ReadEEPROM_Byte(3);
           
           if(B1_flag) 
             {
                B1_flag = 0;
                D10_Low;
             }   
                
           else 
             {
               B1_flag = 1;
               D10_High;
             }
               
           disp();
           
           WriteEEPROM_Byte(1, B1_flag);
           analogWrite(buzzerPin, 0);
         }


       if(res_std.valuestd == 551521905) // Вывод будильника на дисплей
         {
           analogWrite(buzzerPin, 255);
           flag_zel_led = 0;
           
           if(flag_disp) 
             {
                flag_disp = 0;
                D7_Low;
             }   
                
           else 
             {
               flag_disp = 1;
               D7_High;
             }
               
           disp();
           analogWrite(buzzerPin, 0);
         }  


       if(res_std.valuestd == 551525475) // Подсветка +
         {
           analogWrite(buzzerPin, 255);
           val_shim++;
           if(val_shim > 7) val_shim = 7;
           WriteEEPROM_Byte(4, val_shim);
           tm1637.set(val_shim);
           disp();
           delay_ms(10);
           analogWrite(buzzerPin, 0);
         }  

       if(res_std.valuestd == 551519355) // Подсветка -
         {
           analogWrite(buzzerPin, 255);
           val_shim--;
           if(val_shim < 1 || val_shim > 254) val_shim = 0;
           WriteEEPROM_Byte(4, val_shim);
           tm1637.set(val_shim);
           disp();
           delay_ms(10);
           analogWrite(buzzerPin, 0);
         }  


       if(res_std.valuestd == 551519865) // +10 минут отсрочка
         {
           analogWrite(buzzerPin, 255);
           B1minut_vkl = B1minut_vkl + 10;
           
           if(B1minut_vkl > 59) 
             {
                B1minut_vkl = 10;
                B1chas_vkl++;
                if(B1chas_vkl>23)  B1chas_vkl=0;
             }

           delay_ms(5);
           analogWrite(buzzerPin, 0);

           flag_disp = 1;
           D7_High;
           disp();
           delay_ms(300);
           flag_disp = 0;
           D7_Low;
         } 

       //Serial.println(res_std.valuestd); // Удалить после программирования пульта
       
       irrecvstd.resumestd();
       res_std.valuestd = 0; 
    }


  unsigned long currtime = millis();
  
  if(currtime > timme) timelapsed = (currtime - timme); 
  else timelapsed = (MAXMILLIS - timme + currtime);
  
  if(timelapsed > 999)
    {  
        timme = currtime;
        
        if(flag_disp)
          {
            flag_zel_led++;
            if(flag_zel_led > 59)
              {
                flag_zel_led = 0;
                flag_disp = 0;
                D7_Low;
                analogWrite(buzzerPin, 255);
                delay_ms(5);
                analogWrite(buzzerPin, 0);
              }
          }
        
        disp(); 
     }


  t = rtc.getTime();
  chas = t.hour,DEC;
  minuta = t.min,DEC;
  secunda = t.sec,DEC;

  if(B1_flag)
    {
      if(chas == B1chas_vkl && minuta == B1minut_vkl) 
        {
           buzz();
        }

      if(chas == B1chas_vkl && minuta == B1minut_vkl && secunda == 59) 
        {
           B1minut_vkl = B1minut_vkl + 10;
           if(B1minut_vkl > 59) 
             {
                B1minut_vkl = 10;
                B1chas_vkl++;
                if(B1chas_vkl>23)  B1chas_vkl=0;
             }
        }
    }

} //END LOOP


void buzz() 
{ 
  if(B1_flag)
   { 
     analogWrite(buzzerPin, 30);       
     delay_ms(100); 
     analogWrite(buzzerPin, 50);       
     delay_ms(100);
   }

  analogWrite(buzzerPin, 0);
  delay_ms(100);         
}


void disp()
 {
     if(!flag_disp)   
      {
        ClockPoint = (~ClockPoint) & 0x01;
        
        if(ClockPoint)tm1637.point(POINT_ON);
        else tm1637.point(POINT_OFF);

        TimeDisp[0] = chas / 10;
        TimeDisp[1] = chas % 10;
        TimeDisp[2] = minuta / 10;
        TimeDisp[3] = minuta % 10;
        tm1637.display(TimeDisp);
      }

     else
      {
        tm1637.point(POINT_ON);
        BudDisp[0] = B1chas_vkl / 10;
        BudDisp[1] = B1chas_vkl % 10;
        BudDisp[2] = B1minut_vkl / 10;
        BudDisp[3] = B1minut_vkl % 10;
        tm1637.display(BudDisp);
      }
 }

взят здесь http://istarik.ru/blog/arduino/60.html