Добрый день, помогите дописать скетч. Необходимо отправить смс со словом "Status" и в ответ получить состояние пинов HIGH или LOW. В программировании не силен. Код (C++): #include <SoftwareSerial.h> SoftwareSerial gprsSerial(2, 3); // Подключаем gsm модуль в цифровые pin 2 и 3 RX/TX //настройка цифровых пинов под реле int rele1 = A0; int rele2 = A1; int rele3 = A2; int rele4 = A3; void setup() { delay(5000); // Небольшая задержка при включении для инициализации модуля gsm gprsSerial.begin(9600); pinMode(rele1, OUTPUT); digitalWrite(rele1,HIGH); pinMode(rele2, OUTPUT); digitalWrite(rele2,HIGH); pinMode(rele3, OUTPUT); digitalWrite(rele3,HIGH); pinMode(rele4, OUTPUT); digitalWrite(rele4,HIGH); // Настраиваем приём сообщений с других устройств // Между командами даём время на их обработку gprsSerial.print("AT+CMGF=1\r"); delay(500); gprsSerial.print("AT+IFC=1, 1\r"); delay(500); gprsSerial.print("AT+CPBS=\"SM\"\r"); delay(500); gprsSerial.print("AT+CNMI=1,2,2,1,0\r"); delay(500); } String currStr = ""; // Переменная принимает значение True, если текущая строка является сообщением boolean isStringMessage = false; void loop() { if (!gprsSerial.available()) return; char currSymb = gprsSerial.read(); if ('\r' == currSymb) { if (isStringMessage) { //если текущая строка - SMS-сообщение, //отреагируем на него соответствующим образом if (!currStr.compareTo("1 off")) { //отключение 1 реле digitalWrite(rele1, HIGH); } else if (!currStr.compareTo("1 on")) { //включение 1 реле digitalWrite(rele1, LOW); } else if (!currStr.compareTo("2 off")) { //отключение 2 реле digitalWrite(rele2, HIGH); } else if (!currStr.compareTo("2 on")) { //включение 2 реле digitalWrite(rele2, LOW); } else if (!currStr.compareTo("3 off")) { //отключение 3 реле digitalWrite(rele3, HIGH); } else if (!currStr.compareTo("3 on")) { //включение 3 реле digitalWrite(rele3, LOW); } else if (!currStr.compareTo("4 off")) { //отключение 4 реле digitalWrite(rele4, HIGH); } else if (!currStr.compareTo("4 on")) { //включение 4 реле digitalWrite(rele4, LOW); } else if (!currStr.compareTo("All off")) { //отключение всех реле digitalWrite(rele1, HIGH); digitalWrite(rele2, HIGH); digitalWrite(rele3, HIGH); digitalWrite(rele4, HIGH); } else if (!currStr.compareTo("All on")) { //включение всех реле digitalWrite(rele1, LOW); digitalWrite(rele2, LOW); digitalWrite(rele3, LOW); digitalWrite(rele4, LOW); } isStringMessage = false; } else { if (currStr.startsWith("+CMT")) { //если текущая строка начинается с "+CMT", //то следующая строка является сообщением isStringMessage = true; } } currStr = ""; } else if ('\n' != currSymb) { currStr += String(currSymb); } }
1. Вставьте код правильно, для этого на тулбаре редактора есть соответствующая кнопа; 2. Скорость 19200 для SoftwareSerial - это забогато, максимум 9600 бод.
Конечно, все работает. Все что в скетче работает на ура. Не могу додумать как вывести состояние пинов чтобы было так Status -> Rele 1 ON Rele 2 OFF Rele 3 OFF Rele 4 OFF конечно может меняться в зависимости от состояния пина
Я уже упоминал что с программированием не супер, поэтому реализовано так. Если есть лучший вариант можете поделиться мыслями. Пока я все равно не пойму как вывести информацию о статусе пинов
Если использовать else сработает что то одно, то есть первое правильное условие. Вам же надо несколько или вообще все. Я бы собрал текстовую строку со всеми нужными показаниями и отправил ее.
У меня работает все как надо, прислал смс 1 on, включилось 1 реле. 3 on - 3 реле включилось. 2 on - 2 реле 2 off - выключелось 2 реле All on - все реле включились All off - все выключил сб И т.п. Команды не мешают друг другу ни как и работают как необходимо. Что с else что без else Не могу только собрать информацию с портов и отправить в каком они состоянии
Чтобы узнать, в каком состоянии - два пути. Либо запоминайте при включении реле, либо читайте функцией digitalRead(PIN). Потом формируете строку "Relay1 ON, Relay2 OFF ..."и все