При добавлении кода, ардуино уно висит в вечном старте
- Войдите на сайт для отправки комментариев
Ср, 23/09/2015 - 07:51
Есть ардуино уно.
Есть код, в нем реализовано много всего, в том числе http сервер, на который шлются http-get запросы и в зависимости от их содержимого выполняется задача.
Уперся в то, что если добавляю еще код программы, ардуино вываливается в вечный старт/рестарт, вместо приветственной строки "Start Arduino" в окно шлюза выдается бесконечное "StaStaStaSta..."
Размер скэтча 70% от максимального по данным программы.
В чем может быть дело? куда рыть? надо дальше увеличивать код программы.
Есть код...
В чем может быть дело? куда рыть?
у тебя код есть, а нам - предлагаешь в хрустальный шар зырить твой код?
Есть код...
В чем может быть дело? куда рыть?
у тебя код есть, а нам - предлагаешь в хрустальный шар зырить твой код?
Сомневаюсь что тут в коде проблема, но выложу раз нужен.
#include <avr/wdt.h> #include <livolo.h> #include <RCSwitch.h> #include <SPI.h> #include <Ethernet.h> #define SMTPServer "******************" //smtp сервер #define SMTPPort "2525" // smtp порт #define MailLogin "************" // логин для smtp #define MailLoginBase64 "***************************" //логин для smtp в Base64 #define MailPasswordBase64 "********************" // пароль для smtp в Base64 #define DHTTYPE DHT11 // DHT 11 #define DHTPIN 7 byte rcPin = 0; //выход на приемник = 2 byte txPin = 8; //выход на передатчик = 8 byte pcPin = 5; byte ip[] = { ********* }; // IP Address byte mac[] = { *********** }; // MAC Address byte gateway[] = { ************ }; //шлюз byte subnet[] = { 255, 255, 255, 0 }; //маска сети byte mydns[] = { ************* }; //DNS server //byte servermail[] = { *********** }; // smtp yandex Livolo livolo(txPin); // transmitter connected to pin #8 RCSwitch mySwitch = RCSwitch(); EthernetServer server(80); // Server Port 80 EthernetClient mail; //для почты клиент byte currentStatus=21; // статус на старте char* statusString[] = { "Switched Livolo #1", "Switched Livolo #2", "Switched Livolo #3", "Switched Livolo #4", "Switched Livolo #5", "Switched Livolo #5+", "Switched Livolo #5-", "Switched Livolo #R/1", "Switched Livolo #R/2", "Switched Livolo #R/3", "Switched Livolo #R/4", "Switched Livolo #R/5", "Switched Livolo #R/5+", "Switched Livolo #R/5-", "Switched Livolo all off", "RCSwitch 1 ON", "RCSwitch 1 OFF", "RCSwitch 2 ON", "RCSwitch 2 OFF", "RCSwitch 3 ON", "RCSwitch 3 OFF", "RCSwitch 4 ON", "RCSwitch 4 OFF", "RCSwitch all ON", "RCSwitch all OFF", "PC is ON", "case1", "OK", "System started", //28 "case2", //29 "1", //30 "0", //31 "Alarm is ON", //32 "Alarm is OFF"}; //34 byte alarm = false; void setup() { Ethernet.begin(mac, ip, mydns, gateway, subnet); server.begin(); Serial.begin(9600); Serial.print("Start! Server is at "); Serial.println(Ethernet.localIP()); mySwitch.enableTransmit(txPin); // Transmitter on pin 8 mySwitch.enableReceive(rcPin); // Receiver on inerrupt 0 => that is pin #2 pinMode(txPin, OUTPUT); // инициализация передатчика pinMode(pcPin, OUTPUT); // инициализация реле включения компьютера digitalWrite(pcPin, HIGH); wdt_enable(WDTO_8S); } void loop() { wdt_reset(); char* command = httpServer(); // запускаем вебсервер if (mySwitch.available()) { // проверяем датчики int value = mySwitch.getReceivedValue(); if (value != 0) { switch (mySwitch.getReceivedValue()) { case ***********: Serial.println("case1"); sendMail(26); break; case ***********: Serial.println("case2"); sendMail(29); break; } } mySwitch.resetAvailable(); } } void sendMail(byte statusStringN) { wdt_reset(); if(mail.connect(SMTPServer,2525)) { Serial.println(F("connected")); } else { Serial.println(F("connection failed")); return; } if(!eRcv()) return; Serial.println("_HELO 1.2.3.4"); mail.println("HELO 1.2.3.4"); // привет if(!eRcv()) return; Serial.println("_AUTH LOGIN"); mail.println("AUTH LOGIN"); // старт авторизации if(!eRcv()) return; mail.println(MailLoginBase64); // логин if(!eRcv()) return; mail.println(MailPasswordBase64); // пароль if(!eRcv()) return; mail.println("MAIL FROM:*********************"); // адрес отправителя (Arduino) if(!eRcv()) return; mail.println("RCPT TO:************************"); // адрес получателя if(!eRcv()) return; mail.println("DATA"); // if(!eRcv()) return; mail.println("Subject"); // тема письма mail.println("TO***********************"); // получатель в поле To письма mail.println("FROM:**********************"); // получатель в поле To письма mail.println(); mail.println(statusString[statusStringN]); // тело письма mail.println("."); // end email if(!eRcv()) return; mail.println("QUIT"); // terminate connection if(!eRcv()) return; mail.println(); mail.stop(); wdt_reset(); } byte eRcv() { byte respCode; byte thisByte; int loopCount = 0; while(!mail.available()) { delay(1); loopCount++; // if nothing received for 10 seconds, timeout if(loopCount > 10000) { mail.stop(); Serial.println(F("\r\nTimeout")); return 0; } } respCode = mail.peek(); while(mail.available()) { thisByte = mail.read(); Serial.write(thisByte); } if(respCode >= '4') { efail(); return 0; } return 1; } void efail() { byte thisByte = 0; int loopCount = 0; mail.println(F("QUIT")); while(!mail.available()) { delay(1); loopCount++; // if nothing received for 10 seconds, timeout if(loopCount > 10000) { mail.stop(); Serial.println(F("\r\nTimeout")); return; } } while(mail.available()) { thisByte = mail.read(); Serial.write(thisByte); } mail.stop(); Serial.println(F("disconnected")); } char* httpServer() { EthernetClient client = server.available(); if (client) { char sReturnCommand[15]; int nCommandPos=-1; sReturnCommand[0] = '\0'; while (client.connected()) { if (client.available()) { char c = client.read(); Serial.print (c); if ((c == ']')||(c == '\n') || (c == ' ' && nCommandPos>-1)) { sReturnCommand[nCommandPos] = '\0'; if (strcmp(sReturnCommand, "\0") == 0) { httpResponseHome(client); } else { processCommand(sReturnCommand); httpResponseRedirect(client); } break; } if (nCommandPos>-1) { sReturnCommand[nCommandPos++] = c; } if (c == '?' && nCommandPos == -1) { nCommandPos = 0; } } } delay(10); client.stop(); httpResponseHome(client); return sReturnCommand; } return '\0'; } void httpResponseHome(EthernetClient c) { c.println("HTTP/1.1 200 OK"); c.println("Content-Type: text/html"); c.println(); c.println("<html>"); c.println("<body>"); c.print(statusString[currentStatus]); // подтверждение команды на веб-страничке c.print("</body>"); c.println("</html>"); } /** * HTTP Redirect to homepage */ void httpResponseRedirect(EthernetClient c) { c.println("HTTP/1.1 301 Found"); c.println("Location: /"); c.println(); } void processCommand(char* command) { Serial.print("Start, command: "); Serial.println(command); if (strcmp(command, "liv1") == 0) { livolo.sendButton(1540, 0); currentStatus=0; } else if (strcmp(command, "liv2") == 0) { livolo.sendButton(1540, 96); currentStatus=1; } else if (strcmp(command, "liv3") == 0) { livolo.sendButton(1540, 120); currentStatus=2; } else if (strcmp(command, "liv4") == 0) { livolo.sendButton(1540, 24); currentStatus=3; } else if (strcmp(command, "liv5") == 0) { livolo.sendButton(1540, 108); currentStatus=4; } else if (strcmp(command, "liv5+") == 0) { livolo.sendButton(1540, 92); currentStatus=5; } else if (strcmp(command, "liv5-") == 0) { livolo.sendButton(1540, 116); currentStatus=6; } if (strcmp(command, "livR1") == 0) { livolo.sendButton(1540, 80); currentStatus=7; } else if (strcmp(command, "livR2") == 0) { livolo.sendButton(1540, 48); currentStatus=8; } else if (strcmp(command, "livR3") == 0) { livolo.sendButton(1540, 12); currentStatus=9; } else if (strcmp(command, "livR4") == 0) { livolo.sendButton(1540, 40); currentStatus=10; } else if (strcmp(command, "livR5") == 0) { livolo.sendButton(1540, 72); currentStatus=11; } else if (strcmp(command, "livR5+") == 0) { livolo.sendButton(1540, 126); currentStatus=12; } else if (strcmp(command, "livR5-") == 0) { livolo.sendButton(1540, 36); currentStatus=13; } else if (strcmp(command, "livoff") == 0) { livolo.sendButton(1540, 106); currentStatus=14; } //RCSwitcher 1 else if (strcmp(command, "rcs1on") == 0) { mySwitch.send(14724751, 24); currentStatus=15; } else if (strcmp(command, "rcs1off") == 0) { mySwitch.send(14724750, 24); currentStatus=16; } //PC on/off else if (strcmp(command, "pc") == 0) { digitalWrite(pcPin, LOW); delay(2000); digitalWrite(pcPin, HIGH); currentStatus=25; } else if (strcmp(command, "alarmstatus") == 0) { if (alarm == true) currentStatus=30; else currentStatus=31; } else if (strcmp(command, "alarmswitch") == 0) { if (alarm == true) { alarm = false; currentStatus=33; } else { alarm = true; currentStatus=32; } } }Сомневаюсь что тут в коде проблема, но выложу раз нужен.
а, в чём?
Сомневаюсь что тут в коде проблема, но выложу раз нужен.
а, в чём?
Для того тему и создал, что бы люди подсказали в чем могут быть ограничения. Сейчас в коде есть условие для RCSwitcher1, точно такие же были для 2,3,4. С ними ничего не работает, удалил и все работает, но мне нужны эти условия.
Может быть это другое Sta?
А если собаку на цепь посадить? Чисто размышления.
А если собаку на цепь посадить? Чисто размышления.
Попробовал, не помогло. Чуть изменил строку.
Исправил текст в строке
Serial.print("Start! Server is at "); что бы ясно было что именно она повторяется, да, она.Отключил собаку, дописал функцию внизу, которую даже не хапускал и уже попал в вечный ребут StaStaStaSta...оперативка скорее всего закончилась, было похожее с графическим диплеем. такие кракозябры вылезали. сменил камень и сразу все четко стало
оперативка скорее всего закончилась, было похожее с графическим диплеем. такие кракозябры вылезали. сменил камень и сразу все четко стало
пробовал на двух разных uno
пробовал на двух разных uno
На двух разных uno один и тот же камень...
)))
пробовал на двух разных uno
На двух разных uno один и тот же камень...
теперь для тех кто не понимает можно, что такое камень? думал это процессор и все такое..
У одинаковых процессоров, одинаковый объем оперативки, мысль улавливаете?))))
У одинаковых процессоров, одинаковый объем оперативки, мысль улавливаете?))))
Теперь да, спасибо)
Все ливолы и рссвичи Оперативу и отъедают. Попробуте ливолу ( рссвич) и ее номер сшивать из одной ливолы ( рссвича) и разных номеров, сэкономите.
А вообще для работы с вэб серверами на плате w5100 интегрирована микро SD , для хранения всех текстов , хтмээлей и скриптов на ней. Реализовано и разжевано тут
Все ливолы и рссвичи Оперативу и отъедают. Попробуте ливолу ( рссвич) и ее номер сшивать из одной ливолы ( рссвича) и разных номеров, сэкономите.
Тоже на них подумал, уже ковыряюсь, думаю и много ненужного мне удалю там.
А вообще для работы с вэб серверами на плате w5100 интегрирована микро SD , для хранения всех текстов , хтмээлей и скриптов на ней. Реализовано и разжевано тут
Я использую только http-get запросы для работы с Android'ом, потому большего для веба не надо, но вот для логов использовать карточку планировал.
Подумываю заказать Mega 2560, т.к. планов по коду еще много было (
Я пробовал проминьку и Enc , отказался в пользу меги и 5100.
Тоже для многоканального логгера/ дистанционного управленца.
Прототип: http://77.37.208.83:8088
Несмотря на большую оперативу, использую конструкцию client.print(F()); для размещения в память программ / флеш.
Больше строк для бога строк!
Они небось всю память съедают.
> Sketch uses 17,874 bytes (55%) of program storage space. Maximum is 32,256 bytes.
> Global variables use 1,694 bytes (82%) of dynamic memory, leaving 354 bytes for local variables. Maximum is 2,048 bytes.
> Low memory available, stability problems may occur.
Ну так и есть
C разбегу
> Sketch uses 17,894 bytes (55%) of program storage space. Maximum is 32,256 bytes.
> Global variables use 1,347 bytes (65%) of dynamic memory, leaving 701 bytes for local variables. Maximum is 2,048 bytes.
А зачем вы записываете в переменную value принятые значения, а в switch эту переменную не используете?
int value = mySwitch.getReceivedValue(); if (value != 0) { switch (mySwitch.getReceivedValue())А зачем вы записываете в переменную value принятые значения, а в switch эту переменную не используете?
int value = mySwitch.getReceivedValue(); if (value != 0) { switch (mySwitch.getReceivedValue())Да я уже понял что много вот таких вот недостатков в коде( Лепил из нескольких примеров, первый опыт. Сейчас буду внимательнее к загрузке памяти относиться. Несколько функций уже полностью переписал.