Sim800c и управление реле

Тема в разделе "Arduino & Shields", создана пользователем mixa_r, 10 ноя 2017.

  1. mixa_r

    mixa_r Нуб

    Добрый день, помогите дописать скетч. Необходимо отправить смс со словом "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);
    }
    }
     
    Последнее редактирование: 10 ноя 2017
  2. DIYMan

    DIYMan Guest

    1. Вставьте код правильно, для этого на тулбаре редактора есть соответствующая кнопа;
    2. Скорость 19200 для SoftwareSerial - это забогато, максимум 9600 бод.
     
  3. mixa_r

    mixa_r Нуб

    Спасибо, не знал. Переделал
     
  4. ostrov

    ostrov Гуру

    Модуль то отвечает на АТ запросы?
     
  5. mixa_r

    mixa_r Нуб

    Конечно, все работает. Все что в скетче работает на ура. Не могу додумать как вывести состояние пинов чтобы было так
    Status ->
    Rele 1 ON
    Rele 2 OFF
    Rele 3 OFF
    Rele 4 OFF

    конечно может меняться в зависимости от состояния пина
     
  6. ostrov

    ostrov Гуру

    Используйте не else if, а просто цепочку if. Хотя я бы сделал по другому вообще.
     
  7. mixa_r

    mixa_r Нуб

    Я уже упоминал что с программированием не супер, поэтому реализовано так. Если есть лучший вариант можете поделиться мыслями. Пока я все равно не пойму как вывести информацию о статусе пинов
     
  8. ostrov

    ostrov Гуру

    Если использовать else сработает что то одно, то есть первое правильное условие. Вам же надо несколько или вообще все. Я бы собрал текстовую строку со всеми нужными показаниями и отправил ее.
     
  9. mixa_r

    mixa_r Нуб

    У меня работает все как надо, прислал смс
    1 on, включилось 1 реле.
    3 on - 3 реле включилось.
    2 on - 2 реле
    2 off - выключелось 2 реле
    All on - все реле включились
    All off - все выключил сб
    И т.п.
    Команды не мешают друг другу ни как и работают как необходимо. Что с else что без else
    Не могу только собрать информацию с портов и отправить в каком они состоянии
     
  10. b707

    b707 Гуру

    Чтобы узнать, в каком состоянии - два пути. Либо запоминайте при включении реле, либо читайте функцией digitalRead(PIN). Потом формируете строку "Relay1 ON, Relay2 OFF ..."и все
     
  11. mixa_r

    mixa_r Нуб

    Принцип понял, но так и не смог реализовать. Есть возможность помочь в реализации?
     
  12. mixa_r

    mixa_r Нуб

    Здесь все доделал, спасибо