Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - creare una bussola
Forum - C# / VB.NET - creare una bussola - Pagina 10

Pagine: [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ] Precedente | Prossimo
Avatar
nightwolf (Normal User)
Pro


Messaggi: 149
Iscritto: 14/09/2010

Segnala al moderatore
Postato alle 0:19
Mercoledì, 27/03/2024
Testo quotato

Postato originariamente da Carlo:

Testo quotato

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):
Codice sorgente - presumibilmente VB.NET

  1. Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
  2.     Dim str As String
  3.     str = RiceviDati()
  4.     TextBox1.Text += str ' tuo monitor
  5.  
  6.     Dim valoriDivisi() As String ' matrice senza dimensione
  7.     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
  8.     If valoriDivisi.Length <> 2 Then Exit Sub ' se str non è stato diviso in due stringhe si esce
  9.     If valoriDivisi(0) = "B" Then
  10.         ' Il dato è riferito ai gradi della bussola
  11.         ' se la conversione è possibile avanzamento prende il valore dei primi tre caratteri della stringa
  12.         If Integer.TryParse(valoriDivisi(1).Substring(0, 3), avanzamento) Then
  13.             lblgradi.Text = avanzamento.ToString("000°")
  14.             Pcboxbussola.Invalidate() ' scatena il paint
  15.         End If
  16.     End If
  17.  
  18.     If valoriDivisi(0) = "P" Then
  19.         ' Il dato in: valoriDivisi(1), è riferito al volume e è una stringa
  20.         Dim controllo As Integer
  21.         ' se la conversione è possibile, controllo prende il valore della stringa in valoriDivisi(1)
  22.         If Integer.TryParse(valoriDivisi(1), controllo) Then
  23.             If controllo >= 0 And controllo <= 100 Then ' se il valore è nel range 0-100 si imposta il volume
  24.                 media_pleyer.lb_volume.Text = valoriDivisi(1) + "%"
  25.                 media_pleyer.Volume_control1.value = valoriDivisi(1)
  26.                 lb_volume.Text = valoriDivisi(1) + "%"
  27.                 Volume_control1.value = valoriDivisi(1)
  28.                 media_pleyer.Timer3.Start()
  29.                 media_pleyer.AxWindowsMediaPlayer1.settings.volume = media_pleyer.Volume_control1.value
  30.                 AxWindowsMediaPlayer1.settings.volume = media_pleyer.Volume_control1.value
  31.                 video.Wmp1.settings.voume = video.Volume_control1.value
  32.             End If
  33.         End If
  34.     End If
  35.  
  36.     ' possibili usi degli errori ritornati se ometti li ignori
  37.     If valoriDivisi(0) = "N" Then
  38.         ' Il dato è riferito a nessun valore ricevuto
  39.         lblgradi.Text = valoriDivisi(1) ' l'info su lblgradi, oppure dove vuoi
  40.     End If
  41.  
  42.     If valoriDivisi(0) = "E" Then
  43.         ' Il dato è riferito a errore sulla seriale
  44.         lblgradi.Text = valoriDivisi(1) ' il tipo d'errore su lblgradi, oppure dove vuoi
  45.     End If
  46.  
  47.     Label1.Text = "NORD"
  48. 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 ?

PM Quote
Avatar
nightwolf (Normal User)
Pro


Messaggi: 149
Iscritto: 14/09/2010

Segnala al moderatore
Postato alle 0:36
Mercoledì, 27/03/2024
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
https://wokwi.com/projects/393465051178897409

Ultima modifica effettuata da nightwolf il 27/03/2024 alle 0:40
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1364
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 8:25
Mercoledì, 27/03/2024
Testo quotato

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
https://wokwi.com/projects/393465051178897409


Ultima modifica effettuata da Carlo il 27/03/2024 alle 10:01


in programmazione tutto è permesso
PM Quote
Avatar
nightwolf (Normal User)
Pro


Messaggi: 149
Iscritto: 14/09/2010

Segnala al moderatore
Postato alle 12:33
Mercoledì, 27/03/2024
Testo quotato

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: https://www.onlinegdb.com/online_c_compiler

Codice sorgente - presumibilmente C#

  1. #include <stdio.h>
  2.  
  3. void bussola(char *outBussola)
  4. {
  5.     float headingDegrees = 320.5; // gradi di esempio tu li prenderai dal magnetometro
  6.     sprintf(outBussola, "%.2f", headingDegrees); // converte in stringa con 2 cifre decimali
  7. }
  8.  
  9. void loop() {
  10.     char outBussola[8]; // conterrà la stringa creata in bussola()
  11.     bussola(outBussola); // richiama la routine che legge i gradi
  12.    
  13.     char outBuf[20]; // spazio per la stringa d'uscita
  14.     int val = 10; // volume a 10, tu lo prenderai dal potenziometro
  15.    
  16.     sprintf(outBuf, "%s;%d", outBussola, val); // concatena i due valori separati da puntovirgola
  17.    
  18.     printf("%s\n", outBuf); // check stringa da inviare
  19.     //Serial.println(outBuf); // tu invece invii alla seriale
  20. }
  21.  
  22. int main()
  23. {
  24.     loop(); // richiama la routine una volta, tu tutte le volte che vuoi
  25.     return 0;
  26. }



in questo modo invii:

320.50;10

in VB tutto si semplifica e un timer è sufficiente:
Codice sorgente - presumibilmente VB.NET

  1. Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
  2.     Dim str As String
  3.     str = RiceviDati()
  4.      
  5.     Dim valoriDivisi() As String ' matrice senza dimensione
  6.     valoriDivisi = str.Split(";") ' il puntoevirgola separa le stringe: in valoriDivisi(0) ci vanno i gradi bussola e in valoriDivisi(1) ci va il volume
  7.     If valoriDivisi(0) = "E" Then
  8.            lblgradi.Text = "errore"
  9.            ' in valoriDivisi(1) ' il tipo d'errore da mostrare dove vuoi
  10.     else
  11.            ' Il primo dato è riferito ai gradi della bussola
  12.             valoriDivisi(0) = valoriDivisi(0).Replace(".", ",") ' se ci fosse il punto decimale viene sostituito con la virgola decimale
  13.             avanzamento = CInt(valoriDivisi(0))
  14.             Label1.Text = avanzamento.ToString("000°")
  15.             PictureBox1.Invalidate() ' scatena il paint
  16.  
  17.            ' Il dato in: valoriDivisi(1), è riferito al volume e è una stringa
  18.  
  19.             media_pleyer.lb_volume.Text = valoriDivisi(1) + "%"
  20.             media_pleyer.Volume_control1.value = valoriDivisi(1)
  21.             lb_volume.Text = valoriDivisi(1) + "%"
  22.             Volume_control1.value = valoriDivisi(1)
  23.             media_pleyer.Timer3.Start()
  24.             media_pleyer.AxWindowsMediaPlayer1.settings.volume = media_pleyer.Volume_control1.value
  25.             AxWindowsMediaPlayer1.settings.volume = media_pleyer.Volume_control1.value
  26.             video.Wmp1.settings.voume = video.Volume_control1.value
  27.     End If      
  28. End Sub



anche la function va modificata:

Codice sorgente - presumibilmente VB.NET

  1. Function RiceviDati() As String
  2.     Dim Ricevuti As String
  3.     Try
  4.         Ricevuti = SerialPort1.ReadExisting
  5.         If Ricevuti = Nothing Then
  6.             Return "E;null" ' ritorna con la E
  7.         else
  8.             Return Ricevuti
  9.         End If
  10.     Catch ex As Exception      
  11.         Return "E;" & ex.Message ' ritorna con la E
  12.     End Try
  13. 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

PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2316
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 14:59
Mercoledì, 27/03/2024
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.


https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
nightwolf (Normal User)
Pro


Messaggi: 149
Iscritto: 14/09/2010

Segnala al moderatore
Postato alle 17:07
Mercoledì, 27/03/2024
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.


nightwolf ha allegato un file: errore.png (147115 bytes)
Clicca qui per guardare l'immagine
PM Quote
Avatar
nightwolf (Normal User)
Pro


Messaggi: 149
Iscritto: 14/09/2010

Segnala al moderatore
Postato alle 17:10
Mercoledì, 27/03/2024
ho visto attentamente il valore di valoreDivisi(1), perchè dentro c'è anche il valore del magnetometro, non dovrebbe essere splittato?

PM Quote
Avatar
nightwolf (Normal User)
Pro


Messaggi: 149
Iscritto: 14/09/2010

Segnala al moderatore
Postato alle 17:26
Mercoledì, 27/03/2024
ho provato ad andare step by step, togliendo la parte di codice che riguarda il volume, il programma funziona senza nessun errore, ma la bussola non si muove, quando vado ad inserire la parte di codice riguardante valoriDivisi(1), quest ultimo è come se memorizzasse valoreDivisi(0) senza splittarlo.

PM Quote
Pagine: [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ] Precedente | Prossimo