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"
или