Официальный сайт компании Arduino по адресу arduino.cc
Электронные часы термометр без использования модуля/микросхемы точного времени
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Ср, 20/03/2013 - 16:04
Доброе время суток.
Позвольте представить мою идею. Электронные часы термометр без использования модуля/микросхемы точного времени.
Идея такова: использовать код из стандартного примера «Udp NTP Client», получу время и выведу его на 7-и сегментную сборку из четырёх цифр. Также использую IR приемник (3-х ногий) буду ловить сигнал всех пультов от бытовой техники и на основании полученного сигнала (неважно какого) буду на 3 секунды выводить температуру с аналогово датчика температуры.
Как думаете получится?
Прошу высказать свои замечания и критику.
Вечером попробую все мои идее воплотить и отписаться тут.
Код для получения времени:
#include <SPI.h> #include <Ethernet.h> #include <EthernetUdp.h> byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; unsigned int localPort = 8888; // local port to listen for UDP packets IPAddress timeServer(192, 43, 244, 18); // time.nist.gov NTP server const int NTP_PACKET_SIZE= 48; // NTP time stamp is in the first 48 bytes of the message byte packetBuffer[ NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets EthernetUDP Udp; void setup() { Serial.begin(9600); if (Ethernet.begin(mac) == 0) { Serial.println("Failed to configure Ethernet using DHCP"); for(;;) ; } Udp.begin(localPort); } void loop() { sendNTPpacket(timeServer); delay(1000); if ( Udp.parsePacket() ) { Udp.read(packetBuffer,NTP_PACKET_SIZE); // read the packet into the buffer unsigned long highWord = word(packetBuffer[40], packetBuffer[41]); unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]); unsigned long secsSince1900 = highWord << 16 | lowWord; const unsigned long seventyYears = 2208988800UL; unsigned long epoch = secsSince1900 - seventyYears; Serial.print("The UTC time is "); // UTC is the time at Greenwich Meridian (GMT) Serial.print((epoch % 86400L) / 3600); // print the hour (86400 equals secs per day) Serial.print(':'); if ( ((epoch % 3600) / 60) < 10 ) {Serial.print('0');} Serial.print((epoch % 3600) / 60); // print the minute (3600 equals secs per minute) Serial.print(':'); if ( (epoch % 60) < 10 ) {Serial.print('0');} Serial.println(epoch %60); // print the second } delay(10000); } unsigned long sendNTPpacket(IPAddress& address) { memset(packetBuffer, 0, NTP_PACKET_SIZE); packetBuffer[0] = 0b11100011; // LI, Version, Mode packetBuffer[1] = 0; // Stratum, or type of clock packetBuffer[2] = 6; // Polling Interval packetBuffer[3] = 0xEC; // Peer Clock Precision packetBuffer[12] = 49; packetBuffer[13] = 0x4E; packetBuffer[14] = 49; packetBuffer[15] = 52; Udp.beginPacket(address, 123); //NTP requests are to port 123 Udp.write(packetBuffer,NTP_PACKET_SIZE); Udp.endPacket(); }
Получится, почему бы и нет.
Только я здесь часов не вижу. Это скорее усовершенствованный радиоприемник, настроенный на станцию "Маяк", с его "Передаем сигналы точного времени. Начало шестого сигнала соответствует .... В Петропавловске-Камчатском полночь".
Ну и индикатор температуры до кучи...
Отлично, :)) буду сегодня тестировать.
под словом часы имелось ввиду индикация текущего точного времени.
протестировал, получилось интересно :)
подскажите пожайлусто более грамотный способ сделать +4 часа.
Использую пока эту конструкцию. Поздно уже, не думается...
А не логичней сделать синхронизацию времени при включении, и коррекцию раз в 1, 5 или 15 минут? То есть что бы часы, были часами и шли нормально если инет отвалится?
p/s идея хорошая, возьму на заметку и попытаюсь прикрутить к своей измерялке влажности, температуры, давления .... заодно и графики можно будет по времени строить ...
В цикле считать время без использования "первичных часов" грамотно не получится.
Как то пробовал уже делать подобные часы (только без синхронизации откуда либо) врут сильно. Хотя попробовать можно.
текущий релиз кода.
"В цикле считать время без использования "первичных часов" грамотно не получится."
Не понял ... Яж говорю с синхронизацией через промежутки ... и врут вроде не сильно, тоже где то видел ... несколько секунд в сутки ...
сегодня попробую, отпишусь за точность.
Накидал побыстрому, данный скеч показывает температуру и время на LCD дисплей. Время контроллер считает сам, и раз в минуту синхронизируется с NTP.
Код писал в блокноте на работе (в обед).
Ух ты ) Быстро ... я с трудом пишу и долго ) Возьму за основу ваш скетчик, себе интегрирую ... как своё доделаю, тоже покажу ... только пока всё на макетке и непрезентабельно совсем ...