Salve a tutti, spero di non aver commesso errori per la giusta esposizione del topic..
Ho intrapreso l'avventura arduino da poco e nelle varie prove qualche risultato l'ho già ottenuto..
Vista la soddisfazione mi sono catapultato in un nuovo progetto che mi permetterebbe di effettuare una protezione anticamminamento nel giardino di casa di un mio amico..
L'idea è la seguente:
Linea di sensori piezoelettrici ( i classici dischetti ) denominata linea X;
Linea di sensori piezoelettrici denominata linea Y;
Potenziometro per regolare la sensibilità delle singole linee X e Y;
Potenziometro per regolare una soglia di intervento sotto la quale i segnali vengono considerati nulli;
Led di indicazione segnale valido sia per linea X che Y;
Led indicazione (Pin 13) di avvenuta lettura condizione AND ( X+Y)....
Fin qui tutto abbastanza semplice... Il codice che allego è una elaborazione del KNOCK di arduino...
Sicuramente i professori troveranno una miriade di errori ( ma va bene così ), però per il mio inizio la cosa soddisfacente è che funziona.. Esegue la lettura dei sensori, conta gli impulsi AND e al raggiungimento degli impulsi programmati visualizza la situazione di allarme...
Veniamo al problema che mi toglie il sonno da 4 giorni
Avrei la necessità di strutturare 2 casistiche...
1 - Al verificarsi di n.AND entro un tempo prestabilito ( es. 4 o 5 secondi ) ho la segnalazione di allarme.
2 - Se entro quel tempo prestabilito non ho il numero di AND necessario, il timer e il conteggio devono resettarsi ( questo per eliminare la possibilità di falsi allarmi con disturbi generici ).
Ho fatto varie prove cimentandomi anche con i millis(), ma non sono riuscito a levarne le gambe..
Qualcuno di Voi ha per caso qualche consiglio su come potermi muovere??
Ringrazio tutti..
Allego il codice:
const int ledPin = 13; //dichiaro pin 13
const int knockSensor = A0;// piezo linea X su Analog 0
const int knockSensor1 = A1; // piezo linea Y su Analog 1
int pot = A5; // potenziometro sens piezo linea X su Analog 5
int pot1 = A4; // potenziometro sens piezo linea Y su Analog 4
int threshold1;// potenziometro soglia allarme linea X su Analog 4
int threshold;// potenziometro soglia allarme linea Y su Analog 4
int x=12; // Uscita led conferma superamento soglia linea X
int y=4; // Uscita led conferma superamento soglia linea X
int conta=0; // variabile per contare gli eventi AND
int sensorReading = 0; // valore di partenza dei sensori piezo linea X
int sensorReading1 = 0; // valore di partenza dei sensori piezo linea Y
int ledx = LOW;// imposto il valore 0 al led conferma superamento soglia linea X
int ledy = LOW;// imposto il valore 0 al led conferma superamento soglia linea Y
void setup() {
pinMode(ledPin, OUTPUT);// imposto l'uscita per il led allarme
pinMode(x,OUTPUT);// imposto l'uscita per il led linea X
pinMode(y,OUTPUT);// imposto l'uscita per il led linea Y
}
void loop() {
sensorReading = analogRead(knockSensor); //Imposto la variabile per l'entrata analogica per la linea piezoelettrica X
sensorReading1 = analogRead(knockSensor1); //Imposto la variabile per l'entrata analogica per la linea piezoelettrica Y
int threshold = analogRead(pot) ; //Imposto la variabile per l'entrata analogica per potenziometro linea X
int threshold1 = analogRead(pot1) ; //Imposto la variabile per l'entrata analogica per potenziometro linea Y
// Se i sensori superano il valore di soglia i led segnalano il superamento
if(sensorReading >= threshold) {
digitalWrite (x,HIGH);}
else { digitalWrite (x,LOW);}
if(sensorReading1 >= threshold1) {
digitalWrite (y,HIGH);}
else{ digitalWrite (y,LOW);}
/* Qui arrivano le dolenti note....
In pratica da qui inizia la parte dove dovrei leggere la condizione AND in un tempo determinato e se
la condizione di verifica nel tempo determinato visualizzo l'allarme; altrimenti azzero il conta come
ho messo e rimetto in ascolto la scheda come se nulla fosse successo.
il codice che segue mi permette di contare i 5 eventi AND e al sesto mi illumina per 2,5 secondi il led
e resetta il contatore...
*/
if ((sensorReading >= threshold)&&(sensorReading1 >= threshold1)) {
digitalWrite(ledPin,HIGH);
conta++;}
else{digitalWrite(ledPin,LOW);}
if (conta>5){
digitalWrite(ledPin,HIGH);
delay(2500);
digitalWrite(ledPin,LOW);
delay(500);
conta=0;}
}