Come realizzare un sistema di allarme con Arduino

Come realizzare un sistema di allarme con Arduino

Con Arduino è davvero possibile fare progetti complessi, soprattutto grazie all’utilizzo di Internet, che è possibile sfruttarlo attraverso le varie Shield disponibili per il micro-controllore. In questo articolo, vedremo come realizzare un sistema di allarme professionale con Arduino.

Questo sistema sarà in grado di registrare ogni movimento che verrà rilevato in casa e verrà salvato in un database, a cui sarà possibile accedere da remoto da qualsiasi device, sfruttando un semplice browser, oppure applicazioni dedicate.

alarmlogo

 

Requisiti per il progetto

 

Hardware

 

  • 1x Arduino Mega
  • 1 x Ethernet Shield
  • n x Arduino Uno
  • n x Wireless 433 MHz kit
  • n + 1 x Sensori PIR
  • PC/Raspberry Pi

 

Software

 

 

Come funziona il sistema ?

 Il sistema di allarme è basato sull’utilizzo di una sorta stazione centrale, a cui sono connessi n client. Ogni dispositivo è dotato di un sensore PIR, che è in grado di rilevare il passaggio di una persona, attraverso la variazione di calore rilevato. I vari client sono dotati di un TX wireless, che invierà un segnale alla stazione centrale, per avvisare del rilevamento di una persona. Il server principale non è altro che un Arduino Mega, collegato ad Internet attraverso la scheda Ethernet ufficiale, che contiene oltre a un sensore PIR, un RX wireless, che è in grado di ricevere i segnali che i client inviano. Per capire quale client ha inviato il segnale, esso sarà dotato di una sorta di identificativo, impostabile dall’utente in fase di registrazione del client.

Per quanto riguarda la registrazione/salvataggio dei rilevamenti, verrà utilizzato un database, che potrà essere installato su un PC oppure anche sul Raspberry Pi. Il caricamento verrà effettuato direttamente dalla stazione centrale, che è l’unica ad essere collegata ad Internet.

Il reperimento delle informazioni relativi ai rilevamenti, sarà possibile farla attraverso una pagina web, oppure attraverso un’applicazione realizzata in Java.

Inoltre la stazione centrale è dotata di un webserver, con il quale sarà possibile disattivare/attivare il sistema di allarme. Vedremo come sia possibile, con un cellulare Android, automatizzare l’attivazione/disabilitazione del sistema di allarme.

Installare il DB con MySQL

 Il primo passaggio da fare per poter utilizzare il sistema d’allarme, è quella di installare un server MySQL sul PC. Occorre precisare, che il computer dovrà rimanere accesso affinché Arduino potrà completare il corretto salvataggio dei rilevamenti. Per questo motivo, consiglio di installare il DB su Raspberry Pi, in modo da ridurre drasticamente il consumo di corrente.

Per Windows/Mac/Linux è possibile installare il server, scaricando il pacchetto dal sito ufficiale di MySQL http://dev.mysql.com/downloads/mysql/. Per poter completare le operazioni successivi del progetto, come ad esempio creazione delle credenziali d’accesso e tanto altro, è necessario installare il Workbench. Quest’ultimo è un programma che permette di interfacciarsi facilmente con il server MySQL. Il Workbench è possibile scaricarlo da questa pagina web http://dev.mysql.com/downloads/tools/workbench/

Raspberry PI Raspi_Colour_R

 

Per poter installare sul Raspberry Pi il server MySQL, occorre digitare da terminale:

 

sudo apt-get install mysql-server

 

Per installare il client Workbench, invece:

 

sudo apt-get install mysql-workbench

 

Durante la fase di installazione del server, verrà chiesto di inserire un nome utente e una password, che servono per poter accedere, attraverso il Workbench al server DB.

 

Di default, il server è impostato ad accedere connessioni sono effettuate sulla macchina, cioè in modalità localhost. Per poter invece effettuare delle Insert, oppure delle Select da remoto, occore crearsi un nuovo account, con la possibilità di accendere anche al di fuori del dispositivo. Per farlo apriamo il Workbench dal menu di Raspberry Pi .

Selezioniamo la voce “New server instance”  e nella pagina successiva, selezioniamo localhost e digitiamo le credenziali d’accesso, che abbia creato quando è stato installato il server MySQL.

MySQL1

Ora che è stata creata una connessione al DB, possiamo creare un utente in grado di poter accedere anche da remoto al Raspberry Pi.

Per farlo facciamo doppio click sulla connessione creata e si aprirà una nuova pagina, nella quale vedremo un po’ di statistiche riguardo all’utilizzo del server. Selezioniamo con un click la voce “Users and Privileges” e creiamo un nuovo account. Occorre prestare attenzione che nella voce “From host” dovrà esserci un % in modo da poter autorizzare tutti i tipi di connessioni in entrata.

MySQL2

 

Un po’ di MySQL

 

Ora che abbiamo installato il server MySQL, creato le credenziali d’accesso per accedere da qualsiasi dispositivi al DB, possiamo creare il nostro “Schema” per il Sistema d’allarme. Lo schema non è altro che l’insieme di relazioni che compongono il nostro progetto. Ogni relazione, contiene degli attributi. Nel nostro caso lo schema sarà il seguente:

 

Schema Sistema_allarme

 

Relazione1 Dispositivi(idDispositivi,Luogo,Citta)

Relazione2 Rilevamenti(ID,DATA,ORA)

 

Nella prima “tables” sono riuniti tutti i dispositivi che sono presenti nel nostro sistema d’allarme. Per esempio possiamo installare un Arduino Uno con sensore PIR in Soggiorno, mentre possiamo mettere un altro Arduino Uno in camera da letto.

Nella seconda “tables” sono presenti i vari rilevamenti che sono stati registrati, con la relativa data e ora. L’ID serve per identificare i vari dispositivi presenti in casa.

Per la creazione delle varie “tables” basta aprire una connessione con il MySQL Workbench, attraverso la voce “MySQL Connections”. I dati da inserire sono quelle che sono stati creati nel passo precedente, come ad esempio nome utente e password. L’IP possiamo lasciare pure localhost (127.0.0.1).  Successivamente si aprirà una pagina, dove potremmo controllare il nostro DB. L’operazione da fare è quella di selezione la voce “Create new schema” in alto e dare il nome di Sistema_allarme. Una volta creato lo schema, possiamo creare le “tables” che sono le nostre relazione. Per farlo selezioniamo in basso a destra “Sistema_allarme”  e con il tasto destro, selezioniamo la voce “Create table”. I passi successivi servono per inserire i dati che sono stati riportati precedentemente. L’unica voce da aggiungere a riguardo, è quella di inserire idDispositivi come chiave primaria della relazione/tables Dispositivi. In questo modo non esisteranno due dispositivi con lo stesso identificativo.

MySQL3

 

Come collegare i vari dispositivi

 

Come detto in precedenza, alla base del progetto esistono due tipi di dispositivi; il server/stazione centrale che è composto da Arduino Mega, che permette di caricare i dati su DB sfruttando la connessione ad Internet, mentre il client è composto da un Arduino Uno ed è in grado di inviare i movimenti rilevati al server, sfruttando il sensore PIR e i componenti Wireless.

txrx-433-pin

 

Server/Stazione centrale

 

PIR

 

VCC -> 5 V

OUT -> PIN 4

GND -> GND

 

RX Wireless 433 MHz

 

GND-> GND

DATA -> PIN 11

DATA-> Niente

VCC -> 5 V

 

 

Client

 

PIR

 

VCC -> 5 V

OUT -> PIN 3

GND -> GND

 

TX Wireless 433 MHz

 

ATAD -> PIN 11

VCC –> 5-12 V (si aumenta la porta del segnale, aumentando la tensione)

GND -> GND

Installazione dei componenti Software per Arduino

 

Come già riportato in precedenza, per poter compilare correttamente i codici che ho realizzato è necessario scaricare le librerie che non sono presenti di default nell’IDE di Arduino. L’installazione è davvero semplice; basta infatti scaricare i file in formato .zip, scompattarli e spostarli nella cartella arduino/libraries del vostro computer.

 Server/stazione centrale

Ecco i codici dei programmi del sistema di allarme versione 1.0

/**
This project allows you to create a video surveillance system, using PIR sensors, wireless sensors and 
an Internet connection. The data relating to business records of movements, are loaded on a MySQL server.
Version 1.0
Author Giacomo Bellazzi
 Copyright (C) 2014  Giacomo Bellazzi (http://ismanettoneblog.altervista.org/)
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 *  GNU General Public License for more details.
*/

#include "SPI.h"
#include "Ethernet.h"
#include "mysql.h"
#include "sha1.h"
#include "WebServer.h"
#include "DataCoder.h"
#include "VirtualWire.h"
#define PREFIX ""
WebServer webserver(PREFIX, 80);
const int rx_pin = 11;
const int baudRate = 800;
boolean systemON = true;
Connector my_conn;        // The Connector/Arduino reference
byte mac_addr[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress server_addr(10,0,0,1); // MySQL Server IP
char user[] = "usernameMySQL";
char password[] = "passwordMySQL";
const char SEND_MOTION[] = "INSERT INTO Sistema_allarme.Rilevamenti VALUES (%d,CURRENT_DATE, CURRENT_TIME)";
int pinPIR = 4;
int led = 13;
int timeLed = 2000;
int idPIRServer = 1;

void defaultCmd(WebServer &server, WebServer::ConnectionType type, char *, bool)
{
  server.httpSuccess();
  if (type != WebServer::HEAD)
  {
    P(msg1) = "<h1>Welcome to alarm system page</h1>";
    P(msg2) = "<h3>Through the secure page, you can turn on and turn off the alarm system</h3> ";
    P(msg3) = "<a href=\"private.html\">Private page</a>";
    P(msg4) = "<a href=\"private.html\"><img src = http://ismanettoneblog.altervista.org/blog/wp-content/uploads/2014/03/allarme.jpg></a>";
    server.printP(msg1);
    server.printP(msg2);
    server.printP(msg3);
    server.println("</form><br />");
    server.printP(msg4);
  }
}

void privateCmd(WebServer &server, WebServer::ConnectionType type, char *url_param, bool param_complete)
{
  //in other words: "YWRtaW46YWRtaW4=" is the Base64 representation of "admin:admin" */
  if (server.checkCredentials("YWRtaW46YWRtaW4="))
  {
    server.httpSuccess();
    if (type != WebServer::HEAD)
    {
      P(msg1) = "<h1>Welcome to the console page</h1>";
      P(msg2) = "<h3> You can choise to disable/enable the alarm system</h3>";
      server.printP(msg1);
      server.printP(msg2);
      String s = "";
       if (param_complete == true)
    {
      s = url_param;
      if (s=="on"){
        systemON = true;
     }
     if(s =="off"){
        systemON = false;
     }
     // Viene cambiata la pagina WEB a seconda che il LED sia spento, oppure systemON
      if(systemON){
          server.println("<a href=\"./private.html?off\"> <img src = \"http://ismanettoneblog.altervista.org/blog/wp-content/uploads/2014/02/bt_OFF.png\"alt = \"Spegni\" ></a>");
          server.println("<h3> The alarm system is enable </h3>");
        }else{
          server.println("<a href=\"./private.html?on\"> <img src = \"http://ismanettoneblog.altervista.org/blog/wp-content/uploads/2014/02/bt_ON.png\"alt = \"Accendi\" ></a>");
          server.println("<h3> The alarm system is disabled </h3>");
        } 
     }
  }
   server.println("<a href=\"./private.html\"> <img src = \"http://ismanettoneblog.altervista.org/blog/wp-content/uploads/2014/03/alarmlogo.png\"alt = \"Accendi\" ></a>");
}
  else
  {
    /* send a 401 error back causing the web browser to prompt the user for credentials */
    server.httpUnauthorized();
  }
}

void setup() {
  pinMode(pinPIR,INPUT);  
  pinMode(led,OUTPUT);
  Serial.begin(9600);
  Ethernet.begin(mac_addr);
  webserver.setDefaultCommand(&defaultCmd);
  webserver.addCommand("index.html", &defaultCmd);
  webserver.addCommand("private.html", &privateCmd);
  webserver.begin();  
  Serial.println("Connecting...");
  if (my_conn.mysql_connect(server_addr, 3306, user, password)) {
    delay(1000);
  }
  else
    Serial.println("Connection failed.");
  SetupRFDataRxnLink(rx_pin, baudRate);
}

void loop() {
  char buff[64];
  int len = 64;
  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;
  union RFData inDataSeq;//To store incoming data
  float inArray[1];//To store decoded information
  if(RFLinkDataAvailable(buf, &buflen) && systemON)
  {
        for(int i =0; i< buflen; i++)
        {
          inDataSeq.s[i] = buf[i];
        }
        DecodeRFData(inArray, inDataSeq);
        int idNetworkPIR =(int)inArray[0];
        sendDBmotion(idNetworkPIR);
        ledOnOff(led,timeLed);
  }
  /* process incoming connections one at a time forever */
  webserver.processConnection(buff, &len);
  if(motionDetected() && systemON){
    Serial.println("Movimento rilevato");
    sendDBmotion(idPIRServer);
    ledOnOff(led,timeLed);
    while(motionDetected()){
      webserver.processConnection(buff, &len);
    }
  }
}
//This method detects the presence of people
boolean motionDetected(){
 if(digitalRead(pinPIR)==HIGH){
  return true;
 }else{
  return false;
 } 
}
// This method light a led, for time
void ledOnOff(int led,int timeLed){
  digitalWrite(led,HIGH);
  delay(timeLed);
  digitalWrite(led,LOW);
}    

// This method allow to send the motion to the MySQL DB
void sendDBmotion(int ID){
char query[60];
sprintf(query, SEND_MOTION, ID);
my_conn.cmd_query(query);
}

Client

/**
This code should be installed in every client, who want to detected a motion via sensor PIR.
If the PIR detect a motion, the client will send via wireless a message to the Master,
who will make an insert to the MySQL DB
Version 1.0
Author Giacomo Bellazzi
 Copyright (C) 2014  Giacomo Bellazzi (http://ismanettoneblog.altervista.org/)
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 *  GNU General Public License for more details.
*/
#include <DataCoder.h>
#include <VirtualWire.h>

const int baudRate = 800;
int pinPIR = 3;
int led = 13;
int timeLed = 800;
int pinTX = 12;
int ID = 2; // The ID of the client

void setup()
{
    Serial.begin(9600);   // Debugging only
    Serial.println("setup");
    SetupRFDataTxnLink(pinTX, baudRate);
}

void loop()
{
    if(motionDetected()){
      float outArray[1]; // this array keep the data to send
      outArray[0] = ID; // send the ID of the client
      union RFData outDataSeq;
      EncodeRFData(outArray, outDataSeq); 
      TransmitRFData(outDataSeq); 
      ledOnOff(led,timeLed);
      while(motionDetected()){
        // remain in this status, not to send motion twice
      }
   }  
}

//This method detects the presence of people
boolean motionDetected(){
 if(digitalRead(pinPIR)){
  return true;
 }else{
  return false;
 } 
}
// This method light a led, for time
void ledOnOff(int led,int timeLed){
  digitalWrite(led,HIGH);
  delay(timeLed);
  digitalWrite(led,LOW);
}

Il codice è abbastanza comprensibile dal punto di vista del meccanismo di rilevazione del movimento. Se un client rileva un passaggio, invia un valore che lo indentifica al server e quest’ultimo capisce che deve inviare una insert all’interno del database, con l’ora data e luogo che si è verificato il movimento.

 

Come attivare/disabilitare l’allarme

 

Come per i sistemi di allarme tradizionali, anche questo è in grado di essere disattivato; per esempio siamo in casa ed è normale che ci sia del movimento ! Per poterlo fare, è stato realizzato un webserver all’interno della stazione centrale, da cui è possibile gestire il sistema. Digitando l’indirizzo IP del server, si aprirà una pagina web protetta da nome utente e password. Nel caso del codice presente, le credenziali sono:

 

user = admin

password = admin

 

La codifica usata è quella in base 64 ed è stata implementa sfruttando l’ottima libreria Webduino, con la quale è possibile semplificare la procedura di creare di pagine web con Arduino. Per cambiare le credenziali d’accesso alla pagina protetta del sistema di allarme, è possibile modificare il codice sostituendo la stringa YWRtaW46YWRtaW4=,  con quella desiderata. Per creare la propria stringa, che rappresenta la codifica in base 64 delle proprie credenziali è possibile ricorrere a tool online, come ad esempio http://www.base64encode.org/. Per esempio se voglia creare le seguente credenziali;

 

user = nomeutente

password = password

 

inseriamo sotto la voce “encode” nomeutente:password e otterremo bm9tZXV0ZW50ZTpwYXNzd29yZA==. 

Schermata 2014-03-27 alle 18.45.38

 

Foto 24-03-14 10 04 24Foto 24-03-14 10 04 28

 

Questa pagina web, è di default accessibile solo a livello locale, digitando semplicemente l’IP di Arduino nella barra degli indirizzo nel nostro browser. Tuttavia, per rendere ancora più funzionale il sistema d’allarme, è possibile accedere anche da remoto alla pagina web. Per farlo dovremmo fare l’inoltro della porta 80 sul router principale. Tipicamente occorre accedere alla pagina di controllo del router, inserire nome utente e password e cercare la zona di “inoltro delle porte”. Qui dovremmo inserire come dati, la porta 80, l’indirizzo IP di Arduino e la connessione TCP, in modo da garantire affidabilità alla connessione.

Nella pagina protetta del webserver è possibile attivare e disabilitare il sistema d’allarme, premendo sul bottone centrale, che cambierà colore a secondo dello stato.

Occorre notare che di default, all’avvio di Arduino, il sistema è attivo, anche se precedentemente era stato disattivato. Questo è dovuto al fatto che la memoria in cui Arduino cariche le variabili è volatile e quindi al riavvio del dispositivo, si perdono i dati.

Tuttavia è disponibile nel repo, un programma che risolve questo problema, cioè mantiene lo stato scelto anche dopo il riavvio di Arduino. Tuttavia sorge un piccolo problema; la memoria in cui vengono salvati i dati, si chiamo EPROM e tuttavia ha una “vita” inferiore alla RAM di Arduino. Per tanto un uso eccessivo di scrittura, può danneggiarlo. Per tanto consiglio di usare il programma standard.

In alternativa, sarebbe possibile disattivare il sistema attraverso un interruttore, ma tuttavia garantirebbe un minore livello di sicurezza, dal momento che chiunque potrebbe spegnerlo. Tuttavia in una prossima versione, verrò introdotta la possibilità di abilitare il sistema manuale, attraverso la pagina web protetta.

Foto 24-03-14 10 04 50Foto 24-03-14 10 04 42

 

Come recuperare i rilevamenti effettuati ?

 

Il metodo più semplice per il recupero dei dati è quello di effettuare una query al DB che abbiamo installato. La query non è altro che una interrogazione che restituisce delle tuple, che non sono altro che i nostri rilevamenti. Per farlo, digitiamo nel Workbench questa query:

 

SELECT DI.Luogo, DI.Citta, RI .DATA, RI.ORA

FROM Sistema_allarme.Rilevamenti as RI join Sistema_allarme.Dispositivi as DI on (RI.ID = DI.idDispositivi)

 

Per poter accedere da smartphone a questa lista di rilevamenti, è possibile installare una specie di Workbench per il proprio dispositivo ed inserire la query precedente.

 

Come attivare/disattivare in automatico il sistema ?

 

Il sistema offre la possibilità di automatizzare la procedura di attivazione/disattivazione del sistema di allarme, grazie ad un programma disponibile per Android Llam, scaricabile da questo link https://play.google.com/store/apps/details?id=com.kebab.Llama.

Questa necessità è dovuta al fatto che il sistema di allarme perderebbe la sia funzionalità quando noi ci troviamo in casa, nella stanza che viene rilevata; se il sistema fosse attivo, ci sarebbero tanti record di rilevamenti inutili. Per poter automatizzare il sistema, possiamo decidere di attivarlo quando la posizione del GPS si allontana da casa , oppure di spegnerlo quando entriamo nella zona di casa. Per impostare quanto detto, occorre aprire l’applicazione LLama, andare in Eventi è aggiungerne uno; le funzionalità da attivare sono:

 

Entro in zona – run short app – preferito (http://ipwebserver.private.hmtl/?off)

 

Esco da zona – run short app – preferito ( http://ipwebserver.private.hmtl/?on)

 

 

Applicazione Java per PC

 

Oltre ad utilizzare il Workbench per poter registrare/vedere i vari rilevamenti, è possibile utilizzare l’applicazione Java che ho realizzata.

La prima procedura da fare è quella di inserire le credenziali d’accesso del server MySQL.

Attraverso il menu è possibile selezionare le due operazioni consentite, quella di registrare un client in una zona e quella di visualizzare i rilevamenti, filtrandoli per ID, Data e Ora.

JavaMySQL

 

Conclusione

Questo progetto vuole mostrare come sia possibile utilizzare all’interno dello stesso dispositivo, più linguaggio di programmazione, come ad esempio il C, MySQL e Java. Sfruttando le potenzialità della rete, è possibile condividere le informazioni che vengono elaborate degli stessi Arduino, sfruttando anche un Database, dal quale è possibile successivamente reperire le informazioni, come ad esempio i rilevamenti di movimenti che sono successi in un determinato luogo. Spero che il progetto vi sia piaciuto ! Per eventuali commenti, suggerimenti, potete usare i commenti !

ismanettoneblog

47 pensieri su “Come realizzare un sistema di allarme con Arduino

  1. ciao per prima cosa complimenti per il progetto . Alcune domande:
    Si possono aggiungere sensori di tipo diverso?
    Sensori già cablati ( esistenti in commercio)?
    Arduino 1 deve essere alimentato. si può pensare ad un modulo a batteria?
    Ho notato che nel tuo progetto non è presente una sirena, si può inserire?
    grazie

    1. Salve,
      chiedo scusa per il ritardo, ma ultimamente ho avuto pochissimo tempo per guardare il mio blog.
      Rispondo alle domande:
      1) Sicuramente è possibile inserire altri tipi di sensori. Per ora il codice scritto funziona che qualora il sensore emetta un segnale ALTO, viene attiva la procedura di inserimento nel database del rilevamento. Penso che sul mercato ci siano altri dispositivi.
      2) Arduino può essere alimentato tranquillamente con una batteria da 9V. Prossimamente scriverò un articolo su come realizzare un pannello solare che alimenta Arduino di notte e di giorno. Tuttavia, per quanto riguardo l’uso della batteria da 9V, occorre precisare che sicuramente non durerà più di qualche giorno, dal momento che è necessario alimentare tanti dispositivi. In ogni caso è possibile utilizzare le porte di interrupt sul processore, in modo da attivarlo solo quando viene rilevato un movimento
      3) è possibile inserire un buzzer, oppure una sirena nel progetto. Si dovrà fare una chiamata del tipo digitalWrite(pinSirena,HIGH);
      delay(tempoDiSuono);
      digitalWrite(pinSirena,LOW);

      Sperando di essere stato utile, rimango in attesa per ulteriori delucidazioni

  2. Sei spaventoso!! Java, Mysql, wired… cmq qualcosina ci ho capito. Forse tra un paio d’anni riesco a realizzarlo per il momento mi mancano troppi fondamentali.

    1) Perchè usi Arduino Mega come controllo centrale e non un Arduino UNO?

    2) L’idea di utilizzare tanti arduino uno quanti sono i sensori pir… mi sembra troppo dispendiosa. Non si potrebbero usare degli Arduino mini?

    Complimenti e grazie per la condivisione delle tue conoscenze.

    1. In questo progetto ci sono un po’ di linguaggi di programmazione, forse un po’ troppi, ma sono tutti indispensabili per poter realizzare correttamente il piccolo sistema di allarme (se guardi quello della stazione meteo professionali ci sono ulteriori linguaggi di programmazione !). Ho riempito il post di codici che sono praticamente già funzionanti (occorre modificare le variabili che contengono le credenziali d’accesso al DB), sperando di rendere la realizzazione più semplice. Ora rispondo alle tue domande:

      1) Per quanto riguarda la stazione principale, o meglio il server che riceve i vari rilevamenti, va benissimo anche un Arduino UNO. L’utilizzo di Arduino Mega è stato fatto perché è più potente, ma in questo caso va benissimo anche l’UNO.
      2) L’utilizzo di tanti Arduino UNO è dovuto al fatto che sono già pronti e facili da usare. Certamente ogni client del progetto avrebbe un costo di circa 15+2+2 = 19 Euro, forse un po’ troppi. Si possono usare benissimo scheda fai da te, come l’ATMEGA328 (il costo totale sarebbe 10 Euro), oppure usare il micro ATTINY85, che è ancora più piccola e costa meno. In questo ogni client costerebbe sui 6 Euro, 1/3 di Arduino Uno ! L’utilizzo di questo micro avrebbe comportato un aumento della difficoltà del progetto e non mi è sembrava il caso.

      1. Ciao,
        bellissimo progetto e vorrei cimentarmi prorpio in un allarme faidate
        Avevo pensato di utilizzare solo un arduino uno/mega + ricevitore/trasmettitore 433mhz come centrale per rilevare i vari sensori wirless a 433 mhz (ne ho già tanti dal vecchio impianto) + Ethernet Shield con SD per l’interfaccia web pensi sia possibile? Semplificherebbe tantissimo e lo renderebbe più accessibile.
        Complimenti ancora.

        1. Salve,
          grazie per i complimenti. Per collegarsi al DB è necessario usare Arduino Uno/Mega con la Scheda Shield. Sfruttando la scheda SD è possibile creare una pagina WEB più carina. Come client non è per forza necessario usare tanti Arduino Uno. Si può usare un Atmega328 oppure Attiny85.

          1. Salve e complimenti per il progetto. Potresti spiegare come creare tanti client che inviano un segnale ad un solo server in modo da capire da che stanza è stato eccitato il pir.
            Grazie

  3. complimenti io non ne capisco ma vi voglio porre una domanda sulla tx come si fa ad emettere un segnale con questo modulo? alimento vcc + gnd – il segnale come si fa? grazie a tutti ciao.

    1. Salve,
      ogni modulazione elettronica, vie inviata attraverso segnali di tensioni, alto o basso. Per esempio in una modulazione si può inviare il codice 01010101011 che può rappresentare qualsiasi valore, in quanto occorre specificare la codifica. Esistono già delle librerie che permettono di inviare valori alfanumerici in modo davvero semplice. Sul mio blog sono presenti diversi esempi.

  4. Buongiorno, vorrei realizzare il suo progetto con 4/5 sensori disposti su due piani collegati però da una scala interna. Oltre a reperire tutto il materiale è possibile in caso di difficoltà cheidere aiuto

    1. Salve,
      per poter comunicare è possibile usare tranquillamente i sensore presenti nell’articolo. Per una migliore copertura, è consigliato l’installazione di una antenna aggiuntiva sul TX e sul RX.

  5. Salve, innanzitutto devo complimentarmi per l’ottimo progetto, avrei bisogno di aiuto perchè ho un errore di compilazione nel file sha1.cpp, che riporterò qua sotto:

    In file included from C:\Users\Documents\Arduino\libraries\sha1\sha1.cpp:3:0:
    C:\Users\Documents\Arduino\libraries\sha1\sha1.cpp:11:25: error: variable ‘sha1InitState’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’
    uint8_t sha1InitState[] PROGMEM = {
    ^

    La ringrazio anticipatamente.

    1. Salve,
      l’errore che ha riscontrato è dovuto al fatto che è già presente un file sha1.cpp che crea conflitto. Occorre capire quale sia e spostare quella directory in un’altra folder del PC, in modo da non creare problemi in fase di compilazione.

      1. Salve, grazie alle sue indicazioni sono riuscito a risolvere l’errore di compilazione. Tuttavia ora sono bloccato nella configurazione di MySQL (purtroppo sono un neofita), potreste fare una guida più dettagliata sulla parte di MySQL(dalla installazione passo per passo del server alla configurazione del workbench? Ci tengo molto alla realizzazione di questo suo progetto.
        La ringrazio anticipatamente

        1. Salve,
          quale passo della guida non è chiaro ? È abbastanza semplice;
          occorre creare uno schema di nome Sistema_allarme e due tabelle:

          Dispositivi(idDispositivi,Luogo,Citta)
          Rilevamenti(ID,DATA,ORA)

          1. Salve, quando vado fare la query, non viene visualizzato niente sotto le rispettive voci data ora ecc (nonostante sia passato davanti al sensore). Mi è sorto perciò il dubbio di aver configurato male mysql.
            Grazie anticipatamente.

          2. Salve,
            ci possono essere un po’ di problemi/errori:
            1) il sensore non è collegato correttamente. Per testare ciò, basta eseguire il semplice programma, che rileva un valore ALTO digitale, al pin del sensore PIR
            2) Arduino non è connesso correttamente ad Internet. Verifica con un semplice programma, per reperire l’ora da Internet
            3) Il server MySQL non è raggiungibile dalla rete. Verifica di aver aperto la porta 3306 del tuo router
            4) Il server MySQL non è configurato correttamente. Prova ad utilizzare il programma MySQL Workbench, per verificare se il DB è impostato correttamente.

  6. Salve, ho verificato quanto mi ha indicato precedentemente e non ho riscontrato nessuna incongruenza, tuttavia continuo a ricevere questo messaggio

    18:19:31 SELECT DI.Luogo, DI.Citta, RI .DATA, RI.ORA FROM Sistema_allarme.Rilevamenti as RI join Sistema_allarme.Dispositivi as DI on (RI.ID = DI.idDispositivi) LIMIT 0, 1000 0 row(s) returned 0.000 sec / 0.000 sec

    Potrebbe darmi altri consigli.

    Non si potrebbe bypassare MySQL, registrando i rilevamenti in una pagina web locale e collegare il tutto ad una sirena esterna wireless a 433 mhz?

    La ringrazio anticipatamente.

  7. complimenti. Se cerchi lavoro qui a Bruxelles avrei molto lavoro per qualcuno con la tua larga visione di tecnologie innovative

    1. Salve,
      grazie per i complimenti. Si è possibile collegare il lettore RFID. Trova qualche tutorial sempre su questo blog. Quale sarebbe il motivo della sua aggiunta? Come sistema di identificazione per disabilitare il sistema d’allarme?

  8. Complimenti!! Molto bello!!

    Ho purtroppo lo stesso problema di Alessio:

    In file included from C:\Program Files (x86)\Arduino\libraries\Sha\sha1.cpp:3:0:

    C:\Program Files (x86)\Arduino\libraries\Sha\sha1.cpp:13:25: error: variable ‘sha1InitState’ must be const in order to be put into read-only section by means of ‘__attribute__((progmem))’

    uint8_t sha1InitState[] PROGMEM = {

    ^

    exit status 1
    Errore durante la compilazione

    Come posso risolvere?

    Grazie 1000!!!

    Matteo

    1. Molto probabilmente c’è una libreria che fa conflitto, oppure ne manca qualcuno. Prova a fare una ricerca di file che iniziano con sha nella folder library di Arduino.

    1. Salve,
      no non serve una vera e propria calibrazione del sensore. Dovrebbero esserci due potenziometri a lato, che ti permettono di regolare la distanza e il tempo per cui in uscita viene rilevato un segnale ALTO.

      1. Il mio desiderio sarebbe di realizzare il progetto usando una rete locale. Attualmente sono riuscito ad assegnare un indirizzo statico alla shield Ethernet, ma non riesco ad accedere al server. Avresti qualche suggerimento? Per realizzare questo progetto è indispensabile l’utilizzo di internet?

        1. In linea di principio non sarebbe richiesto Internet, ma dal momento che ci sono immagini presenti sul web, è necessario. Eventualmente potresti mettere le immagini nella memoria micro-sd, oppure usare dei semplici button (devi modificare il codice HTML nel programma di Arduino).

  9. Complimenti per il post. Tutto molto chiaro e molto preciso.

    Mentre leggevo mi è venuta una domanda. Se il sensore manda il segnale solo quando rileva il movimento, come facciamo ad accorgerci se il dispositivo è stato manomesso prima che riuscisse ad inviare il segnale?

    A tuo avviso è possibile inviare in continuazione il segnale radio e se il dispositivo server non lo riceve entro un tempo lancia un allarme? Forse è troppo dispendioso in termini di batteria per i sensori?

    Se i sensori mandano continuamente il segnale come si possono gestire i conflitti di invio simultaneo di due sensori che potrebbero inviare ID nello stesso momento?

    Grazie mille

    1. Ciao,
      grazie per i complimenti! Diciamo che la logica da sottolineata non è fattibile per motivi di dispendio di energia. In realtà in Arduino è possibile mettere in stand-by per n secondi per farlo riattivare, però la logica di per se non è troppo corretta e introduce troppi possibili falsi positivi in questo senso. Se Arduino è impostato che se non riceve un segnale ogni 30 secondi e la batteria del dispositivo si scarica, ci sarebbe un falso positivo e non è il massimo. D’altro canto i sensori PIR sono fatti da rilevare un movimento anche a 5/10 metri e l’invio di un segnale richiede mezzo secondo. Conviene posizione i sensori PIR in posti sicuri, con una buona angolazione.
      Per quanto riguarda il discorso dei conflitti, basta usare degli ID. Ad esempio ID = 1 associa il sensore della cucina, ID = 2 del giardino etc… Quindi quando l’Arduino centrale riceve un valore del tipo 1, sa che c’è stato un rilevamento in cucina e l’orario lo stabilisce lui. Attenzione, però, che la comunicazione che in chiaro ed è possibile intercettare/modificare il pacchetto! Spero di aver risposto ai tuoi dubbi.

      1. Grazie Per la risposta. In realtà stavo pensando ad applicare il tuo progetto anche a barriere fotoelettriche applicate alle porte e in questo caso potrei avere possibilità di manomissione. Hai esperienza in merito?

        Grazie

  10. Grazie per il progetto!

    Ti faccio alcune domande dal momento che vorrei replicare questo progetto:

    1) quale modello di raspberry mi consigli? Usare il Mac sarebbe così tanto dispendioso a livello energetico?

    2) che modello di sensori Pir mi consigli? Riesci a girarmi un link?

    3) come la precedente per la Ethernet shield

    Grazie

    1. Ciao,
      grazie per i complimenti. Rispondo alle tue domande:

      1) Per il modello basterebbe anche un PI Zero, ma dal momento che non c’è una buona disponibilità, puoi acquistare tranquillamente la versione 3, che costa sui 35 Euro. Puoi usare anche un PC come server, ma il consumo energetico sarebbe troppo elevato e sarebbe un dispendio di risorse inutili.

      2) Come sensore di presenza puoi acquistare quello che consiglio nei miei articoli (modello HC-SR501), che puoi tranquillamente acquistare su Ebay per qualche euro.

      3) La scheda ethernet permette di far comunicare Arduino attraverso la rete con un dispositivo finale. All’interno della casa puoi usare altre tecnologie (ZigBee, 433 MHz etc…). Nel mio progetto non utilizzo il Raspberry PI, ma un Arduino come server principale, che riceve i comandi da altri Arduino che sono collegati con i moduli RX/TX da 433 MHz.

      Spero di essere stato chiaro e utili!

      1. Grazie per il feedback.

        Rispondo a punti:

        punto nr 1: se al posto del raspberry 0, usassi arduino uno o mega che conosco molto meglio??.

        punto nr 2: fantastico. ho già comprato quel sensore per altri progetti

        punto nr 3: riesci ad elencarmi bene tutti i modelli di arduino e lo schema di collegamento. (anche possibilmente tutti i tipi di tecnologie che hai usato).

        Forse per sanare molti dubbi di noi utenti, converrebbe fare un bel video tutorial che spieghi passo per passo quello che hai fatto. 🙂

        Grazie in anticipo

        1. Punto 1: Si può usare tranquillamente un Arduino Uno/Mega, come viene riportato nell’articolo.

          Punto 2: Il sensore PIR è molto semplice da usare, in quanto restituisce già un’uscita digitale.

          Punto 3: I codici utilizzati e i collegamenti sono spiegati all’interno dell’articolo

          Si un video potrebbe essere più chiaro di mille parole, però secondo me l’articolo racchiude tutti i principali punti per realizzare il progetto. Se hai altre domande, sono qui per rispondere.

  11. Complimenti per il tutorial!
    Quando vado a caricare il primo sketch mi da questi errori:

    Arduino:1.6.7 (Windows Vista), Scheda:”Arduino/Genuino Uno”

    sketch_jun23a:13: error: stray ‘\240’ in program

    Connector my_conn;        // The Connector/Arduino reference

    ^

    sketch_jun23a:13: error: stray ‘\240’ in program

    sketch_jun23a:13: error: stray ‘\240’ in program

    sketch_jun23a:13: error: stray ‘\240’ in program

    sketch_jun23a:13: error: stray ‘\240’ in program

    sketch_jun23a:13: error: stray ‘\240’ in program

    sketch_jun23a:13: error: stray ‘\240’ in program

    sketch_jun23a:23: error: stray ‘\240’ in program

     

    ^

    sketch_jun23a:26: error: stray ‘\240’ in program

      server.httpSuccess();

    ^

    sketch_jun23a:26: error: stray ‘\240’ in program

    sketch_jun23a:27: error: stray ‘\240’ in program

      if (type != WebServer::HEAD)

    ^

    sketch_jun23a:27: error: stray ‘\240’ in program

    sketch_jun23a:28: error: stray ‘\240’ in program

      {

    ^

    sketch_jun23a:28: error: stray ‘\240’ in program

    sketch_jun23a:29: error: stray ‘\240’ in program

        P(msg1) = “Welcome to alarm system page”;

    ^

    sketch_jun23a:29: error: stray ‘\240’ in program

    sketch_jun23a:29: error: stray ‘\240’ in program

    sketch_jun23a:29: error: stray ‘\240’ in program

    sketch_jun23a:30: error: stray ‘\240’ in program

        P(msg2) = “Through the secure page, you can turn on and turn off the alarm system “;

    ^

    sketch_jun23a:30: error: stray ‘\240’ in program

    sketch_jun23a:30: error: stray ‘\240’ in program

    sketch_jun23a:30: error: stray ‘\240’ in program

    sketch_jun23a:31: error: stray ‘\240’ in program

        P(msg3) = “Private page“;

    ^

    sketch_jun23a:31: error: stray ‘\240’ in program

    sketch_jun23a:31: error: stray ‘\240’ in program

    sketch_jun23a:31: error: stray ‘\240’ in program

    sketch_jun23a:32: error: stray ‘\240’ in program

        P(msg4) = ““;

    ^

    sketch_jun23a:32: error: stray ‘\240’ in program

    sketch_jun23a:32: error: stray ‘\240’ in program

    sketch_jun23a:32: error: stray ‘\240’ in program

    sketch_jun23a:33: error: stray ‘\240’ in program

        server.printP(msg1);

    ^

    sketch_jun23a:33: error: stray ‘\240’ in program

    sketch_jun23a:33: error: stray ‘\240’ in program

    sketch_jun23a:33: error: stray ‘\240’ in program

    sketch_jun23a:34: error: stray ‘\240’ in program

        server.printP(msg2);

    ^

    sketch_jun23a:34: error: stray ‘\240’ in program

    sketch_jun23a:34: error: stray ‘\240’ in program

    sketch_jun23a:34: error: stray ‘\240’ in program

    sketch_jun23a:35: error: stray ‘\240’ in program

        server.printP(msg3);

    ^

    sketch_jun23a:35: error: stray ‘\240’ in program

    sketch_jun23a:35: error: stray ‘\240’ in program

    sketch_jun23a:35: error: stray ‘\240’ in program

    sketch_jun23a:36: error: stray ‘\240’ in program

        server.println(“”);

    ^

    sketch_jun23a:36: error: stray ‘\240’ in program

    sketch_jun23a:36: error: stray ‘\240’ in program

    sketch_jun23a:36: error: stray ‘\240’ in program

    sketch_jun23a:37: error: stray ‘\240’ in program

        server.printP(msg4);

    ^

    sketch_jun23a:37: error: stray ‘\240’ in program

    sketch_jun23a:37: error: stray ‘\240’ in program

    sketch_jun23a:37: error: stray ‘\240’ in program

    sketch_jun23a:38: error: stray ‘\240’ in program

      }

    ^

    sketch_jun23a:38: error: stray ‘\240’ in program

    sketch_jun23a:40: error: stray ‘\240’ in program

     

    ^

    sketch_jun23a:43: error: stray ‘\240’ in program

      //in other words: “YWRtaW46YWRtaW4=” is the Base64 representation of “admin:admin” */

    ^

    sketch_jun23a:43: error: stray ‘\240’ in program

    sketch_jun23a:44: error: stray ‘\240’ in program

      if (server.checkCredentials(“YWRtaW46YWRtaW4=”))

    ^

    sketch_jun23a:44: error: stray ‘\240’ in program

    sketch_jun23a:45: error: stray ‘\240’ in program

      {

    ^

    sketch_jun23a:45: error: stray ‘\240’ in program

    sketch_jun23a:46: error: stray ‘\240’ in program

        server.httpSuccess();

    ^

    sketch_jun23a:46: error: stray ‘\240’ in program

    sketch_jun23a:46: error: stray ‘\240’ in program

    sketch_jun23a:46: error: stray ‘\240’ in program

    sketch_jun23a:47: error: stray ‘\240’ in program

        if (type != WebServer::HEAD)

    ^

    sketch_jun23a:47: error: stray ‘\240’ in program

    sketch_jun23a:47: error: stray ‘\240’ in program

    sketch_jun23a:47: error: stray ‘\240’ in program

    sketch_jun23a:48: error: stray ‘\240’ in program

        {

    ^

    sketch_jun23a:48: error: stray ‘\240’ in program

    sketch_jun23a:48: error: stray ‘\240’ in program

    sketch_jun23a:48: error: stray ‘\240’ in program

    sketch_jun23a:49: error: stray ‘\240’ in program

          P(msg1) = “Welcome to the console page”;

    ^

    sketch_jun23a:49: error: stray ‘\240’ in program

    sketch_jun23a:49: error: stray ‘\240’ in program

    sketch_jun23a:49: error: stray ‘\240’ in program

    sketch_jun23a:49: error: stray ‘\240’ in program

    sketch_jun23a:49: error: stray ‘\240’ in program

    sketch_jun23a:50: error: stray ‘\240’ in program

          P(msg2) = ” You can choise to disable/enable the alarm system”;

    ^

    sketch_jun23a:50: error: stray ‘\240’ in program

    sketch_jun23a:50: error: stray ‘\240’ in program

    sketch_jun23a:50: error: stray ‘\240’ in program

    sketch_jun23a:50: error: stray ‘\240’ in program

    sketch_jun23a:50: error: stray ‘\240’ in program

    sketch_jun23a:51: error: stray ‘\240’ in program

          server.printP(msg1);

    ^

    sketch_jun23a:51: error: stray ‘\240’ in program

    sketch_jun23a:51: error: stray ‘\240’ in program

    sketch_jun23a:51: error: stray ‘\240’ in program

    sketch_jun23a:51: error: stray ‘\240’ in program

    sketch_jun23a:51: error: stray ‘\240’ in program

    sketch_jun23a:52: error: stray ‘\240’ in program

          server.printP(msg2);

    ^

    sketch_jun23a:52: error: stray ‘\240’ in program

    sketch_jun23a:52: error: stray ‘\240’ in program

    sketch_jun23a:52: error: stray ‘\240’ in program

    sketch_jun23a:52: error: stray ‘\240’ in program

    sketch_jun23a:52: error: stray ‘\240’ in program

    sketch_jun23a:53: error: stray ‘\240’ in program

          String s = “”;

    ^

    sketch_jun23a:53: error: stray ‘\240’ in program

    sketch_jun23a:53: error: stray ‘\240’ in program

    sketch_jun23a:53: error: stray ‘\240’ in program

    sketch_jun23a:53: error: stray ‘\240’ in program

    sketch_jun23a:53: error: stray ‘\240’ in program

    sketch_jun23a:54: error: stray ‘\240’ in program

           if (param_complete == true)

    ^

    sketch_jun23a:54: error: stray ‘\240’ in program

    sketch_jun23a:54: error: stray ‘\240’ in program

    sketch_jun23a:54: error: stray ‘\240’ in program

    sketch_jun23a:54: error: stray ‘\240’ in program

    sketch_jun23a:54: error: stray ‘\240’ in program

    sketch_jun23a:54: error: stray ‘\240’ in program

    sketch_jun23a:55: error: stray ‘\240’ in program

        {

    ^

    sketch_jun23a:55: error: stray ‘\240’ in program

    sketch_jun23a:55: error: stray ‘\240’ in program

    sketch_jun23a:55: error: stray ‘\240’ in program

    sketch_jun23a:56: error: stray ‘\240’ in program

          s = url_param;

    ^

    sketch_jun23a:56: error: stray ‘\240’ in program

    sketch_jun23a:56: error: stray ‘\240’ in program

    sketch_jun23a:56: error: stray ‘\240’ in program

    sketch_jun23a:56: error: stray ‘\240’ in program

    sketch_jun23a:56: error: stray ‘\240’ in program

    sketch_jun23a:57: error: stray ‘\240’ in program

          if (s==”on”){

    ^

    sketch_jun23a:57: error: stray ‘\240’ in program

    sketch_jun23a:57: error: stray ‘\240’ in program

    sketch_jun23a:57: error: stray ‘\240’ in program

    sketch_jun23a:57: error: stray ‘\240’ in program

    sketch_jun23a:57: error: stray ‘\240’ in program

    sketch_jun23a:58: error: stray ‘\240’ in program

            systemON = true;

    ^

    sketch_jun23a:58: error: stray ‘\240’ in program

    sketch_jun23a:58: error: stray ‘\240’ in program

    sketch_jun23a:58: error: stray ‘\240’ in program

    sketch_jun23a:58: error: stray ‘\240’ in program

    sketch_jun23a:58: error: stray ‘\240’ in program

    sketch_jun23a:58: error: stray ‘\240’ in program

    sketch_jun23a:58: error: stray ‘\240’ in program

    sketch_jun23a:59: error: stray ‘\240’ in program

         }

    ^

    sketch_jun23a:59: error: stray ‘\240’ in program

    sketch_jun23a:59: error: stray ‘\240’ in program

    sketch_jun23a:59: error: stray ‘\240’ in program

    sketch_jun23a:59: error: stray ‘\240’ in program

    sketch_jun23a:60: error: stray ‘\240’ in program

         if(s ==”off”){

    ^

    sketch_jun23a:60: error: stray ‘\240’ in program

    sketch_jun23a:60: error: stray ‘\240’ in program

    sketch_jun23a:60: error: stray ‘\240’ in program

    sketch_jun23a:60: error: stray ‘\240’ in program

    sketch_jun23a:61: error: stray ‘\240’ in program

            systemON = false;

    ^

    sketch_jun23a:61: error: stray ‘\240’ in program

    sketch_jun23a:61: error: stray ‘\240’ in program

    sketch_jun23a:61: error: stray ‘\240’ in program

    sketch_jun23a:61: error: stray ‘\240’ in program

    sketch_jun23a:61: error: stray ‘\240’ in program

    sketch_jun23a:61: error: stray ‘\240’ in program

    sketch_jun23a:61: error: stray ‘\240’ in program

    sketch_jun23a:62: error: stray ‘\240’ in program

         }

    ^

    sketch_jun23a:62: error: stray ‘\240’ in program

    sketch_jun23a:62: error: stray ‘\240’ in program

    sketch_jun23a:62: error: stray ‘\240’ in program

    sketch_jun23a:62: error: stray ‘\240’ in program

    sketch_jun23a:63: error: stray ‘\240’ in program

         // Viene cambiata la pagina WEB a seconda che il LED sia spento, oppure systemON

    ^

    sketch_jun23a:63: error: stray ‘\240’ in program

    sketch_jun23a:63: error: stray ‘\240’ in program

    sketch_jun23a:63: error: stray ‘\240’ in program

    sketch_jun23a:63: error: stray ‘\240’ in program

    sketch_jun23a:64: error: stray ‘\240’ in program

          if(systemON){

    ^

    sketch_jun23a:64: error: stray ‘\240’ in program

    sketch_jun23a:64: error: stray ‘\240’ in program

    sketch_jun23a:64: error: stray ‘\240’ in program

    sketch_jun23a:64: error: stray ‘\240’ in program

    sketch_jun23a:64: error: stray ‘\240’ in program

    sketch_jun23a:65: error: stray ‘\240’ in program

              server.println(“ “);

    ^

    sketch_jun23a:65: error: stray ‘\240’ in program

    sketch_jun23a:65: error: stray ‘\240’ in program

    sketch_jun23a:65: error: stray ‘\240’ in program

    sketch_jun23a:65: error: stray ‘\240’ in program

    sketch_jun23a:65: error: stray ‘\240’ in program

    sketch_jun23a:65: error: stray ‘\240’ in program

    sketch_jun23a:65: error: stray ‘\240’ in program

    sketch_jun23a:65: error: stray ‘\240’ in program

    sketch_jun23a:65: error: stray ‘\240’ in program

    sketch_jun23a:66: error: stray ‘\240’ in program

              server.println(” The alarm system is enable “);

    ^

    sketch_jun23a:66: error: stray ‘\240’ in program

    sketch_jun23a:66: error: stray ‘\240’ in program

    sketch_jun23a:66: error: stray ‘\240’ in program

    sketch_jun23a:66: error: stray ‘\240’ in program

    sketch_jun23a:66: error: stray ‘\240’ in program

    sketch_jun23a:66: error: stray ‘\240’ in program

    sketch_jun23a:66: error: stray ‘\240’ in program

    sketch_jun23a:66: error: stray ‘\240’ in program

    sketch_jun23a:66: error: stray ‘\240’ in program

    sketch_jun23a:67: error: stray ‘\240’ in program

            }else{

    ^

    sketch_jun23a:67: error: stray ‘\240’ in program

    sketch_jun23a:67: error: stray ‘\240’ in program

    sketch_jun23a:67: error: stray ‘\240’ in program

    sketch_jun23a:67: error: stray ‘\240’ in program

    sketch_jun23a:67: error: stray ‘\240’ in program

    sketch_jun23a:67: error: stray ‘\240’ in program

    sketch_jun23a:67: error: stray ‘\240’ in program

    sketch_jun23a:68: error: stray ‘\240’ in program

              server.println(“ “);

    ^

    sketch_jun23a:68: error: stray ‘\240’ in program

    sketch_jun23a:68: error: stray ‘\240’ in program

    sketch_jun23a:68: error: stray ‘\240’ in program

    sketch_jun23a:68: error: stray ‘\240’ in program

    sketch_jun23a:68: error: stray ‘\240’ in program

    sketch_jun23a:68: error: stray ‘\240’ in program

    sketch_jun23a:68: error: stray ‘\240’ in program

    sketch_jun23a:68: error: stray ‘\240’ in program

    sketch_jun23a:68: error: stray ‘\240’ in program

    sketch_jun23a:69: error: stray ‘\240’ in program

              server.println(” The alarm system is disabled “);

    ^

    sketch_jun23a:69: error: stray ‘\240’ in program

    sketch_jun23a:69: error: stray ‘\240’ in program

    sketch_jun23a:69: error: stray ‘\240’ in program

    sketch_jun23a:69: error: stray ‘\240’ in program

    sketch_jun23a:69: error: stray ‘\240’ in program

    sketch_jun23a:69: error: stray ‘\240’ in program

    sketch_jun23a:69: error: stray ‘\240’ in program

    sketch_jun23a:69: error: stray ‘\240’ in program

    sketch_jun23a:69: error: stray ‘\240’ in program

    sketch_jun23a:70: error: stray ‘\240’ in program

            }

    ^

    sketch_jun23a:70: error: stray ‘\240’ in program

    sketch_jun23a:70: error: stray ‘\240’ in program

    sketch_jun23a:70: error: stray ‘\240’ in program

    sketch_jun23a:70: error: stray ‘\240’ in program

    sketch_jun23a:70: error: stray ‘\240’ in program

    sketch_jun23a:70: error: stray ‘\240’ in program

    sketch_jun23a:70: error: stray ‘\240’ in program

    sketch_jun23a:71: error: stray ‘\240’ in program

         }

    ^

    sketch_jun23a:71: error: stray ‘\240’ in program

    sketch_jun23a:71: error: stray ‘\240’ in program

    sketch_jun23a:71: error: stray ‘\240’ in program

    sketch_jun23a:71: error: stray ‘\240’ in program

    sketch_jun23a:72: error: stray ‘\240’ in program

      }

    ^

    sketch_jun23a:72: error: stray ‘\240’ in program

    sketch_jun23a:73: error: stray ‘\240’ in program

       server.println(“ “);

    ^

    sketch_jun23a:73: error: stray ‘\240’ in program

    sketch_jun23a:73: error: stray ‘\240’ in program

    sketch_jun23a:75: error: stray ‘\240’ in program

      else

    ^

    sketch_jun23a:75: error: stray ‘\240’ in program

    sketch_jun23a:76: error: stray ‘\240’ in program

      {

    ^

    sketch_jun23a:76: error: stray ‘\240’ in program

    sketch_jun23a:77: error: stray ‘\240’ in program

        /* send a 401 error back causing the web browser to prompt the user for credentials */

    ^

    sketch_jun23a:77: error: stray ‘\240’ in program

    sketch_jun23a:77: error: stray ‘\240’ in program

    sketch_jun23a:77: error: stray ‘\240’ in program

    sketch_jun23a:78: error: stray ‘\240’ in program

        server.httpUnauthorized();

    ^

    sketch_jun23a:78: error: stray ‘\240’ in program

    sketch_jun23a:78: error: stray ‘\240’ in program

    sketch_jun23a:78: error: stray ‘\240’ in program

    sketch_jun23a:79: error: stray ‘\240’ in program

      }

    ^

    sketch_jun23a:79: error: stray ‘\240’ in program

    sketch_jun23a:81: error: stray ‘\240’ in program

     

    ^

    sketch_jun23a:83: error: stray ‘\240’ in program

      pinMode(pinPIR,INPUT); 

    ^

    sketch_jun23a:83: error: stray ‘\240’ in program

    sketch_jun23a:83: error: stray ‘\240’ in program

    sketch_jun23a:84: error: stray ‘\240’ in program

      pinMode(led,OUTPUT);

    ^

    sketch_jun23a:84: error: stray ‘\240’ in program

    sketch_jun23a:85: error: stray ‘\240’ in program

      Serial.begin(9600);

    ^

    sketch_jun23a:85: error: stray ‘\240’ in program

    sketch_jun23a:86: error: stray ‘\240’ in program

      Ethernet.begin(mac_addr);

    ^

    sketch_jun23a:86: error: stray ‘\240’ in program

    sketch_jun23a:87: error: stray ‘\240’ in program

      webserver.setDefaultCommand(&defaultCmd);

    ^

    sketch_jun23a:87: error: stray ‘\240’ in program

    sketch_jun23a:88: error: stray ‘\240’ in program

      webserver.addCommand(“index.html”, &defaultCmd);

    ^

    sketch_jun23a:88: error: stray ‘\240’ in program

    sketch_jun23a:89: error: stray ‘\240’ in program

      webserver.addCommand(“private.html”, &privateCmd);

    ^

    sketch_jun23a:89: error: stray ‘\240’ in program

    sketch_jun23a:90: error: stray ‘\240’ in program

      webserver.begin(); 

    ^

    sketch_jun23a:90: error: stray ‘\240’ in program

    sketch_jun23a:90: error: stray ‘\240’ in program

    sketch_jun23a:91: error: stray ‘\240’ in program

      Serial.println(“Connecting…”);

    ^

    sketch_jun23a:91: error: stray ‘\240’ in program

    sketch_jun23a:92: error: stray ‘\240’ in program

      if (my_conn.mysql_connect(server_addr, 3306, user, password)) {

    ^

    sketch_jun23a:92: error: stray ‘\240’ in program

    sketch_jun23a:93: error: stray ‘\240’ in program

        delay(1000);

    ^

    sketch_jun23a:93: error: stray ‘\240’ in program

    sketch_jun23a:93: error: stray ‘\240’ in program

    sketch_jun23a:93: error: stray ‘\240’ in program

    sketch_jun23a:94: error: stray ‘\240’ in program

      }

    ^

    sketch_jun23a:94: error: stray ‘\240’ in program

    sketch_jun23a:95: error: stray ‘\240’ in program

      else

    ^

    sketch_jun23a:95: error: stray ‘\240’ in program

    sketch_jun23a:96: error: stray ‘\240’ in program

        Serial.println(“Connection failed.”);

    ^

    sketch_jun23a:96: error: stray ‘\240’ in program

    sketch_jun23a:96: error: stray ‘\240’ in program

    sketch_jun23a:96: error: stray ‘\240’ in program

    sketch_jun23a:97: error: stray ‘\240’ in program

      SetupRFDataRxnLink(rx_pin, baudRate);

    ^

    sketch_jun23a:97: error: stray ‘\240’ in program

    sketch_jun23a:99: error: stray ‘\240’ in program

     

    ^

    sketch_jun23a:101: error: stray ‘\240’ in program

      char buff[64];

    ^

    sketch_jun23a:101: error: stray ‘\240’ in program

    sketch_jun23a:102: error: stray ‘\240’ in program

      int len = 64;

    ^

    sketch_jun23a:102: error: stray ‘\240’ in program

    sketch_jun23a:103: error: stray ‘\240’ in program

      uint8_t buf[VW_MAX_MESSAGE_LEN];

    ^

    sketch_jun23a:103: error: stray ‘\240’ in program

    sketch_jun23a:104: error: stray ‘\240’ in program

      uint8_t buflen = VW_MAX_MESSAGE_LEN;

    ^

    sketch_jun23a:104: error: stray ‘\240’ in program

    sketch_jun23a:105: error: stray ‘\240’ in program

      union RFData inDataSeq;//To store incoming data

    ^

    sketch_jun23a:105: error: stray ‘\240’ in program

    sketch_jun23a:106: error: stray ‘\240’ in program

      float inArray[1];//To store decoded information

    ^

    sketch_jun23a:106: error: stray ‘\240’ in program

    sketch_jun23a:107: error: stray ‘\240’ in program

      if(RFLinkDataAvailable(buf, &buflen) && systemON)

    ^

    sketch_jun23a:107: error: stray ‘\240’ in program

    sketch_jun23a:108: error: stray ‘\240’ in program

      {

    ^

    sketch_jun23a:108: error: stray ‘\240’ in program

    sketch_jun23a:109: error: stray ‘\240’ in program

            for(int i =0; i< buflen; i++)

    ^

    sketch_jun23a:109: error: stray '\240' in program

    sketch_jun23a:109: error: stray '\240' in program

    sketch_jun23a:109: error: stray '\240' in program

    sketch_jun23a:109: error: stray '\240' in program

    sketch_jun23a:109: error: stray '\240' in program

    sketch_jun23a:109: error: stray '\240' in program

    sketch_jun23a:109: error: stray '\240' in program

    sketch_jun23a:110: error: stray '\240' in program

            {

    ^

    sketch_jun23a:110: error: stray '\240' in program

    sketch_jun23a:110: error: stray '\240' in program

    sketch_jun23a:110: error: stray '\240' in program

    sketch_jun23a:110: error: stray '\240' in program

    sketch_jun23a:110: error: stray '\240' in program

    sketch_jun23a:110: error: stray '\240' in program

    sketch_jun23a:110: error: stray '\240' in program

    sketch_jun23a:111: error: stray '\240' in program

              inDataSeq.s[i] = buf[i];

    ^

    sketch_jun23a:111: error: stray '\240' in program

    sketch_jun23a:111: error: stray '\240' in program

    sketch_jun23a:111: error: stray '\240' in program

    sketch_jun23a:111: error: stray '\240' in program

    sketch_jun23a:111: error: stray '\240' in program

    sketch_jun23a:111: error: stray '\240' in program

    sketch_jun23a:111: error: stray '\240' in program

    sketch_jun23a:111: error: stray '\240' in program

    sketch_jun23a:111: error: stray '\240' in program

    sketch_jun23a:112: error: stray '\240' in program

            }

    ^

    sketch_jun23a:112: error: stray '\240' in program

    sketch_jun23a:112: error: stray '\240' in program

    sketch_jun23a:112: error: stray '\240' in program

    sketch_jun23a:112: error: stray '\240' in program

    sketch_jun23a:112: error: stray '\240' in program

    sketch_jun23a:112: error: stray '\240' in program

    sketch_jun23a:112: error: stray '\240' in program

    sketch_jun23a:113: error: stray '\240' in program

            DecodeRFData(inArray, inDataSeq);

    ^

    sketch_jun23a:113: error: stray '\240' in program

    sketch_jun23a:113: error: stray '\240' in program

    sketch_jun23a:113: error: stray '\240' in program

    sketch_jun23a:113: error: stray '\240' in program

    sketch_jun23a:113: error: stray '\240' in program

    sketch_jun23a:113: error: stray '\240' in program

    sketch_jun23a:113: error: stray '\240' in program

    sketch_jun23a:114: error: stray '\240' in program

            int idNetworkPIR =(int)inArray[0];

    ^

    sketch_jun23a:114: error: stray '\240' in program

    sketch_jun23a:114: error: stray '\240' in program

    sketch_jun23a:114: error: stray '\240' in program

    sketch_jun23a:114: error: stray '\240' in program

    sketch_jun23a:114: error: stray '\240' in program

    sketch_jun23a:114: error: stray '\240' in program

    sketch_jun23a:114: error: stray '\240' in program

    sketch_jun23a:115: error: stray '\240' in program

            sendDBmotion(idNetworkPIR);

    ^

    sketch_jun23a:115: error: stray '\240' in program

    sketch_jun23a:115: error: stray '\240' in program

    sketch_jun23a:115: error: stray '\240' in program

    sketch_jun23a:115: error: stray '\240' in program

    sketch_jun23a:115: error: stray '\240' in program

    sketch_jun23a:115: error: stray '\240' in program

    sketch_jun23a:115: error: stray '\240' in program

    sketch_jun23a:116: error: stray '\240' in program

            ledOnOff(led,timeLed);

    ^

    sketch_jun23a:116: error: stray '\240' in program

    sketch_jun23a:116: error: stray '\240' in program

    sketch_jun23a:116: error: stray '\240' in program

    sketch_jun23a:116: error: stray '\240' in program

    sketch_jun23a:116: error: stray '\240' in program

    sketch_jun23a:116: error: stray '\240' in program

    sketch_jun23a:116: error: stray '\240' in program

    sketch_jun23a:117: error: stray '\240' in program

      }

    ^

    sketch_jun23a:117: error: stray '\240' in program

    sketch_jun23a:118: error: stray '\240' in program

      /* process incoming connections one at a time forever */

    ^

    sketch_jun23a:118: error: stray '\240' in program

    sketch_jun23a:119: error: stray '\240' in program

      webserver.processConnection(buff, &len);

    ^

    sketch_jun23a:119: error: stray '\240' in program

    sketch_jun23a:120: error: stray '\240' in program

      if(motionDetected() && systemON){

    ^

    sketch_jun23a:120: error: stray '\240' in program

    sketch_jun23a:121: error: stray '\240' in program

        Serial.println("Movimento rilevato");

    ^

    sketch_jun23a:121: error: stray '\240' in program

    sketch_jun23a:121: error: stray '\240' in program

    sketch_jun23a:121: error: stray '\240' in program

    sketch_jun23a:122: error: stray '\240' in program

        sendDBmotion(idPIRServer);

    ^

    sketch_jun23a:122: error: stray '\240' in program

    sketch_jun23a:122: error: stray '\240' in program

    sketch_jun23a:122: error: stray '\240' in program

    sketch_jun23a:123: error: stray '\240' in program

        ledOnOff(led,timeLed);

    ^

    sketch_jun23a:123: error: stray '\240' in program

    sketch_jun23a:123: error: stray '\240' in program

    sketch_jun23a:123: error: stray '\240' in program

    sketch_jun23a:124: error: stray '\240' in program

        while(motionDetected()){

    ^

    sketch_jun23a:124: error: stray '\240' in program

    sketch_jun23a:124: error: stray '\240' in program

    sketch_jun23a:124: error: stray '\240' in program

    sketch_jun23a:125: error: stray '\240' in program

          webserver.processConnection(buff, &len);

    ^

    sketch_jun23a:125: error: stray '\240' in program

    sketch_jun23a:125: error: stray '\240' in program

    sketch_jun23a:125: error: stray '\240' in program

    sketch_jun23a:125: error: stray '\240' in program

    sketch_jun23a:125: error: stray '\240' in program

    sketch_jun23a:126: error: stray '\240' in program

        }

    ^

    sketch_jun23a:126: error: stray '\240' in program

    sketch_jun23a:126: error: stray '\240' in program

    sketch_jun23a:126: error: stray '\240' in program

    sketch_jun23a:127: error: stray '\240' in program

      }

    ^

    sketch_jun23a:127: error: stray '\240' in program

    sketch_jun23a:131: error: stray '\240' in program

     if(digitalRead(pinPIR)==HIGH){

    ^

    sketch_jun23a:132: error: stray '\240' in program

      return true;

    ^

    sketch_jun23a:132: error: stray '\240' in program

    sketch_jun23a:133: error: stray '\240' in program

     }else{

    ^

    sketch_jun23a:134: error: stray '\240' in program

      return false;

    ^

    sketch_jun23a:134: error: stray '\240' in program

    sketch_jun23a:135: error: stray '\240' in program

     }

    ^

    sketch_jun23a:139: error: stray '\240' in program

      digitalWrite(led,HIGH);

    ^

    sketch_jun23a:139: error: stray '\240' in program

    sketch_jun23a:140: error: stray '\240' in program

      delay(timeLed);

    ^

    sketch_jun23a:140: error: stray '\240' in program

    sketch_jun23a:141: error: stray '\240' in program

      digitalWrite(led,LOW);

    ^

    sketch_jun23a:141: error: stray '\240' in program

    sketch_jun23a:142: error: stray '\240' in program

    }   

    ^

    sketch_jun23a:142: error: stray '\240' in program

    sketch_jun23a:142: error: stray '\240' in program

    exit status 1
    stray '\240' in program

    come posso risolvere??
    Grazie mille

    1. Salve,
      il problema penso sia dovuto alla codifica usata da WordPress, per mostrare il codice all’interno dell’articolo. Ti consiglio di copiare il codice dalla repo di Github

  12. Salve,
    complimenti per il progetto è lo vorrei metterlo in atto, però un pò diversamente.
    Vorrei utilizzare dei normali sensori che lavorano in modalità normalmente chiuso, quando il sensore rileva il movimento o il calore il contatto si apre. Secondo te che scheda potrei utilizzare in modo da rilevare il normalmente chiuso o aperto del sensore?
    Secondo me facendo così si potrebbe anche usare la funzione del tamper utilizEzando le resistenze che in base al valore capisce se è stato manomesso il sensore o ha rilevato il movimento.
    GRAZIE

    1. Salve,
      spero di aver capito bene la domanda. La maggior parte dei micro, come Arduino, dispone di un’ADC, ovvero di un convertitore analogico digitale per convertire valori di tensioni, che corrispondo a grandezze fisiche, in segnali digitali. Quindi di per se non è necessario acquistare ulteriore elettronica per rilevare una variazione da NC a NO, oppure una variazione di resistenza.
      Spero di essere stato esaustivo e chiaro nella risposta.

      1. Salve,
        grazie per avermi risposto,si era quello che intendevo e secondo me utilizzando questo metodo si può rilevare in base al carico se è una manomissione o se è stato aperto o meno il sensore.

    1. Ci sono componenti hardware esterni in grado di rilevare diversi ingressi, ma penso che nel suo caso convenga l’acquisto di diversi micro, collegati con dispositivi Wireless ad un unico master.

  13. Buonasera.. Vorrei chiedere alcune informazioni.

    non trovo in rete il valore di assorbimento quiescente del TX. Sarebbe importante per una realizzazione a batteria come sto facendo io. (pensavo ad attiny85+pir+TX+sensore porta)

    Un altra domanda. Vorrei conferma da lei che è possibile mandare una stringa di bit all RX in quanto popolerei la casa di 6 moduli TX dove dentro ogni modulo ci sono 2 sensori (pir e contatto porta).
    è quindi obbligatoria una codifica da parte dell’RX.

    1. Per quanto riguarda il discorso batteria, penso che sia tranquillamente realizzabile con l’uso del modulo wireless.
      Tra un TX e un RX è possibile inviare tranquillamente una stringa di byte e per quanto riguarda la codifica, è ad un livello inferiore questo protocollo, un po’ come l’HTTPS rispetto a TCP. Può codificare la stringa di byte con una chiave simmetrica il TX e RX. Spero di essere stato utile.

I commenti sono chiusi.