Arduino Mega Server

Модератор: Alex

denis68
Сообщения: 2
Зарегистрирован: Вт апр 26, 2016 10:59 pm
Благодарил (а): 1 раз
Поблагодарили: 0

Re: Arduino Mega Server

Сообщение denis68 » Чт апр 28, 2016 8:25 pm

Странно, дело точно не в сети и SD.
Несколько других более простых серверов не AMS запускаются.
Попробую отключить второстепенные модули.
Какие модули обязательны для отображения сайта?
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: Arduino Mega Server

Сообщение nick7zmail » Чт апр 28, 2016 10:13 pm

Немного не по теме...но думаю тут быстро помогут...поиском в гугле не нашел то, чего надо.
Подскажите варианты реализации...у девайса несколько минусовых выходов, и надо их поочередно замыкать на землю...как переменный + подавать понятно...а как переменную gnd - чет не соображу...
Желательно без транзисторов (нет под рукой)...но если без них никак - куплю.
Последний раз редактировалось nick7zmail Пт апр 29, 2016 6:10 am, всего редактировалось 1 раз.
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
zoran
Сообщения: 1
Зарегистрирован: Пт апр 29, 2016 12:47 am
Благодарил (а): 0
Поблагодарили: 0

Re: Arduino Mega Server

Сообщение zoran » Пт апр 29, 2016 12:48 am

Добрый день.

А сценарии в этом проекте работают, можно организовать автоматическое управление отопления.
alexsis_76
Сообщения: 792
Зарегистрирован: Пт янв 22, 2016 10:08 am
Благодарил (а): 6 раз
Поблагодарили: 63 раза

Re: Arduino Mega Server

Сообщение alexsis_76 » Пт апр 29, 2016 9:33 am

попробуйте digitalWrite(x,LOW),установит на выходе x лог 0(посадит на землю), только не суйте туда внешнее напряжение, сгорит.
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: Arduino Mega Server

Сообщение nick7zmail » Пт апр 29, 2016 10:08 am

alexsis_76 писал(а):попробуйте digitalWrite(x,LOW),установит на выходе x лог 0(посадит на землю), только не суйте туда внешнее напряжение, сгорит.
1) Вы уверены что digitalWrite(x,LOW) это именно подключение на землю, а не просто отсутствие потенциала на пине?
2) Даже если так, то как с него убирать землю?

Короче наверное проще объяснить задачу на конкретном примере. Завалялся у меня такой дисплейчик
SDC17058.jpg
SDC17058.jpg (5.23 КБ) 13370 просмотров
12 пинов. На 8 из них подаётся +(для 7 сегментов, + 1 для 2х средних точек...точки под цифрами включить не удалось). На 4 подаётся минус. Но если подавать минус постоянно - у всех 4х цифр будут одинаковые сегменты гореть. Нужно подавать минус по очереди, дабы зажигались на каждой цифре свои сегменты.
1) Для этой цели можно подключить минусовые сегменты к цифровым пинам?
2) Когда нужно чтобы отсутствовала земля - выставлять в HIGH? тогда на контактах диода будет один потенциал, и они не будут гореть, когда не надо...логично)))
3) После установки в LOW, если это земля - туда потечет ток (с самого же контроллера, 5v), вы говорите не цеплять внешнее напряжение, а то спалю контроллер...по такой схеме (в п.2) ничего не случится?
4) Путем гугленья нашел вот эту статейку. У этого парня подключены на цифровые пины земля, через резисторы. Номинал резисторов не нашел...все по разному пишут. От 100 Ом до 10кОм. Подключил через 100-омные...если я их на цифровые пущу - не спалю ничего? Эти цифровые тоже в OUTPUT переключить надо?
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
alexsis_76
Сообщения: 792
Зарегистрирован: Пт янв 22, 2016 10:08 am
Благодарил (а): 6 раз
Поблагодарили: 63 раза

Re: Arduino Mega Server

Сообщение alexsis_76 » Пт апр 29, 2016 10:17 am

ВАМ нужна динамическая индикация
http://radiolaba.ru/wp-content/uploads/ ... katori.jpg
вот
когда на выходе PA1-PA3 устанавливается лог 1 , транзистор открывается и катод садится на землю(индикаторы с общим катодом).ограничительные резисторы обязательны, можно без транзистора на порт , но может выгореть, ток большой, тогда вывод нужно давить на землю.digitalWrite(x,LOW) и поставьте ограничительные резисторы
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: Arduino Mega Server

Сообщение nick7zmail » Пт апр 29, 2016 10:21 am

alexsis_76 писал(а):ВАМ нужна динамическая индикация
http://radiolaba.ru/wp-content/uploads/ ... katori.jpg
вот
когда на выходе PA1-PA3 устанавливается лог 1 , транзистор открывается и катод садится на землю(индикаторы с общим катодом).ограничительные резисторы обязательны, можно без транзистора на порт , но может выгореть, ток большой, тогда вывод нужно давить на землю.digitalWrite(x,LOW) и поставьте ограничительные резисторы
Спасибо за ссылку, дома изучу (на работе не открывается)))...Резисторы каким номиналом? Я поставил 100 Ом на эти 4 катода...этого достаточно?
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
serghei
Сообщения: 2575
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 303 раза
Поблагодарили: 282 раза

Re: Arduino Mega Server

Сообщение serghei » Пт апр 29, 2016 10:37 am

Номиналы резисторов зависят от марки индикаторов ( ищите datasheet). В любом случае выходной ток ардуины на один пин
не долее 40 миллиампер и в сумме на все не более 200 ма. Так что начните с 500 ом и меньше. Если индикатору не хватит
току, он будет тускло гореть.Без транзисторов (ключей) очень велика вероятность спалить мегу.
И еще. Если решите ставить ключи,учтите момент -они инвертируют синал(подаете 0-транзистор закрыт,индикатор не горит).
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Arduino Mega Server

Сообщение Alex » Пт апр 29, 2016 1:21 pm

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

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

http://hi-lab.ru/arduino-mega-server/de ... aq/network
А сценарии в этом проекте работают, можно организовать автоматическое управление отопления.
В АМС работают таймеры и часы реального времени (и любые сенсоры, естественно), на этой основе можно организовать любое управление. Но прежде, чем доверять АМС управление критически важными системами, нужно хорошо подумать — не проводилось такого тестирования и вы всё делаете на свой страх и риск.
serghei
Сообщения: 2575
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 303 раза
Поблагодарили: 282 раза

Re: Arduino Mega Server

Сообщение serghei » Вт май 03, 2016 2:05 pm

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

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

/*
  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

AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
Ответить