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);
}
}
}
}
0
Смотрите также:
- Как разделить входящую строку?
- Как использовать SPI на Arduino?
- Как сбросить или отформатировать Arduino?
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Arduino Due vs Mega 2560
- Как получить уникальный идентификатор для всех плат Arduino?
- Почему я получаю avrdude: stk500v2_ReceiveMessage(): timeout error when uploading to Arduino Mega?
- Тайм-аут связи Arduino Mega с ошибкой программатора
Что значит "постоянно вылетает"? Через несколько секунд, несколько минут или несколько часов? Приведенный выше код должен работать на 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