Для работы скетча послепропадания внешнего питания требуется Reset

salexval

✩✩✩✩✩✩✩
8 Авг 2022
3
0
Оформи код соответствующим тэгом
Всем доброго дня!
Может кто сталкивался с подобной проблемой? Собрал GSM-реле на Ардуино Nano и оно отказывается стабильно работать. Т.е. как только пропадает питание от внешнего БП 5В на вход Vin скетч не начинает опять выполняться и требуется нажатие кнопки сброса. После нажатия кнопки все нормально работает. Думал дело, как где-то обсуждалось, в кривом загрузчике, который якобы ждет данных. Снес вообще загрузчик программатором и залил скетч. Не помогло. Может кто из гуру подскажет в чем здесь прикол?

#include <SoftwareSerial.h>
SoftwareSerial SIM800(3, 2); // Выводы SIM800L Tx & Rx подключены к выводам Arduino 3 и 2
char incomingByte;
String inputString;
int relay_1 = D7; // Вывод управления реле 1
int relay_2 = D8; // Вывод управления реле 2
void setup()
{
pinMode(relay_1, OUTPUT); // Установим PIN как выход на реле 1
digitalWrite(relay_1, HIGH); // Устанавливаем высокий уровень
pinMode(relay_2, OUTPUT); // Установим PIN как выход на реле 2
digitalWrite(relay_2, HIGH); // Устанавливаем высокий уровень
pinMode(5, INPUT); // Установим PIN как вход срабатывания датчика уровня
Serial.begin(9600);
SIM800.begin(9600);
while(!SIM800.available()){ // Зацикливаем и ждем инициализацию SIM800L
SIM800.println("AT"); // Отправка команды AT
delay(1000); // Пауза
Serial.println("Connecting…"); // Печатаем текст
}
Serial.println("Connected!"); // Печатаем текст
SIM800.println("AT+CMGF=1"); // Отправка команды AT+CMGF=1
delay(1000); // Пауза
SIM800.println("AT+CNMI=1,2,0,0,0"); // Отправка команды AT+CNMI=1,2,0,0,0
delay(1000); // Пауза
SIM800.println("AT+CMGL=\"REC UNREAD\"");
}
void loop()
{

if(SIM800.available()){ // Проверяем, если есть доступные данные
delay(100); // Пауза
while(SIM800.available()){ // Проверяем, есть ли еще данные.
incomingByte = SIM800.read(); // Считываем байт и записываем в переменную incomingByte
inputString += incomingByte; // Записываем считанный байт в массив inputString
}
delay(10); // Пауза
Serial.println(inputString); // Отправка в "Мониторинг порта" считанные данные
inputString.toUpperCase(); // Меняем все буквы на заглавные
if (inputString.indexOf("ON_1") > -1){ // Проверяем полученные данные, если ON_1 включаем реле 1
digitalWrite(relay_1, LOW);
sms(String("Relay 1 - ON"), String("+7......"));} // Отправка SMS
if (inputString.indexOf("OFF_1") > -1){ // Проверяем полученные данные, если OFF_1 выключаем реле 1
digitalWrite(relay_1, HIGH);
sms(String("Relay 1 - OFF"), String("+7......"));}// Отправка SMS
if (inputString.indexOf("ON_2") > -1){ // Проверяем полученные данные, если ON_2 включаем реле 2
digitalWrite(relay_2, LOW);
sms(String("Relay 2 - ON"), String("+7......."));} // Отправка SMS
if (inputString.indexOf("OFF_2") > -1){ // Проверяем полученные данные, если OFF_2 выключаем реле 2
digitalWrite(relay_2, HIGH);
sms(String("Relay 2 - OFF"), String("+7........"));} // Отправка SMS
delay(1000);
if (inputString.indexOf("OK") == -1)
{ SIM800.println("AT+CMGDA=\"DEL ALL\"");
delay(1000);}
inputString = "";}
}
void sms(String text, String phone) // Процедура Отправка SMS
{
Serial.println("SMS send started");
SIM800.println("AT+CMGS=\"" + phone + "\"");
delay(500);
SIM800.print(text);
delay(500);
SIM800.print((char)26);
delay(500);
Serial.println("SMS send complete");
delay(2000);
}
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,267
1,303
Москва
При пропадании питания обесточиваются все модули, соотв. и GSM модуль тоже. А ресет перегружает только модуль ардуины, не трогая GSM.
Вполне вероятно, что GSM не стартует корректно, хотя конечно код "Зацикливаем и ждем инициализацию SIM800L " должен помочь как то. Но я бы просто для начала поставил паузу в 2-3 секунды в начале кода и посмотрел как будет работать при сбое.
Но хотите более определенных догадок - приводите схему подключения.
 

te238s

★★✩✩✩✩✩
14 Ноя 2021
374
98
У меня была подобная проблема. Только с модулем NRF24. Пробовал и паузы в начале делать,не помогло. Дело оказалось не в бобине. А в системе BOD микроконтроллера. Она была отключена,как я случайно заметил. Соответственно мк стартует криво по мере нарастания наппряжения питания где-то с 0.8-1 в. Поставил BOD 2.7в и проблема исчезла.
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,974
633
45
Вполне вероятно, что GSM не стартует корректно, хотя конечно код "Зацикливаем и ждем инициализацию SIM800L " должен помочь как то. Но я бы просто для начала поставил паузу в 2-3 секунды в начале кода и посмотрел как будет работать при сбое.
У GSM-модуля есть вход RESET, вот его бы при подаче питания дергать либо контроллером, либо RC-цепочкой.
А код ожидания инициализации модуля есть:
Код:
while(!SIM800.available()){ // Зацикливаем и ждем инициализацию SIM800L
 

salexval

✩✩✩✩✩✩✩
8 Авг 2022
3
0
Спасибо всем откликнувшимся!!
Проблема решилась установкой задержки вначале скетча.