Прошу помощи.

serg233
Offline
Зарегистрирован: 02.02.2016

Доброе время суток. Решил попросить помощи т.к. сам уже не могу справится. Есть скетч из примера https://www.youtube.com/watch?time_continue=4&v=ixday1qURoU хочется сделать тоже самое. В образце допущенны ошибки (намеренно или нет х.з) я пару штук нашел. Скетч в принципе работает но не реагирут на смс. Компаненты как в примере .Подключенны также ,кроме питания sim800l. Оно сделанно отдельно. С питанием от ардуинки вообще в сети не регистрировался. Всем заранее спасибо. 

п.с. Просидел две ночи так и не смог запустить.

ссылка на мой скетч https://yadi.sk/d/YDWDiuPV3S9BpQ

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Мошт, к аффтару?

Mouflon
Offline
Зарегистрирован: 17.01.2018

А как именно не реагирует? не получает SMS или получает, но некорректно обрабатывает? 

 

serg233
Offline
Зарегистрирован: 02.02.2016

Не реагирует на команды смс.

serg233
Offline
Зарегистрирован: 02.02.2016

Должен включать реле ,а он не включает.

kalapanga
Offline
Зарегистрирован: 23.10.2016

serg233 пишет:

Не реагирует на команды смс.

Вас уточнить просили, какая именно стадия у Вас не работает. Сначала Вы должны получить СМС, затем обработать и изменить состояние релюшек. У Вас же в скетче вывод в сериал есть, в том числе и полученной строки. Там вы что видите?

serg233
Offline
Зарегистрирован: 02.02.2016

Выполняет и выводит : Serial.print("Kirim balasan ke nomor = > ");

  Serial.println(buffNumber);
  Serial.println("Initialisasi Berhasil");
  Serial.println("=============================================================");
до цикла loop . 
Дальше тишина и отсутствие реакции на смс. 
Mouflon
Offline
Зарегистрирован: 17.01.2018

ИМХО не работает модуль. Заливаешь в ардуину этот код, открываешь окно терминала и при помощи AT команд удостоверяешься что модуль работает, зарегистрирован в сети и т.д. 
 

#include <SoftwareSerial.h>
 
//SIM800 TX is connected to Arduino D8
#define SIM800_TX_PIN 8
 
//SIM800 RX is connected to Arduino D7
#define SIM800_RX_PIN 7
 
//Create software serial object to communicate with SIM800
SoftwareSerial serialSIM800(SIM800_TX_PIN,SIM800_RX_PIN);
 
void setup() {
  //Begin serial comunication with Arduino and Arduino IDE (Serial Monitor)
  Serial.begin(9600);
  while(!Serial);
   
  //Being serial communication witj Arduino and SIM800
  serialSIM800.begin(9600);
  delay(1000);
   
  Serial.println("Setup Complete!");
}
 
void loop() {
  //Read SIM800 output (if available) and print it in Arduino IDE Serial Monitor
  if(serialSIM800.available()){
    Serial.write(serialSIM800.read());
  }
  //Read Arduino IDE Serial Monitor inputs (if available) and send them to SIM800
  if(Serial.available()){    
    serialSIM800.write(Serial.read());
  }
}

 

serg233
Offline
Зарегистрирован: 02.02.2016

Модуль сам работает. На АТ команды реагирует. Не работает в моем скетче.

Mouflon
Offline
Зарегистрирован: 17.01.2018

я под работает подразумевал, что при помощи AT команд удаётся проверить следующие моменты: 

1. модуль зарегистрирован в сети.
2. модуль принимает SMS и корректно их обрабатывает. 

если всё так и есть, то тогда надо в цикле опрашивать модуль и выводить всё что он получает. и дальше отлаживать.

serg233
Offline
Зарегистрирован: 02.02.2016

Проверил:

1. модуль зарегистрирован в сети.
2. модуль принимает SMS и выводит содержимое в сериал в других скечах. Конкретно в этом ,где привязка смс к действиям ,реакции нет.

Mouflon
Offline
Зарегистрирован: 17.01.2018

Другие скетчи на той же библиотеке? Можно их глянуть? и результат их работы? 

 

serg233
Offline
Зарегистрирован: 02.02.2016

По моему ключевое слово"эти библиотеки". Другие скетчи на других.

Вот этот пример работает.

SoftwareSerial SIM800(8, 9);                    // RX, TX

String _response = "";                          // Переменная для хранения ответа модуля
void setup() {
  Serial.begin(9600);                           // Скорость обмена данными с компьютером
  SIM800.begin(9600);                           // Скорость обмена данными с модемом
  Serial.println("Start!");

  sendATCommand("AT", true);                    // Отправили AT для настройки скорости обмена данными

  // Команды настройки модема при каждом запуске
  //_response = sendATCommand("AT+CLIP=1", true);  // Включаем АОН
  //_response = sendATCommand("AT+DDET=1", true);  // Включаем DTMF
  _response = sendATCommand("AT+CMGF=1;&W", true); // Включаем текстовый режима SMS (Text mode) и сразу сохраняем значение (AT&W)!

}

String sendATCommand(String cmd, bool waiting) {
  String _resp = "";                            // Переменная для хранения результата
  Serial.println(cmd);                          // Дублируем команду в монитор порта
  SIM800.println(cmd);                          // Отправляем команду модулю
  if (waiting) {                                // Если необходимо дождаться ответа...
    _resp = waitResponse();                     // ... ждем, когда будет передан ответ
    // Если Echo Mode выключен (ATE0), то эти 3 строки можно закомментировать
    if (_resp.startsWith(cmd)) {                // Убираем из ответа дублирующуюся команду
      _resp = _resp.substring(_resp.indexOf("\r", cmd.length()) + 2);
    }
    Serial.println(_resp);                      // Дублируем ответ в монитор порта
  }
  return _resp;                                 // Возвращаем результат. Пусто, если проблема
}

String waitResponse() {                         // Функция ожидания ответа и возврата полученного результата
  String _resp = "";                            // Переменная для хранения результата
  long _timeout = millis() + 10000;             // Переменная для отслеживания таймаута (10 секунд)
  while (!SIM800.available() && millis() < _timeout)  {}; // Ждем ответа 10 секунд, если пришел ответ или наступил таймаут, то...
  if (SIM800.available()) {                     // Если есть, что считывать...
    _resp = SIM800.readString();                // ... считываем и запоминаем
  }
  else {                                        // Если пришел таймаут, то...
    Serial.println("Timeout...");               // ... оповещаем об этом и...
  }
  return _resp;                                 // ... возвращаем результат. Пусто, если проблема
}

void loop() {
  if (SIM800.available())   {                   // Если модем, что-то отправил...
    _response = waitResponse();                 // Получаем ответ от модема для анализа
    _response.trim();                           // Убираем лишние пробелы в начале и конце
    Serial.println(_response);                  // Если нужно выводим в монитор порта
    //....
    if (_response.startsWith("+CMTI:")) {       // Пришло сообщение об отправке SMS
      int index = _response.lastIndexOf(",");   // Находим последнюю запятую, перед индексом
      String result = _response.substring(index + 1, _response.length()); // Получаем индекс
      result.trim();                            // Убираем пробельные символы в начале/конце
      _response=sendATCommand("AT+CMGR="+result, true); // Получить содержимое SMS
      parseSMS(_response);                      // Распарсить SMS на элементы
      sendATCommand("AT+CMGDA=\"DEL ALL\"", true); // Удалить все сообщения, чтобы не забивали память модуля
    }
  }
  if (Serial.available())  {                    // Ожидаем команды по Serial...
    SIM800.write(Serial.read());                // ...и отправляем полученную команду модему
  };
}


void parseSMS(String msg) {
  String msgheader  = "";
  String msgbody    = "";
  String msgphone    = "";

  msg = msg.substring(msg.indexOf("+CMGR: "));
  msgheader = msg.substring(0, msg.indexOf("\r"));

  msgbody = msg.substring(msgheader.length() + 2);
  msgbody = msgbody.substring(0, msgbody.lastIndexOf("OK"));
  msgbody.trim();

  int firstIndex = msgheader.indexOf("\",\"") + 3;
  int secondIndex = msgheader.indexOf("\",\"", firstIndex);
  msgphone = msgheader.substring(firstIndex, secondIndex);

  Serial.println("Phone: "+msgphone);
  Serial.println("Message: "+msgbody);

  // Далее пишем логику обработки SMS-команд.
  // Здесь также можно реализовывать проверку по номеру телефона
  // И если номер некорректный, то просто удалить сообщение.
}


void sendSMS(String phone, String message)
{
  sendATCommand("AT+CMGS=\"" + phone + "\"", true);             // Переходим в режим ввода текстового сообщения
  sendATCommand(message + "\r\n" + (String)((char)26), true);   // После текста отправляем перенос строки и Ctrl+Z
}

 

Mouflon
Offline
Зарегистрирован: 17.01.2018

А если после строк

// Далее пишем логику обработки SMS-команд.
87   // Здесь также можно реализовывать проверку по номеру телефона
88   // И если номер некорректный, то просто удалить сообщение.

написать 

  
        if (msgbody == "Relay 1 ON") {
            Serial.println("Relay 1 Status Aktif");
          }
          else if (msgbody == "Relay 1 ON") >= 0) {
            Serial.println("Relay 1 Status Mati");
          }

 

 

WoinZenona
WoinZenona аватар
Offline
Зарегистрирован: 08.02.2018

 Не могу понять, почему выдает ошибку.

unsigned long taim;
void setup() {
  pinMode(13,  OUTPUT);
  pinMode(12,  OUTPUT);
  pinMode(11,  OUTPUT);
  pinMode(10,  OUTPUT);
  pinMode(9,  OUTPUT); 
  pinMode(8,  OUTPUT);
  pinMode(7,  OUTPUT);
  
  Serial.begin(9600);
}
void loop() {
  
  if(millis() - taim > 1000); {
     digitalWrite(13, HIGH);
     Serial.print("1");
     digitalWrite(10, LOW);
     taim = millis();
     
   } else if  (millis() - taim > 1000) {
     digitalWrite(12, HIGH);
     Serial.println("2");
     digitalWrite(13, LOW);
     taim = millis();
 
   } else if(millis() - taim > 1000) {
     digitalWrite(11, HIGH);
     Serial.println("3");
     digitalWrite(12, LOW);
     taim = millis();
     
   } else if(millis() - taim > 1000) {
     digitalWrite(10, HIGH);
     Serial.println("4");
     digitalWrite(11, LOW);
     taim = millis();
     
  } else if(millis() - taim > 1000) {
     digitalWrite(9, HIGH);
     Serial.println("5");
     digitalWrite(10, LOW);
     taim = millis();
  }
}
   
  
serg233
Offline
Зарегистрирован: 02.02.2016

Буду пробовать. С теми примерами не получилось. Попробуем с этим. :-)

b707
Offline
Зарегистрирован: 26.05.2017

WoinZenona пишет:

 Не могу понять, почему выдает ошибку.

Воин, не засоряйте чужую тему лишними сообщениями. Хотите задать вопрос - начните свою ветку. И, прежде чем постить - ознакомтесь с правилами вставки программного кода в сообщения

serg233
Offline
Зарегистрирован: 02.02.2016

Выдает ошибку

exit status 1

expected primary-expression before '>=' token

kalapanga
Offline
Зарегистрирован: 23.10.2016

WoinZenona пишет:

 Не могу понять, почему выдает ошибку.

У одного товарища фантазии нет, чтобы нормально тему назвать. У другого, по-видимому, ума, чтобы во-первых, не писать свои сообщения в теме, к которой они совершенно не относятся, во-вторых, чтобы вставлять код по правилам форума.

Уберите точку с запятой в строке: if(millis() - taim > 1000); {

b707
Offline
Зарегистрирован: 26.05.2017

kalapanga пишет:

Уберите точку с запятой в строке: if(millis() - taim > 1000); {

ну да, ошибка там есть. Но главная "соль" этого кода - пять одинаковых условий в последовательных If else if...

serg233
Offline
Зарегистрирован: 02.02.2016
Продолжим. Вот что пишет. 
Start!
AT
 
OK
 
AT+CMGF=1;&W
 
OK
 
+CMT: "+79183347332","","18/02/08,17:00:16+12"
Relay 1 ON
 
А "Relay 1 Status Aktif"   не выводит. 
 
b707
Offline
Зарегистрирован: 26.05.2017

serg233 пишет:

 
А "Relay 1 Status Aktif"   не выводит. 
 

ну значит у вас условие  (msgbody == "Relay 1 ON") не выполняется. Это не удивительно, в тексте СМС наверянка после Relay 1 ON идут служебные символы перевода строки.

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

Вообще, включение реле по СМС уж столько раз разобрано и тут на форуме, и в гугле - что вообще неприлично начинать на эту тему новую ветку. Зайдите в раздел "Проекты". найдите там несколько тем про GSM-сигнализации и поучитесь, как это делается.

serg233
Offline
Зарегистрирован: 02.02.2016

Ни хрена не один пример нормально не работает.

 

b707
Offline
Зарегистрирован: 26.05.2017

serg233 пишет:

Ни хрена не один пример нормально не работает.

 

ну не врите. Далеко ходить не надо - сами же написали. что пример из сообщения 12 - работает. Изучайте, как в нем из SMS извлека.тся msgbody и msgphone - и делайте так же. Ничего сложного нет.

И таких примеров - море.

serg233
Offline
Зарегистрирован: 02.02.2016

Все победил мля этот хренов вопрос. Кому интересно делается управление питанием фермы по смс а гараже. И там же сидит датчик движения , сирена и звонок на номер при тревоге. Как доделаю выложу народу для пользования.

b707
Offline
Зарегистрирован: 26.05.2017

serg233 пишет:

Как доделаю выложу народу для пользования.

лучше не надо :)

И так каждый, кто разобрался, где в коде точку с запятой стаить - уже тащит свое "творчество" в инет. Подобного Г. на ютубе - валом. А новички потом мучаются, продираясь через хавнокод :)

serg233
Offline
Зарегистрирован: 02.02.2016

Кому надо тот напишет.