Всем доброго времени суток! Имеется китайская дизельная печка, она же автономный отопитель, используемая для обогрева гаража. Появилась идея реализовать удаленный запуск сего девайса через сеть 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,чтоб видеть температуру в гараже в реальном времени, когда ты в нем находишься, а также эти данные можно получить по смс удаленно. Заранее спасибо за помощь.