Dividere due loop

Ciao ragazzi mi trovo davanti ad un problema, che pensavo fosse semplice e stupido invece non ci salto fuori.

Volendo creare due semplici led lampeggianti, che però lampeggiano in due momenti differenti con frequenza differente.

Quindi ho 2 led rossi che si alternano, 1 acceso l'altro spento e cosi via.

e un terzo led che lampeggia continuamente ad una frequenza maggiore degli altri due.

Primo Problema: Inserendo due semplici pulsanti che fanno da ON / OFF, quando viene schiacciato ON, andando in LOW Dovrebbe accendersi il dispositivo, e invece cosi non è perché si accende solo quando tiro giu il pulsante dal momento che tolgo il dito ritorna su HIGH e si spegne. Suggerimenti per farlo rimanere in Low automaticamente ????

Secondo problema:

La frequenza del lampeggiare, non riesco a dividerla per entrambe le funzioni.

Come è possibile creare due loop differenti?

ho steso questo codice:

int ledPin = 5;
int ledPin2 = 2;
int ledPin3 = 3;

int buttonBpin = 9;
int buttonApin = 8;

byte leds = 0;

void setup() 
{
  pinMode(ledPin, OUTPUT);
    pinMode(ledPin2, OUTPUT);
    pinMode(ledPin3, OUTPUT);

  pinMode(buttonApin, INPUT_PULLUP);  
  pinMode(buttonBpin, INPUT_PULLUP);  
}

void loop() 
{
   if (digitalRead(buttonApin) == LOW)
  {
   
  digitalWrite(ledPin, HIGH);
    digitalWrite(ledPin2, LOW);
    delay(300);
    digitalWrite(ledPin2, HIGH);
    digitalWrite(ledPin, LOW);
delay(300);



digitalWrite(ledPin3, HIGH);
delay(200);
digitalWrite(ledPin3, LOW);
delay(600);

   }
  
  



 if (digitalRead(buttonBpin) == LOW)
  {
   

digitalWrite(ledPin, LOW);
    digitalWrite(ledPin3, LOW);


    digitalWrite(ledPin2, LOW);
    }
  }

Tenendo conto che tutto deve essere in LOOP continuo, quindi se viene schiacciato ON deve continuare all'infinito fino a quando non viene schiacciato OFF.

La soluzione è sempre la stessa (... se cercavi è cosa molte volte chiesta) ...

... devi studiarti come si usa la millis(), prima QUI, poi QUI ed infine leggi anche QUI e QUI ... vedrai che dopo capirai come fare :wink:

Guglielmo

Puoi prendere ispirazione da questa grezza libreria, che scrissi tempo fa: AABlink/AABlink.h at master · SukkoPera/AABlink · GitHub

In sostanza devi solo aggiungere un end() per fermare il lampeggìo quando vuoi. Per il resto è anche più complessa di quel che ti serve, perché gestisce "lampeggi asimmetrici", nel senso che il tempo acceso può essere diverso dal tempo spento. E anche così sono praticamente 5 righe :D.

gpb01:
La soluzione è sempre la stessa (... se cercavi è cosa molte volte chiesta) ...

... devi studiarti come si usa la millis(), prima QUI, poi QUI ed infine leggi anche QUI e QUI ... vedrai che dopo capirai come fare :wink:

Guglielmo

bene ora inzio a leggere, però il problema che quando metto in LOW il pulsante e lui funziona solo alla pressione, non è normale....Questo come lo risolvo? Come creo un semplice ON/OFF?

miticobeppe:
bene ora inzio a leggere, però il problema che quando metto in LOW il pulsante e lui funziona solo alla pressione, non è normale....Questo come lo risolvo? Come creo un semplice ON/OFF?

Il pulsante lo devi considerare come una cosa che ti da un segnale ... che usi per cambiare lo stato di una flag.

Inizialmente la flag è LOW, premi e rilasci il pulsante e metti la flag HIGH; quando ripremi e rilasci il pulsante la rimetti LOW e così via. In pratica fai una flag (una variabile di un byte che vale 0 e 1 , true e false, ...) che inverti di stato ogni volta che il pulsante viene premuto e rilasciato.

Mi raccomando ... i pulsanti creano un sacco di "rimbazi" ... tu credi che lo premi e van ON e lo lasci a va OFF, ma in verità ad ogni pressione ed ogni rilascio, hai molti rimbalzi ON/OFF. Devi quindi applicare delle tecniche di "debouncing" ... che possono essere sia software (cerca Arduino debouncing), sia hardware usando una resistenza ed un condensatore sull'ingresso.

Guglielmo