OM/YL Online  

   

Login  

   

donazione  

 
   Donazione a sostegno e per lo
      sviluppo
del Club Italiano
                Modi Digitali
               Psktrentunisti

   

MultiTrans  

   
   
Benvenuto, Ospite
Nome utente: Password: Ricordami

ARGOMENTO: Antifurto semplice con Arduino

Antifurto semplice con Arduino 3 Anni 11 Mesi fa #1123

  • IZ3ZLU
  • Avatar di IZ3ZLU
  • ADESSO ONLINE
  • Moderatore
  • Messaggi: 580
  • Ringraziamenti ricevuti 102
  • Karma: 44
Funziona!!
Quindi ieri ho inscatolato il TX che monterò su parete vicino alla porta.
Il jack che si vede nella parte superiore serve a collegare il sensore nascosto fuori dalla porta. In questo modo sul display apparirà "Allarme esterno" e, nel caso qualcuno entri, "Allarme interno"...
Ecco il nuovo arrivato:


Questa immagine è nascosta ai visitatori. Prego accedi o registrati per visualizzarli.
Ultima modifica: 3 Anni 11 Mesi fa da IZ3ZLU.
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

Antifurto semplice con Arduino 3 Anni 11 Mesi fa #1125

  • IZ3ZLU
  • Avatar di IZ3ZLU
  • ADESSO ONLINE
  • Moderatore
  • Messaggi: 580
  • Ringraziamenti ricevuti 102
  • Karma: 44
Ed ecco il PCB dell'RX.
Sempre da fare speculare per chi usa Press'n Peel.

Questa immagine è nascosta ai visitatori. Prego accedi o registrati per visualizzarli.
Ultima modifica: 3 Anni 11 Mesi fa da IZ3ZLU.
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

Antifurto semplice con Arduino 3 Anni 11 Mesi fa #1126

  • IZ3ZLU
  • Avatar di IZ3ZLU
  • ADESSO ONLINE
  • Moderatore
  • Messaggi: 580
  • Ringraziamenti ricevuti 102
  • Karma: 44
Questa immagine è nascosta ai visitatori. Prego accedi o registrati per visualizzarli.
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

Antifurto semplice con Arduino 3 Anni 11 Mesi fa #1131

  • IZ3ZLU
  • Avatar di IZ3ZLU
  • ADESSO ONLINE
  • Moderatore
  • Messaggi: 580
  • Ringraziamenti ricevuti 102
  • Karma: 44
Ed ecco la Base con il display , l'antennino e , davanti, il sensore di temperatura e umidità...


Questa immagine è nascosta ai visitatori. Prego accedi o registrati per visualizzarli.


Venendo da fuori ho testato i sensori tramite monitor seriale di Arduino.... i risultati ci sono.. prima mi sente il sensore esterno, poi l'esterno e l'interno a breve distanza mentre entro e poi solo l'interno:


Questa immagine è nascosta ai visitatori. Prego accedi o registrati per visualizzarli.
Ultima modifica: 3 Anni 11 Mesi fa da IZ3ZLU.
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.
I seguenti utenti ringraziano:: soulribel

Antifurto semplice con Arduino 3 Anni 11 Mesi fa #1134

  • IZ3ZLU
  • Avatar di IZ3ZLU
  • ADESSO ONLINE
  • Moderatore
  • Messaggi: 580
  • Ringraziamenti ricevuti 102
  • Karma: 44
Aggiungo uno sketch che permette di regolare l'orologio e il datario da monitor seriale. Si compila , si regola l'orario e la data da monitor seriale e poi si ricompila lo sketch dell'antifurto.Il modulo RTC terrà in memoria le impostazioni appena ricevute.. Ho notato che ogni tanto va fatto... se invece si vuole una precisione assoluta, o si collega l'arduino ad un PC (ma si perde la portabilità..) o ad un modulo GPS (ma si perde la semplicità). Secondo me è più semplice regolare l'orologio una volta al mese tramite questo sketch:
/* ------------------------------------------------------- 
 * Lettura ed impostazione di un RTC con DS1307
 * ------------------------------------------------------- */
#include "Wire.h"

#define DS1307_ADDRESS 0x68 // Indirizzo dell'integrato DS1307 
                            // come indicato nel datasheet
byte zero = 0x00;

// Trucco per riuscire a far passare una struttura a una funzione
namespace RTC_ns 
{
    typedef struct
    {
      byte second;   //0-59
      byte minute;   //0-59
      byte hour;     //0-23
      byte weekDay;  //1-7
      byte monthDay; //1-31
      byte month;    //1-12
      byte year;     //0-99
    } tDataOra;
}

byte readByte() 
{
   while (!Serial.available()) delay(10);
   byte reading = 0;
   byte incomingByte = Serial.read();
   while (incomingByte != '\n') 
   {
     if (incomingByte >= '0' && incomingByte <= '9')
         reading = reading * 10 + (incomingByte - '0');
     else;
         incomingByte = Serial.read();
   }
   Serial.flush();
   return reading;
}
    
// Converte dalla notazione in base 10 alla notazione BCD
byte decToBcd(byte val)
{
    // val % 10 => corrisponde alla notazione BCD 
    //             messa nei 4 bit a destra di un byte
    // (val-(val%10))/10*16 => corrisponde lla notazione BCD 
    //                         messa nei 4 bit a sinistra di un byte 
    return ( (val-val%10)/10*16 + val%10 );
}

// Converte dalla notazione BCD alla notazione in base 10
byte bcdToDec(byte val)  
{
    // val % 16 => corrisponde ai 4 bit a destra di un byte
    // (val - val % 16)/ 16 => corrisponde ai 4 bit a sinistra di un byte 
    return ( (val-val%16)/16*10 + val%16 );
}
    
void printShortDateTime(RTC_ns::tDataOra D)
{
  char buffer[25];
  sprintf(buffer, "%02u/%02u/%u %02u:%02u:%02u", 
                  D.monthDay,D.month,D.year+2000,
                  D.hour, D.minute, D.second);
  Serial.println(buffer);
}
void LeggiDataOra(RTC_ns::tDataOra *D)
{
     Serial.println("Cambiare su 'A capo (NL)' l'impostazione \nin basso a destra nel Serial Monitor");
     Serial.println("Digita il giorno del mese (1..31):");
     D->monthDay = readByte();
     Serial.println("Digita il mese (1-12):");
     D->month = readByte();
     Serial.println("Digita l'anno (0-99):");
     D->year = readByte();
     Serial.println("Digita il giorno della settimana (1 - Dom ... 7 - Sab):");
     D->weekDay = readByte();
     Serial.println("Digita l'ora (0-23):");
     D->hour = readByte();
     Serial.println("Digita i minuti (0-59):");
     D->minute = readByte();
     D->second = 0;
     Serial.print("Hai digitato la data:");
     printShortDateTime(*D);
}

void setDateTime(RTC_ns::tDataOra D)
{
    Wire.beginTransmission(DS1307_ADDRESS);
    // il primo byte inviato stabilisce il registro
    // iniziale su cui scrivere
    Wire.write(zero);
    Wire.write(decToBcd(D.second));
    Wire.write(decToBcd(D.minute));
    Wire.write(decToBcd(D.hour));
    Wire.write(decToBcd(D.weekDay));
    Wire.write(decToBcd(D.monthDay));
    Wire.write(decToBcd(D.month));
    Wire.write(decToBcd(D.year));
    Wire.write(zero);  
    Wire.endTransmission();
}

boolean getDateTime(RTC_ns::tDataOra *D)
{
  // inizializzo la trasmissione partendo
  // dall'indirizzo 0x00
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero);
  Wire.endTransmission();
  // richiede 7 bytes alla device con l'indirizzo indicato 
  // il DS1307 utilizza 56 bit per registrare la data/ora
  Wire.requestFrom(DS1307_ADDRESS, 7);
  if (Wire.available())
  {
      D->second = bcdToDec(Wire.read());
      D->minute = bcdToDec(Wire.read());
      D->hour = bcdToDec(Wire.read() & 0b111111); // modo 24 ore
                                                  // considero i primi 6 bit
      D->weekDay = Wire.read(); // non mi serve convertire (Range da 1 a 7 => 3 bit) 
      D->monthDay = bcdToDec(Wire.read());
      D->month = bcdToDec(Wire.read());
      D->year = bcdToDec(Wire.read());
      return true;
  }
  return false;
}

void printLongDateTime(RTC_ns::tDataOra D)
{
   const char* days[] =  { "Domenica", "Lunedi'", "Martedi'", "Mercoledi'", 
                           "Giovedi'", "Venerdi'", "Sabato" };
   const char* months[] = { "Gennaio", "Febbraio", "Marzo", "Aprile", 
                            "Maggio", "Giugno", "Luglio", "Agosto",
                            "Settembre", "Ottobre", "Novembre", "Dicembre"};
  char buffer[40];
  sprintf(buffer, "%s, %u %s %u %02u:%02u:%02u", 
                  days[D.weekDay-1], D.monthDay, months[D.month-1],D.year+2000,
                  D.hour, D.minute, D.second);
  Serial.println(buffer);
}

void setup()
{
  Wire.begin(); // Si connette al bus i2c
  Serial.begin(9600);
  RTC_ns::tDataOra D;
  LeggiDataOra(&D);
  setDateTime(D);
  // Leggo una sola volta la data/ora per verifica
  if (getDateTime(&D))
  {
      printLongDateTime(D);
      printShortDateTime(D);
  }
  else
     Serial.println("Errore di lettura Data/ora");
}

void loop() {}

La schermata che appare sul monitor seriale è questa:

Questa immagine è nascosta ai visitatori. Prego accedi o registrati per visualizzarli.
Ultima modifica: 3 Anni 11 Mesi fa da IZ3ZLU.
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

Antifurto semplice con Arduino 3 Anni 11 Mesi fa #1135

  • IZ3ZLU
  • Avatar di IZ3ZLU
  • ADESSO ONLINE
  • Moderatore
  • Messaggi: 580
  • Ringraziamenti ricevuti 102
  • Karma: 44
Creato lo sketch per utilizzare il buzzer.
Mi sono accorto che per errore avevo preso un buzzer 5V che non bastava alimentare con tensione continua.... ma andava alimentato con la frequenza desiderata....
Ho quindi aggiunto una piccola parte di sketch che controlla il buzzer con due tonalità diverse per poter capire senza guardare il display quale allarme è scattato.
Lo sketch è il seguente:
#include "Pitches.h"
#include <VirtualWire.h>
#include <Wire.h>
#include <RTClib.h> 
#include <PCF8574_HD44780_I2C.h>
#include <dht.h>
#define dht_dpin A0 
PCF8574_HD44780_I2C lcd(0x27,20,4);
dht DHT;
RTC_DS1307 RTC;
const int setpin = 6;
boolean statepin = 0;
char buffer1[20];
char buffer2[20];
int ledPin1 = 12; 
int ledPin = 11;
int relePin = 10;
int RX_DIO_Pin = 5;
const int Buzzer = 9;
unsigned int Data;
int note = NOTE_A4;
int note1 = NOTE_C4;
void setup(){
  
 Serial.begin(9600);
    pinMode (6, INPUT);
    digitalWrite (6, HIGH); 
 Wire.begin();
       RTC.begin();
       lcd.init();     
  lcd.backlight(); 
  lcd.setCursor(0,0);
  lcd.print("  Antifurto IZ3ZLU ");
  lcd.setCursor(0,2);
  lcd.print("Data - ");
  lcd.setCursor(0,3);
  lcd.print("Ora  - ");
  if (! RTC.isrunning()) {
  RTC.adjust(DateTime(__DATE__, __TIME__)); 
 }

  delay(300);//Let system settle
  Serial.println("Humidità e temperatura\n\n");
  delay(700);//Wait rest of 1000ms recommended delay before


  pinMode(ledPin, OUTPUT);
  pinMode(ledPin1, OUTPUT);
  pinMode(relePin, OUTPUT);
  vw_set_rx_pin(RX_DIO_Pin);
  vw_setup(1000);
  vw_rx_start(); 

}
void loop(){

      statepin = digitalRead (setpin);
      if (statepin == LOW)
      RTC.adjust(DateTime(__DATE__, __TIME__));


 DateTime now = RTC.now();
      sprintf(buffer1,  "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
      lcd.setCursor(0,2);
      lcd.print( buffer1 );
      sprintf(buffer2,  "%02d/%02d/%d", now.day(), now.month(), now.year());
      lcd.setCursor(0,3);
      lcd.print( buffer2 );
      delay(500);
      DHT.read11(dht_dpin);
  lcd.setCursor(0,0);
  lcd.print("Umidita':          %");
  lcd.setCursor(13,0);
  lcd.print(DHT.humidity);
  lcd.setCursor(0,1);
  lcd.print("Temperatura:       C");
  lcd.setCursor(13,1);
  lcd.print(DHT.temperature);
  Serial.print("Umidità = ");
  Serial.print(DHT.humidity);
  Serial.print("%  ");
  Serial.print("Temperatura = ");
  Serial.print(DHT.temperature); 
  Serial.println("C  ");
  delay(500);
  
  uint8_t Buffer_Size = 2;
  unsigned int Data;
  uint8_t RxBuffer[Buffer_Size];
  if (vw_get_message(RxBuffer, &Buffer_Size)){
  Data = RxBuffer[0] << 8 | RxBuffer[1];

 }


 if(Data==2403){

   lcd.setCursor(10,2);
   lcd.print("All.Intern"); 
   Serial.println(Data);
   digitalWrite(ledPin, HIGH);   //Accendiamo il LED
   digitalWrite(relePin, HIGH);
tone(Buzzer, note, 2000);
   delay(4000);
   lcd.setCursor(10,2);
   lcd.print("          ");
   digitalWrite(ledPin, LOW);
   digitalWrite(relePin,LOW);


}

 if(Data==1501){
    lcd.setCursor(10,3);
    lcd.print("All.Estern"); 
    Serial.println(Data);
    digitalWrite(ledPin1, HIGH);   //Accendiamo il LED
    digitalWrite(relePin, HIGH);
    tone(Buzzer, note1, 2000);
    delay(1000);
    digitalWrite(relePin,LOW);
    delay(4000);
    lcd.setCursor(10,3);
    lcd.print("          ");
    digitalWrite(ledPin1, LOW);
    tone(Buzzer, note, 20);
}
}


La libreria Pitches.h si può creare aggiungendo una nuova scheda nell'IDE dove è scritto il programma incollandoci il seguente programma:
/*************************************************
 * Public Constants
 *************************************************/

#define NOTE_B0  31
#define NOTE_C1  33
#define NOTE_CS1 35
#define NOTE_D1  37
#define NOTE_DS1 39
#define NOTE_E1  41
#define NOTE_F1  44
#define NOTE_FS1 46
#define NOTE_G1  49
#define NOTE_GS1 52
#define NOTE_A1  55
#define NOTE_AS1 58
#define NOTE_B1  62
#define NOTE_C2  65
#define NOTE_CS2 69
#define NOTE_D2  73
#define NOTE_DS2 78
#define NOTE_E2  82
#define NOTE_F2  87
#define NOTE_FS2 93
#define NOTE_G2  98
#define NOTE_GS2 104
#define NOTE_A2  110
#define NOTE_AS2 117
#define NOTE_B2  123
#define NOTE_C3  131
#define NOTE_CS3 139
#define NOTE_D3  147
#define NOTE_DS3 156
#define NOTE_E3  165
#define NOTE_F3  175
#define NOTE_FS3 185
#define NOTE_G3  196
#define NOTE_GS3 208
#define NOTE_A3  220
#define NOTE_AS3 233
#define NOTE_B3  247
#define NOTE_C4  262
#define NOTE_CS4 277
#define NOTE_D4  294
#define NOTE_DS4 311
#define NOTE_E4  330
#define NOTE_F4  349
#define NOTE_FS4 370
#define NOTE_G4  392
#define NOTE_GS4 415
#define NOTE_A4  440
#define NOTE_AS4 466
#define NOTE_B4  494
#define NOTE_C5  523
#define NOTE_CS5 554
#define NOTE_D5  587
#define NOTE_DS5 622
#define NOTE_E5  659
#define NOTE_F5  698
#define NOTE_FS5 740
#define NOTE_G5  784
#define NOTE_GS5 831
#define NOTE_A5  880
#define NOTE_AS5 932
#define NOTE_B5  988
#define NOTE_C6  1047
#define NOTE_CS6 1109
#define NOTE_D6  1175
#define NOTE_DS6 1245
#define NOTE_E6  1319
#define NOTE_F6  1397
#define NOTE_FS6 1480
#define NOTE_G6  1568
#define NOTE_GS6 1661
#define NOTE_A6  1760
#define NOTE_AS6 1865
#define NOTE_B6  1976
#define NOTE_C7  2093
#define NOTE_CS7 2217
#define NOTE_D7  2349
#define NOTE_DS7 2489
#define NOTE_E7  2637
#define NOTE_F7  2794
#define NOTE_FS7 2960
#define NOTE_G7  3136
#define NOTE_GS7 3322
#define NOTE_A7  3520
#define NOTE_AS7 3729
#define NOTE_B7  3951
#define NOTE_C8  4186
#define NOTE_CS8 4435
#define NOTE_D8  4699
#define NOTE_DS8 4978

In questo modo si può selezionare una nota ben definita da utilizzare.
Rimane comunque funzionante lo shield relè per controllare qualcos'altro... una luce, una sirena ecc ecc.

Dall'immagine si capisce dove va lo sketch per le note:

Questa immagine è nascosta ai visitatori. Prego accedi o registrati per visualizzarli.
Ultima modifica: 3 Anni 11 Mesi fa da IZ3ZLU.
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.
Tempo creazione pagina: 0.723 secondi
Powered by Forum Kunena
   
   
© PSKTRENTUNISTI ITALIAN CLUB (PIC)