Led lampeggiante per 30 secondi

Salve a tutti, vorrei creare un circuito con arduino che mi consenta di far lampeggiare un led per trenta secondi dopo la pressione di un pulsante. Sono arrivato al punto di far lampeggiare il led ma non so qual'è la funzione che mi permette di farlo lampeggiare per 30 secondi, mi potete aiutare magari dicendomi qual'è il comando ?
Grazie anticipatamente.

Potresti ad esempio contare il numero di lampeggi necessari per arrivare a 30 secondi.
Se accendi il led per 1/2 secondo e lo spegni per 1/2 secondo sai che ogni ciclo impiega 1 secondo,conti 30 lampeggi ed interrompi .

oppure controlli con millis() se sono passate 30 secondi.

Ciao Uwe

tonid:
Potresti ad esempio contare il numero di lampeggi necessari per arrivare a 30 secondi.
Se accendi il led per 1/2 secondo e lo spegni per 1/2 secondo sai che ogni ciclo impiega 1 secondo,conti 30 lampeggi ed interrompi .

Potrebbe essere una soluzione, ma quale'è la funzione?

Nessuna funzione particolare.
Incrementi una variabile ogni volta che accendi il led che lampeggia e poi controlli se la variabile ha raggunto il valore corrispondente ai 30 secondi.
Ciao Uwe

Nessuna funzione particolare.
Incrementi una variabile ogni volta che accendi il led che lampeggia e poi controlli se la variabile ha raggunto il valore corrispondente ai 30 secondi.
Ciao Uwe

Esatto :wink:

Ok proveró.

Sto diventando matto, e da questa mattina che faccio prove ma non ho capito come far funzionare il conteggio.
Ho provato con un listato trovato in rete

#define LED 13                // LED collegato al pin digitale 13  
#define BUTTON 7              // pin di input dove è collegato il pulsante  
int val = 0;                  // si userà val per conservare lo stato del pin di input  
int stato = 0;                // ricorda lo stato in cui si trova il led, stato = 0 led spento, stato = 1 led acceso  

void setup() {  
  pinMode(LED, OUTPUT);       // imposta il pin digitale come output  
  pinMode(BUTTON, INPUT);     // imposta il pin digitale come input  
}  

void loop() {  
  val = digitalRead(BUTTON);  // legge il valore dell'input e lo conserva  

  // controlla se è accaduto qualcosa  
  if ((val == HIGH)){  
    stato = 1 - stato;  
    delay(15);                // attesa di 15 millisecondi  
  }   



  if (stato == 1) {  
    digitalWrite(LED, HIGH);  // accende il LED  
    delay(500);              // aspetta un secondo  
    digitalWrite(LED, LOW);   // spegne il LED  
    delay(500); // aspetta un secondo
  }               

  for (int i = 0; i<10; i++);  
  {
    digitalWrite(LED, LOW);   // spegne il LED
  }               
}

niente, mi potete aiutare ?

Così funziona, anche se non è proprio corretto, il pulsante può prendere dei 'colpi'.... e ricorda di mettere sempre una resistenza da 10k tra il pin pulsante e gnd (per mantenere il pin allo stato LOW).

#define LED 13                // LED collegato al pin digitale 13  
#define BUTTON 7              // pin di input dove è collegato il pulsante  
int val = 0;                  // si userà val per conservare lo stato del pin di input  
int stato = 0;                // ricorda lo stato in cui si trova il led, stato = 0 led spento, stato = 1 led acceso  
byte i=0;

void setup() {  
  pinMode(LED, OUTPUT);       // imposta il pin digitale come output  
  pinMode(BUTTON, INPUT);     // imposta il pin digitale come input  
}  

void loop() {  
  val = digitalRead(BUTTON);  // legge il valore dell'input e lo conserva  

  // controlla se è accaduto qualcosa  
  if ((val == HIGH)){  
    stato = 1;  
    delay(15);                // attesa di 15 millisecondi  
  }   

  if (stato == 1) {  
    digitalWrite(LED, HIGH);  // accende il LED  
    delay(500);              // aspetta un secondo  
    digitalWrite(LED, LOW);   // spegne il LED  
    delay(500); // aspetta un secondo
    i+=1;  //incremento i
    if(i==30){stato=0;i=0;} // dopo 30 cicli on-off smette di lampeggiare || azzero i
  }               
}

Grazie per l'aiuto.
Sono alle prime armi, avevo capito che la chiave era nella variabile i, ma non riuscivo a trovare la soluzone. Per fortuna ci siete voi che date un'aiuto.

Mi sembra ci siano un paio di imprecisioni:

delay(500); // aspetta un secondo

Il commento è sbagliato. Quello è 1/2 secondo :wink:

Quando il pulsante viene premuto e lo stato va a zero, devi azzerare i, altrimenti se un precedente lampeggio arriva, per esempio, a 10 e poi viene interrotto perché si preme il pulsante, alla successiva pressione del pulsante il lampeggio riprende ma durerà solo 20 volte.

Scusate se piglio e mi intrometto, riuppando questa discussione ma e' l' unica che ci si avvicina che sono riuscito a trovare sul web...

A me servirebbe, a mo di deterrente, far accendere, con un circuitino, magari semplicissimo, ogni 30 secondi circa, un led, o una lampada a 12v, che metterei dentro alla scatola di un vecchio antifurto, da mettere come deterrente sul balcone della mia camera da letto simulando per l' appunto un antifurto in funzione.

Grazie anticipatamente se qualcuno puo' rispondermi, magari linkandomi qualcosa a riguardo e scusatemi se mi sono permesso di chiedere in questo modo

Ciao e benvenuto.
Ti invito a leggere il regolamento del forum. E' buona creanza usare il 1° post per presentarsi e non per fare una richiesta :wink:

Detto questo, prendi lo sketch in oggetto e modificalo togliendo la parte relativa alla pressione del pulsante ed usando un secondo controllo basato su millis per cui ogni 30 secondi alterni la variabile di stato e fai il lampeggio del led solo se la variabile di stato è true

Salve.
Il blink è uno dei primi passi da cui si comincia a capire cosa fare con Arduino, dove però io ho capito una cosa:

  • se uso delay, il ritardo non è fine a se stesso su quel particolare input oppure output, ma è un delay ASSOLUTO che, per far lampeggiare un led, mi BLOCCA virtualmente un programma per( x) secondi prima di proseguire.

E questo non va bene: in contemporanea io devo fare altre migliaia di cose: leggere input, assegnare output, fare conteggi: non posso aspettare dei secondi per riprendere l'esecuzione del programma, giusto?

Più semplicemente, se uso il classico programma blink contenuto in File>Esempi>Basic ma, contemporaneamente, voglio un led sul 12 che lampeggi ON 200ms e OFF 500 ms, come faccio???

Saluti

File>Esempi>Digital>BlinkWithoutDelay

... e ti impari ad usare bene millis(), studia QUI e QUI :wink:

Guglielmo

Salve...
Era il 16 aprile quando ho postato appena sopra... Quasi due mesi !!!
In questo periodo ho smanettato arduino in lungo e largo e mi ci trovo bene.

Tornando al DELAY, ho visto routine in giro e utilizzo regolarmente elapsedMillis avendo così a disposizione tutti i timers che voglio, cosa molto importante nella programmazione dei PLC industriale.
Uso la libreria elapsedMillis per timers che richiedano meno di 1 secondo (e questa lavora a millisecondi), perchè mi serve ad attivare una pompa a membrana 200 ms on e 600ms off.
Per i timers minimo 1 secondo, uso la libreria secTimer.

secTimer Va in Owerflow dopo 139 anni, al contrario di millis che dura poco meno di 50 giorni... E per una macchina industriale magari sempre accesa non va bene.

Non so, invece, (e su internet non ho trovato nulla al riguardo) quando va in overflow la libreria elapsedMillis,

Se devi usare addiritura delle librerie e se il problema dell'overflow è quello che ti preoccupa ...evidentemente NON hai studiato/capito i link che ho postato sopra ]:smiley:

Si fa tutto tranquillamente con millis() e micros(), senza scomodare librerie di terze parti.

Guglielmo

Il primo approcio ai timer l'ho fatto digitando, ormai due mesi fa, timers arduino, su Google.
Da li le librerie.
Leggendo in giro era l'overflow la bestia nera.
Ho letto i due link, di cui ti ringrazio molto, dopo aver scritto il mio post e da cui ho capito che l'overflow era un problema aggirabile.

Da vecchio (in tutti i sensi) programmatore in Ladder e in FBD di Plc Mitsubishi (Alpha e FX) oppure LOGO! Siemens o ZELIO Schneider, va da sé che ho una percezione della programmazione strutturata in un mio modo personale: ricominciando da 0 con Arduino, ho dovuto, inizialmente, affidarmi alla rete ed ai vari "consigli" che non è detto fossero quelli più "eleganti".

Gli inizi con BASIC (Apple e PC, anni e anni fa) mi tornano buoni ora con il C++

Pensavo sarebbe stato comodo avere un qualcosa tipo timerx (tempoaccensione, tempospegnimento), ma mi sa che fra un po' dovrò scrivermi una libreria io... !!! :smiley:

Comunque, fondamentalmente, ancora mi diverto un sacco !

Ciao e grazie

Quote ---->

Soluzione 2

Un’altra soluzione al problema, suggerita dall’utente lesto del forum di arduino.cc, può essere quella di invertire il controllo con l’intervallo. Normalmente nel codice si esegue un controllo di questo tipo:

MILLIS + INTERVALLO > TEMPO_PRECEDENTE

questo tipo di controllo, come detto, ricade nel campo di pertinenza dell’overflow di millis.

Si può usare invece un controllo come il seguente:

MILLIS - TEMPO_PRECEDENTE > INTERVALLO

In questo modo la differenza fra il valore fornito da millis() e la precedente registrazione sarà sempre un numero compreso fra 0 ed intervallo.

Quote ---->

Praticamente questa soluzione (che mi piace di più), è quella anche adottata da BlinkWithoutDelay negli esempi di arduino....

Bastava dirlo subito !!! :smiley: :smiley: :smiley:

Saluti