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

Re: Arduino Mega Server

Добавлено: Ср янв 27, 2016 8:30 pm
Alex
Для Андроида и иОс я бы написал приложение с виждетом.
Не совсем понятно, что будет делать приложение — чтобы всё работало — это надо всю функциональность браузера и яваскрипта повторить (а потом поддерживать, ведь они комплиментарны со скетчем, который будет изменяться).

Это получается самим себе работы добавить.

Re: Arduino Mega Server

Добавлено: Ср янв 27, 2016 11:08 pm
ledmax
Alex писал(а):
И не могу разобраться с инициализацией модулей - как сделать. что бы например void getTemperature выполнялся каждые 30сек?

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

if (cycle30s) {
  sensors.requestTemperatures();
  getTemperature(0); 
  getTemperature(1);
  getTemperature(2); 
} 

Спасибо,

А по поводу запросов что подскажете?

И можете этот момент расшифровать:

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

#ifdef TEMP_FEATURE
      if (cycle5m || (timeSec < startSendTime)) {
        tempWorks();
      }
    #endif  

Re: Arduino Mega Server

Добавлено: Чт янв 28, 2016 12:13 am
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]); 
В итоге, если в начале всей программе определить датчики

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

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

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

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

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

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

Re: Arduino Mega Server

Добавлено: Чт янв 28, 2016 8:27 am
Alex
А по поводу запросов что подскажете?
Вам нужно управлять Ардуино из М или М из Ардуино?
И можете этот момент расшифровать:
Температура измеряется каждые 5 минут и в короткий период после самого старта системы (это связано с особенностями взаимодействия с М, возможно уже можно убрать, не тестировал).

Re: Arduino Mega Server

Добавлено: Чт янв 28, 2016 11:45 am
ledmax
Вам нужно управлять Ардуино из М или М из Ардуино?
Нужно получать установочное значение для пид регулятора из М.

Re: Arduino Mega Server

Добавлено: Чт янв 28, 2016 1:30 pm
Alex
Посмотрите модуль server_commands — там примеры приёма команд от М.

192.168.1.37/?night=1

По такому принципу можете формировать команды на стороне М и интерпретировать их в АМС (см. примеры в коде).

Re: Arduino Mega Server

Добавлено: Чт янв 28, 2016 5:32 pm
SPbDima
SPOILERSPOILER_SHOW
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]);
Сложный способ был по причине необходимости соответствия порядка датчиков в конфиге и то что инициализировалось.
SPOILERSPOILER_SHOW
ledmax писал(а): В итоге, если в начале всей программе определить датчики

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

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

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

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

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

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

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

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))" - спасибо, попробую упростить код убрав сортировку датчиков в конфиге и тогда будет проще работать с датчиками разных типов.

Re: Arduino Mega Server

Добавлено: Чт янв 28, 2016 5:40 pm
SPbDima
ledmax писал(а):И можете этот момент расшифровать:

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

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

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

#ifdef TEMP_FEATURE
      if (cycle5m) {
        tempWorks();
      }
    #endif  
У меня нет возможности проверить М, а Алекс не помнит для чего датчик должен постоянно сканироваться некоторое время после старта системы (или актуальность этого).

Re: Arduino Mega Server

Добавлено: Чт янв 28, 2016 8:12 pm
SPbDima
Alex, у тебя раскраска строк таблицы сделана при помощи разных классов чётных/нечётных строк, а при использовании CSS3 - это делается намного проще и гибче.
Но это так, для информации.
http://professorweb.ru/my/css/css_theory/level1/1_2.php

Re: Arduino Mega Server

Добавлено: Чт янв 28, 2016 10:15 pm
Alex
Да, это я уже узнал, но не стал переделывать — совершенство недостижимо, а более актуальных задач вагон и маленькая тележка.