allarme cicalino

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

digitalWrite(pin, HIGH)
delay()
digitalWrite(pin, LOW)
delay()

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!!!//
 }

grazie in antiipo dell'aiuto!
Michele

  1. il codice si include usando gli appositi tag CODE
  2. 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.

scusa leo ma nn ho capito.

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

non è tanto complicato

ti butto li solo un esempio...

const int bottoneAccendiCicalino = 2;
const int bottoneSpegniCicalino = 3;
const int cicalino = 4;

void setup()
{
pinMode(bottoneAccendiCicalino, INPUT);
pinMode(bottoneSpegniCicalino, INPUT);
pinMode(cicalino, OUTPUT);
}
void loop()
{
   int lettura = digitalRead(bottoneAccendiCicalino);
   if (lettura == HIGH)
     {
     int spegni
     do 
       {
        spegni = digitalRead(bottoneSpegniCicalino);
        digitalWrite(cicalino, HIGH);
        delay(250);
        digitalWrite(cicalino, LOW);
       } while (spegni == HIGH);
     }
}

è solo un esempio chiaramente

niente, mi da il solito problema.
Il punto è che nn ho capito proprio come utilizzare i mills, come organizzarli nello skech

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. :smiley:
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 :smiley:
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);          
 }
}

i tag code dove li trovo? :frowning:

allego immagine... clicchi sull'icona evidenziata e scrivi il codice in mezzo al tag "code"

nid69ita:
@killrob, senza offesa, il tuo codice non mi piace. :smiley:
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 :wink: infatti ho specificato più volte che era solo un esempio

grazie marinaio!

resto in attesa su delucidazioni del codice! :smiley:

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 :smiley:

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.

@Mike:
se hai tempo, leggiti questo articolo, spiega come far fare all'Arduino più di una cosa a tempo usando i millis.

grazie leo!

nid cosa intendi x codice indipendente?

 if(spento==HIGH) 
 {
  schermo.print("SPENTO");
  delay(200);
  x=0;
 }

cosi che ne pensi?

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);
  }
  // no else
  if((spento==HIGH) and (x==1))        // qui vorrei disattivare il tutto e ritornare allo stto di partenza ''spento''
 { schermo.print("SPENTO");
  delay(200);
  x=0;
  digitalWrite(7,LOW);          
 }
}

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 :smiley:
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! :wink:

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

Potresti pensare a qualcosa di meglio, tipo questa tastierina a membrana:
http://www.ebay.it/itm/Tastiera-3x4-4x3-numerica-membrana-12-tasti-pulsanti-tastierino-numerico-keypad-/230853073343?pt=Attrezzature_e_strumentazione&hash=item35bfea59bf&_uhb=1

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