Oppure

Loading
02/04 9:45
nightwolf
Sto cercando di capire il perché da arduino il potenziometro si azzera anziché rimanere sul valore stesso. Mentre se lo tocco invia il valore corrente, non so se è un problema di cablaggio o altro.
aaa
02/04 10:02
Carlo
Dalle foto che hai mandato si capisce che non è la strada per andare a Roma.

Tornerei al timer2 con interval 1000, e su arduino delay(200 o 300) non ricordo.
La situazione in cui ricevevi con la foto che avevi allegato, la riallego.

Quando hai ripristinato la situazione della foto, metti dentro al timer il codice che filtra e sceglie i dati:
Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
        Dim str As String = str = RiceviDati()
     
        ListBox1.Items.Add(DateTime.Now.ToLongTimeString & " - Ricevuto = " & str.Replace(vbCrLf, "\n"))
        ListBox1.TopIndex = ListBox1.Items.Count - 1
        ListBox1.HorizontalScrollbar = True
     
        Dim righe() = str.Split(vbCrLf)
        Dim uso = 0 ' la prima riga
        If righe.Length = 0 Then Return
        If righe.Length > 1 Then uso = 1 ' la seconda riga
     
        ' Elaboro la stringa
        Dim valoriDivisi() As String = righe(uso).Split(";")
        If valoriDivisi.Length <> 2 Then
            ListBox1.Items.Add(DateTime.Now.ToLongTimeString & " - Elaborato = Errore i valori non sono due")
            Return
        End If
        ListBox1.Items.Add(DateTime.Now.ToLongTimeString & " - Selezionato = " & righe(uso))
        If valoriDivisi(0) = "E" Then
            lblgradi.Text = "errore"
            ' in valoriDivisi(1) ' il tipo d'errore da mostrare dove vuoi
            ListBox1.Items.Add(DateTime.Now.ToLongTimeString & " - Elaborato = Errore " & valoriDivisi(0) & " - " & valoriDivisi(1))
        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
            If Double.TryParse(valoriDivisi(0), avanzamento) Then
                If avanzamento <= 0 Or avanzamento >= 360 Then
                    ListBox1.Items.Add(DateTime.Now.ToLongTimeString & " - Elaborato Bussola = Errore il valore " & avanzamento.ToString() & " è fuori range")
                Else
                    lblgradi.Text = avanzamento.ToString("000°")
                    Pcboxbussola.Invalidate()
                    ListBox1.Items.Add(DateTime.Now.ToLongTimeString & " - Elaborato Bussola = " & avanzamento.ToString("000°"))
                End If
            Else
                ListBox1.Items.Add(DateTime.Now.ToLongTimeString & " - Elaborato = Errore " & valoriDivisi(0).Substring(0, 3) & " non è un intero")
            End If
     
            '' Il dato in: valoriDivisi(1), è riferito al volume e è una stringa
     
            Dim volume As Integer = 0
            If Integer.TryParse(valoriDivisi(1), volume) Then
                If volume < 0 Or volume > 100 Then
                    ListBox1.Items.Add(DateTime.Now.ToLongTimeString & " - Elaborato Volume = Errore il valore " & volume.ToString() & " è fuori range")
                Else
                    ListBox1.Items.Add(DateTime.Now.ToLongTimeString & " - Elaborato Volume = " & valoriDivisi(1))
                    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.volume = video.Volume_control1.value
                End If
            Else
                ListBox1.Items.Add(DateTime.Now.ToLongTimeString & " - Elaborato = Errore " & valoriDivisi(1) & " non è un intero")
            End If
        End If
End Sub


nella listbox1 varie info.
modificare il delay per ottimizzare è consigliato.
per il volume che va a zero non so.
Ultima modifica effettuata da Carlo 02/04 10:04
in programmazione tutto è permesso
02/04 11:27
Probabilmente per la questione del potenziometro l'errore è nel tuo codice per arduino
02/04 11:34
nightwolf
ho ripristinato il tutto come prima con questo codice
 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

    Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
        Dim str As String = RiceviDati()

        str = str.Replace(vbCrLf, "\n")
        ListBox1.Items.Add(DateTime.Now.ToLongTimeString & " - str = " & str)
        ListBox1.TopIndex = ListBox1.Items.Count - 1
        ListBox1.HorizontalScrollbar = True
    End Sub

e ricevo come prima, a parte la prima riga che è lunghissima.
aaa
02/04 11:38
nightwolf
inserendo l ultimo codice, torniamo come prima che dice
ricevuto=false
elaborato=errore i valori non sono due
ps. ho risolto il problema del potenziometro
aaa
02/04 12:47
Carlo
Postato originariamente da nightwolf:

ho ripristinato il tutto come prima con questo codice
 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

Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
        Dim str As String = RiceviDati()

        str = str.Replace(vbCrLf, "\n")
        ListBox1.Items.Add(DateTime.Now.ToLongTimeString & " - str = " & str)
        ListBox1.TopIndex = ListBox1.Items.Count - 1
        ListBox1.HorizontalScrollbar = True
End Sub

e ricevo come prima, a parte la prima riga che è lunghissima.


Con il codice sopra ricevi come prima, se la prima riga è lunghissima non fa nulla, arduino ha avuto tempo di riepire il buffer prima che tu faccia la prima lettura.
Ultima modifica effettuata da Carlo 02/04 13:02
in programmazione tutto è permesso
02/04 12:55
Carlo
Forse ho capito, se funziona poi ti spiego.
Prova questo codice modificato:
Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
            Dim str As String = str = RiceviDati()
         
            str = str.Replace(vbCrLf, "|")
            ListBox1.Items.Add(DateTime.Now.ToLongTimeString & " - Ricevuto = " & str)
            ListBox1.TopIndex = ListBox1.Items.Count - 1
            ListBox1.HorizontalScrollbar = True

            Dim righe() = str.Split("|")
            Dim uso = 0 ' la prima riga
            If righe.Length = 0 Then Return
            If righe.Length > 1 Then uso = 1 ' la seconda riga
         
            ' Elaboro la stringa
            Dim valoriDivisi() As String = righe(uso).Split(";")
            If valoriDivisi.Length <> 2 Then
                ListBox1.Items.Add(DateTime.Now.ToLongTimeString & " - Elaborato = Errore i valori non sono due")
                Return
            End If
            ListBox1.Items.Add(DateTime.Now.ToLongTimeString & " - Selezionato = " & righe(uso))
            If valoriDivisi(0) = "E" Then
                lblgradi.Text = "errore"
                ' in valoriDivisi(1) ' il tipo d'errore da mostrare dove vuoi
                ListBox1.Items.Add(DateTime.Now.ToLongTimeString & " - Elaborato = Errore " & valoriDivisi(0) & " - " & valoriDivisi(1))
            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
                If Double.TryParse(valoriDivisi(0), avanzamento) Then
                    If avanzamento <= 0 Or avanzamento >= 360 Then
                        ListBox1.Items.Add(DateTime.Now.ToLongTimeString & " - Elaborato Bussola = Errore il valore " & avanzamento.ToString() & " è fuori range")
                    Else
                        lblgradi.Text = avanzamento.ToString("000°")
                        Pcboxbussola.Invalidate()
                        ListBox1.Items.Add(DateTime.Now.ToLongTimeString & " - Elaborato Bussola = " & avanzamento.ToString("000°"))
                    End If
                Else
                    ListBox1.Items.Add(DateTime.Now.ToLongTimeString & " - Elaborato = Errore " & valoriDivisi(0).Substring(0, 3) & " non è un intero")
                End If
         
                '' Il dato in: valoriDivisi(1), è riferito al volume e è una stringa
         
                Dim volume As Integer = 0
                If Integer.TryParse(valoriDivisi(1), volume) Then
                    If volume < 0 Or volume > 100 Then
                        ListBox1.Items.Add(DateTime.Now.ToLongTimeString & " - Elaborato Volume = Errore il valore " & volume.ToString() & " è fuori range")
                    Else
                        ListBox1.Items.Add(DateTime.Now.ToLongTimeString & " - Elaborato Volume = " & valoriDivisi(1))
                        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.volume = video.Volume_control1.value
                    End If
                Else
                    ListBox1.Items.Add(DateTime.Now.ToLongTimeString & " - Elaborato = Errore " & valoriDivisi(1) & " non è un intero")
                End If
            End If
    End Sub

Ultima modifica effettuata da Carlo 02/04 13:04
in programmazione tutto è permesso
02/04 13:42
nightwolf
stesso scrittura di prima
ricevuto=false
elaborato=errore i valori non sono due
aaa