Страница 35 из 53

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

Добавлено: Вт дек 26, 2017 8:37 pm
karsotrade
Отлично всё скомпелировалось и загрузилось, но датчик не работает (не отправляет данные в МЖД), а управление есть.

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

Добавлено: Вт дек 26, 2017 9:06 pm
olehs
Я еще раз поправил код: избавился от еще одного delay и добавил получение адреса МЖД из MegaLight.

А вы уверены, что у вас в МЖД есть объект DHTsensor1, а у него есть методы temp1 и hum1, принимающие параметр t ?

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

Добавлено: Вт дек 26, 2017 9:10 pm
karsotrade
Ещё раз проверил отдельно скетч DHT, работает нормально, данные в МЖД передаёт, а с ML не хочет.

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

Добавлено: Вт дек 26, 2017 9:15 pm
karsotrade
Ещё раз залил - не работает датчик. Может какая то фишка с задержкой? Задержка нужна для считывания данных с DHT22 (2000мс).

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

Добавлено: Вт дек 26, 2017 9:21 pm
karsotrade
Нашёл ещё, что потерялось dht1. begin(); Вставил в void setup() но всё равно не заработало.

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

Добавлено: Вт дек 26, 2017 10:11 pm
karsotrade
Набросал сейчас вкладку setup как было вчера при эксперименте:
SPOILERSPOILER_SHOW
#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); то начинает работать управление, а датчик не работает.

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

Добавлено: Ср дек 27, 2017 9:30 pm
karsotrade
Всю голову сломал ...не могу датчик запустить. Походу цикл void DHTloop() не работает.

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

Добавлено: Ср дек 27, 2017 9:51 pm
olehs
Добавьте в него вывод чего-то в Serial, чтобы знать наверняка

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

Добавлено: Ср дек 27, 2017 10:45 pm
karsotrade
olehs писал(а):Добавьте в него вывод чего-то в Serial, чтобы знать наверняка
В serial тишина, только команды управления, что вставляю в цикл void DHTloop() не выводится.

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

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