Arduino постоянно перезапускает скетч
- Войдите на сайт для отправки комментариев
Втр, 09/07/2019 - 16:55
Вот полный скетч
#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 ....тело функции}), но суть в том что Ардуино полностью перезапускает скетч. Как исправить эту ситуацию, чтобы скетч не перезапускался?
В строках №№ 102 и 107 запрашивается память и ... нигде и никогда не осовобождается. На сколько, по Вашему, хватит памяти у Ардуины при таких запроса? На два прохода loop? На три? Судя по Вашему описанию - и на два уже не хватает. А дальше ... непредсказуемое поведение, которое Вы и наблюдаете.
------------
Можно уточнить, что правильно?
"angelina_sotnikova"
или