Скетч отказывается работать, если при запуске на нажать кнопку ресет.

SkyLord
Offline
Зарегистрирован: 22.07.2019

Добрый день.

Оборудование.

 - Ардуино УНО (с Али)

 - Модуль SIM800L V2 (в обвязке, с питанием проблем нет)

 - Четырех-канальное реле.

Спаяно по схеме:

 

Сразу признаюсь составил скетч из нескольких разных, а не писал его сам. Потому как по запросу "SIM800L управление реле" выдает много схожих мануалов, но с не работающими скетчем. Пришлось собирать по щепотке с разных источников.

А всего то лишь требуется при помощи смс включать или выключать 4 канальное реле.  Скетч работает только, если подать на него питание и один раз нажать кнопку ресет на ардуино. Как от этого избавится? Оборудование установлено удаленно и при разрыве питания, скетч перестанет исполняться без моего вмешательства.

/*
 * Скетч для управления четырехканальным реле с помощью Ардуино
 * 
 */

#include <SoftwareSerial.h>
SoftwareSerial SIM800(8, 7);        // Определяем пин 8 - RX Arduino (TX SIM800L), 7 пин - TX Arduino (RX SIM800L)
char incomingByte;
String inputString;
#define RELAY1 14                  // Определяем пин A0, используемый для подключения реле 1
#define RELAY2 15                  // Определяем пин A1, используемый для подключения реле 2
#define RELAY3 16                  // Определяем пин A2, используемый для подключения реле 3
#define RELAY4 17                  // Определяем пин A3, используемый для подключения реле 4

void setup()
{
  Serial.begin(9600);               // Скорость обмена данными с компьютером
  Serial.println("Start!");
  SIM800.begin(9600);               // Скорость обмена данными с модемом
  SIM800.println("AT");
  delay(100);
  SIM800.println("AT+CMGF=1");                // Установка SMS в текстовый режим
  delay(1000);  
  SIM800.println("AT+CNMI=1,2,0,0,0");        // Процедура обработки вновь полученных сообщений 
  delay(1000);
  SIM800.println("AT+CMGL=\"REC UNREAD\"");   // Прочитать непрочитанные сообщения

  pinMode(RELAY1, OUTPUT);         // Объявляем пин реле 1 как выход
  digitalWrite(RELAY1, LOW);       // Включаем реле - посылаем низкий сигнал, на этом реле сидит роутер.
  pinMode(RELAY2, OUTPUT);         // Объявляем пин реле 2 как выход
  digitalWrite(RELAY2, HIGH);      // Выключаем реле - посылаем высокий сигнал
  pinMode(RELAY3, OUTPUT);         // Объявляем пин реле 3 как выход
  digitalWrite(RELAY3, HIGH);      // Выключаем реле - посылаем высокий сигнал
  pinMode(RELAY4, OUTPUT);         // Объявляем пин реле 4 как выход
  digitalWrite(RELAY4, HIGH);      // Выключаем реле - посылаем высокий сигнал
}

void loop()
{  
  if(SIM800.available())
{
  delay(100);

  // Последовательный буфер
  while(SIM800.available()){
  incomingByte = SIM800.read();
  inputString += incomingByte; 
}
  delay(10);      
  Serial.println(inputString);
  inputString.toUpperCase();

  // Включить или выключить реле 1
  if (inputString.indexOf("OFF1") > -1){
  digitalWrite(RELAY1, HIGH);}
  if (inputString.indexOf("ON1") > -1){
  digitalWrite(RELAY1, LOW);
}          
  delay(50);
  
    // Включить или выключить реле 2
  if (inputString.indexOf("OFF2") > -1){
  digitalWrite(RELAY2, HIGH);}
  if (inputString.indexOf("ON2") > -1){
  digitalWrite(RELAY2, LOW);
}          
  delay(50);
  
  // Включить или выключить реле 3
  if (inputString.indexOf("OFF3") > -1){
  digitalWrite(RELAY3, HIGH);}
  if (inputString.indexOf("ON3") > -1){
  digitalWrite(RELAY3, LOW);
}          
  delay(50);
  
  // Включить или выключить реле 4
  if (inputString.indexOf("OFF4") > -1){
  digitalWrite(RELAY4, HIGH);}
  if (inputString.indexOf("ON4") > -1){
  digitalWrite(RELAY4, LOW);
}          
  delay(50);

  // Удалить сообщения и сохранить память
  if (inputString.indexOf("OK") == -1){
  SIM800.println("AT+CMGDA=\"DEL ALL\"");
  delay(1000);}

  inputString = "";
  }
}

 

Спасибо.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

процедура setup() выполняется только один раз при старте, соотвественно вам необходимо команду модема чтения СМС поместить в loop, поставить задержку на пару минут чтоб с периодичностью читала СМСки.

SkyLord
Offline
Зарегистрирован: 22.07.2019

andycat пишет:

процедура setup() выполняется только один раз при старте, соотвественно вам необходимо команду модема чтения СМС поместить в loop, поставить задержку на пару минут чтоб с периодичностью читала СМСки.

Я правильно понял 26 строку запихнуть под loop и добавить например delay (1000*60) так?

 void loop()

 // Прочитать непрочитанные сообщения
  while(SIM800.available()){
  incomingByte = SIM800.println("AT+CMGL=\"REC UNREAD\"");
}
  delay(1000*60);   

22 и 24 я не трогаю, они один раз исполняются.. 

Спасибо!

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

задержку в конце loop процедуры поставить

ЗЫ. Надеюсь вы не отопительным газовым котлом собираетесь управлять, т.к. весь сектч это не жизнеспособное решение, и долго / стабильно работать он вряд ли будет.

SkyLord
Offline
Зарегистрирован: 22.07.2019

andycat пишет:

задержку в конце loop процедуры поставить

ЗЫ. Надеюсь вы не отопительным газовым котлом собираетесь управлять, т.к. весь сектч это не жизнеспособное решение, и долго / стабильно работать он вряд ли будет.

Раз уж вы помогаете мне со скетчем, подсказавыйте так, чтоб я не сдох :) Шутка.

Нет на реле сидит роуттер с модемом, который переодически отваливается от сети. Помогает только перезагрузка по питанию. К сожалению никакие netwatch в роутере не помогают перезагрузить питание USB. Пришлось собрать вот такое чудо!

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

SkyLord пишет:

andycat пишет:

задержку в конце loop процедуры поставить

ЗЫ. Надеюсь вы не отопительным газовым котлом собираетесь управлять, т.к. весь сектч это не жизнеспособное решение, и долго / стабильно работать он вряд ли будет.

Раз уж вы помогаете мне со скетчем, подсказавыйте так, чтоб я не сдох :) Шутка.

Нет на реле сидит роуттер с модемом, который переодически отваливается от сети. Помогает только перезагрузка по питанию. К сожалению никакие netwatch в роутере не помогают перезагрузить питание USB. Пришлось собрать вот такое чудо!

 

так он и должен отваливаться раз в сутки и сам себя переподнимать

SkyLord
Offline
Зарегистрирован: 22.07.2019

ua6em пишет:

 раз в сутки и сам себя переподнимать

Модем просто теряет сеть. Нетвоч роутера натроен на перезагрузку USB если нет ответа от 8.8.8.8 и судя по логам он это делает и довольно часто!, но сеть на свистке от таких действий иногда не подымается. Пришлось изобрести это колесо в виде реле, что бы по смс его ребутать.

Вот нетвотч и лог

 

 

Подскажите тупню со скетчем, это все что я прошу ))

SkyLord
Offline
Зарегистрирован: 22.07.2019

В итоге я имею следующее. Боже как стыдно (

 

/*
 * Скетч для управления четырехканальным реле с помощью Ардуино по СМС :)
 */

#include <SoftwareSerial.h>
SoftwareSerial SIM800(8, 7);        // Определяем пин 8 - RX Arduino (TX SIM800L), 7 пин - TX Arduino (RX SIM800L)
char incomingByte;
String inputString;
#define RELAY1 14                  // Определяем пин A0, используемый для подключения реле 1
#define RELAY2 15                  // Определяем пин A1, используемый для подключения реле 2
#define RELAY3 16                  // Определяем пин A2, используемый для подключения реле 3
#define RELAY4 17                  // Определяем пин A3, используемый для подключения реле 4

void setup()
{
  Serial.begin(9600);               // Скорость обмена данными с компьютером
  Serial.println("Start!");
  SIM800.begin(9600);               // Скорость обмена данными с модемом
  SIM800.println("AT");
  delay(100);
  SIM800.println("AT+CMGF=1");                // Установка SMS в текстовый режим
  delay(1000);  
  SIM800.println("AT+CNMI=1,2,0,0,0");        // Процедура обработки вновь полученных сообщений 
  delay(1000);

  pinMode(RELAY1, OUTPUT);         // Объявляем пин реле 1 как выход
  digitalWrite(RELAY1, LOW);       // Включаем реле - посылаем низкий сигнал, на этом реле сидит роутер.
  pinMode(RELAY2, OUTPUT);         // Объявляем пин реле 2 как выход
  digitalWrite(RELAY2, HIGH);      // Выключаем реле - посылаем высокий сигнал
  pinMode(RELAY3, OUTPUT);         // Объявляем пин реле 3 как выход
  digitalWrite(RELAY3, HIGH);      // Выключаем реле - посылаем высокий сигнал
  pinMode(RELAY4, OUTPUT);         // Объявляем пин реле 4 как выход
  digitalWrite(RELAY4, HIGH);      // Выключаем реле - посылаем высокий сигнал
}

void loop(){
  Serial.println("Через минутку все сделаю в лучшем виде!");
  delay(1000*60);
  
  if(SIM800.available()){
{
  delay(100);
  
  // Прочитать непрочитанные сообщения
  while(SIM800.available()){
  incomingByte = SIM800.println("AT+CMGL=\"REC UNREAD\"");
}
  delay(100);   
  
  // Последовательный буфер
  while(SIM800.available()){
  incomingByte = SIM800.read();
  inputString += incomingByte; 
}
  delay(10);      
  Serial.println(inputString);
  inputString.toUpperCase();

  // Включить или выключить реле 1
  if (inputString.indexOf("OFF1") > -1){
  digitalWrite(RELAY1, HIGH);}
  if (inputString.indexOf("ON1") > -1){
  digitalWrite(RELAY1, LOW);
}          
  delay(50);
  
  // Включить или выключить реле 2
  if (inputString.indexOf("OFF2") > -1){
  digitalWrite(RELAY2, HIGH);}
  if (inputString.indexOf("ON2") > -1){
  digitalWrite(RELAY2, LOW);
}          
  delay(50);
  
  // Включить или выключить реле 3
  if (inputString.indexOf("OFF3") > -1){
  digitalWrite(RELAY3, HIGH);}
  if (inputString.indexOf("ON3") > -1){
  digitalWrite(RELAY3, LOW);
}          
  delay(50);
  
  // Включить или выключить реле 4
  if (inputString.indexOf("OFF4") > -1){
  digitalWrite(RELAY4, HIGH);}
  if (inputString.indexOf("ON4") > -1){
  digitalWrite(RELAY4, LOW);
}          
  delay(50);

  // Удалить сообщения и сохранить память
  if (inputString.indexOf("OK") == -1){
  SIM800.println("AT+CMGDA=\"DEL ALL\"");
  delay(1000);}

  inputString = "";
  }
}
}

 

KindMan
Offline
Зарегистрирован: 19.12.2018

А не проще в setup дождаться пока модем включиться ?
И не понимаю, как можно слать команды и не интересоваться чего отвечают…

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Поставить реле с RTC и нехай себе перезагружает все каждые 12 или 6 часов

SkyLord
Offline
Зарегистрирован: 22.07.2019

Я это сделаю. Обязательно, но завтра улетаю в отпуск отсюда и спешка. Подключу тариф на 100 смс и буду развлекаться пока не надоест. Но я узнаю когда отвалится модем, так как переодически захожу на роутер через удаленку. Но это другая история..

Вы мне главное скажите Этот франкенштейн работать будет ?))

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

SkyLord пишет:

Этот франкенштейн работать будет ?))

ну....будет - попробуйте :) вопрос насколько долго, тем более если в отпуск собираетесь.

не.....другая мысль: собрать железку Arduino Nano + Ethernet W5500 воткнуть в роутер (Mikrotik судя по скринам), пинговать внешнюю сеть....и как только связь пропадает - слать что либо на железку (GET запрос например) и Arduino будер рубить питание на пару секунд.

SkyLord
Offline
Зарегистрирован: 22.07.2019

andycat пишет:

SkyLord пишет:

Этот франкенштейн работать будет ?))

ну....будет - попробуйте :) вопрос насколько долго, тем более если в отпуск собираетесь.

не.....другая мысль: собрать железку Arduino Nano + Ethernet W5500 воткнуть в роутер (Mikrotik судя по скринам), пинговать внешнюю сеть....и как только связь пропадает - слать что либо на железку (GET запрос например) и Arduino будер рубить питание на пару секунд.

Я сам в шоке от моих идей )) Но, реле я взял, как видите 4 канальное, дополнительно еще будет и сигнализация и прочие НУЖНЫЕ мне вещи :)

Главное потом добавить в скетч ответ о статусе и желательно на записанные ранее номера, а не всем подряд ))

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

http://codius.ru/articles/GSM_%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C_SIM800L_%D1%87%D0%B0%D1%81%D1%82%D1%8C_1

 

/*
   Скетч для управления четырехканальным реле с помощью Ардуино по СМС :)
*/

#include <SoftwareSerial.h>
SoftwareSerial SIM800(8, 7);        // Определяем пин 8 - RX Arduino (TX SIM800L), 7 пин - TX Arduino (RX SIM800L)
char incomingByte;
String inputString;
#define RELAY1 14                  // Определяем пин A0, используемый для подключения реле 1
#define RELAY2 15                  // Определяем пин A1, используемый для подключения реле 2
#define RELAY3 16                  // Определяем пин A2, используемый для подключения реле 3
#define RELAY4 17                  // Определяем пин A3, используемый для подключения реле 4

void setup()
{
  Serial.begin(9600);               // Скорость обмена данными с компьютером
  Serial.println("Start!");
  SIM800.begin(9600);               // Скорость обмена данными с модемом
  SIM800.println("AT");
  delay(100);
  SIM800.println("AT+CMGF=1");                // Установка SMS в текстовый режим
  delay(1000);
  SIM800.println("AT+CNMI=1,2,0,0,0");        // Процедура обработки вновь полученных сообщений
  delay(1000);

  pinMode(RELAY1, OUTPUT);         // Объявляем пин реле 1 как выход
  digitalWrite(RELAY1, LOW);       // Включаем реле - посылаем низкий сигнал, на этом реле сидит роутер.
  pinMode(RELAY2, OUTPUT);         // Объявляем пин реле 2 как выход
  digitalWrite(RELAY2, HIGH);      // Выключаем реле - посылаем высокий сигнал
  pinMode(RELAY3, OUTPUT);         // Объявляем пин реле 3 как выход
  digitalWrite(RELAY3, HIGH);      // Выключаем реле - посылаем высокий сигнал
  pinMode(RELAY4, OUTPUT);         // Объявляем пин реле 4 как выход
  digitalWrite(RELAY4, HIGH);      // Выключаем реле - посылаем высокий сигнал
}

void loop() {
  Serial.println("Через минутку все сделаю в лучшем виде!");

  // Прочитать непрочитанные сообщения
  incomingByte = SIM800.println("AT+CMGL=\"REC UNREAD\"");
  delay(1000);

  // Последовательный буфер
  while (SIM800.available()) {
    incomingByte = SIM800.read();
    inputString += incomingByte;
  }
  delay(10);
  Serial.println(inputString);
  inputString.toUpperCase();

  // Включить или выключить реле 1
  if (inputString.indexOf("OFF1") > -1) {
    digitalWrite(RELAY1, HIGH);
  }
  if (inputString.indexOf("ON1") > -1) {
    digitalWrite(RELAY1, LOW);
  }
  delay(50);

  // Включить или выключить реле 2
  if (inputString.indexOf("OFF2") > -1) {
    digitalWrite(RELAY2, HIGH);
  }
  if (inputString.indexOf("ON2") > -1) {
    digitalWrite(RELAY2, LOW);
  }
  delay(50);

  // Включить или выключить реле 3
  if (inputString.indexOf("OFF3") > -1) {
    digitalWrite(RELAY3, HIGH);
  }
  if (inputString.indexOf("ON3") > -1) {
    digitalWrite(RELAY3, LOW);
  }
  delay(50);

  // Включить или выключить реле 4
  if (inputString.indexOf("OFF4") > -1) {
    digitalWrite(RELAY4, HIGH);
  }
  if (inputString.indexOf("ON4") > -1) {
    digitalWrite(RELAY4, LOW);
  }
  delay(50);

  // Удалить сообщения и сохранить память
  if (inputString.indexOf("OK") == -1) {
    SIM800.println("AT+CMGDA=\"DEL ALL\"");
    delay(1000);
  }

  inputString = "";

  delay(1000 * 60);
}

 

SkyLord
Offline
Зарегистрирован: 22.07.2019

Да я знакомился с этой статьей. И часть кода взял с нее.

Спасибо вам. Поеду заливать скетч.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Розеткой с смс мордой давно пользуюсь в одной фирме - где все супер далеко и только ей и можно ребутнуть железку. Китай рулит. Рублей 6к где то покупал пару лет назад. 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

https://m.ru.aliexpress.com/item/32841061942.html?trace=wwwdetail2mobile...

Мимо пробегал - аккурат то что вам нужно и паять не надо - скрипт в роутере написать и послать сигнал esp на включение реле.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Ну хз, с смс модулем готовые розетки есть в китае. Оправдывают свою стоимость если ты за сотни км от устройства. 

SkyLord
Offline
Зарегистрирован: 22.07.2019

andycat пишет:

 

/*
   Скетч для управления четырехканальным реле с помощью Ардуино по СМС :)
*/

#include <SoftwareSerial.h>
SoftwareSerial SIM800(8, 7);        // Определяем пин 8 - RX Arduino (TX SIM800L), 7 пин - TX Arduino (RX SIM800L)
char incomingByte;
String inputString;
#define RELAY1 14                  // Определяем пин A0, используемый для подключения реле 1
#define RELAY2 15                  // Определяем пин A1, используемый для подключения реле 2
#define RELAY3 16                  // Определяем пин A2, используемый для подключения реле 3
#define RELAY4 17                  // Определяем пин A3, используемый для подключения реле 4

void setup()
{
  Serial.begin(9600);               // Скорость обмена данными с компьютером
  Serial.println("Start!");
  SIM800.begin(9600);               // Скорость обмена данными с модемом
  SIM800.println("AT");
  delay(100);
  SIM800.println("AT+CMGF=1");                // Установка SMS в текстовый режим
  delay(1000);
  SIM800.println("AT+CNMI=1,2,0,0,0");        // Процедура обработки вновь полученных сообщений
  delay(1000);

  pinMode(RELAY1, OUTPUT);         // Объявляем пин реле 1 как выход
  digitalWrite(RELAY1, LOW);       // Включаем реле - посылаем низкий сигнал, на этом реле сидит роутер.
  pinMode(RELAY2, OUTPUT);         // Объявляем пин реле 2 как выход
  digitalWrite(RELAY2, HIGH);      // Выключаем реле - посылаем высокий сигнал
  pinMode(RELAY3, OUTPUT);         // Объявляем пин реле 3 как выход
  digitalWrite(RELAY3, HIGH);      // Выключаем реле - посылаем высокий сигнал
  pinMode(RELAY4, OUTPUT);         // Объявляем пин реле 4 как выход
  digitalWrite(RELAY4, HIGH);      // Выключаем реле - посылаем высокий сигнал
}

void loop() {
  Serial.println("Через минутку все сделаю в лучшем виде!");

  // Прочитать непрочитанные сообщения
  incomingByte = SIM800.println("AT+CMGL=\"REC UNREAD\"");
  delay(1000);

  // Последовательный буфер
  while (SIM800.available()) {
    incomingByte = SIM800.read();
    inputString += incomingByte;
  }
  delay(10);
  Serial.println(inputString);
  inputString.toUpperCase();

  // Включить или выключить реле 1
  if (inputString.indexOf("OFF1") > -1) {
    digitalWrite(RELAY1, HIGH);
  }
  if (inputString.indexOf("ON1") > -1) {
    digitalWrite(RELAY1, LOW);
  }
  delay(50);

  // Включить или выключить реле 2
  if (inputString.indexOf("OFF2") > -1) {
    digitalWrite(RELAY2, HIGH);
  }
  if (inputString.indexOf("ON2") > -1) {
    digitalWrite(RELAY2, LOW);
  }
  delay(50);

  // Включить или выключить реле 3
  if (inputString.indexOf("OFF3") > -1) {
    digitalWrite(RELAY3, HIGH);
  }
  if (inputString.indexOf("ON3") > -1) {
    digitalWrite(RELAY3, LOW);
  }
  delay(50);

  // Включить или выключить реле 4
  if (inputString.indexOf("OFF4") > -1) {
    digitalWrite(RELAY4, HIGH);
  }
  if (inputString.indexOf("ON4") > -1) {
    digitalWrite(RELAY4, LOW);
  }
  delay(50);

  // Удалить сообщения и сохранить память
  if (inputString.indexOf("OK") == -1) {
    SIM800.println("AT+CMGDA=\"DEL ALL\"");
    delay(1000);
  }

  inputString = "";

  delay(1000 * 60);
}

 

 

Скетч не работает. Не реагирует на СМС.  В монитор шлет мусор и вопросы ))

Поэтому мой первоначальный скетч загрузил он рабочий, хоть и с небольшим недостатком.