Ещё одни часы без RTS
- Войдите на сайт для отправки комментариев
Пт, 19/02/2016 - 18:06
Всем привет, я начинающий, в программировании чють больше нуля, решил я сделать себе наручные часы с 7ми сигментым индикатором, наковырял скеч с часиками, залил, показывают всё время 0012(точки как разделить часы-минуты пока не использую) упёрся в какое то глобльное незнание(( тыкните в место где что-то не так?
#include "SevSeg.h" SevSeg myDisplay; unsigned long timer; int deciSecond = 0; void setup() { int displayType = COMMON_CATHODE; // int digit1 = 8; //Pin 1 int digit2 = 5; //Pin 10 int digit3 = 11; //Pin 4 int digit4 = 13; //Pin 6 int segA = 7; //Pin 12 int segB = 6; //Pin 11 int segC = 10; //Pin 3 int segD = 3; //Pin 8 int segE = 9; //Pin 2 int segF = 4; //Pin 9 int segG = 2; //Pin 7 int segDP= 12; //Pin 5 int numberOfDigits = 4; myDisplay.Begin(displayType, numberOfDigits, digit1, digit2, digit3, digit4, segA, segB, segC, segD, segE, segF, segG, segDP); myDisplay.SetBrightness(100); timer = millis(); } void loop() { int n = 0; int hours = 00; int minutes = 00; int elapsedMinutes = 0; int seconds = 0; char timeString[10]; sprintf(timeString, "%02d%02d", n); myDisplay.DisplayString(timeString, 0); unsigned long time = millis() - (elapsedMinutes * 60000); seconds = ((time / 1000) % 60); if (seconds > 60) { seconds = 0; minutes++; elapsedMinutes++; if (minutes >= 60) { minutes = 0; hours++; if (hours > 23) { hours = 0; } } } n = (hours * 100) + minutes; }
Ну в странной логике вычисления часов минут секунд разбираться не охота, а вот для начала вынести переменные
40
int
n = 0;
41
int
hours = 00;
42
int
minutes = 00;
43
int
elapsedMinutes = 0;
44
int
seconds = 0;
следует в глобальную секцию до loop() или сделать их static
После этого если и будет показывать хрень - то будем разбираться уже в странной логике.
Может кому пригодится, вот проверенное решение для данной задачи. Замечу, что у меня этот кусок кода задействован в скетчах периферийных устройств, которые периодически синхронизируются со временем основного устройства, которое имеет модуль RTC, который периодически синхронизируется с NTP-сервером, (в доме, который построил Джек ))) ). Также замечу, что часы без RTC - плохая идея, точность их не порадует. Впрочем, код :
Огоромное спасибо за код.
Я осознаю, что часы без RTС не точны, я хочу сделать наручные часы, о обойтись минимальной схемой... и паралельно попытатся разобратся в прогарммировании.
Так пусть же все Ваши попытки будут успешными (звучит как тост))).
P.S. Всё-таки RTC - Real Time Clock.
Здравствуйте Sr.FatCat, спасибо за совет, вынес переменные за loop(), но реакция прежняя статичная картинка 0012. Есле не трудно то подскадите код с паривльной логикой хотябы для отсчёта секунд, а я попробую разобратся с минутми и часами...
Так пусть же все Ваши попытки будут успешными (звучит как тост))).
P.S. Всё-таки RTC - Real Time Clock.
Спасибо, исправил.
Вот такой вариант на 16 битном таймере будет работать ещё более точно:
...
Красивый у вас код, прям как из даташита к МК :)
Но по-моему, это несколько противоречит тому, что хочет ТС. Он хочет осмысленно написать простую программу.
Пока у него с осмысленностью простейших операций не очень. А тут одно деление на 256 чего стоит :)
2c0smo
выложите новый скетч с вынесенными переменными и с комментариями к строкам.
начиная со строки
timer = millis();
которые вы не используете ниже :)
и вставьте в 49 строку Serial.println(timeString); -посмотрите в мониторе тоже "0012"?
Sr.FatCat
после добавления строки Serial.println(timeString); , что то стало вычистятся(не корректно конечно) но это уже прорыв!) см.видео ( https://yadi.sk/i/AqEbOD6PpApnz )
c0smo, в 54
должно быть
sprintf(timeString,
"%02i%02i"
, hours, minutes);
и все-таки не ясна конечная цель. Если вы хотите хоть как-то поизучать с/с++ то стоит как-то внимательнее, что ли примеры
посмотреть, книжки проглядеть от начала, хотя бы до середины.
А каждую строчку исправлять он-лайн как-то не очень эффективно. Я написал, что timer не используете, но вы так и не используете.
Да и дальше такой бред....
Спасибо, Sr.FatCat ,.... осознал что я ничо не понимаю )
Продолжил ковырять скеч и теперь всё работает. Хотя видно что примерно пару раз за 10 секунд, эти секунды перескакивают быстрее чем положенно, и думаю что время будет сильно улетать вперед. Думаю над коррекцией, вроде как можно сделать относительно частоты кварца, но сначала я прикручу к скечу кнопки настройки. А пока вот рабочий вариант.
маленькая подсказка: инициализировать время в setupможно через время компиляции скетча: системная константа __TIME__
Типа
RTC успешно реализуется на атмега8 - ставим тактирование от внутреннего осциллятора и подключаем часовой кварц.
здесь теория, даже с усыплением камня http://microcontrollerov.net/microcontrolleri/mega/AVR134-Chasy-Realnogo-Vremeni-na-osnove-Asinhronnogo-Tajmera
а, это то, что я использую для атмега8. где t - секунды
и, вдогонку, если не желается считать часы, минуты программно - ставим стрелочные индикаторы на PWM и радуемся тёплому ламповому времени
Спасибо примеры без RTC часов.