MegaLight - контроллер освещения на Arduino Mega 2560+W5100

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

DAP
Сообщения: 118
Зарегистрирован: Пн апр 06, 2015 10:25 pm
Благодарил (а): 6 раз
Поблагодарили: 16 раз

Re: MegaLight - контроллер освещения на Arduino Mega 2560+W5

Сообщение DAP » Чт мар 16, 2017 12:42 am

Возможно сделать выгрузку/загрузку конфига ? Ато начал добавлять реле на работающем экземпляре и получил зависон при любом изменении конфигурации, потом и вовсе всё полетело выдав в интерфейс абракадабру. Теперь похоже снова настраивать 35 реле 12 выключателей и 10 JP :? С какой вероятностью я достиг предела EEPROM?
olehs
Сообщения: 1115
Зарегистрирован: Вс июн 14, 2015 11:08 am
Благодарил (а): 85 раз
Поблагодарили: 342 раза

Re: MegaLight - контроллер освещения на Arduino Mega 2560+W5

Сообщение olehs » Чт мар 16, 2017 11:13 pm

DAP писал(а):Возможно сделать выгрузку/загрузку конфига ? Ато начал добавлять реле на работающем экземпляре и получил зависон при любом изменении конфигурации, потом и вовсе всё полетело выдав в интерфейс абракадабру. Теперь похоже снова настраивать 35 реле 12 выключателей и 10 JP :? С какой вероятностью я достиг предела EEPROM?
хм... нет такой возможности ((
Тут предел не EEPROM, а оперативки. Десяток JP, и конфигать через вебморду уже нереально.
Я конфиг пока продублировал в коде скетча, чтобы не терять.
выглядит такПоказать

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

void createJoints()
{
  BounceButton *b;
  
//  b = new BounceButton(30); b->ID = 11; jpList.addButton(b);
  b = new BounceButton(29); b->ID = 12; jpList.addButton(b);
  b = new BounceButton(28); b->ID = 21; jpList.addButton(b);
  b = new BounceButton(38); b->ID = 31; jpList.addButton(b);
  b = new BounceButton(36); b->ID = 32; jpList.addButton(b);
  b = new BounceButton(45); b->ID = 41; jpList.addButton(b);
//  b = new BounceButton(44); b->ID = 42; jpList.addButton(b);
  b = new BounceButton(23); b->ID = 51; jpList.addButton(b);
//  b = new BounceButton(34); b->ID = 61; jpList.addButton(b);
  b = new BounceButton(35); b->ID = 62; jpList.addButton(b);
  b = new BounceButton(25); b->ID = 71; jpList.addButton(b);
//  b = new BounceButton(26); b->ID = 72; jpList.addButton(b);
//  b = new BounceButton(27); b->ID = 73; jpList.addButton(b);
//  b = new BounceButton(43); b->ID = 74; jpList.addButton(b);
  b = new BounceButton(32); b->ID = 81; jpList.addButton(b);
  b = new BounceButton(31); b->ID = 82; jpList.addButton(b);
  b = new BounceButton(40); b->ID = 91; jpList.addButton(b);
  b = new BounceButton(41); b->ID = 92; jpList.addButton(b);
  b = new BounceButton(37); b->ID = 101; jpList.addButton(b);
  b = new BounceButton(39); b->ID = 102; jpList.addButton(b);
  b = new BounceButton(22); b->ID = 111; jpList.addButton(b);
  b = new BounceButton(24); b->ID = 112; jpList.addButton(b);
  b = new BounceButton(33); b->ID = 100; jpList.addButton(b);
  
  RelayModule *r;
  r = new RelayModule(0); r->ID = 100; jpList.addRelay(r);
  r = new RelayModule(14); r->ID = 11; r->setSaveState(RelayStateSave::State); jpList.addRelay(r);
  r = new RelayModule(15); r->ID = 12; r->setSaveState(RelayStateSave::State); jpList.addRelay(r);
  r = new RelayModule(16); r->ID = 13; r->setSaveState(RelayStateSave::State); jpList.addRelay(r);
  r = new RelayModule(17); r->ID = 14; r->setSaveState(RelayStateSave::State); jpList.addRelay(r);
  r = new RelayModule(18); r->ID = 15; r->setSaveState(RelayStateSave::State); jpList.addRelay(r);
  r = new RelayModule(19); r->ID = 16; r->setSaveState(RelayStateSave::State); jpList.addRelay(r);
  r = new RelayModule(20); r->ID = 17; r->setSaveState(RelayStateSave::State); jpList.addRelay(r);
  r = new RelayModule(21); r->ID = 18; r->setSaveState(RelayStateSave::State); jpList.addRelay(r);
  r = new RelayModule(62); r->ID = 21; r->setSaveState(RelayStateSave::State); jpList.addRelay(r);
  r = new RelayModule(63); r->ID = 22; r->setSaveState(RelayStateSave::State); jpList.addRelay(r);
  r = new RelayModule(64); r->ID = 23; r->setSaveState(RelayStateSave::State); jpList.addRelay(r);
  r = new RelayModule(65); r->ID = 24; r->setSaveState(RelayStateSave::State); jpList.addRelay(r);
  r = new RelayModule(66); r->ID = 25; r->setSaveState(RelayStateSave::State); jpList.addRelay(r);
  r = new RelayModule(67); r->ID = 26; r->setSaveState(RelayStateSave::State); jpList.addRelay(r);
  r = new RelayModule(68); r->ID = 27; r->setSaveState(RelayStateSave::State); jpList.addRelay(r);
  r = new RelayModule(69); r->ID = 28; r->setSaveState(RelayStateSave::State); jpList.addRelay(r);
  r = new RelayModule(46); r->ID = 31; r->setSaveState(RelayStateSave::State); jpList.addRelay(r);
  r = new RelayModule(47); r->ID = 32; r->setInvert(true); r->setSaveState(RelayStateSave::State); r->setOn(); jpList.addRelay(r);
  r = new RelayModule(48); r->ID = 33; r->setInvert(true); r->setSaveState(RelayStateSave::State); r->setOn(); jpList.addRelay(r);
  
  JointPoint *jp;
//  jp = jpList.add(11); jp->addButton(11); jp->addRelay(1); jp->setAction(ButtonEvent::Pressed, RelayAction::Toggle, 0, 0);
  jp = jpList.add(12); jp->addButton(12); jp->addRelay(18); jp->setAction(ButtonEvent::Pressed, RelayAction::Toggle, 0, 0);
  jp = jpList.add(21); jp->addButton(21); jp->addRelay(17); jp->setAction(ButtonEvent::Pressed, RelayAction::On, 0, 0); jp->setAction(ButtonEvent::Released, RelayAction::Off, 0, 0);
  jp = jpList.add(31); jp->addButton(31); jp->addRelay(15); jp->setAction(ButtonEvent::Pressed, RelayAction::Toggle, 0, 0);
  jp = jpList.add(32); jp->addButton(32); jp->addRelay(13); jp->setAction(ButtonEvent::Pressed, RelayAction::Toggle, 0, 0);
  jp = jpList.add(41); jp->addButton(41); jp->addRelay(22); jp->setAction(ButtonEvent::Pressed, RelayAction::Toggle, 0, 0);
//  jp = jpList.add(42); jp->addButton(42); jp->addRelay(21); jp->setAction(ButtonEvent::Pressed, RelayAction::Toggle, 0, 0);
  jp = jpList.add(51); jp->addButton(51); jp->addRelay(24); jp->setAction(ButtonEvent::Pressed, RelayAction::On, 0, 0); jp->setAction(ButtonEvent::Released, RelayAction::Off, 0, 0);
//  jp = jpList.add(61); jp->addButton(61); jp->addRelay(11); jp->setAction(ButtonEvent::Pressed, RelayAction::Toggle, 0, 0);
  jp = jpList.add(62); jp->addButton(62); jp->addRelay(12); jp->setAction(ButtonEvent::Pressed, RelayAction::Toggle, 0, 0);
  jp = jpList.add(71); jp->addButton(71); jp->addRelay(26); jp->setAction(ButtonEvent::Pressed, RelayAction::Toggle, 0, 0);
//  jp = jpList.add(72); jp->addButton(72); jp->addRelay(27); jp->setAction(ButtonEvent::Pressed, RelayAction::Toggle, 0, 0);
//  jp = jpList.add(73); jp->addButton(74); jp->addRelay(1); jp->setAction(ButtonEvent::Pressed, RelayAction::Toggle, 0, 0);
//  jp = jpList.add(74); jp->addButton(74); jp->addRelay(1); jp->setAction(ButtonEvent::Pressed, RelayAction::Toggle, 0, 0);
//  jp = jpList.add(81); jp->addButton(81); jp->addRelay(1); jp->setAction(ButtonEvent::Pressed, RelayAction::Toggle, 0, 0);
  jp = jpList.add(82); jp->addButton(82); jp->addButton(91); jp->addRelay(28); jp->setAction(ButtonEvent::Pressed, RelayAction::Toggle, 0, 0);
//  jp = jpList.add(91); jp->addButton(91); jp->addRelay(28); jp->setAction(ButtonEvent::Pressed, RelayAction::Toggle, 0, 0);
//  jp = jpList.add(92); jp->addButton(92); jp->addRelay(1); jp->setAction(ButtonEvent::Pressed, RelayAction::Toggle, 0, 0);
  jp = jpList.add(101); jp->addButton(101); jp->addRelay(14); jp->setAction(ButtonEvent::Pressed, RelayAction::Toggle, 0, 0);
  jp = jpList.add(102); jp->addButton(102); jp->addRelay(16); jp->setAction(ButtonEvent::Pressed, RelayAction::Toggle, 0, 0);
  jp = jpList.add(111); jp->addButton(111); jp->addRelay(31); jp->setAction(ButtonEvent::Pressed, RelayAction::On, 0, 0); jp->setAction(ButtonEvent::Released, RelayAction::Off, 0, 0); 
  jp = jpList.add(112); jp->addButton(112); jp->addRelay(25); jp->setAction(ButtonEvent::Pressed, RelayAction::On, 0, 0); jp->setAction(ButtonEvent::Released, RelayAction::Off, 0, 0); 

  jp = jpList.add(100); jp->addButton(100); jp->addRelay(100); jp->setAction(ButtonEvent::Pressed, RelayAction::On, 0, 3000);
  
  jpList.saveConfig();
}
А сам тем временем работаю над версией с SD-картой. Пока в состоянии "не понимаю, как это должно работать" ))
За это сообщение автора olehs поблагодарил:
DAP (Ср мар 22, 2017 12:44 am)
Рейтинг: 1.16%
DAP
Сообщения: 118
Зарегистрирован: Пн апр 06, 2015 10:25 pm
Благодарил (а): 6 раз
Поблагодарили: 16 раз

Re: MegaLight - контроллер освещения на Arduino Mega 2560+W5

Сообщение DAP » Сб мар 18, 2017 1:55 am

нашел баг или нечто на него похожее - я так понимаю

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

#define ITEMS_PER_PAGE   
должно определять количество элементов на страницу, если его выставить меньше 10 прим. 5 то количество элементов на странице будет максимум 5 добавляем 6й элемент, а страниц всё равно одна, вторая появится только после добавления 11го элемента.
ps
у себя исправил заменив 10.0 на ITEMS_PER_PAGE и присвоив ей значение 5.0

я так понимаю что при созданни JP используемая память = "к-во. реле" * "к-во кнопок" + "некоторый набор переменных" ? Может есть смысл изменить код чтобы JP использовал релеи № + кнопки № а не все релеи все кнопки ?
DAP
Сообщения: 118
Зарегистрирован: Пн апр 06, 2015 10:25 pm
Благодарил (а): 6 раз
Поблагодарили: 16 раз

Re: MegaLight - контроллер освещения на Arduino Mega 2560+W5

Сообщение DAP » Пн мар 20, 2017 10:35 pm

подключил к скетчу ф-ю проверки свободной RAM

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

int freeRam () {

 
extern int __heap_start, *__brkval;

 
int v;

 
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);

} 
При заполнении элементами до момента пока не поймаю зависание функция возвращает ~ 1500 байт свободной ram может дело всё-же не в оперативке, а в EEPROM или в чем -то другом?
olehs
Сообщения: 1115
Зарегистрирован: Вс июн 14, 2015 11:08 am
Благодарил (а): 85 раз
Поблагодарили: 342 раза

Re: MegaLight - контроллер освещения на Arduino Mega 2560+W5

Сообщение olehs » Пн мар 20, 2017 10:55 pm

А куда в коде Вы ее вставляли?
olehs
Сообщения: 1115
Зарегистрирован: Вс июн 14, 2015 11:08 am
Благодарил (а): 85 раз
Поблагодарили: 342 раза

Re: MegaLight - контроллер освещения на Arduino Mega 2560+W5

Сообщение olehs » Пн мар 20, 2017 10:59 pm

DAP писал(а):может дело всё-же не в оперативке, а в EEPROM или в чем -то другом?
Зависание - явный признак, что куча встретилась со стеком. Из-за EEPROM такого не произошло бы.
Проблема в том, что вся структура все время хранится в оперативке в виде объектов/списков и т.д. Даже если на саму структуру памяти хватает, то ее модификация приводит к фрагментации.
DAP
Сообщения: 118
Зарегистрирован: Пн апр 06, 2015 10:25 pm
Благодарил (а): 6 раз
Поблагодарили: 16 раз

Re: MegaLight - контроллер освещения на Arduino Mega 2560+W5

Сообщение DAP » Пн мар 20, 2017 11:21 pm

в сам скетч
СпойлерПоказать

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

//#define NO_PWM_LIB

#ifndef NO_PWM_LIB
#include "PWM.h"
#endif

#include <EEPROM.h>
#include <JointPoint.h>

// MajorDoMo server settings
static char mdHost[] = "192.168.21.100";
static char mdAuth[] = "";
static uint16_t mdPort = 80;

JointPointList jpList;

void loadJPConfig()
{
  if (!jpList.checkDB())
    jpList.saveConfig();
  else
    jpList.loadConfig();
}

void setupJoints()
{
  jpList.host = mdHost;
  jpList.port = mdPort;
  jpList.auth = mdAuth;

//  jpList.saveConfig();
  loadJPConfig();
}

int freeRam () {

 
extern int __heap_start, *__brkval;

 
int v;

 
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);

}

и вывод в loop :

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

void loop() {
  runner.execute();
  Serial.println("\n[memCheck]");

   
Serial.println(freeRam());
}
что характерно зависон происходит при размере конфига у границы ~1024байт что наводит на мысль - может оно не адресует всю EEPROM? может где-то работает с ней как с UNO?
olehs
Сообщения: 1115
Зарегистрирован: Вс июн 14, 2015 11:08 am
Благодарил (а): 85 раз
Поблагодарили: 342 раза

Re: MegaLight - контроллер освещения на Arduino Mega 2560+W5

Сообщение olehs » Пн мар 20, 2017 11:44 pm

DAP писал(а): и вывод в loop :

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

void loop() {
  runner.execute();
  Serial.println("\n[memCheck]");

   
Serial.println(freeRam());
}
Тут уже стек пустой. Попробуйте где-то в веб-скетче рядом с saveConfig.

Про границу в 1К - интересное наблюдение. Но EEPROM.length() возвращает 4096.
DAP
Сообщения: 118
Зарегистрирован: Пн апр 06, 2015 10:25 pm
Благодарил (а): 6 раз
Поблагодарили: 16 раз

Re: MegaLight - контроллер освещения на Arduino Mega 2560+W5

Сообщение DAP » Вт мар 21, 2017 1:49 am

Видимо таки RAM:
Free RAM = 1157Config saved (1006 bytes).
Free RAM = 1021Config saved (1006 bytes).
Free RAM = 885Config saved (1006 bytes).
Free RAM = 749Config saved (1006 bytes).
Free RAM = 613Config saved (1006 bytes).
Free RAM = 477Config saved (1006 bytes).
Free RAM = 341Config saved (1006 bytes).
Free RAM = 205Config saved (1006 bytes).
на этом добавлении повисла..
DAP
Сообщения: 118
Зарегистрирован: Пн апр 06, 2015 10:25 pm
Благодарил (а): 6 раз
Поблагодарили: 16 раз

Re: MegaLight - контроллер освещения на Arduino Mega 2560+W5

Сообщение DAP » Вт мар 21, 2017 9:10 pm

каков шанс что проблема будет решена? или стоит подключить вторую мегу в сеть?
Ответить