Самые простецкие часики на точность не претендующие
- Войдите на сайт для отправки комментариев
Пт, 14/12/2012 - 00:25
Самые просты часики, конечно недоработанные есче, но мож кому пригодятся.
#include <LiquidCrystal.h> LiquidCrystal lcd(12, 11, 5, 4, 3, 2); int H=0; //Hour int M=0; //Min int S=0; //Sec byte ledPin =13; //Светодиод (исполнительное устройство) long previousMillis = 0; //счетчик прошедшего времени long interval = 1000; //1000мс = 1с void setup() { pinMode(ledPin, OUTPUT); //Настройка дисплея //Установка количества столбцов и строк дисплея lcd.begin(16, 2); // Вывод приветствия при включении питания если нужно lcd.setCursor(0, 0); lcd.print("allduino."); lcd.setCursor(0, 1); lcd.print("forum2x2.ru"); delay (1000);//Задержка приветствия //отрисовка табло lcd.clear(); lcd.setCursor(0, 0); lcd.print(H); lcd.print(":"); lcd.print(M); lcd.print(":"); lcd.print(S); } void loop() { unsigned long currentMillis = millis(); if(currentMillis - previousMillis >= interval) //Если счетчик { previousMillis = currentMillis; //достиг интервала секунды увеличить на 1 S++; } //при заданых секундах S включить светодиод if (S==10) //когда секунды = 10 { digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); } //собственно часы if (S>=60)//если сек = 60 то к мин +1 а сек =0 { M++; S=0; lcd.clear(); } if (M==60)//если мин = 60 то мин и сек =0 а час +1 { H++; M=0; S=0; lcd.clear(); } if (H==24)//если час = 24 то час, мин, сек =0 { H=0; M=0; S=0; lcd.clear(); } //вывод табло lcd.setCursor(0, 0); lcd.print(H); lcd.print(":"); lcd.print(M); lcd.print(":"); lcd.print(S); }
http://playground.arduino.cc/Code/Time
Этот код неправильный в своей логике:
Что имеем, в условии определяем текущее время в миллисекундах от предыдущего более или равно 1секунде?
А если более то насколько?
Правильнее было бы: previousMillis = previousMillis + 1000;
void
loop
()
я с лупами уже лет 25 борюсь (в сетях) ...
а для меги - previousMillis = previousMillis + 992; )))
уже более человеческое лицо
Правильнее было бы: previousMillis = previousMillis + 1000;
Жесть!
Правильнее было бы: previousMillis = previousMillis + 1000;
Жесть!
ну так я жеж потомственный кузнец )))
я конечно не знаю процессор, но любое аппаратное прерывание останавливает исполняемый код в точке прерывания, что и куда при этом процессор засовывает и на что уходит конкретное время рассказывать не буду (для интел так) со всеми вытекающими, в моей программе отставание на 10 минутном цикле составляет 6 миллисекунд в секунду (откуда берётся выяснять безсмыссленно), как там Микоян Хрущёву говорил - СМИРИСЬ!!!
Вы бы Евгений Петрович прояснили полёт вашей мысли, может и я приощусь к великому...
Да, нету никакого полёта, просто жесть.
Мы знакомы? Или так - предположение?
previousMillis = previousMillis + 1000; или previousMillis = currentMillis; зависит от того, что мы хотим получит. Первый вариант дает высокую точность на больших промежутках времени, второй более точно сформирует интервал но с некоторымм его завышением. Для часов первый предпочтительней. Для формирования интервала второй, например требуется ждать ответ от сервера 1000 мсек, так обеспечит что не прекратим ожидание раньше.
Да, нету никакого полёта, просто жесть.
Мы знакомы? Или так - предположение?
"...Блондинка, спинным мозгом чувствую - блондинка..." )))
previousMillis = previousMillis + 1000; или previousMillis = currentMillis; зависит от того, что мы хотим получит. Первый вариант дает высокую точность на больших промежутках времени, второй более точно сформирует интервал но с некоторымм его завышением. Для часов первый предпочтительней. Для формирования интервала второй, например требуется ждать ответ от сервера 1000 мсек, так обеспечит что не прекратим ожидание раньше.
Так я уже вроде как уяснил себе, если нужны ПРАВИЛЬНЫЕ ТАЙМЕРА в коде используем и millis() и micro...() и вешаем их на прерывание, не понял почему их может быть только 25 или кто-то что-то путает
Признаюсь честно, вникать в тонкости архитектуры пожалуй поздновато...
а вот не хочется быть "мужчиной который может но не хочет..."
PS часики на прогоне, чуть позже добавлю и DS и GPS, а может и NTP, мне нужна суточная стабильнось 1 секунда, верю, преодолимо
PS часики на прогоне, чуть позже добавлю и DS и GPS, а может и NTP, мне нужна суточная стабильнось 1 секунда, верю, преодолимо
Сделать это на миллис принципиально? DS3231 дадут гораздо меньшую погрешность.
PS часики на прогоне, чуть позже добавлю и DS и GPS, а может и NTP, мне нужна суточная стабильнось 1 секунда, верю, преодолимо
Сделать это на миллис принципиально? DS3231 дадут гораздо меньшую погрешность.
Не принципиально! Надеюсь, но девайса пока нет, 5 штук потерялись, заказал еще два и GPS - в пути, конечно приятнее при включении девайса не тыкать пальчиком в экран устанавливая время )))
Да и оставлять без присмотра контроллер позиционирующий систему не на один десяток килобаксов не совсем правильно )))
Пока поставьте DS1307 или их тоже нет? При поступлении DS3231 физически их меняете и все. Библиотеки полностью идентичны (если не требуются доп.функции 3231)
Вот к такому решению пришел. Завтра проверю какое отставание или опережение получится.
А что это по-Вашему означает? Вы уверены, что Вы понимаете, что здесь написано. По-русски можете сказать?
Выложил отдельной темой полный код http://arduino.ru/forum/programmirovanie/moi-prosteishie-chasy