Problema con variabili

Praticamente sto realizzando un programma che mi legge un pin analogico, collegato a un CD4066 che mi switcha 4 sonde diverse, dovrei memorizzare su 4 variabili diverse la lettura del pin A0 questo è il programma:

//Inizializzo le variabili per lo store dei valori analogici
int a0;
int a1;
int a2;
int a3;
int a4;
int a5;
int led = 13;
int t1 = 9;
int t2 = 10;
int t3 = 11;

int val = '0';

void setup() {
 pinMode(led,OUTPUT); 
//Inizializzo la porta Seriale
Serial.begin(9600);

}
void loop() {
  
  val = Serial.read();
    
    if(val=='a'){
    digitalWrite(led,HIGH);
    Serial.println("x");
}
    else  if(val=='b'){
    digitalWrite(led,LOW);
    Serial.println("k");
}
    
  //Inizializzo la stringa
  String stringa0="";
  String stringa1="";
  String stringa2="";


         // inizio switc lettura  valori e spedisco in seriale
  
    digitalWrite(t1,HIGH);  //  apre switcha canale 1
    a0 = analogRead(A0); // salva lettura 1 su a0
    digitalWrite(t1,LOW);  // chiude switc canale 1

    stringa0 += char('a');   //unisce questo carattere a
    stringa0 += int(a0);      //questa  variabile
    Serial.println(stringa0);   //Stampo la stringa a Seriale
    
    delay(10);  
    
    digitalWrite(t2,HIGH);  //apre switcha canale 2
    a1 = analogRead(A0);   // salva lettura 2 su a1
    digitalWrite(t2,LOW);  // chiude switc canale 2
    
    stringa1 += char('b');    //unisce questo carattere a
    stringa1 += int(a1);      //questa  variabile
    Serial.println(stringa1); //Stampo la stringa a Seriale
    
    delay(10);  
   
    digitalWrite(t3,HIGH); // apre switcha canale 3
    a2 = analogRead(A0);  //salva lettura 3 su a2
    digitalWrite(t3,LOW);  // chiude switc canale 3

    stringa2 += char('c');    //unisce questo carattere a
    stringa2 += int(a2);      //questa  variabile
    Serial.println(stringa2); //Stampo la stringa a Seriale
    
    delay(10);
}

il problema è che quando vado a leggere le 4 sonde da seriale mi mischia tutto perche :0 saltate la prima parte

Hai provato a mettere un if (Serial.available()) prima di leggere la seriale?

Ed un delay(1000) dopo il Serial.begin...

in che senso if (Serial.available()) ?

Vi prego aiutatemi

danyevo:
in che senso if (Serial.available()) ?

in QUESTO !

Guglielmo

Grazie per i consigli ma non riesco a capire come inserire cio nel mio programma, non o ben capito il significato

AIUTOOO messo nel titolo non... aiuta. Al massimo, aiuta a far cancellare i thread , visto che è contro il regolamento usare il maiuscolo ed usare implorazioni d'aiuto, come il tuo precedente post... :cold_sweat:

Nel Reference c'è la spiegazione di tutti i comandi e le librerie di Arduino, così come dell'oggetto Serial e del metodo available(), con tanto di esempio d'uso.

Serve a vedere se ci sono dati da leggere sulla seriale. Le operazioni che fanno uso dei suddetti dati vanno eseguite quando questi dati ci sono. Quindi vanno racchiuse in un if:

  if (Serial.available())
  {

     val = Serial.read();
    
     if(val=='a')
     {
     digitalWrite(led,HIGH);
     Serial.println("x");
     }
     if(val=='b')
     {
     digitalWrite(led,LOW);
     Serial.println("k");
     }
  }

Inoltre mettere un delay quando si inizializza la seriale nel void setup è spesso utile.

no ma il mio problema non è quello, il problema è questo:

 //Inizializzo la stringa
  String stringa0="";
  String stringa1="";
  String stringa2="";


         // inizio switc lettura  valori e spedisco in seriale
  
    digitalWrite(t1,HIGH);  //  apre switcha canale 1
    a0 = analogRead(A0); // salva lettura 1 su a0
    digitalWrite(t1,LOW);  // chiude switc canale 1

    stringa0 += char('a');   //unisce questo carattere a
    stringa0 += int(a0);      //questa  variabile
    Serial.println(stringa0);   //Stampo la stringa a Seriale
    
    delay(10);  
    
    digitalWrite(t2,HIGH);  //apre switcha canale 2
    a1 = analogRead(A0);   // salva lettura 2 su a1
    digitalWrite(t2,LOW);  // chiude switc canale 2
    
    stringa1 += char('b');    //unisce questo carattere a
    stringa1 += int(a1);      //questa  variabile
    Serial.println(stringa1); //Stampo la stringa a Seriale
    
    delay(10);  
   
    digitalWrite(t3,HIGH); // apre switcha canale 3
    a2 = analogRead(A0);  //salva lettura 3 su a2
    digitalWrite(t3,LOW);  // chiude switc canale 3

    stringa2 += char('c');    //unisce questo carattere a
    stringa2 += int(a2);      //questa  variabile
    Serial.println(stringa2); //Stampo la stringa a Seriale
    
    delay(10);
}

Quando vado a leggere i dati da VB la lettura dell' A0 mi viene mischiata in tutte e 3 le stringhe In pratica devo leggere 3 temperature diverse ma che vengono tutte dall' ingresso A0 e con lo switc indirizzo la lettura della A0 nella sonda che mi serve.

Non mi è chiaro, cosa intendi con la frase: "da VB la lettura dell' A0 mi viene mischiata in tutte e 3 le stringhe" ? Se ho ben capito tu spedisci 3 volte iniziando i valori con la lettera 'a', 'b' e 'c'. Il valore che spedisci non è detto che abbia sempre la stessa lunghezza come numero di cifre. Come le leggi da VB ? Hai tenuto conto che magari spedisci e ricevi una cosa del genere (un esempio): a123b8c56

Non sarebbe meglio avere anche un fine stringa, esempio # a123#b8#c56#

da VB le leggo così

  dr = SerialPort1.ReadLine 'riceve la stringa
  str1 = Mid(dr, 1, 1) 'legge il primo carattere della stringa ricevuta 

        If str1 = "x" Then

            RadioButton1.Checked = True

        ElseIf str1 = "k" Then

            RadioButton1.Checked = False

        End If


            If str1 = "a" Then
            str2 = Mid(dr, 2, 4)   'legge da secondo al quarto carattere della stringa ricevuta
            TextBox1.Text = str2


        End If


            If str1 = "b" Then
            str2 = Mid(dr, 2, 4)
            TextBox2.Text = str2


        End If


            If str1 = "c" Then
            str2 = Mid(dr, 2, 4)
            TextBox3.Text = str2
        End If
       

        
    End Sub

in base al primo carattere che arriva legge la temperatura Ma il problema non è qui è su arduino qui:

         // inizio switc lettura  valori e spedisco in seriale
  
    digitalWrite(t1,HIGH);  //  apre switcha canale 1
    a0 = analogRead(A0); // salva lettura 1 su a0
    digitalWrite(t1,LOW);  // chiude switc canale 1

    stringa0 += char('a');   //unisce questo carattere a
    stringa0 += int(a0);      //questa  variabile
    Serial.println(stringa0);   //Stampo la stringa a Seriale
    
    delay(10);  
    
    digitalWrite(t2,HIGH);  //apre switcha canale 2
    a1 = analogRead(A0);   // salva lettura 2 su a1
    digitalWrite(t2,LOW);  // chiude switc canale 2
    
    stringa1 += char('b');    //unisce questo carattere a
    stringa1 += int(a1);      //questa  variabile
    Serial.println(stringa1); //Stampo la stringa a Seriale
    
    delay(10);  
   
    digitalWrite(t3,HIGH); // apre switcha canale 3
    a2 = analogRead(A0);  //salva lettura 3 su a2
    digitalWrite(t3,LOW);  // chiude switc canale 3

    stringa2 += char('c');    //unisce questo carattere a
    stringa2 += int(a2);      //questa  variabile
    Serial.println(stringa2); //Stampo la stringa a Seriale
    
    delay(10);

Credo fosse che ogni volta che vado a leggere A0 la lettura mi modifica tutte le variabili (a0, a1, a2)

Prova una cosa del genere:

    String string1 ="b";
    String string2 = string1 + a1;
    Serial.println(string2);

Il problema non è quello è che io faccio 3 letture sul pin analogico A0 e salvo le 3 letture su 3 variabili diverse, quando però vado a leggere le variabili contengono tutte e 3 la stessa cifra.

Prova anche a mettere un delay dopo avere attivato ogni sonda ed a fare 10 letture e prendere la media o meglio ancora fare 20 letture e prendere la media delle ultime 10.

Scusa ... ma non mi sembra di vedere i pinMode per i vari pin digitali ... ... dichiari : pinMode(led,OUTPUT); ... e tutti gli altri ? Non vedo dove lo fai ... :roll_eyes:

Guglielmo

danyevo:
Credo fosse che ogni volta che vado a leggere A0 la lettura mi modifica tutte le variabili (a0, a1, a2)

Non ne vedo il motivo. Il tuo codice è corretto. Il micro non si inventa di andare ascrivere su variabili “a caso”.
Ma se spedisci su Serial allora invece di vedere i dati da VB li puoi vedere tranquillamente da Serial Monitor dell’ IDE.
Li cosa appare ?
Tu leggi sempre da A0, ma hai il CD4066 che cambia sensore in base a 3 pin digitali. Sei sicuro del circuito?
Inoltre come detto da @Guglielmo, questi 3 pin digitali tu li usi in scrittura (ci fai dei digitalWrite) ma nel setup() non li dichiari in OUTPUT con la pinMode(). Secondo me dal CD4066 leggi sempre senza switchare.

Già... il pimode! :grin: Non mi ero accorto che non ci fosse! Sistemalo e vedi cosa succede... anche se secondo me a prescindere il serialavailable ci vorrebbe prima di leggere dalla seriale.

Tutto ok grazzie mille mi ero perso in una cavolata…
Ora ho un altro problema quando ricevo i dati su VB dopo la cifra segue un simbolo strano che non centa niente sembra un rettangolino

Dovrebbe essere un carattere non stampabile, tipo quelli tra 0 e 31. Magari è il 10 o 13 (andata a capo o ritorno carrello)

ho provato a cercalli in acii ma non lo trovo ma perche mi viene fuori?