часы

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

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

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

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

Комментарии (16)

RSS свернуть / развернуть
+
0
один из вариантов — использовать внешние часы реального времени (например, такую микросхему).
avatar

noonv

  • 1 марта 2010, 16:47
комментарий был удален

+
0
вот еще нашел mk90.blogspot.com/2009/03/repeated-start-arduino.html

Теперь надо разобраться как это подключить и программку навоять

вот еще www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1235070596
avatar

vqd

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

Zoltberg

  • 1 марта 2010, 18:59
+
0
Да мне часы нужны что бы расписание в устройство загнать. Точность не важна т.к. собираюсь скажем каждый час часы синхронизировать с ПК или c NTP.
avatar

vqd

  • 2 марта 2010, 06:10
+
+1
Лучше накидай RTC модулец.
avatar

SWAT

  • 2 марта 2010, 08:14
+
0
В случае столь частой синхронизации и довольно низких требований к точности — несколько избыточно. ИМХО естественно=)
avatar

Zoltberg

  • 3 марта 2010, 01:37
+
+1
ГОТОВО )))

Собрал на DS1307N

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

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

vqd

  • 3 марта 2010, 06:21
+
0
Ну почему бы и нет, давай, посмотрим.
avatar

SWAT

  • 3 марта 2010, 08:05
+
+1
Сразу говорю, что программированием не занимался ну очень давно и потому код может быть кривоват. Буду благодарен за оптимизацию и за здоровую критику)))

Программа сразу же начинает выводить данные на 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
avatar

vqd

  • 3 марта 2010, 08:22
+
0
А можно узнать сколько памяти занимает библиотека DS1307?
Если с моим кодом в 8к влезет — тоже расписание сделаю.
avatar

boa

  • 3 марта 2010, 13:57
+
0
6,86 КБ
avatar

vqd

  • 3 марта 2010, 14:19
+
0
Много! Тогда на одной wire.h попробовать можно как тут: www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1198881858
avatar

boa

  • 3 марта 2010, 14:28
+
+1
Получил езернет модуль для ардуино. Хочу что бы часы автоматом синхронизировались с 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(;;)
;
}
}
avatar

vqd

  • 15 марта 2010, 19:09
+
0
тоже недавно получил эзернетовский модуль — буду играться :)

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

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

noonv

  • 15 марта 2010, 23:20
+
0
avatar

noonv

  • 16 марта 2010, 13:00

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.