sensore temperatura e porta seriale

Salve ragazzi sto realizzando un progetto che prevede l’uso di tre sonde ti temperatura le cui rilevazioni devono comparire in tre textbox differenti di visualbasic. premetto che le sonde funzionano bene e che riesco solo ad usare una sonda per volta e non tutte insieme(per ora sto provando con due). Nel codice arduino ho inserito un ritardo di 2 sec tra una lettura ed un altra della sonda ed infatti ho due valori a distanza di 2 sec. se questi valori li invio ad una textbox tutto funziona (i 2 valori si alternano). Ma il mio problema è che ogni valore deve essere visualizzato nella sua textbox, cioe
sonda 1 textbox1
sonda2 textbox2
Per ora per distinguere i due valore ho moltiplicato uno di essi per dieci e quindi in visual basic mi arrivano 2 valori uno superiore e l’altro inferiore a 100, ma quando vado ad usare una condizione in visual basic per gestire i valori non funziona… esempio
arduino
sonda1= 30 gradi
sonda2= 27*10= 270gradi
quindi in visual basic ho 2 valori 30 e 270
Visualbasic
x= serialport.readline()
if x>100 then textbox1.text= x
if x<100 then textbox2.text=x
ovviamente questa funzione l’ho inserita in un timer con ritardo di 1 sec
ma non va

spero di non aver fatto confusione…

ho pensato di proseguire in questo modo
in arduino faccio scrivere le temperature su un unica stringa
quindi poi in visualbasic la divido e scrivo le porzioni di stringa nelle apposite textbox

che ne dite è fattibile?

Da Arduino come spedisci i dati? Serve vedere il codice che hai su Arduino.

void loop() {

// INIZIO CODICE SENSORI TEMPERATURA

STM.requestTemperatures(); LETTTEMPMASH=((STM.getTempCByIndex(0))); STS.requestTemperatures(); LETTTEMPSPARGE=((STS.getTempCByIndex(0))); Serial.print(LETTTEMPMASH, 1); Serial.println(LETTTEMPSPARGE, 1); delay (500);

questo è il cilco void loop() ho omesso la dichiarazione delle variabili

nikola291: ho omesso la dichiarazione delle variabili

Cosa importante perché c'è differenza tra int, long e float. Potresti postare il codice completo?

Prima di copiarlo dall'IDE, usa la funzione "formattazione automatica". La trovi nel menù strumenti. Serve per effettuare automaticamente l'identazione del codice. Poi usa i tag CODE. Per vedere come si fa guarda il punto 7 --> http://forum.arduino.cc//index.php?topic=149082.0

EDIT: Ti conviene inviare le letture assieme separate da una carattere tipo ; o # Lato VB leggi tutti il dato da seriale, lo metti in un vettore e poi estrapoli i tre pezzi separati dal carattere scelto.

Potresti anche inviare caratteri distinti come prefisso e poi fare un parsing della stringa ricevuta da VB, in pratica devi crearti un banalissimo protocollo dove ogni carattere ha un suo significato. Forse un po' più didattico ma fornisce un percorso mentale che porta poi a costruire il protocollo.

Esempio di una stringa inviata da Arduino: - "T" che identifica che arriverà la lettura di una temperatura..... - "01" ....dal sensore #01 - "23.3" il dato

quindi Arduino manda: Serial.print("T"); Serial.print("01") ovvero ("02") Serial.println(tempValue1) ovvero (tempValue2)

In VB devi elaborarla cercando in successione (p.es. con vari select case) il contenuto: 1. stringaLetta.substring(0,1) ---> 1 carattere alla posizione 0 2. stringaLetta.substring(1,2) ----> 2 caratteri per l'ID del sensore 3. stringaLetta.substring(3, n) ----> la stringa del valore, per la proprietà Text della TextBox relativa

con n la lunghezza della parte rimanente di stringa (oppure un valore certo se la lunghezza è sempre la stessa)

Oppure, come ti hanno suggerito, con un vettore dove lo split deriva dal carattere scelto per isolare i singoli pezzi.

E' interessante anche la moltiplicazione del risultato, ma devi vedere come funziona la serial.read su VB. Se legge un carattere alla volta, come sull'Arduino, sarà sempre minore di 100. Perché leggerà 2 e non 270.

intanto grazie a tutti per i tempestivi suggerimenti e chiedo scusa per non aver ustao il tag code per postare il codice. comunque ho risolto appena adesso .........ho adottato la soluzione di scomporre la stringa unica ricevuta da Arduino, ora sto provando ad inserire il terzo sensore ma penso che non ci debbano essere problemi vi post di seguito la porzione di codice visualbasic che ho usato per scomorre la strinca, cosi da poter rendere completo questo topic

p.s. le variabili in arduino le ho dichiarate come flout

ometto di postare la dichiarazione delle variabili che troverete nel codice , cmq sono tutte di tipo Dtring

    Private Sub Timer18_Tick(sender As Object, e As EventArgs) Handles Timer18.Tick
        TEMPMASH.Text = Microsoft.VisualBasic.Right(LETTURATEMPERATURA, 5)
        TEMPSPARGE.Text = Microsoft.VisualBasic.Left(LETTURATEMPERATURA, 4)
    End Sub
End Class

grazie ancora

PaoloP: E' interessante anche la moltiplicazione del risultato, ma devi vedere come funziona la serial.read su VB. Se legge un carattere alla volta, come sull'Arduino, sarà sempre minore di 100. Perché leggerà 2 e non 270.

Non ho sottomano la routine, ma sicuramente si arriva a tutta una stringa.

L'invio dei soli valori, oltretutto solo numerici, potrebbe dare false letture, in quanto non rientrano in uno schema "pattuito" :) con Arduino.

In pratica, con il parsing, tutto ciò che non inizia almeno con "T" è già da scartare (nessuna azione) a priori.

nikola, vedo che usi un timer

se cerchi in rete (p.es. qui) trovi una discussione sul delegate/invoke, ti consiglio di studiarla, in quanto alla fine è molto utile, anche se ostico inzialmente.

In pratica si genera un evento quando hai in mano una stringa completa.

In questo modo Arduino manda stringhe quando vuole/vuoi e VB se ne accorge subito, senza intervalli predeterminati.

ok ci daro un occhio sicuramente anche se cmq alla fine nel progetto finale il valore delle tre sonde servira dal inizio alla fine.

ho un piccolo problemino adesso che ho inserito il terzo termometro e cioe la stringa è ora composta da 3 gruppi di quattro caratteri esempio 11.122.233.3 che comando devo usare per richiamare solo la porzione 2.22? split puo andare bene?

ok risolto anche il terzo sensore con l’ausilio della funzione MID

    Private Sub Timer18_Tick(sender As Object, e As EventArgs) Handles Timer18.Tick
        TEMPBOLL.Text = Microsoft.VisualBasic.Right(LETTURATEMPERATURA, 5)
        TEMPSPARGE.Text = Microsoft.VisualBasic.Mid(LETTURATEMPERATURA, 5, 4)
        TEMPMASH.Text = Microsoft.VisualBasic.Left(LETTURATEMPERATURA, 4)
    End Sub
End Class

grazie e spero possa essere utile a qualcuno :slight_smile: :slight_smile:

Mi spiace... non conosco VB. :roll_eyes: Ma vedo che hai risolto. :grin: