ciao.
Ho intenzione di cstruire una sorta sdi allarme con un arduino e un cicalino utilizzando come interfaccia, un display lcd.
utilizzando dei semplici botton simulo i sensori di attivazione e disattivazione allarmi.
Non riesco ancora a trovare il modo di far azionare il mio cicalino in modo ripetitivo ( on off, on, off, on, off,......,n,......) al premere del botton.mi spiego meglio: se premo il pulsante sul display mi appare la scritta ''acceso'' e se programmo un
melo ripete una sola volta, mentre io vorrrei che al premere del pulsante me lo ripetesse all'infinito.
questo che posto di seguito è il trancio dello sketch al riguardo:
#include <LiquidCrystal.h>
LiquidCrystal schermo(12,11,5,4,3,2);
int bottone;
int x=0;
void setup()
{
schermo.begin(16,2);
pinMode(8,INPUT);
pinMode(7,OUTPUT);
}
void loop()
{
bottone=digitalRead(8);
schermo.setCursor(0,0);
if((bottone==HIGH) and (x==0))
{
schermo.print( "ACCESO");
delay(200);
x=1;
digitalWrite(7,HIGH);
delay(250);
digitalWrite(7,LOW);
delay(250); // è qui che vorrei capire perchè nn me lo ripete n volte!!!//
}
vuoi che una volta premuto il pulsante il cicalino ripeta davvero all'infinito oppure vuoi che premendo il pulsante tu possa alternare tra cicalino acceso e spento?
Immagino il secondo caso, per cui non devi usare delay perché blocchi il codice quindi non leggi le pressioni del pulsante, e devi usare millis e 2 variabili di stato. In una ci metti lo stato dell'allarme, se attivo o disattivato (e ne cambi il valore leggendo il pulsante), nell'altra ci metti lo stato del cicalino, se on e off, e ne alterni lo stato usando millis e solo se la prima variabile è impostata per avere l'allarme acceso.
io vorrei che una volta premuto mi suoni all'infinito fino a che io nn decida di premere un altro pulsante adibito alla disattivazione del cicalinoe quindi dell'allarme.
mi dici di usare 2 var di stato, puoi farmi un esempio pratico?
grazie
michele
mike82:
melo ripete una sola volta, mentre io vorrrei che al premere del pulsante me lo ripetesse all'infinito.
questo che posto di seguito è il trancio dello sketch al riguardo:
Andrei per gradi. Il farlo come dice @Leo72 è la cosa migliore
Ma intanto il tuo codice (a cui manca una graffa!!!) non funziona perchè il "cicalino" è dentro all'if che verifica il bottone.
if((bottone==HIGH) and (x==0))
{ schermo.print( "ACCESO");
delay(200);
x=1;
digitalWrite(7,HIGH);
delay(250);
digitalWrite(7,LOW);
delay(250); // è qui che vorrei capire perchè nn me lo ripete n volte!!!//
}
Segui il tuo codice passo-passo. La prima volta che premi il bottone entri perchè x==0, poi lo metti a 1 e suoni una volta.
Alla ripetizione della loop non entri più (anche se il bottone è ancora premuto) perchè... x NON è 0
Invece di:
if((bottone==HIGH) and (x==0))
{ schermo.print( "ACCESO");
delay(200);
x=1;
}
if(x==1) // se x è 1 allora suono
{ digitalWrite(7,HIGH);
delay(250);
digitalWrite(7,LOW);
delay(250); // è qui che vorrei capire perchè nn me lo ripete n volte!!!//
}
@killrob, senza offesa, il tuo codice non mi piace.
Può funzionare (a parte qualche errore), ma ti sei troooppo legato a quello che vuole fare @mike, se vuoi fare altro nello sketch non ci riuscirai perchè hai quel do-while in cui entri in un loop tutto suo.
Sempre meglio lasciare come ciclo principale la loop() e con variabili di stato fare cose diverse.
grazie nid!
in parte ho risolto il problema
adeso suona n volte però sorge il problema adesso che se voglio disattivarlo premendo un altro bottone nn me lo disativa. ecco di seguito il mio skech completo. spero di nn aver fatto troppi errori:
#include <LiquidCrystal.h>
LiquidCrystal schermo(12,11,5,4,3,2);
int acceso;
int spento;
int x=0;
int y=0;
void setup()
{
schermo.begin(16,2);
pinMode(8,INPUT);
pinMode(10,INPUT);
pinMode(7,OUTPUT);
}
void loop()
{
acceso=digitalRead(8);
spento=digitalRead(10);
schermo.setCursor(0,0);
if((acceso==HIGH) and (x==0))
{
schermo.print( "ACCESO");
delay(200);
x=1;
}
if(x==1)
{
digitalWrite(7,HIGH);
delay(250);
digitalWrite(7,LOW);
delay(250);
}
else if((spento==HIGH) and (y==0)) // qui vorrei disattivare il tutto e ritornare allo stto di partenza ''spento''
{
schermo.print("SPENTO");
delay(200);
y=1;
}
if(y==1)
{
digitalWrite(7,LOW);
}
}
nid69ita: @killrob, senza offesa, il tuo codice non mi piace.
Può funzionare (a parte qualche errore), ma ti sei troooppo legato a quello che vuole fare @mike, se vuoi fare altro nello sketch non ci riuscirai perchè hai quel do-while in cui entri in un loop tutto suo.
Sempre meglio lasciare come ciclo principale la loop() e con variabili di stato fare cose diverse.
mica mi offendo sai infatti ho specificato più volte che era solo un esempio
io ho provato il tuo codice usando un led al posto del cicalino e cmincia a lampeggiare non appena collego il pin di accensione se tolgo il cavo dal pin e resetto arduino non lampeggia, non appena ricollego il cavo al pin 8 comincia a lampeggiare senza che il bottone sia stato premuto
a me nn da quel problema.
una volta caricato tutto il codice se premo il primo bottone inizia a lampeggiare e mi compare la scritta acceso sul lcd,
se premo 'altro bottone x lo spegnimento del lampeggio o suono del cicalino qual si voglia, nn succede niente e mi continua a lampeggiare senza comparire la scritta spento.
è qui il problema. io voglio che mi si spenga il suono.
vorrei capire dov'è nell'ultima parte il problema
mike82:
grazie nid!
in parte ho risolto il problema
Perchè?
else if((spento==HIGH)...
Tu dovrai avere un pezzo di codice (indipendente dal resto) che verifica se premi il pulsante "spegni" e se si, allora x=0
Siccome x=1 => suoni mentre x=0 => non suoni ....
Anzi quella variabile x potrebbe avere un nome più utile ad esempio Suona.
problema risla disattivazione del suono dell'allarme nn corrisponde esattamente con la premuta del pulsante, ma quasi. Penso sia dovuto all'utilizzo del delay e nn dei millis. @Leo grazie davvero x la dritta dell'articolo sui millis; ho provato a dargli un'occhiata, ma vuoi perche sono un po' alle prime armi e vuoi un po' perche nn sono un conoscitore a pieno del linguaggio arduino, mi risulta un po' diffficile il capire tutti i passaggi di codice. Mi ci vorrebbe uno che me li spiegasse dal vivo e so che è impossibile
In particolar modo penso di non aver proprio capito, x esempio, come posso usare i codici dell'articolo che mi hai proposto nel mio sketch, o meglio, in che riga devo metterli. @nid grazie della dritta sulla variabile di stato, mi è stata davvero utile!
vorrei ampliare il mio progetto potendo inserire 5 pulsanti, numerarli e in base a una sorta di sequenza da me stabilita ( sulla premuta dei pulsanti) attivare o disattivare l'allarme. Una sorta di password diciamo.
Esiste un modo per far memorizzare ad arduino una password? e se nn fosse giusta , x esempio, far comparire un messaggio su un display dell'errore?
Grazie dell'aiuto!
Michele
La password la memorizzi nel codice come costante oppure potresti leggerla dalla EEPROM. E fai un altro programma con cui la scrivi e modifichi sempre in EEPROM