GSM сигнализация

moshael
Offline
Зарегистрирован: 01.10.2013

Во многих случаях использование arduino сводиться лишь к миганию светодиодами или роботам, которые хороши лишь как игрушки.  Ведь для развлечения и был создан этот конструктор. Для меня же задача стояла быстро, максимально используя типовые или готовые наработки изучить и применить МК при создании системы умного дома для себя.

Как раз на этапе  изучения протоколов общения с разными датчиками встала задача быстро (в течении недели) оборудовать коробку дома GSM сигнализацией, чтоб местные маргиналы не утащили материалы быстрее чем я успеваю подвозить их.

Приглашенный специалист выкатил условия: базовый блок (с базовым функционалом)= 300$, датчик движения 25$ (простой, только PIR сенсор), монтаж 300$.

Так как в планах стоит интеграция всего и всях в одну систему, я решил не просто прикинуть, а сразу собрать сигнализацию на Arduino с возможностью дальнейшей интеграции в одну систему Умного дома. Сейчас мне видиться наиболее приемлемым вариантом Ethernet протокол с Majordomo на сервере для сбора данных в базу данных и сложных сценариев работы.

Итак задача: GSM сигнализация на Arduino c использованием обычных (читай дешевых) датчиков движения.

Так как сроки поджимали, и ожидать железа из Китая не было времени, покупалось с рук: Arduino Mini Pro=10$, GSM shield no name=55$, и датчики движения для включения ламп освещения пускай и задорого 9$ , но зато у импортера на месте и сразу.

Датчик сначала взял один для тестов. Оказалось он отлично меня устраивает ,PIR sensor,

удобный корпус,  начинка разделена на две части: высоковольтная (в долгий ящик на опыты) и сенсор с операционным усилителем (питание от 3 до , помоему 24, вольт).

(позитивная фотография получилась, ему уже нравиться)

Выкинув первую часть и запитав сенсор от arduino получил высокий уровень сигнала при фиксации движения датчиком и низкий при отсутствии движения (при подключении к аналоговому входу можно даже определять обрывы разных линий: земли, питания и сигнальной).

Тесты проводились на Arduino UNO, а запуск на Arduino MINI PRO.

Неприятным моментом стало появление случайной помехи на входных цифровых каналах при не подключенном датчике на MINI (помните, что документация изучается паралельно ). Как говориться у природы нет…  Эта проблема стала поводом к дописыванию в setup проверки входов и исключению неподключенных из работы (естественно с информированием СМСкой о неподключенных и замкнутых каналах).

Честно признаюсь, лень – мой порок. Поэтому печатной платы у готового устройства нет . Самый простой и аккуратный спосод коммутации сенсоров стал старый коммутатор на 8 портов.

Пока я не нашел где купить гнездо I-button, так что и постановка и снятие с охраны работает только через СМС. Отправляем “on” на номер сигнализации – получаем отчет о тестировании портов и включенную сигнализацию. “off”- выключаем слежение за обьектом(естественно лучше проверять по списку разрешенных номеров).

В планах еще добавление режима “test” – ожидание сработки всех датчиков в течении некоторого времени, но это уже позже.

В итоге я получил полностью настраиваемую систему, в разы дешевле типовой, массу удовольствия и стимул заниматься этим хобби дальше.

//#include <SPI.h>
#include <GSM.h>
boolean armed=true; //ставим сразу на сигнализацию
boolean timeout=true; //признак недавней сработки сигнализации
unsigned long time;//для проверки таймаута после сработки
GSM gsmAccess;
GSM_SMS sms;
boolean notConnected = true;
char senderNumber[20];  
bool Alarm;//если тру - надо ехать и бить лицо синеносым
byte MaskB=B00111100; //PORTB отвечает за выводы 8 — 13 
byte MaskD=B11110000;  //PORTD отвечает за выводы 0 — 7;0,1- я исключил , так как отлаживал скетч через SPI,2,3- использует мой GSM шилд.
String Message;//Сообщение на выдачу в СМС

void setup() {
//  Serial.begin(9600);
//  Serial.begin(9600);
//  Serial.println("GSM Shield testing.-0");

  pinMode(8, OUTPUT); //включение sim900
  digitalWrite(8,LOW);// в разных GSM шилдах может быть разными порты для включения.
  delay(1000);
  digitalWrite(8,HIGH);
  delay(2000);
  digitalWrite(8,LOW);
//  Serial.println("GSM Shield testing.-1");

  TestSensors();//проверка подключенных сенсоров
//  Serial.println("GSM Shield testing.-2");

  // Start GSM connection
  while(notConnected) // бредятина какая то из примеров. На моем шилде зависало на if(gsmAccess.begin если шилд выключен.
  {
    if(gsmAccess.begin("")==GSM_READY) {
      notConnected = false;
//      Serial.println("Connected");
    }
    else
    {
//      Serial.println("Not connected");
      delay(1000);//соответсвенно в эту ветку никогда не приходил алгоритм
    }
  }
  if (armed) Message+="Status-armed."; else "Status- disarmed";
  Message+=" setup ending.";
  sms.beginSMS("номер для СМС уведомления");
  sms.print(Message);
  sms.endSMS();
}

void loop() {
//    Serial.print(timeout);
    if (armed && timeout) {
      byte DataPinB=PINB & MaskB;//чтение входов
      byte DataPinD=PIND & MaskD;
      if (DataPinD | DataPinB){
        Alarm=true;//ура поймаем бомжей
        Message="Security system:Alarm!Sensors port:";
        if (DataPinD & B10000) Message+="1,";
        if (DataPinD & B100000) Message+="2,";
        if (DataPinD & B1000000) Message+="3,";
        if (DataPinD & B10000000) Message+="4,";  
        if (DataPinB & B100) Message+="5,";
        if (DataPinB & B1000) Message+="6,";
        if (DataPinB & B10000) Message+="7,";
        if (DataPinB & B100000) Message+="8,";        
        timeout=false;
        time = millis()+300000;//таймаут что б смс не сыпались пачками.
        if(!notConnected){//то ж еиз примера, на самом деле как может быть не конектед ? скетч же тогда на сетапе завис.
//            Serial.println("Sending of SMS");
            sms.beginSMS("+номер для СМС уведомлений");
            sms.print(Message);
            sms.endSMS();
          }
        } else  Alarm=false;

    }
    delay(500);       
    if (!timeout) {      //проверка истечения задержки
      if (time<millis()) timeout=true;
      }
    char c;
    if (sms.available())   //читаем входящую СМС
      {
 //       Serial.print("Message received from:");
        String message;
        // Get remote number
        sms.remoteNumber(senderNumber, 20);
//        Serial.println(senderNumber);
        // Read message bytes and print them
        while(c=sms.read()) message += c;
        if (message=="on" || message=="On") {
          armed=true;
          TestSensors();
          Message+="Changed status to Armed";
          sms.beginSMS(+номер для СМС уведомлений);
          sms.print(Message);
          sms.endSMS();
        }
        if (message=="off" || message=="Off") {armed=false; Alarm=false;}
 //       Serial.println("");        
 //       Serial.println(message);
//        Serial.print("Status is - ");
//        Serial.println(armed);
        sms.flush();     // Delete message from modem memory
      //    Serial.println("MESSAGE DELETED");
      }
}

void TestSensors()
{
  byte DataPinB,AndDataPinB,OrDataPinB;
  byte DataPinD,AndDataPinD,OrDataPinD;
  MaskB=B00111100; //PORTB отвечает за выводы 8 — 13 
  MaskD=B11110000;  //PORTD отвечает за выводы 0 — 7
  DataPinB=PINB & MaskB;
  AndDataPinB=DataPinB;
  OrDataPinB=DataPinB;
  DataPinD=PIND & MaskD;
  AndDataPinD=DataPinD;
  OrDataPinD=DataPinD;
//  Serial.println("Testing sensors till 255.");
  for (byte k=0;k<255;k++) {
    for (byte l=0;l<255;l++) {//накапливаем кучу данных, если они скачут - следовательно в канале шум
        delay (1);
        DataPinB=PINB & MaskB;
        DataPinD=PIND & MaskD;
        AndDataPinB=AndDataPinB & DataPinB;
        OrDataPinB=OrDataPinB | DataPinB;
        AndDataPinD=AndDataPinD & DataPinD;
        OrDataPinD=OrDataPinD | DataPinD;  
        }
//    Serial.println(k);
  }
  Message="Security system:Test results:";
  if ((AndDataPinD!=0) || (AndDataPinB!=0)) {
    Message+="short circuited:";
    if (AndDataPinD & B10000) Message+="1,";
    if (AndDataPinD & B100000) Message+="2,";
    if (AndDataPinD & B1000000) Message+="3,";
    if (AndDataPinD & B10000000) Message+="4,";  
    if (AndDataPinB & B100) Message+="5,";
    if (AndDataPinB & B1000) Message+="6,";
    if (AndDataPinB & B10000) Message+="7,";
    if (AndDataPinB & B100000) Message+="8,";
  }  
  if ((OrDataPinD!=0) || (OrDataPinB!=0)) {
    Message+="Not connected:";
    if (OrDataPinD & B10000) Message+="1,";
    if (OrDataPinD & B100000) Message+="2,";
    if (OrDataPinD & B1000000) Message+="3,";
    if (OrDataPinD & B10000000) Message+="4,";  
    if (OrDataPinB & B100) Message+="5,";
    if (OrDataPinB & B1000) Message+="6,";
    if (OrDataPinB & B10000) Message+="7,";
    if (OrDataPinB & B100000) Message+="8,";
  }
  MaskB=MaskB&(~AndDataPinB)&(~OrDataPinB);
  MaskD=MaskD&(~AndDataPinD)&(~OrDataPinD);
  Message+="Working:";
  if (MaskD & B10000) Message+="1,";
  if (MaskD & B100000) Message+="2,";
  if (MaskD & B1000000) Message+="3,";
  if (MaskD & B10000000) Message+="4,";  
  if (MaskB & B100) Message+="5,";
  if (MaskB & B1000) Message+="6,";
  if (MaskB & B10000) Message+="7,";
  if (MaskB & B100000) Message+="8,";
}

Код не очень, будет время - поправлю. Но учитывая что хоть что то кроме e-mail я писал 10 лет назад -нормально.

Araris
Araris аватар
Offline
Зарегистрирован: 09.11.2012

Браво ! Прекрасный стиль, особенно хороши комменты в скетче.

Maverik
Offline
Зарегистрирован: 12.09.2012

Отлично! 

Еще бы распиновку узнать, и как удалось заставить этот шилд работать с библиотекой GSM.  У меня он работает только с SoftwareSerial.  

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Хорошо! 

но использование радио канала сводит на нет все плюсы :)

любой радио канал можно просто заглушить и делай что хочеш. 

a5021
Offline
Зарегистрирован: 07.07.2013

И откуда злоумышленник обычно узнает, что объект имеет сигнализацию завязаную на GSM?

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

a5021 пишет:

И откуда злоумышленник обычно узнает, что объект имеет сигнализацию завязаную на GSM?

ну наверное нужно очень много соображать на тему что телефонов никто не проводил, это очевидно по отсутсвию проводов.

а если есть сигнализация, то единственый вариант это сотовая связь. глушилки продаются вон на каждом углу.

 

step962
Offline
Зарегистрирован: 23.05.2011

Да путь себе глушат...

Что мешает топик-стартеру купить Интернет-пакет и каждую минуту (секунду) за недорого гнать информацию о том, что у него на объекте все хорошо/плохо?

Если злоумышленник поставит непреодолимые для GSM-сигнала помехи, принимающая информацию программа не получит никакой информации о статусе объекта - повод встревожиться...

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

step962 пишет:

Да путь себе глушат...

Что мешает топик-стартеру купить Интернет-пакет и каждую минуту (секунду) за недорого гнать информацию о том, что у него на объекте все хорошо/плохо?

Если злоумышленник поставит непреодолимые для GSM-сигнала помехи, принимающая информацию программа не получит никакой информации о статусе объекта - повод встревожиться...

это вариант, но тут возникает много ложных срабатываний... то сеть перегружена, то трафик застрял где то.. да мало ли что происходит с оператором сотовой сети.. :) каждый раз не набегаешся, да и в целом, какого целесообразность такой сигнализации? ну получил сигнал о проникновении, за час пока доедеш там и крышу разберут и унесут..

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Puhlyaviy пишет:

 за час пока доедеш там и крышу разберут и унесут..

С таким подходом только автоматическеи "Турели" по периметру ставить)))

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

NeiroN пишет:

С таким подходом только автоматическеи "Турели" по периметру ставить)))

только так!

сугубо мое мнение, глубоко личное и никому не навязываемое.. дом(квартира) должен быть адын, в котором ты и живеш, а все остальное это никому не нужные панты. из серии "- у меня есть дача на берегу океяна, я на ней бываю 2 недели в году" а остальное время я сижу и жду когда сигнализация сработает и страшно переживаю.. гы гы

a5021
Offline
Зарегистрирован: 07.07.2013

Кроме себя любимого, по близости обычно обитают другие домочадцы, которые могут иметь отличное от озвученного мнение. Некоторым из них дача может оказаться не менее важна, чем "дом в котором ты живешь".

Maverik
Offline
Зарегистрирован: 12.09.2012

16 совершенно бессмысленных, не относящихся к теме сообщений за полдня. охренеть...

может всё-же поговорим про библиотеки ардуино, пины и всё такое. а ваши терки лучше бы в соответствующие профильные форумы...

moshael
Offline
Зарегистрирован: 01.10.2013

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 не включает , а выключает шилд.

Свой скетч переписал под другую библиотеку:

GSM GPRS Shield for Arduino Uno
 
For informations and support:
 
Работает на порядок стабильнее (ен знаю почему в библиотеку код не разбирал)
 
Вариант с gprs соединением я рассматривал, но не захотелось писать утилиту серверную, которая бы пинговала контролер, собирала данные с него и высылала СМС через интернет шлюз. А приложение на телефон меня не устраивало, так как часто бываю в роуминге. Да и задача стоит отогнать булдосов от обьекта, поэтому наоборот хорошо показать что обьект под сигнализацией. Дял этого добавил индикацию.
 
moshael
Offline
Зарегистрирован: 01.10.2013

код за это время сильно изменился. Датчики переехали на аналоговые входы (можно выключать сразу не подключенные каналы)

Сейчас добавилось:

постановка и снятие ключем с информированием СМС.

Сирена и индикация работы

Контроль температуры и влажности в помещении где стоит блок сигнализации,  и температуры во всех комнатах где стоят датчики движения.

Датчики все таки рекомендую использовать профессиональные. Я поменял на такой. 

 

Плюсы:

дальность и точность работы НАМНОГО выше.

ложные срабатывания пропали.(первый вариант согласно инструкции очень чувствителен к сквозняку)

И внутри есть стабилизатор на 5 вольт, откуда я запитал температурные датчики ds18b20

 

//#define DEBUGING
#define SIM900 
#include "SIM900.h"
#include <SoftwareSerial.h>
#include "sms.h"
#include "DHT.h"
#include <OneWire.h>
DHT dht(11, DHT22);
SMSGSM sms;
boolean notConnected = true;
char senderNumber[20];  
bool Alarm;//если тру - надо ехать и бить лицо синеносым
String Message="";//Сообщение на выдачу в СМС
char buff[160];//временный буфер для смс
int AnalogSensors[8];
byte PortNum[8];
byte PortQ;
OneWire  ibutton(12);  // контекторы для снятия и постановки на сигнализацию брелком
OneWire  ds(10); //Температурные датчики (расположены в датчиках движения)
#define AlertPin 5 //реле сирены
#define TimeOutLenght 180000 //таймаут
#define LightPin 6 // реле индикации работы сигнализации
#define LedPin 4 //Светодиоды на контакторах I-button для удобства
const byte Keys[5][8]={//мои ключи забил жестко
  
boolean Led;
boolean TimeOut=true; //признак недавней сработки сигнализации
boolean Armed=true; //ставим сразу на сигнализацию
unsigned long LedTime; //для мигания без задержки
unsigned long time;//для проверки таймаута после сработки
void setup() {
	dht.begin();
#if defined DEBUGING
Serial.begin(9600);
Serial.println("GSM Shield testing.");
#endif 
  pinMode(AlertPin, OUTPUT);   
  digitalWrite(AlertPin, HIGH);
  pinMode(LightPin, OUTPUT);      
  digitalWrite(LightPin, HIGH);  
  pinMode(LedPin, OUTPUT);     
  pinMode(13, OUTPUT);
  TestAnalog(); //проверка подключенных сенсоров
  Message+="Setup->Armed.";
#if defined SIM900  
   if (gsm.begin(2400)){//включает шилд корректно
//    Serial.println("\nstatus=READY");
  }
  //else Serial.println("\nstatus=IDLE");
  	while (sms.IsSMSPresent(SMS_ALL)) sms.DeleteSMS(sms.IsSMSPresent(SMS_ALL));//удаляем СМС
#endif
#if !defined DEBUGING
	Message.toCharArray(buff,160);
	sms.SendSMS("",buff);//Send SMS
#endif

#if defined DEBUGING  
Serial.print(Message);
#endif     
  TimeOut=false;
  digitalWrite(13,HIGH);
  time = millis()+20000;
}


void loop() {
  if ((LedTime<millis())&&Armed){
     digitalWrite(LedPin, Led);  
     if (TimeOut) digitalWrite(13, Led);  
     Led=!Led;
     LedTime=millis()+500;//задержка мигания светодиода
  }
#if defined DEBUGING  
//Serial.print("1");
#endif    
    if (Armed && TimeOut) //проверка датчиков движения
	{
		Message="Security system:Alarm!Sensors port:";
		for (int k=0;k<PortQ;++k) {
			AnalogSensors[k] = analogRead(PortNum[k]);
			if (AnalogSensors[k]>100) 
			{
				Alarm=true;//ура поймаем бомжей
				Message+=(PortNum[k]+1);
				Message+=",";
			}
		}
		if (Alarm) Alarming();
	}

	CheckKey();
#if defined DEBUGING  
//Serial.print("2");
#endif        
    if (!TimeOut) //проверка истечения задержки
	{
		if (time<millis()) 
		{
			TimeOut=true;
			Disalarming();
		}
    }
#if defined SIM900 
	while (sms.IsSMSPresent(SMS_ALL))   //читаем входящую СМС
      {
        char position;  
		char sms_text[10];
        position = sms.IsSMSPresent(SMS_ALL);
		char phone_number[20]; // array for the phone number 
        if (position) 
		{
			sms.GetSMS(position, phone_number, sms_text, 10);
			sms.DeleteSMS(position);
			if (((sms_text[0]=='o')||(sms_text[0]=='O'))&&(sms_text[1]=='n')) Arming(0);
			if (((sms_text[0]=='o')||(sms_text[0]=='O'))&&(sms_text[1]=='f')&&(sms_text[2]=='f')) Disarming(0);
		}
	}
#endif        
}
void TestAnalog()
{
PortQ=0;
int portValue;
String GoodPort="",CndPort="",DataPort="";
Message ="Ports:";
for (byte k=0;k<8;++k) {
  portValue= analogRead(k);
  Message+=portValue;
  Message+=",";
 // Serial.println(portValue);

  if ((portValue<100)||(portValue>1000)) {
    GoodPort+=(k+1);
    GoodPort+=",";
    PortNum[PortQ]=k;
    PortQ++;
  } else
              {
                    CndPort+=(k+1);
                    CndPort+=",";
              }
}
if (GoodPort!=""){
  Message+=" conn=";
  Message+=GoodPort;
}
if (CndPort!=""){
  Message+=" NC=";
  Message+=CndPort;
}
if (GoodPort!=""){
  Message+=" control ";
  Message+=PortQ;
  Message+=" pcs.";
  }
  else Message+=" idle.";

  Message+=" Hum=";
  Message+= (int)dht.readHumidity();
  Message+="% Temp=";
  Message+= dht.readTemperature();
  Message+="C";
  ReadDS();
#if defined DEBUGING
Serial.println(Message);
#endif    
  
}
void Disarming(byte KeyNum)
{
	Disalarming();
	digitalWrite(LightPin, HIGH);//выключили индикацию
	digitalWrite(LedPin, LOW);   //потушили индикатор на контакторах
	TestAnalog();
	if (Armed) Message+=" disarmed "; else Message+=" Been disarmed.";
	if (KeyNum) {
			Message+="by KEY no";
			KeyNum++;
			Message+=KeyNum;
	} else Message+="by SMS";
	char buff[160];
	Message.toCharArray(buff,160);
	Armed=false;
	sms.SendSMS("",buff);//Send SMS
}
void Arming(byte KeyNum)
{
	TimeOut=false;
	time = millis()+20000;
	digitalWrite(13,HIGH);
	digitalWrite(LightPin, LOW);//включили индикацию
	digitalWrite(AlertPin, LOW);//включили сирену
	digitalWrite(LedPin, LOW);   //потушили индикатор на контакторах
	delay(30);
	digitalWrite(AlertPin, HIGH);//выключили сирену
	TestAnalog();
	if (!Armed) Message+=" armed "; else Message+=" Been armed.";
	Armed=true;
	if (KeyNum)
		{
			Message+="by key no";
			KeyNum++;
			Message+=KeyNum;
		} else Message+="by SMS";
	Message.toCharArray(buff,160);
	Armed=true;
	sms.SendSMS("",buff);//Send SMS
}
void Disalarming()
{
	Alarm=false;
	digitalWrite(AlertPin, HIGH);//выключили сирену
	digitalWrite(13,LOW);
}
void Alarming()
{
	TimeOut=false;
	digitalWrite(13,HIGH);
    digitalWrite(AlertPin, LOW);//Включаем сирену
    time = millis()+TimeOutLenght;//000;//таймаут что б смс не сыпались пачками.
	Message.toCharArray(buff,160);
	Alarm=true;
	sms.SendSMS("_",buff);//Send SMS
}
void CheckKey()
{
  byte addr[8];
  ibutton.reset_search();
  if ( ibutton.search(addr)) {  
    ibutton.reset();
    boolean KeyMatch=false;
    byte Key=255;
    for(byte m=0;m<5;m++)
	{
      KeyMatch=true;
      for( byte i = 0; i < 8; i++) if (addr[i]!=Keys[m][i]){
		  KeyMatch=false;
		  break;
	  }
      if (KeyMatch) {
		  Key=m+1;
		  break;
	  }
	}
	if (Key!=255)
	{
		Disalarming();
		  #if defined DEBUGING  
			  Serial.print("Key connected ");
			  Serial.println(Key);
		  #endif  
			for( byte l = 0; l < 10; l++) {
				   delay(30);
				   digitalWrite(LedPin, HIGH);
				   delay(30);
				   digitalWrite(LedPin, LOW);           
			}
			for( byte i = 0; i < Key; i++) 
			{
				delay(300);
				digitalWrite(LedPin, HIGH);
				delay(100);
				digitalWrite(LedPin, LOW);           
			}
			if (Armed) Disarming(Key);else Arming(Key);
	}
	if (!KeyMatch)
	{
		Message="Wrong key connected!";
		Alarming();
		#if defined DEBUGING  
			Serial.print("Wrong Key ");//тревога
			Serial.print(" ");
			Serial.print(addr[0],HEX);
			Serial.print(" ");
			Serial.print(addr[1],HEX);
			Serial.print(" ");
			Serial.print(addr[2],HEX);
			Serial.print(" ");
			Serial.print(addr[3],HEX);
			Serial.print(" ");
			Serial.print(addr[4],HEX);
			Serial.print(" ");
			Serial.print(addr[5],HEX);
			Serial.print(" ");
			Serial.print(addr[6],HEX);
			Serial.print(" ");
			Serial.println(addr[7],HEX);
		#endif     
	}
          
  }
}
void ReadDS()
{
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius;
  Message+= " DS temp:";
  while( ds.search(addr)) {
#if defined DEBUGING  
  Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr[i], HEX);
  }
  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return;
  }
#endif
  Message+= String(addr[0], HEX);

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        // start conversion, with parasite power on at the end
  delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Read Scratchpad

 
#if defined DEBUGING  
  Serial.print("  Data = ");
#endif
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
#if defined DEBUGING  
    Serial.print(data[i], HEX);
    Serial.print(" ");
#endif
  }
#if defined DEBUGING  
  Serial.print(" CRC=");
  Serial.print(OneWire::crc8(data, 8), HEX);
#endif

  // Convert the data to actual temperature
  // because the result is a 16 bit signed integer, it should
  // be stored to an "int16_t" type, which is always 16 bits
  // even when compiled on a 32 bit processor.
  int16_t raw = (data[1] << 8) | data[0];
    byte cfg = (data[4] & 0x60);
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
    //// default is 12 bit resolution, 750 ms conversion time
	raw = raw / 16.0*10;
	celsius = (float)raw / 10;
	//Message+= data[0];
	Message+="=";
	Message+=celsius;
#if defined DEBUGING  
  Serial.print("  Temperature = ");
  Serial.print(celsius);
  Serial.println(" Celsius");
#endif
  }
}


 

lesha108
Offline
Зарегистрирован: 09.12.2013

Спасибо за разработку! Хочу что-то подобное сделать. Есть вопросы:

1. Как ведет себя шилд при потере сети или слабом сигнале? Не нужны ли в цикле дополнительные проверки и переинициализации?

2. В коде нет вотчдогов. Были ли случаи зависания GSM шилда? Как его правильно инициализировать после зависания?

3. Есть ли возможность отлаживать sms без физической посылки\приема? (денег жалко)

moshael
Offline
Зарегистрирован: 01.10.2013

как ведет себя шилд при слабом сигнале не знаю. Хоть в месте где стоит сигнализация и показывает иногда ноль палок, все проблемы решились заменой библиотеки. По индикации на шилде сеть всегда держит. Мне не приходиться сейчас ни перегружать arduino или сам шилд, ни ресетить шилд. 

Если столкнусь - напишу, надо будет только проверить в начале цикла статус и заново запустить шилд. 

Вотчдог не поможет, так как на регистрацию уходит иногда много времени , и контролер может перегрузиться даже при штатной работе.

Ресет шилда можно сделать програмно через 7 ногу или выключить и включить его через 8 (займет много времени для регистрации в GSM сети).

Отлаживать нужно без СМС, хоть у меня и бесплатные СМС, но напрягает ждать регитрации модуля и прихода СМС. Поэтому советую сначала все функции отладить на serial а потом только включать СМС. В библиотеки есть директива для дебага, при заявленной, модуль не отправляет сообщения(как я понял из исходников).

ВНИМАНИЕ: возможен сбой не модуля, но оператора !!! Признаки такие: на все команды модулб не отвечает, о изменении статуса тоже ничего не говорит. Через, примерно, 10 минут приходят все потерянные сообщения пачкой. Я пока не догадался потратил много времени. Причем система есть , если модуль часто и много высылает сообщений - вероятнее всего будет затык.

revolt
Offline
Зарегистрирован: 03.01.2014

уважаемый просто восхищаюсь вашей работой!все супер.я только начинаю с ардуиной работать.у меня gsm шилд в связке с ардуино мега.и к вам вопрос,как ваш вышеизложенный код заставить работать через аппаратный порт меги,не програмный? какие и где внести изменения, если можно на примере измененного кода, чтобы я смог понять.буду очень благодарен!замечательная работа!

moshael
Offline
Зарегистрирован: 01.10.2013

ноги , на которых работает GSM билиотека в ней и указываються. посмотрите файлы библиотеки, там указано. Но на аппаратных ногах вы не сможете отлаживать ?

mkvmaks
Offline
Зарегистрирован: 07.07.2013

moshael, как с вами можно связаться ??? 

mkvmaks
Offline
Зарегистрирован: 07.07.2013

Подойдет ли такая плата ? http://amperka.ru/product/arduino-gprs-shield

BIOlinq
BIOlinq аватар
Offline
Зарегистрирован: 28.01.2014

mkvmaks пишет:

Подойдет ли такая плата ? http://amperka.ru/product/arduino-gprs-shield

 

Вполне, это продукт Seeeduino на SIM900, документация на него есть довольно подробная  http://www.seeedstudio.com/wiki/GPRS_Shield_V2.0

mkvmaks
Offline
Зарегистрирован: 07.07.2013

ПОдскажите, как правильно сделать опрос нескольких датчиков ??? Датчики должны быть подключены на каждый отдельный пин, либо все последовательно ???

mkvmaks
Offline
Зарегистрирован: 07.07.2013

???

moshael
Offline
Зарегистрирован: 01.10.2013

смотря от того сколько датчиков. В принципе можно и несколько датчиков повесить на один аналоговый порт, так же как и в обычных сигнализация. Анализируя уровень можно будет определить какие датчики в данный момент сработали. 

Можно на один цифровой несколько, но тогда вы не будете знать какой датчик сработал из гирлянды. 

Ну а если датчиков не много - можно на каждый порт по одному.

martc
Offline
Зарегистрирован: 06.05.2015

интересно, пробовал скомпилировать скетч (обе), но  ошибки появились не компилируется...пробовал разобраться, но я только начал разобраться в arduino, и ничего не Получается.

strunts:26: error: expected primary-expression before 'Led'
strunts:26: error: expected '}' before 'Led'
strunts:26: error: expected ',' or ';' before 'Led'
strunts.ino: In function 'void loop()':
strunts:68: error: 'Led' was not declared in this scope

 

 

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

а есть библиотеки под новый SIM800 гсм модуль? или  обычные библиотеки будут с ним работать?

the_wall
Offline
Зарегистрирован: 06.06.2013

Short Circuit пишет:

а есть библиотеки под новый SIM800 гсм модуль? или  обычные библиотеки будут с ним работать?

Ссылку можно на shield?

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015
Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Интересный модуль. Блютус 3.0, фм радио, емайлы, джекблек.
только почему то рекумендуют использовать только если проблемы с местом. Может глючный еще?

the_wall
Offline
Зарегистрирован: 06.06.2013

Производител пишет что отладочные средства одинаковы.

http://electronix.ru/forum/index.php?act=attach&type=post&id=88933

Соответственно вам нужно найти нужные библиотеки.

Я недавно купил sim900, скачал библииотеки с сайта где покупал и они не подошли. 

Гуглил и нашел нужные. 

 

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

the_wall пишет:

Соответственно вам нужно найти нужные библиотеки.

а посмотреть что я по ссылкам выложил - лень?

the_wall
Offline
Зарегистрирован: 06.06.2013

Short Circuit пишет:

the_wall пишет:

Соответственно вам нужно найти нужные библиотеки.

а посмотреть что я по ссылкам выложил - лень?

 

Я как бы пытался вам на вопрос ответить. У меня с подключением пробем нет.

Вячеслав 151
Offline
Зарегистрирован: 25.03.2015

martc пишет:

интересно, пробовал скомпилировать скетч (обе), но  ошибки появились не компилируется...пробовал разобраться, но я только начал разобраться в arduino, и ничего не Получается.

strunts:26: error: expected primary-expression before 'Led'
strunts:26: error: expected '}' before 'Led'
strunts:26: error: expected ',' or ';' before 'Led'
strunts.ino: In function 'void loop()':
strunts:68: error: 'Led' was not declared in this scope

 

 

Аналогичная ошибка. Как исправляется?

Egony
Offline
Зарегистрирован: 01.10.2015

Вот поправленный исходник. В комментариях ссылки на необходимые библиотеки.

Компилируется. В железе не проверял.

// GSM сигнализация на Arduino c использованием датчиков движения

// Original thread: http://arduino.ru/forum/proekty/gsm-signalizatsiya#comment-50135
// GSM Shield sources: https://github.com/MarcoMartines/GSM-GPRS-GPS-Shield
// OneWire sources (OneWire-master.zip): http://www.pjrc.com/teensy/td_libs_OneWire.html / https://github.com/PaulStoffregen/OneWire
// DHT sources (DHT-sensor-library-master.zip): https://github.com/adafruit/DHT-sensor-library

// Датчики движения - на аналоговых входах (можно выключать сразу не подключенные каналы)
// Постановка и снятие ключем с информированием СМС.
// Сирена и индикация работы
// Контроль температуры и влажности в помещении где стоит блок сигнализации, и температуры во всех комнатах где стоят датчики движения.
// Датчики рекомендую использовать профессиональные, например "G.S.N. PATROL-201 PET", внутри есть стабилизатор на 5 вольт, откуда запитаны температурные датчики ds18b20

// ??? Для работы GSM Shield надо соединить 0,1 или 2,3 (в зависимости от установленной перемычки) и пины 7,8 (8 - включение, 7 - сброс).

// Прописать нужные пины в GSM.h:
// #define GSM_ON              8 // connect GSM Module turn ON to pin 8 (получается параллельно SW1) 
// #define GSM_RESET           9 // connect GSM Module RESET to pin 9
// еще вроде как можно использовать выход RING, вроде как на пин D7. В документации или схеме что-то такое было.

// Прописать нужные пины в GSM.cpp:
// #define _GSM_TXPIN_ 2
// #define _GSM_RXPIN_ 3 
// 2,3 - Software Serial; 0,1 - Atmega USART

//   D0 - hardware USART
//   D1 - hardware USART
//   D2 - SIM900 SoftSerial TX
//   D3 - SIM900 SoftSerial RX 
//  *D4 - Светодиоды на контакторах I-button для удобства
//   D5 - сирена
//  *D6 - реле индикации работы сигнализации // а чо не D13 ???
//  *D7 - SIM900 Ring (not used) // ??? 
//   D8 - SIM900 On/Off switch
//   D9 - SIM900 Reset switch
//  D10 - ds1820 sensor
//  D11 - DTH sensor
//  D12 - ibutton
// *D13 - встроенный светодиод 

//   A0-A5 - датчики движения
//  *A4 - SDA
//  *A5 - SCL 

// В строках типа sms.SendSMS(xxx,SMS_Buffer) заменить xxx на номер телефона

//#define DEBUGING
#define SIM900 
#include "SIM900.h"
#include <SoftwareSerial.h>
#include "sms.h"
#include "DHT.h"
#include <OneWire.h>

SMSGSM sms;
DHT dht(11, DHT22);
OneWire ibutton(12);  // пин ??? контекторы для снятия и постановки на сигнализацию брелком
OneWire ds(10); //пин ??? Температурные датчики (расположены в датчиках движения)

boolean notConnected = true;
//char senderNumber[20];  
bool Alarm;//если тру - надо ехать и бить лицо синеносым
String Message="";//Сообщение на выдачу в СМС
String RecieverNumber="+7xxxxxxx"; //номер, на который слать СМС - какой формат - пока хз.
char SMS_Buffer[160];//временный буфер для смс
char Number_Buffer[20]; //временный буфер номера, на который слать СМС  
int AnalogSensors[8];
byte PortNum[8];
byte PortQ;
#define AlertPin 5 //пин - реле сирены
#define LightPin 6 // пин - реле индикации работы сигнализации
#define LedPin 4 // пин - Светодиоды на контакторах I-button для удобства
#define TimeOutLenght 180000 //таймаут
const byte Keys[5][8]={00000000, 00000000, 00000000, 00000000, 00000000}; //в каком виде ключи должны быть ??? 5 ключей по 8 байт ??? мои ключи забил жестко

boolean Led;
boolean TimeOut=true; //признак недавней сработки сигнализации
boolean Armed=true; //ставим сразу на сигнализацию
unsigned long LedTime; //для мигания без задержки
unsigned long time;//для проверки таймаута после сработки

void setup() {
 dht.begin();
#if defined DEBUGING
Serial.begin(9600);
Serial.println("GSM Shield testing.");
#endif 
  pinMode(AlertPin, OUTPUT);   
  digitalWrite(AlertPin, HIGH);
  pinMode(LightPin, OUTPUT);      
  digitalWrite(LightPin, HIGH);  
  pinMode(LedPin, OUTPUT);     
  pinMode(13, OUTPUT); // ???
  TestAnalog(); //проверка подключенных сенсоров
  Message+="Setup->Armed.";
#if defined SIM900  
   if (gsm.begin(2400)){//включает шилд корректно
//    Serial.println("\nstatus=READY");
  }
  //else Serial.println("\nstatus=IDLE");
   while (sms.IsSMSPresent(SMS_ALL)) sms.DeleteSMS(sms.IsSMSPresent(SMS_ALL));//удаляем СМС
#endif
#if !defined DEBUGING
        RecieverNumber.toCharArray(Number_Buffer,160);
 Message.toCharArray(SMS_Buffer,160);
 sms.SendSMS(Number_Buffer,SMS_Buffer);//Send SMS
#endif

#if defined DEBUGING  
Serial.print(Message);
#endif     
  TimeOut=false;
  digitalWrite(13,HIGH); // ???
  time = millis()+20000;

}


void loop() {
  if ((LedTime<millis())&&Armed){
     digitalWrite(LedPin, Led);  
     if (TimeOut) digitalWrite(13, Led);  // ???
     Led=!Led;
     LedTime=millis()+500;//задержка мигания светодиода
  }
#if defined DEBUGING  
//Serial.print("1");
#endif    
    if (Armed && TimeOut) //проверка датчиков движения
 {
  Message="Security system:Alarm!Sensors port:";
  for (int k=0;k<PortQ;++k) {
   AnalogSensors[k] = analogRead(PortNum[k]);
   if (AnalogSensors[k]>100) 
   {
    Alarm=true;//ура поймаем бомжей
    Message+=(PortNum[k]+1);
    Message+=",";
   }
  }
  if (Alarm) Alarming();
 }

 CheckKey();
#if defined DEBUGING  
//Serial.print("2");
#endif        
    if (!TimeOut) //проверка истечения задержки
 {
  if (time<millis()) 
  {
   TimeOut=true;
   Disalarming();
  }
    }
#if defined SIM900 
 while (sms.IsSMSPresent(SMS_ALL))   //читаем входящую СМС
      {
        char position;  
  char sms_text[10];
        position = sms.IsSMSPresent(SMS_ALL);
  char phone_number[20]; // array for the phone number 
        if (position) 
  {
   sms.GetSMS(position, phone_number, sms_text, 10);
   sms.DeleteSMS(position);
   if (((sms_text[0]=='o')||(sms_text[0]=='O'))&&(sms_text[1]=='n')) Arming(0);
   if (((sms_text[0]=='o')||(sms_text[0]=='O'))&&(sms_text[1]=='f')&&(sms_text[2]=='f')) Disarming(0);
  }
 }
#endif        
}
void TestAnalog()
{
PortQ=0;
int portValue;
String GoodPort="",CndPort="",DataPort="";
Message ="Ports:";
for (byte k=0;k<8;++k) {
  portValue= analogRead(k);
  Message+=portValue;
  Message+=",";
 // Serial.println(portValue);

  if ((portValue<100)||(portValue>1000)) {
    GoodPort+=(k+1);
    GoodPort+=",";
    PortNum[PortQ]=k;
    PortQ++;
  } else
              {
                    CndPort+=(k+1);
                    CndPort+=",";
              }
}
if (GoodPort!=""){
  Message+=" conn=";
  Message+=GoodPort;
}
if (CndPort!=""){
  Message+=" NC=";
  Message+=CndPort;
}
if (GoodPort!=""){
  Message+=" control ";
  Message+=PortQ;
  Message+=" pcs.";
  }
  else Message+=" idle.";

  Message+=" Hum=";
  Message+= (int)dht.readHumidity();
  Message+="% Temp=";
  Message+= dht.readTemperature();
  Message+="C";
  ReadDS();
#if defined DEBUGING
Serial.println(Message);
#endif    
  
}
void Disarming(byte KeyNum)
{
 Disalarming();
 digitalWrite(LightPin, HIGH);//выключили индикацию
 digitalWrite(LedPin, LOW);   //потушили индикатор на контакторах
 TestAnalog();
 if (Armed) Message+=" disarmed "; else Message+=" Been disarmed.";
 if (KeyNum) {
   Message+="by KEY no";
   KeyNum++;
   Message+=KeyNum;
 } else Message+="by SMS";
 char SMS_Buffer[160];
 Message.toCharArray(SMS_Buffer,160);
 Armed=false;
 sms.SendSMS(Number_Buffer,SMS_Buffer);//Send SMS
}
void Arming(byte KeyNum)
{
 TimeOut=false;
 time = millis()+20000;
 digitalWrite(13,HIGH);  // ???
 digitalWrite(LightPin, LOW);//включили индикацию
 digitalWrite(AlertPin, LOW);//включили сирену
 digitalWrite(LedPin, LOW);   //потушили индикатор на контакторах
 delay(30);
 digitalWrite(AlertPin, HIGH);//выключили сирену
 TestAnalog();
 if (!Armed) Message+=" armed "; else Message+=" Been armed.";
 Armed=true;
 if (KeyNum)
  {
   Message+="by key no";
   KeyNum++;
   Message+=KeyNum;
  } else Message+="by SMS";
 Message.toCharArray(SMS_Buffer,160);
 Armed=true;
 sms.SendSMS(Number_Buffer,SMS_Buffer);//Send SMS
}
void Disalarming()
{
 Alarm=false;
 digitalWrite(AlertPin, HIGH);//выключили сирену
 digitalWrite(13,LOW); // ???
}
void Alarming()
{
 TimeOut=false;
 digitalWrite(13,HIGH); // ???
    digitalWrite(AlertPin, LOW);//Включаем сирену
    time = millis()+TimeOutLenght;//000;//таймаут что б смс не сыпались пачками.
 Message.toCharArray(SMS_Buffer,160);
 Alarm=true;
 sms.SendSMS(Number_Buffer,SMS_Buffer);//Send SMS
}
void CheckKey()
{
  byte addr[8];
  ibutton.reset_search();
  if ( ibutton.search(addr)) {  
    ibutton.reset();
    boolean KeyMatch=false;
    byte Key=255;
    for(byte m=0;m<5;m++)
 {
      KeyMatch=true;
      for( byte i = 0; i < 8; i++) if (addr[i]!=Keys[m][i]){
    KeyMatch=false;
    break;
   }
      if (KeyMatch) {
    Key=m+1;
    break;
   }
 }
 if (Key!=255)
 {
  Disalarming();
    #if defined DEBUGING  
     Serial.print("Key connected ");
     Serial.println(Key);
    #endif  
   for( byte l = 0; l < 10; l++) {
       delay(30);
       digitalWrite(LedPin, HIGH);
       delay(30);
       digitalWrite(LedPin, LOW);           
   }
   for( byte i = 0; i < Key; i++) 
   {
    delay(300);
    digitalWrite(LedPin, HIGH);
    delay(100);
    digitalWrite(LedPin, LOW);           
   }
   if (Armed) Disarming(Key);else Arming(Key);
 }
 if (!KeyMatch)
 {
  Message="Wrong key connected!";
  Alarming();
  #if defined DEBUGING  
   Serial.print("Wrong Key ");//тревога
   Serial.print(" ");
   Serial.print(addr[0],HEX);
   Serial.print(" ");
   Serial.print(addr[1],HEX);
   Serial.print(" ");
   Serial.print(addr[2],HEX);
   Serial.print(" ");
   Serial.print(addr[3],HEX);
   Serial.print(" ");
   Serial.print(addr[4],HEX);
   Serial.print(" ");
   Serial.print(addr[5],HEX);
   Serial.print(" ");
   Serial.print(addr[6],HEX);
   Serial.print(" ");
   Serial.println(addr[7],HEX);
  #endif     
 }
          
  }
}
void ReadDS()
{
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius;
  Message+= " DS temp:";
  while( ds.search(addr)) {
#if defined DEBUGING  
  Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr[i], HEX);
  }
  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return;
  }
#endif
  Message+= String(addr[0], HEX);

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        // start conversion, with parasite power on at the end
  delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Read Scratchpad

 
#if defined DEBUGING  
  Serial.print("  Data = ");
#endif
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
#if defined DEBUGING  
    Serial.print(data[i], HEX);
    Serial.print(" ");
#endif
  }
#if defined DEBUGING  
  Serial.print(" CRC=");
  Serial.print(OneWire::crc8(data, 8), HEX);
#endif

  // Convert the data to actual temperature
  // because the result is a 16 bit signed integer, it should
  // be stored to an "int16_t" type, which is always 16 bits
  // even when compiled on a 32 bit processor.
  int16_t raw = (data[1] << 8) | data[0];
    byte cfg = (data[4] & 0x60);
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
    //// default is 12 bit resolution, 750 ms conversion time
 raw = raw / 16.0*10;
 celsius = (float)raw / 10;
 //Message+= data[0];
 Message+="=";
 Message+=celsius;
#if defined DEBUGING  
  Serial.print("  Temperature = ");
  Serial.print(celsius);
  Serial.println(" Celsius");
#endif
  }
}




 

 

maksmkv
Offline
Зарегистрирован: 07.04.2013

Я вот такой  думаю заказать http://ru.aliexpress.com/item/GSM-GPRS-900-1800-MHz-Short-Message-Servic...

Egony
Offline
Зарегистрирован: 01.10.2015

maksmkv пишет:

Я вот такой  думаю заказать http://ru.aliexpress.com/item/GSM-GPRS-900-1800-MHz-Short-Message-Servic...

Ко мне такой приехал уже. Тоже еще не проверял. Для указанного девайса есть примеры использования в сети. Его основное достоинство - дешевизна.

Я же всяко отлаживаться буду на "нормальном" GSM шилде + UNO - это просто удобнее.

 

Egony
Offline
Зарегистрирован: 01.10.2015

del

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

а что куда подключать? схемка есть?

Egony
Offline
Зарегистрирован: 01.10.2015

Short Circuit пишет:

а что куда подключать? схемка есть?

В исходниках все есть. А схемка - только у топикстартера, да и то, думаю, что только в голове.

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

мне интересно повозится, но запустить не с сим800 или 900, а  просто с модемом по тх рх  сигналу и все... а хотя "ринг" там тоже есть.

 

схемку тоже нарисовал бы.

soznik
Offline
Зарегистрирован: 20.09.2015

Кто-нибудь использовал модуль GPRS-900

https://world.taobao.com/item/521797384915.htm?spm=a312a.7700714.0.0.RlbFZx#detail

Привлекает цена.

BIOlinq
BIOlinq аватар
Offline
Зарегистрирован: 28.01.2014

обвязка выглядит слабовато, врядли так будет стабильно работать...

 

Пример нормальной обвязки для популярного SIM900 можете посмотреть здесь - https://www.tindie.com/products/biolinq/tiny-sized-gsm-module-for-iot/

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

soznik пишет:

Кто-нибудь использовал модуль GPRS-900

https://world.taobao.com/item/521797384915.htm?spm=a312a.7700714.0.0.RlbFZx#detail

Привлекает цена.

нормально работает, только кондер после диода на 1000мкф надо ставить :)

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

сим900 уже неактуально так же как и сим300 когдато. - снимают с производтства.

смотрите сим800с - на сегодня самый дешевый.

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

soznik пишет:

Кто-нибудь использовал модуль GPRS-900

https://world.taobao.com/item/521797384915.htm?spm=a312a.7700714.0.0.RlbFZx#detail

Привлекает цена.

 

это дорого, такие модули на али стоят по полтора!! бакса.  китаец спецом написал гпрс900 - чтобы подороже вам втюхать.

это 590й модуль, к симкому вроде не имеет отношения, но китайцы могут написать что угодно, лиж бы продать.

BIOlinq
BIOlinq аватар
Offline
Зарегистрирован: 28.01.2014

пока еще доступен для заказа, потом на SIM800 можно мигрировать, он полностью попиново совместим и обвязка нужна таже самая

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

сим 800С стоит  от 5 или 6 баксов.

с сим800L не сравнить, во втором не выводят много ног, в том числе "бут". он типа подали питание и сам включился, не думаю,  что это хорошо.

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

gsm сигнализация на ардуино должна быть вот такой: 

Ампер
Offline
Зарегистрирован: 07.04.2016

Класс! Сперва хотел взять готовое решение... теперь очень задумался а не сделать ли самому :)

Сколько по деньгам всё вышло?

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

недешево... но всеравно там лучше чем гсм шилд готовый.

Ампер
Offline
Зарегистрирован: 07.04.2016

Хотя бы примерно... есть смысл вкладываться или проще готовое уже взять?

Если дешевле чем те варианты которые предлагаются в сети - то  думаю стоит...