Arduino Mega Server

Модератор: Alex

EvGeniy
Сообщения: 3
Зарегистрирован: Ср сен 09, 2015 8:30 pm

Re: Arduino Mega Server

Сообщение EvGeniy »

Говоря о подключении контроллеров, я имел в виду...

я прочитал, всю эту ветку, очень интересно.

знаю, что к ардуино уно можно подцепить интернет шилд, несколько таких ардуин в роутер = сеть...

через последовательное соединение типа можно... без инет шилда.
через 1wire по моему можно, i2с
RS 232 rs 484.

в каком то посте было написано, как подключать датчики. хотелось бы что нибудь про контроллеры дополнительные...
просто для того, что бы для начала заложить провода...
или кучу проложить, подписать, а потом разбираться...
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm

Re: Arduino Mega Server

Сообщение Alex »

Вам нужно чётче формулировать вопросы и задавать их по одному за один раз, тогда можно будет ответить что-нибудь вразумительное.

По поводу проводки можно почитать здесь:

Проводка для умного дома - рекомендации по проводке для умного дома
http://smartliving.ru/forum/viewtopic.p ... t=102#p660

Рекомендации по умному дому - несколько полезных советов
http://smartliving.ru/forum/viewtopic.p ... 538#p10312
GaiverX
Сообщения: 62
Зарегистрирован: Ср авг 26, 2015 3:15 pm

Re: Arduino Mega Server

Сообщение GaiverX »

Коллеги, все таки самостоятельно не могу победить проблему со временем.
Может кто нибудь увидит, где все таки ошибка?
В Serial выдается No NTP Response и не синхронизируется:(

P.S. Комментирование еще сырое, я над ним в общем еще работаю тоже:)
SPOILERSPOILER_SHOW
/*
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;
}
}
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm

Re: Arduino Mega Server

Сообщение Alex »

Не совсем понятна причина вашей проблемы. Дистрибутив у всех одинаковый и у всех работает, не понятно почему у вас не работает. Может быть дело не в АМС, а причина какая-то внешняя (например, файервол или что-то подобное).
Maks_K
Сообщения: 31
Зарегистрирован: Пт мар 13, 2015 5:10 pm

Re: Arduino Mega Server

Сообщение Maks_K »

GaiverX писал(а):Коллеги, все таки самостоятельно не могу победить проблему со временем.
Может кто нибудь увидит, где все таки ошибка?
В Serial выдается No NTP Response и не синхронизируется:(

P.S. Комментирование еще сырое, я над ним в общем еще работаю тоже:)
А разве NTP работает на порту 8888
unsigned int localPort = 8888;
Добро торжествует, зло действует
Maks_K
Сообщения: 31
Зарегистрирован: Пт мар 13, 2015 5:10 pm

Re: Arduino Mega Server

Сообщение Maks_K »

сегодня Поставил AMS на iBoardPro
запустился
НО
1. на странице нет информации:
пример по карте Сылка на скрин
браузер IE11
2. также не пашет RTC
Лог сериалаSPOILER_SHOW
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
Добро торжествует, зло действует
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm

Re: Arduino Mega Server

Сообщение Alex »

Супер. Вы — молодец.

Я бы начал с 2-х вещей:

1. заменил бы ие на фф
2. поставил бы стандартные ип

И, если у вас не стоит «-1» в серверном цикле, то поставил бы «мах_сокетс — 1»
Gorgon67
Сообщения: 23
Зарегистрирован: Пт сен 11, 2015 9:05 am

Re: Arduino Mega Server

Сообщение Gorgon67 »

Коллеги, все таки самостоятельно не могу победить проблему со временем.
Может кто нибудь увидит, где все таки ошибка?
В 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/TuqbYZpwjC3AP
а в браузереhttps://yadi.sk/i/1cX3LSg4jC3Ad
От компа синхронизация не проходит из-за того, что в винде нужно настроить сервер времени. методы предложеные интернетом не сработали, потому что версия винды домашняя а может и из-за кривых рук. Если кто-то желает попробовать -вот ссылкаhttp://skylarkrussia.tv/support/ntp_server_activation/

PS как прилепить скрины с компа???
alekor
Сообщения: 2
Зарегистрирован: Пн сен 21, 2015 1:18 pm

Re: Arduino Mega Server

Сообщение alekor »

Alex, очень интересный проект!
При изучении кода возникли вопросы.
Если не сильно затруднит, подскажите, как реализована передача, например, значения температуры, от удаленного контроллера (UNO) до сервера MEGA?
Т.е. есть UNO к которому подключен датчик температуры, а мне нужно отобразить эту температуру на вебинтерфейсе.
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm

Re: Arduino Mega Server

Сообщение Alex »

На данный момент реализована передача значений от АМС к серверу MajorDoMo. Это сделано потому, что М более мощная система, а АМС изначально был одним из контроллеров в сети.

Передача значений от других контроллеров в АМС пока не реализована. Но это несложно сделать потому, что уже есть модуль server_commands. Но логику вам придётся программировать самим. Или немного подождать, когда у меня (или у других участников) дойдут до этого руки.
Ответить