Во многих случаях использование arduino сводиться лишь к миганию светодиодами или роботам, которые хороши лишь как игрушки. Ведь для развлечения и был создан этот конструктор. Для меня же задача стояла быстро, максимально используя типовые или готовые наработки изучить и применить МК при создании системы умного дома для себя.
Как раз на этапе изучения протоколов общения с разными датчиками встала задача быстро (в течении недели) оборудовать коробку дома GSM сигнализацией, чтоб местные маргиналы не утащили материалы быстрее чем я успеваю подвозить их.
Приглашенный специалист выкатил условия: базовый блок (с базовым функционалом)= 300$, датчик движения 25$ (простой, только PIR сенсор), монтаж 300$.
Так как в планах стоит интеграция всего и всях в одну систему, я решил не просто прикинуть, а сразу собрать сигнализацию на Arduino с возможностью дальнейшей интеграции в одну систему Умного дома. Сейчас мне видиться наиболее приемлемым вариантом Ethernet протокол с Majordomo на сервере для сбора данных в базу данных и сложных сценариев работы.
Итак задача: GSM сигнализация на Arduino c использованием обычных (читай дешевых) датчиков движения.
Так как сроки поджимали, и ожидать железа из Китая не было времени, покупалось с рук: Arduino Mini Pro=10$, GSM shield no name=55$, и датчики движения для включения ламп освещения пускай и задорого 9$ , но зато у импортера на месте и сразу.
Датчик сначала взял один для тестов. Оказалось он отлично меня устраивает ,
,
удобный корпус, начинка разделена на две части: высоковольтная (в долгий ящик на опыты) и сенсор с операционным усилителем (питание от 3 до , помоему 24, вольт).


(позитивная фотография получилась, ему уже нравиться)
Выкинув первую часть и запитав сенсор от arduino получил высокий уровень сигнала при фиксации движения датчиком и низкий при отсутствии движения (при подключении к аналоговому входу можно даже определять обрывы разных линий: земли, питания и сигнальной).
Тесты проводились на Arduino UNO, а запуск на Arduino MINI PRO.
Неприятным моментом стало появление случайной помехи на входных цифровых каналах при не подключенном датчике на MINI (помните, что документация изучается паралельно ). Как говориться у природы нет… Эта проблема стала поводом к дописыванию в setup проверки входов и исключению неподключенных из работы (естественно с информированием СМСкой о неподключенных и замкнутых каналах).
Честно признаюсь, лень – мой порок. Поэтому печатной платы у готового устройства нет . Самый простой и аккуратный спосод коммутации сенсоров стал старый коммутатор на 8 портов.

Пока я не нашел где купить гнездо I-button, так что и постановка и снятие с охраны работает только через СМС. Отправляем “on” на номер сигнализации – получаем отчет о тестировании портов и включенную сигнализацию. “off”- выключаем слежение за обьектом(естественно лучше проверять по списку разрешенных номеров).
В планах еще добавление режима “test” – ожидание сработки всех датчиков в течении некоторого времени, но это уже позже.
В итоге я получил полностью настраиваемую систему, в разы дешевле типовой, массу удовольствия и стимул заниматься этим хобби дальше.
008 | boolean notConnected = true ; |
009 | char senderNumber[20]; |
023 | digitalWrite(8,HIGH); |
034 | if (gsmAccess.begin( "" )==GSM_READY) { |
035 | notConnected = false ; |
044 | if (armed) Message+= "Status-armed." ; else "Status- disarmed" ; |
045 | Message+= " setup ending." ; |
046 | sms.beginSMS( "номер для СМС уведомления" ); |
053 | if (armed && timeout) { |
054 | byte DataPinB=PINB & MaskB; |
055 | byte DataPinD=PIND & MaskD; |
056 | if (DataPinD | DataPinB){ |
058 | Message= "Security system:Alarm!Sensors port:" ; |
059 | if (DataPinD & B10000) Message+= "1," ; |
060 | if (DataPinD & B100000) Message+= "2," ; |
061 | if (DataPinD & B1000000) Message+= "3," ; |
062 | if (DataPinD & B10000000) Message+= "4," ; |
063 | if (DataPinB & B100) Message+= "5," ; |
064 | if (DataPinB & B1000) Message+= "6," ; |
065 | if (DataPinB & B10000) Message+= "7," ; |
066 | if (DataPinB & B100000) Message+= "8," ; |
068 | time = millis()+300000; |
071 | sms.beginSMS( "+номер для СМС уведомлений" <span style= "font-family:Verdana, Geneva, Arial, sans-serif;font-size:12px;line-height:1.5em;" >);</span> |
080 | if (time<millis()) timeout= true ; |
088 | sms.remoteNumber(senderNumber, 20); |
091 | while (c=sms.read()) message += c; |
092 | if (message== "on" || message== "On" ) { |
095 | Message+= "Changed status to Armed" ; |
096 | sms.beginSMS(+номер для СМС уведомлений)<span style= "font-family:Verdana, Geneva, Arial, sans-serif;font-size:12px;line-height:1.5em;" >;</span> |
100 | if (message== "off" || message== "Off" ) {armed= false ; Alarm= false ;} |
112 | byte DataPinB,AndDataPinB,OrDataPinB; |
113 | byte DataPinD,AndDataPinD,OrDataPinD; |
116 | DataPinB=PINB & MaskB; |
117 | AndDataPinB=DataPinB; |
119 | DataPinD=PIND & MaskD; |
120 | AndDataPinD=DataPinD; |
123 | for ( byte k=0;k<255;k++) { |
124 | for ( byte l=0;l<255;l++) { |
126 | DataPinB=PINB & MaskB; |
127 | DataPinD=PIND & MaskD; |
128 | AndDataPinB=AndDataPinB & DataPinB; |
129 | OrDataPinB=OrDataPinB | DataPinB; |
130 | AndDataPinD=AndDataPinD & DataPinD; |
131 | OrDataPinD=OrDataPinD | DataPinD; |
135 | Message= "Security system:Test results:" ; |
136 | if ((AndDataPinD!=0) || (AndDataPinB!=0)) { |
137 | Message+= "short circuited:" ; |
138 | if (AndDataPinD & B10000) Message+= "1," ; |
139 | if (AndDataPinD & B100000) Message+= "2," ; |
140 | if (AndDataPinD & B1000000) Message+= "3," ; |
141 | if (AndDataPinD & B10000000) Message+= "4," ; |
142 | if (AndDataPinB & B100) Message+= "5," ; |
143 | if (AndDataPinB & B1000) Message+= "6," ; |
144 | if (AndDataPinB & B10000) Message+= "7," ; |
145 | if (AndDataPinB & B100000) Message+= "8," ; |
147 | if ((OrDataPinD!=0) || (OrDataPinB!=0)) { |
148 | Message+= "Not connected:" ; |
149 | if (OrDataPinD & B10000) Message+= "1," ; |
150 | if (OrDataPinD & B100000) Message+= "2," ; |
151 | if (OrDataPinD & B1000000) Message+= "3," ; |
152 | if (OrDataPinD & B10000000) Message+= "4," ; |
153 | if (OrDataPinB & B100) Message+= "5," ; |
154 | if (OrDataPinB & B1000) Message+= "6," ; |
155 | if (OrDataPinB & B10000) Message+= "7," ; |
156 | if (OrDataPinB & B100000) Message+= "8," ; |
158 | MaskB=MaskB&(~AndDataPinB)&(~OrDataPinB); |
159 | MaskD=MaskD&(~AndDataPinD)&(~OrDataPinD); |
161 | if (MaskD & B10000) Message+= "1," ; |
162 | if (MaskD & B100000) Message+= "2," ; |
163 | if (MaskD & B1000000) Message+= "3," ; |
164 | if (MaskD & B10000000) Message+= "4," ; |
165 | if (MaskB & B100) Message+= "5," ; |
166 | if (MaskB & B1000) Message+= "6," ; |
167 | if (MaskB & B10000) Message+= "7," ; |
168 | if (MaskB & B100000) Message+= "8," ; |
Код не очень, будет время - поправлю. Но учитывая что хоть что то кроме e-mail я писал 10 лет назад -нормально.
Браво ! Прекрасный стиль, особенно хороши комменты в скетче.
Отлично!
Еще бы распиновку узнать, и как удалось заставить этот шилд работать с библиотекой GSM. У меня он работает только с SoftwareSerial.
Хорошо!
но использование радио канала сводит на нет все плюсы :)
любой радио канал можно просто заглушить и делай что хочеш.
И откуда злоумышленник обычно узнает, что объект имеет сигнализацию завязаную на GSM?
И откуда злоумышленник обычно узнает, что объект имеет сигнализацию завязаную на GSM?
ну наверное нужно очень много соображать на тему что телефонов никто не проводил, это очевидно по отсутсвию проводов.
а если есть сигнализация, то единственый вариант это сотовая связь. глушилки продаются вон на каждом углу.
Да путь себе глушат...
Что мешает топик-стартеру купить Интернет-пакет и каждую минуту (секунду) за недорого гнать информацию о том, что у него на объекте все хорошо/плохо?
Если злоумышленник поставит непреодолимые для GSM-сигнала помехи, принимающая информацию программа не получит никакой информации о статусе объекта - повод встревожиться...
Да путь себе глушат...
Что мешает топик-стартеру купить Интернет-пакет и каждую минуту (секунду) за недорого гнать информацию о том, что у него на объекте все хорошо/плохо?
Если злоумышленник поставит непреодолимые для GSM-сигнала помехи, принимающая информацию программа не получит никакой информации о статусе объекта - повод встревожиться...
это вариант, но тут возникает много ложных срабатываний... то сеть перегружена, то трафик застрял где то.. да мало ли что происходит с оператором сотовой сети.. :) каждый раз не набегаешся, да и в целом, какого целесообразность такой сигнализации? ну получил сигнал о проникновении, за час пока доедеш там и крышу разберут и унесут..
за час пока доедеш там и крышу разберут и унесут..
С таким подходом только автоматическеи "Турели" по периметру ставить)))
С таким подходом только автоматическеи "Турели" по периметру ставить)))
только так!
сугубо мое мнение, глубоко личное и никому не навязываемое.. дом(квартира) должен быть адын, в котором ты и живеш, а все остальное это никому не нужные панты. из серии "- у меня есть дача на берегу океяна, я на ней бываю 2 недели в году" а остальное время я сижу и жду когда сигнализация сработает и страшно переживаю.. гы гы
Кроме себя любимого, по близости обычно обитают другие домочадцы, которые могут иметь отличное от озвученного мнение. Некоторым из них дача может оказаться не менее важна, чем "дом в котором ты живешь".
16 совершенно бессмысленных, не относящихся к теме сообщений за полдня. охренеть...
может всё-же поговорим про библиотеки ардуино, пины и всё такое. а ваши терки лучше бы в соответствующие профильные форумы...
GSM shield такой
для его работы надо соединить 0,1 или 2,3 (в зависимости от установленной перемычки) и пины 7,8 ( 8 включение , 7 - сброс).
Но я отказался от стандартной библиотеки. В ней я не нашел удаления СМС с карты памяти и она не могла корректно включить шилд програмно. И работал шилд как то ... Не четко. То вышлет статус, то нет. А что там внитри происходит - не понятно.
020
pinMode(8, OUTPUT);
//включение sim900
021
digitalWrite(8,LOW);
// в разных GSM шилдах может быть разными порты для включения.
022
delay(1000);
023
digitalWrite(8,HIGH);
024
delay(2000);
025
digitalWrite(8,LOW);
такое включение мало того что выглядит коряво, так еще при сбросе arduino руками или watchdog не включает , а выключает шилд.
Свой скетч переписал под другую библиотеку:
код за это время сильно изменился. Датчики переехали на аналоговые входы (можно выключать сразу не подключенные каналы)
Сейчас добавилось:
постановка и снятие ключем с информированием СМС.
Сирена и индикация работы
Контроль температуры и влажности в помещении где стоит блок сигнализации, и температуры во всех комнатах где стоят датчики движения.
Датчики все таки рекомендую использовать профессиональные. Я поменял на такой.
Плюсы:
дальность и точность работы НАМНОГО выше.
ложные срабатывания пропали.(первый вариант согласно инструкции очень чувствителен к сквозняку)
И внутри есть стабилизатор на 5 вольт, откуда я запитал температурные датчики ds18b20
001
//#define DEBUGING
002
#define SIM900
003
#include "SIM900.h"
004
#include <SoftwareSerial.h>
005
#include "sms.h"
006
#include "DHT.h"
007
#include <OneWire.h>
008
DHT dht(11, DHT22);
009
SMSGSM sms;
010
boolean notConnected =
true
;
011
char
senderNumber[20];
012
bool
Alarm;
//если тру - надо ехать и бить лицо синеносым
013
String Message=
""
;
//Сообщение на выдачу в СМС
014
char
buff[160];
//временный буфер для смс
015
int
AnalogSensors[8];
016
byte
PortNum[8];
017
byte
PortQ;
018
OneWire ibutton(12);
// контекторы для снятия и постановки на сигнализацию брелком
019
OneWire ds(10);
//Температурные датчики (расположены в датчиках движения)
020
#define AlertPin 5 //реле сирены
021
#define TimeOutLenght 180000 //таймаут
022
#define LightPin 6 // реле индикации работы сигнализации
023
#define LedPin 4 //Светодиоды на контакторах I-button для удобства
024
const
byte
Keys[5][8]={
//мои ключи забил жестко
025
026
boolean Led;
027
boolean TimeOut=
true
;
//признак недавней сработки сигнализации
028
boolean Armed=
true
;
//ставим сразу на сигнализацию
029
unsigned
long
LedTime;
//для мигания без задержки
030
unsigned
long
time;
//для проверки таймаута после сработки
031
void
setup
() {
032
dht.begin();
033
#if defined DEBUGING
034
Serial
.begin(9600);
035
Serial
.println(
"GSM Shield testing."
);
036
#endif
037
pinMode(AlertPin, OUTPUT);
038
digitalWrite(AlertPin, HIGH);
039
pinMode(LightPin, OUTPUT);
040
digitalWrite(LightPin, HIGH);
041
pinMode(LedPin, OUTPUT);
042
pinMode(13, OUTPUT);
043
TestAnalog();
//проверка подключенных сенсоров
044
Message+=
"Setup->Armed."
;
045
#if defined SIM900
046
if
(gsm.begin(2400)){
//включает шилд корректно
047
// Serial.println("\nstatus=READY");
048
}
049
//else Serial.println("\nstatus=IDLE");
050
while
(sms.IsSMSPresent(SMS_ALL)) sms.DeleteSMS(sms.IsSMSPresent(SMS_ALL));
//удаляем СМС
051
#endif
052
#if !defined DEBUGING
053
Message.toCharArray(buff,160);
054
sms.SendSMS(
""
,buff);
//Send SMS
055
#endif
056
057
#if defined DEBUGING
058
Serial
.print(Message);
059
#endif
060
TimeOut=
false
;
061
digitalWrite(13,HIGH);
062
time = millis()+20000;
063
}
064
065
066
void
loop
() {
067
if
((LedTime<millis())&&Armed){
068
digitalWrite(LedPin, Led);
069
if
(TimeOut) digitalWrite(13, Led);
070
Led=!Led;
071
LedTime=millis()+500;
//задержка мигания светодиода
072
}
073
#if defined DEBUGING
074
//Serial.print("1");
075
#endif
076
if
(Armed && TimeOut)
//проверка датчиков движения
077
{
078
Message=
"Security system:Alarm!Sensors port:"
;
079
for
(
int
k=0;k<PortQ;++k) {
080
AnalogSensors[k] = analogRead(PortNum[k]);
081
if
(AnalogSensors[k]>100)
082
{
083
Alarm=
true
;
//ура поймаем бомжей
084
Message+=(PortNum[k]+1);
085
Message+=
","
;
086
}
087
}
088
if
(Alarm) Alarming();
089
}
090
091
CheckKey();
092
#if defined DEBUGING
093
//Serial.print("2");
094
#endif
095
if
(!TimeOut)
//проверка истечения задержки
096
{
097
if
(time<millis())
098
{
099
TimeOut=
true
;
100
Disalarming();
101
}
102
}
103
#if defined SIM900
104
while
(sms.IsSMSPresent(SMS_ALL))
//читаем входящую СМС
105
{
106
char
position;
107
char
sms_text[10];
108
position = sms.IsSMSPresent(SMS_ALL);
109
char
phone_number[20];
// array for the phone number
110
if
(position)
111
{
112
sms.GetSMS(position, phone_number, sms_text, 10);
113
sms.DeleteSMS(position);
114
if
(((sms_text[0]==
'o'
)||(sms_text[0]==
'O'
))&&(sms_text[1]==
'n'
)) Arming(0);
115
if
(((sms_text[0]==
'o'
)||(sms_text[0]==
'O'
))&&(sms_text[1]==
'f'
)&&(sms_text[2]==
'f'
)) Disarming(0);
116
}
117
}
118
#endif
119
}
120
void
TestAnalog()
121
{
122
PortQ=0;
123
int
portValue;
124
String GoodPort=
""
,CndPort=
""
,DataPort=
""
;
125
Message =
"Ports:"
;
126
for
(
byte
k=0;k<8;++k) {
127
portValue= analogRead(k);
128
Message+=portValue;
129
Message+=
","
;
130
// Serial.println(portValue);
131
132
if
((portValue<100)||(portValue>1000)) {
133
GoodPort+=(k+1);
134
GoodPort+=
","
;
135
PortNum[PortQ]=k;
136
PortQ++;
137
}
else
138
{
139
CndPort+=(k+1);
140
CndPort+=
","
;
141
}
142
}
143
if
(GoodPort!=
""
){
144
Message+=
" conn="
;
145
Message+=GoodPort;
146
}
147
if
(CndPort!=
""
){
148
Message+=
" NC="
;
149
Message+=CndPort;
150
}
151
if
(GoodPort!=
""
){
152
Message+=
" control "
;
153
Message+=PortQ;
154
Message+=
" pcs."
;
155
}
156
else
Message+=
" idle."
;
157
158
Message+=
" Hum="
;
159
Message+= (
int
)dht.readHumidity();
160
Message+=
"% Temp="
;
161
Message+= dht.readTemperature();
162
Message+=
"C"
;
163
ReadDS();
164
#if defined DEBUGING
165
Serial
.println(Message);
166
#endif
167
168
}
169
void
Disarming(
byte
KeyNum)
170
{
171
Disalarming();
172
digitalWrite(LightPin, HIGH);
//выключили индикацию
173
digitalWrite(LedPin, LOW);
//потушили индикатор на контакторах
174
TestAnalog();
175
if
(Armed) Message+=
" disarmed "
;
else
Message+=
" Been disarmed."
;
176
if
(KeyNum) {
177
Message+=
"by KEY no"
;
178
KeyNum++;
179
Message+=KeyNum;
180
}
else
Message+=
"by SMS"
;
181
char
buff[160];
182
Message.toCharArray(buff,160);
183
Armed=
false
;
184
sms.SendSMS(
""
,buff);
//Send SMS
185
}
186
void
Arming(
byte
KeyNum)
187
{
188
TimeOut=
false
;
189
time = millis()+20000;
190
digitalWrite(13,HIGH);
191
digitalWrite(LightPin, LOW);
//включили индикацию
192
digitalWrite(AlertPin, LOW);
//включили сирену
193
digitalWrite(LedPin, LOW);
//потушили индикатор на контакторах
194
delay(30);
195
digitalWrite(AlertPin, HIGH);
//выключили сирену
196
TestAnalog();
197
if
(!Armed) Message+=
" armed "
;
else
Message+=
" Been armed."
;
198
Armed=
true
;
199
if
(KeyNum)
200
{
201
Message+=
"by key no"
;
202
KeyNum++;
203
Message+=KeyNum;
204
}
else
Message+=
"by SMS"
;
205
Message.toCharArray(buff,160);
206
Armed=
true
;
207
sms.SendSMS(
""
,buff);
//Send SMS
208
}
209
void
Disalarming()
210
{
211
Alarm=
false
;
212
digitalWrite(AlertPin, HIGH);
//выключили сирену
213
digitalWrite(13,LOW);
214
}
215
void
Alarming()
216
{
217
TimeOut=
false
;
218
digitalWrite(13,HIGH);
219
digitalWrite(AlertPin, LOW);
//Включаем сирену
220
time = millis()+TimeOutLenght;
//000;//таймаут что б смс не сыпались пачками.
221
Message.toCharArray(buff,160);
222
Alarm=
true
;
223
sms.SendSMS(
"_"
,buff);
//Send SMS
224
}
225
void
CheckKey()
226
{
227
byte
addr[8];
228
ibutton.reset_search();
229
if
( ibutton.search(addr)) {
230
ibutton.reset();
231
boolean KeyMatch=
false
;
232
byte
Key=255;
233
for
(
byte
m=0;m<5;m++)
234
{
235
KeyMatch=
true
;
236
for
(
byte
i = 0; i < 8; i++)
if
(addr[i]!=Keys[m][i]){
237
KeyMatch=
false
;
238
break
;
239
}
240
if
(KeyMatch) {
241
Key=m+1;
242
break
;
243
}
244
}
245
if
(Key!=255)
246
{
247
Disalarming();
248
#if defined DEBUGING
249
Serial
.print(
"Key connected "
);
250
Serial
.println(Key);
251
#endif
252
for
(
byte
l = 0; l < 10; l++) {
253
delay(30);
254
digitalWrite(LedPin, HIGH);
255
delay(30);
256
digitalWrite(LedPin, LOW);
257
}
258
for
(
byte
i = 0; i < Key; i++)
259
{
260
delay(300);
261
digitalWrite(LedPin, HIGH);
262
delay(100);
263
digitalWrite(LedPin, LOW);
264
}
265
if
(Armed) Disarming(Key);
else
Arming(Key);
266
}
267
if
(!KeyMatch)
268
{
269
Message=
"Wrong key connected!"
;
270
Alarming();
271
#if defined DEBUGING
272
Serial
.print(
"Wrong Key "
);
//тревога
273
Serial
.print(
" "
);
274
Serial
.print(addr[0],HEX);
275
Serial
.print(
" "
);
276
Serial
.print(addr[1],HEX);
277
Serial
.print(
" "
);
278
Serial
.print(addr[2],HEX);
279
Serial
.print(
" "
);
280
Serial
.print(addr[3],HEX);
281
Serial
.print(
" "
);
282
Serial
.print(addr[4],HEX);
283
Serial
.print(
" "
);
284
Serial
.print(addr[5],HEX);
285
Serial
.print(
" "
);
286
Serial
.print(addr[6],HEX);
287
Serial
.print(
" "
);
288
Serial
.println(addr[7],HEX);
289
#endif
290
}
291
292
}
293
}
294
void
ReadDS()
295
{
296
byte
i;
297
byte
present = 0;
298
byte
type_s;
299
byte
data[12];
300
byte
addr[8];
301
float
celsius;
302
Message+=
" DS temp:"
;
303
while
( ds.search(addr)) {
304
#if defined DEBUGING
305
Serial
.print(
"ROM ="
);
306
for
( i = 0; i < 8; i++) {
307
Serial
.write(
' '
);
308
Serial
.print(addr[i], HEX);
309
}
310
if
(OneWire::crc8(addr, 7) != addr[7]) {
311
Serial
.println(
"CRC is not valid!"
);
312
return
;
313
}
314
#endif
315
Message+= String(addr[0], HEX);
316
317
ds.reset();
318
ds.select(addr);
319
ds.write(0x44, 1);
// start conversion, with parasite power on at the end
320
delay(1000);
// maybe 750ms is enough, maybe not
321
// we might do a ds.depower() here, but the reset will take care of it.
322
present = ds.reset();
323
ds.select(addr);
324
ds.write(0xBE);
// Read Scratchpad
325
326
327
#if defined DEBUGING
328
Serial
.print(
" Data = "
);
329
#endif
330
for
( i = 0; i < 9; i++) {
// we need 9 bytes
331
data[i] = ds.read();
332
#if defined DEBUGING
333
Serial
.print(data[i], HEX);
334
Serial
.print(
" "
);
335
#endif
336
}
337
#if defined DEBUGING
338
Serial
.print(
" CRC="
);
339
Serial
.print(OneWire::crc8(data, 8), HEX);
340
#endif
341
342
// Convert the data to actual temperature
343
// because the result is a 16 bit signed integer, it should
344
// be stored to an "int16_t" type, which is always 16 bits
345
// even when compiled on a 32 bit processor.
346
int16_t raw = (data[1] << 8) | data[0];
347
byte
cfg = (data[4] & 0x60);
348
// at lower res, the low bits are undefined, so let's zero them
349
if
(cfg == 0x00) raw = raw & ~7;
// 9 bit resolution, 93.75 ms
350
else
if
(cfg == 0x20) raw = raw & ~3;
// 10 bit res, 187.5 ms
351
else
if
(cfg == 0x40) raw = raw & ~1;
// 11 bit res, 375 ms
352
//// default is 12 bit resolution, 750 ms conversion time
353
raw = raw / 16.0*10;
354
celsius = (
float
)raw / 10;
355
//Message+= data[0];
356
Message+=
"="
;
357
Message+=celsius;
358
#if defined DEBUGING
359
Serial
.print(
" Temperature = "
);
360
Serial
.print(celsius);
361
Serial
.println(
" Celsius"
);
362
#endif
363
}
364
}
Спасибо за разработку! Хочу что-то подобное сделать. Есть вопросы:
1. Как ведет себя шилд при потере сети или слабом сигнале? Не нужны ли в цикле дополнительные проверки и переинициализации?
2. В коде нет вотчдогов. Были ли случаи зависания GSM шилда? Как его правильно инициализировать после зависания?
3. Есть ли возможность отлаживать sms без физической посылки\приема? (денег жалко)
как ведет себя шилд при слабом сигнале не знаю. Хоть в месте где стоит сигнализация и показывает иногда ноль палок, все проблемы решились заменой библиотеки. По индикации на шилде сеть всегда держит. Мне не приходиться сейчас ни перегружать arduino или сам шилд, ни ресетить шилд.
Если столкнусь - напишу, надо будет только проверить в начале цикла статус и заново запустить шилд.
Вотчдог не поможет, так как на регистрацию уходит иногда много времени , и контролер может перегрузиться даже при штатной работе.
Ресет шилда можно сделать програмно через 7 ногу или выключить и включить его через 8 (займет много времени для регистрации в GSM сети).
Отлаживать нужно без СМС, хоть у меня и бесплатные СМС, но напрягает ждать регитрации модуля и прихода СМС. Поэтому советую сначала все функции отладить на serial а потом только включать СМС. В библиотеки есть директива для дебага, при заявленной, модуль не отправляет сообщения(как я понял из исходников).
ВНИМАНИЕ: возможен сбой не модуля, но оператора !!! Признаки такие: на все команды модулб не отвечает, о изменении статуса тоже ничего не говорит. Через, примерно, 10 минут приходят все потерянные сообщения пачкой. Я пока не догадался потратил много времени. Причем система есть , если модуль часто и много высылает сообщений - вероятнее всего будет затык.
уважаемый просто восхищаюсь вашей работой!все супер.я только начинаю с ардуиной работать.у меня gsm шилд в связке с ардуино мега.и к вам вопрос,как ваш вышеизложенный код заставить работать через аппаратный порт меги,не програмный? какие и где внести изменения, если можно на примере измененного кода, чтобы я смог понять.буду очень благодарен!замечательная работа!
ноги , на которых работает GSM билиотека в ней и указываються. посмотрите файлы библиотеки, там указано. Но на аппаратных ногах вы не сможете отлаживать ?
moshael, как с вами можно связаться ???
Подойдет ли такая плата ? http://amperka.ru/product/arduino-gprs-shield
Подойдет ли такая плата ? http://amperka.ru/product/arduino-gprs-shield
Вполне, это продукт Seeeduino на SIM900, документация на него есть довольно подробная http://www.seeedstudio.com/wiki/GPRS_Shield_V2.0
ПОдскажите, как правильно сделать опрос нескольких датчиков ??? Датчики должны быть подключены на каждый отдельный пин, либо все последовательно ???
???
смотря от того сколько датчиков. В принципе можно и несколько датчиков повесить на один аналоговый порт, так же как и в обычных сигнализация. Анализируя уровень можно будет определить какие датчики в данный момент сработали.
Можно на один цифровой несколько, но тогда вы не будете знать какой датчик сработал из гирлянды.
Ну а если датчиков не много - можно на каждый порт по одному.
интересно, пробовал скомпилировать скетч (обе), но ошибки появились не компилируется...пробовал разобраться, но я только начал разобраться в arduino, и ничего не Получается.
а есть библиотеки под новый SIM800 гсм модуль? или обычные библиотеки будут с ним работать?
а есть библиотеки под новый SIM800 гсм модуль? или обычные библиотеки будут с ним работать?
Ссылку можно на shield?
http://ru.aliexpress.com/store/product/Smallest-SIM800L-GPRS-GSM-Module-MicroSIM-Card-Core-BOard-Quad-band-TTL-Serial-Port/110055_32284560394.html
https://github.com/stanleyhuangyc/Freematics/tree/master/libraries/SIM800
http://arduinodev.com/arduino-library-for-gprshttp-communication-with-sim800/
https://github.com/Seeed-Studio/Seeeduino_GPRS/blob/master/sim800.h
Интересный модуль. Блютус 3.0, фм радио, емайлы, джекблек.
только почему то рекумендуют использовать только если проблемы с местом. Может глючный еще?
http://ru.aliexpress.com/store/product/Smallest-SIM800L-GPRS-GSM-Module-MicroSIM-Card-Core-BOard-Quad-band-TTL-Serial-Port/110055_32284560394.html
https://github.com/stanleyhuangyc/Freematics/tree/master/libraries/SIM800
http://arduinodev.com/arduino-library-for-gprshttp-communication-with-sim800/
https://github.com/Seeed-Studio/Seeeduino_GPRS/blob/master/sim800.h
Производител пишет что отладочные средства одинаковы.
http://electronix.ru/forum/index.php?act=attach&type=post&id=88933
Соответственно вам нужно найти нужные библиотеки.
Я недавно купил sim900, скачал библииотеки с сайта где покупал и они не подошли.
Гуглил и нашел нужные.
Соответственно вам нужно найти нужные библиотеки.
а посмотреть что я по ссылкам выложил - лень?
Соответственно вам нужно найти нужные библиотеки.
а посмотреть что я по ссылкам выложил - лень?
Я как бы пытался вам на вопрос ответить. У меня с подключением пробем нет.
интересно, пробовал скомпилировать скетч (обе), но ошибки появились не компилируется...пробовал разобраться, но я только начал разобраться в arduino, и ничего не Получается.
Аналогичная ошибка. Как исправляется?
Вот поправленный исходник. В комментариях ссылки на необходимые библиотеки.
Компилируется. В железе не проверял.
001
// GSM сигнализация на Arduino c использованием датчиков движения
002
003
// Original thread: <a href="http://arduino.ru/forum/proekty/gsm-signalizatsiya#comment-50135" title="http://arduino.ru/forum/proekty/gsm-signalizatsiya#comment-50135" rel="nofollow">http://arduino.ru/forum/proekty/gsm-signalizatsiya#comment-50135</a>
004
// GSM Shield sources: <a href="https://github.com/MarcoMartines/GSM-GPRS-GPS-Shield" title="https://github.com/MarcoMartines/GSM-GPRS-GPS-Shield" rel="nofollow">https://github.com/MarcoMartines/GSM-GPRS-GPS-Shield</a>
005
// OneWire sources (OneWire-master.zip): <a href="http://www.pjrc.com/teensy/td_libs_OneWire.html" title="http://www.pjrc.com/teensy/td_libs_OneWire.html" rel="nofollow">http://www.pjrc.com/teensy/td_libs_OneWire.html</a> / <a href="https://github.com/PaulStoffregen/OneWire" title="https://github.com/PaulStoffregen/OneWire" rel="nofollow">https://github.com/PaulStoffregen/OneWire</a>
006
// DHT sources (DHT-sensor-library-master.zip): <a href="https://github.com/adafruit/DHT-sensor-library" title="https://github.com/adafruit/DHT-sensor-library" rel="nofollow">https://github.com/adafruit/DHT-sensor-library</a>
007
008
// Датчики движения - на аналоговых входах (можно выключать сразу не подключенные каналы)
009
// Постановка и снятие ключем с информированием СМС.
010
// Сирена и индикация работы
011
// Контроль температуры и влажности в помещении где стоит блок сигнализации, и температуры во всех комнатах где стоят датчики движения.
012
// Датчики рекомендую использовать профессиональные, например "G.S.N. PATROL-201 PET", внутри есть стабилизатор на 5 вольт, откуда запитаны температурные датчики ds18b20
013
014
// ??? Для работы GSM Shield надо соединить 0,1 или 2,3 (в зависимости от установленной перемычки) и пины 7,8 (8 - включение, 7 - сброс).
015
016
// Прописать нужные пины в GSM.h:
017
// #define GSM_ON 8 // connect GSM Module turn ON to pin 8 (получается параллельно SW1)
018
// #define GSM_RESET 9 // connect GSM Module RESET to pin 9
019
// еще вроде как можно использовать выход RING, вроде как на пин D7. В документации или схеме что-то такое было.
020
021
// Прописать нужные пины в GSM.cpp:
022
// #define _GSM_TXPIN_ 2
023
// #define _GSM_RXPIN_ 3
024
// 2,3 - Software Serial; 0,1 - Atmega USART
025
026
// D0 - hardware USART
027
// D1 - hardware USART
028
// D2 - SIM900 SoftSerial TX
029
// D3 - SIM900 SoftSerial RX
030
// *D4 - Светодиоды на контакторах I-button для удобства
031
// D5 - сирена
032
// *D6 - реле индикации работы сигнализации // а чо не D13 ???
033
// *D7 - SIM900 Ring (not used) // ???
034
// D8 - SIM900 On/Off switch
035
// D9 - SIM900 Reset switch
036
// D10 - ds1820 sensor
037
// D11 - DTH sensor
038
// D12 - ibutton
039
// *D13 - встроенный светодиод
040
041
// A0-A5 - датчики движения
042
// *A4 - SDA
043
// *A5 - SCL
044
045
// В строках типа sms.SendSMS(xxx,SMS_Buffer) заменить xxx на номер телефона
046
047
//#define DEBUGING
048
#define SIM900
049
#include "SIM900.h"
050
#include <SoftwareSerial.h>
051
#include "sms.h"
052
#include "DHT.h"
053
#include <OneWire.h>
054
055
SMSGSM sms;
056
DHT dht(11, DHT22);
057
OneWire ibutton(12);
// пин ??? контекторы для снятия и постановки на сигнализацию брелком
058
OneWire ds(10);
//пин ??? Температурные датчики (расположены в датчиках движения)
059
060
boolean notConnected =
true
;
061
//char senderNumber[20];
062
bool
Alarm;
//если тру - надо ехать и бить лицо синеносым
063
String Message=
""
;
//Сообщение на выдачу в СМС
064
String RecieverNumber=
"+7xxxxxxx"
;
//номер, на который слать СМС - какой формат - пока хз.
065
char
SMS_Buffer[160];
//временный буфер для смс
066
char
Number_Buffer[20];
//временный буфер номера, на который слать СМС
067
int
AnalogSensors[8];
068
byte
PortNum[8];
069
byte
PortQ;
070
#define AlertPin 5 //пин - реле сирены
071
#define LightPin 6 // пин - реле индикации работы сигнализации
072
#define LedPin 4 // пин - Светодиоды на контакторах I-button для удобства
073
#define TimeOutLenght 180000 //таймаут
074
const
byte
Keys[5][8]={00000000, 00000000, 00000000, 00000000, 00000000};
//в каком виде ключи должны быть ??? 5 ключей по 8 байт ??? мои ключи забил жестко
075
076
boolean Led;
077
boolean TimeOut=
true
;
//признак недавней сработки сигнализации
078
boolean Armed=
true
;
//ставим сразу на сигнализацию
079
unsigned
long
LedTime;
//для мигания без задержки
080
unsigned
long
time;
//для проверки таймаута после сработки
081
082
void
setup
() {
083
dht.begin();
084
#if defined DEBUGING
085
Serial
.begin(9600);
086
Serial
.println(
"GSM Shield testing."
);
087
#endif
088
pinMode(AlertPin, OUTPUT);
089
digitalWrite(AlertPin, HIGH);
090
pinMode(LightPin, OUTPUT);
091
digitalWrite(LightPin, HIGH);
092
pinMode(LedPin, OUTPUT);
093
pinMode(13, OUTPUT);
// ???
094
TestAnalog();
//проверка подключенных сенсоров
095
Message+=
"Setup->Armed."
;
096
#if defined SIM900
097
if
(gsm.begin(2400)){
//включает шилд корректно
098
// Serial.println("\nstatus=READY");
099
}
100
//else Serial.println("\nstatus=IDLE");
101
while
(sms.IsSMSPresent(SMS_ALL)) sms.DeleteSMS(sms.IsSMSPresent(SMS_ALL));
//удаляем СМС
102
#endif
103
#if !defined DEBUGING
104
RecieverNumber.toCharArray(Number_Buffer,160);
105
Message.toCharArray(SMS_Buffer,160);
106
sms.SendSMS(Number_Buffer,SMS_Buffer);
//Send SMS
107
#endif
108
109
#if defined DEBUGING
110
Serial
.print(Message);
111
#endif
112
TimeOut=
false
;
113
digitalWrite(13,HIGH);
// ???
114
time = millis()+20000;
115
116
}
117
118
119
void
loop
() {
120
if
((LedTime<millis())&&Armed){
121
digitalWrite(LedPin, Led);
122
if
(TimeOut) digitalWrite(13, Led);
// ???
123
Led=!Led;
124
LedTime=millis()+500;
//задержка мигания светодиода
125
}
126
#if defined DEBUGING
127
//Serial.print("1");
128
#endif
129
if
(Armed && TimeOut)
//проверка датчиков движения
130
{
131
Message=
"Security system:Alarm!Sensors port:"
;
132
for
(
int
k=0;k<PortQ;++k) {
133
AnalogSensors[k] = analogRead(PortNum[k]);
134
if
(AnalogSensors[k]>100)
135
{
136
Alarm=
true
;
//ура поймаем бомжей
137
Message+=(PortNum[k]+1);
138
Message+=
","
;
139
}
140
}
141
if
(Alarm) Alarming();
142
}
143
144
CheckKey();
145
#if defined DEBUGING
146
//Serial.print("2");
147
#endif
148
if
(!TimeOut)
//проверка истечения задержки
149
{
150
if
(time<millis())
151
{
152
TimeOut=
true
;
153
Disalarming();
154
}
155
}
156
#if defined SIM900
157
while
(sms.IsSMSPresent(SMS_ALL))
//читаем входящую СМС
158
{
159
char
position;
160
char
sms_text[10];
161
position = sms.IsSMSPresent(SMS_ALL);
162
char
phone_number[20];
// array for the phone number
163
if
(position)
164
{
165
sms.GetSMS(position, phone_number, sms_text, 10);
166
sms.DeleteSMS(position);
167
if
(((sms_text[0]==
'o'
)||(sms_text[0]==
'O'
))&&(sms_text[1]==
'n'
)) Arming(0);
168
if
(((sms_text[0]==
'o'
)||(sms_text[0]==
'O'
))&&(sms_text[1]==
'f'
)&&(sms_text[2]==
'f'
)) Disarming(0);
169
}
170
}
171
#endif
172
}
173
void
TestAnalog()
174
{
175
PortQ=0;
176
int
portValue;
177
String GoodPort=
""
,CndPort=
""
,DataPort=
""
;
178
Message =
"Ports:"
;
179
for
(
byte
k=0;k<8;++k) {
180
portValue= analogRead(k);
181
Message+=portValue;
182
Message+=
","
;
183
// Serial.println(portValue);
184
185
if
((portValue<100)||(portValue>1000)) {
186
GoodPort+=(k+1);
187
GoodPort+=
","
;
188
PortNum[PortQ]=k;
189
PortQ++;
190
}
else
191
{
192
CndPort+=(k+1);
193
CndPort+=
","
;
194
}
195
}
196
if
(GoodPort!=
""
){
197
Message+=
" conn="
;
198
Message+=GoodPort;
199
}
200
if
(CndPort!=
""
){
201
Message+=
" NC="
;
202
Message+=CndPort;
203
}
204
if
(GoodPort!=
""
){
205
Message+=
" control "
;
206
Message+=PortQ;
207
Message+=
" pcs."
;
208
}
209
else
Message+=
" idle."
;
210
211
Message+=
" Hum="
;
212
Message+= (
int
)dht.readHumidity();
213
Message+=
"% Temp="
;
214
Message+= dht.readTemperature();
215
Message+=
"C"
;
216
ReadDS();
217
#if defined DEBUGING
218
Serial
.println(Message);
219
#endif
220
221
}
222
void
Disarming(
byte
KeyNum)
223
{
224
Disalarming();
225
digitalWrite(LightPin, HIGH);
//выключили индикацию
226
digitalWrite(LedPin, LOW);
//потушили индикатор на контакторах
227
TestAnalog();
228
if
(Armed) Message+=
" disarmed "
;
else
Message+=
" Been disarmed."
;
229
if
(KeyNum) {
230
Message+=
"by KEY no"
;
231
KeyNum++;
232
Message+=KeyNum;
233
}
else
Message+=
"by SMS"
;
234
char
SMS_Buffer[160];
235
Message.toCharArray(SMS_Buffer,160);
236
Armed=
false
;
237
sms.SendSMS(Number_Buffer,SMS_Buffer);
//Send SMS
238
}
239
void
Arming(
byte
KeyNum)
240
{
241
TimeOut=
false
;
242
time = millis()+20000;
243
digitalWrite(13,HIGH);
// ???
244
digitalWrite(LightPin, LOW);
//включили индикацию
245
digitalWrite(AlertPin, LOW);
//включили сирену
246
digitalWrite(LedPin, LOW);
//потушили индикатор на контакторах
247
delay(30);
248
digitalWrite(AlertPin, HIGH);
//выключили сирену
249
TestAnalog();
250
if
(!Armed) Message+=
" armed "
;
else
Message+=
" Been armed."
;
251
Armed=
true
;
252
if
(KeyNum)
253
{
254
Message+=
"by key no"
;
255
KeyNum++;
256
Message+=KeyNum;
257
}
else
Message+=
"by SMS"
;
258
Message.toCharArray(SMS_Buffer,160);
259
Armed=
true
;
260
sms.SendSMS(Number_Buffer,SMS_Buffer);
//Send SMS
261
}
262
void
Disalarming()
263
{
264
Alarm=
false
;
265
digitalWrite(AlertPin, HIGH);
//выключили сирену
266
digitalWrite(13,LOW);
// ???
267
}
268
void
Alarming()
269
{
270
TimeOut=
false
;
271
digitalWrite(13,HIGH);
// ???
272
digitalWrite(AlertPin, LOW);
//Включаем сирену
273
time = millis()+TimeOutLenght;
//000;//таймаут что б смс не сыпались пачками.
274
Message.toCharArray(SMS_Buffer,160);
275
Alarm=
true
;
276
sms.SendSMS(Number_Buffer,SMS_Buffer);
//Send SMS
277
}
278
void
CheckKey()
279
{
280
byte
addr[8];
281
ibutton.reset_search();
282
if
( ibutton.search(addr)) {
283
ibutton.reset();
284
boolean KeyMatch=
false
;
285
byte
Key=255;
286
for
(
byte
m=0;m<5;m++)
287
{
288
KeyMatch=
true
;
289
for
(
byte
i = 0; i < 8; i++)
if
(addr[i]!=Keys[m][i]){
290
KeyMatch=
false
;
291
break
;
292
}
293
if
(KeyMatch) {
294
Key=m+1;
295
break
;
296
}
297
}
298
if
(Key!=255)
299
{
300
Disalarming();
301
#
if
defined DEBUGING
302
Serial
.print(
"Key connected "
);
303
Serial
.println(Key);
304
#endif
305
for
(
byte
l = 0; l < 10; l++) {
306
delay(30);
307
digitalWrite(LedPin, HIGH);
308
delay(30);
309
digitalWrite(LedPin, LOW);
310
}
311
for
(
byte
i = 0; i < Key; i++)
312
{
313
delay(300);
314
digitalWrite(LedPin, HIGH);
315
delay(100);
316
digitalWrite(LedPin, LOW);
317
}
318
if
(Armed) Disarming(Key);
else
Arming(Key);
319
}
320
if
(!KeyMatch)
321
{
322
Message=
"Wrong key connected!"
;
323
Alarming();
324
#
if
defined DEBUGING
325
Serial
.print(
"Wrong Key "
);
//тревога
326
Serial
.print(
" "
);
327
Serial
.print(addr[0],HEX);
328
Serial
.print(
" "
);
329
Serial
.print(addr[1],HEX);
330
Serial
.print(
" "
);
331
Serial
.print(addr[2],HEX);
332
Serial
.print(
" "
);
333
Serial
.print(addr[3],HEX);
334
Serial
.print(
" "
);
335
Serial
.print(addr[4],HEX);
336
Serial
.print(
" "
);
337
Serial
.print(addr[5],HEX);
338
Serial
.print(
" "
);
339
Serial
.print(addr[6],HEX);
340
Serial
.print(
" "
);
341
Serial
.println(addr[7],HEX);
342
#endif
343
}
344
345
}
346
}
347
void
ReadDS()
348
{
349
byte
i;
350
byte
present = 0;
351
byte
type_s;
352
byte
data[12];
353
byte
addr[8];
354
float
celsius;
355
Message+=
" DS temp:"
;
356
while
( ds.search(addr)) {
357
#if defined DEBUGING
358
Serial
.print(
"ROM ="
);
359
for
( i = 0; i < 8; i++) {
360
Serial
.write(
' '
);
361
Serial
.print(addr[i], HEX);
362
}
363
if
(OneWire::crc8(addr, 7) != addr[7]) {
364
Serial
.println(
"CRC is not valid!"
);
365
return
;
366
}
367
#endif
368
Message+= String(addr[0], HEX);
369
370
ds.reset();
371
ds.select(addr);
372
ds.write(0x44, 1);
// start conversion, with parasite power on at the end
373
delay(1000);
// maybe 750ms is enough, maybe not
374
// we might do a ds.depower() here, but the reset will take care of it.
375
present = ds.reset();
376
ds.select(addr);
377
ds.write(0xBE);
// Read Scratchpad
378
379
380
#if defined DEBUGING
381
Serial
.print(
" Data = "
);
382
#endif
383
for
( i = 0; i < 9; i++) {
// we need 9 bytes
384
data[i] = ds.read();
385
#if defined DEBUGING
386
Serial
.print(data[i], HEX);
387
Serial
.print(
" "
);
388
#endif
389
}
390
#if defined DEBUGING
391
Serial
.print(
" CRC="
);
392
Serial
.print(OneWire::crc8(data, 8), HEX);
393
#endif
394
395
// Convert the data to actual temperature
396
// because the result is a 16 bit signed integer, it should
397
// be stored to an "int16_t" type, which is always 16 bits
398
// even when compiled on a 32 bit processor.
399
int16_t raw = (data[1] << 8) | data[0];
400
byte
cfg = (data[4] & 0x60);
401
// at lower res, the low bits are undefined, so let's zero them
402
if
(cfg == 0x00) raw = raw & ~7;
// 9 bit resolution, 93.75 ms
403
else
if
(cfg == 0x20) raw = raw & ~3;
// 10 bit res, 187.5 ms
404
else
if
(cfg == 0x40) raw = raw & ~1;
// 11 bit res, 375 ms
405
//// default is 12 bit resolution, 750 ms conversion time
406
raw = raw / 16.0*10;
407
celsius = (
float
)raw / 10;
408
//Message+= data[0];
409
Message+=
"="
;
410
Message+=celsius;
411
#if defined DEBUGING
412
Serial
.print(
" Temperature = "
);
413
Serial
.print(celsius);
414
Serial
.println(
" Celsius"
);
415
#endif
416
}
417
}
Я вот такой думаю заказать http://ru.aliexpress.com/item/GSM-GPRS-900-1800-MHz-Short-Message-Servic...
Я вот такой думаю заказать http://ru.aliexpress.com/item/GSM-GPRS-900-1800-MHz-Short-Message-Servic...
Ко мне такой приехал уже. Тоже еще не проверял. Для указанного девайса есть примеры использования в сети. Его основное достоинство - дешевизна.
Я же всяко отлаживаться буду на "нормальном" GSM шилде + UNO - это просто удобнее.
del
а что куда подключать? схемка есть?
а что куда подключать? схемка есть?
В исходниках все есть. А схемка - только у топикстартера, да и то, думаю, что только в голове.
мне интересно повозится, но запустить не с сим800 или 900, а просто с модемом по тх рх сигналу и все... а хотя "ринг" там тоже есть.
схемку тоже нарисовал бы.
Кто-нибудь использовал модуль GPRS-900
https://world.taobao.com/item/521797384915.htm?spm=a312a.7700714.0.0.RlbFZx#detail
Привлекает цена.
обвязка выглядит слабовато, врядли так будет стабильно работать...
Пример нормальной обвязки для популярного SIM900 можете посмотреть здесь - https://www.tindie.com/products/biolinq/tiny-sized-gsm-module-for-iot/
Кто-нибудь использовал модуль GPRS-900
https://world.taobao.com/item/521797384915.htm?spm=a312a.7700714.0.0.RlbFZx#detail
Привлекает цена.
нормально работает, только кондер после диода на 1000мкф надо ставить :)
сим900 уже неактуально так же как и сим300 когдато. - снимают с производтства.
смотрите сим800с - на сегодня самый дешевый.
Кто-нибудь использовал модуль GPRS-900
https://world.taobao.com/item/521797384915.htm?spm=a312a.7700714.0.0.RlbFZx#detail
Привлекает цена.
это дорого, такие модули на али стоят по полтора!! бакса. китаец спецом написал гпрс900 - чтобы подороже вам втюхать.
это 590й модуль, к симкому вроде не имеет отношения, но китайцы могут написать что угодно, лиж бы продать.
пока еще доступен для заказа, потом на SIM800 можно мигрировать, он полностью попиново совместим и обвязка нужна таже самая
сим 800С стоит от 5 или 6 баксов.
с сим800L не сравнить, во втором не выводят много ног, в том числе "бут". он типа подали питание и сам включился, не думаю, что это хорошо.
gsm сигнализация на ардуино должна быть вот такой:
Класс! Сперва хотел взять готовое решение... теперь очень задумался а не сделать ли самому :)
Сколько по деньгам всё вышло?
недешево... но всеравно там лучше чем гсм шилд готовый.
Хотя бы примерно... есть смысл вкладываться или проще готовое уже взять?
Если дешевле чем те варианты которые предлагаются в сети - то думаю стоит...