Помогите со скетчем часов.
- Войдите на сайт для отправки комментариев
Пт, 09/12/2016 - 15:41
Есть рабочий скетч часов на дисплее ТМ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;
}
Для начала правильно вставляйте код - Вставка программного кода в тему/комментарий
Это означает, что если в коде где-то будет встречаться ON или OFF - они будут заменятся препроцессором на 1 и 0 соответственно.
Строка if(Update == ON) будет заменена на if(Update == 1)
Строка Update = ON; будет заменена на Update = 1;
Строка Update = OFF; будет заменена на Update = 0;
Не могу понять, как осуществляется коректировка времени после включения.
Никак, этого не предусмотрено в скетче.
А насколько эти таймеры точны?
Код надо вставлять так:
А насколько эти таймеры точны?
Аппаратные таймеры - это самые точные счетчики в микроконтроллерах. Но их точность зависит от точности тактирования (кварца).
А насколько эти таймеры точны?
Аппаратные таймеры - это самые точные счетчики в микроконтроллерах. Но их точность зависит от точности тактирования (кварца).
То-есть эта библиотека (#include <TimerOne.h>) реализует аппаратные таймеры?
Нет, аппаратные таймеры заложены в архитектруе микроконтроллера. Они реализованы на аппаратном уровне (физически), поэтому так и называются. Настраиваются через регистры. А эта библиотека просто прослойка для облегчения инициализации и работы с аппаратным Таймером1. В даташите на каждый микроконтроллер есть описание этих таймеров, как и прочей аппаратной периферии (функционирует независимо от ядра).
Эти же таймеры используются для генерации ШИМ.
Уважаемый форумчане! Если Вас не затруднит, помогите пожалуйста древнему человеку вставить в скетч две кнопочки для коррекции часов и минут, если возможно. Буду очень благодарен!
Уважаемый форумчане! Если Вас не затруднит, помогите пожалуйста древнему человеку вставить в скетч две кнопочки для коррекции часов и минут, если возможно. Буду очень благодарен!
класс титановый велосипед для тактовой кнопки.
Уважаемый форумчане! Если Вас не затруднит, помогите пожалуйста древнему человеку вставить в скетч две кнопочки для коррекции часов и минут, если возможно. Буду очень благодарен!
Две или четыре?
Две кнопочки крректировки, часики и минутки. Достаточно.
Задача не сложная, но имеется вагон и маленькая тележка возможных решений. Один из вариантов Клапауций выше указал. За вас врядли кто-то возьмется писать код, тем более что как минимум не понятно как эти кнопочки у вас в железе реализованы.
#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