Salve,
nel frattempo ho fatto i modo che i sensori e la parte display/buzzer siano separati e connessi tramite wi-fi.
In questo modo si avrà una scatoletta con un Arduino nano e un TX appena dentro alla porta, mentre il display (con un altro Nano) con un buzzer si potrà comodamente mettere dove ci si trova... sul comodino o in cucina.
Lo sketch del TX è il seguente:
#include <Wire.h>
#include <VirtualWire.h>
int pirPin = 3;
int pirPin1 = 5;
int pinSpeaker= 10;
int ledPin = 13;
const int TX_DIO_Pin = 2;
unsigned int Data;
void setup(){
Serial.begin(9600);
pinMode(pirPin, INPUT);
pinMode(pirPin1, INPUT);
pinMode(ledPin, OUTPUT);
pinMode(pinSpeaker, OUTPUT);
vw_set_tx_pin(TX_DIO_Pin);//imposto il pin di trasmissione
vw_set_ptt_inverted(true);
vw_setup(1000);
}
void loop(){
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];
}
int pirVal = digitalRead(pirPin);
int pirVal1 = digitalRead(pirPin1);
Serial.println("Leggo i sensori di presenza");
analogWrite(ledPin, 0);
delay(1000);
if(pirVal == HIGH) {
analogWrite(ledPin, 255);
Serial.println("Movimento Esterno");
Data = 88;
sendData(Data);
Serial.println(Data);
tone(10, 700, 100);
delay(1000);}
else if(pirVal1 == HIGH) {
analogWrite(ledPin, 255);
Serial.println("Movimento Interno");
Data = 98;
sendData(Data);
Serial.println(Data);
tone(10, 700, 100);
delay(500);
}
}
void tone(long duration, int freq) {
duration *= 1000;
int period = (1.0 / freq) * 1000000;
long elapsed_time = 0;
while (elapsed_time < duration) {
digitalWrite(pinSpeaker,HIGH);
delayMicroseconds(period / 2);
digitalWrite(pinSpeaker, LOW);
delayMicroseconds(period / 2);
elapsed_time += (period);
}
}
void sendData(int Data){
byte TxBuffer[2];
TxBuffer[0] = Data >> 8;
TxBuffer[1] = Data;
digitalWrite(13, HIGH);
vw_send((byte *)TxBuffer, 2);
vw_wait_tx();
digitalWrite(13, LOW);
delay(1000);
}
Mentre quello dell'RX (display/Buzzer) è il seguente:
#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;
unsigned int Data;
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("Humidity and temperature\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(1000);
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("Current humidity = ");
Serial.print(DHT.humidity);
Serial.print("% ");
Serial.print("temperature = ");
Serial.print(DHT.temperature);
Serial.println("C ");
delay(800);
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==88){
Serial.println(Data);
lcd.setCursor(10,2);
lcd.print(" ALLARME 1");
digitalWrite(ledPin, HIGH); //Accendiamo il LED
digitalWrite(relePin, HIGH);
delay(4000);
lcd.setCursor(10,2);
lcd.print(" ");
digitalWrite(ledPin, LOW);
delay(2000);
digitalWrite(relePin,LOW);
}
if(Data==98){
Serial.println(Data);
lcd.setCursor(10,3);
lcd.print(" ALLARME 2");
digitalWrite(ledPin1, HIGH); //Accendiamo il LED
digitalWrite(relePin, HIGH);
delay(4000);
lcd.setCursor(10,3);
lcd.print(" ");
digitalWrite(ledPin1, LOW);
delay(2000);
digitalWrite(relePin,LOW);
}
}
Stanotte lo testo.... nel caso parta al passare di uno dei tanti gatti presenti nel mio vicolo, i sensori hanno dei trimmer per regolare l'area che coprono... basterà diminuire un po la portata....