Управление отоплением в загородном доме (GSM)

Тема в разделе "Глядите, что я сделал", создана пользователем Вячеслав, 6 дек 2012.

  1. djkohr

    djkohr Нуб

    Не пойму что происходит. Проще ведь некуда.
    Код (C++):
    #include <SoftwareSerial.h>
    SoftwareSerial mySerial(2,3);  // (Rx,Tx  > Tx,Rx)

    char incomingByte;
    String inputString;
    int relay = 13; // Выход для управления реле

    void setup()
    {
          pinMode(relay, OUTPUT);
          digitalWrite(relay, LOW); // Исходное состояние реле
          Serial.begin(9600);
          mySerial.begin(9600);

         while(!mySerial.available()){
            mySerial.println("AT");
            delay(1000);
            Serial.println("Connecting...");
            }
          Serial.println("Connected!");
          mySerial.println("AT+CMGF=1");  // Установка SMS в текстовый режим
          delay(1000);
          mySerial.println("AT+CNMI=1,2,0,0,0");  // Процедура обработки вновь полученных сообщений
          delay(1000);
          mySerial.println("AT+CMGL=\"REC UNREAD\""); // Прочитать непрочитанные сообщения
         }

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

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

            delay(10);    

            Serial.println(inputString);
            inputString.toUpperCase();

            // включить или выключить реле
            if (inputString.indexOf("ON") > -1){
              digitalWrite(relay, HIGH);
              }
             if (inputString.indexOf("OFF") > -1){
              digitalWrite(relay, LOW);
              }        

            delay(50);

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

            delay(1000);}

            inputString = "";
      }
    }
     

    Вложения:

    • 144.jpg
      144.jpg
      Размер файла:
      162,4 КБ
      Просмотров:
      568
  2. Mambo

    Mambo Нуб

    Для начала задержку сделайте 1 секунду
    Код (C++):
    delay(1000);
    , но не меньше 700 миллисекунд. И в самом низу монитора порта где нет конца строки хотя бы выберите параметр новая строка. И у вас отсутствует функция которая парсит смс.
     
  3. djkohr

    djkohr Нуб

    Везде установил 1 секунду. Не понимаю где писать функцию парсинга. В исходном коде ее нет, и человек говорит что всё арбайтен на ура. Из-за отсутствия парсинга такой косяк с кодировкой?
     
  4. Mambo

    Mambo Нуб

    косяк с кодировкой может быть из-за разной скорости обмена порта. В диспетчере устройств смотрели какая скорость порта установлена?
     
  5. djkohr

    djkohr Нуб

    Везде 9600.
     
  6. Mambo

    Mambo Нуб

    Последнее что на ум приходит попробуйте этот кусок кода
    Код (C++):
    pinMode(relay, OUTPUT);
          digitalWrite(relay, LOW); // Исходное состояние реле
          Serial.begin(9600);
          mySerial.begin(9600);
    изменить на такой.
    Код (C++):
    pinMode(relay, OUTPUT);
          digitalWrite(relay, LOW); // Исходное состояние реле
          Serial.begin(9600);
          delay(1000); // или 500 ну или с тем параметром с которым будет корректно отображаться
          mySerial.begin(9600);
         delay(1000);
     
     
  7. djkohr

    djkohr Нуб

    Ваще всё странно. После заливки скетча не работает digitalWrite(relay, LOW);// Исходное состояние реле.
    При подключении pin13 замыкается и держит.
    Что касается модема. В мониторе пишет что ждет подключения. При подаче питания пишет:
    Connecting...
    Connected!
    B⸮⸮⸮⸮B

    Модем сам перестроился на 115200. Поправил скетч, данные пошли, но криво:
    AT+CMGDA<"DEL ALL"

    +CME ERROR; 58

    AT+CMGDA="DEL ALL"

    +CMF ERROR: 58


    i%EK= #MESSAGD",1

    +CNT: "+79266802055",,"2008/11/15,11:11:
    AT+CMGDA="DEL ALL"

    +CME ERROR: 58
     
    Последнее редактирование: 15 ноя 2018
  8. Mambo

    Mambo Нуб

    Вооот. Сам сижу переписываю скетч полностью, так как при получения сообщения arduino висла наглухо. Напряжение какое на gsm модуле? И какой модуль используется?
     
  9. Mambo

    Mambo Нуб

    добавьте еще в строки AT команд в конце символ "\r" - это символ переноса строки
    Код (C++):
     gprsSerial.print("AT+CMGF=1\r");
     
  10. djkohr

    djkohr Нуб

    Модуль Goouuu IOT-GA6-B, напряжение 5В 2А. Перелопатил все даташиты, он должен адекватно работать на таком питании.
     
  11. djkohr

    djkohr Нуб

    И еще странно. Иногда коверкает мой номер телефона. Подменяет одну из циферок в номере.
     
  12. Mambo

    Mambo Нуб

    AT команды отработали нормально после добавления символа перенос строки? Ну на счет коверкания номера тут отслеживать надо на каком этапе что получает.
     
  13. djkohr

    djkohr Нуб

    upload_2018-11-15_11-48-56.png
     
  14. djkohr

    djkohr Нуб

    Судя по всему сообщения получает:
    Connecting...
    Connected!
    Connecting...
    Connected!
    AT

    OK
    AT+CMGF=1

    OK

    AT+CNMI<1,2,0,0,0

    OK
    AT+CMGL="R

    +CIDV: "MESSAGE#,1

    +CMT: "+79266802055",,"2018/11/15,11:4N
    AT+CMGBA="DEL ALL"

    +CME ERRJ⸮⸮⸮j

    AT+CMGDA="DEL ALL"

    +CL⸮ ERROR: 58
     
  15. Mambo

    Mambo Нуб

    у вас косяк в части at команд.
     
  16. djkohr

    djkohr Нуб

    Есть подозрения что здесь:
    mySerial.println("AT+CNMI=1,2,0,0,0"); // Процедура обработки вновь полученных сообщений
     
  17. Mambo

    Mambo Нуб

    Нет символа переноса строки. Пока этого символа не будет, команда как корректная рассматриваться не будет.
     
  18. djkohr

    djkohr Нуб

    Заменил к чертям весь блок АТ-команд:
    Код (C++):
    while(mySerial.available()){
            mySerial.println("AT");
            delay(1000);
                    }
          mySerial.println("Connected!");
          mySerial.begin(115200);
          mySerial.print("AT+CMGF=1\r");// устанавливает текстовый режим смс-сообщения
          delay(300);
          mySerial.print("AT+IFC=1, 1\r");// устанавливает программный контроль потоком передачи данных
          delay(300);
          mySerial.print("AT+CPBS=\"SM\"\r");// открывает доступ к данным телефонной книги SIM-карты.!
          delay(300);
          mySerial.print("AT+CNMI=1,2,2,1,0\r"); // Настройка вывода смс.!
          delay(500);
          mySerial.print("AT+CMGD=1,4\r");//удалить все смс
          delay(500);
          mySerial.println("AT+CMGL=\"REC UNREAD\""); // Прочитать непрочитанные сообщения
         }
     
  19. Mambo

    Mambo Нуб

    Почитайте статьи по sim800l. Команды одни и те же, принцип работы один и тот же. http://codius.ru/articles/GSM_модуль_SIM800L_часть_2
     
  20. tanvik

    tanvik Нуб

    Собрал таки адуинку и sim900 на бутерброд. Никак не хотели постичь семейной радости и на вот, соединились... Оказалось, что мешал работе 6 пин. Отогнул его, взгромоздил шилд на унку и процесс пошёл.
    Несколько изменил скетч. Привожу кусок кода:
    Код (C++):
    #include <SoftwareSerial.h>
    #include "DHT.h"
    #define DHTPIN 5  //pin на котором висит датчик температуры
    #define DHTTYPE DHT22  // DHT 22 тип датчика
    //Отсылается смс в формате: влажность;температура;устройство1;устройство2;устройство3;устройство4;Контроль периметра;Состояние периметра;Контроль автотемпературы;Установленная температура;STEWARD;
    int greenLed = 13; //Зеленый светодиод на PIN13
    int powerGSM = 9; //pin включения GSM
    int unit1 = 3; //Управляемое устройство 1
    int unit2 = 4; //Управляемое устройство 2
    int unit3 = 10;//Управляемое устройство 3
    int unit4 = 11;//Управляемое устройство 4
    int perimetr = 12;// Датчик периметра на 12 pin
    String statusHome;
    int t=0;
    unsigned long currentTime;
    unsigned long loopTime;
    boolean unit1status = false; //Управляемое устройство 1
    boolean unit2status = false; //Управляемое устройство 2
    boolean unit3status = false; //Управляемое устройство 3
    boolean unit4status = false; //Управляемое устройство 4
    boolean isPerimetr = false; //Контроль периметра
    boolean sendSMS = false; //Для проверки, что смс отсылаем только один раз
    boolean isAuto = false; //Автоматическое управление температурой
    int autoTemp = 0;
    int delta=2;
    DHT dht(DHTPIN, DHTTYPE);
    SoftwareSerial gprsSerial(7, 8);
    Три дня работает без сбоев. Спасибо автору за интересную конструкцию.
     

    Вложения:

    • gprs_sim900.jpg
      gprs_sim900.jpg
      Размер файла:
      251,4 КБ
      Просмотров:
      515