Arduino si blocca

Ciao, ho un problema nel creare a meta' programma una temporizzazione che tenga alimentato un led per 3 secondi e che poi spenga e prosegua nello svolgimento del programma.

Ciao, questione "forse" già trattata millemilavolte sul forum, devi usare millis. :slight_smile:
Per capire le basi con cui si usa millis() consiglio prima la lettura di QUESTO post esplicativo, dopo di che lo studio di come si usa la funzione millis(), prima QUI, poi QUI e QUI e QUI e tutti gli articoli che sono in QUESTA pagina ... alla fine il tutto dovrebbe essere più chiaro :slight_smile:

int ritardo=3000;
unsigned long timeStart= millis()

if (millis()-timeStart <=ritardo) {
   digitalWrite(ledPin,HIGH);
} else {
   digitalWrite(ledPin,LOW)
}

Meglio se spieghi bene il tuo problema
Perché millis() la usi bene, quindi il tuo problema è da altre parti, temo

Standardoil:
Meglio se spieghi bene il tuo problema
Perché millis() la usi bene, quindi il tuo problema è da altre parti, temo

:fearful: ??? il codice l'ha scritto Patrick_M mica Lollo9906 ;D ;D ;D ;D

Dec 08, 2016, 09:59 am

Questa mattina ho provato ad implementare la funzione millis() al posto della delay() e si sono corrette tantissime cose compreso il ritardo che c'era col modulo bluetooth!! Adesso anche il sensore ultrasuoni funziona alla PERFEZIONE! L'unco ..... che non funziona è ancor sempre è il servo che adesso si blocca sulla sinistra, non più sulla destra -_-. Non so più come fare...
Di seguito allego il programma per chi volesse darci un occhiata.

:smiley:

visto la lunga esperienza con millis() ho voluto risparmiare l'agonia :smiley: (scherzo neh!!)

Nono
Lollo9906 ha già usato proficuamente millis anni fa.
Per gli utenti che non conosco vado sempre a vedere la presntazione, Guglielmo mi fa paura. a magari anche qualche post a caso
So per certo che conosce bene l'uso di millis

Standardoil:
... Guglielmo mi fa paura.

:smiling_imp: :smiling_imp: :smiling_imp: ... fai bene ad avecce paura! :smiling_imp: :smiling_imp: :smiling_imp:

Guglielmo

Non capisco cosa voglia dire "in mezzo al programma". Un programma non ha un centro chiaro e definito. Sarebbe meglio che lollo spieghi bene cosa vuole fare, e magari alleghi un programma (la seconda preferibilmente durante/dopo la prima) così da vedere dove e come usare millis()

Diciamo che alla fine, ho provato ad operare senza millis perche il mio cervello stava iniziando un po' a fumare... cosi mi sono arrangiato in un altro modo, che per ora mi sembra funzioni a dovere.
Pero, giustamente, mi e' parso un nuovo problema...

void risciacquo() {
  if (oggetto1 == HIGH && n3 == 0) {
    display8();
    digitalWrite(I5, LOW);
    n2 = 1;
  }
  oggetto1 = digitalRead(IR1);
  if (oggetto1 == LOW && n2 == 1) {
    digitalWrite(I3, HIGH);
    display16();
    n3 = 1;
    n2 = 2;
  }
  oggetto2 = digitalRead(IR2);
  if (oggetto2 == LOW && n3 == 1) {
    display8();
    if (n2 == 2) {

      digitalWrite(I4, HIGH);
      digitalWrite(I7, HIGH);
      int i = 0;
      int j = 2000;
      do {
        i = i + 10;
        digitalWrite(I9, HIGH);
        digitalWrite(I7, HIGH);
        Serial.println(i);
        delay(10);
      } while (i < j);
      digitalWrite(I9, LOW);
      digitalWrite(I7, LOW);
      n2 = 3;
    }
    if (n2 == 3) {

      int l = 0;
      int m = 7000;
      do {
        l = l + 10;
        digitalWrite(I8, HIGH);
        Serial.println(l);
        delay(10);
      } while (l < m);
      digitalWrite(I8, LOW);
      digitalWrite(I7, LOW);
      n2 = 4;
    }
  }
  if (n2 == 4 && oggetto3 == HIGH) {
    display16();
    digitalWrite(I4, LOW);
  }
  oggetto3 = digitalRead(IR3);
  if (oggetto3 == LOW) {
    display17();
    digitalWrite(I5, HIGH);
    n2 = 5;
  }
  if (oggetto3 == HIGH && n2 == 5) {
    fine = 0;
    r = 1;
  }
}

in questo void dalla quindicesima riga partendo dal basso, non mi esegue le ultime indicazioni, pur cambiando valore alla variabile "n2" che serve tipo da flag. Non capisco perche, saro' io gia fuso oggi, ma
non riesco a far proseguire oltre il programma.
Sotto posto il codice copleto, perche' e' su piu' pagine.

Grazie a tutti per i precedenti aiuti. (il programma non e' ancora terminato al 100 %)

PROVE_MISCELATORE.zip (6.88 KB)

Metto la versione nuova e corretta del programma (non ancora provata)

PROVE_MISCELATORE.zip (6.45 KB)

E' possibile che Arduino mega ad un certo punto di programma, si fermi e non vada piu' avanti? Perche non riesco piu' ad uscirne.

In questo caso "flag" al fondo dell'if diventa uguale a 0.

    if (oggetto3 == LOW) {
      Serial.println("SONO QUI");
      digitalWrite(I5, HIGH);
      numero = 0;
      flag = 0;
    }

Il problema e' che dopo aver svolto tutte le varie funzioni precedenti, arrivato a questo punto, arduino si ferma e non va piu' avanti, mentre DOVREBBE uscire e tornare alla funzione iniziale, che crea la prima pagina web.

inoltre se richiamo il void display17(),

    display17();
    if (oggetto3 == LOW) {
      Serial.println("SONO QUI");
      digitalWrite(I5, HIGH);
      numero = 0;
      flag = 0;
    }

Arduino arriva fino a display17() senza aggiornare lo schermo e senza procedere oltre.
Cosa potrebbe essere?

L'origine del probelam è evidente:
alla riga 18 hai dichiarato un oggetto di tipo Stream con un buffer inadeguato, data la velocità minima della seriale e il tempo di risciacquo devi mettere almeno 3-4 Kbyte, su una UNO forse devi rinunciare alla connessione wi-fi, ma tentar non nuoce........

Fai un gioco: posta tutto il programma (non si sa mai) e di bene cosa vuoi fare, così possiamo trovare soluzioni

OK, per mia grande felicita' sono appena riuscito a risolvere il tutto.
Un nuovo problema mi era scaturito perche', penso, ad Arduino mega non piaceva il nome che avevo assegnato ad un pin. Prima quando si chiamava I9, nel momento in cui arrivavo a portarlo ad un livello alto, il programma si bloccava.
Non sapendo piu' dove sbattere la testa ho provato a cambiargli il nome in I20 e il programma e' arrivato al termine. :slight_smile:

Posto lo stesso il programma terminato, manca solo l'implementazione dei sensori ultrasuoni nel void loop(), ma quello non e' assolutamente un problema.
Spero non ne sorgano altri piu' tardi...

MISCELATORE.zip (6.64 KB)

Alcune combinazioni di lettere sono nomi di registiri o Bits/ fuse del Controller. Non so se I9 (Imola nove) sia uno di questi nomi riservati.

Dovresti imparare a usare dei nomi di variabili parlanti. Come per esempio oggetto1 2 3, N1 2 3, I1 2 3 ecc non dicono niente. Chiamali in funzione del uso che hanno. Cosa é attacato o cosa fanno?
esempio Pompa, Valvola, ecc
Informati del uso di arrays.

Ciao Uwe

Aah, allora sara' per quello che non gli piaceva. Ho dato quei nomi per rispecchiare gli ingressi del plc I1, I2 ecc.