часы


Потихоньку осваиваю Arduino.

С температурой, LCD, кнопочками и светодиодами уже научился работать. Написал нужные коды для оборудующего проекта.

Сегодня делал часы. Часы как отдельное устройство работают. Проблем нет. Основной элемент Delay(1000). Тобишь каждую секунду цикл повторяется.

Но вот встал вопрос. А как сделать что бы часы отсчитывали время параллельно?
Например мне надо что бы каждые 0,3сек опрашивалось состояние кнопок и в то же время работали часы. По сути нынешний алгоритм дает паузу за 1 сек в работе всей программы.


16 комментариев на «“часы”»

    • Если нужна точность — то часы реального времени самый хороший вариант.
      А Delay вообще использовать последнее дело=) Как вы правильно заметили МК на это время самым тунеядским делом простаивает — непорядок!
      Если показометрических функций достаточно то можно применить
      millis();
      или
      micros();
      почитать про эти функции можно тут robocraft.ru/blog/arduino/35.html
      Пример в Arduino IDE — «Blink without Delay».
      А вообще тут с таймером(ми) работать надо, Wiring такого не умеет, надо в нормальном компиляторе на чистом С ваять.

    • Да мне часы нужны что бы расписание в устройство загнать. Точность не важна т.к. собираюсь скажем каждый час часы синхронизировать с ПК или c NTP.

    • В случае столь частой синхронизации и довольно низких требований к точности — несколько избыточно. ИМХО естественно=)

  1. ГОТОВО )))

    Собрал на DS1307N

    За 12 часов часы убежали вперед на 3 секунды. В принципе можно согласно документации еще подстройку сделать и добиться более точного хода. Но лично меня такая точность полностью удовлетворяет.

    Если надо то могу выложить фото и код программы.

  2. Сразу говорю, что программированием не занимался ну очень давно и потому код может быть кривоват. Буду благодарен за оптимизацию и за здоровую критику)))

    Программа сразу же начинает выводить данные на LCD и смотрит COM порт. Как только в порту появляется символ R то программа загоняет в микросхему новые данные о времени и дате.

    Формат данный с COM должен быть сл. R’секунды»минуты’часы’01’число’месяц’год’ (01- я пока не понял что за указатель)

    Например R00101301010110 — 13:10:00 01/01/2010

    Почиму то в моем варианте секунды не воспринимаются и чип в любом случае выставляет 00

    #include <WProgram.h>
    #include <Wire.h>
    #include <DS1307.h>
    #include <LiquidCrystalRus.h>
    LiquidCrystalRus lcd(4, 3, 2, 5, 6, 8, 7);
    int rtc[7];

    void setup()
    {
    Serial.begin(9600);
    }

    void loop()
    {
    int r = Serial.read();
    if (r==’R’) ds1307_set();
    RTC.get(rtc,true);
    for(int i=2; i>=0; i—) //Получаем время, подставляем ‘0’ для удобства и ставим ‘:’
    {
    if (rtc[i]<10) lcd.print(«0»);
    lcd.print(rtc[i]);
    if (i>0) lcd.print(":");
    }
    lcd.setCursor(0,1); //Переводим курсор на вторую строчку
    for (int i=4;i<=6;i++)
    {
    if (rtc[i]<10) lcd.print(«0»); //Получаем дату, подставляем ‘0’ для удобства и ставим ‘/’
    lcd.print(rtc[i]);
    if (i<6) lcd.print("/");
    }
    delay(900);
    lcd.clear();
    }

    void ds1307_set() //отправляем данные в DS1307
    {
    RTC.stop();

    int k = Serial.available();
    for (int l=0; l<=k/2-1; l++)
    {
    int b1 = Serial.read();
    int b2 = Serial.read();
    RTC.set(l, (b1-48)*10+(b2-48));
    }
    RTC.start();
    }

    фото тут — vqd.users.photofile.ru/photo/vqd/115396599/xlarge/135362091.jpg

  3. Получил езернет модуль для ардуино. Хочу что бы часы автоматом синхронизировались с NTP
    Полностью синхронизацию завтра думаю добью а пока есть код для получения даты и времени

    Покритикуйте пожалуйста

    #include <Ethernet.h>

    byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
    byte ip[] = { 192, 168, 0, 45 }; //IP Arduino
    byte mask[] = {255, 255, 255, 0};
    byte gw[] = {192, 168, 0, 1};
    byte server[] = { 192, 43, 244, 18 }; // time.nist.gov

    Client client(server, 13); //порт

    void setup()
    {
    Ethernet.begin(mac, ip, gw, mask);
    Serial.begin(9600);

    delay(1000);

    Serial.println(«connecting…»);

    if (client.connect()) {
    Serial.println(«connected»);
    } else {
    Serial.println(«connection failed»);
    }
    }

    void loop()
    {
    if (client.available()) {
    char c = client.read();
    Serial.print(c);
    }

    if (!client.connected()) {
    Serial.println();
    Serial.println(«disconnecting.»);
    client.stop();
    for(;;)
    ;
    }
    }

    • тоже недавно получил эзернетовский модуль — буду играться 🙂

      PS кстати, код лучше обрамлять тегами

      <code>

      и думаю, что будет логично для обсуждения темы ethernet создать отдельную тему 😉

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Android Arduino Bluetooth CraftDuino DIY IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна конкурс манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение