Salve, sono alle prese con un altro progetto per un antifurto, utilizzando arduino uno la shield ethernet w5100 e il tutto monitorato dall'app blynk.
Sono riuscito ad avere sull'app blynk, il display LCD, i led di stato e il pulsante per resettare le info sulle varie zone memorizzate.
Ora il mio problema consiste nell'associare le funzioni: attiva(); e disattiva(); ad un pulsante sull'app blynk che mi permette di attivare/disattivare l'antifurto bypassando l'inserimento delle chiavi RFID.
Avete qualche suggerimento? A me basterebbe avere un esempio di come associare queste funzioni all'app blynk. Grazie.
questo è il codice:
/**
* Centrale antifurto costruita con Arduino. Materiali:
* Arduino UNO, Ethernet Shield chip w5100, display 16x2 con convertitore seriall I2C, lettore RFID RC522, sensore Pir, 2 led colorati, 2 resistenze da 220 ohm ed una da 10 kohm,
* un pulsante, un modulo relè 2 canali, un buzzer (opzionale).
* Importante, collegare il lettore RFID ai pin di Arduino come segue:
* MOSI: Pin 11 / ICSP-4
* MISO: Pin 12 / ICSP-1
* SCK: Pin 13 / ISCP-3
* SDA: Pin 9
* RST: Pin 8
*/
#define BLYNK_PRINT Serial
#include <SPI.h>
#include <RFID.h>
#include <EEPROM.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Ethernet.h>
#include <BlynkSimpleEthernet.h>
char auth ×××××××××××××××××××
#define SS_PIN 9
#define RST_PIN 8
#define W5100_CS 10
#define SDCARD_CS 4
// ***IMPORTANTE*** Inserire il codice della propria chiave master.
#define masnum0 170
#define masnum1 222
#define masnum2 159
#define masnum3 26
#define masnum4 241
#define sensorePir1 6 // Ingresso sensore 1
#define sensorePir2 7 // Ingresso sensore 2
#define releSirena 1 // Contatto pulito a cui collegare una sirena esterna autoalimentata
#define ledRosso 3 // E' il led che indica lo stato della centrale
#define ledGiallo 4 // E' il led che indica lo stato del sensore 1
#define resetKey 5 // pulsante di reset e visualizzazione memoria di allarme
#define dispositivo1 0 // Uscita relè dispositivo 1
RFID rfid(SS_PIN, RST_PIN);
LiquidCrystal_I2C lcd(0x27,16,2);
boolean statoAntifurto = 0; // Variabile antifurto attivo
boolean statoAllarme = 0; // Variabile centrale in allarme
boolean statoSirena = 0; // Variabile di stato del relè sirena
boolean statoPir1 = 0; // Variabile di stato del sensore 1
boolean statoPir2 = 0; // Variabile di stato del sensore 2
boolean cardMaster = 0; // Variabile modalità chiave master
boolean memoriaAllarme = 0; // Variabile per gestire la memoria di allarme
boolean tastoPremuto = 0; // Variabile che controlla la pressione prolungata del tasto reset
int slave; // Contatore di chiavi salvate
int zona = 0; // Variabile che memorizza la zona che ha innescato l'allarme
int timerIngUsc = 0; // Variabile utilizzata per scandire i secondi trascorsi durante i tempi di ingresso o uscita
int PinPir1 = 6; // da cancellare se non funziona
int PinPir2 = 7; // da cancellare se non funziona
bool StatoPir1, StatoPirPrec; // da cancellare se non funziona
bool StatoPir2, StatoPirPrec1; // da cancellare se non funziona
int faseIngUsc = 0; // Variabile che memorizza se si è nella fase di ingresso (1) o uscita (2)
unsigned long previousMillisSirena = 0; // Variabile utilizzata per gestire i millisecondi del tempo di suono della sirena.
unsigned long currentMillisSirena;
unsigned long previousMillisTempi = 0; // Variabile utilizzata per gestire i millisecondi del tempo di ingresso/uscita.
unsigned long currentMillisTempi;
int sernum0;
int sernum1;
int sernum2;
int sernum3;
int sernum4;
WidgetLCD lcd_b(V1);
void setup()
{
Serial.begin(9600);
lcd.init();
Blynk.begin(auth);
SPI.begin();
rfid.init();
pinMode(V0, INPUT_PULLUP);
pinMode(PinPir1,INPUT);
pinMode(PinPir2,INPUT);
delay(5000);
pinMode(SDCARD_CS, OUTPUT);
pinMode(ledRosso, OUTPUT);
pinMode(releSirena, OUTPUT);
pinMode(ledGiallo, OUTPUT);
pinMode(sensorePir1,INPUT);
pinMode(sensorePir2,INPUT);
pinMode(resetKey, INPUT);
digitalWrite(SDCARD_CS, HIGH);
digitalWrite(ledRosso, LOW);
digitalWrite(ledGiallo, LOW);
digitalWrite(releSirena, HIGH);
standby();
}
WidgetLED led1(V3);
WidgetLED led2(V4);
WidgetLED led3(V7);
void loop() {
Blynk.run();
StatoPirPrec = StatoPir1;
StatoPir1 = digitalRead (PinPir1);
if ((StatoPirPrec != StatoPir1) && (StatoPir1 == 1))
{
Serial.println ("Rilevato Movimento!");
Blynk.notify("Rilevato Movimento!");
}
if (StatoPir1)
{
Serial.println ("1");
}
else
{
Serial.println ("0");
}
StatoPirPrec1 = StatoPir2;
StatoPir2 = digitalRead (PinPir2);
if ((StatoPirPrec1 != StatoPir2) && (StatoPir2 == 1))
{
Serial.println ("Rilevato Movimento!");
Blynk.notify("Rilevato Movimento!");
}
if (StatoPir2)
{
Serial.println ("1");
}
else
{
Serial.println ("0");
}
int statusPin1 = digitalRead(ledRosso);
if(statusPin1 == HIGH) {
led1.on();
} else if(statusPin1 == LOW) {
led1.off();
}
int statusPin2 = digitalRead(ledGiallo);
if(statusPin2 == HIGH) {
led2.on();
} else if(statusPin2 == LOW) {
led2.off();
}
int statusPin3 = digitalRead(sensorePir2);
if(statusPin3 == HIGH) {
led3.on();
} else if(statusPin3 == LOW) {
led3.off();
}
// Inizio blocco per la gestione locale della centrale
// Rileva un tag...
if (rfid.isCard()) {
// Legge il seriale...
if (rfid.readCardSerial()) {
sernum0 = rfid.serNum[0];
sernum1 = rfid.serNum[1];
sernum2 = rfid.serNum[2];
sernum3 = rfid.serNum[3];
sernum4 = rfid.serNum[4];
slave = EEPROM.read(0);
// Se il seriale letto corrisponde con il seriale Master
// attiva o disattiva la modalita Memorizzazione chiavi
// e in più visualizza il numero di chiavi salvate...
if (sernum0 == masnum0
&& sernum1 == masnum1
&& sernum2 == masnum2
&& sernum3 == masnum3
&& sernum4 == masnum4) {
if (statoAntifurto == 0) {
lcd.backlight();
if (cardMaster==0) {
lcd.clear();
lcd_b.clear();
lcd.print("CARD MASTER");
lcd_b.print(0, 0, "CARD MASTER");
delay(2000);
lcd.clear();
lcd_b.clear();
lcd.print("GESTIONE CHIAVI");
lcd_b.print(0, 0, "GESTIONE CHIAVI");
cardMaster = 1;
lcd.setCursor(0, 1);
lcd.print("Chiavi slave: ");
lcd_b.print(0, 1, "Chiavi slave: ");
lcd.setCursor(15, 1);
lcd.print(slave);
lcd_b.print(15, 1, slave);
delay(3000);
}
else {
cardMaster = 0;
lcd.setCursor(0, 1);
lcd.print("Annullata ");
lcd_b.print(0, 1, "Annullata ");
delay(3000);
standby();
}
}
}
// Se invece il seriale letto corrisponde con uno dei tre gruppi
// di chiavi memorizzate allora attiva o disattiva l'antifurto.
else if ((sernum0 == EEPROM.read(1) && sernum1 == EEPROM.read(2) && sernum2 == EEPROM.read(3) && sernum3 == EEPROM.read(4) && sernum4 == EEPROM.read(5))
|| (sernum0 == EEPROM.read(6) && sernum1 == EEPROM.read(7) && sernum2 == EEPROM.read(8) && sernum3 == EEPROM.read(9) && sernum4 == EEPROM.read(10))
|| (sernum0 == EEPROM.read(11) && sernum1 == EEPROM.read(12) && sernum2 == EEPROM.read(13) && sernum3 == EEPROM.read(14) && sernum4 == EEPROM.read(15))) {
lcd.backlight();
if (cardMaster==0) {
// Se l'antifurto non è inserito, lo attiva ed aggiorna a 2 la variabile "faseIngUsc",
// indicando che si è nella fase di uscita.
if (statoAntifurto == 0) {
statoAntifurto = 1;
faseIngUsc = 2;
lcd.clear();
lcd.print("CHIAVE VALIDA");
delay(2000);
lcd.clear();
lcd.print(" TEMPO ");
lcd.setCursor(0, 1);
lcd.print(" USCITA ");
lcd_b.clear();
lcd_b.print(0, 0, "CHIAVE VALIDA");
delay(2000);
lcd_b.clear();
lcd_b.print(0, 0, " TEMPO ");
lcd_b.print(0, 1, " USCITA ");
}
else {
if (faseIngUsc != 0) {
timerIngUsc = 0;
faseIngUsc = 0;
}
lcd.clear();
lcd_b.clear();
lcd.print("CHIAVE VALIDA");
lcd_b.print(0, 0, "CHIAVE VALIDA");
delay(2000);
disattiva();
}
}
}
// Se il seriale letto è diverso dal master e nemmeno presente in memoria,
// e se è attiva la modalita Memorizzazione chiavi, salva il seriale in memoria
// come slave1, slave2 o slave3.
else if (cardMaster == 1 && slave == 0) {
lcd.clear();
lcd.print("Chiave rilevata!");
lcd_b.clear();
lcd_b.print(0, 0, "Chiave rilevata!");
EEPROM.write(0, 1);
EEPROM.write(1, sernum0);
EEPROM.write(2, sernum1);
EEPROM.write(3, sernum2);
EEPROM.write(4, sernum3);
EEPROM.write(5, sernum4);
cardMaster = 0;
delay(1000);
lcd.setCursor(0, 1);
lcd.print("Slave 1 salvata!");
lcd_b.print(0, 1, "Slave 1 salvata!");
delay(3000);
standby();
}
else if (cardMaster == 1 && slave == 1) {
lcd.clear();
lcd.print("Chiave rilevata!");
lcd_b.clear();
lcd_b.print(0, 0, "Chiave rilevata!");
EEPROM.write(0, 2);
EEPROM.write(6, sernum0);
EEPROM.write(7, sernum1);
EEPROM.write(8, sernum2);
EEPROM.write(9, sernum3);
EEPROM.write(10, sernum4);
cardMaster = 0;
delay(1000);
lcd.setCursor(0, 1);
lcd.print("Slave 2 salvata!");
lcd_b.print(0, 1, "Slave 2 salvata!");
delay(3000);
standby();
}
else if (cardMaster == 1 && slave == 2) {
lcd.clear();
lcd_b.clear();
lcd.print("Chiave rilevata!");
lcd_b.print(0, 0, "Chiave rilevata!");
EEPROM.write(0, 3);
EEPROM.write(11, sernum0);
EEPROM.write(12, sernum1);
EEPROM.write(13, sernum2);
EEPROM.write(14, sernum3);
EEPROM.write(15, sernum4);
cardMaster = 0;
lcd.setCursor(0, 1);
lcd.print("Slave 3 salvata!");
lcd_b.print(0, 1, "Slave 3 salvata!");
delay(3000);
standby();
}
}
}
rfid.halt();
// Questa istruzione serve a far capire alla funzione "tempoIngressoUscita" in quale fase ci troviamo.
if ((faseIngUsc == 1) || (faseIngUsc == 2)) {
tempoIngressoUscita(faseIngUsc);
}
// Quando la centrale va in allarme si attiverà il relè della sirena per X secondi, 60 di default.
if (statoSirena == 1) {
attivaSirena();
}
// Se l'infrarosso rileva un movimento accende il led giallo
if (digitalRead(sensorePir1) == HIGH) {
digitalWrite(ledGiallo, HIGH);
statoPir1=1;
}
else {
digitalWrite(ledGiallo, LOW);
statoPir1=0;
}
// Se l'infrarosso rileva un movimento e l'antifurto e attivo
// e quindi non in allarme, attiva l'allarme, memorizza la zona corrispondente ed aggiorna a 1 la variabile "faseIngUsc",
// indicando che si è nella fase di ingresso.
if (digitalRead(sensorePir1) == HIGH && statoAntifurto == 1 && statoAllarme == 0 && faseIngUsc == 0){
faseIngUsc = 1;
lcd.clear();
lcd.print(" TEMPO ");
lcd.setCursor(0, 1);
lcd.print(" INGRESSO ");
lcd_b.clear();
lcd_b.print(0, 0, " TEMPO ");
lcd_b.print(0, 1, " INGRESSO ");
zona = 1;
}
if (digitalRead(sensorePir2) == HIGH && statoAntifurto == 1 && statoAllarme == 0 && faseIngUsc == 0){
faseIngUsc = 1;
lcd.clear();
lcd.print(" TEMPO ");
lcd.setCursor(0, 1);
lcd.print(" INGRESSO ");
lcd_b.clear();
lcd_b.print(0, 0, " TEMPO ");
lcd_b.print(0, 1, " INGRESSO ");
zona = 2;
}
// Se è stata attivata con la card Master la modalità "Memorizzazione chiavi",
// premendo il pulsante di reset si azzera il database
// delle chiavi salvate fino a quel momento.
if (digitalRead(resetKey) == HIGH && cardMaster == 1) {
delay(100);
cardMaster = 0;
for (int i=0; i<16; i++){
EEPROM.write(i, 0);
}
lcd.backlight();
lcd.clear();
lcd.print("Reset chiavi...");
lcd_b.clear();
lcd_b.print(0, 0, "Reset chiavi...");
delay(3000);
standby();
}
// Se si preme il tasto reset mentre la centrale e in standby si potrà visualizzare l'ultima memoria di allarme
// se si mantiene premuto invece si effettua un reset
if (digitalRead(resetKey) == HIGH && statoAntifurto == 0) {
tastoPremuto=1;
delay(1000);
if (digitalRead(resetKey) == HIGH && statoAntifurto == 0 && tastoPremuto == 1) {
tastoPremuto=0;
EEPROM.write(16, 0);
lcd.backlight();
lcd.clear();
lcd.print("Memoria Allarme:");
lcd.setCursor(0, 1);
lcd.print("Reset");
lcd_b.clear();
lcd_b.print(0, 0, "Memoria Allarme:");
lcd_b.print(0, 1, "Reset");
delay(3000);
standby();
}
else {
tastoPremuto=0;
lcd.backlight();
lcd.clear();
lcd.print("Memoria Allarme:");
lcd_b.clear();
lcd_b.print(0, 0, "Memoria Allarme:");
if (EEPROM.read(16) > 0) {
lcd.setCursor(0, 1);
lcd.print("Zona ");
lcd.setCursor(5, 1);
lcd.print(EEPROM.read(16));
lcd_b.print(0, 1, "Zona ");
lcd_b.print(5, 1, EEPROM.read(16));
}
else {
lcd.setCursor(0, 1);
lcd.print("Nessuna Memoria");
lcd_b.print(0, 1, "Nessuna Memoria");
}
delay(3000);
standby();
}
}
}
void standby() {
lcd.clear();
lcd.print("Antifurto TEC.");
lcd.setCursor(0, 1);
lcd.print("Progetto Casa");
lcd_b.clear();
lcd_b.print(0, 0, "Antifurto TEC.");
lcd_b.print(0, 1, "Progetto Casa");
delay(1000);
lcd.backlight();
}
void allarme() {
statoAllarme = 1;
statoSirena = 1;
if (memoriaAllarme == 0) {
memoriaAllarme = 1;
EEPROM.write(16, zona);
}
lcd.backlight();
lcd.clear();
lcd.print(" INTRUSO! ");
lcd_b.clear();
lcd_b.print(0, 0, " INTRUSO! ");
delay(1000);
lcd.backlight();
}
void attiva() {
statoAntifurto = 1;
digitalWrite(ledRosso, HIGH);
lcd.backlight();
lcd.clear();
lcd.print(" ANTIFURTO ");
lcd.setCursor(0, 1);
lcd.print(" ATTIVO ");
lcd_b.clear();
lcd_b.print(0, 0, " ANTIFURTO ");
lcd_b.print(0, 1, " ATTIVO ");
digitalWrite(ledRosso, LOW);
delay(1000);
lcd.backlight();
}
void disattiva() {
statoAntifurto = 0;
statoAllarme = 0;
memoriaAllarme = 0;
statoSirena = 0;
zona = 0;
digitalWrite(releSirena, HIGH);
digitalWrite(ledRosso, LOW);
lcd.backlight();
lcd.clear();
lcd.print(" ANTIFURTO ");
lcd.setCursor(0, 1);
lcd.print(" DISATTIVO ");
lcd_b.clear();
lcd_b.print(0, 0, " ANTIFURTO ");
lcd_b.print(0, 1, " DISATTIVO ");
delay(2000);
standby();
}
void attivaSirena() {
currentMillisSirena = millis();
if(currentMillisSirena - previousMillisSirena >= 60000) { // Di default la sirena suonerà per 60 secondi (60 x 1000). Modifica con il numero di secondi che desideri.
previousMillisSirena = currentMillisSirena;
if (digitalRead(releSirena) == HIGH){
digitalWrite(releSirena, LOW);
}
else {
digitalWrite(releSirena, HIGH);
statoSirena = 0;
}
}
}
void tempoIngressoUscita(int fase) {
if (timerIngUsc < 10) { // Di default i tempi di ingresso/uscita sono impostati a 10 secondi. Modifica con il numero di secondi che desideri.
currentMillisTempi = millis();
if(currentMillisTempi - previousMillisTempi >= 500) {
previousMillisTempi = currentMillisTempi;
if (digitalRead(ledRosso) == HIGH){
digitalWrite(ledRosso, LOW);
}
else {
timerIngUsc++;
// Se desideri avere un beep sonoro che scandisse i secondi, collega al pin 2 un buzzer
// e de-commenta la riga seguente.
tone(2, 1047, 500);
digitalWrite(ledRosso, HIGH);
}
}
}
else {
// Una volta trascorsi i secondi impostati, se si è nella fase di ingresso fa scattare l'allarme,
// mentre se si è nella fase di uscita attiva l'antifurto.
faseIngUsc = 0;
timerIngUsc = 0;
if (fase == 1) {
allarme();
}
else if (fase == 2) {
attiva();
}
}
}