Сигнализация с отправкой sms и датчики от китайских сигнализаций на 433МГц

RomanVS
Offline
Зарегистрирован: 27.06.2016

Решил сделать охранную  сигнализацию для дома.

Была китайскя arduino uno и несколькоP8-%D0%B1%D0%B5%D1%81%D0%BF%D1%80%D0%BE%китайских датчиков(Они оказались серии PT2262). Наверное лучше и проще купить готовую сигнализацию, но хочется попробывать сделать чтото свое родное, хотябы и на uno.

Докупил пульт и радиомодули на 433, + блютуз модуль для связи с телефоном android.

pult1_b.jpg%D0%A1%D0%B0%D0%BC%D0%B0%D1%8F-%D0%BD%D0

Схема работы: приходит сигнал от датчика на ардуино, номер которого по блютуз передается на телефон, а он отправляет смс на нужные номера. Наверное потом куплю GSM модуль, а пока мой первый проект использует GSM модуль телефона. При первом включении нужно стереть память EEPROM, и первые два сигнала с пульта записываются как управляющие, с помощью которых можно прописать любые датчики. Потом при помощи команд можно удалять добовлять менять режимы датчиков.

Также написал программу на app inventor для синхранизации с ардуино:https://yadi.sk/d/wNGGxOD8spPMW

Возможно это комуто пригодится. фото проекта:

/*
* This sketch is ALARM (RomanVS)
* Connect the receiver to digital pin 2.
*/
#include <EEPROM.h>
#include <RemoteReceiver.h>
#include <RemoteTransmitter.h>
unsigned int N = 70; // kol datch max
unsigned int countA;
byte          k,i; // kol enable datch (K<N) 
unsigned long datch[71];  // база номеров датчиков
byte          dd[71];     // база режимов датчиков
byte          tm[84];
unsigned int per = 441; //period duration
unsigned long code; //code
unsigned long tCode;
boolean cd,aw,onv,mc,e = false;
boolean p,pp2,pp3 = false;
boolean d,dd4,dd5 = false;
unsigned long t;
unsigned int god = 16;
unsigned long start = micros();
unsigned long correct = 0;
byte hours,minutes,sec;
unsigned int day=125;
String str;

void setup() {
  Serial.begin(9600);
  read_baza();
  cd=0;
  vvv_syn();
  pinMode(13, OUTPUT);
  pinMode(7, OUTPUT);  //BT
  pinMode(12, OUTPUT);  //Transmit
  pinMode(8, OUTPUT);   // GND 
  digitalWrite(8, LOW); // WARNING  GND no use!!!!!    (no -- digitalWrite(8, HIGH); )    !!!!!      !!!!!
  // Initialize receiver on interrupt 0 (= digital pin 2), calls the callback "showCode"
  RemoteReceiver::init(0, 2, showCode);
}

void loop() {
timer();  //  ЧАСЫ
                       ///// РАБОТА с BT  
if (Serial.available())   
   {
      //val = Serial.read();
      str = Serial.readString();
      if (str.substring(0, 6) == "DELall")  {del_baza();Serial.println("Hello Baza Deleted:");};
      if (str.substring(0, 3) == "del") {del_Pul_Dat(str.substring(3, 5).toInt());vvv_syn();};
      if (str.substring(0, 2) == "ch") 
      {ch_Pul_Dat(str.substring(2, 4).toInt(),str.substring(4, 6).toInt(),str.substring(6, 15).toInt());vvv_syn();};
      
      if (str.substring(0, 5) == "timer"){vvv_timer();};
      if (str.substring(0, 5) == "time:") 
         {if (str.substring(5, 7).toInt()<24) hours = str.substring(5, 7).toInt();
          if (str.substring(7, 9).toInt()<60) minutes = str.substring(7, 9).toInt();
          if (str.substring(9, 11).toInt()<60) sec = str.substring(9, 11).toInt();
          if (str.substring(11, 16).toInt()<60000) {day = str.substring(11, 16).toInt();EEPROM.put(3, day);};
          vvv_timer();
          };
      
      if (str == "synchr"){vvv_syn();}
      if (str == "syntm"){vvv_syntm();}
      
      if (str == "signalon"){onv=0;Serial.println("signal_on");}     
      if (str == "signaloff"){onv=1;Serial.println("signal_off");}   
     
     if (str == "on") a_on();
     if (str == "off") a_off();     
     
     if (str == "BTon") BT_on();
     if (str == "BToff") BT_off();
     
     if (str == "writeall") {write_baza();Serial.println("Hello Baza WriteOK:");};
     if (str == "readall") {read_baza();Serial.println("Hello Baza readOK:");};
     if (str == "BAZAeeprom") {vvv_baza();};
     
     if (str.substring(0, 5) == "send:") 
          {tCode=str.substring(5, 14).toInt();
           Serial.print("send:");Serial.print(tCode);
           transmit(tCode,per);
           Serial.println(">OK"); 
            };
     if (str == "help")vvv_help();
     
     if (str.substring(0, 5) == "corr:")
          {correct=str.substring(5, 14).toInt();
           Serial.print("correct:");Serial.print(correct);
           Serial.println(">ok"); 
            };
     
     if (str == "echoon") {e=0;Serial.println("echoon");};
     if (str == "echooff") {e=1;Serial.println("echooff");};
     
     if (str == "show_set") 
     {
      if (aw == 0) {Serial.println("alarm  -- off");} else {Serial.println("alarm  -- on");};
      if (e == 1) {Serial.println("echo   -- off");} else {Serial.println("echo   -- on");};
      if (onv == 1) {Serial.println("signal -- off");} else {Serial.println("signal -- on");};
      Serial.print("correct:");Serial.println(correct);
     }
   }
               /////  РАБОТА ALARM
               
if (countA !=0 && aw == 1) {digitalWrite(13, HIGH);delay(100);digitalWrite(13, LOW);};
if (cd==1){
     
 
   if (analiz(code)!=252)
             {
         
   
      if ((dd[analiz(code)]== 5) || (dd[analiz(code)]==4))
        {
           save_alarm(countA);
          countA++;
          sendbluetooth(analiz(code));
          
          if (countA>20){countA=0;mc=1;};
           };
           
      if (onv==0) {vvv_timer();};
      
      if (dd[analiz(code)]== 2)a_on();
      if (dd[analiz(code)]== 3)a_off();
      if (dd[analiz(code)]== 7) 
        { pp2=1;p=1;digitalWrite(13, HIGH);Serial.println("PUSHED_MANAG:1"); };
      if ((dd[analiz(code)]== 1))
        { pp3=1;p=1;digitalWrite(13, HIGH);Serial.println("PUSHED_MANAG:2"); };
                 }
          else
            {       
          if ((k==0)) {dd[1]=7;datch[1]=code;k++;Serial.println("MANAG:1");}; // write 1 signal mod 7
          if ((k==1) && (datch[1]!=code)) {dd[2]=1;datch[2]=code;;k++;Serial.println("MANAG:2");
                                            write_baza();}; // write 2 signal mod 1
            };

  cd=0;};


delay(100);
}
////////////////////////////////////////////////////////////  END

void a_on(void)
   {
    Serial.println("Alarm_on");countA=0;aw=1;mc=0;
     for (i=1;i<=k;i++) {if (dd[i]==6) dd[i]=4;};
    }
void a_off(void)
   {
    Serial.println("Alarm_off");vvv_syntm();aw=0;
     for (i=1;i<=k;i++) {if (dd[i]==4) dd[i]=6;};
    }    
void save_alarm(byte j)
   {
          j =j *4;
          tm[j] = analiz(code);
          tm[++j] = hours;
          tm[++j] = minutes;
          tm[++j] = sec;
      }
byte analiz(unsigned long code1)
{
  byte ret=252;
  for (i=1;i<=k;i++)
      {if (datch[i]==code1)
       ret=i;}
       return ret;
 }
void sendbluetooth(byte sn)
{Serial.print("ALARM:");
Serial.print(countA);
Serial.print(":");
Serial.print(sn);
Serial.print("=");
Serial.print(hours);
Serial.print(";");
Serial.print(minutes);
Serial.print(";");
Serial.println(sec);
 }
 ///////////////////////////////////////////////////////////////zap
void zap_Pul(unsigned long cde)
{ byte m;
  m=analiz(cde);
                                     // write pult
    if (m==252){k++;m=k;};
     if (k==N+1) {k--;m=k;};    
  switch (dd[m]) {
    case 7:
      d=1;dd4=1;Serial.println("PUSH_MANAG:1");
      break;
    case 1:
      d=1;dd5=1;Serial.println("PUSH_MANAG:2");
      break;
    default: 
     if (pp2==1 ) 
        {datch[m]=code;
         dd[m]=2; };
        if (pp3==1 ) 
         {datch[m]=code;
         dd[m]=3;};  
        
        dd[0]= k; 
        write_data(m);    
        digitalWrite(13, LOW);     
        Serial.print("zapcode_P:");
        Serial.print(datch[m]);
        Serial.print(":=:");
        Serial.print(dd[m]);
        Serial.print("->");
        Serial.println(m);
        vvv_syn();
    break;
                 } 
     p=0;pp2=0;pp3=0;
     
  }
void zap_Dat(unsigned long cde)
{  byte m;
   m=analiz(cde);
                                     // write datch
    if (m==252) {k++;m=k;};                     
    if (k==N+1) {k--;m=k;};  
  switch (dd[m]) {
    case 7:
      digitalWrite(13, LOW);     
        BT_on();
      break;
    case 1:
      digitalWrite(13, LOW);     
        BT_off();
      break;
    default: 
     if (dd4 == 1) 
        {datch[m]=code;
         dd[m]=6;};
        if (dd5 == 1) 
         {datch[m]=code;
         dd[m]=5;};  

        dd[0]= k;
        write_data(m);     
        digitalWrite(13, LOW);     
        Serial.print("zapcode_D:");
        Serial.print(datch[m]);
        Serial.print(":=:");
        Serial.print(dd[m]);
        Serial.print("->");
        Serial.println(m);
        vvv_syn();
    break;
                 } 
     d=0;dd4=0;dd5=0;
    
  }

        //////////////////////////////////////////////////
                       ///EEPROM
void read_baza(void)  
  {
   k = EEPROM.read(0);
   dd[0] = k;
   EEPROM.get(1, datch[0]);
   for (i=1;i<=k;i++)
     {dd[i] = EEPROM.read(i*5);
      if (dd[i] == 4) {aw=1;}; 
      EEPROM.get(i*5+1, datch[i]);};       
   }

void write_data(byte b) 
    { 
     EEPROM.write(0, k);
     EEPROM.write(b*5, dd[b]);
     EEPROM.put(b*5+1, datch[b]);   
      }  

void write_baza(void) 
   {
    EEPROM.put(3, day);
    EEPROM.write(0, k);
    for (i=1;i<=k;i++)
     {EEPROM.write(i*5, dd[i]);
      EEPROM.put(i*5+1, datch[i]);}; 
    }
   ////////////////////////////////////////////////////////////
                          ///delete and change
void del_Pul_Dat(byte m)
    {
       byte j;
       for (i=m;i<=k;i++) 
        { 
          if (m!=k)
            {j=i+1;
             dd[i]= dd[j];
             datch[i]= datch[j];}
          else {dd[m]= 0;datch[m]= 0;}
          };     
      if (m<=k) {k=k-1;dd[0]=k;};
      write_baza();
      Serial.println("deleted");
      }                          
void ch_Pul_Dat(byte m,byte mn,unsigned long chcde) 
     {  if (k==N) k--;
        if (m>=k+1){k++;m=k;EEPROM.write(0, k);dd[0]=k;};
        dd[m]= mn;
       datch[m]= chcde;
       EEPROM.write(m*5, mn);
       EEPROM.put(m*5+1, chcde);
       Serial.print("change:");
       Serial.println(m);
                }
void del_baza(void)
    {
     for (i=0;i<=k*5;i++)
     EEPROM.write(i, 0); 
     for  (i=0;i<=k;i++)
          {dd[i]= 0;datch[i]= 0;}
      k=0;
      cd=0;
      vvv_syn();
      }
   ///////////////////////////////////////////////////////////BT
void BT_on(void)
   {digitalWrite(7, HIGH);
    Serial.println("BTon_ok"); 
    }   
void BT_off(void)
   {digitalWrite(7, LOW);
    Serial.println("BToff_ok"); 
    }       
  ////////////////////////////////////////////////////////////////vvvision
                          
void vvv_syn(void)
  {  Serial.print("syn");
     for (i=0;i<k+1;i++) {Serial.print(dd[i]);
                         Serial.print(":");
                         Serial.print(datch[i]);
                         Serial.print(";");}; 
    vvv_timer();
    }
void  vvv_baza(void)
     {
      Serial.print("BAZA:-");
      read_baza();
      vvv_syn();
      }
void  vvv_timer(void) 
     {
      Serial.print("<<");Serial.print(day);Serial.print(">>");
      Serial.print(hours);Serial.print(":");
      Serial.print(minutes);Serial.print(":");
      Serial.print(sec); Serial.println("!!!"); 
      }

void  vvv_syntm(void)
      {
     byte j,v; 
     Serial.print("tm");
     Serial.print(countA);
     Serial.print(">");
       v = countA*4;
       if (v>81 || mc==1) v=84;
       
       for (j=0;j<v;j++) {
                   Serial.print(tm[j]);
                   Serial.print("=");
      Serial.print(tm[++j]);
      Serial.print(":");
      Serial.print(tm[++j]);
      Serial.print(":");
      Serial.print(tm[++j]);
      Serial.print(";");}; 
    Serial.println(""); 
              }
void  vvv_help(void)
      {
       Serial.println("help");
       Serial.println("on");
       Serial.println("off");
       Serial.println("DELall");
       Serial.println("delNN"); 
       Serial.println("chNNMMCode");
       Serial.println("timer");
       Serial.println("time:HHMMSSday");
       Serial.println("synchr");
       Serial.println("syntm");
       Serial.println("signalon");
       Serial.println("signaloff");
       Serial.println("BTon");
       Serial.println("BToff");
       Serial.println("send:CODEEE");
       Serial.println("corr:CORECTION");
       Serial.println("writeall");
       Serial.println("readall");
       Serial.println("BAZAeeprom");
       Serial.println("echoon");
       Serial.println("echooff");
       Serial.println("show_set");
        }              
//////////////////////////////////////////////////////////////////////////
                 ///time
void timer(void)
   {
    while ((unsigned long)(micros() - start) >= 1000000 + correct)
            {            
         if (++sec == 60)
              {
            sec = 0;
            if (++minutes == 60)          // senks Datak
                {
                 minutes = 0;
                 if (++hours == 24){hours = 0;day++;}
                  }
                }
         start += 1000000 + correct;
             }
       }

/////////////////////////////////////////////////////////////////////////Receiver

// Callback function is called only when a valid code is received.
void showCode(unsigned long receivedCode, unsigned int period) {
  // Note: interrupts are disabled. You can re-enable them if needed.

  if   ((millis()-t<2500)&&(code==receivedCode))
    { cd=0;}
  else {
  cd=1;
  code=receivedCode;
  t=millis();};
  if (p==1 && cd==1){zap_Pul(code);cd=0;}
  if (d==1 && cd==1){zap_Dat(code);cd=0;}
  // Print the received code.
  if (onv==0) {Serial.print("Code:");
               Serial.print(code);
               Serial.println(";");};
  
}

////////////////////////////////////////////////////////////////////////Transmitter

void transmit(unsigned long transmitCode, unsigned int period) {  
  // Disable the receiver; otherwise it might pick up the retransmit as well.
  digitalWrite(12, HIGH);
  digitalWrite(13, HIGH);
  if (e == 1) RemoteReceiver::disable();
  
  delay(200);
  //////////RemoteTransmitter::sendCode(11, transmitCode, period, 3);???
  for (int j=0;j<6;j++) {
  //формируем код отправки
  transmitCode = transmitCode & 0xFFFFF;
  transmitCode |= (unsigned long)period << 23;
  transmitCode |= 2L << 20;}

  RemoteTransmitter::sendTelegram(transmitCode,11);//11-пин к которому подключен передатчик */

  delay(300);
  digitalWrite(13, LOW);
  digitalWrite(12, LOW);

  if (e == 1)RemoteReceiver::enable();
}

 

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

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

Mining
Offline
Зарегистрирован: 31.01.2016

Short Circuit пишет:

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

Поддерживаю пожелание!

Не компилируется:

ino:7:28: fatal error: RemoteReceiver.h: No such file or directory

 

Ivan_Kornege
Offline
Зарегистрирован: 23.06.2016

Mining пишет:

Short Circuit пишет:

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

Поддерживаю пожелание!

Не компилируется:

ino:7:28: fatal error: RemoteReceiver.h: No such file or directory

Тебе надо поставить билиотеку RemoteSwitch, там есть RemoteReceiver.h

Ivan_Kornege
Offline
Зарегистрирован: 23.06.2016

RomanVS пишет:

Также написал программу на app inventor для синхранизации с ардуино:https://yadi.sk/d/wNGGxOD8spPMW

И чЁ с этим делать?

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

автор скинул - типа разбирайтесь сами че я тут наваял....

Ivan_Kornege
Offline
Зарегистрирован: 23.06.2016

Short Circuit пишет:

автор скинул - типа разбирайтесь сами че я тут наваял....

Ну мож Рома скоро заглянет сюда и чё нить нам порассказывает. Проект то годный надо развивать.

Ivan_Kornege
Offline
Зарегистрирован: 23.06.2016

Проект интересный, но автор пропал... на вопросы нет ответов...