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

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

Модератор: immortal

karsotrade
Сообщения: 96
Зарегистрирован: Пт июн 09, 2017 11:18 pm
Благодарил (а): 17 раз
Поблагодарили: 12 раз

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

Сообщение karsotrade » Вт дек 26, 2017 8:37 pm

Отлично всё скомпелировалось и загрузилось, но датчик не работает (не отправляет данные в МЖД), а управление есть.
За это сообщение автора karsotrade поблагодарил:
serghei (Ср дек 27, 2017 8:43 am)
Рейтинг: 1.25%
olehs
Сообщения: 1113
Зарегистрирован: Вс июн 14, 2015 11:08 am
Благодарил (а): 85 раз
Поблагодарили: 333 раза

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

Сообщение olehs » Вт дек 26, 2017 9:06 pm

Я еще раз поправил код: избавился от еще одного delay и добавил получение адреса МЖД из MegaLight.

А вы уверены, что у вас в МЖД есть объект DHTsensor1, а у него есть методы temp1 и hum1, принимающие параметр t ?
karsotrade
Сообщения: 96
Зарегистрирован: Пт июн 09, 2017 11:18 pm
Благодарил (а): 17 раз
Поблагодарили: 12 раз

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

Сообщение karsotrade » Вт дек 26, 2017 9:10 pm

Ещё раз проверил отдельно скетч DHT, работает нормально, данные в МЖД передаёт, а с ML не хочет.
karsotrade
Сообщения: 96
Зарегистрирован: Пт июн 09, 2017 11:18 pm
Благодарил (а): 17 раз
Поблагодарили: 12 раз

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

Сообщение karsotrade » Вт дек 26, 2017 9:15 pm

Ещё раз залил - не работает датчик. Может какая то фишка с задержкой? Задержка нужна для считывания данных с DHT22 (2000мс).
karsotrade
Сообщения: 96
Зарегистрирован: Пт июн 09, 2017 11:18 pm
Благодарил (а): 17 раз
Поблагодарили: 12 раз

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

Сообщение karsotrade » Вт дек 26, 2017 9:21 pm

Нашёл ещё, что потерялось dht1. begin(); Вставил в void setup() но всё равно не заработало.
karsotrade
Сообщения: 96
Зарегистрирован: Пт июн 09, 2017 11:18 pm
Благодарил (а): 17 раз
Поблагодарили: 12 раз

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

Сообщение karsotrade » Вт дек 26, 2017 10:11 pm

Набросал сейчас вкладку setup как было вчера при эксперименте:
СпойлерПоказать
#include <avr/wdt.h>
#include "DHT.h" //библиотека для работы с DHT
#define DHTPIN1 14 //Обозначаем номер пина, к которому подключен датчик

byte server[] = { 192, 168, 21, 80 };
EthernetClient client2;
DHT dht1(DHTPIN1, DHT22); //инициируем датчик DHT
int old_temperature1=0;
int old_humidity1=0;
char buf[80];

// Функция отправки HTTP-запроса на сервер
void sendHTTPRequest() {
Serial.println(buf);
if (client2.connect(server, 80)) {
Serial.println("OK");
client2.println(buf);
client2.println("Host: 192.168.21.80");
client2.println();
delay(2000);
client2.stop();
} else {
Serial.println("FAILED");
}
}


Scheduler runner;

Task t1(1, TASK_FOREVER, &buttonLoop, &runner);
Task t2(1, TASK_FOREVER, &relayLoop, &runner);
Task t3(1, TASK_FOREVER, &webLoop, &runner);
Task t4(1, TASK_FOREVER, &externalLoop, &runner);

void buttonLoop() {
inputList.check();
outputEM.processAllEvents();
}

void relayLoop() {
inputEM.processAllEvents();
outputList.check();
}

#define WBSIZE 1024
void webLoop()
{
char webBuffer[WBSIZE];
int buflen = WBSIZE;
webserver.processConnection(webBuffer, &buflen);
}

void externalLoop()
{
externalEM.processEvent();
}


bool loadConfig() {
const uint8_t CONFIG_LINE_LENGTH = 127;
// The open configuration file.
SDConfigFile cfg;

// Open the configuration file.
if (!cfg.begin(CONFIG_FILE, CONFIG_LINE_LENGTH)) {
Serialprint("Failed to open configuration file: %s\r\n", CONFIG_FILE);
return false;
}

// Read each setting from the file.
while (cfg.readNextSetting()) {

if (cfg.nameIs("mac")) {
parseBytes(cfg.getValue(), '-', mac, 6, 16);
Serial.print("MAC="); Serial.println(cfg.getValue());

} else if (cfg.nameIs("ip")) {
parseBytes(cfg.getValue(), '.', ip, 4, 10);

} else if (cfg.nameIs("mdHost")) {
mdHost = cfg.getValue();

} else if (cfg.nameIs("mdPort")) {
mdPort = cfg.getIntValue();

} else if (cfg.nameIs("mdAuth")) {
mdAuth = cfg.getValue();
}
}

// clean up
cfg.end();
return true;
}

bool setupSD() {
if (!SD.begin(4)) {
Serialprint("SD unavailable. Trying to load config from EEPROM.\r\n");
return false;
}
Serialprint("SD initialization done.\r\n");
return true;
}


void setupTasks()
{
t1.enable();
t2.enable();
t3.enable();
t4.enable();

runner.init();

runner.addTask(t1);
runner.addTask(t2);
runner.addTask(t3);
runner.addTask(t4);
}

int setupInputsSD() {
const uint8_t CONFIG_LINE_LENGTH = 127;

String configDir = F("/INPUTS");
File dir = SD.open(configDir);
if (!dir.isDirectory())
return 0;

inputList.clearInputs();
storageHeader.cntInputs = 0;
int sz = 0;

SDConfigFile cfg;

while (true) {
File inp = dir.openNextFile();
if (!inp)
break;

if (inp.isDirectory())
{
inp.close();
continue;
}

const char *id = inp.name();
inp.close();

ML2Input *b = new ML2Input(id);

// The open configuration file.
if (!cfg.begin(String(configDir + "/" + String(id)).c_str(), CONFIG_LINE_LENGTH)) {
Serialprint("Failed to open input file: %s\r\n", id);
delete b;
cfg.end();
continue;
}


// Read each setting from the file.
while (cfg.readNextSetting()) {

if (cfg.nameIs("pin")) {
b->setPin(cfg.getIntValue());

} else if (cfg.nameIs("pullup")) {
const char *pu = cfg.getValue();
if (!strcmp(pu, "intup"))
b->setPullup(InputPullup::IntPullup);
else if (!strcmp(pu, "extup"))
b->setPullup(InputPullup::ExtPullup);
else if (!strcmp(pu, "extdown"))
b->setPullup(InputPullup::PullDown);

} else if (cfg.nameIs("bounceint")) {
b->setBounceInterval(cfg.getIntValue());

} else if (cfg.nameIs("holdint")) {
b->setHoldInterval(cfg.getIntValue());

} else if (cfg.nameIs("repeat")) {
b->setRepeat(cfg.getBooleanValue());

} else if (cfg.nameIs("repeatint")) {
b->setRepeatInterval(cfg.getIntValue());

} else if (cfg.nameIs("dclickint")) {
b->setDoubleClickInterval(cfg.getIntValue());

} else if (cfg.nameIs("prevclick")) {
b->setPreventClick(cfg.getBooleanValue());

}
}

// clean up
cfg.end();

if (!inputList.addInput(b))
{
Serialprint("Failed to add input %s\r\n", id);
delete b;
}
else
{
Serialprint("Added input %s on pin %d\r\n", id, b->pin());
sz += saveInputEEPROM(b, storageHeader.addrInputs + sz);
storageHeader.cntInputs++;
}
}

dir.close();

return sz;
}

int setupOutputsSD() {
const uint8_t CONFIG_LINE_LENGTH = 127;

String configDir = F("/OUTPUTS");
File dir = SD.open(configDir);
if (!dir.isDirectory())
return 0;

outputList.clearOutputs();
storageHeader.cntOutputs = 0;
int sz = 0;

SDConfigFile cfg;

while (true) {
File inp = dir.openNextFile();
if (!inp)
break;

if (inp.isDirectory())
{
inp.close();
continue;
}

const char *id = inp.name();
inp.close();

ML2Output *b = new ML2Output(id);

// The open configuration file.
if (!cfg.begin(String(configDir + "/" + String(id)).c_str(), CONFIG_LINE_LENGTH)) {
Serialprint("Failed to open output file: %s\r\n", id);
delete b;
cfg.end();
continue;
}


// Read each setting from the file.
while (cfg.readNextSetting()) {

if (cfg.nameIs("pin")) {
b->setPin(cfg.getIntValue());

} else if (cfg.nameIs("pwm")) {
b->setPWM(cfg.getBooleanValue());

} else if (cfg.nameIs("invert")) {
b->setInvert(cfg.getBooleanValue());

} else if (cfg.nameIs("noreport")) {
b->setNoreport(cfg.getBooleanValue());

} else if (cfg.nameIs("on")) {
cfg.getBooleanValue() ? b->setOn() : b->setOff();

} else if (cfg.nameIs("value")) {
b->setValue(cfg.getIntValue());

} else if (cfg.nameIs("save")) {
const char *pu = cfg.getValue();
if (!strcmp(pu, "state"))
b->setSaveState(OutputStateSave::State);
else if (!strcmp(pu, "value"))
b->setSaveState(OutputStateSave::Value);
else if (!strcmp(pu, "both"))
b->setSaveState(OutputStateSave::StateAndValue);

}
}

// clean up
cfg.end();

if (!outputList.addOutput(b))
{
Serialprint("Failed to add output %s\r\n", id);
delete b;
}
else
{
Serialprint("Added output %s on pin %d\r\n", id, b->pin());
sz += saveOutputEEPROM(b, storageHeader.addrOutputs + sz);
storageHeader.cntOutputs++;
}
}

dir.close();
return sz;
}


int loadRulesFromFile(File &dir, String path) {
int sz = 0;
while (true) {

File entry = dir.openNextFile();
if (! entry) {
// no more files
break;
}

String npath = path + String("/") + entry.name();
if (entry.isDirectory()) {
sz += loadRulesFromFile(entry, npath);
entry.close();
continue;
}
entry.close();

ML2Rule *rule = ML2Rule::fromFile(npath);
if (rule) {
int s = saveRuleEEPROM(rule, storageHeader.addrRules);
sz += s;
storageHeader.addrRules += s;
storageHeader.cntRules++;
delete rule;
Serialprint("Loaded rule: %s\r\n", npath.c_str());
}
}
return sz;
}

int setupRulesSD() {
storageHeader.cntRules = 0;

File root = SD.open(RULES_PATH);
if (root) {
return loadRulesFromFile(root, "");
}
}

bool loadAllFromEEPROM() {
int addr = CONFIG_START;
int sz = loadConfigEEPROM(addr);
if (!sz)
return false;

addr += sz;
sz = loadHeaderEEPROM(addr);
addr += sz;

for (int i = 0; i < storageHeader.cntInputs; i++) {
ML2Input *input = new ML2Input("");
sz = loadInputEEPROM(input, addr);
if (inputList.addInput(input))
Serialprint("Added input %s on pin %d\r\n", input->ID, input->pin());

addr += sz;
}

for (int i = 0; i < storageHeader.cntOutputs; i++) {
ML2Output *output = new ML2Output("");
sz = loadOutputEEPROM(output, addr);
if (outputList.addOutput(output))
Serialprint("Added output %s on pin %d\r\n", output->ID, output->pin());

addr += sz;
}

for (int i = 0; i < storageHeader.cntRules; i++) {
ML2Rule *rule = new ML2Rule("");
sz = loadRuleEEPROM(rule, addr, true);
Serialprint("Added rule %s\r\n", rule->ID.c_str());
addr += sz;
delete rule;
}

return true;
}

int setupConfigSD() {
const uint8_t CONFIG_LINE_LENGTH = 127;
SDConfigFile cfg;

if (!cfg.begin(CONFIG_FILE, CONFIG_LINE_LENGTH)) {
Serialprint("Failed to open configuration file: %s\r\n", CONFIG_FILE);
return 0;
}

while (cfg.readNextSetting()) {
if (cfg.nameIs("mac")) {
parseBytes(cfg.getValue(), '-', mac, 6, 16);
Serial.print("MAC="); Serial.println(cfg.getValue());

} else if (cfg.nameIs("ip")) {
parseBytes(cfg.getValue(), '.', ip, 4, 10);

} else if (cfg.nameIs("mdHost")) {
mdHost = cfg.getValue();

} else if (cfg.nameIs("mdPort")) {
mdPort = cfg.getIntValue();

} else if (cfg.nameIs("mdAuth")) {
mdAuth = cfg.getValue();
}
}

// clean up
cfg.end();

return saveConfigEEPROM(CONFIG_START, false);
}

void saveAllToEEPROM() {
int sz = setupConfigSD();
if (!sz) {
Serialprint("Failed to store config\r\n");
return;
}

int addr = CONFIG_START + sz;
int addrHeader = addr;
addr += sizeof(storageHeader);

storageHeader.addrInputs = addr;
sz = setupInputsSD();
addr += sz;
Serialprint("Stored %d inputs (%d bytes)\r\n\r\n", storageHeader.cntInputs, sz);

storageHeader.addrOutputs = addr;
sz = setupOutputsSD();
addr += sz;
Serialprint("Stored %d outputs (%d bytes)\r\n\r\n", storageHeader.cntOutputs, sz);

storageHeader.addrRules = addr;
sz = setupRulesSD();
addr += sz;
Serialprint("Stored %d rules (%d bytes)\r\n\r\n", storageHeader.cntRules, sz);

saveHeaderEEPROM(addrHeader);
saveConfigEEPROM(CONFIG_START, true);

Serialprint("Stored config to EEPROM (%d bytes)\r\n\r\n", addr - CONFIG_START);
}


int freeRam () {
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}

void setup() {


Serial.begin (57200);

dht1. begin();

wdt_disable();

Serial.begin(115200);
Serialprint("Starting...\r\n");

if (setupSD()) {
saveAllToEEPROM();
} else {
loadAllFromEEPROM();
}

setupWeb();
setupEMs();
setupTasks();

Serialprint("Started (free RAM: %d)\r\n", freeRam());

wdt_enable(WDTO_4S);
}

void loop() {



// SENSOR 1 --------------------------------------
//Считываем температуру
float current_temp1=0;
float t1 = dht1.readTemperature(); //Считываем температуру в переменную "t"
{

current_temp1 = t1; // получаем температуру
Serial.println(current_temp1);
if ((old_temperature1!=(int)current_temp1)) {
int temp1 = (current_temp1 - (int)current_temp1) * 100; // выделяем дробную часть
sprintf(buf, "GET /objects/?object=DHTsensor1&op=m&m=temp1&&t=%0d.%d HTTP/1.0", (int)current_temp1, abs(temp1));
sendHTTPRequest();
}
old_temperature1=(int)current_temp1;
}
//Считываем влажность
float current_hum1=0;
float h1 = dht1.readHumidity(); //Считываем температуру в переменную "t"
{
current_hum1 = h1; // получаем влажность
Serial.println(current_hum1);
if ((old_humidity1!=(int)current_hum1)) {
int hum1 = (current_hum1 - (int)current_hum1) * 100; // выделяем дробную часть
sprintf(buf, "GET /objects/?object=DHTsensor1&op=m&m=hum1&&t=%0d.%d HTTP/1.0", (int)current_hum1, abs(hum1));
sendHTTPRequest();
}
old_humidity1=(int)current_hum1;
}
delay(2000); // задержка в 2 сек.



wdt_reset();
runner.execute();
}

void reset() {
wdt_enable(WDTO_1S);
while (1);
}
При такой раскладке температура и влажность передаётся в МЖД, а управление не работает.
Если убрать строку delay(2000); то начинает работать управление, а датчик не работает.
karsotrade
Сообщения: 96
Зарегистрирован: Пт июн 09, 2017 11:18 pm
Благодарил (а): 17 раз
Поблагодарили: 12 раз

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

Сообщение karsotrade » Ср дек 27, 2017 9:30 pm

Всю голову сломал ...не могу датчик запустить. Походу цикл void DHTloop() не работает.
olehs
Сообщения: 1113
Зарегистрирован: Вс июн 14, 2015 11:08 am
Благодарил (а): 85 раз
Поблагодарили: 333 раза

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

Сообщение olehs » Ср дек 27, 2017 9:51 pm

Добавьте в него вывод чего-то в Serial, чтобы знать наверняка
За это сообщение автора olehs поблагодарил:
karsotrade (Сб дек 30, 2017 7:42 pm)
Рейтинг: 1.25%
karsotrade
Сообщения: 96
Зарегистрирован: Пт июн 09, 2017 11:18 pm
Благодарил (а): 17 раз
Поблагодарили: 12 раз

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

Сообщение karsotrade » Ср дек 27, 2017 10:45 pm

olehs писал(а):Добавьте в него вывод чего-то в Serial, чтобы знать наверняка
В serial тишина, только команды управления, что вставляю в цикл void DHTloop() не выводится.
ololenok
Сообщения: 54
Зарегистрирован: Ср сен 02, 2015 9:42 am
Благодарил (а): 4 раза
Поблагодарили: 3 раза

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

Сообщение ololenok » Ср янв 03, 2018 10:14 am

Спустя пару месяцев использования 2й версии есть несколько заключений:
1) Кнопки работают без задержки, тут все норм
2) Если не перезагружать устройство, то через неделю аплинка время реакции на GET запросы составляет около 30 секунд, что наводит на мысли, что где-то копится мусор.
>> эту проблему еще не пробовали решать?
Ответить