Удаленный запуск китайской автономки через GSM

Всем доброго времени суток! Имеется китайская дизельная печка, она же автономный отопитель, используемая для обогрева гаража. Появилась идея реализовать удаленный запуск сего девайса через сеть GSM посредствам ардуино, sim800 и передатчика 433МГц. Печку можно запускать\останавливать, а также прибавлять\убавлять мощность как кнопками на панели, так и с помощью простого 4-х кнопочного брелка 433МГц. Итак, задумка достаточна проста - звонишь на sim800, он отвечает, переходит в режим DTMF. В этом режиме и планируется управлять печкой, например - нажимаешь 1 - печка включается, 2 - выключается и так далее. Сам разбираюсь в программировании поверхностно, но кое что умею. Итак, была найдена на просторах интернета неплохая заготовка для моего проекта от автора Виктора Кравченко. Первое с чем я столкнулся, это то, что мне не удается реализовать то, что sim800 будет отвечать только на звонки с моего номера, а не со всех подряд как в исходнике

SoftwareSerial SIM800(11, 10);                  // RX, TX

#define NASH_TELEFON "+XXXXXXXXXXX"            //  НАШ НОМЕР

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

  sendATCommand("AT", true);                    // Отправили AT для настройки скорости обмена данными
  _response = sendATCommand("AT+DDET=1", true); // Включаем DTMF
}

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\n", 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);            // ...и дублируем их в Serial с пометкой ">"
    // Теперь с данными можно работать
    if (_response.startsWith("+DTMF:")) {       // Если ответ начинается с "+DTMF:" тогда:
      // Парсим полученный ответ...
      // Мы знаем, что после этой команды будет пробел и один символ (нажатая клавиша),
      // а значит можно сразу его "выдергивать":
      String symbol = _response.substring(7, 8); // Выдергиваем символ с 7 позиции длиной 1 (по 8)
      Serial.println("Key: " + symbol);

      // Добавляем логику для полученных символов
      //if (symbol=="") {
      // ...
      //  }
    }
    else if (_response.startsWith("RING")) {    // При входящем звонке...
      if (SIM800.find(NASH_TELEFON)) {
      sendATCommand("ATA", true);               // ...отвечаем (поднимаем трубку)
    }
    }
  }
  if (Serial.available())  {                    // Ожидаем команды по Serial...
    SIM800.write(Serial.read());                // ...и отправляем полученную команду модему
  };
}

Мною в код были добавлены строки 3 и 62, но ничего у меня не получилось, вызов идет, в мониторе порта я вижу что идет на sim800 вызов с моего номера телефона, но sim800 трубку брать не хочет))) Попутно еще могу хочу сказать, что планирую в этот проект добавить плеер DFPlayer Mini, чтоб создать некое голосовое меню, а также датчик температуры и влажности AHT10, данные с него будут выводится на TM1637,чтоб видеть температуру в гараже в реальном времени, когда ты в нем находишься, а также эти данные можно получить по смс удаленно. Заранее спасибо за помощь.

Дак спрашивать то надо, я думаю, у Виктора Кравченко, код-то его.

Навскидку - вы начинаете искать номер телефона в SIM800 но не считали ли вы его уже ранее в переменную _response?

Через СМС удобнее ИМХО. Никаких лишних примочек не нужно, набрал в телефоне команду - можно еще и ответ СМСом сделать, результат чтобы видеть. Но дело хозяйское.

СМС денег стоит, да и у многих операторов в договоре указано, что они гарантируют доставку смс в течение 24 часов (. Сегодня смс ходят практически онлайн, но может что-то всегда пойти не так)). С дтмф можно уложиться в бесплатный звонок у любого опсоса в 3 секунды. Так что я бы тоже выбрал дтмф. Когдато давно реализовывал такую управляйку. Модем Программно поднимал и опускал трубку на 3 ссекунды. Если звонящий не успевал набрать нужную цифру, значит по новой дозванивался. У меня на открытие шлагбаумов и калиток работала (до сих пор пашет) данная система. За использование номера 0 рублей в месяц (но один платный звонок на 5 секунд с номера раз в полгода приходится делать программно, а то опсос просит потом денег))) . А звонков входящих идёт порядка 500-800 в день, и люди не жаловались что у них снимают деньги за исходящие звонки на данный номер.

до трёх секунд не обсчитывает тариф?

считает, но как бы и плевать, минут, включенных в абонентскую плату хватает, все равно все не трачу

я тут рассказывал, что у меня с мая идут СМСки каждый час, сейчас включил раз в 4 часа - батарейку экономить. Конкретно за это время пропало нуу штук 5 СМС может. Если делать с ответом СМСкой то сразу видишь - сработало или нет. Я бы не заморачивался этой хней с тоновыми командами. Ну дело хозяйское.

Да, это правило прописано в лицензии у опсосов. У всех 3 секунды не тарифицируется. Помню начало развитие сотовой связи в России. Когда минута разговора стоила 5 рублей поминутной тарификации, все SMS были бесплатные, и 10 секунд разговора тоже не тарифицировались. Так вот в эти 10 секунд, люди укладывались типа ты где?

1 лайк

Вообще перечитал и согласен, для такого применения это неплохо. Хотя и СМС сейчас обычно включены в тарифы тех, кто их будет отправлять. Хотя… на столе когда отлаживал - да, СМСки приходят не мгновенно, если это ворота то ждать 30 сек уже напрягает.

Взял на заметку: тем более что дтмф оказывается сам sim800 определяет, думал процессором вручную)) придется.

Делал в начале года родственнику на дизельное авто подобное. Сначала он хотел на СМС, потом сделали на MQTT BLYNK, остановились на ДТМФ - самое удобное. Тариф без абонплаты. Скопирую с др. сайта часть поста
Что умеет ус-во:
Охранные функции 3 зоны.
Принимает звонок только от номера в белом списке.
Исходящий звонок при срабатывании(несанкц. открытии двери), при звонке говорит “Тревога, открыта дверь!”
После ответа на вх. звонок уведомляет о состоянии Вебасто - “Вебасто выключено” или “Вебасто работает”
При нажатии 6 включает реле(подает питание на котел и помпу) и говорит - “Запуск Вебасто”
При нажатии 3 сообщает о напряжении на вхоже ус-ва - например, “12 и 5 вольт”, измерение напр-я только по запросу(нажатие 3 во время звонка на ус-во)
При нажатии 7 во время текущего звонка сообщает состояние Вебасто - “Вебасто выключено” или “Вебасто работает”
При нажатии 8 сообщает температуру - “15” или “Минус 8” и тп

Для этого были изготовлены звуковые файлы в формате AMR, загружены в модуль SIM900A - температура от -30 до 50, вольты от 10.5 до 12.9.

Изменения - ус-во сделано на китайском LGT аналог Про Мини и SIM800L красный, вольты до 14,5 кажется.

Легко можно обойтись безо всяких плееров, себестоимость вышла около 600 р (основное - 153 р сим800, 90 р ардуина-ЛГТ, ок. 30 р плата питания, по 40 р 2 реле), без учета мелочевки типа проводков, двух тублеров включения(питание общее и на SIM800 отдельно) и тд.

В этом модуле есть большой флеш или ЕЕПРОМ для загрузки файлов?

ценники выглядят как 10-летней давности… может я чего не знаю?..

Всё покупалось на Али год назад - ноябрь декабрь, все цены в ЛК есть, если что)

занимался этим всем прошлой зимой, что, цены сильно выросли? почему такое удивление?

1 лайк

нет, файлы маленькие, по 2-4 КИЛОбайта(конечно же))), и поместилось не помню точно, но десятки файликов.

SIM800 как-то совсем дешевым показался, я не в смысле не верю, просто очень удивился. Год назад это как-бы небольшой срок. Ну да ладно.

упд. СИМ800 и сейчас на Али не слишком дорог, сорри, видимо с чем-то спутал. Казалось он под 500руп ))

Спасибо, тоже смотрю в сторону избавления от плеера, много с ним гемора, как оказывается. Проблему, которую я описывал в этом посте, а именно прием звонка только с моего номера я решил, но появилась другая, а именно при нажатии определённой кнопки в DTMF радиомодуль 433МГц не совсем корректно отрабатывает. Ладно, этот момент завтра попытаюсь порешать, если не получится, спрошу помощи здесь на форуме

У меня была подобная проблема, ДТМФ распознавался нечетко. Причиной оказался телефон, кнопочный Нокиа четко, а смарт Редми через раз.

в монитор порта ответ с нажатой кнопкой приходит, то есть, команда на работу передатчика должна быть, однако приемник (в моем случае печка), не реагирует

[quote=“ПавеJI, post:1, topic:15673”]
Печку можно запускать\останавливать, а также прибавлять\убавлять мощность как кнопками на панели
[/quote] - может быть, проще было бы сделать дист. запуск именно через кнопки, параллельный? На машине мы так и поступили - вебаста и насос включались кнопками, сделали параллельно через простейшие 1n4007 включение одновременно котла и насоса охл.ж-ти.