Go Down

Topic: Dividere due loop  (Read 148 times) previous topic - next topic

miticobeppe

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:

Code: [Select]
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.


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 ;)

Guglielmo

Search is Your friend ... or I am Your enemy !

SukkoPera

#2
Sep 13, 2017, 05:24 pm Last Edit: Sep 13, 2017, 05:28 pm by SukkoPera
Puoi prendere ispirazione da questa grezza libreria, che scrissi tempo fa: https://github.com/SukkoPera/AABlink/blob/master/src/AABlink.h

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.
Make your Sega MegaDrive/Genesis region-free with Arduino! https://goo.gl/X7zBcq

Guida rapida a ESP8266: https://goo.gl/kzh62E

miticobeppe

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 ;)

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?

gpb01

#4
Sep 13, 2017, 09:49 pm Last Edit: Sep 13, 2017, 09:52 pm by gpb01
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
Search is Your friend ... or I am Your enemy !

Go Up