Оформи код соответствующим тэгом
Всем доброго дня!
Может кто сталкивался с подобной проблемой? Собрал 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);
}
Может кто сталкивался с подобной проблемой? Собрал 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);
}