При добавлении кода, ардуино уно висит в вечном старте

mrLu
Offline
Зарегистрирован: 06.10.2014

Есть ардуино уно.

Есть код, в нем реализовано много всего, в том числе http сервер, на который шлются http-get запросы и в зависимости от их содержимого выполняется задача.

Уперся в то, что если добавляю еще код программы, ардуино вываливается в вечный старт/рестарт, вместо приветственной строки "Start Arduino" в окно шлюза выдается бесконечное "StaStaStaSta..."

Размер скэтча 70% от максимального по данным программы.

В чем может быть дело? куда рыть? надо дальше увеличивать код программы.

Клапауций 001
Offline
Зарегистрирован: 05.09.2015

mrLu пишет:

Есть код...

В чем может быть дело? куда рыть?

 у тебя код есть, а нам - предлагаешь в хрустальный шар зырить твой код?

mrLu
Offline
Зарегистрирован: 06.10.2014

Клапауций 001 пишет:

mrLu пишет:

Есть код...

В чем может быть дело? куда рыть?

 у тебя код есть, а нам - предлагаешь в хрустальный шар зырить твой код?

 

Сомневаюсь что тут в коде проблема, но выложу раз нужен.

 

#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;
    }
  }
} 

 

Клапауций 001
Offline
Зарегистрирован: 05.09.2015

mrLu пишет:

Сомневаюсь что тут в коде проблема, но выложу раз нужен.

а, в чём?

mrLu
Offline
Зарегистрирован: 06.10.2014

Клапауций 001 пишет:

mrLu пишет:

Сомневаюсь что тут в коде проблема, но выложу раз нужен.

а, в чём?

Для того тему и создал, что бы люди подсказали в чем могут быть ограничения. Сейчас в коде есть условие для RCSwitcher1, точно такие же были для 2,3,4. С ними ничего не работает, удалил и все работает, но мне нужны эти условия.

GraninDm
Offline
Зарегистрирован: 01.08.2013

Может быть это другое Sta?

  Serial.print("Start, command: ");
 
И скорость на порту другая
bwn
Offline
Зарегистрирован: 25.08.2014

А если собаку на цепь посадить? Чисто размышления.

mrLu
Offline
Зарегистрирован: 06.10.2014

bwn пишет:

А если собаку на цепь посадить? Чисто размышления.

Попробовал, не помогло. Чуть изменил строку.

Исправил текст в строке Serial.print("Start! Server is at "); что бы ясно было что именно она повторяется, да, она.

Отключил собаку, дописал функцию внизу, которую даже не хапускал и уже попал в вечный ребут StaStaStaSta...

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

оперативка скорее всего закончилась, было похожее с графическим диплеем. такие кракозябры вылезали. сменил камень и сразу все четко стало

mrLu
Offline
Зарегистрирован: 06.10.2014

jeka_tm пишет:

оперативка скорее всего закончилась, было похожее с графическим диплеем. такие кракозябры вылезали. сменил камень и сразу все четко стало

пробовал на двух разных uno

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

mrLu пишет:

пробовал на двух разных uno

На двух разных uno один и тот же камень...

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

)))

mrLu
Offline
Зарегистрирован: 06.10.2014

Jeka_M пишет:

mrLu пишет:

пробовал на двух разных uno

На двух разных uno один и тот же камень...

теперь для тех кто не понимает можно, что такое камень? думал это процессор и все такое..

bwn
Offline
Зарегистрирован: 25.08.2014

У одинаковых процессоров, одинаковый объем оперативки, мысль улавливаете?))))

mrLu
Offline
Зарегистрирован: 06.10.2014

bwn пишет:

У одинаковых процессоров, одинаковый объем оперативки, мысль улавливаете?))))

Теперь да, спасибо)

inspiritus
Offline
Зарегистрирован: 17.12.2012

Все ливолы и рссвичи Оперативу и отъедают. Попробуте ливолу ( рссвич)  и ее номер сшивать из одной ливолы ( рссвича) и разных номеров, сэкономите.

А вообще для работы с вэб серверами на плате w5100 интегрирована микро SD , для хранения всех текстов , хтмээлей и скриптов  на ней. Реализовано и разжевано тут

 

mrLu
Offline
Зарегистрирован: 06.10.2014

inspiritus пишет:

Все ливолы и рссвичи Оперативу и отъедают. Попробуте ливолу ( рссвич)  и ее номер сшивать из одной ливолы ( рссвича) и разных номеров, сэкономите.

Тоже на них подумал, уже ковыряюсь, думаю и много ненужного мне удалю там.

inspiritus пишет:

А вообще для работы с вэб серверами на плате w5100 интегрирована микро SD , для хранения всех текстов , хтмээлей и скриптов  на ней. Реализовано и разжевано тут

Я использую только http-get запросы для работы с Android'ом, потому большего для веба не надо, но вот для логов использовать карточку планировал.

Подумываю заказать Mega 2560, т.к. планов по коду еще много было (

inspiritus
Offline
Зарегистрирован: 17.12.2012

Я пробовал проминьку и Enc , отказался в пользу меги и 5100. 

Тоже для многоканального логгера/ дистанционного управленца.

Прототип:   http://77.37.208.83:8088

Несмотря на большую оперативу, использую конструкцию client.print(F()); для размещения в память программ / флеш.

Radjah
Offline
Зарегистрирован: 06.08.2014

Больше строк для бога строк!

Они небось всю память съедают.

> 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.
 

RAZRus
Offline
Зарегистрирован: 16.06.2014

А зачем вы записываете в переменную value принятые значения, а в switch эту переменную не используете?
 

int value = mySwitch.getReceivedValue();
    if (value != 0)
    {
      switch (mySwitch.getReceivedValue())

 

mrLu
Offline
Зарегистрирован: 06.10.2014

RAZRus пишет:

А зачем вы записываете в переменную value принятые значения, а в switch эту переменную не используете?
 

int value = mySwitch.getReceivedValue();
    if (value != 0)
    {
      switch (mySwitch.getReceivedValue())

 

 

Да я уже понял что много вот таких вот недостатков в коде( Лепил из нескольких примеров, первый опыт. Сейчас буду внимательнее к загрузке памяти относиться. Несколько функций уже полностью переписал.