Самые простецкие часики на точность не претендующие

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Самые просты часики, конечно недоработанные есче, но мож кому пригодятся.

#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);
}
  

 

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

Этот код неправильный в своей логике:

  unsigned long currentMillis = millis();
if(currentMillis - previousMillis >= interval)  //Если счетчик
  {
    previousMillis = currentMillis;              //достиг интервала секунды увеличить на 1 
    S++; 

Что имеем, в условии определяем текущее время в миллисекундах от предыдущего более или равно 1секунде?
А если более то насколько?
Правильнее было бы: previousMillis = previousMillis + 1000;

 

 

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

void loop()

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

я с лупами уже лет 25 борюсь (в сетях)  ...

а для меги -  previousMillis = previousMillis + 992;  )))
уже более человеческое лицо

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:

Правильнее было бы: previousMillis = previousMillis + 1000;

Жесть!

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

ЕвгенийП пишет:

ua6em пишет:

Правильнее было бы: previousMillis = previousMillis + 1000;

Жесть!

ну так я жеж потомственный кузнец )))

я конечно не знаю процессор, но любое аппаратное прерывание останавливает исполняемый код в точке прерывания, что и куда при этом процессор засовывает  и на что уходит конкретное время рассказывать не буду (для интел так) со всеми вытекающими, в моей программе отставание на 10 минутном цикле составляет 6 миллисекунд в секунду (откуда берётся выяснять безсмыссленно), как там Микоян Хрущёву говорил - СМИРИСЬ!!!

Вы бы  Евгений Петрович прояснили полёт вашей мысли, может и я приощусь к великому...

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да, нету никакого полёта, просто жесть.

Мы знакомы? Или так - предположение?

Logik
Offline
Зарегистрирован: 05.08.2014

 previousMillis = previousMillis + 1000; или previousMillis = currentMillis;   зависит от того, что мы хотим получит. Первый вариант дает высокую точность на больших промежутках времени, второй более точно сформирует интервал но с некоторымм его завышением. Для часов первый предпочтительней. Для формирования интервала второй, например требуется ждать ответ от сервера 1000 мсек, так обеспечит что не прекратим ожидание раньше.

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

ЕвгенийП пишет:

Да, нету никакого полёта, просто жесть.

Мы знакомы? Или так - предположение?

"...Блондинка, спинным мозгом чувствую - блондинка..."  )))

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

Logik пишет:

 previousMillis = previousMillis + 1000; или previousMillis = currentMillis;   зависит от того, что мы хотим получит. Первый вариант дает высокую точность на больших промежутках времени, второй более точно сформирует интервал но с некоторымм его завышением. Для часов первый предпочтительней. Для формирования интервала второй, например требуется ждать ответ от сервера 1000 мсек, так обеспечит что не прекратим ожидание раньше.

Так я уже вроде как уяснил себе, если нужны ПРАВИЛЬНЫЕ ТАЙМЕРА в коде используем и millis() и micro...() и вешаем их на прерывание, не понял почему их может быть только 25 или кто-то что-то путает
Признаюсь честно, вникать в тонкости архитектуры пожалуй поздновато...
а вот не хочется быть "мужчиной который может но не хочет..."

PS часики на прогоне, чуть позже добавлю и DS и GPS, а может и NTP, мне нужна суточная стабильнось 1 секунда, верю, преодолимо

bwn
Offline
Зарегистрирован: 25.08.2014

ua6em пишет:

PS часики на прогоне, чуть позже добавлю и DS и GPS, а может и NTP, мне нужна суточная стабильнось 1 секунда, верю, преодолимо

Сделать это на миллис принципиально? DS3231 дадут гораздо меньшую погрешность.

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

bwn пишет:

ua6em пишет:

PS часики на прогоне, чуть позже добавлю и DS и GPS, а может и NTP, мне нужна суточная стабильнось 1 секунда, верю, преодолимо

Сделать это на миллис принципиально? DS3231 дадут гораздо меньшую погрешность.

Не принципиально! Надеюсь, но девайса пока нет, 5 штук потерялись, заказал еще два и GPS - в пути, конечно приятнее при включении девайса не тыкать пальчиком в экран устанавливая время )))

Да и оставлять без присмотра контроллер позиционирующий систему не на один десяток килобаксов не совсем правильно )))

bwn
Offline
Зарегистрирован: 25.08.2014

Пока поставьте DS1307 или их тоже нет? При поступлении DS3231 физически их меняете и все. Библиотеки полностью идентичны (если не требуются доп.функции 3231)

Zom
Offline
Зарегистрирован: 20.04.2017
if (micros() - pm > 999992 && (pm = micros()))
{
sek++
}

Вот к такому решению пришел. Завтра проверю какое отставание или опережение получится.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Zom пишет:

if (micros() - pm > 999992 && (pm = micros()))
{
sek++
}

А что это по-Вашему означает? Вы уверены, что Вы понимаете, что здесь написано. По-русски можете сказать?

Zom
Offline
Зарегистрирован: 20.04.2017

Выложил отдельной темой полный код http://arduino.ru/forum/programmirovanie/moi-prosteishie-chasy