Arduino постоянно перезапускает скетч

angelina_sotnikova
Offline
Зарегистрирован: 27.06.2019

Вот полный скетч

#include <GPRS_Shield_Arduino.h>
#include <SPI.h>
#include <SoftwareSerial.h>

#include "DHT.h" //Подключаем библиотеку.

#define DHTPIN 3 // (Вывод к которому подключен датчик, в данном случае  пин D4)

#define DHTTYPE DHT21 // DHT 21 (AM2301) //Здесь выбираем какой у нас датчик.

DHT dht(DHTPIN, DHTTYPE);

SoftwareSerial mySerial(7,8);
GPRS gprs(mySerial);
boolean debugging = true;
String val ="";
int ch = 0;
char* httppara = "AT+HTTPPARA=\"URL\",\""; 
char* defaultServer = "******";
char* path = "/index.php";
char* quesTemp = "?temperature=";
char* endHttppara = "\"";


 
 
void setup()
{
  
  Serial.begin(9600);
  Serial.println("Initialization...");
  mySerial.begin(9600);
  dht.begin();
  while(!gprs.init()){
    delay(1000);
    Serial.print("GPRS Init error\r\n");
  }
  Serial.println("GPRS init success");
  mySerial.println("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\""); 
  delay(500);
  Serial.println(ReadGSM());
  delay(500);
  mySerial.println("AT+SAPBR=3,1,\"APN\",\"internet\""); 
  delay(500);
  Serial.println(ReadGSM());
  delay(500);
  mySerial.println("AT+SAPBR=3,1,\"USER\",\"gdata\""); 
  delay(500);
  Serial.println(ReadGSM());
  delay(500);
  mySerial.println("AT+SAPBR=3,1,\"PWD\",\"gdata\"");
  delay(500);
  Serial.println(ReadGSM());
  delay(500);
  mySerial.println("AT+SAPBR=1,1");
  delay(500);
  Serial.println(ReadGSM());
  delay(500);
  mySerial.println("AT+SAPBR=1,1"); 
  delay(500);
  Serial.println(ReadGSM());
  delay(500);
  mySerial.println("AT+SAPBR=2,1");
  delay(500);
  Serial.println(ReadGSM());
  delay(500);
   mySerial.println("AT+SAPBR=2,1");
  delay(500);
  Serial.println(ReadGSM());
  delay(500);
  
      delay(500);
      mySerial.println("AT+CIPSTATUS");
      delay(500);
      mySerial.println(ReadGSM());
      delay(500);

  mySerial.println("AT+HTTPINIT");
  delay(500);
  Serial.println(ReadGSM());
  delay(500);
  mySerial.println("AT+HTTPINIT");
  delay(500);
  Serial.println(ReadGSM());
  delay(500);
  mySerial.println("HTTPPARA=\"CID\",1");
  delay(500);
  Serial.println(ReadGSM());
  delay(500);
  
  
}
 
void loop()
{
 
  delay(2000);
  float t = dht.readTemperature(); 
  if(isnan(t)){
    Serial.println("Failed to read from DHT sensor!");
  }
  char* contain= new char[500];
  strcat(contain,httppara);
  strcat(contain,defaultServer);
  strcat(contain,path);
  strcat(contain,quesTemp);
  char* temperature = new char[10];
  dtostrf(t, 3, 2, temperature);
  strcat(contain,temperature);
  strcat(contain, endHttppara);
  Serial.println(temperature);
  Serial.println(t);
  mySerial.println(contain);
  Serial.println("send");
  mySerial.println("AT+HTTPACTION=0");
  delay(500);
  Serial.println(ReadGSM());
  delay(500);
  mySerial.println("AT+HTTPACTION=0");
  delay(500);
  Serial.println(ReadGSM());
  delay(500);
  mySerial.println("AT+HTTPREAD");
  delay(500);
  Serial.println(ReadGSM());
  delay(500);
  mySerial.println("AT+HTTPREAD");
  delay(500);
  Serial.println(ReadGSM());
  delay(500);
  mySerial.println("AT+HTTPREAD");
  delay(500);
  Serial.println(ReadGSM());
  delay(500);
  
  //chekInputOutput();
  
}

String ReadGSM() {  //функция чтения данных от GSM модуля
  int c;
  String v;
  while (mySerial.available()) {  //сохраняем входную строку в переменную v
    c = mySerial.read();
    v += char(c);
  }
  return v;
}
void chekInputOutput(){
    if (mySerial.available()) {  //если GSM модуль что-то послал нам, то
      while (mySerial.available()) {  //сохраняем входную строку в переменную val
        ch = mySerial.read();
        val += char(ch);
        delay(10);
      }
      Serial.println(val);
      val = "";
  }
  if (Serial.available()) {  //если в мониторе порта ввели что-то
      while (Serial.available()) {  //сохраняем строку в переменную val
        ch = Serial.read();
        val += char(ch);
        delay(10);
      }
      mySerial.println(val);
      val="";
  }
}

Ардуино нормально исполняет функцию setup(), затем корректно 1 раз выполняет ф-цию loop(), на 2 разе ломается вывод и скетч начинается с самого начала.

Я проверял функцию loop на наличие вызова setup(), пытался какие то костыли писать, чтобы функция setup() выполнялась 1 раз ( т.е. в начале функции писал что то вроде if(chek){chek=false ....тело функции}), но суть в том что Ардуино полностью перезапускает скетч. Как исправить эту ситуацию, чтобы скетч не перезапускался?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

В строках №№ 102 и 107 запрашивается память и ... нигде и никогда не осовобождается. На сколько, по Вашему, хватит памяти у Ардуины при таких запроса? На два прохода loop? На три? Судя по Вашему описанию - и на два уже не хватает. А дальше ... непредсказуемое поведение, которое Вы и наблюдаете.

------------

Можно уточнить, что правильно?

"angelina_sotnikova"

или

angelina_sotnikova пишет:
Я проверял