Stoppare processo

Ciao a tutti !

Praticamente ho dei cicli if per vedere se dei sensori partono correttamente.
Ora voglio fare che quando il sensore non funziona, andando su else, tutto il software vanga bloccato ed un led rimanga acceso !

Come faccio ?

Bloccato per sempre?

while(1) {}

Ecco i casi:

 //SD Shield
    if (!SD.begin(4)) {
        sprintf(rtty,"SD: ERRORE\n"); rtty_txstring (rtty);
    }
    else {
    sprintf(rtty,"SD: OK\n"); rtty_txstring (rtty);
    }
//DS18B20
    DS18B20.begin();
    DS18B20.requestTemperatures();
    temperaturartty = DS18B20.getTempCByIndex(0);
    if (temperaturartty == 0) {
        sprintf(rtty,"DS18B20: ERRORE\n");  rtty_txstring (rtty);
    }
    else {
        sprintf(rtty,"DS18B20: OK\n");      rtty_txstring (rtty);
    }

Quando fa l'errore vorrei stoppare completamente il processo e l'unica cosa che deve funzionadere deve essere il lampeggio di un led !

Grazie

Se devi bloccarlo all'infinito come ti ha detto nid infila il codice in un loop senza uscita.
Altrimenti usa una variabile di stato per evitare di far fare determinati compiti.

Esempio:

if (condizione_errore) {
  errore = true;
} else {
  errore = false;
}
if (!errore) {
  //il programma normale
} else {
  //il codice da eseguire quando c'è un errore
}

Se si verifica la condizione di errore, la variabile diventa true e la seconda parte del codice, raccolta all'interno del secondo if, viene saltata, ed al suo posto eseguita un secondo blocco di codice. Ovviamente va previsto anche un controllo per verificare se la condizione di errore va via: io l'ho messo all'inizio. Perché usare una variabile di stato? Perché se la dichiari globale è una variabile che poi tutte le routine del tuo programma possono vedere e capire se siamo nella condizione di allarme oppure no.

anerDev:
Quando fa l'errore vorrei stoppare completamente il processo e l'unica cosa che deve funzionadere deve essere il lampeggio di un led !

while(1){
digitalWrite(LEDPIN, HIGH);
delay(500);
digitalWrite(LEDPIN, LOW);
}

Forever :wink:

Hai dimenticato un delay ...

E' vero :wink:

Grazie ragazzi !
In definitiva diventa così:

//SD Shield
    if (!SD.begin(4)) {
        sprintf(rtty,"SD: ERRORE\n"); rtty_txstring (rtty);
        while(1){
        digitalWrite(LEDPIN, HIGH);
        delay(500);
        digitalWrite(LEDPIN, LOW);
}
    }
    else {
    sprintf(rtty,"SD: OK\n"); rtty_txstring (rtty);
    }
//DS18B20
    DS18B20.begin();
    DS18B20.requestTemperatures();
    temperaturartty = DS18B20.getTempCByIndex(0);
    if (temperaturartty == 0) {
        sprintf(rtty,"DS18B20: ERRORE\n");  rtty_txstring (rtty);
        while(1){
        digitalWrite(LEDPIN, HIGH);
        delay(500);
        digitalWrite(LEDPIN, LOW);
}
    }
    else {
        sprintf(rtty,"DS18B20: OK\n");      rtty_txstring (rtty);
    }

No, diventa così:

while(1){
        digitalWrite(LEDPIN, HIGH);
        delay(500);
        digitalWrite(LEDPIN, LOW);
        delay(500);

Devi mettere anche il secondo delay, altrimenti non vedrai il lampeggio, te l'avevamo già detto :stuck_out_tongue_closed_eyes:

PS:
se conscio che in quel modo, però, poi l'unica per far ripartire lo sketch è il reset?

Si esatto, si deve fare il reset. Perchè se si blocca il check del sensore evidentemente o si è fuso oppure è staccato :smiley:
Quindi è così ? :roll_eyes:

//SD Shield
    if (!SD.begin(4)) {
        sprintf(rtty,"SD: ERRORE\n"); rtty_txstring (rtty);
        while(1){
        digitalWrite(LEDPIN, HIGH);
        delay(500);
        digitalWrite(LEDPIN, LOW);
        delay(500);
}
    }
    else {
    sprintf(rtty,"SD: OK\n"); rtty_txstring (rtty);
    }
//DS18B20
    DS18B20.begin();
    DS18B20.requestTemperatures();
    temperaturartty = DS18B20.getTempCByIndex(0);
    if (temperaturartty == 0) {
        sprintf(rtty,"DS18B20: ERRORE\n");  rtty_txstring (rtty);
        while(1){
        digitalWrite(LEDPIN, HIGH);
        delay(500);
        digitalWrite(LEDPIN, LOW);
        delay(500);
}
    }
    else {
        sprintf(rtty,"DS18B20: OK\n");      rtty_txstring (rtty);
    }

Solo una cosa. Per la SD se non funziona, okay.

Ma il DS, basta solo una volta che non legga e blocchi tutto. Non è possibile che il dispositivo funzioni bene e magari in una giornata solo una volta o due non riesca a leggere per qualche motivo che ora non sò (disturbi elettrici) e che quindi blocchi tutto ?
Non converrebbe magari bloccare per il DS se fallisce almeno un pò di volte? (mettere un contatore di fallimenti e dopo 5 bloccare)

Il problema è che devo leggere i dati ogni 15 secondi, quindi se non parte sono a mare ! Dato che il dispositivo dove dovrà essere montato poi non lo posso più toccare per 2 ore ! :grin: :grin: :grin:

Poi pubblicherò il progetto che sto facendo ! 8)

Intendi per il delay? Sì.

Tornando al tuo problema, se lo sketch fa solo la lettura di quel sensore allora è logico che se il sensore non c'è o è guasto, il programma non abbia altro da fare.
Però se lo sketch è più complesso e magari gestisci anche altre cose potresti semplicemente usare una variabile globale e memorizzarci il guasto, così da saltare con un semplice if tutte le parti del programma in cui prevedevi la sua lettura.

Buona norma di programmazione è di gestire opportunamente le eccezioni, non bloccare tutto quando si verificano... :sweat_smile:

Sacrosanto.

leo72:
...
PS:
se conscio che in quel modo, però, poi l'unica per far ripartire lo sketch è il reset?

oppure un bell'interrupt :stuck_out_tongue:

Dimenticavo, questo blocco è da mettere nel setup non nel loop !
Se durante il loop c'è un problema non si blocca niente, però se non parte dall'inizio è inutile fallo andare avanti, o no ?

Beh, ma il blocco del DS non sei costretto a farlo dove hai l'istruzione della sua lettura, ovvero nella loop() ?

Comunque nulla vieta di fare una interrogazione del DS nel setup() tanto per vedere se legge.

non ho capito bene la domanda, cmq nel setup vedo se il sensore funziona (nel caso contrario blocco tutto), nel loop prendo i dati (ed anche se non funziona il loop gira lo stesso !).

anerDev:
...(ed anche se non funziona il loop gira lo stesso !).

no, se tu metti un blocco nel setup il loop non inizia nemmeno

a livello di compilatore il file main.c di arduino è strutturato così:

#include <Arduino.h>

int main(void)
{
	init();

#if defined(USBCON)
	USBDevice.attach();
#endif
	
	setup();
    
	for (;;) {
		loop();
		if (serialEventRun) serialEventRun();
	}
        
	return 0;
}

quindi come nel setup metti un while(1) il programma si blocca li e non inizia ad eseguire il loop.

uscire da un while(1) puoi farlo solo con i comandi break; oppure scatenando un interrupt (tramite il timer interno o un contatto sui pin di interrupt) che faccia eseguire il codice nella funzione che decreti debba essere eseguita in caso di interrupt