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

Re: Arduino Mega Server

Добавлено: Пт апр 29, 2016 1:21 pm
Alex
Странно, дело точно не в сети и SD.
Несколько других более простых серверов не AMS запускаются.
Попробую отключить второстепенные модули.
Какие модули обязательны для отображения сайта?
Тут дело вот в чём: сам дистрибутив 100% рабочий — уже более 1000 инсталляций. Следовательно, на исправном железе и при правильной работе сети должен работать тоже 100%.

Обратите внимание на FAQ, возможно в этом дело:

http://hi-lab.ru/arduino-mega-server/de ... aq/network
А сценарии в этом проекте работают, можно организовать автоматическое управление отопления.
В АМС работают таймеры и часы реального времени (и любые сенсоры, естественно), на этой основе можно организовать любое управление. Но прежде, чем доверять АМС управление критически важными системами, нужно хорошо подумать — не проводилось такого тестирования и вы всё делаете на свой страх и риск.

Re: Arduino Mega Server

Добавлено: Вт май 03, 2016 2:05 pm
serghei
Alex писал(а):В АМС работают таймеры и часы реального времени
А как правильно ими пользоваться? Изначально в скетче "Power Monitor" от BATONS при подсчете киловатт-часов я
использовал счетчик времени через millis. Идея простая-зная текущую мощность в ваттах ,можно каждые 10 секунд
складывать в переменной total эту мощность ,делённую на 360, чтобы привести значение к часу.Тогда переменная total-
это наши ватт-часы. Ну и разделив на 1000 получим искомые киловатт-часы. Потом это значение вывел на lcd экран.
При интеграции в АМС показания уменьшились ровно в 2 раза и значения напряжения и мощностей стали выводиться в
МД раз в 20 секунд.Чтобы произвести подсчет корректно пришлось извратиться и значения делить на 180.Судя по показаниям
на экране и двум контрольным счетчикам точность очень приемлемая (менее 1 процента и зависит от точности калибровки).
Собственно вопрос как использовать счетчики времени во вкладке timers ? И попутно-если АМС знает реальное времято как
например включать по расписанию ключ на 3 пине? Очень хочется разобраться,но знаний не хватает..
Попробую корректно вставить код для вкладки электро
SPOILERSPOILER_SHOW

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

/*
  Modul Electro
  part of Arduino Mega Server project
  Electro functions
*/

#ifdef ELECTRO_FEATURE

const int MAX_UI_SENSORS = 14; // max 14

byte U = 0;
//              U [1  2  3  4  5][1  2   3   4   5   6   7   8]
int pinsUI[] = {0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 14, 15};
// диапазон токовых пинов
int START_PIN = 1;
int END_PIN = MAX_UI_SENSORS;

int samples = 400;

/* Коэффициенты для калибровки значений.
   Подбираются опытным путем, сверяясь с эталонным прибором */
double VCAL = 42.10; // для напряжения
//               U [1     2     3     4     5]   [1     2     3     4     5     6     7     8]
double ICAL[] = {0, 0.62, 0.53, 0.73, 0.73, 1.28, 0.73, 0.72, 0.73, 0.73, 0.73, 0.73, 0.73, 0.73};
// вычисляемые коэффициенты для калибровки значений
double UI_RATIO[MAX_UI_SENSORS];

int const MAX_VOLTAGE = 280;
int const MIN_VOLTAGE = 0;//160

// Значения отсчётов
int sampleUI[MAX_UI_SENSORS];
int prevSampleUI[MAX_UI_SENSORS];
 
// Значения для фильтров
double filteredUI[MAX_UI_SENSORS];
double prevFilteredUI[MAX_UI_SENSORS]; 

// Для расчета мощности среднеквадратическим методом
double sumSquareUI[MAX_UI_SENSORS]; // сумма квадратов напряжения и тока

// Полезные значения переменных
double UIrms[MAX_UI_SENSORS];
double apparentPower[MAX_UI_SENSORS];

byte const UI_COLLECT = 1;
byte refreshCount = 0;

// Среднее значение из нескольких замеров
double sumUPrms[MAX_UI_SENSORS];
double middleUPrms[MAX_UI_SENSORS];

// переменные для Ajax
double ajaxUPrms[MAX_UI_SENSORS];





unsigned long  mills_cur;
unsigned long  rotation=10000;
unsigned long  mills_prev=0;
float total[13];// искомая переменная киловатт часов!!!!!!!
float t;//добавил для киловаттов



// Electro

void electroInit() {
  UI_RATIO[0] = 50.5 / 1024 * VCAL;
  for (int i = 1; i < MAX_UI_SENSORS; i++) { 
    UI_RATIO[i] = (long double)15.15 * 5 / 1024 * ICAL[i];
  }
  // electro throttle
  for (int i = 0; i < 5; i++) { 
    cycle(START_PIN, END_PIN, samples);
    calcPover(START_PIN, END_PIN, samples);
  }
  modulElectro = MODUL_ENABLE;
  buttonElectro = 1;
  started("Electro");
}

void electroWorks() {
  getUIP("packPower1", START_PIN, END_PIN, samples);
}

void cycle(byte STT, byte STP, int cycles) {
  // Замеры значений, удаление постоянного смещения 2,5В,
  // и суммирование квадратов значений в цикле   
     
  for (int j = 0; j < cycles; j++) {
    
    // сохраняем предыдущие значения
    prevSampleUI[U] = sampleUI[U];
    for (int i = STT; i < STP; i++) {
      prevSampleUI[i] = sampleUI[i];
    }

    // Получение значений
    sampleUI[U] = analogRead(pinsUI[U]);
    for (int i = STT; i < STP; i++) {
      sampleUI[i] = analogRead(pinsUI[i]);
    }
    
    // Фильтр для удаления постоянного смещения 2,5В
    prevFilteredUI[U] = filteredUI[U];
    filteredUI[U] = 0.996 * (prevFilteredUI[U] + sampleUI[U] - prevSampleUI[U]);
    for (int i = STT; i < STP; i++) { 
      prevFilteredUI[i] = filteredUI[i];
      filteredUI[i] = 0.996 * (prevFilteredUI[i] + sampleUI[i] - prevSampleUI[i]);
    }
    
    // Суммируем квадраты
    sumSquareUI[U] += filteredUI[U] * filteredUI[U];
    for (int i = STT; i < STP; i++) {
      sumSquareUI[i] += filteredUI[i] * filteredUI[i];
    }
  } // for (cycles)
} // cycle( )

void calcPover(byte STT, byte STP, int cycles) {
  // рассчет напряжения и тока (rms)  
  unsigned tot;
  UIrms[U] = UI_RATIO[U] * sqrt(sumSquareUI[U] / cycles);
  for (int i = STT; i < STP; i++) {
    UIrms[i] = UI_RATIO[i] * sqrt(sumSquareUI[i] / cycles);
    Serial.print(UIrms[i]);//вывод токов в сериал
    Serial.print(" == ");
    Serial.print(total[i-1]);//вывод ватт.часов[i-1]
    Serial.print(" == ");
    t=total[i-1]/1000;//расчет киловатт[i-1]
    tot+=t;
    Serial.println(t);//вывод киловатт.часов
    
     Serial.print(" == ");
     Serial.println(apparentPower[i]);//вывод мощности в ваттах
     
    
  }
    
     Serial.println("__________");
     Serial.println(UIrms[U]);
      Serial.println("__________");
    Serial.print(" == ");    Serial.println(tot);
     
     
    mills_cur=millis();
    
    if (mills_cur>mills_prev+rotation) {
      
      total[1]+=apparentPower[1]/360;//360 10 секундных отсчетов в часе
      mills_prev=mills_cur;
      
      
      
}
  // коррекция малых искажений тока 0.12А ~ 27.6Вт
  //for (int i = STT; i < STP; i++) {
    //if (UIrms[i] < 0.12) {
     // UIrms[i] = 0.0;
    //}
  //}
  
  // расчет мощности
  for (int i = STT; i < STP; i++) {
    apparentPower[i] = UIrms[U] * UIrms[i];
    total[i-1]+=apparentPower[i]/180;// 20 секундных отсчетов в часе
  }
 
  // сброс накопленных значений
  sumSquareUI[U] = 0;
  for (int i = STT; i < STP; i++) {
    sumSquareUI[i] = 0;
  }  
} // calcPover( )

void collectValues(byte STT, byte STP) {
  refreshCount++;
    
  // среднее значение из нескольких замеров
  sumUPrms[U] += UIrms[U];
  middleUPrms[U] = sumUPrms[U] / refreshCount;
  for (int i = STT; i < STP; i++) {
    sumUPrms[i] += apparentPower[i];
    middleUPrms[i] = sumUPrms[i] / refreshCount;
  }
}

void clearCollectValues(byte STT, byte STP) {
  refreshCount = 0;
  sumUPrms[U] = 0;
  middleUPrms[U] = 0;
        
  for (int i = STT; i < STP; i++) {
    sumUPrms[i] = 0;
    middleUPrms[i] = 0;
  }
}


void sendElectroMajor(char obj[], byte STT, byte STP) {
  // для посылки дробной части значения
  int UPrms_[MAX_UI_SENSORS];  

  // Вычисляем дробные части значений для формирования строки
  UPrms_[U] = (middleUPrms[U] - (int)middleUPrms[U]) * 100;
  for (int i = STT; i < STP; i++) {
    UPrms_[i] = (middleUPrms[i] - (int)middleUPrms[i]) * 100;
  }
  
  if (STT == START_PIN && STP == END_PIN) {
    sprintf(buf, "GET /objects/?object=%s&op=m&m=update&%s=%0d.%d&%s=%0d.%d&%s=%0d.%d&%s=%0d.%d&%s=%0d.%d&%s=%0d.%d&%s=%0d.%d&%s=%0d.%d&%s=%0d.%d&%s=%0d.%d&%s=%0d.%d&%s=%0d.%d&%s=%0d.%d&%s=%0d.%d HTTP/1.0",
      obj, "u", (int)middleUPrms[U], abs(UPrms_[U]),
      "p1", (int)middleUPrms[1], abs(UPrms_[1]),  "p2", (int)middleUPrms[2], abs(UPrms_[2]),
      "p3", (int)middleUPrms[3], abs(UPrms_[3]),  "p4", (int)middleUPrms[4], abs(UPrms_[4]),
      "p5", (int)middleUPrms[5], abs(UPrms_[5]),  "p6", (int)middleUPrms[6], abs(UPrms_[6]), 
      "p7", (int)middleUPrms[7], abs(UPrms_[7]),  "p8", (int)middleUPrms[8], abs(UPrms_[8]),
      "p9", (int)middleUPrms[9], abs(UPrms_[9]),  "p10",(int)middleUPrms[10],abs(UPrms_[10]),
      "p11",(int)middleUPrms[11],abs(UPrms_[11]), "p12",(int)middleUPrms[12],abs(UPrms_[12]),
      "p13",(int)middleUPrms[13],abs(UPrms_[13]));
    #ifdef MAJORDOMO_FEATURE
      sendHttpRequest(MAJOR_IP, MAJOR_PORT, mclient);
    #endif
  }
} // sendElectroMajor( )

void getUIP(char obj[], byte STT, byte STP, int cycles) {
  #ifdef ELECTRO_DEBUG
    int prof_start = millis();
  #endif  
  
  cycle(STT, STP, cycles);
  calcPover(STT, STP, cycles);

  #ifdef ELECTRO_DEBUG
    int prof_stop = millis();
    int prof_time = prof_stop - prof_start;
    timeStamp();
    Serialprint("Electro cycle: %dms\n", prof_time);
  #endif
  
  // выдача результатов
  if (UIrms[U] > MIN_VOLTAGE && UIrms[U] < MAX_VOLTAGE) { // отсечение заведомо неправильных результатов
    
    collectValues(STT, STP);
    
    // выдача результатов после нужного кол-ва замеров
    if (refreshCount == UI_COLLECT) {

      #ifdef ELECTRO_DEBUG
        // calc time duration
        checkEvent(&prevEventElectroCycle);
      #endif
      
      // for Ajax
      ajaxUPrms[U] = middleUPrms[U];
      for (int i = STT; i < STP; i++) {
        ajaxUPrms[i] = middleUPrms[i];
      }      

      // send electro data to MajorDoMo
      sendElectroMajor(obj, STT, STP);
      
      // обнуление значений нескольких замеров
      clearCollectValues(STT, STP);
      
      
        lcd.setCursor(5, 2);
  lcd.print(UIrms[U]);
  
    lcd.setCursor(5, 1);
  lcd.print(total[0]);
  
  
  lcd.setCursor(5, 3);
  lcd.print(apparentPower[1]);
    } // if (refreshCount == UI_COLLECT)
  } // if (MIN_VOLTAGE && MAX_VOLTAGE)
} // getUIP( )


// U & I signal form
int const MAX_FORM_POINTS = 90;
int pointsU[MAX_FORM_POINTS];
int pointsI[MAX_FORM_POINTS];

// Power supply frequency
int const MAX_FREQS = 206;
long periodInMicros = 0;
int cyclosPerPeriod = 0;

/* ----------------------------------------
  Function synchroSignal()
    Synchronization of signal power supply
    "up" - "down" (start: middle ~ 50%)
------------------------------------------- */

void synchroSignal(byte uPin) {
  int val;
  int i = 0;
  int j = 0;
  int limitCyclos = MAX_FREQS;

  /* Limits of signal:
     top - 960
     middle - 810
     bottom - 660 */  
  
  // limits areas of signal
  int limitTopArea = 900;
  int limitMiddleAreaTop = 820;

  // synchronization of signal

  do { // check top area
    val = analogRead(uPin);
    i++; if (i > limitCyclos) {break;}
  } while (val < limitTopArea);
  
  do { // check top of middle area
    val = analogRead(uPin);
    j++; if (j > limitCyclos) {break;}    
  } while (val > limitMiddleAreaTop);
} // synchroSignal()

/* ----------------------------------------
  Function getFormArrays
    Get arrays of points U & I for graphics
------------------------------------------- */

void getFormArrays(byte pinU, byte pinI) {
  synchroSignal(pinU);
  for (int i = 0; i < MAX_FORM_POINTS; i++) {
    pointsU[i] = analogRead(pinU);
    pointsI[i] = analogRead(pinI);
  }
}

/* ----------------------------------------
  Function getFreqPeriod
    Get periodInMicros and cyclosPerPeriod
    of U signal
------------------------------------------- */

void getFreqPeriod(byte pinU) {
  unsigned long startTime;
  int startVal;
  int tempVal;

  periodInMicros = 0;
  cyclosPerPeriod = 0;

  synchroSignal(pinU);
  
  startTime = micros();
  startVal = analogRead(pinU);
  for (int i = 0; i < MAX_FREQS; i++) {
    tempVal = analogRead(pinU);
    if ((i > 146 && i < 206) && (tempVal < startVal + 2 && tempVal > startVal - 10)) {
      periodInMicros = micros() - startTime;
      cyclosPerPeriod = i;
      break;
    }
  }
} // getFrecPeriod

/* -----------------
  Function freqWorks
-------------------- */

void freqWorks() {
  getFormArrays(0, 1);
  getFreqPeriod(0);
}

#endif // ELECTRO_FEATURE


Re: Arduino Mega Server

Добавлено: Вт май 03, 2016 7:02 pm
nick7zmail
Как пользоваться таймерами:

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

      if (cycle5m) {
      } 
Таймер раз в 5 минут. Так же и остальные...
На счет по расписанию - удобнее из МД команды посылать, если есть установленная система. Если нет - то так же, условиями задать. Благодаря модулю rtc доступны

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

year()
month()
day()
hour()
minute()
second() 

Re: Arduino Mega Server

Добавлено: Сб май 07, 2016 3:58 pm
selnik
Уважаемый Алекс!
Да, проект, на мой взгляд, многообещающий. На первый взгляд, все хорошо продумано.
Хотелось поскорее попробовать - а как оно на самом деле. Я загрузил проект с сайта,
но столкнулся с несколькими трудностями при загрузке в плату Arduino DUE.
По-правде говоря,я совершил ошибку - загрузил версию arduino IDE 1.6.8.
В ней проект при компиляции выдал кучу ошибок.
Тогда я решил откомпилировать проект в среде arduino IDE 1.6.5 r5, т.к в Вашем исходнике
была ссылка на 1.6.5 r2.

Но и здесь начались трудности - ошибка компиляции в файле DallasTemperature.cpp.
Как оказалось - не определена функция max в строке bitResolution = max(bitResolution, getResolution(deviceAddress));
(при том, что все библиотеки из папки проекта libraries я скопировал (с заменой) в одноименную папку arduino ide)
Попробовал решить проблему, подставив в начале cpp строку #define max(a,b) ((a)>(b)?(a):(b)).
Ошибка больше не появлялась, но при линковке выдалась ошибка:
не найден файл C:\Windows\Temp\Build...\core\syscalls_cortexm3.c.o (извиняюсь, что привожу название файла не точно-память подводит), но файл на самом деле присутствовал в папке Build... , а вложенной папки core не было. Пришлось ее создать
и скопировать в нее требуемый файл.
После этого загрузка в плату прошла успешно.
Но, я прочитал буквально файл readme.txt про копирование файлов на SD карту:

Quick start:
------------
1. Files from archive microSD.zip - to microSD card

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

И только после этого у меня УРА! загрузилась страница (на самом деле пришлосьеще один раз RESET нажать на плате W5100).
Да, сайт бесспорно красивый. Пока не понял как его дальше настраивать и как пользоваться SerialCommander.

У меня предложение. Про сложности с компиляцией в разных версиях Arduino IDE уже писали.
Может в архив проекта включать arduino ide с которой он нормально компилируется? Чтобы новичкам проще было стартануть.
Где можно почитать про настройку AMS?

Re: Arduino Mega Server

Добавлено: Сб май 07, 2016 4:03 pm
nick7zmail
В АМС разбирался методом тыка...начал с того, что отключил почти все модули кроме жизненно-необходимых, удалил их из скетча...меньше кода - меньше разбираться)) Тоже попался на эту фишку с microsd)) как потом выяснилось - есть неплохая документация чуть ли не по каждому файлу http://hi-lab.ru/arduino-mega-server/do ... ch/modules

Re: Arduino Mega Server

Добавлено: Вт май 10, 2016 4:14 pm
Alex
Уважаемый Алекс!
Вы совершили кучу ошибок и действовали совершенно «не по инструкции». В частности, вы перезаписали библиотеку в среде Ардуино, чего делать не нужно ни в коем случае. При таком подходе нормальной работы АМС и быть не может.

Соответственно, прежде чем приступать к работе с АМС изучите документацию

http://hi-lab.ru/arduino-mega-server/documentation

там есть ответы на большинство вопросов. При грамотном подходе (в соответствии с документацией) АМС работает прекрасно, что подтверждено уже около 1 500 инсталляций 0.14 версии.

Re: Arduino Mega Server

Добавлено: Вт май 10, 2016 5:05 pm
Анатолий
А кто реализовал подключение датчика BME280 в скетче АМS??? При подключении одного скетча процессор грузится у меня на 100%, а при подключении другого вообще виснет...

Вот код второго скетча
SPOILERSPOILER_SHOW
/*
Modul BME280 (Датчик температуры, влажности и атмосферного давления)
part of Arduino Mega Server project
*/
#ifdef BME280_FEATURE
#include <BME280.h>
#include <Wire.h> // Needed for legacy versions of Arduino.
#define SERIAL_BAUD 9600

BME280 bme; // Default : forced mode, standby time = 1000 ms
// Oversampling = pressure ×1, temperature ×1, humidity ×1, filter off,
bool metric = false;

/* === Print a message to stream with the temp, humidity and pressure. === */
void printBME280Data(Stream * client);
/* === Print a message to stream with the altitude, and dew point. === */
void printBME280CalculatedData(Stream* client);

void BME280Init() {
Serial.begin(SERIAL_BAUD);
while(!Serial) {} // Wait
while(!bme.begin()){
Serial.println("Could not find BME280 sensor!");
delay(1000);
}
}
void BME280Works() {
printBME280Data(&Serial);
printBME280CalculatedData(&Serial);
delay(500);
}

void printBME280Data(Stream* client){
float temp280(NAN), hum(NAN), pres(NAN);
uint8_t pressureUnit(3); // unit: B000 = Pa, B001 = hPa, B010 = Hg, B011 = atm, B100 = bar, B101 = torr, B110 = N/m^2, B111 = psi
bme.ReadData(pres, temp280, hum, metric, pressureUnit); // Parameters: (float& pressure, float& temp, float& humidity, bool celsius = false, uint8_t pressureUnit = 0x0)
/* Alternatives to ReadData():
float ReadTemperature(bool celsius = false);
float ReadPressure(uint8_t unit = 0);
float ReadHumidity();

Keep in mind the temperature is used for humidity and
pressure calculations. So it is more effcient to read
temperature, humidity and pressure all together.
*/
client->print("Temp280: ");
client->print(temp280);
client->print("°"+ String(metric ? 'C' :'F'));
client->print("\t\tHumidity: ");
client->print(hum);
client->print("% RH");
client->print("\t\tPressure: ");
client->print(pres);
client->print(" atm");
}
void printBME280CalculatedData(Stream* client){
float altitude = bme.CalculateAltitude(metric);
float dewPoint = bme.CalculateDewPoint(metric);
client->print("\t\tAltitude: ");
client->print(altitude);
client->print((metric ? "m" : "ft"));
client->print("\t\tDew point: ");
client->print(dewPoint);
client->println("°"+ String(metric ? 'C' :'F'));
}
#endif // BME280_FEATURE
Извините. Я в программировании очень далек....
Что я сделал не так? Подскажите!

Re: Arduino Mega Server

Добавлено: Ср май 11, 2016 10:15 am
nick7zmail
Анатолий писал(а):А кто реализовал подключение датчика BME280 в скетче АМS??? При подключении одного скетча процессор грузится у меня на 100%, а при подключении другого вообще виснет...

Вот код второго скетча

Извините. Я в программировании очень далек....
Что я сделал не так? Подскажите!
Честно говоря - не совсем понимаю что вы пытаетесь сделать. Если вы пишите отдельный скетч - то тут явно не хватает кода. Если пытаетесь подключить к АМС - конструкции типа

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

  client->print("\t\tAltitude: ");
  client->print(altitude);
  client->print((metric ? "m" : "ft"));
  client->print("\t\tDew point: ");
  client->print(dewPoint);
  client->println("°"+ String(metric ? 'C' :'F')); 
Тут явно лишние. АМС просто не может понять что вы от него хотите. Он грузит странички с sd-карты, а тут в него пытаются прямо в клиент впихнуть еще какие-то данные. Делайте по примеру скетча с DS (модуль rtemp). Создайте массив с названием датчиков, массив с данными датчиков. Соответствующие <div> на страничке sd-карты, и отправляйте туда данные через sever-ajax. И кстати - зачем вам delay-и я не понял. В Init'е цикл while (как мне кажется) тоже не нужен, как и delay...хотя я не работал с i2c. Init запускается разово, думаю ничего страшного не произойдет, если он не будет ждать секунду...весь сервер стартует порядка 4 секунд, этого будет достаточно чтобы обнаружить датчик, если он подключен...если его нет - то уже обработку в теле программы проводите, а не в ините...возможно из-за этого и виснет ваш скетч, то что он не может обнаружить датчик, и соотв. не может пройти стадию инита. А BME280Works() вызывайте по таймеру, по примеру того же rtemp, к примеру раз в 4 секунды, если вам нужно столь частое обновление, а delay тоже убирайте.

Если что-то опять не получится - приводите лог монитора порта помимо кода скетча, чтобы понять - на каком этапе стопорится АМС.

PS: Прикольный датчик, возможно закажу себе такой же на улицу)). Изначально хотел весить DHT22. А тут еще и давление - прям метеостанция)

Re: Arduino Mega Server

Добавлено: Ср май 11, 2016 4:02 pm
Анатолий
nick7zmail писал(а):
Анатолий писал(а):А кто реализовал подключение датчика BME280 в скетче АМS??? При подключении одного скетча процессор грузится у меня на 100%, а при подключении другого вообще виснет...

Вот код второго скетча

Извините. Я в программировании очень далек....
Что я сделал не так? Подскажите!
Честно говоря - не совсем понимаю что вы пытаетесь сделать. Если вы пишите отдельный скетч - то тут явно не хватает кода. Если пытаетесь подключить к АМС - конструкции типа

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

  client->print("\t\tAltitude: ");
  client->print(altitude);
  client->print((metric ? "m" : "ft"));
  client->print("\t\tDew point: ");
  client->print(dewPoint);
  client->println("°"+ String(metric ? 'C' :'F'));
Тут явно лишние. АМС просто не может понять что вы от него хотите. Он грузит странички с sd-карты, а тут в него пытаются прямо в клиент впихнуть еще какие-то данные. Делайте по примеру скетча с DS (модуль rtemp). Создайте массив с названием датчиков, массив с данными датчиков. Соответствующие <div> на страничке sd-карты, и отправляйте туда данные через sever-ajax. И кстати - зачем вам delay-и я не понял. В Init'е цикл while (как мне кажется) тоже не нужен, как и delay...хотя я не работал с i2c. Init запускается разово, думаю ничего страшного не произойдет, если он не будет ждать секунду...весь сервер стартует порядка 4 секунд, этого будет достаточно чтобы обнаружить датчик, если он подключен...если его нет - то уже обработку в теле программы проводите, а не в ините...возможно из-за этого и виснет ваш скетч, то что он не может обнаружить датчик, и соотв. не может пройти стадию инита. А BME280Works() вызывайте по таймеру, по примеру того же rtemp, к примеру раз в 4 секунды, если вам нужно столь частое обновление, а delay тоже убирайте.

Если что-то опять не получится - приводите лог монитора порта помимо кода скетча, чтобы понять - на каком этапе стопорится АМС.

PS: Прикольный датчик, возможно закажу себе такой же на улицу)). Изначально хотел весить DHT22. А тут еще и давление - прям метеостанция)
Спасибо за ответ! Попробую сделать на примере модуля rtemp.
А датчик BME280 действительно интересный, его размеры еще меньше чем у DHT22.

Re: Arduino Mega Server

Добавлено: Чт май 12, 2016 5:05 am
Olymp
nick7zmail писал(а):PS: Прикольный датчик, возможно закажу себе такой же на улицу)). Изначально хотел весить DHT22. А тут еще и давление - прям метеостанция)
Я не рискнул его на улицу, в его мелком корпусе махонькое отверстие, как и в bmp180, думаю на улице через это отверстие в датчик попадет влага, что врятли положительно скажется на его показаниях, возможно я не прав. Есть еще SI7021, у него это отверстие чем то заклеено, возможно его можно на улицу, но он в отличии от bme280 измеряет только температуру и влажность, диапазон температур -40-85, но рекомендованная 10-60, думаю для зимы не покатит, опять же от вашего региона зависит. Давление, опять же мое мнение, нужно измерять в помещении а не на улице, т.к. при изменении температуры изменятся показания давления, bme280 не плохо компенсирует показания, в отличии от bmp180, наблюдения при открывании окна для проветривания.