GSM сигналка c установкой по звонку M590E GSM GPRS Модул
- Войдите на сайт для отправки комментариев
Вс, 24/07/2016 - 11:50
Здравствуйте. Помогите пожалуйста прикрутить к скечу датчик движения HC-SR505? Пробовал подключать его к цифровому выходу, но сразу после загрузки скетча происходил дозвон на телефон. В скетче менял аналоговый выход на цыфровой.
/// GSM сигналка c установкой по звонку
/// датчиком на прерывателях
#include <EEPROM.h>
//// как подключен модем?
//#include <SoftwareSerial.h> // если программный
//SoftwareSerial gsm(7, 8); // RX, TX
#define gsm Serial // если аппаратный в UNO
//#define gsm Serial1 // если аппаратный в леонардо
#define LED 6
#define TELLNUMBER "ATD+79089000682;" // номен на который будем звонить
#define SMSNUMBER "AT+CMGS=\"79089000682\"" // номер на который будем отправлять SMS
#define TELMODE "79089000682" // номер для установки на охрану
#define SH1 A2 // шлейыф
//#define SH2 A3
#define pinBOOT 5 // нога BOOT или K на модеме
byte mode = 0; // 0 - только включили
// 1 - установлена охрана
// 2 - снята с охраны
// при добавлении не забываем посмотреть на 41 строку
void setup() {
delay(3000); //// !! чтобы нечего не повисало при включении
gsm.begin(9600); /// незабываем указать скорость работы UART модема
// Serial.begin(9600);
pinMode(LED, OUTPUT);
pinMode(pinBOOT, OUTPUT); /// нога BOOT на модеме
pinMode(SH1, INPUT_PULLUP); /// нога на растяжку
// pinMode(SH2, INPUT_PULLUP); /// нога на растяжку
// читаем режим из еепром
mode = EEPROM.read(0);
if (mode > 2) mode = 2; // проверяем значение в еепром
// занимаемся модемом
delay(1000);
digitalWrite(LED, HIGH); // на время включаем лед
digitalWrite(pinBOOT, LOW); /// включаем модем
// нужно дождатся включения модема и соединения с сетью
delay(2000);
// while(gsm.find("STARTUP")); /// ждем команды от модема
gsm.println("ATE0"); // выключаем эхо
while(1){ // ждем подключение модема к сети
gsm.println("AT+COPS?");
if (gsm.find("+COPS: 0")) break;
digitalWrite(LED, LOW); // блымаем светодиодом
delay(50);
digitalWrite(LED, HIGH);
delay(500);
}
//Serial.println("Modem OK");
digitalWrite(LED, LOW); // блымаем светодиодом
delay(1500);
digitalWrite(LED, HIGH);
delay(250);
digitalWrite(LED, LOW);
}
void loop() {
if (mode == 1){ // если в режиме охраны
// проверяем датчики
if (digitalRead(SH1)){ // если обрыв
// отзваниваемся
gsm.println(TELLNUMBER);
delay(2500);
if (gsm.find("NO CARRIER")){ // ищим сброс вызова,
// снимаем охранку
mode = 2;
EEPROM.write(0, mode);
}
}
}
// если охрана снята
if (mode == 2){
if (digitalRead(SH1)){ // проверяем датчики, включаем LED
digitalWrite(LED, HIGH);
}
else digitalWrite(LED, LOW);
}
// ищим RING
// если нашли, опрашиваем кто это и ставим на охрану
if(gsm.find("RING")){ // если нашли RING
gsm.println("AT+CLIP=1"); // включаем АОН,
while(1){ // в цикле
if (gsm.find(TELMODE)){ // ищим номер телефона, если нашли
mode = 1; // меняем режим
EEPROM.write(0, mode); // пишим его в еепром
break; // и выходим
}
else{ // иначе
gsm.println("AT+CPAS"); // спрашиваем состояние модема
delay(100);
if (gsm.find("+CPAS: 0")) break; // и если он в "готовности", выходим из цикла
} // если звонок в процессе, возвращает +CPAS: 3
} // и крутимся дальше
gsm.println("AT+CLIP=0"); // выключаем АОН,
delay(500);
gsm.println("ATH0"); // сбрасываем вызов
digitalWrite(LED, LOW); // сигнализируем об этом
delay(500);
digitalWrite(LED, HIGH);
delay(250);
digitalWrite(LED, LOW);
}
}
но сразу после загрузки скетча происходил дозвон на телефон. В скетче менял аналоговый выход на цыфровой.
1. В то место скетча, где принимается решение начать дозвон, добавьте условие
&& millis() > 60000 // то есть, например, в первую минуту после начала работы не звонить.
2. Аналоговый, или цифровой - в данном случае не имеет значения,.
Возможно и даже наверняка, я кусок вашего кода не в то место вставляю, после загрузки совершается сразу дозвон.
void loop() { if (mode == 1){ // если в режиме охраны // проверяем датчики if (digitalRead(SH1) && millis() > 60000){ // если обрыв // отзваниваемся gsm.println(TELLNUMBER); delay(2500); if (gsm.find("NO CARRIER")){ // ищим сброс вызова, // снимаем охранку mode = 2; EEPROM.write(0, mode); } } }И так тоже уже попробовал
void loop() { if (mode == 1&& millis() > 60000){ // если в режиме охраны // проверяем датчики if (digitalRead(SH1)){ // если обрыв // отзваниваемся gsm.println(TELLNUMBER); delay(2500); if (gsm.find("NO CARRIER")){ // ищим сброс вызова, // снимаем охранку mode = 2; EEPROM.write(0, mode); } } }с модулями типа m590 я бы все-таки подождал от модуля +PBREADY, раз уж есть нога, ответственная за включение и выключение оного (pinboot), прежде чем начинать его пытать.
Увеличил задержку для включения модуля до 1 минуты
digitalWrite(LED, HIGH); // на время включаем лед digitalWrite(pinBOOT, LOW); /// включаем модем // нужно дождатся включения модема и соединения с сетью delay(60000); // while(gsm.find("STARTUP")); /// ждем команды от модема gsm.println("ATE0"); // выключаем эхоВсе равно, после постановки на охрану модуль сразу же отзванивается
bester, второй строкой Вы включили модем и просто ждете 60 секунд, да еще и с помощью delay()
хотя бы просто АТ ему скормите да проверьте, ответил он "OK" или занят какими-то своими делами
В первом сообщении скетч работает, я просто хочу еще подключить датчик движения, но при этом не знаю как изменить скетч, знаний не достаточно, если вместо растяжки и А2 подключаю датчик, после моего звонка на модуль включаутся охрана и модуль сразу же начинает мне отзваниватся, как будто замечено движение, с растяжкой же на А2, скетч работает нормально, отзванивается только когда растяжка повреждена.
Без постановки на охрану, датчик работает(когда замечено движение светодиод загорается)
а есть необходимость именно аналоговый вывод садить на контроль шлейфа, цифровых ног недостаточно?
кстати в даташите на датчик тоже указано, что подключать его нужно на цифровой вход
Ну можно конечно и на цифровые, дело то не в этом, при замене шлейфа на датчик движения при постановке на охрану она сразу же срабатывает и отзванивается
в даташите, на датчик есть пример его правильного подключения - цифровой вход должен иметь низкий уровень, а Вы его присоединяете к ноге, которую сделали input_pullup
void setup() { Serial.begin(9600); pinMode(6,INPUT); digitalWrite(6,LOW); } void loop() { if(digitalRead(6)==HIGH) { Serial.println("Somebody is here."); } else { Serial.println("Nobody."); } delay(1000); }строка 3 примера - ногу 6 делаем входом
строка 4 - выставляем на ней низкий уровень
9 - если на входе появляется высокий уровень
10 - значит супостат тут
Сделал так, все равно после постановки на охрану модуль сразу начинает отзваниваться. Строки 37,38,76
/// GSM сигналка c установкой по звонку /// датчиком на прерывателях #include <EEPROM.h> //// как подключен модем? //#include <SoftwareSerial.h> // если программный //SoftwareSerial gsm(7, 8); // RX, TX #define gsm Serial // если аппаратный в UNO //#define gsm Serial1 // если аппаратный в леонардо #define LED 6 #define TELLNUMBER "ATD+79089000682;" // номен на который будем звонить #define SMSNUMBER "AT+CMGS=\"79089000682\"" // номер на который будем отправлять SMS #define TELMODE "79089000682" // номер для установки на охрану #define SH1 7 // шлейыф //#define SH2 A3 #define pinBOOT 5 // нога BOOT или K на модеме byte mode = 0; // 0 - только включили // 1 - установлена охрана // 2 - снята с охраны // при добавлении не забываем посмотреть на 41 строку void setup() { delay(3000); //// !! чтобы нечего не повисало при включении gsm.begin(9600); /// незабываем указать скорость работы UART модема // Serial.begin(9600); pinMode(LED, OUTPUT); pinMode(pinBOOT, OUTPUT); /// нога BOOT на модеме pinMode(SH1, INPUT); /// нога на растяжку digitalWrite(SH1,LOW); // pinMode(SH2, INPUT_PULLUP); /// нога на растяжку // читаем режим из еепром mode = EEPROM.read(0); if (mode > 2) mode = 2; // проверяем значение в еепром // занимаемся модемом delay(1000); digitalWrite(LED, HIGH); // на время включаем лед digitalWrite(pinBOOT, LOW); /// включаем модем // нужно дождатся включения модема и соединения с сетью delay(2000); // while(gsm.find("STARTUP")); /// ждем команды от модема gsm.println("ATE0"); // выключаем эхо while(1){ // ждем подключение модема к сети gsm.println("AT+COPS?"); if (gsm.find("+COPS: 0")) break; digitalWrite(LED, LOW); // блымаем светодиодом delay(50); digitalWrite(LED, HIGH); delay(500); } //Serial.println("Modem OK"); digitalWrite(LED, LOW); // блымаем светодиодом delay(1500); digitalWrite(LED, HIGH); delay(250); digitalWrite(LED, LOW); } void loop() { if (mode == 1){ // если в режиме охраны // проверяем датчики if (digitalRead(SH1)==HIGH){ // если обрыв // отзваниваемся gsm.println(TELLNUMBER); delay(2500); if (gsm.find("NO CARRIER")){ // ищим сброс вызова, // снимаем охранку mode = 2; EEPROM.write(0, mode); } } } // если охрана снята if (mode == 2){ if (digitalRead(SH1)){ // проверяем датчики, включаем LED digitalWrite(LED, HIGH); } else digitalWrite(LED, LOW); } // ищим RING // если нашли, опрашиваем кто это и ставим на охрану if(gsm.find("RING")){ // если нашли RING gsm.println("AT+CLIP=1"); // включаем АОН, while(1){ // в цикле if (gsm.find(TELMODE)){ // ищим номер телефона, если нашли mode = 1; // меняем режим EEPROM.write(0, mode); // пишим его в еепром break; // и выходим } else{ // иначе gsm.println("AT+CPAS"); // спрашиваем состояние модема delay(100); if (gsm.find("+CPAS: 0")) break; // и если он в "готовности", выходим из цикла } // если звонок в процессе, возвращает +CPAS: 3 } // и крутимся дальше gsm.println("AT+CLIP=0"); // выключаем АОН, delay(500); gsm.println("ATH0"); // сбрасываем вызов digitalWrite(LED, LOW); // сигнализируем об этом delay(500); digitalWrite(LED, HIGH); delay(250); digitalWrite(LED, LOW); } }а может все-таки перевесите m590 на softwareserial, чтобы иметь возможность в мониторе читать диагностику?
ну и, заодно, точка с запятой после номера в TELLNUMBER какую функцию сполняет?
На NANO к каким выходам тогда подключиться? Раскоментировал строки
раскомментируйте SoftwareSerial gsm(7,8); если на выводы 7 и 8 ничего не вешали
Сделал так, после постановки на охрану в терменалке пишет "obriv" и идет вызов на мой телефон. От куда там берется единица, понять не могу. После постановки на охрану наверное нужно какую то паузу сделать, но где и как не знаю
/// GSM сигналка c установкой по звонку /// датчиком на прерывателях #include <EEPROM.h> //// как подключен модем? #include <SoftwareSerial.h> // если программный SoftwareSerial gsm(7, 8); // RX, TX //#define gsm Serial // если аппаратный в UNO //#define gsm Serial1 // если аппаратный в леонардо #define LED 4 #define TELLNUMBER "ATD+79089000682;" // номен на который будем звонить #define SMSNUMBER "AT+CMGS=\"79089000682\"" // номер на который будем отправлять SMS #define TELMODE "79089000682" // номер для установки на охрану #define SH1 6 // шлейыф //#define SH2 A3 #define pinBOOT 5 // нога BOOT или K на модеме byte mode = 0; // 0 - только включили // 1 - установлена охрана // 2 - снята с охраны // при добавлении не забываем посмотреть на 41 строку void setup() { delay(3000); //// !! чтобы нечего не повисало при включении gsm.begin(9600); /// незабываем указать скорость работы UART модема Serial.begin(9600); pinMode(LED, OUTPUT); pinMode(pinBOOT, OUTPUT); /// нога BOOT на модеме pinMode(SH1, INPUT); /// нога на растяжку digitalWrite(SH1,LOW); // pinMode(SH2, INPUT_PULLUP); /// нога на растяжку // читаем режим из еепром mode = EEPROM.read(0); if (mode > 2) mode = 2; // проверяем значение в еепром // занимаемся модемом delay(1000); digitalWrite(LED, HIGH); // на время включаем лед digitalWrite(pinBOOT, LOW); /// включаем модем // нужно дождатся включения модема и соединения с сетью delay(2000); while(gsm.find("STARTUP")); /// ждем команды от модема gsm.println("ATE0"); // выключаем эхо while(1){ // ждем подключение модема к сети gsm.println("AT+COPS?"); if (gsm.find("+COPS: 0")) break; digitalWrite(LED, LOW); // блымаем светодиодом delay(50); digitalWrite(LED, HIGH); delay(500); } Serial.println("Modem OK"); digitalWrite(LED, LOW); // блымаем светодиодом delay(1500); digitalWrite(LED, HIGH); delay(250); digitalWrite(LED, LOW); } void loop() { if (mode == 1){ // если в режиме охраны Serial.println("obriv"); // проверяем датчики if (digitalRead(SH1)==HIGH){ // если обрыв // отзваниваемся gsm.println(TELLNUMBER); delay(2500); if (gsm.find("NO CARRIER")){ // ищим сброс вызова, // снимаем охранку mode = 2; EEPROM.write(0, mode); } } } // если охрана снята if (mode == 2){ if (digitalRead(SH1)){ // проверяем датчики, включаем LED digitalWrite(LED, HIGH); } else digitalWrite(LED, LOW); } // ищим RING // если нашли, опрашиваем кто это и ставим на охрану if(gsm.find("RING")){ // если нашли RING gsm.println("AT+CLIP=1"); // включаем АОН, while(1){ // в цикле if (gsm.find(TELMODE)){ // ищим номер телефона, если нашли mode = 1; // меняем режим EEPROM.write(0, mode); // пишим его в еепром break; // и выходим } else{ // иначе gsm.println("AT+CPAS"); // спрашиваем состояние модема delay(100); if (gsm.find("+CPAS: 0")) break; // и если он в "готовности", выходим из цикла } // если звонок в процессе, возвращает +CPAS: 3 } // и крутимся дальше gsm.println("AT+CLIP=0"); // выключаем АОН, delay(500); gsm.println("ATH0"); // сбрасываем вызов digitalWrite(LED, LOW); // сигнализируем об этом delay(500); digitalWrite(LED, HIGH); delay(250); digitalWrite(LED, LOW); } }строки 75 и 76 местами поменяйте :)
сейчас у Вас выводится obriv, как только система стала на охрану, а не когда изменилось состояние входа
Поменял. Сразу после Modem OК пишет obriv
Может вход датчика к земле притянуть? не пыхнет? Датчик отцепил, все равно пишет obriv. Притянул через 10 ком-не помогло
а привесьте вместо датчика светодиод на +5в через резистор 300 Ом-1кОм, для наглядности
Он не загорается почему то. 0 нет я так понимаю на 6 контакте ардеины почему то. 0,67 вольта на нем. Прижал к земле через 10 кОм, диод загорелся, звонок приходит когда снимаю подтяжку. Заменяю диод на датчик, при постановке на охрану с модуля сразу происходит набор.
в принципе, 0.67В это нормально для логического 0
попробуйте датчик заменить на кнопку последовательно с 1-10к на +5В и сделайте паузу после инициализации модема, как советовал Araris
и сделайте паузу после инициализации модема, как советовал Araris
&& millis() > 60000
Я не знаю, куда это нужно вставить.
Кнопку поставил, что с нажатой, что нет, в терминалку пишет "obriv"
Проблема пока не решена. Как подключить датчик движения к модулю GSM?