Arduino Mega Server
Модератор: Alex
Re: Arduino Mega Server
Говоря о подключении контроллеров, я имел в виду...
я прочитал, всю эту ветку, очень интересно.
знаю, что к ардуино уно можно подцепить интернет шилд, несколько таких ардуин в роутер = сеть...
через последовательное соединение типа можно... без инет шилда.
через 1wire по моему можно, i2с
RS 232 rs 484.
в каком то посте было написано, как подключать датчики. хотелось бы что нибудь про контроллеры дополнительные...
просто для того, что бы для начала заложить провода...
или кучу проложить, подписать, а потом разбираться...
я прочитал, всю эту ветку, очень интересно.
знаю, что к ардуино уно можно подцепить интернет шилд, несколько таких ардуин в роутер = сеть...
через последовательное соединение типа можно... без инет шилда.
через 1wire по моему можно, i2с
RS 232 rs 484.
в каком то посте было написано, как подключать датчики. хотелось бы что нибудь про контроллеры дополнительные...
просто для того, что бы для начала заложить провода...
или кучу проложить, подписать, а потом разбираться...
-
- Сообщения: 2357
- Зарегистрирован: Пт апр 20, 2012 12:53 pm
- Благодарил (а): 42 раза
- Поблагодарили: 262 раза
Re: Arduino Mega Server
Вам нужно чётче формулировать вопросы и задавать их по одному за один раз, тогда можно будет ответить что-нибудь вразумительное.
По поводу проводки можно почитать здесь:
Проводка для умного дома - рекомендации по проводке для умного дома
http://smartliving.ru/forum/viewtopic.p ... t=102#p660
Рекомендации по умному дому - несколько полезных советов
http://smartliving.ru/forum/viewtopic.p ... 538#p10312
По поводу проводки можно почитать здесь:
Проводка для умного дома - рекомендации по проводке для умного дома
http://smartliving.ru/forum/viewtopic.p ... t=102#p660
Рекомендации по умному дому - несколько полезных советов
http://smartliving.ru/forum/viewtopic.p ... 538#p10312
-
- Сообщения: 62
- Зарегистрирован: Ср авг 26, 2015 3:15 pm
- Благодарил (а): 1 раз
- Поблагодарили: 6 раз
Re: Arduino Mega Server
Коллеги, все таки самостоятельно не могу победить проблему со временем.
Может кто нибудь увидит, где все таки ошибка?
В Serial выдается No NTP Response и не синхронизируется:(
P.S. Комментирование еще сырое, я над ним в общем еще работаю тоже:)
Может кто нибудь увидит, где все таки ошибка?
В Serial выдается No NTP Response и не синхронизируется:(
P.S. Комментирование еще сырое, я над ним в общем еще работаю тоже:)
СпойлерПоказать
/*
Modul Virtual RTC
part of Arduino Mega Server project
*/
// Virtual RTC ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
char timeServer[] = "time.nits.gov"; // -------------------------------------- Установка адреса NTP сервера
unsigned int localPort = 8888; // ------------------------------------------- Локальный порт для чтения UDP пакетов
EthernetUDP Udp; // ---------------------------------------------------------- Экземпляр, указывающий, что пакеты нужно отправлять и получать по UDP
const int timeZone = 5; // --------------------------------------------------- Временная зона
time_t prevDisplay = 0; // --------------------------------------------------- Когда были показаны цифровые часы
// Инициализация RTC ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
void rtcInit() {
Udp.begin(localPort); // --------------------------------------------------- Получение данных с порта UDP
Serialprint("Waiting for NTP sync... \n"); // ------------------------------ Вывод сообщения по Serial
setSyncProvider(getNtpTime);
modulRtc = 1;
}
// Работа RTC ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
void rtcWorks() {
if (timeStatus() != timeNotSet) { // ---------------------------------------
if (now() != prevDisplay) { // ------------------------------------------- Если текущие данные времени на дисплее не соответствует предыдущим
setLifer(); // --------------------------------------------------------- предоставление значения для Лайфера
prevDisplay = now(); // ------------------------------------------------ То предыдущие данные меняются на текущие
//digitalClockDisplay(); // ---------------------------------------------- Вывод для цифрового дисплея
}
}
}
// Вывод времени ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
void printDigits(int digits) {
if(digits < 10) {
Serial.print('0');
}
Serial.print(digits);
}
// Вывод на Serial ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
void serialRTC() {
Serial.print(year());
Serial.print("-");
printDigits(month());
Serial.print("-");
printDigits(day());
Serial.print(" ");
printDigits(hour());
Serial.print(":");
printDigits(minute());
Serial.print(":");
printDigits(second());
}
void timeStamp() {
serialRTC();
Serial.println(" ");
}
void printRTC(){
serialRTC();
Serial.println();
}
// NTP code
const int NTP_PACKET_SIZE = 48; // ------------------------------------------- Время NTP хранится в первых 48 байтах
byte packetBuffer[NTP_PACKET_SIZE]; // --------------------------------------- Буфер для входящих и исходящих пакетов
#ifdef RTC_FEATURE // -------------------------------------------------------- RTC Функции
// Получение времени с сервера ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
time_t getNtpTime() {
while (Udp.parsePacket() > 0) ; // ----------------------------------------- Отменить все ранее принятые пакеты
Serialprint("Transmit NTP request\n");
sendNTPpacket(timeServer);
uint32_t beginWait = millis();
while (millis() - beginWait < 1500) {
int size = Udp.parsePacket();
if (size >= NTP_PACKET_SIZE) {
Serialprint("Receive NTP response\n");
Udp.read(packetBuffer, NTP_PACKET_SIZE); // ---------------------------- чтение пакета в буфере
unsigned long secsSince1900;
// convert four bytes starting at location 40 to a long integer
secsSince1900 = (unsigned long)packetBuffer[40] << 24;
secsSince1900 |= (unsigned long)packetBuffer[41] << 16;
secsSince1900 |= (unsigned long)packetBuffer[42] << 8;
secsSince1900 |= (unsigned long)packetBuffer[43];
return secsSince1900 - 2208988800UL + timeZone * SECS_PER_HOUR;
}
}
Serialprint("No NTP response\n");
return 0; // return 0 if unable to get the time
}
// Оптавка NTP запроса на сервер времени по адресу
void sendNTPpacket(char* address) {
// Установка всех байтов в буфере на 0
memset(packetBuffer, 0, NTP_PACKET_SIZE);
// Инициализация значений, необходимых для формирования NTP запроса
// (См URL выше для более подробной информации о пакетах)
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
// 8 bytes of zero for Root Delay & Root Dispersion
packetBuffer[12] = 49;
packetBuffer[13] = 0x4E;
packetBuffer[14] = 49;
packetBuffer[15] = 52;
// all NTP fields have been given values, now
// you can send a packet requesting a timestamp:
Udp.beginPacket(address, 123); //NTP requests are to port 123
Udp.write(packetBuffer, NTP_PACKET_SIZE);
Udp.endPacket();
}
#endif
// Продолжительность
void showDuration(time_t duration) {
// prints the duration in days, hours, minutes and seconds
Serialprint(" (duration ");
if(duration >= SECS_PER_DAY){
Serial.print(duration / SECS_PER_DAY);
Serialprint(" day ");
duration = duration % SECS_PER_DAY;
}
if(duration >= SECS_PER_HOUR){
Serial.print(duration / SECS_PER_HOUR);
Serialprint(" hour ");
duration = duration % SECS_PER_HOUR;
}
if(duration >= SECS_PER_MIN){
Serial.print(duration / SECS_PER_MIN);
Serialprint(" min ");
duration = duration % SECS_PER_MIN;
}
Serial.print(duration);
Serialprint(" sec) \n");
}
void checkEvent(time_t* prevEvent) {
time_t duration = 0;
time_t timeNow = now();
if (*prevEvent > 0) {
duration = timeNow - *prevEvent;
}
if (duration > 0) {
showDuration(duration);
}
*prevEvent = timeNow;
}
// Uptime
char uptimeString[14];
/* ----------------------------------------------------------
Function makeUptimeString(char z[], char nop[])
convert system millis() to formstted string days hh.mm.ss
Used globsl variable char uptimeString[14];
Auto reset ~50 days
TODO: save to EEPROM x50 days periods
------------------------------------------------------------- */
void makeUptimeString(char zero[], char nop[]) {
char* zh;
char* zm;
char* zs;
unsigned long totalSeconds = millis() / 1000;
unsigned long days = totalSeconds / 86400;
unsigned long tsHours = totalSeconds - days * 86400;
unsigned long hours = tsHours / 3600;
unsigned long tsMinutes = tsHours - hours * 3600;
unsigned long minutes = tsMinutes / 60;
unsigned long seconds = tsMinutes - minutes * 60;
if (hours < 10) {zh = zero;} else {zh = nop;}
if (minutes < 10) {zm = zero;} else {zm = nop;}
if (seconds < 10) {zs = zero;} else {zs = nop;}
sprintf(uptimeString, "%d %s%d:%s%d:%s%d", (int)days, zh, (int)hours, zm, (int)minutes, zs, (int)seconds);
}
// Lifer
byte lifer;
void setLifer() {
lifer++;
if (lifer > 6) {
lifer = 0;
}
}
Modul Virtual RTC
part of Arduino Mega Server project
*/
// Virtual RTC ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
char timeServer[] = "time.nits.gov"; // -------------------------------------- Установка адреса NTP сервера
unsigned int localPort = 8888; // ------------------------------------------- Локальный порт для чтения UDP пакетов
EthernetUDP Udp; // ---------------------------------------------------------- Экземпляр, указывающий, что пакеты нужно отправлять и получать по UDP
const int timeZone = 5; // --------------------------------------------------- Временная зона
time_t prevDisplay = 0; // --------------------------------------------------- Когда были показаны цифровые часы
// Инициализация RTC ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
void rtcInit() {
Udp.begin(localPort); // --------------------------------------------------- Получение данных с порта UDP
Serialprint("Waiting for NTP sync... \n"); // ------------------------------ Вывод сообщения по Serial
setSyncProvider(getNtpTime);
modulRtc = 1;
}
// Работа RTC ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
void rtcWorks() {
if (timeStatus() != timeNotSet) { // ---------------------------------------
if (now() != prevDisplay) { // ------------------------------------------- Если текущие данные времени на дисплее не соответствует предыдущим
setLifer(); // --------------------------------------------------------- предоставление значения для Лайфера
prevDisplay = now(); // ------------------------------------------------ То предыдущие данные меняются на текущие
//digitalClockDisplay(); // ---------------------------------------------- Вывод для цифрового дисплея
}
}
}
// Вывод времени ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
void printDigits(int digits) {
if(digits < 10) {
Serial.print('0');
}
Serial.print(digits);
}
// Вывод на Serial ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
void serialRTC() {
Serial.print(year());
Serial.print("-");
printDigits(month());
Serial.print("-");
printDigits(day());
Serial.print(" ");
printDigits(hour());
Serial.print(":");
printDigits(minute());
Serial.print(":");
printDigits(second());
}
void timeStamp() {
serialRTC();
Serial.println(" ");
}
void printRTC(){
serialRTC();
Serial.println();
}
// NTP code
const int NTP_PACKET_SIZE = 48; // ------------------------------------------- Время NTP хранится в первых 48 байтах
byte packetBuffer[NTP_PACKET_SIZE]; // --------------------------------------- Буфер для входящих и исходящих пакетов
#ifdef RTC_FEATURE // -------------------------------------------------------- RTC Функции
// Получение времени с сервера ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
time_t getNtpTime() {
while (Udp.parsePacket() > 0) ; // ----------------------------------------- Отменить все ранее принятые пакеты
Serialprint("Transmit NTP request\n");
sendNTPpacket(timeServer);
uint32_t beginWait = millis();
while (millis() - beginWait < 1500) {
int size = Udp.parsePacket();
if (size >= NTP_PACKET_SIZE) {
Serialprint("Receive NTP response\n");
Udp.read(packetBuffer, NTP_PACKET_SIZE); // ---------------------------- чтение пакета в буфере
unsigned long secsSince1900;
// convert four bytes starting at location 40 to a long integer
secsSince1900 = (unsigned long)packetBuffer[40] << 24;
secsSince1900 |= (unsigned long)packetBuffer[41] << 16;
secsSince1900 |= (unsigned long)packetBuffer[42] << 8;
secsSince1900 |= (unsigned long)packetBuffer[43];
return secsSince1900 - 2208988800UL + timeZone * SECS_PER_HOUR;
}
}
Serialprint("No NTP response\n");
return 0; // return 0 if unable to get the time
}
// Оптавка NTP запроса на сервер времени по адресу
void sendNTPpacket(char* address) {
// Установка всех байтов в буфере на 0
memset(packetBuffer, 0, NTP_PACKET_SIZE);
// Инициализация значений, необходимых для формирования NTP запроса
// (См URL выше для более подробной информации о пакетах)
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
// 8 bytes of zero for Root Delay & Root Dispersion
packetBuffer[12] = 49;
packetBuffer[13] = 0x4E;
packetBuffer[14] = 49;
packetBuffer[15] = 52;
// all NTP fields have been given values, now
// you can send a packet requesting a timestamp:
Udp.beginPacket(address, 123); //NTP requests are to port 123
Udp.write(packetBuffer, NTP_PACKET_SIZE);
Udp.endPacket();
}
#endif
// Продолжительность
void showDuration(time_t duration) {
// prints the duration in days, hours, minutes and seconds
Serialprint(" (duration ");
if(duration >= SECS_PER_DAY){
Serial.print(duration / SECS_PER_DAY);
Serialprint(" day ");
duration = duration % SECS_PER_DAY;
}
if(duration >= SECS_PER_HOUR){
Serial.print(duration / SECS_PER_HOUR);
Serialprint(" hour ");
duration = duration % SECS_PER_HOUR;
}
if(duration >= SECS_PER_MIN){
Serial.print(duration / SECS_PER_MIN);
Serialprint(" min ");
duration = duration % SECS_PER_MIN;
}
Serial.print(duration);
Serialprint(" sec) \n");
}
void checkEvent(time_t* prevEvent) {
time_t duration = 0;
time_t timeNow = now();
if (*prevEvent > 0) {
duration = timeNow - *prevEvent;
}
if (duration > 0) {
showDuration(duration);
}
*prevEvent = timeNow;
}
// Uptime
char uptimeString[14];
/* ----------------------------------------------------------
Function makeUptimeString(char z[], char nop[])
convert system millis() to formstted string days hh.mm.ss
Used globsl variable char uptimeString[14];
Auto reset ~50 days
TODO: save to EEPROM x50 days periods
------------------------------------------------------------- */
void makeUptimeString(char zero[], char nop[]) {
char* zh;
char* zm;
char* zs;
unsigned long totalSeconds = millis() / 1000;
unsigned long days = totalSeconds / 86400;
unsigned long tsHours = totalSeconds - days * 86400;
unsigned long hours = tsHours / 3600;
unsigned long tsMinutes = tsHours - hours * 3600;
unsigned long minutes = tsMinutes / 60;
unsigned long seconds = tsMinutes - minutes * 60;
if (hours < 10) {zh = zero;} else {zh = nop;}
if (minutes < 10) {zm = zero;} else {zm = nop;}
if (seconds < 10) {zs = zero;} else {zs = nop;}
sprintf(uptimeString, "%d %s%d:%s%d:%s%d", (int)days, zh, (int)hours, zm, (int)minutes, zs, (int)seconds);
}
// Lifer
byte lifer;
void setLifer() {
lifer++;
if (lifer > 6) {
lifer = 0;
}
}
-
- Сообщения: 2357
- Зарегистрирован: Пт апр 20, 2012 12:53 pm
- Благодарил (а): 42 раза
- Поблагодарили: 262 раза
Re: Arduino Mega Server
Не совсем понятна причина вашей проблемы. Дистрибутив у всех одинаковый и у всех работает, не понятно почему у вас не работает. Может быть дело не в АМС, а причина какая-то внешняя (например, файервол или что-то подобное).
-
- Сообщения: 31
- Зарегистрирован: Пт мар 13, 2015 5:10 pm
- Благодарил (а): 8 раз
- Поблагодарили: 1 раз
Re: Arduino Mega Server
А разве NTP работает на порту 8888GaiverX писал(а):Коллеги, все таки самостоятельно не могу победить проблему со временем.
Может кто нибудь увидит, где все таки ошибка?
В Serial выдается No NTP Response и не синхронизируется:(
P.S. Комментирование еще сырое, я над ним в общем еще работаю тоже:)
unsigned int localPort = 8888;
Добро торжествует, зло действует
-
- Сообщения: 31
- Зарегистрирован: Пт мар 13, 2015 5:10 pm
- Благодарил (а): 8 раз
- Поблагодарили: 1 раз
Re: Arduino Mega Server
сегодня Поставил AMS на iBoardPro
запустился
НО
1. на странице нет информации:
пример по карте Сылка на скрин
браузер IE11
2. также не пашет RTC
запустился
НО
1. на странице нет информации:
пример по карте Сылка на скрин
браузер IE11
2. также не пашет RTC
Лог сериалаПоказать
MEGA started...
Init SD card... OK
index.htm... found
Waiting for NTP sync...
Transmit NTP request
No NTP response
Connect to MajorDoMo... failed
Init SD card... OK
1970-01-01 00:00:41 ;Open!
1970-01-01 00:00:41 not connected
1970-01-01 00:00:41 +Norm
1970-01-01 00:00:41 not connected
1970-01-01 00:01:00 ;Open!
1970-01-01 00:01:00 not connected
1970-01-01 00:01:00 +Norm
1970-01-01 00:01:00 not connected
1970-01-01 00:01:00 not connected
1970-01-01 00:01:01 not connected
1970-01-01 00:01:21 not connected
1970-01-01 00:01:41 not connected
Init SD card... OK
index.htm... found
Waiting for NTP sync...
Transmit NTP request
No NTP response
Connect to MajorDoMo... failed
Init SD card... OK
1970-01-01 00:00:41 ;Open!
1970-01-01 00:00:41 not connected
1970-01-01 00:00:41 +Norm
1970-01-01 00:00:41 not connected
1970-01-01 00:01:00 ;Open!
1970-01-01 00:01:00 not connected
1970-01-01 00:01:00 +Norm
1970-01-01 00:01:00 not connected
1970-01-01 00:01:00 not connected
1970-01-01 00:01:01 not connected
1970-01-01 00:01:21 not connected
1970-01-01 00:01:41 not connected
- Рейтинг: 1.16%
Добро торжествует, зло действует
-
- Сообщения: 2357
- Зарегистрирован: Пт апр 20, 2012 12:53 pm
- Благодарил (а): 42 раза
- Поблагодарили: 262 раза
Re: Arduino Mega Server
Супер. Вы — молодец.
Я бы начал с 2-х вещей:
1. заменил бы ие на фф
2. поставил бы стандартные ип
И, если у вас не стоит «-1» в серверном цикле, то поставил бы «мах_сокетс — 1»
Я бы начал с 2-х вещей:
1. заменил бы ие на фф
2. поставил бы стандартные ип
И, если у вас не стоит «-1» в серверном цикле, то поставил бы «мах_сокетс — 1»
-
- Сообщения: 23
- Зарегистрирован: Пт сен 11, 2015 9:05 am
- Благодарил (а): 2 раза
- Поблагодарили: 3 раза
Re: Arduino Mega Server
Методом проб и ошибок победил эту проблему.Коллеги, все таки самостоятельно не могу победить проблему со временем.
Может кто нибудь увидит, где все таки ошибка?
В Serial выдается No NTP Response и не синхронизируется:(
раскладываю по-порядку:
взял стандартный сервер винды time.windows.com и пинганул в коммандной строке ping time.windows.com -t .
получил запрос по ip 191. 233. 81.105 добавил этот адрес в вкладку RTC и поставил стандартный порт для NTP. получился такой код вкладки
Код: Выделить всё
/*
Modul Virtual RTC
part of Arduino Mega Server project
*/
// Virtual RTC
IPAddress timeServer(191, 233, 81, 105); //1time.windows.com
unsigned int localPort = 123; // local port to listen for UDP packets
EthernetUDP Udp;
const int timeZone = 3;
time_t prevDisplay = 0; // when the digital clock was displayed
void rtcInit() {
Udp.begin(localPort);
Serialprint("Waiting for NTP sync... \n");
setSyncProvider(getNtpTime);
modulRtc = 1;
}
void rtcWorks() {
if (timeStatus() != timeNotSet) {
if (now() != prevDisplay) { // update the display only if time has changed
setLifer();
prevDisplay = now();
//digitalClockDisplay();
}
}
}
void printDigits(int digits) {
if(digits < 10) {
Serial.print('0');
}
Serial.print(digits);
}
void serialRTC() {
Serial.print(year());
Serial.print("-");
printDigits(month());
Serial.print("-");
printDigits(day());
Serial.print(" ");
printDigits(hour());
Serial.print(":");
printDigits(minute());
Serial.print(":");
printDigits(second());
}
void timeStamp() {
serialRTC();
Serial.print(" ");
}
void printRTC(){
serialRTC();
Serial.println();
}
// NTP code
const int NTP_PACKET_SIZE = 48; // NTP time is in the first 48 bytes of message
byte packetBuffer[NTP_PACKET_SIZE]; //buffer to hold incoming & outgoing packets
#ifdef RTC_FEATURE
time_t getNtpTime() {
while (Udp.parsePacket() > 0) ; // discard any previously received packets
Serialprint("Transmit NTP request\n");
sendNTPpacket(timeServer);
uint32_t beginWait = millis();
while (millis() - beginWait < 1500) {
int size = Udp.parsePacket();
if (size >= NTP_PACKET_SIZE) {
Serialprint("Receive NTP response\n");
Udp.read(packetBuffer, NTP_PACKET_SIZE); // read packet into the buffer
unsigned long secsSince1900;
// convert four bytes starting at location 40 to a long integer
secsSince1900 = (unsigned long)packetBuffer[40] << 24;
secsSince1900 |= (unsigned long)packetBuffer[41] << 16;
secsSince1900 |= (unsigned long)packetBuffer[42] << 8;
secsSince1900 |= (unsigned long)packetBuffer[43];
return secsSince1900 - 2208988800UL + timeZone * SECS_PER_HOUR;
}
}
Serialprint("No NTP response\n");
return 0; // return 0 if unable to get the time
}
// send an NTP request to the time server at the given address
void sendNTPpacket(IPAddress &address) {
// set all bytes in the buffer to 0
memset(packetBuffer, 0, NTP_PACKET_SIZE);
// Initialize values needed to form NTP request
// (see URL above for details on the packets)
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
// 8 bytes of zero for Root Delay & Root Dispersion
packetBuffer[12] = 49;
packetBuffer[13] = 0x4E;
packetBuffer[14] = 49;
packetBuffer[15] = 52;
// all NTP fields have been given values, now
// you can send a packet requesting a timestamp:
Udp.beginPacket(address, 123); //NTP requests are to port 123
Udp.write(packetBuffer, NTP_PACKET_SIZE);
Udp.endPacket();
}
#endif
// Duration
void showDuration(time_t duration) {
// prints the duration in days, hours, minutes and seconds
Serialprint(" (duration ");
if(duration >= SECS_PER_DAY){
Serial.print(duration / SECS_PER_DAY);
Serialprint(" day ");
duration = duration % SECS_PER_DAY;
}
if(duration >= SECS_PER_HOUR){
Serial.print(duration / SECS_PER_HOUR);
Serialprint(" hour ");
duration = duration % SECS_PER_HOUR;
}
if(duration >= SECS_PER_MIN){
Serial.print(duration / SECS_PER_MIN);
Serialprint(" min ");
duration = duration % SECS_PER_MIN;
}
Serial.print(duration);
Serialprint(" sec) \n");
}
void checkEvent(time_t* prevEvent) {
time_t duration = 0;
time_t timeNow = now();
if (*prevEvent > 0) {
duration = timeNow - *prevEvent;
}
if (duration > 0) {
showDuration(duration);
}
*prevEvent = timeNow;
}
// Uptime
char uptimeString[14];
/* ----------------------------------------------------------
Function makeUptimeString(char z[], char nop[])
convert system millis() to formstted string days hh.mm.ss
Used globsl variable char uptimeString[14];
Auto reset ~50 days
TODO: save to EEPROM x50 days periods
------------------------------------------------------------- */
void makeUptimeString(char zero[], char nop[]) {
char* zh;
char* zm;
char* zs;
unsigned long totalSeconds = millis() / 1000;
unsigned long days = totalSeconds / 86400;
unsigned long tsHours = totalSeconds - days * 86400;
unsigned long hours = tsHours / 3600;
unsigned long tsMinutes = tsHours - hours * 3600;
unsigned long minutes = tsMinutes / 60;
unsigned long seconds = tsMinutes - minutes * 60;
if (hours < 10) {zh = zero;} else {zh = nop;}
if (minutes < 10) {zm = zero;} else {zm = nop;}
if (seconds < 10) {zs = zero;} else {zs = nop;}
sprintf(uptimeString, "%d %s%d:%s%d:%s%d", (int)days, zh, (int)hours, zm, (int)minutes, zs, (int)seconds);
}
// Lifer
byte lifer;
void setLifer() {
lifer++;
if (lifer > 6) {
lifer = 0;
}
}
а в браузереhttps://yadi.sk/i/1cX3LSg4jC3Ad
От компа синхронизация не проходит из-за того, что в винде нужно настроить сервер времени. методы предложеные интернетом не сработали, потому что версия винды домашняя а может и из-за кривых рук. Если кто-то желает попробовать -вот ссылкаhttp://skylarkrussia.tv/support/ntp_server_activation/
PS как прилепить скрины с компа???
- Рейтинг: 1.16%
Re: Arduino Mega Server
Alex, очень интересный проект!
При изучении кода возникли вопросы.
Если не сильно затруднит, подскажите, как реализована передача, например, значения температуры, от удаленного контроллера (UNO) до сервера MEGA?
Т.е. есть UNO к которому подключен датчик температуры, а мне нужно отобразить эту температуру на вебинтерфейсе.
При изучении кода возникли вопросы.
Если не сильно затруднит, подскажите, как реализована передача, например, значения температуры, от удаленного контроллера (UNO) до сервера MEGA?
Т.е. есть UNO к которому подключен датчик температуры, а мне нужно отобразить эту температуру на вебинтерфейсе.
-
- Сообщения: 2357
- Зарегистрирован: Пт апр 20, 2012 12:53 pm
- Благодарил (а): 42 раза
- Поблагодарили: 262 раза
Re: Arduino Mega Server
На данный момент реализована передача значений от АМС к серверу MajorDoMo. Это сделано потому, что М более мощная система, а АМС изначально был одним из контроллеров в сети.
Передача значений от других контроллеров в АМС пока не реализована. Но это несложно сделать потому, что уже есть модуль server_commands. Но логику вам придётся программировать самим. Или немного подождать, когда у меня (или у других участников) дойдут до этого руки.
Передача значений от других контроллеров в АМС пока не реализована. Но это несложно сделать потому, что уже есть модуль server_commands. Но логику вам придётся программировать самим. Или немного подождать, когда у меня (или у других участников) дойдут до этого руки.