Есть датчик влажности, на схеме он заменен резистором. Когда на нем значение более 500, arduino (будет pro mini) даст команду gsm модулю, и тот позвонит на указанный телефон. Будет ли сие работать, что нужно допилить? И что при этом делать с выводом 19 (on/off) Код (C++): const int analogPin = A0; #include <SoftwareSerial.h> SoftwareSerial gsm(7, 8); // RX, TX void setup() { Serial.begin(9600); gsm.begin(9600); pinMode(6, INPUT_PULLUP); } void loop() { int analogValue = analogRead(analogPin); // Задаем переменную analogValue для считывания показаний // Подобрать необходимый порог значений вашего датчика if (analogValue<500) // Если значение на аналоговом входе < 500 { // Выполняем действие digitalWrite(6, LOW); // Выключаем светодиод } else // В ином случае (если значения на аналоговом входе > 500) { // Выполняем действие digitalWrite(6, HIGH); // Включаем светодиод while(1){ // проверяем готовность модема gsm.println("AT+CPAS"); if (gsm.find("0")) break; delay(100); } gsm.println("ATD+70000000000;"); // звоним по указаному номеру delay(100); if (gsm.find("OK")) Serial.println("OK!"); else Serial.println("error"); } }
По подключению, если у Вас голый чип, то TX с Arduino не стоит отправлять на RX модуля из-за разности питания, RX Arduino с TX модуля можно (хоть я люблю работать через Logic Level Converter в обе стороны). Вначале на землю, земля общая, не получится тогда по мануалу, посылаем 0 на ногу 19 (on/off) в течении 0,5секунд, затем возвращаем 1. Так же напрямую подключать не стоит, данная нога не выдержит 5V с Arduino. Вроде бы код, как в примерах. Да при одном условии, что по умолчанию данный экземпляр работает со скоростью 9600. Почитайте ветку, от сюда - http://forum.amperka.ru/threads/sms-модуль.5658/page-2#post-48519. Есть варианты на 19200, 56700 и т.д. Тогда перед этим лучше запрограммировать на скорость 9600 с помощью AT команд. По AT командам, есть хорошее описание - http://arduinolab.pw/wp-content/uploads/2015/12/Neoway-M590-AT-Command-Sets_V3.0.pdf.
Все переделал, ничего не получается. Отключил резистор, светодиод, закачал голый скетч. Начал пробовать подавать команды - на скорости 9600 на любую команду отвечает GSM tester v1.0. На скорости 19200 какие то кракозябры пишет
еще какой то скетч залил, воткнул boot в 5 ногу контроллера, начал писать: ATE0 AT+COPS? (бесконечно) а если переключаю на 19200 - кракозябры
Что у Вас за код, что он на любую команду AT отвечает GSM tester v1.0. Такого не скидывал, а у модуля M590, таких ответов нет. Что-то выглядит очень странно, больше похоже на то, что Вы отправляете команды не на тот Serial. Давайте упростим, уберем пока Arduino, а возьмем UART-TTL, меньше вероятности ошибиться. Напомню, как подключить, если UART-TTL с переключателем 5V или 3,3V. Если 5V, то просто подключаем как Arduino Подключаем USB-TT к компу, дальше как на этом видео - с 6:30 там настройки и перебираем скорость от 9600 до 115200, он должен ответить на команду AT. Если не ответит, что проблема в подключении, питании или еще чего. Как уже говорил, с данным модулем не работал, вычитал из форумов, статей. Но если он не отвечает через терминал, то дальше идти нет смысла. Работа, дела и т.д.
Либо что-то подключено не так, либо он умер (был мертвым). Перепроверьте еще раз, каких-то других идей не подскажу, нет опыта общения с ним. Если ни чего не получится, почитайте данную тему - http://forum.amperka.ru/threads/sms-модуль.5658/page-2 и купите как ребята с обвязкой, а не голый чип. К примеру такой UPD. Проверьте он питание кушает и как ведет себе пин Led, может есть смысл подключить к нему светодиод.
В общем нашел все же рабочий (третий) модуль, соединил 2 кода, немного подправил, заработало. Но все же посмотрите, как время будет, все ли правильно я написал. И вот еще вопрос, можно ли ставить на охрану с телефона, а также с телефона СМСкой вписывать в код номер телефона на который будет звонить сигнализация. Код (C++): const int analogPin = A0; // соедщнил с землей через резистор на 15 кОм #include <SoftwareSerial.h> SoftwareSerial gsm(7, 8); // RX, TX void modemOFF(){ digitalWrite(5, HIGH); delay(10); gsm.println("AT+CPWROFF"); } void modemON(){ digitalWrite(5, LOW); delay(10); while(!gsm.find("+PBREADY")); } void setup(){ Serial.begin(9600); gsm.begin(9600); /// незабываем указать скорость работы UART модема pinMode(5, OUTPUT); /// нога BOOT на модеме /*pinMode(2, OUTPUT); /// нога на растяжку*/ digitalWrite(5, LOW); /// включаем модем, для проверки. /// !!! при подачи питания, нужно надавить на ресет ардуины, /// !!! модем при включении может просадить питание и ардуина не стартанет while(!gsm.find("+PBREADY")); /// при включении ждем готовность модема modemOFF(); /// и выключаем модем } void loop() { int analogValue = analogRead(analogPin); // Задаем переменную analogValue для считывания показаний // Подобрать необходимый порог значений вашего датчика if (analogValue<490) // Если значение на аналоговом входе < 490 { // Выполняем действие digitalWrite(13, LOW); // Выключаем светодиод } else // В ином случае (если значения на аналоговом входе > 490) { // Выполняем действие digitalWrite(13, HIGH); // Включаем светодиод modemON(); /// включаем модема while(1){ // ждем подключение модема к сети gsm.println("AT+COPS?"); if (gsm.find("0")) break; delay(500); } /////////////////////// звоним по указаному номеру gsm.println("ATD+79137602230;"); delay(100); if (gsm.find("OK")) Serial.println("ATD+OK!"); while(1){ // проверяем готовность модема, ждем сброс вызова gsm.println("AT+CPAS"); if (gsm.find("0")) break; delay(100); } /////////////////// и\или отправляем SMS /* gsm.println("AT+CMGF=1"); delay(100); gsm.println("AT+CSCS=\"GSM\""); delay(100); gsm.println("AT+CMGS=\"79991112233\""); // даем команду на отправку смс delay(100); gsm.print("111"); // отправляем текст gsm.print((char)26); // символ завершающий передачу Serial.println("SMS ok"); delay(100); while(1){ // проверяем готовность модема gsm.println("AT+CPAS"); if (gsm.find("0")) break; delay(100); } */ delay(10000); Serial.println("FULL_OFF!"); modemOFF(); /// выключаем модем, while(1); /// останавливаем прогу } if (gsm.available()) Serial.write(gsm.read()); if (Serial.available()) gsm.write(Serial.read()); } ///+PBREADY
Рад, что у Вас получилось, по командам не подскажу, смотрите документацию. Вечный цикл, без шанса для выхода, Вы точно хотите этого? Код (C++): while(1); /// останавливаем прогу Чтобы прервать его, потребуется перегрузить питание Arduino или нажать Reset на Arduino. Дальше скорее стиль и подход, который не стоит переносить в конечное устройство. Говорю о delay в loop, множество циклов while, которые будут прерваны лишь при положительном ответе, нет поддержки ошибок. Да можно, модуль позволяет читать СМС. Вы читаете в СМС команду на включении охраны и номер на который будет звонить сигнализация.
Другие коды у меня не заработали. По поводу while(1); Это мне кажется подходит в моем случае, если не остановить - будут бесконечные звонки. После срабатывания, нужно идти на место и принимать меры, а затем восстанавливать сигнализацию. Но тут проблема, сигнализация может находиться на большой высоте, Reset не нажмешь, не удобно. Поэтому заказал брелок 4-канальный, буду с брелка сбрасывать. Заодно, чтобы кнопки не пустовали, хочу назначить им постановку и снятие сигнализации. Подозреваю, что логической единицы на выходе приемника не будет, поэтому хочу сделать по типу датчика - если >500, то... и т.д. Но в редких случаях, наверное, нужно сбросить удаленно, поэтому буду искать выход (вывод) на модуле, который по команде мог бы послать сигнал на "Reset" arduino. Жалко, что нет времени заняться этим с азов, но обязательно к этому вернусь - интересно. Вам же огромное спасибо за поддержку, если будет время и желание, вышлите свой вариант.
Извините, зарылся на работе, проблемы с оборудованием, и как на зло, ни каких схем. Да, но все равно такое решение, но такое решение меня расстраивает. Представим, что сигнализация сработала, почему бы вместо бесконечных звонков, в дальнейшем подцепить GPS и слать каждую минуту информацию о положении и т.д.. Да и бросить проще, особенно когда произошел сбой. Не очень понимаю, зачем вообще брело, когда Вы можете отправлять СМС c телефона с разными командами. Вот поэтому лучше уходить от остановки контролера. Мы все учимся, по мере необходимости. Не за что, тут все помогаю по мере сил (времени, знаний). На выходных попробую сделать и скинуть свой вариант кода.
Рекомендую M590 питать не от Ардуино, так как модуль очень прожорлив, особенно во время соединения с сетью.
Интересен тот факт, что менее прожорливый arduino не имеет своего источника питания... А о потреблении neowey 590 только самый ленивый не пишет
Не от ардуино он работал, а от Вашего блока питания в компьютере, например, ну или от чего Вы там запитали свой ардуино