Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
questo è quello che leggo dal serial monitor di arduino
Codice sorgente - presumibilmente Plain Text
P;52
B;300.90
B;301.02
B;301.06
B;300.86
B;301.26
B;300.98
B;300.90
B;301.10
B;301.14
B;301.10
dove P sta ad indicare il valore del potenziometro x il volume, che nel programma lo gestisce timer1, solo che è da modificare perchè adesso da arduino x il potenziometro invio delle stringhe e non il semplice byte, e B che sarebbero le coordinate del magnetometro
questo è il codice di arduino:
Codice sorgente - presumibilmente C++
#include "RTClib.h"
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_HMC5883_U.h>
// CONFIGURAZIONE
const byte P_LED =9;
const byte P_SET =6;
const byte P_RESET =7;
const byte P_RELE_APRE =10;//relè x sbloccare porta
const byte P_RELE_BLOCCA =11;//rele x bloccare porta
ho provato a disabilitare timer2, per vedere se il tutto funzionasse, in parte si, soltanto che nel mio programma il livello del volume impazzisce, e si alza e abbassa senza nessun controllo. molto probabilmente perchè non riceve più i singoli byte ma una stringa?
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#
#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
return0;
}
in questo modo invii:
320.50;10
in VB tutto si semplifica e un timer è sufficiente:
Codice sorgente - presumibilmente VB.NET
PrivateSub Timer2_Tick(sender AsObject, e As EventArgs)Handles Timer2.Tick
DimstrAsString
str= RiceviDati()
Dim valoriDivisi()AsString' 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
buonasera a tutti, purtroppo dal tuo esmpio non ho capito quasi niente, o per lo meno, dovrei stare a modificare anche il codice di arduino, quando adesso funziona bene su quello che ci siamo detti prima, ho scritto un codice facendo la prova nel realizzare un monitor seriale per vedere se visualbasic ricevesse ciò che arduino invia, e dal programma tutto funziona, adesso, tornando al discorso di prima di splkittare le varie stringhe che arrivano, è fattibile, e posizionarle nelle rispettive funzioni, quali voume e lbldirezione? questo è il codice del monitor seriale, fatto alla ben meglio senza stare a modificare nomi o altro. Da qui si può pensare di fare i, tutto spiegato prima, scusa ancora ma star a modificare ancora il codice di arduino è un impresa.
Codice sorgente - presumibilmente VB.NET
Imports System.IO.Ports
PublicClass Form1
PrivateSub Form1_Load(sender AsObject, e As EventArgs)HandlesMyBase.Load
PrivateSub Button3_Click(sender AsObject, e As EventArgs)Handles Button3.Click//chiudi la connessione
SerialPort1.Close()
Timer1.Stop()
TextBox1.Text=""
EndSub
Function RiceviDati()AsString
Dim ricevuti AsString
Try
ricevuti = SerialPort1.ReadExisting
If ricevuti <> NothingThen
Return ricevuti
EndIf
Catch ex As Exception
Return"errore: "& ex.Message
EndTry
EndFunction
PrivateSub Timer1_Tick(sender AsObject, e As EventArgs)Handles Timer1.Tick
DimstrAsString
str= RiceviDati()
TextBox1.Text+=str
EndSub
PrivateSub TextBox1_TextChanged(sender AsObject, e As EventArgs)Handles TextBox1.TextChanged
TextBox1.Select(TextBox1.TextLength, 0)
TextBox1.ScrollToCaret()
EndSub
EndClass
vi chiedo se da qui è mpossibile splittare i vari valori che arrivano dalla seriale che in questo momento sono
B:"coordinate" 000.00
P:"valore potenziometro" da 0 a 100
grazie mille
Ultima modifica effettuata da nightwolf il 23/03/2024 alle 1:54
Si, tutto codice già postato, hai cambiato solo il puntoevirgola con i duepunti, riepiloghiamo:
riposto la function ma con i duepunti
Codice sorgente - presumibilmente VB.NET
Function RiceviDati()AsString
Dim ricevuti AsString
Try
ricevuti = SerialPort1.ReadExisting
If ricevuti =NothingThen
return"N:null"' duepunti al posto del puntovirgola
else
Return ricevuti
EndIf
Catch ex As Exception
Return"E:"& ex.Message' duepunti al posto del puntovirgola
EndTry
EndFunction
il timer
Codice sorgente - presumibilmente VB.NET
PrivateSub Timer1_Tick(sender AsObject, e As EventArgs)Handles Timer1.Tick
DimstrAsString
str= RiceviDati()
TextBox1.Text+=str' tuo monitor
Dim valoriDivisi()AsString' matrice senza dimensione
valoriDivisi =str.Split(":")' duepunti 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(0)="B"Then
' Il dato è riferito ai gradi della bussola
valoriDivisi(1)= valoriDivisi(1).Replace(".", ",")' se ci fosse il punto decimale viene sostituito con la virgola decimale
' ******* il codice per far funzionare la bussola, togli i rem quando inseriscie nel definitivo *******
' avanzamento = CInt(valoriDivisi(1))
' lblgradi.Text = avanzamento.ToString("000°")
' Pcboxbussola.Invalidate() ' scatena il paint
EndIf
If valoriDivisi(0)="P"Then
' Il dato in: valoriDivisi(1), è riferito al volume e è una stringa
' ******* il codice per far funzionare il volume, togli i rem quando inseriscie nel definitivo *******
Controlla sopra ho risposto alla tua domanda, ora se hai tempo se puoi e se vuoi prova questo codice in arduino e controlla se invia i dati: gradi;volume 000.00;100
Codice sorgente - presumibilmente C++
#include "RTClib.h"
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_HMC5883_U.h>
// CONFIGURAZIONE
const byte P_LED =9;
const byte P_SET =6;
const byte P_RESET =7;
const byte P_RELE_APRE =10;//relè x sbloccare porta
const byte P_RELE_BLOCCA =11;//rele x bloccare porta
ciao e grazie, il codice in vb.net adesso non si blocca più però non succede niente, non si muve la bussola ne tanto meno il volume, non mi nessun errore, mentre il codice in aurduino dalla seriale esce soltanto ? e i valori del potenziometro, nient altro.
ho fatto come mi hai spiegato ma non succede niente ho fatto anche un video dimostrativo e se riesco lo posto. cmq questo è il codice che mi hai spiegato.
Codice sorgente - presumibilmente VB.NET
Function RiceviDati()AsString
Dim ricevuti AsString
Try
ricevuti = SerialPort1.ReadExisting
If ricevuti =NothingThen
Return"N:null"' duepunti al posto del puntovirgola
Else
Return ricevuti
EndIf
Catch ex As Exception
Return"E:"& ex.Message' duepunti al posto del puntovirgola
EndTry
EndFunction
PrivateSub Timer2_Tick(sender AsObject, e As EventArgs)Handles Timer2.Tick
DimstrAsString
str= RiceviDati()
TextBox1.Text+=str' tuo monitor
Dim valoriDivisi()AsString' matrice senza dimensione
valoriDivisi =str.Split(":")' due punti 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(0)="B"Then
' Il dato è riferito ai gradi della bussola
valoriDivisi(1)= valoriDivisi(1).Replace(".", ",")' se ci fosse il punto decimale viene sostituito con la virgola decimale
' ******* il codice per far funzionare la bussola, togli i rem quando inseriscie nel definitivo *******
avanzamento =CInt(valoriDivisi(1))
lblgradi.Text= avanzamento.ToString("000°")
Pcboxbussola.Invalidate()' scatena il paint
EndIf
If valoriDivisi(0)="P"Then
' Il dato in: valoriDivisi(1), è riferito al volume e è una stringa
' ******* il codice per far funzionare il volume, togli i rem quando inseriscie nel definitivo *******