Официальный сайт компании Arduino по адресу arduino.cc
Отправка СМС на звонк
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Ср, 02/12/2020 - 15:07
Всем привет. Есть задача отправлять СМС сообщение с показаниями датчика абоненту. Написан код работает он след образом счит показания датчика, если абонент звонит, то скидывается звонок и в ответ GSM модуль отсылает СМС на ФИКСИРОВАННЫЙ номер (кот прописан в коде). Что дописать в программе чтобы не было привязки к ФИКСИРОВАННОМУ номеру, а можно было звонить с ЛЮБОГО номера и в ответ приходила на него же СМС ?
// вывод данных на gsm #include <TroykaMQ.h> #include <Thread.h> #include <SoftwareSerial.h> #define analogMQ7 A0 // Пин к которому подключен датчик (A0) #define PIN_MQ7_HEATER 13 //Пин к которому подключен нагреватель MQ7 mq7(analogMQ7); int ch ; String val = ""; int highLevel = 2; // значение выше 2 ppm int val_2; SoftwareSerial SIM800(10, 11); // Выводы SIM800L Tx & Rx подключены к выводам Arduino 3 и 2 //////////////////////////////////////// void setup() { Serial.begin (9600); SIM800.begin(9600); // Скорость обмена данными с модемом SIM800.println("AT"); SIM800.println("AT+CLIP=1"); //включаем АОН delay(100); SIM800.println("AT+CMGF=1"); //режим кодировки СМС - обычный (для англ.) delay(100); SIM800.println("AT+CSCS=\"GSM\""); //режим кодировки текста delay(100); } void loop() { if (!mq7.isCalibrated() && mq7.atHeatCycleEnd()) { mq7.calibrate();// выполняем калибровку датчика на чистом воздухе } if (mq7.isCalibrated() && mq7.atHeatCycleEnd()) { mq7.cycleHeat(); // запускаем термоцикл } val_2 = mq7.readCarbonMonoxide(); { updateSerial(); } } void updateSerial() { if (SIM800.available()) { //если GSM модуль что-то послал нам, то while (SIM800.available()) { //сохраняем входную строку в переменную val ch = SIM800.read(); val += char(ch); delay(10); } if (val.indexOf("RING") > -1) { //если звонок обнаружен, то проверяем номер if (val.indexOf("79671890898") > -1)//если номер звонящего наш, то далее разрываем связь { SIM800.println("ATH0"); //разрываем связь SIM800.println("AT+CMGF=1"); // Выбирает (переводим) в формат SMS updateSerial(); SIM800.println("AT+CMGS=\"+79671890898\""); // Отправка СМС на указанный номер updateSerial(); if (val_2 >= highLevel){ Serial.println("SMS send started"); delay(500); SIM800.print("CO(gas) = "); SIM800.print(mq7.readCarbonMonoxide()); // Тест сообщения SIM800.println(" ppm"); SIM800.print("Dander"); delay(500); SIM800.write(26); Serial.println("SMS send complete"); delay(2000); } else { Serial.println("SMS send started"); delay(500); SIM800.print("CO(gas) = "); SIM800.print(mq7.readCarbonMonoxide()); // Тест сообщения SIM800.println(" ppm"); SIM800.print("Safely"); //отправляем СМС на номер delay(500); SIM800.write(26); Serial.println("SMS send complete"); delay(2000); } }} else Serial.println(val); //печатаем в монитор порта пришедшую строку val = ""; } }
А вот и РАБОТАЮЩИЙ
55я и 60я строка ни на какие мысли не наводят?
Вот в этой теме работает с любым телефоном и ТС интересовался как сделать, чтобы как у Вас - только с одним. Посмотрите, может получится скрестить его скетч с Вашим.
55я и 60я строка ни на какие мысли не наводят?
Допустим... Просветите, если не затруднит Вас
55я и 60я строка ни на какие мысли не наводят?
Допустим... Просветите, если не затруднит Вас
Это Вы просветите на какие именно мысли они Вас навели, если не затруднит Вас.
В строке 53 распечатайте в терминал принятую строку от модема ( val ) , будет понятнее что нужно делать .
В строке 53 распечатайте в терминал принятую строку от модема ( val ) , будет понятнее что нужно делать .
вы имеете ввиду, так ?
Как я понимаю по алгоритму нужно определить номер, считать его из строки данных, присвоить ему переменную и в отправке смс место номера ставить эту переменнную? Или можно другим способом?
Как я понимаю по алгоритму нужно определить номер, считать его из строки данных, присвоить ему переменную и в отправке смс место номера ставить эту переменнную? Или можно другим способом?
Не правильно. Нужно так .
определить номер, считать его из строки данных в переменную и в отправке смс место номера ставить эту переменнную
Причем определять номер не нужно. Он у вас сам определиться.
А это реальный номер телефона в скетче ? И бомба еще не прилетела ???
Откуда? Кто тут обитает, типа меня, этим не интересуются. Ну если только позже Гугл в выдаче покажет.
Считывать номер из строки данных val через оператор - val.indexOf( )? Если так, то как указать корректно в скобках диапазон поиска номера из строки val ?
Ищи в строке RING сначала, а потом, если нашёл, ищи дальше "+7". И пока следующие символы - цифры, то собирай из них телефонный номер.
Ищи в строке RING сначала, а потом, если нашёл, ищи дальше "+7". И пока следующие символы - цифры, то собирай из них телефонный номер.
"+7" Искать отдельно ?
Как искать эти остальные цифры, ведь они же разные? Т.к. задача отправлять на любой номер СМС
зачитай чонить за isdigit(int);
"+7" Искать отдельно ?
Как искать эти остальные цифры, ведь они же разные? Т.к. задача отправлять на любой номер СМС
Следующие за +7 десять цифр - это и есть номер
Просили же выложит значение val ?!
Мы что экстрасексы ? ХЗ как там шлет модуль номер телефона ...
Как искать эти остальные цифры, ведь они же разные?
Найду номер телефона в строке с разными арабскими цифрами всево за пицот рублей.
+7 ... а если кто из за бугра позвонит ? Останется без СМС ?
+7 ... а если кто из за бугра позвонит ? Останется без СМС ?
Зато деньги сэкономит - за бугор эсэмэски дорого стоят )))
Кстати, мы вот тут прикалываемся, а никто ж не спросил, откуда ТС? Может он и не из РФ - тогда там вовсе не +7 будет ))
Кстати, мы вот тут прикалываемся, а никто ж не спросил, откуда ТС? Может он и не из РФ - тогда там вовсе не +7 будет ))
В исходном сообщении темы "+7..."
Сомневаюсь я, что это его код, скорее всего где-то скопирован ))
В данном случае это не важно. В примере, выложенном ТС, +7 и обсуждается именно +7. А если ТС это вдруг не подходит, это его проблемы.
Смотрю здесь одни прикалисты, а не программисты!
Ну, если советы по делу не принимаются, остается только прикалываться ))
Умник чего ты по делу написал?!?! иди в другом месте стебись!
Сообщение #16. Собственно, это вполне очевидное решение, а разбор строк с поиском нужной подстроки - это вообще детская задача. А ты ждал, что я тебе готовый код предложу? Так это платная услуга ;)
Сообщение #16. Собственно, это вполне очевидное решение, а разбор строк с поиском нужной подстроки - это вообще детская задача. А ты ждал, что я тебе готовый код предложу? Так это платная услуга ;)
То что ты мне предложил я и без тебя знал.
То что ты мне предложил я и без тебя знал.
Т.е. для тебя проблема считать десять символов, начиная с определенной позиции? Тогда забей, этот проект тебе не по зубам. По крайней мере пока ;)
Умник-приколист, свое мнение при себе держи!
А это не только его мнение. Оно общее.
Да, это Вы, батенька - приколист. На вопросы Вы не отвечаете (я Вам в #5 задал, ответа не получил, ну, и отстал от Вас), работать не желаете, только требуете чего-то.
Я вот за всю тему так и не понял чего Вам нужно-то и почему оно у Вас не получается. Вы можете внятно объяснить, что Вы хотите сделать, что пытались и в чём загвоздка?
вот строка с модема val:
Ну. Можешь в этой строке "+7" найти?
вот строка с модема val:
и что? Сначала ищешь в ответе "+CLIP:" , если нашел - то далее пропускаешь все символы до +?. а после него - считываешь 10 символов. это твой номер.
и выше это уже обьяснили не раз, что еще нужно то?
Я бы искал " и потом все символы до след " ...
Я бы искал " и потом все символы до след " - один символ искать ЛЮТО быстрее !
ну можно много что искать, настройка шаблонов поиска - процесс итерационный :)
Найти двоеточие, потом чапать до запятой, пропуская пробелы и кавычки, попутно перенося символы в char[]. На выходе - готовый телефонный нумбер. По желанию приправить проверкой на недопустимые символы и длину номера.
Вангую что ТС сразу с модемом пробовать начнёт. Подсказка ТСу . сделай маленький тестовый скетч. Назначь переменную Стринг со строкой , которую ты сюда выложил и парси номер в переменную char []. Потом распечатай эту char[] в терминал , узнаешь при этом правильно ли запарсил
вангую, что следущим постом мы увидим вопросы:
- как назанчить val в строку?
- как распечатать char[] в терминал?
Товарищ полностью нулевый. походу...
Здесь видно большая часть это одни неудачники-программисты, которые ничего не могут, кроме как судить, прикалываться, писать ни о чем, когда люди за подсказкой к ним обращаются.
ТЕМА ЗАКРЫТА!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Здесь видно большая часть это одни неудачники-программисты, которые ничего не могут, кроме как судить, прикалываться, писать ни о чем, когда люди за подсказкой к ним обращаются.
ТЕМА ЗАКРЫТА!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Pavel_1282, вот Вы сами, без помощи МК собственными глазками и ручками можете найти номер телефона в строке?
Просто Паша думал, он ношкой топнет, и ему неудачники-программисты сразу парсер напишут. Не прокатило, надо самому трудица. Пошёл клянчить код на другой форум
Здесь видно большая часть это одни неудачники-программисты, которые ничего не могут, кроме как судить, прикалываться, писать ни о чем
Так и есть! Вам не повезло с форумом, его участниками, страной и человечеством. Сочувствую!
Фига себе, он тут с 12 года !!!! Аж восемь лет !
Макс, судя по другим форумам - он, между прочим, твой коллега - авто-электрик :)