Swich case over flow blocco arduino

scusami prima ero dal cellulare e non mi sono spiegato bene:

praticamente la tavola ASCII converte i caratteri in un modo più appetibile per i micro ovvero con 01 (su wikipedia troverai più info) ergo con il -48 i numeri ritornano al loro aspetto "normale", non avviene lo stesso con i caratteri, e mi sa che il problema del tuo programma è proprio qui. però purtroppo non stai procedendo nella maniera migliore a mio avviso

bisogna un pò adattarsi al micro e ragionare come ragiona lui quindi non decimale ma binario, non caratteri ma sempre binario.

un altro problema è che tu interfacci arduino con mit, e con mit ci ho fatto un bel pò di prove prima di farlo funzionare come volevo. avrei un programma con cui mi sono fatto la domotica della mia camera ma è completamente non commentato e rischio di confonderti di più a mandartelo

allora prima di tutto leva quella char usa un int. adesso hai ben 500 possibili combinazioni-comandi da inviare fra arduino e domotica

esempio estratto dal mio codice

data = bt.read();
if (data == 100){//alza tende}
if (data == 101){//fai il caffe, ecc}

praticamente devi scriverti tutte le possibilità in questo modo

Ciao, :slight_smile:
ieri sera ho fatto una prova per vedere se realmente c'è un problema hardware o software come diceva Mauro. Ho ridotto il programma ad un solo IF

// Verifica se la luce Scale è ON o OFF e aggiorna lo stato del pulsante sul tablet in ON o OFF  
      
    if (valPulsante8 == LOW)
    {
      if (statoPulsante8 == false)
      {
      for (int A = 0; A < 4; A++){
        delay(600);
        Serial.println(6);// ON Scale
      }
        statoPulsante8 = true;
        
      }
    }
    else if (valPulsante8 == HIGH) 
    {
     if (statoPulsante8 == true)
     {
      for (int A = 0; A < 4; A++){
        delay(600);
        Serial.println(5);// OFF Scale
     }
       statoPulsante8 = false;
       
      }
    }

ho messo il controllo su un solo Interruttore eliminando anche tutti i relè. quando sono tornato stasera era bloccato. Penso che solo questo pezzo non doveva mandare in blocco la NANO giusto ?

... credo sia già stato detto ... sicuro non sia un problema di alimentazione ? Disturbi ? Provato solo il codice SENZA NULLA collegato, solo la Nano e niente d'altro ?

Guglielmo

No quello no.
Come posso capire dopo che la NANO è bloccata se non collego nulla sopra ?
se metto tipo il Blink al led interno può essere una soluzione ? cosi vedo se si blocca..
La NANO insieme ai relè e alimentatore sono chiusi in un contenitore di plastica e fissata a muro dietro la porta.

Metti delle Serial.print() nei punti critici per fare il debug !

Guglielmo

Adesso provo e vedo cosa succede.
Ho modificato alcuni punti che mi diceva ASTER, ma una cosa non ho capito, lui mi dice di cambiare i caratteri A,B,C,D,E,F in ASCII ma valori tipo che corrisponde al binario 0001,0010,0011,0100,0101,0110 ?

 case 'A': //ON/OFF
      digitalWrite(rele1, LOW);
      delay(400);//400
      digitalWrite(rele1, HIGH);
      break;
 case '0001': //ON/OFF
      digitalWrite(rele1, LOW);
      delay(400);//400
      digitalWrite(rele1, HIGH);
      break;

Dovrebbe diventare cosi ?

Scrivere 'A' equivale a scrivere 0x41 in esadecimale o 65 in decimale ... non so cosa proponesse Aster ed in che contesto ti dicesse di modificare la cosa ...

... comunque, o metti le varie Serial.print() e fai un debug come si deve vedendo cosa ricevi, cosa trasmetti, in che punto sei nei vari switch/case, a che punto sei nei vari if ... oppure NON ne esci.

Ovvero ... IMPARA A FARE IL DEBUG ... perché tu continui solo a fare modifiche ed a provare nella pratica la cosa senza capire cosa sta succedendo veramente dentro il programma.

Guglielmo

Capito grazie.
Tanto ho due NANO una per le luci Sopra e una per le luci giù, quindi s una provo come dici te, su l'altra inserisco le modifiche.
cerco di capire con il DEBUG.
Grazie Guglielmo

Guarda, un piccolo trucco ...
... senza stare ogni volta ad inseriore e cancellare righe, se, in testa la programma metti:

#define DEBUG

e poi nel corso del programma, dove inserisci le istruzioni che ti servono solo per il debug metti :

#ifdef DEBUG
.... istruzioni solo per il debug
.... istruzioni solo per il debug
#endif

il giorno che NON ti serve più il fare debug, basta che commenti la prima riga in testa :

// #define DEBUG

... e tutte quelle istruzioni NON vengono più inserite nel codice, ma tu nel sorgente le hai sempre e se un domani dovessi rifare il debug ... basterebbe togliere il commento iniziale e le avresti di nuovo

Non so se è chiaro ... ::slight_smile:

... in pratica la prima riga definisce un qualche cosa chiamato DEBUG, se la commenti ovviamnete NON lo definisce.
Le altre sono dei blocchetti che racchiudono delle istruzioni che però vengono inserite nel tuo codice SOLO se è definita quella cosa chiamata DEBUG, altrimenti è come se non le avessi scritte.

Quindi, ad esempio, poteri mettere

#ifdef DEBUG
Serial.print(miaVariabile);
#endif

e quella Serial.print() ci sarebbe SOLO se all'inizio la #define DEBUG non è commentata, se la commenti quella Serial.print() sparisce dal codice compilato :wink:

Guglielmo

Ho inserito l'istruzione #define DEBUG

poi l'ho messa tra una condizione di controllo IF, ho ridotto il programma in solo due istruzioni una il controllo interruttore e l'altro attivazione relè.

#ifdef DEBUG  
  if (valPulsante8 == LOW)
    {
      if (statoPulsante8 == false)
      {
      for (int A = 0; A < 4; A++){
        delay(600);
        Serial.println("6");// ON Scale
      }
        statoPulsante8 = true;
        
      }
    }
    else if (valPulsante8 == HIGH) 
    {
     if (statoPulsante8 == true)
     {
      for (int A = 0; A < 4; A++){
        delay(600);
        Serial.println("5");// OFF Scale
     }
       statoPulsante8 = false;
       
      }
    }
#endif

Ma forse ho capito il problema di tutto il casino. Ho notato che inserendo nella scatola il secondo alimentatore per le schede relè va in blocco subito. Prima il grande era fuori dalla scatola e non andava subito in blocco. Secondo me i due alimentatori creano disturbi alla NANO "ripeto secondo me". Domani provo a eliminare i due alimentatori, li metto fuori e vedo cosa succede. Le due NANO le ho posizionate aspetto e vedo cosa succede.

NON era quello che intendevo .. in questo modo elimini TUTTO !!!

Devi metterci SOLO ed esclusivamenze le istruzioni che usi per fare Debug ...
... non tutto il tuo codice, altrimenti è inutile !!!

Hai visto l'esempio che ho fatto nel post ?

Guglielmo

Allora ho capito male io scusa,
quella che vedi è solo una parte del codice, è il punto dove controlla l'interruttore 1. il resto del codice è libero dal DEBUG.
Adesso stavo leggendo il funzionamento del #define DEBUG

Gian70Luca:
Adesso stavo leggendo il funzionamento del #define DEBUG

Dove ? :o

Quella NON è una cosa specifica per il DEBUG, la #define e le #ifdef , #endif , ecc. sono normali comandi di "preprocessore C" che si usano in un'infinità dei casi ... quella che ti ho illustrato è solo UNO dei possibili utilizzi ...

Rileggiti con MOLTA attenzione il mio post e guarda bene cosa ho scritto !

Guglielmo

Non sono istruzioni specifiche per il debug, sei tu che le usi per il debug.
Potevi anche usare #define cavolo ed #ifdef cavolo ed avresti ottenuto lo stesso effetto.
Io solitamente non uso l'ifdef ma una variabile debugmode (che al solito avrei anche potuto chiamare cicoria o verza, la funzione la sceglie chi programma) che poi metto a 0, 1, 2 ... a seconda di cosa e come voglio ottenere i dati. Con l'ifdef però risparmi memoria.

In tutto c'ò c'è un punto che vorrei capire meglio.
Dici che si blocca quando invii dati al tablet.
Poi dici che se sposti l'alimentatore si blocca meno.
Parli di relè...

1 - per caso ci sono relè vicini?
2 - si blocca quando invii i dati SEMPRE o quando si blocca stai SEMPRE inviando dati o nessuna delle due?
(Insomma: inviare dati al tablet è condizione necessaria o sufficiente o entrambe o nessuna...)

Ciao, Si blocca da solo. se per esempio lo lascio funzionante la mattina, quando torno la sera lo trovo che il tablet non invia più i dati e viceversa la nano non invia i dati al tablet.

In allegato la foto della scheda, sulla sinistra ci sono i relè dove comandano i relè passo passo. A destra gli ingressi che ricevo dai relè passo passo che mi indicano se la luce è ON/OFF.
Per l'attivazione dei relè ricevo i comandi dal tablet per gli ingressi invece e la NANO che invia i dati al table.
Ieri sera ho fatto delle modifiche che mi sono state consigliate da MauroTec attualmente mi sta funzionando bene, senza nessun problema. E tutto da vedere. sto leggendo in generale il DEBUG per capire come funziona e come viene usato. Ieri mi ha dato un consiglio Guglielmo ma da perfetto non programmatore non ho capito.

Cerco esempi cosi da portare su arduino cosi capisco meglio.
grazie mille.

Mi concentrerei più sull'elettronica per il momento, che sul software; l'immagine che hai allegato pure se di qualità, non mi lascia dedurre alcune cose, per cui mi sorgono dei dubbi che dovresti chiarire (credo un chiarimento farebbe bene anche agli altri utenti).

Dunque non capisco come viene alimentata la board Nano, hai un link a questo alimentatore?

Per il problema relè potresti anche pensare di eliminare i carichi che commuta o ancora meglio togliere il comune che alimenta tutte le bobine dei relè; ora qui viene il bello, imparare a fare debug, o meglio trovare un espediente per sondare cosa sta eseguendo la CPU. Normalmente il debug si esegue tramite hardware specifico, ma il costo e le competenze richieste per procedere sono cose che scarseggiano, per cui si usa il debug dei poveri, che di base è abbastanza comprensibile (tranne casi da considerare eccezioni).

Il debug dei poveri parte sempre dal dubbio che il codice non si comporti come vorremmo e nonostante ci sbattiamo la testa non troviamo una spiegazione. Il dubbio per esempio può essere simili a questo punto di domanda: Sono davvero sicuro che il codice dentro questa if (cond) ... venga eseguito e quante volte viene eseguito?

Per cui in sostituzione di hardware e competenze, il povero si ingegna e si inventa qualcosa che può anche richiedere molto impegno, ma solitamente ci si limita a inserire un Serial.print('A'); in un punto e un Serial.print('B'); in un altro e così via.

Per il momento lascia da parte il suggerimento di Guglielmo (che è valido e usatissimo oltre che comodo) ma tu non lo hai recepito al volo e questo ti allontana dall'obbiettivo debug dei poveri che devi affrontare.

Ciao.

Ciao, il problema di tutto questo era l'alimentatore, troppo piccolo per far funzionare i relè. :confused:
Ho eseguito il consiglio di Guglielmo di separare le alimentazioni una per i relè e una per la NANO, ma ho sbagliato io nelle potenze.
Il programma funziona bene. :slight_smile: :slight_smile: :slight_smile: attualmente dopo tre giorni il sistema continua a funzionare e i dati sono giusti dopo le modifiche fatte.
Ho risolto cosi, :slight_smile:
sul tablet, sulla maschera che comando le luci ho creato una label che simula il Serial monitor a sua volta tutto quello che passava nel seriale veniva visualizzato e registrato dal tablet in un file.
Ho visionato proprio stamattina il file e non ci sono dati strani inviati e ricevuti che creano casino era tutto ok.
Ho risolto cambiando l'alimentatore, ho messo un 2 A per i relè e un da 1A per la NANO. In più non ho tolto gli alimentatori dalla loro sede attuale cioè nella scatola come si vede in foto. Pensando che potesse essere un disturbo esterno che mi creava problemi di blocco.
Spero che continui cosi.
Grazie mille. :wink: :wink:

Ciao a tutti, volevo solo confermare che attualmente funziona tutto :smiley: :smiley: . Il NANO non si blocca piu.
Adesso posso andare aventi con il progetto, gestione macchina caffè :slight_smile:

Grazie Guglielmo per i tuoi consigli. :wink: :wink:

Gian70Luca:
Grazie Guglielmo per i tuoi consigli. :wink: :wink:

Figurati ... :grin:

Guglielmo

Scusa Guglielmo vorrei farti una domanda.
Mettiamo caso io ho un Arduino Mega e utilizzo le sue 4 uscite TX/RX posso fare una cosa del genere ?

Vorrei che con il Tablet 1 invio un dato alla Seriale 1 del Mega elabora il dato e la Mega invia dalla seriale 2 il dato elaborato al Tablet 2.

Come faccio a differenziare le Seriali sulla Mega ? mi puoi indicare un esempio o lettura ?