Arduino Mega Server

Модератор: Alex

EvGeniy
Сообщения: 3
Зарегистрирован: Ср сен 09, 2015 8:30 pm
Благодарил (а): 0
Поблагодарили: 0

Re: Arduino Mega Server

Сообщение EvGeniy » Чт сен 17, 2015 9:12 pm

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

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

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

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

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

Re: Arduino Mega Server

Сообщение Alex » Пт сен 18, 2015 5:58 am

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

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

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

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

Re: Arduino Mega Server

Сообщение GaiverX » Пт сен 18, 2015 7:41 am

Коллеги, все таки самостоятельно не могу победить проблему со временем.
Может кто нибудь увидит, где все таки ошибка?
В 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;
}
}
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Arduino Mega Server

Сообщение Alex » Пт сен 18, 2015 9:47 am

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

Re: Arduino Mega Server

Сообщение Maks_K » Пт сен 18, 2015 12:25 pm

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

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

Re: Arduino Mega Server

Сообщение Maks_K » Пт сен 18, 2015 4:38 pm

сегодня Поставил AMS на iBoardPro
запустился
НО
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
За это сообщение автора Maks_K поблагодарил:
Alex (Пт сен 18, 2015 5:09 pm)
Рейтинг: 1.16%
Добро торжествует, зло действует
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Arduino Mega Server

Сообщение Alex » Пт сен 18, 2015 5:09 pm

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

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

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

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

Re: Arduino Mega Server

Сообщение Gorgon67 » Сб сен 19, 2015 10:02 pm

Коллеги, все таки самостоятельно не могу победить проблему со временем.
Может кто нибудь увидит, где все таки ошибка?
В 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 как прилепить скрины с компа???
За это сообщение автора Gorgon67 поблагодарил:
Maks_K (Вс сен 20, 2015 12:03 am)
Рейтинг: 1.16%
alekor
Сообщения: 2
Зарегистрирован: Пн сен 21, 2015 1:18 pm
Благодарил (а): 0
Поблагодарили: 0

Re: Arduino Mega Server

Сообщение alekor » Пн сен 21, 2015 1:28 pm

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

Re: Arduino Mega Server

Сообщение Alex » Пн сен 21, 2015 2:00 pm

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

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