Потихоньку осваиваю Arduino.
С температурой, LCD, кнопочками и светодиодами уже научился работать. Написал нужные коды для оборудующего проекта.
Сегодня делал часы. Часы как отдельное устройство работают. Проблем нет. Основной элемент Delay(1000). Тобишь каждую секунду цикл повторяется.
Но вот встал вопрос. А как сделать что бы часы отсчитывали время параллельно?
Например мне надо что бы каждые 0,3сек опрашивалось состояние кнопок и в то же время работали часы. По сути нынешний алгоритм дает паузу за 1 сек в работе всей программы.
16 комментариев на «“часы”»
один из вариантов — использовать внешние часы реального времени (например,такую микросхему ).
вот еще нашелmk90.blogspot.com/2009/03/repeated-start-arduino.html
Теперь надо разобраться как это подключить и программку навоять
вот еще нашелmk90.blogspot.com/2009/03/repeated-start-arduino.html
Теперь надо разобраться как это подключить и программку навоять
вот ещеhttp://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1235070596
Если нужна точность — то часы реального времени самый хороший вариант.robocraft.ru/blog/arduino/35.html
А Delay вообще использовать последнее дело=) Как вы правильно заметили МК на это время самым тунеядским делом простаивает — непорядок!
Если показометрических функций достаточно то можно применить
millis();
или
micros();
почитать про эти функции можно тут
Пример в Arduino IDE — «Blink without Delay».
А вообще тут с таймером(ми) работать надо, Wiring такого не умеет, надо в нормальном компиляторе на чистом С ваять.
Да мне часы нужны что бы расписание в устройство загнать. Точность не важна т.к. собираюсь скажем каждый час часы синхронизировать с ПК или c NTP.
Лучше накидай RTC модулец.
В случае столь частой синхронизации и довольно низких требований к точности — несколько избыточно. ИМХО естественно=)
ГОТОВО )))
Собрал на DS1307N
За 12 часов часы убежали вперед на 3 секунды. В принципе можно согласно документации еще подстройку сделать и добиться более точного хода. Но лично меня такая точность полностью удовлетворяет.
Если надо то могу выложить фото и код программы.
Ну почему бы и нет, давай, посмотрим.
Сразу говорю, что программированием не занимался ну очень давно и потому код может быть кривоват. Буду благодарен за оптимизацию и за здоровую критику)))
Программа сразу же начинает выводить данные на 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
А можно узнать сколько памяти занимает библиотека DS1307?
Если с моим кодом в 8к влезет — тоже расписание сделаю.
6,86 КБ
Много! Тогда на одной wire.h попробовать можно как тут:http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1198881858
Получил езернет модуль для ардуино. Хочу что бы часы автоматом синхронизировались с 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 кстати, код лучше обрамлять тегами
и думаю, что будет логично для обсуждения темы ethernet создать отдельную тему 😉