Arduino зависает, как преобразовать строку Arduino в тип строки C?

это мой первый пост, я не эксперт, но мне удалось построить Arduino Mega с ESP8266, чтобы поливать мои растения в палатке, к сожалению, он зависает/падает случайным образом, и мне все время приходится сбросить его вручную. Я прочитал, что это потому, что я использую строку, и я должен использовать строковый тип C.

Не могли бы вы помочь мне найти способ прекратить сброс вручную все время? Спасибо!

Вот код:

#include <DHT.h>
#include <DS3231.h>
#define DHTPIN 51 // раньше было 53
#define DHTTYPE DHT11
#include <ESP8266_Lib.h>
#define EspSerial Serial1    

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

const int AirValue = 820;   // 778
const int WaterValue = 437;  //
int soilmoisturepercentA0=0;
int soilmoisturepercentA1=0;
int soilmoisturepercentA2=0;
int soilmoisturepercentA3=0;

String agAdi = "XXXXXX";                  
String agSifresi = "XXXXX";           
String ip = "184.106.153.149";                                
float sicaklik, nem;

int led = 38;
int UV_Light = 27;
int Tent_Humid = 29;
int Heater = 26;
//int Free_IN3 = 28;
const int button1 = 53;
int buttonState1 = 0;

DHT dht = DHT(DHTPIN, DHTTYPE);
DS3231  rtc(SDA, SCL);
Time t; // Main time to display

//Schedule R2 UV_Light
const int OnHour_R2 = 6;
const int OnMin_R2 = 00; 
const int OffHour_R2 = 1;
const int OffMin_R2 = 00;

int IN1 = 22;
int IN2 = 23;
int IN3 = 24;
int IN4 = 25;

int Pin1 = A0;
int Pin2 = A1;
int Pin3 = A2;
int Pin4 = A3;

float value1 = 0;
float value2 = 0;
float value3 = 0;
float value4 = 0;

void setup() {
  Serial.begin(9600);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
  
  pinMode(Pin1, INPUT);
  pinMode(Pin2, INPUT);
  pinMode(Pin3, INPUT);
  pinMode(Pin4, INPUT);
  
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, HIGH);
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, HIGH);
  
  pinMode(led, OUTPUT);
  pinMode(UV_Light, OUTPUT);
  pinMode(Tent_Humid, OUTPUT);
  pinMode(Heater, OUTPUT);
  pinMode(button1, INPUT_PULLUP);

  digitalWrite(UV_Light, HIGH);
  digitalWrite(Tent_Humid, HIGH);
  digitalWrite(Heater, HIGH);
  
  dht.begin();
  rtc.begin();
  
  delay(500);

  Serial.println("Started");
  EspSerial.begin(9600);                                          // Мы начинаем последовательную связь с ESP8266.
  EspSerial.println("AT");                                         // Мы выполняем управление модулем с помощью команды AT.
  Serial.println("AT  sent ");
  while(!EspSerial.find("OK")){                                     // Ждем, пока модуль будет готов.
    EspSerial.println("AT");
    Serial.println("ESP8266 Not Found.");
  }
  Serial.println("OK Command Received");
  EspSerial.println("AT+CWMODE=1");                                 // устанавливаем модуль ESP8266 в качестве клиента.
  while(!EspSerial.find("OK")){                                     // ждем, пока настройка будет завершена.
    EspSerial.println("AT+CWMODE=1");
    Serial.println("Setting is ....");
  }
  Serial.println("Set as client");
  Serial.println("Connecting to the Network ...");
  EspSerial.println("AT+CWJAP=\""+agAdi+"\",\""+agSifresi+"\"");    // подключаемся к нашей сети.
  while(!EspSerial.find("OK"));                                     // Ждем, пока он подключится к сети.
  Serial.println("CONNECTED to the Network ");
  delay(500);
//OLED
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // инициализировать с помощью I2C addr 0x3D (для 128x64)
  display.display(); // show splashscreen
  delay(500);
  display.clearDisplay();   // очищает экран и буфер
  
}
void loop() {

//  DHT11.read(dht11Pin);
  dht.read(DHTPIN);
  sicaklik = (float)dht.readTemperature();
  nem = (float)dht.readHumidity();
//  value1 = analogRead(Pin1);
  soilmoisturepercentA0 = map(value1, AirValue, WaterValue, 0, 100);
  soilmoisturepercentA1 = map(value2, AirValue, WaterValue, 0, 100);
  soilmoisturepercentA2 = map(value3, AirValue, WaterValue, 0, 100);
  soilmoisturepercentA3 = map(value4, AirValue, WaterValue, 0, 100);
  String veri = "GET https://api.thingspeak.com/update?api_key=123456";   // Команда Thingspeak. Мы пишем наш собственный ключ api в ключевой части.                                   
  veri += "&field1=";
  veri += String(sicaklik);// Температурную переменную мы отправим
  veri += "&field2=";
  veri += String(nem);// Переменную влажности мы отправим
  veri += "&field3=";
  veri += String(soilmoisturepercentA0);// Soil A0
  veri += "&field4=";
  veri += String(soilmoisturepercentA1);// Soil A1
  veri += "&field5=";
  veri += String(soilmoisturepercentA2);// Soil A2
  veri += "&field6=";
  veri += String(soilmoisturepercentA3);// Soil A3
  veri += "\r\n\r\n"; 
  EspSerial.print("AT+CIPSEND=");                                   // указываем длину данных, которые будем отправлять в ESP.
  EspSerial.println(veri.length()+3);
//  delay(500);

  if(EspSerial.find(">")){                                          // Команды в нем выполняются, когда ESP8266 готов..
    EspSerial.print(veri);                                          // отправляем данные.
    Serial.println(veri);
    Serial.println("Data sent.");
    delay(500);
  }
  Serial.println("Connection Closed.");
  EspSerial.println("AT+CIPCLOSE");                                // закрываем соединение
  delay(500); 
        
  Serial. print('\n');
  Serial.print("MOISTURE LEVEL A0:");
  value1 = analogRead(Pin1);
  Serial.println(value1);
  Serial.println(soilmoisturepercentA0);
    if(value1>750)
  //if(soilmoisturepercentA0>35)
  
  {
      digitalWrite(IN1, LOW);
  }
  else
  {
    digitalWrite(IN1, HIGH);
    }
    
  Serial.print("MOISTURE LEVEL A1:");
  value2 = analogRead(Pin2);
  Serial.println(value2);
  Serial.println(soilmoisturepercentA1);
  if(value2>750)
 //  if(soilmoisturepercentA1>35)
  {
      digitalWrite(IN2, LOW);
  }
  else
  {
    digitalWrite(IN2, HIGH);
    }

  Serial.print("MOISTURE LEVEL A2:");
  value3 = analogRead(Pin3);
  Serial.println(value3);
  Serial.println(soilmoisturepercentA2);
  if(value3>750)
  //  if(soilmoisturepercentA2>35)
  {
      digitalWrite(IN3, LOW);
  }
  else
  {
    digitalWrite(IN3, HIGH);
    }

  Serial.print("MOISTURE LEVEL A3:");
  value4 = analogRead(Pin4);
  Serial.println(value4);
  Serial.println(soilmoisturepercentA3);
  if(value4>750)
   // if(soilmoisturepercentA3>35)
  {
      digitalWrite(IN4, LOW);
  }
  else
  {
    digitalWrite(IN4, HIGH);
    }
    Serial.println();
  delay(500);

{
    t = rtc.getTime();
  Serial.print(t.hour);
  Serial.print(" hour(s), ");
  Serial.print(t.min);
  Serial.print(" minute(s)");
  Serial.println(" ");
  delay (500);

  digitalWrite(led, HIGH);   // включите светодиод (HIGH - уровень напряжения)
  delay(500);               // подождать полсекунды
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(500); 
  }
    // Relay UV_Light
  if (t.hour == OnHour_R2 && t.min == OnMin_R2) {
    digitalWrite(UV_Light, LOW);
  }
  else if (t.hour == OffHour_R2 && t.min == OffMin_R2) {
    digitalWrite(UV_Light, HIGH);
  }
   buttonState1 = digitalRead(button1);
   if (buttonState1 == LOW) {                      
    digitalWrite(UV_Light, LOW);
    delay (100);                                 
  }
  // Read the Humidity in %:
  float h = dht.readHumidity();
  // Read the Temperature as Celsius:
  float t = dht.readTemperature();
  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
   // Display Humidizador
if (h <40)
  {
  digitalWrite(Tent_Humid, LOW);
  Serial.print("Humid ON");
  Serial. print('\n');
  } else{
    digitalWrite(Tent_Humid, HIGH);
    
    Serial.print("Humid OFF");
    Serial. print('\n');
}

// Display Heater
if (t <18)
  {
  digitalWrite(Heater, LOW);
  Serial.print("Heater ON");
  Serial. print('\n');
  } else{
    digitalWrite(Heater, HIGH);
    
    Serial.print("Heater OFF");
    Serial. print('\n');
}
    delay (100);
    float hic = dht.computeHeatIndex(t, h, false);
  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print(" % ");
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.print(" \xC2\xB0");
  Serial.print("C ");
//  Serial.print("Heat index: ");

   EspSerial.println("AT+CIPSTART=\"TCP\",\""+ip+"\",80");           // We connect to Thingspeak.
  if(EspSerial.find("Error")){                                      // We check the connection error.
    Serial.println("AT+CIPSTART Error");
  }
  
// OLED 
{
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);

  // Check if any reads failed.
  if (isnan(h) || isnan(t) || isnan(f)) {
    delay(500);
  } else{
    // routine for converting temp/hum floats to char arrays
    char temp_buff[5]; char hum_buff[5];
    char temp_disp_buff[11] = "Tmp:";
    char hum_disp_buff[11] = "Hum:";
    
    // appending temp/hum to buffers
    dtostrf(t,2,1,temp_buff);
    strcat(temp_disp_buff,temp_buff);
    dtostrf(h,2,1,hum_buff);
    strcat(hum_disp_buff,hum_buff);
    
    // routine for displaying text for temp/hum readout
    display.clearDisplay();
    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.setCursor(0,0);
    display.println(temp_disp_buff);
    display.println(hum_disp_buff);
    display.display();
    delay(500);
{
   digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(500);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(500);
  
  }
  }
}
}

, 👍1

Обсуждение

Что значит "постоянно вылетает"? Через несколько секунд, несколько минут или несколько часов? Приведенный выше код должен работать на Arduino Mega или ESP8266?, @PMF

Иногда через 8 часов, иногда через 2 часа, частота никогда не бывает одинаковой, я использую Arduino Mega 2560 с модулем Wi-Fi ESP8266., @Joaquin Gonzalez

почему бы вам не воспользоваться надлежащей библиотекой Wi-Fi ?, @Juraj

Я пытался использовать ESP8266WiFi.h, но не работал с Arduino Mega, @Joaquin Gonzalez

Независимо от того, каков фактический ответ, вы можете рассмотреть возможность использования сторожевого таймера., @timemage

есть WiFiEsp или my WiFiEspAT для более новой версии прошивки AT, @Juraj

здесь Мадженко пишет о строках C во второй части: https://majenko.co.uk/blog/evils-arduino-strings, @Juraj