Страница 54 из 326

Re: Arduino Mega Server

Добавлено: Чт сен 17, 2015 9:12 pm
EvGeniy
Говоря о подключении контроллеров, я имел в виду...

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

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

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

в каком то посте было написано, как подключать датчики. хотелось бы что нибудь про контроллеры дополнительные...
просто для того, что бы для начала заложить провода...
или кучу проложить, подписать, а потом разбираться...

Re: Arduino Mega Server

Добавлено: Пт сен 18, 2015 5:58 am
Alex
Вам нужно чётче формулировать вопросы и задавать их по одному за один раз, тогда можно будет ответить что-нибудь вразумительное.

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

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

Рекомендации по умному дому - несколько полезных советов
http://smartliving.ru/forum/viewtopic.p ... 538#p10312

Re: Arduino Mega Server

Добавлено: Пт сен 18, 2015 7:41 am
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;
}
}

Re: Arduino Mega Server

Добавлено: Пт сен 18, 2015 9:47 am
Alex
Не совсем понятна причина вашей проблемы. Дистрибутив у всех одинаковый и у всех работает, не понятно почему у вас не работает. Может быть дело не в АМС, а причина какая-то внешняя (например, файервол или что-то подобное).

Re: Arduino Mega Server

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

P.S. Комментирование еще сырое, я над ним в общем еще работаю тоже:)
А разве NTP работает на порту 8888
unsigned int localPort = 8888;

Re: Arduino Mega Server

Добавлено: Пт сен 18, 2015 4:38 pm
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

Re: Arduino Mega Server

Добавлено: Пт сен 18, 2015 5:09 pm
Alex
Супер. Вы — молодец.

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

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

И, если у вас не стоит «-1» в серверном цикле, то поставил бы «мах_сокетс — 1»

Re: Arduino Mega Server

Добавлено: Сб сен 19, 2015 10:02 pm
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 как прилепить скрины с компа???

Re: Arduino Mega Server

Добавлено: Пн сен 21, 2015 1:28 pm
alekor
Alex, очень интересный проект!
При изучении кода возникли вопросы.
Если не сильно затруднит, подскажите, как реализована передача, например, значения температуры, от удаленного контроллера (UNO) до сервера MEGA?
Т.е. есть UNO к которому подключен датчик температуры, а мне нужно отобразить эту температуру на вебинтерфейсе.

Re: Arduino Mega Server

Добавлено: Пн сен 21, 2015 2:00 pm
Alex
На данный момент реализована передача значений от АМС к серверу MajorDoMo. Это сделано потому, что М более мощная система, а АМС изначально был одним из контроллеров в сети.

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