Как вывести время и дату без модуля часов

Тема в разделе "Arduino & Shields", создана пользователем Tes1a, 25 дек 2015.

  1. Tes1a

    Tes1a Нерд

    Здравствуйте! Тут сделал регистратор температуры и влажности, хотел бы узнать каким образом можно вывести время и дату напротив моих показаний без модуля часов реального времени.Если можно напишите код пожалуйста
     
  2. AlexVS

    AlexVS Гик

    Не имея RTC, время можно получить из сети Ethernet, но для этого нужен подключенный соответствующий шилд, можно получить например из радиосети с помощью модуля nRF24, если такая в наличии. В любом случае нужен какой то внешний источник реального времени.
     
  3. Tes1a

    Tes1a Нерд

    а без интернета ни как?
     
  4. AlexVS

    AlexVS Гик

    Нужен источник реального времени, без него никак.
     
  5. Tes1a

    Tes1a Нерд

    у меня модуль ethernet есть
     
  6. ImrDuke

    ImrDuke Гик

    Ну если поиграться, то можно же ардуинку заставить время считать. Точность само собой будет низкая, но для эксперимента можно и так.
     
  7. ImrDuke

    ImrDuke Гик

    Я находил такой пример:

    Код (C++):

    #include <LiquidCrystal.h>//библиотека для работы с LCD
    long previousMillis = 0;//переменная для хранения значений таймера
    int sek=0;//значение секунд
    int min=0;//значение минут
    int chas=0;//значение часов
    int knopka=0;//значение кнопки

    LiquidCrystal lcd(12, 11, 5, 4, 3, 2);//инициализация портов

    void setup()
    {
    lcd.begin(16, 2);//иницифлизация дисплея
    pinMode(6,INPUT);//инициализация портов
    pinMode(9,OUTPUT);//инициализация портов
    pinMode(13,OUTPUT);//инициализация портов
    }

    void loop()
    {
       if (millis() - previousMillis >500)
    {
       previousMillis = millis();  //запучкаем таймер
       digitalWrite(13, !digitalRead(13));//меняем значение порта каждые 0.5секунд
     
       if(digitalRead(13)==HIGH)//если 13 нога лог1 то...
       {
         sek++;//переменная секунда + 1
         lcd.clear(); //обновление дисплея
         //вывод символов на дисплей//
         lcd.setCursor(6, 1);
         lcd.print(":");//выводим символ ":"между часами и минутами
         lcd.setCursor(9, 1);
         lcd.print(":");//выводим символ ":"между  минутами и секундами
       }
     
       if(digitalRead(13)==LOW)
       {
         //через каждые 0.5 секунд меняем символ ":" на "."
         lcd.setCursor(9, 1);
         lcd.print(".");
         lcd.setCursor(6, 1);
         lcd.print(".");
       }
     
       if(sek>59)//если переменная секунда больше 59 ...
       {
         sek=0;//сбрасываем ее на 0
         min++;//пишем +1 в переменную минута
       }
     
     
       if(min>59)//если переменная минута больше 59 ...
       {
         min=0;//сбрасываем ее на 0
         chas++;//пишем +1 в переменную час
       }
     
     
     
     
       if(chas>23)//если переменная час больше 23 ...
       {
         chas=0;//сбрасываем ее на 0
       
       }
     
     
     
       //вывод символов на дисплей//
     
       lcd.setCursor(4, 1);//выводим значение часов в строку - 1
       //столбец -4
       lcd.print(chas);//количество часов
     
       lcd.setCursor(7, 1);//выводим значение часов в строку - 1
       //столбец -7
       lcd.print(min);//количество минут
     
       lcd.setCursor(10, 1);//выводим значение часов в строку - 1
       //столбец -10
       lcd.print(sek);//количество секунд
     
     
    }
          //установка времени//
              //кнопка//
     
       if(digitalRead(6)==HIGH&&knopka==0)//если кнопка нажата
       // и перемення "knopka" равна 0 , то ...
       {
          min++;//пишем + 1 в переменную минута
          sek=0;//пишем 0 в переменную секунда
          knopka++;//пишем 1 в переменную кнопка
          //это нужно для того что бы с каждым нажатием кнопки
          //происходило только одно действие
          // плюс защита от "дребезга"
         
         
         
          //с каждым нажатием кнопки обновляем значения на дисплее//
          lcd.setCursor(4, 1);
       lcd.print(chas);
     
       lcd.setCursor(7, 1);
       lcd.print(min);
     
       lcd.setCursor(10, 1);
       lcd.print(sek);
       }
     
        if(digitalRead(6)==LOW&&knopka==1)//если кнопка НЕ нажата
       //и переменная knopka равна - 1 ,то ...
       {
         
          knopka=0;//обнуляем переменную "knopka"
       }
     
    //выводим надпись "CHASI." в строку - 0
    lcd.setCursor(5, 0);
    lcd.print("CHASI.");
    }
     
     
  8. Tes1a

    Tes1a Нерд

    я вот такой вот код написал и это просто она начинает считать с момента включения ардуино
    Код (C++):
    int time=millis()/1000;
    if (time/60/60<10) { Serial.print ("0"); }
    Serial.print (time/60/60);
    Serial.print (":");
    if (time/60%60<10) { Serial.print ("0"); }
    Serial.print ((time/60)%60);
    Serial.print (":");
    if (time%60<10) { Serial.print ("0"); }
    Serial.println (time%60);
    а мне нужно чтобы точное время было,ну более или менее
     
  9. ImrDuke

    ImrDuke Гик

    Тогда только специальная микросхема нужна.
     
  10. Максимус-Бог

    Максимус-Бог Убийца матрёшек

    http://amperka.ru/product/troyka-rtc
    или другой такой модуль. самый популярный чип DS1307. как раз такой-же как в модуле от амперки
     
  11. Onkel

    Onkel Гуру

    нормальная точность будет. полминуты в месяц точность будет, если питание не будет скакать. ну и бесперебойник нужно, чтобы часы не сбились, и прогу делать с учетом того, что напруга может пропасть.
     
  12. shpock

    shpock Гик

    стоимость часиков настолько мала, а реализация проста, что наверное не стоит заморачиватся с подсчетом милисикунд в процесе работы программы, а тем более использовать изернет шилды, инет и т д.
     
  13. a1000

    a1000 Гуру

    Нет, нормальная точность не получится. Попробовал ради интереса на основе примера приведенного ImrDuke запустить часы. Как раз тестировал дисплей Nokia 5110, надо было что-то на него вывести. Так они за час на 3-4 секунды отстали. Ну конечно можно в строке
    Код (C++):
    if (millis() - previousMillis >500)
    поиграть с цифрой 500, но если делать вручную, на более или менее точную калибровку уйдёт не меньше недели. Причём подгонять надо под каждую ардуинку индивидуально.
     
  14. Onkel

    Onkel Гуру

    получается. неделя не нужна. делаете putch() по таймеру, смотрите в терминале с метками и получаете 6 знаков, после чего одной математической операцией решаете проблему. Я на всех в мире, конечно, не пробовал, но у меня на 5-6 атмегах с точностью до 1 один и тот же коэффициент, у меня 6 знаков. Так что можно загонять в модуль одного производителя одной партии один и тот же коэффициент и получать то что я написал - секунды, ну может десяток- другой секунд в месяц.
     
  15. ratman

    ratman Нерд

    Максим B нравится это.
  16. ImrDuke

    ImrDuke Гик

     
  17. Tes1a

    Tes1a Нерд

    Спасибо всем за помощь!!
     

  18. вот тут ещё посмотри
     
  19. Tes1a

    Tes1a Нерд

    выше я уже реализовал подобный код.спасибо.