Oppure

Loading
26/03 17:28
Carlo
Postato originariamente da nightwolf:

Ok, grazie. Proverò certamente e vi farò sapere.


ATTENZIONE.

Ho fatto un errore alla riga 23... senza provare....
l'ho corretta così.
    If controllo >= 0 And controllo <= 100 Then ' se il valore è nel range 0-100 si imposta il volume
Ultima modifica effettuata da Carlo 26/03 17:30
in programmazione tutto è permesso
26/03 23:19
nightwolf
Postato originariamente da Carlo:

Postato originariamente da nightwolf:

Allora, partiamo con ordine,
- sia arduino e vb hanno il ;
- B; ha come valore che va da 0 a 360 gradi con i decimali.
-P; ha come valore che va da 0 a 100 x il livello del volume numeri interi senza decimali.
Per il resto non so neanche che sia tryparse, mai visto e mai usato. Posso cercare di modificare il codice di arduino per inviare B; con numeri interi ma non so quanto possa servire se nel codice di vb si è messo la sostituzione del punto con la , decimale.


Ok non lo sai fare.
Ecco il codice da mettere nel timer (leggi i rem):
Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
    Dim str As String
    str = RiceviDati()
    TextBox1.Text += str ' tuo monitor

    Dim valoriDivisi() As String ' matrice senza dimensione
    valoriDivisi = str.Split(";") ' puntovirgola separa le stringhe: in valoriDivisi(0) ci va il codice identificativo (B = gradi bussola, P = potenziometro, N = null, E = errore) e in valoriDivisi(1) ci va il valore relativo
    If valoriDivisi.Length <> 2 Then Exit Sub ' se str non è stato diviso in due stringhe si esce
    If valoriDivisi(0) = "B" Then
        ' Il dato è riferito ai gradi della bussola
        ' se la conversione è possibile avanzamento prende il valore dei primi tre caratteri della stringa
        If Integer.TryParse(valoriDivisi(1).Substring(0, 3), avanzamento) Then 
            lblgradi.Text = avanzamento.ToString("000°")
            Pcboxbussola.Invalidate() ' scatena il paint
        End If
    End If

    If valoriDivisi(0) = "P" Then
        ' Il dato in: valoriDivisi(1), è riferito al volume e è una stringa
        Dim controllo As Integer
        ' se la conversione è possibile, controllo prende il valore della stringa in valoriDivisi(1)
        If Integer.TryParse(valoriDivisi(1), controllo) Then
            If controllo >= 0 And controllo <= 100 Then ' se il valore è nel range 0-100 si imposta il volume
                media_pleyer.lb_volume.Text = valoriDivisi(1) + "%"
                media_pleyer.Volume_control1.value = valoriDivisi(1)
                lb_volume.Text = valoriDivisi(1) + "%"
                Volume_control1.value = valoriDivisi(1)
                media_pleyer.Timer3.Start()
                media_pleyer.AxWindowsMediaPlayer1.settings.volume = media_pleyer.Volume_control1.value
                AxWindowsMediaPlayer1.settings.volume = media_pleyer.Volume_control1.value
                video.Wmp1.settings.voume = video.Volume_control1.value
            End If
        End If
    End If

    ' possibili usi degli errori ritornati se ometti li ignori
    If valoriDivisi(0) = "N" Then
        ' Il dato è riferito a nessun valore ricevuto
        lblgradi.Text = valoriDivisi(1) ' l'info su lblgradi, oppure dove vuoi
    End If

    If valoriDivisi(0) = "E" Then
        ' Il dato è riferito a errore sulla seriale
        lblgradi.Text = valoriDivisi(1) ' il tipo d'errore su lblgradi, oppure dove vuoi
    End If

    Label1.Text = "NORD"
End Sub


Questo deve migliorare la situazione, non dovresti più avere errori.

Per il discorso codice arduino te l'ho modificato per provarlo l'ho postato alle 9:57 di Sabato 23/03/2024.
Prima provalo e controlla i valori che vedi in textBox1, fammi sapere.


ho provato il codice di arduino e i valori che escono sono
?;0
se agisco sul potenziometro ho ?;36 e cosi via, ma al posto dei gradi ho solo un ?
aaa
26/03 23:36
nightwolf
ho notato anche che se non tocco il potenziometro questo mi da come valore 0, anzicchè rimare sul valore attuale
qui è dove ho provato il tutto
wokwi.com/projects/…
Ultima modifica effettuata da nightwolf 26/03 23:40
aaa
27/03 7:25
Carlo
Postato originariamente da nightwolf:

ho notato anche che se non tocco il potenziometro questo mi da come valore 0, anzicchè rimare sul valore attuale
qui è dove ho provato il tutto
wokwi.com/projects/…


ok corretto:
wokwi.com/projects/…
Ultima modifica effettuata da Carlo 27/03 9:01
in programmazione tutto è permesso
27/03 11:33
nightwolf
Postato originariamente da Carlo:

Certo, il codice del volume deve filtrare i dati ricevuti.

Riguardando il tuo codice, semplificherei ulteriormente, perché mi sembra vantaggioso inviare i dati nella seriale in un colpo solo, gli identificativi non servono più e i valori li identifichi in base alla posizione (già accennato), ho scritto un esempio in C che ti dovrebbe chiarire il concetto, inoltre puoi provare il codice su: onlinegdb.com/…

#include <stdio.h>

void bussola(char *outBussola)
{
    float headingDegrees = 320.5; // gradi di esempio tu li prenderai dal magnetometro
    sprintf(outBussola, "%.2f", headingDegrees); // converte in stringa con 2 cifre decimali
}

void loop() {
    char outBussola[8]; // conterrà la stringa creata in bussola()
    bussola(outBussola); // richiama la routine che legge i gradi
    
    char outBuf[20]; // spazio per la stringa d'uscita
    int val = 10; // volume a 10, tu lo prenderai dal potenziometro
    
    sprintf(outBuf, "%s;%d", outBussola, val); // concatena i due valori separati da puntovirgola
    
    printf("%s\n", outBuf); // check stringa da inviare
    //Serial.println(outBuf); // tu invece invii alla seriale
}

int main()
{
    loop(); // richiama la routine una volta, tu tutte le volte che vuoi
    return 0;
}


in questo modo invii:

320.50;10

in VB tutto si semplifica e un timer è sufficiente:
Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
    Dim str As String
    str = RiceviDati()
     
    Dim valoriDivisi() As String ' matrice senza dimensione
    valoriDivisi = str.Split(";") ' il puntoevirgola separa le stringe: in valoriDivisi(0) ci vanno i gradi bussola e in valoriDivisi(1) ci va il volume
    If valoriDivisi(0) = "E" Then
           lblgradi.Text = "errore"
           ' in valoriDivisi(1) ' il tipo d'errore da mostrare dove vuoi
    else
           ' Il primo dato è riferito ai gradi della bussola
            valoriDivisi(0) = valoriDivisi(0).Replace(".", ",") ' se ci fosse il punto decimale viene sostituito con la virgola decimale
            avanzamento = CInt(valoriDivisi(0))
            Label1.Text = avanzamento.ToString("000°")
            PictureBox1.Invalidate() ' scatena il paint

           ' Il dato in: valoriDivisi(1), è riferito al volume e è una stringa

            media_pleyer.lb_volume.Text = valoriDivisi(1) + "%"
            media_pleyer.Volume_control1.value = valoriDivisi(1)
            lb_volume.Text = valoriDivisi(1) + "%"
            Volume_control1.value = valoriDivisi(1)
            media_pleyer.Timer3.Start()
            media_pleyer.AxWindowsMediaPlayer1.settings.volume = media_pleyer.Volume_control1.value
            AxWindowsMediaPlayer1.settings.volume = media_pleyer.Volume_control1.value
            video.Wmp1.settings.voume = video.Volume_control1.value
    End If       
End Sub


anche la function va modificata:

Function RiceviDati() As String
    Dim Ricevuti As String
    Try
        Ricevuti = SerialPort1.ReadExisting
        If Ricevuti = Nothing Then
            Return "E;null" ' ritorna con la E
        else
            Return Ricevuti
        End If
    Catch ex As Exception      
        Return "E;" & ex.Message ' ritorna con la E
    End Try
End Function


Naturalmente non ho provato nulla, se c'è qualche svista perdonami.

Buongiorno, ho rimesso questo codice nel vb, visto che dalla seriale adesso esce un unica stringa
320.20;36
Soltanto che mi da sempre l errore sulla stringa, dal codice adesso i valori ricevuti vengono splittati e messi in due array che sono valoriDivisi(0) e valoriDivisi(1). Perché mi da l errore sulla stringa, prima potevo capire che poteva essere la ricezione di B o P, ma adesso non ci sono più.
Ps. La ricezione è giusta perché dalla textbox1 si riceve tutto
aaa
27/03 13:59
Thejuster
Usa il debugger e vedi che succede.

Senza il debugger è impossibile capire dove hai il problema.

1) Mette un breakpoint subito dopo che i dati vengono letti.
2) Controlla la variabile ed il suo contenuto.
3) Controlla come vengono splittati
4) Controlla gli array
5) Sei apposto.

Segui questi passaggi in uno di questi punti deve esserci un problema.
mire.forumfree.it/ - Mire Engine
C# UI Designer
27/03 16:07
nightwolf
non so se è giusto come ho fatto su quello che mi hai detto, questo è la schermata della variabile globale e delle relative array, mi sembra giusto, la varfiabile globale riceve entrambi i valori e dopo le rispettive array hanno valoriDivisi(0) il valore del magnetometro e valoriDivisi(1) il valore del potenziometro.
ps. ho ritoccato il codice di arduino cosi da inviare alla seriale soltanto numeri interi del magnetometro, senza decimali.
aaa
27/03 16:10
nightwolf
ho visto attentamente il valore di valoreDivisi(1), perchè dentro c'è anche il valore del magnetometro, non dovrebbe essere splittato?
aaa