Arduino Mega Server

Модератор: Alex

ledmax
Сообщения: 88
Зарегистрирован: Сб окт 24, 2015 9:56 pm
Благодарил (а): 11 раз
Поблагодарили: 8 раз

Re: Arduino Mega Server

Сообщение ledmax » Чт янв 28, 2016 12:13 am

SPbDima писал(а):Моя доработка версии 0.14 (черновая).
Работаю только с http://ххх.ххх.ххх.ххх/sensors.htm
Единственное sensors.htm до конца не подчистил с версии 0.13(отказался от ряда параметров), т.к. занялся файловым менеджером и сейчас усиленно курю CSS. Примерный вид ФМ на страничке sdcard.htm(для просмотра необходимо добавить файлы из архива CSS).

P.S.: Если обнаружите ошибки, сообщайте!
Мощный подход к делу :D

Посмотрите мой вариант сравнения ид датчиков - вы в своём скетче тоже это делаете, только посложнее... У меня сравниваются ид, учитывая их порядковый номер, до тех пор, пока не совпадут.

Код: Выделить всё

 for (byte i = 0; i < MAX_TEMP_SENSORS; i++) {
      
       if (!memcmp(tempSensor[i], idTempDat[n], MAX_TEMP_SENSORS)){
        
        current_temp[i] = sensors.getTempC(tempSensor[i]);
        
        timeStamp();
        
        Serial.print(objSens[n]);
        Serial.print(": ");
        Serial.println(current_temp[i]); 
В итоге, если в начале всей программе определить датчики

Код: Выделить всё

//temp
byte const MAX_TEMP_SENSORS = 1;
float current_temp[MAX_TEMP_SENSORS]; 
То потом можно использовать температуру датчика в любом месте программы

Код: Выделить всё

current_temp[номер датчика] 
в том числе и для логов.

Что думаете по этому поводу?

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

Re: Arduino Mega Server

Сообщение Alex » Чт янв 28, 2016 8:27 am

А по поводу запросов что подскажете?
Вам нужно управлять Ардуино из М или М из Ардуино?
И можете этот момент расшифровать:
Температура измеряется каждые 5 минут и в короткий период после самого старта системы (это связано с особенностями взаимодействия с М, возможно уже можно убрать, не тестировал).
ledmax
Сообщения: 88
Зарегистрирован: Сб окт 24, 2015 9:56 pm
Благодарил (а): 11 раз
Поблагодарили: 8 раз

Re: Arduino Mega Server

Сообщение ledmax » Чт янв 28, 2016 11:45 am

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

Re: Arduino Mega Server

Сообщение Alex » Чт янв 28, 2016 1:30 pm

Посмотрите модуль server_commands — там примеры приёма команд от М.

192.168.1.37/?night=1

По такому принципу можете формировать команды на стороне М и интерпретировать их в АМС (см. примеры в коде).
SPbDima
Сообщения: 113
Зарегистрирован: Пн окт 19, 2015 8:27 am
Благодарил (а): 9 раз
Поблагодарили: 21 раз

Re: Arduino Mega Server

Сообщение SPbDima » Чт янв 28, 2016 5:32 pm

СпойлерПоказать
ledmax писал(а):
SPbDima писал(а):Моя доработка версии 0.14 (черновая).
Работаю только с http://ххх.ххх.ххх.ххх/sensors.htm
Единственное sensors.htm до конца не подчистил с версии 0.13(отказался от ряда параметров), т.к. занялся файловым менеджером и сейчас усиленно курю CSS. Примерный вид ФМ на страничке sdcard.htm(для просмотра необходимо добавить файлы из архива CSS).

P.S.: Если обнаружите ошибки, сообщайте!
Мощный подход к делу :D

Посмотрите мой вариант сравнения ид датчиков - вы в своём скетче тоже это делаете, только посложнее... У меня сравниваются ид, учитывая их порядковый номер, до тех пор, пока не совпадут.

Код: Выделить всё

 for (byte i = 0; i < MAX_TEMP_SENSORS; i++) {
      
       if (!memcmp(tempSensor[i], idTempDat[n], MAX_TEMP_SENSORS)){
        
        current_temp[i] = sensors.getTempC(tempSensor[i]);
        
        timeStamp();
        
        Serial.print(objSens[n]);
        Serial.print(": ");
        Serial.println(current_temp[i]);
Сложный способ был по причине необходимости соответствия порядка датчиков в конфиге и то что инициализировалось.
СпойлерПоказать
ledmax писал(а): В итоге, если в начале всей программе определить датчики

Код: Выделить всё

//temp
byte const MAX_TEMP_SENSORS = 1;
float current_temp[MAX_TEMP_SENSORS];
То потом можно использовать температуру датчика в любом месте программы
А во всех вариантах так и используется.
СпойлерПоказать
ledmax писал(а):

Код: Выделить всё

current_temp[номер датчика]
в том числе и для логов.

Что думаете по этому поводу?

Ещё хорошо бы было добавить возможность установки пределов для каждого датчика отдельно. А то например в тёплых полах - 40 градусов уже много, а для бойлера и 90 норма.
По поводу пределов: если использовать конфиг, то там это есть; если без конфига, то можно модернизировать код Алекса несколькими строчками:
СпойлерПоказать

Код: Выделить всё

float amin[MAX_TEMP_SENSORS]={20,...}; // нижний предел
float amax[MAX_TEMP_SENSORS]={30,...}; // верхний предел
byte actionMin[MAX_TEMP_SENSORS]={0,...}; //номер действия при выходе за нижний предел
byte actionMax[MAX_TEMP_SENSORS]={0,...}; //номер действия при выходе за верхний предел
typedef void (* CallFunc) (byte, byte); // ссылка на вызов функции
CallFunc actionOnT[] = {warning, coldWater, hotWater};//массив из действий(функций) при выходе за границы темп диапазона

void warning(byte n, byte state) {
}
void coldWater(byte n, byte state) { //действия если вода стала холодной
}
void hotWater(byte n, byte state) { //действия если вода стала горячей
}

void checkAlertT(byte n)
{
  #ifdef TEMP_ACTION
   //если состояние датчика не изменилось, тогда пропускаем действия
    if((tConfig[n].alert==0)&&(tConfig[n].amax>tConfig[n].current_temp)&&(tConfig[n].current_temp>tConfig[n].amin)) return;
    if((tConfig[n].alert==1)&&(tConfig[n].current_temp<tConfig[n].amin)) return;
    if((tConfig[n].alert==2)&&(tConfig[n].current_temp>tConfig[n].amax)) return;
   //состояние датчика изменилось, перейдена граница в любую сторону
    if((tConfig[n].alert==1)&&(tConfig[n].current_temp>tConfig[n].amin)) {actionOnT[tConfig[n].actionMin](n, 0); tConfig[n].alert=0;}
    if((tConfig[n].alert==2)&&(tConfig[n].current_temp<tConfig[n].amax)) {actionOnT[tConfig[n].actionMax](n, 0); tConfig[n].alert=0;}
    if(tConfig[n].current_temp<tConfig[n].amin) {actionOnT[tConfig[n].actionMin](n, 1); tConfig[n].alert=1;}
    if(tConfig[n].current_temp>tConfig[n].amax) {actionOnT[tConfig[n].actionMax](n, 1); tConfig[n].alert=2;}
  #endif
}

// checkAlertT добавить в getTemperature
 
По поводу "if (!memcmp(tempSensor, idTempDat[n], MAX_TEMP_SENSORS))" - спасибо, попробую упростить код убрав сортировку датчиков в конфиге и тогда будет проще работать с датчиками разных типов.
Последний раз редактировалось SPbDima Чт янв 28, 2016 5:43 pm, всего редактировалось 1 раз.
SPbDima
Сообщения: 113
Зарегистрирован: Пн окт 19, 2015 8:27 am
Благодарил (а): 9 раз
Поблагодарили: 21 раз

Re: Arduino Mega Server

Сообщение SPbDima » Чт янв 28, 2016 5:40 pm

ledmax писал(а):И можете этот момент расшифровать:

Код: Выделить всё

#ifdef TEMP_FEATURE
      if (cycle5m || (timeSec < startSendTime)) {
        tempWorks();
      }
    #endif    
Попробуй интервал cycle5m или какой используешь, поставить в инициализации в true убрав из условия (timeSec < startSendTime), т.е.:

Код: Выделить всё

#ifdef TEMP_FEATURE
      if (cycle5m) {
        tempWorks();
      }
    #endif  
У меня нет возможности проверить М, а Алекс не помнит для чего датчик должен постоянно сканироваться некоторое время после старта системы (или актуальность этого).
SPbDima
Сообщения: 113
Зарегистрирован: Пн окт 19, 2015 8:27 am
Благодарил (а): 9 раз
Поблагодарили: 21 раз

Re: Arduino Mega Server

Сообщение SPbDima » Чт янв 28, 2016 8:12 pm

Alex, у тебя раскраска строк таблицы сделана при помощи разных классов чётных/нечётных строк, а при использовании CSS3 - это делается намного проще и гибче.
Но это так, для информации.
http://professorweb.ru/my/css/css_theory/level1/1_2.php
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Arduino Mega Server

Сообщение Alex » Чт янв 28, 2016 10:15 pm

Да, это я уже узнал, но не стал переделывать — совершенство недостижимо, а более актуальных задач вагон и маленькая тележка.
dkhv
Сообщения: 12
Зарегистрирован: Пт янв 29, 2016 3:07 am
Благодарил (а): 0
Поблагодарили: 0

Re: Arduino Mega Server

Сообщение dkhv » Пт янв 29, 2016 3:11 am

добрый день
при заливке в ардуину возникает ошибка
arduino_mega_server.ino: In function 'void setup()':
arduino_mega_server:181: error: 'timersInit' was not declared in this scope
arduino_mega_server:183: error: 'ethernetInit' was not declared in this scope
arduino_mega_server:187: error: 'SDcardInit' was not declared in this scope
arduino_mega_server:188: error: 'serverInit' was not declared in this scope
arduino_mega_server:192: error: 'rtcInit' was not declared in this scope
arduino_mega_server:197: error: 'majordomoInit' was not declared in this scope
arduino_mega_server:198: error: 'majordomoMegaLive' was not declared in this scope
arduino_mega_server:223: error: 'uploadInit' was not declared in this scope
arduino_mega_server:228: error: 'pirsInit' was not declared in this scope
arduino_mega_server:232: error: 'contactsInit' was not declared in this scope
arduino_mega_server:236: error: 'tempInit' was not declared in this scope
arduino_mega_server:240: error: 'electroInit' was not declared in this scope
arduino_mega_server:248: error: 'ledsInit' was not declared in this scope
arduino_mega_server.ino: In function 'void loop()':
arduino_mega_server:257: error: 'uploadWorks' was not declared in this scope
arduino_mega_server:262: error: 'rtcWorks' was not declared in this scope
arduino_mega_server:266: error: 'profStart' was not declared in this scope
arduino_mega_server:267: error: 'timersWorks' was not declared in this scope
arduino_mega_server:270: error: 'serverWorks' was not declared in this scope
arduino_mega_server:282: error: 'pirsWorks' was not declared in this scope
arduino_mega_server:286: error: 'contactsWorks' was not declared in this scope
arduino_mega_server:291: error: 'tempWorks' was not declared in this scope
arduino_mega_server:298: error: 'electroWorks' was not declared in this scope
arduino_mega_server:299: error: 'freqWorks' was not declared in this scope
arduino_mega_server:303: error: 'freqWorks' was not declared in this scope
arduino_mega_server:309: error: 'majordomoMegaLive' was not declared in this scope
arduino_mega_server:341: error: 'rtcSync' was not declared in this scope
arduino_mega_server:346: error: 'cyclosInSecWork' was not declared in this scope
arduino_mega_server:355: error: 'eraseCyclos' was not declared in this scope
arduino_mega_server:356: error: 'profCalc' was not declared in this scope
arduino_mega_server:358: error: 'cyclosDelayWork' was not declared in this scope
'timersInit' was not declared in this scope

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

Re: Arduino Mega Server

Сообщение Alex » Пт янв 29, 2016 8:22 am

Я даже затрудняюсь сказать, что может приводить к таким ошибкам. Компилятор просто не видит код и это нетипично, видимо вы что-то сделали не так.

Почистите темп, заново разархивируйте архив (в другой папке), заново укажите путь в настройках — по идее должно работать.
Ответить