Всем привет !!! Програмить я только учусь, по этому прошу вашей помощи. Сильно не ругайте )))).
Делаю сигнализацию на беспроводных датчиках движения, с возможностью принимать сигнал дверного звонка, и вкл./выкл. сигнализации с помощью с пульта.
Система состоит из следующих компонентов:
-
arduino mini pro
-
GSM/GPRS шилд SIM900,
-
Приемник XY-MK-5V (433 mHz)
-
Беспроводные датчики движения (433 mHz)
-
Дверной звонок на TL 2262 (433 mHz)
-
Пульт с приемником в комплекте 2262/2272 (433 mHz)
Методом «тыка» определил , что для приёма сигнала с датчиков движения подошла библиотека RCSwith (подключен к pin 2),
а для дверного звонка RemoteSwich (подключен к pin 3), хотя звонок на TL 2262 и по идее должен ловиться RCSwith-ом .
Прием сигналов с датчиков:
01 | #include <RemoteReceiver.h> |
03 | #include <SoftwareSerial.h> |
08 | RCSwitch mySwitch = RCSwitch(); |
17 | RemoteReceiver::init(0, 3, showCode); |
18 | mySwitch.enableReceive(1); |
33 | if (mySwitch.available()) { |
34 | int value = mySwitch.getReceivedValue(); |
36 | if (mySwitch.getReceivedValue() == 9290441) { |
37 | Serial .println( "ROOM_ONE" ); |
38 | mySwitch.resetAvailable(); |
41 | if (mySwitch.getReceivedValue() == 12901577) { |
42 | Serial .println( "ROOM_TWO" ); |
43 | mySwitch.resetAvailable(); |
51 | void showCode(unsigned long receivedCode, unsigned int period) { |
52 | if (receivedCode == 500904) |
53 | Serial .println( "DOOR" ); |
Прошу помочь в следующем:
1. Как правильно написать функцию для отправки СМС под библиотеку SIM900, при срабатывании датчиков движения и звонка.
2. Возможно ли использовать одну библиотеку И для датчика движения И для звонка. Может что-то изменить в самой библиотеке RCSwich чтобы она принимала коды с датчика и звонка и при этом занимала бы один пин на ардуине.
3. Помогите написать функцию для включения и выключения сигнализации с пульта и можно ли использовать только один приемник
4. Можно ли использовать XY-MK-5V для приема сигналов с пульта вместо его «родного» приемника.
Спасибо.
к библиотеке под sim900 идет масса примеров, в том числе и для отправки смс
Вопрос в том как сделать функцию отправки смс при срабатывании датчиков. А примеры я все смотрел.
Попробуйте почитать что такое функции...
Ок, еще раз прочитаю, хотельсь бы конкретно по данному вопросу получить совет.
чтобы конкретно по данному вопросу получить конкретный ответ, вы должны поконкретней сформулировать вопрос, ибо
Вопрос в том как сделать функцию отправки смс при срабатывании датчиков. А примеры я все смотрел.
можно трактовать так
1. я не умею писать функции (любые)
2.я не умею писать функции, которые отправляют смс
3.я умею писать любые функции, но не умею их вызывать по срабатыванию датчика.
будем гадать или подождем экстрасенсов? есть тут один, мохнатый, с хрустальными шарами :)
в двух словах, вводите переменную значение которой изменяется при срабатывание датчиков, далее условие проверки значения данной переменной если 0 все ок если нет шлём смс. мона усложнить и отправлять еще разный текст при срабатывании разных датчиков.
дря примера сходите на амперку там один товарищь реализовал нечто подобное.
Гадать и вызывать с хрустальными шарами не надо ))))))))). Наврное п.3
MDV благодарю, буду "копать" по Вашему совету
Мой совет: нарисуйте на бумажке алгоритм и посмотрите на него внимательно, там будут ответы на все Ваши вопросы. Если не знаете что такое алгоритмы - почитайте сначала про них.
В общем на выходных поставил на "боевое дежурство" свою сигнализацию, как смог так сделал. СМСки от датчиков движения и звонка приходят примерно через 10 +- сек после срабатывания (сеть Мегафон).
Вот код.
01
#include <RemoteReceiver.h>
02
#include <RCSwitch.h>
03
#include <plcLib.h>
04
#include <SoftwareSerial.h>
05
#include "SIM900.h"
06
#include "sms.h"
07
08
int
alarm = 0;
// сосотояние - НЕТ СИГНАЛОВ
09
int
led = 13;
10
RCSwitch mySwitch = RCSwitch();
11
SMSGSM sms;
12
int
numdata;
13
boolean started=
false
;
14
char
smsbuffer[160];
15
char
n[20];
16
17
18
void
setup
() {
19
Serial
.begin(9600);
20
RemoteReceiver::init(0, 3, showCode);
21
mySwitch.enableReceive(1);
22
pinMode(led, OUTPUT);
23
if
(gsm.begin(2400)){
24
started=
true
;
25
}
26
}
27
28
// Дверной звонок
29
void
showCode(unsigned
long
receivedCode, unsigned
int
period) {
30
if
(receivedCode == 500904)
31
alarm = 1;
32
}
33
34
void
loop
() {
35
36
if
(started){
// Если модуль заработал - мигаем светодиодом
37
digitalWrite(led, HIGH);
38
delay(1000);
39
digitalWrite(led, LOW);
40
delay(1000);
41
}
else
{
42
digitalWrite(led, HIGH);
43
}
44
45
if
(alarm == 1){
// Отправляем сообщения
46
sms.SendSMS(
"+7********"
,
"3BOHOK!!!"
);
47
delay (2000);
48
alarm = 0;
49
}
else
if
(alarm == 2){
50
sms.SendSMS(
"+7********"
,
"KYXHIA!!!"
);
51
delay (2000);
52
alarm = 0;
53
}
else
if
(alarm == 3){
54
sms.SendSMS(
"+7********"
,
"DBOP!!!"
);
55
delay (2000);
56
alarm = 0;
57
}
58
59
60
if
(mySwitch.available()) {
61
int
value = mySwitch.getReceivedValue();
62
if
(mySwitch.getReceivedValue() == 9290441) {
63
alarm = 2;
64
mySwitch.resetAvailable();
65
}
66
if
(mySwitch.getReceivedValue() == 12901577) {
67
alarm = 3;
68
mySwitch.resetAvailable();
69
}
70
}
71
}
если кто подскажет как что можно "оптимизировать" буду благодарен. ))))))
медленно но верно изучаю язык, вот потихоньку, по выходным читаю, внедряю, снова читаю. Может очередной велосипед, и гуру здесь не интересно, но немного конструктивной критики мне бы помогли.
ЧТО ЕСТЬ:
GSM/GPRS SIM900 (пины 4, 5, 7, 8)
приемник XY-MK-5V(пины 2,3 - из за 2 разных библиотек приходится занимать два пина - плохо)
приемник брелка 2262/2272 (пины А0, А1, А2, А3)
реле уличного фонаря (пин 9)
сирена (пин 10)
беспроводные датчики движения и звонок (11 метров через 2 стены)
Сигнализация ставится и снимается с брелка, после снятия можно включать выключать уличный фонарь.
ЧТО ПОКА НЕ ПОБЕДИЛ:
1. Как сделать автоматизированную проверку баланса, который при уменьшении например до 10 рублей слал смс что надо положить денюжку (может быть использовать millis() ).
2. Также при отправке например "tmp" присылал сообщение о температуре в доме.
4. Почему то RCSwith не заработал с библиотекой plcLib, не авилебл и все(((
5. Ну и из предыдущих: - .. Можно что-то изменить в библиотеке RCSwich чтобы занимая один пин на ардуине она принимала коды И с датчиков движения И со звонка (он сейчас работает на библиотеке RemoteSwich ( pin 3), хотя микруха в звонке TL 2262 и по описаниям должна ловиться RCSwith-ом ).
Код:
001
#include <RemoteReceiver.h>
002
#include <RCSwitch.h>
003
#include <SoftwareSerial.h>
004
#include <plcLib.h>
005
#include "DHT.h"
006
#include "SIM900.h"
007
#include "sms.h"
008
#include "call.h"
009
010
#define pirPin 6
011
#define Relay 9
012
#define Siren 10
013
#define DHTPIN 11
014
#define led 13
015
#define DHTTYPE DHT22
016
#define inputA A3
017
#define inputB A1
018
#define inputC A2
019
#define inputD A0
020
021
int
Value = 0;
// флаг на ноль
022
boolean Alarm =
true
;
// сигнализация ВКЛ.
023
024
int
readStateA = 0, readStateB = 0, readStateC = 0, readStateD = 0;
//состояние кнопок брелка на ноль
025
026
RCSwitch mySwitch = RCSwitch();
027
028
int
calibrationTime = 30;
//установки проводного даьчика движения
029
long
unsigned
int
lowIn, pause = 5000;
030
boolean takeLowTime, lockLow =
true
;
031
032
CallGSM call;
//учтановки GSM шилда
033
SMSGSM sms;
034
int
numdata;
035
boolean started=
false
;
036
char
pos, data, smsbuffer[180];
037
char
*p, *PhoneMessage[7] = {
"+79*********"
,
"ATD#100#;"
,
"3BOHOK!!!"
,
"KYXHA!!!"
,
"KOMHATA!!!"
,
"BXOD!!!"
,
""
};
038
039
DHT dht(DHTPIN, DHTTYPE);
//установки DHT22
040
char
*tmp;
041
float
t;
042
043
void
setup
() {
044
Serial
.begin(9600);
045
RemoteReceiver::init(0, 3, showCode);
046
mySwitch.enableReceive(1);
047
pinMode(inputA, INPUT);
048
pinMode(inputB, INPUT);
049
pinMode(inputC, INPUT);
050
pinMode(inputD, INPUT);
051
dht.begin();
052
pinMode(led, OUTPUT);
053
pinMode(Relay, OUTPUT);
054
pinMode(pirPin, INPUT);
055
pinMode(Siren, OUTPUT);
056
digitalWrite(pirPin, LOW);
057
digitalWrite(Relay, HIGH);
058
for
(
int
i = 0; i < calibrationTime; i++){}
059
if
(gsm.begin(2400)){
060
started=
true
;
061
}
062
}
063
064
//////////////////////Функция приема с дверного звонка////////////////
065
void
showCode(unsigned
long
receivedCode, unsigned
int
period) {
//
066
if
(receivedCode == 500904)
//
067
Value = 2;
//
068
}
//
069
//////////////////////////////////////////////////////////////////////
070
071
///////////////////////////////////Функция отправки СМС////////////////////////////////////
072
void
ReadSendSMS (
char
* phone,
char
* msg,
byte
st){
//
073
if
(st == 1){
//
074
sms.SendSMS(phone, msg);
//
075
Value = 0;
//
076
}
//
077
}
//
078
///////////////////////////////////////////////////////////////////////////////////////////
079
080
081
void
loop
() {
082
083
readStateA = digitalRead(inputA);
084
readStateB = digitalRead(inputB);
085
readStateC = digitalRead(inputC);
086
readStateD = digitalRead(inputD);
087
088
//////////Управление с брелка////////
089
if
(readStateA == HIGH){
//ВКЛ. //
090
Alarm =
true
;
//
091
started =
true
;
//
092
Value = 1;
//
093
delay (2000);
//
094
}
else
if
(readStateB == HIGH){
//
095
Value = 7;
//ВЫКЛ. //
096
}
//
097
/////////////////////////////////////
098
099
/////////////Считывание с беспроводных датчиков////////////////
100
if
(mySwitch.available()){
//
101
if
(mySwitch.getReceivedValue() == 9290441) {
//
102
delay(2000);
//
103
Value = 3;
//
104
mySwitch.resetAvailable();
//
105
}
else
if
(mySwitch.getReceivedValue() == 12901577) {
//
106
delay(2000);
//
107
Value = 4;
//
108
mySwitch.resetAvailable();
//
109
}
//
110
}
//
111
///////////////////////////////////////////////////////////////
112
113
114
/////////////////////////Выполнение команд/////////////////////////
115
if
(Alarm && started){
// //
116
digitalWrite(led, HIGH);
//дежурный сигнал //
117
delay(700);
//
118
digitalWrite(led, LOW);
//
119
delay(700);
//
120
///////////////////Прием с датчика на улице///////////////// //
121
if
(digitalRead(pirPin) == HIGH){
// //
122
Value = 5;
// //
123
takeLowTime =
true
;
// //
124
}
else
if
(digitalRead(pirPin) == LOW) {
// //
125
if
(takeLowTime){
// //
126
lowIn = millis();
// //
127
takeLowTime =
false
;
// //
128
Value = 0;
// //
129
}
// //
130
if
(!lockLow && millis() - lowIn > pause){
// //
131
lockLow =
true
;
// //
132
delay(50);
// //
133
}
// //
134
}
// //
135
//////////////////////////////////////////////////////////// //
136
//
137
switch
(Value){
//
138
case
1:
//ВКЛ. //
139
digitalWrite(Relay, LOW);
//
140
digitalWrite(Siren, HIGH);
//
141
delay(170);
//
142
digitalWrite(Relay, LOW);
//
143
digitalWrite(Siren, LOW);
//
144
delay(150);
//
145
digitalWrite(Relay, LOW);
//
146
digitalWrite(Siren, HIGH);
//
147
delay(150);
//
148
digitalWrite(Relay, LOW);
//
149
digitalWrite(Siren, LOW);
//
150
delay(2000);
//
151
digitalWrite(Relay, HIGH);
//
152
Value = 0;
//
153
break
;
//
154
case
2:
//дверной звонок //
155
ReadSendSMS(PhoneMessage[0], PhoneMessage[2], 1);
//
156
break
;
//
157
case
3:
//кухня //
158
ReadSendSMS(PhoneMessage[0], PhoneMessage[3], 1);
//
159
break
;
//
160
case
4:
//комната //
161
ReadSendSMS(PhoneMessage[0], PhoneMessage[4], 1);
//
162
break
;
//
163
case
5:
//вход //
164
ReadSendSMS(PhoneMessage[0], PhoneMessage[5], 1);
//
165
digitalWrite(Relay, LOW);
//
166
delay(1000);
//
167
digitalWrite(Siren, HIGH);
//
168
digitalWrite(Relay, LOW);
//
169
delay(4000);
//
170
digitalWrite(Siren, LOW);
//
171
digitalWrite(Relay, LOW);
//
172
delay(10000);
//
173
digitalWrite(Relay, HIGH);
//
174
break
;
//
175
case
6:
//баланс и температура //
176
///???????????????????? //
177
break
;
//
178
case
7:
//ВЫКЛ. //
179
digitalWrite(Relay, LOW);
//
180
digitalWrite(Siren, HIGH);
//
181
delay(150);
//
182
digitalWrite(Relay, LOW);
//
183
digitalWrite(Siren, LOW);
//
184
delay(1000);
//
185
digitalWrite(Relay, HIGH);
//
186
started =
false
;
//
187
Alarm =
false
;
//
188
break
;
//
189
}
//
190
}
else
{
//
191
digitalWrite(led, HIGH);
//
192
}
//
193
///////////////////////////////////////////////////////////////////
194
195
///////////////////Чтение входящих СМС//////////////////////
196
/*if (Alarm && started && Value == 0){
197
pos = sms.IsSMSPresent(SMS_UNREAD);
198
if(pos > 0){
199
sms.GetSMS(pos,PhoneMessage[0],smsbuffer,180);
200
p = strstr(smsbuffer,"tmp");
201
}
202
*/
203
204
//////////Управление фонарем над дверью/////////
205
if
(!Alarm){
//
206
if
(readStateC == HIGH){
//
207
digitalWrite(Relay, LOW);
//
208
}
else
if
(readStateD == HIGH){
//
209
digitalWrite(Relay, HIGH);
//
210
}
//
211
}
//
212
////////////////////////////////////////////////
213
214
}
в плане конструктивной критики советую заменить общение через смс на передачу данных, а то разоритесь на смс-ках. При сдельном тарифе 3 руб/мег на мониторинг температуры в гараже/погребе у меня в месяц уходит рублей 10, ну максимум 20
На счет температуры полностью согласен но думаю датчики движения должны быть всетаки на смс. А у Вас система только мониторит температуру?
передача информации из гаража ко мне - через передачу данных, от меня в гараж - через смс, т.к не хватило настойчивости победить тупых менеджеров мегафона, объясняя, что такое "белый адрес".
система мониторит температуру с нескольких датчиков, включает/выключает подогреватель. ну и статус обогревателей тоже сообщает. раз в 3 часа передается полное состояние системы, по запросу - состояние в настоящее время
если хочется исходящие смс, то можно сделать отправку сообщения на эл. почту, а уже к почтовому ящику привязать дублирование через смс - тогда смс будет бесплатно
COM добрый день.
Какой бы библиотекой пользуетесь и если не жалко пришлите скетч. Колдую над чем то похожим шлю данные на народный монитор но хочу еще и дистанционное управление сделать.
здравствуйте уважаемые форумчане!!!
в общем сигнализация работала исправно и бесперерывно в течении 2 лет, сохраняя относительное спокойствие в душе)))). И вот решил я все это дело аккуратно упаковать в раздаточною коробку 10х14, нарисовал и вытраил новую плату под размер коробки, все собрал, подключаю свой шилд ..... и ничего, т.е. он ловит сеть (гудки при дозвоне), но ни sms, ни выдичи какой либо информации в монитор порта нет (когда я открываю монитор он "перезагружается" но ничего в монитор не идет). Пробовал как c библиотекой sim900, так и просто через softwareserial - результат нулевой, от шилда связи нет.
Конфигурация системы пержняя : miniPro (пины 4,5) + sim900 (пины 7,8, 9); питание через - 7805 (с конденсаторной обвязкой), блок питания трансформаторный 7,5V 1А
Может кто сталкивался с такой проблемой, хотябы поскажите что можно проверить на шилде?
Мне кажется, раздаточная коробка - не самое лучшее место для размещения электроники.
А если она еще должна и сеть ловить, то, боюсь, металлические стенки этого ей сделать не позволят.
извиняюсь - на раздаточная а распред.коробка, для электропроводки, и она пластиковая))))
Вы так больше не пугайте https://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D0%B7%D0%B4%D0%B0%D1%82%D0%BE...
уверен что в современных раздаточных коробках есть место микроконтроллеру)))), только вот шилд мой не работает
Ещё вопрос - подскажите код для подключения шилда к ардуине через hardware serial
Я так понимаю, Serial.begin(NNNN); , где NNNN - скорость обмена, которую поддерживает шилд.
подскажите пожалуста примеры кода для общения с шилдом через аппаратный uart
Привет.
Примеры будут зависит от применяемой библиотеки и того что ты хочешь получить от модема.
Можешь посмотреть в интернете (на амперке или jt5)
Приветствую.
Мне хотя бы получить ОК на АТ. Я соединяю пины 0,1 miniPro к пинам 0,1 GSM шилда. Перемычки на "hw"., пробовал залить вот такой пример но ответа нет:
01
HardwareSerial & mySerial =
Serial
;
02
03
void
setup
()
04
{
05
Serial
.begin(9600);
06
mySerial.begin(9600);
07
//Serial.println("AT");
08
mySerial.println(
"AT+CSQ"
);
09
}
10
11
void
loop
()
12
{
13
if
(mySerial.available())
14
Serial
.write(mySerial.read());
15
if
(
Serial
.available())
16
mySerial.write(
Serial
.read());
17
}
на форуме нашел только как подключают к меге . Но это никак не применимо к минипро.
Подключать надо перекрёстно - RX-TX, TX-RX. Скорости работы порта должны быть одинаковые - в шилде и ардуине.
на шилде разьемы 0 - rx, 1- tx, на миниПро 0 - tx, 1- rx, подключаю вроде правильно, а как установить скорость шилда?
на шилде разьемы 0 - rx, 1- tx, на миниПро 0 - tx, 1- rx, подключаю вроде правильно, а как установить скорость шилда?
Через любую терминальную программу, подключив шилд через USB-TTL-конвертер. Или - со стороны ардуины подобрать скорость порта перебором.
ОК, спасабо понятно. Тогда подскажите пожалуйста код.
Привет Посмотри пример на jt5 там и код есть и схема соединения.
При сондинении не забудь gnd (-) модема и контроллера соединить, а то про это постоянно забывают.