LOOP

salve a tutti, ho bisogno di fare un loop in questo codice, ma non ho proprio idee

if(marcia=='X'){     
 digitalWrite(4,HIGH);     
 digitalWrite(5,HIGH);
 delay(750);
 digitalWrite(4,LOW);
 digitalWrite(5,LOW);
 delay(750);
}

inoltre durante il loop (che si interrompe con un determinato comando) devo poter inviare altri dati a arduino.

grazie a tutti

Cosa esattamente vuoi fare?

Spiega bene perché dire "ho bisogno di fare un loop in questo codice" ha la stessa utilità di dire "ho bisogni di andare al bagno" ...
... quindi descrivi esattamente cosa intendi, quali sono le fasi del programma e quali le sequenze temporali.

Guglielmo

... inoltre, SE (e solo SE) durante quelle istruzioni che hai scritto, hai anche la necessità di fare altre cose, ovvero, NON puoi permetterti di stare fermo per il tempo delle delay() che hai messo, ma in quel tempo devi fare altro, allora NON puoi usare la delay() e devi ristrutturare il tutto.

Ti rammento che l'istruzione delay() ferma il flusso del programma per il tempo indicato. SE c'è invece la necessità di NON fermare il programma, occorre usare la millis().
Per imparare ad usare la millis() devi studiare prima QUI, poi QUI ed infine leggere anche QUI e QUI.

Guglielmo

dai anche uno sguardo sul reference a

while

in pratica c è un led collegato e quando arriva il comando "X" deve lampeggiare, in questo caso lampeggia solo una volta, ma io ho bisogno che lampeggi in continuazione, anche all infinito, finche non arriva il comando "y" a stoppare, ma siccome nel frattempo ad arduino invio altre informazioni non si deve bloccare per eseguire il loop

il programma è lo stesso di clash230, stiamo lavorando insieme ecco perche, nel caso vogliate vederlo andate su un suo topic, avrebbe scritto lui il post ma ha dimenticato la password:stuck_out_tongue_closed_eyes:

in questo caso conviene usare un sistema a stati e millis

Inizia facendo lampeggiare il LED come nel famoso blink without delay, poi piano piano introduci il resto, è meglio andare per gradi.

Crea una variabile in cui memorizzi uno stato, true se devi farlo lampeggiare, false se lo devi lasciare sempre spento.

Ad ogni loop, verifica se giunge il comando via seriale per portare la variabile di stato a true o a false.

Ad ogni loop, se questa variabile di stato è true, verifica se sono trascorsi i millisecondi del tempo di on-off del led, se sono trascorsi, inverti l'alimentazione del LED acceso-spento.

Ricordati di mettere comunque OFF il led quando porti a false la variabile di stato, altrimenti potrebbe rimanere acceso.

Appena questo sistema ti funziona, potrai passare ad inserire altre cose.
Sempre senza mai usare il delay e demandando i compiti a funzioni specifiche.

paulus1969:
in questo caso conviene usare un sistema a stati e millis

[... omissis ...]

era quanto era stato già spiegato a clash230 in passato a qualcuno qui sul forum... in giro, in qualche thread, ci deve essere già fatto il codice proprio come tu lo hai indicato ... visto che avevamo adottato esattamente quanto da te suggerito :wink:

Guglielmo

So che chiedo troppo ma potreste gentilmente scrivermi la parte di codice per questo LOOP?

Grazie mille

Ti do un esempio (... gia presente in altro thread) di come far lampeggiare o meno un LED tramite una flag di stato (lampeggia/non lampeggia) senza mai fermare il loop().

Naturalmente aumentando il numero di flag di stato e funzioni attivate .. lo si espande a diverse temporizzazioni :wink:

Prendi spunto da questo, studiatelo e adattalo a quello che devi fare tu ...

const unsigned long tempo_blink_1 = 1000;
unsigned long       tempo_1       = 0;
byte                flag_1        = false;
byte                LED_1         = LOW;
byte                pin_LED_1     = 13;

void funzione_1() {
  if (!flag_1) return;
  //
  if (millis() - tempo_1 > tempo_blink_1) {
    tempo_1 = millis();
    digitalWrite(pin_LED_1, LED_1);
    LED_1 = ~LED_1;
  }
}

void setup() {
  pinMode(pin_LED_1, OUTPUT);
}

void loop() {
  flag_1 = true;
  funzione_1();
}

Guglielmo

Grazie mille

anche se dopo tutto questo tempo, ho provato il programma, ma non va, rimane bloccato, o meglio, lampeggia quando richiesto, ma non segue gli altri comandi.

come faccio?

const unsigned long tempo_blink_1 = 750;
unsigned long       tempo_1       = 0;
byte                flag_1        = false;
byte                LED_1         = LOW;
byte                pin_LED_1     = 4;
char marcia;

#include <SoftwareSerial.h>
SoftwareSerial BluetoothSerial = SoftwareSerial(0, 1);

void setup() {
  pinMode(pin_LED_1, OUTPUT);
  BluetoothSerial.begin(9600);
}

void loop() {
   if (BluetoothSerial.available()){
    marcia=BluetoothSerial.read(); 
    if(marcia=='V'){                    //CLACSON
 digitalWrite(6,HIGH);
               }  
if(marcia=='v'){
 digitalWrite(6,LOW);
               }  
   if(marcia=='X'){
    flag_1 = true;
   }
  if(marcia=='x'){
    flag_1 = false;
    digitalWrite(pin_LED_1, LOW);
  }
    if (!flag_1) return;
  //
  if (millis() - tempo_1 > tempo_blink_1) {
    tempo_1 = millis();
    digitalWrite(pin_LED_1, LED_1);
    LED_1 = ~LED_1;
  }
   }
}

Cosa è quel : if (!flag_1) return; all interno del loop() ? ? ? :o :o :o return da cosa ? dove ? Cosa volevi fare ?

Descrivi esattamente il diagramma logico/funzionale di ciò che vorresti ottenere e vediamo come puoi procedere ...

Guglielmo

ecco cosa potrebbe essere, in pratica nel tuo programma il lampeggio era descritto in una funzione, io l ho tolta, ma ho dimenticato di togliere questo dettaglio, vedo se è questo il problema, per il resto tutto ok?

... il mio metodo è molto flessibile perché solo usando delle semplici flag e delle funzioni puoi gestire molte cose asincrone in modo estremamente semplice e LEGGIBILE.

Il tuo metodo di mettere tutto nel loop() funziona, ma la leggibilità e la semplicità in caso di una modifica ... vanno a farsi benedire :smiley:

Se hai varie cose, il sistema migliore è rendere il tutto modulare, NON monolitico :wink:

Comunque, togli quella riga e vedi come va.

Guglielmo

L ho provato funziona riceve ed esegue anche altri comandi, grazie

Pero c è un ma. L altro comando era il comtrollo di un led e sembra che quando lo accende non ci sia abbastanza corrente. Come risolvo?

Gaudi23:
Pero c è un ma. L altro comando era il comtrollo di un led e sembra che quando lo accende non ci sia abbastanza corrente. Come risolvo?

... COME hai collegato il LED ? A che pin ? Che LED ? Schema elettrico del collegamento ... :slight_smile:

Guglielmo

Il led del lampeggio è sul pin 4 mentre quello controllato sul 6

E ti sembra di aver risposto completamente alle mie domande ? ? ?

gpb01:
... COME hai collegato il LED ? A che pin ? Che LED ? Schema elettrico del collegamento ... :slight_smile:

Guglielmo

Scusami. I led sono led normali, quelli che ho trovato nello starter kit. Collegati senza resistenze. Ma con il codice BLINK dell IDE di arduino arriva correttamente corrente al led. Solo con quello sketch non va.
I pin te li ho scritti. Lo schema elettrico non so fartelo

Gaudi23:
... Collegati senza resistenze ...

Ecco ... MAI E POI MAI collegarli così ... è il sistema migliore per danneggiare/bruciare Arduino !

Ti rammento che ogni pin di Arduino può dare al massimo, a Vcc, 40 mA (... ma quello è veramente un limite, nel normale funzionamento occorre stare al 60-70% di detto valore) ed inoltre la somma di tutti i pin e dell'assorbimento del chip, non deve superare al massimo i 200 mA (... e anche qui massimo va considerato come valore limite, ma nel normale funzionamento occorre stare al 60-70% di detto valore). Assorbimenti oltre detti limiti possono danneggiare irrimediabilmente il chip.

Quindi ... mettici in serie una resistenza da 220Ω, o giù di li, su ciascun LED che colleghi !

Guglielmo