SabinoDelia Inserito: 14 febbraio 2015 Segnala Inserito: 14 febbraio 2015 Salve a tutti, io dovrei leggere o stato di un ingresso analogico su Arduino, in particolare A0, e lo devo trasmettere su un software creato con Visual Basic. ho già sviluppato i programmi e funzionano anche solo che sul software creato con VB il valore incrementa e scende lentamente. in pratica se alzo il potenziometro su A0 il software Arduino mi da i valori in tempo reale in bare a come vario il potenziometro, invece sul software creato con VB il valore di A0 aumenta molto lentamente in pratica se metto il potenziometro a un valore ad esempio "35" il software prima di visualizzarmelo passa dai 5 ai 10 secondi e quindi se ho un valore che varia molto velocemente come ad esempio la velocità del vento con un anemometro non riesco a visualizzarla correttamente. Per favore potete aiutarmi? Questi sono i codici di programmazione: Arduino: int y; void setup () { Serial.begin(9600); } void loop () { y= analogRead(A0); Serial.println(y); } Visual Basic: Public Class Form1 Dim analogic As String Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load SerialPort1.Close() SerialPort1.PortName = "COM3" SerialPort1.Open() End Sub Private Sub SerialPort1_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived analogic = SerialPort1.ReadLine End Sub Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick Label1.Text = analogic End Sub End Class Se potete aiutarmi e magari farmi qualche esempio ve ne sarò molto grato. Grazie a tutti
TeleMan Inserita: 14 febbraio 2015 Segnala Inserita: 14 febbraio 2015 Semplicemente perchè riempi il Buffer con lo stesso valore. Pensa a che velocità trasmetti sempre lo stesso valore sulla seriale, devi trasmettere (Serial.println(y)solo quando cambia il valore di A0, oppure metti una pausa e trasmetti una volta ogni decimo di secondo. Se trasmetti ogni tot di tempo evita di usare delay se devi eseguire altro codice su arduino perchè ti ferma l'esecuzione, meglio usare la funzione millis e con una condizione verificare il tempo trascorso. Spero di essermi spiegato
SabinoDelia Inserita: 14 febbraio 2015 Autore Segnala Inserita: 14 febbraio 2015 (modificato) Con millis non ho capito come fare E se faccio così: int y; void setup () { Serial.begin(9600); } void loop () { y= analogRead(A0); Serial.println(y); delay (1000); } Modificato: 14 febbraio 2015 da SabinoDelia
TeleMan Inserita: 14 febbraio 2015 Segnala Inserita: 14 febbraio 2015 (modificato) Questo è un esempio tratto dagli esempi del programma Blink without Delay vedi : (file->esempi->digital->BlinkwithoutDelay) int y; long previousMillis = 0; long interval = 1000; //intervallo di tempo in millisecondi // in questo caso trasmette ogni secondo void setup() { Serial.begin(9600); } void loop() { unsigned long currentMillis = millis(); if(currentMillis - previousMillis > interval) { previousMillis = currentMillis; y= analogRead(A0); Serial.println(y); } } Ciao a tutto il forum siete sempre i migliori (in effetti mancavo da un po') <E se faccio così: int y; void setup () { Serial.begin(9600); } void loop () { y= analogRead(A0); Serial.println(y); delay (1000); }> Se fai cosi il loop si interrompe per un secondo Modificato: 14 febbraio 2015 da TeleMan
SabinoDelia Inserita: 14 febbraio 2015 Autore Segnala Inserita: 14 febbraio 2015 Grazie mille ho risolto, ora funziona bene
SabinoDelia Inserita: 14 febbraio 2015 Autore Segnala Inserita: 14 febbraio 2015 E come faccio invece a ricevere più segnali analogici e comunicarli a VB ?
TeleMan Inserita: 14 febbraio 2015 Segnala Inserita: 14 febbraio 2015 in che senso ? Hai più ingressi analogici e vuoi inviarli a VB identificandoli oppure cosa
SabinoDelia Inserita: 14 febbraio 2015 Autore Segnala Inserita: 14 febbraio 2015 SI ho più ingressi analogici e voglio mostrali in label come il precedente
TeleMan Inserita: 14 febbraio 2015 Segnala Inserita: 14 febbraio 2015 Fai la lettura di n piedini, una volta acquisiti trasmetti i valori con un ciclo for (ovviamente la variabile y diventa un array) metti un valore di parteza per la sequenza di lettura degli ingressi analogici. int y[10] void loop y[0]= analogRead(A0); y[5]= analogRead(A5); dopo la lettura trasmetti for (int i=0; i <= 9;i++) Serial.println(y); .......... Buon Divertimento !!!
SabinoDelia Inserita: 14 febbraio 2015 Autore Segnala Inserita: 14 febbraio 2015 Scusami, ma non ho capito bene la seconda parte del programma: for (int i=0; i <= 9;i++) Serial.println(y); .......... e poi con VB come procedo ?
walterword Inserita: 14 febbraio 2015 Segnala Inserita: 14 febbraio 2015 con VB procedi che usi l'evento onComm e leggi quello che ti arriva in seriale ed aggiorni le textbox ect Ma c'e 'ancora VB?
Livio Orsini Inserita: 15 febbraio 2015 Segnala Inserita: 15 febbraio 2015 Ma c'e 'ancora VB? Si, non è più supportato e l'ambiente di sviluppo deve girare su Win XP, perchè da vista in poi girano solo gli exe. Però si può usare VB.net o, meglio, "C#"
SabinoDelia Inserita: 15 febbraio 2015 Autore Segnala Inserita: 15 febbraio 2015 Si, non è più supportato e l'ambiente di sviluppo deve girare su Win XP, perchè da vista in poi girano solo gli exe. Però si può usare VB.net o, meglio, "C#" Infatti io utilizzo VB.NET Per favore potete aiutarmi ? ho più ingressi analogici e voglio mostrali in label su VB.NET
Livio Orsini Inserita: 15 febbraio 2015 Segnala Inserita: 15 febbraio 2015 Ti è stato descritta la soluzione. ma non ho capito bene la seconda parte del programma: for (int i=0; i <= 9;i++) Serial.println(y); .......... y(i) sono i valori letti in precednza, il loop di for serve a trasmetterli uno alla volta sulla porta seriale di arduino. Da parte PC devi avere il drive di lettura della seriale da cui ricevi i dati nel medesimo ordine.
SabinoDelia Inserita: 15 febbraio 2015 Autore Segnala Inserita: 15 febbraio 2015 Scusami potresti farmi un esempio sia del software di Arduino che di VB ?
Livio Orsini Inserita: 15 febbraio 2015 Segnala Inserita: 15 febbraio 2015 arduino è già li bello scritto da TeleMan. come ha scritto Walter con VB procedi che usi l'evento onComm e leggi quello che ti arriva in seriale ed aggiorni le textbox ect Non è che c'è molto da far esempi. In rete, se fai una ricerca, trovi tantissimo materiale sull'uso della seriale con VB.net
SabinoDelia Inserita: 15 febbraio 2015 Autore Segnala Inserita: 15 febbraio 2015 Salve a tutti io ho un termometro con Arduino e l' ho collegato con Visual Basic che mi legge la temperatura su un Label. Funziona bene solo che vorrei che quando la temperatura scende al di sotto dei 3°C nel Label4 mi deve scrivere "Allerta Ghiaccio". Questi sono i codici: Arduino: #include <LiquidCrystal.h> //Libreria per pilotare il display LCD #define pin_temp A0 //Pin di collegamento del piedino Vout del sensore di temperatura float temp = 0; //Variabile in cui verrà memorizzata la temperatura rilevata LiquidCrystal lcd(7, 6, 5, 4, 3, 2); //Inizializzazione della libreria con i pin del display LCD int y; long previousMillis = 0; long interval = 1000; void setup() { lcd.begin(16, 2); //Impostazione del numero di colonne e righe del display LCD lcd.setCursor(0, 0); //Sposto il cursore sulla prima riga (riga 0) e sulla prima colonna lcd.print("Temperatura:"); //Stampo il messaggio 'Temperatura:' sulla prima riga /*Imposto Vref dell'ADC a 1,1V (per una maggiore precisione nel calcolo della temperatura) ------------------------------- IMPORTANTE: Se utilizzi Arduino Mega sostituisci INTERNAL con INTERNAL1V1 */ analogReference(INTERNAL); Serial.begin(9600); } void loop() { /*Calcolo la temperatura =============================================*/ temp = 0; for (int i = 0; i < 5; i++) { //Esegue l'istruzione successiva 5 volte temp += (analogRead(pin_temp) / 9.31); //Calcola la temperatura e la somma alla variabile 'temp' } temp /= 5; //Calcola la media matematica dei valori di temperatura /*===========================================*/ /*Visualizzo la temperatura sul display LCD =============================================*/ lcd.setCursor(0, 1); //Sposto il cursore sulla prima colonna e sulla seconda riga lcd.print(temp); //Stampo sul display LCD la temperatura lcd.print(" C"); //Stampo uno spazio e il carattere 'C' sul display /*===========================================*/ delay(1000); //Ritardo di un secondo (può essere modificato) { unsigned long currentMillis = millis(); if(currentMillis - previousMillis > interval) { previousMillis = currentMillis; y= analogRead(A0); Serial.println(temp); } } } Visual Basic: Public Class Form1 Dim analogic As String Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load SerialPort1.Close() SerialPort1.PortName = "COM3" SerialPort1.Open() End Sub Private Sub SerialPort1_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived analogic = SerialPort1.ReadLine End Sub Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick Label1.Text = analogic Label3.Text = "°C" End Sub End Class Ho già provato a fare: If analogic < 3 Then Label4.text = "Allerta Ghiaccio" End If Ma non funziona perché la mia variabile è di tipo string e non integer. come posso fare? P.S: se cambio la variabile in integer non mi legge correttamente i gradi.
SabinoDelia Inserita: 15 febbraio 2015 Autore Segnala Inserita: 15 febbraio 2015 Ok grazie ho capito ora farò alcune prove.
Livio Orsini Inserita: 15 febbraio 2015 Segnala Inserita: 15 febbraio 2015 Perchè aprire 2 discussioni sul medesimo problema? Continua con questa dove sono state rieunite. Ma non funziona perché la mia variabile è di tipo string e non integer. come posso fare? Fai una conversione; è un po' di tempo che non uso VB, ma ho dei ricordi di una serie di istruzioni specifiche per queste conversioni.
SabinoDelia Inserita: 15 febbraio 2015 Autore Segnala Inserita: 15 febbraio 2015 Non sono riuscito a leggere più segnali analogici con visual basic non riesco a trovare niente sul web per quanto riguarda OnComm per piacere aiutatemi.
Livio Orsini Inserita: 15 febbraio 2015 Segnala Inserita: 15 febbraio 2015 Prima domanda: i segnali analogici li spedisci regolarmente? Fai una verifica con un tool come Hyperterrminal. seconda domanda : quanti caratteri ricevi sulla Comm?
walterword Inserita: 15 febbraio 2015 Segnala Inserita: 15 febbraio 2015 (modificato) vb.net non ha niente a che vedere con vb se non per via della sintassi o poco piu La piattaforma ovvero il framework no ne' piu win32 ma .net E comunque il linguaggio principe nativo di .net e' c# non vb.net Nel framework .net sono i metodi statici .Parse(..) e convertTo(..) .sono gli stessi del c# , il framework e' quello Per cui digita la tua variabile e vedi cosa ti da l'intellisense e leggi anche che cosa vuole la funzione e cosa ti restitusce , c'e' anche la guida online per le conversioni ti tipo .... poi le pubblichi In linea di massima , per visualizzare un qualsiasi tipo numerico c'e' il metodo .ToString(...formattazione...) che eredita da object e che è overridato da tutti gli oggetti del framework Da stringa a numerico ci sono i vari parseToInt().....ParseTodouble() ect ect Modificato: 15 febbraio 2015 da walterword
SabinoDelia Inserita: 15 febbraio 2015 Autore Segnala Inserita: 15 febbraio 2015 (modificato) Scusate il ritardo allora per quanto riguarda la lettura di più ingressi analogici e visualizzarli in label su visual basic ho risolto così: Arduino: int y; long previousMillis = 0; long interval = 1000; void setup() { Serial.begin(9600); } void loop() { y= analogRead(A0); Serial.print("[at]0#"); Serial.println(y); y= analogRead(A1); Serial.print("[at]1#"); Serial.println(y); y= analogRead(A2); Serial.print("[at]2#"); Serial.println(y); } Visual Basic: Public Class Form1 Dim an0, an1, an2 As String Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load SerialPort1.Close() SerialPort1.PortName = "COM3" SerialPort1.Open() End Sub Private Sub SerialPort1_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived Dim str, port, val As String str = SerialPort1.ReadLine ' ricevo [at]x#val port = Mid$(str, 2, 1) ' carattere numero 2, è quale analogico val = Mid$(str, 4) ' dal carattere 4 c'e' il valore Select Case port Case "0" : an0 = val Case "1" : an1 = val Case "2" : an2 = val End Select End Sub Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick Label0.Text = an0 Label1.Text = an1 Label2.Text = an2 End Sub End Class Con questo metodo sembra funzionare solo che è un po lento in pratica quando ad esempio A0 è ormai ritornato a zero il software che ho fatto con visual basic e quindi il Label0 mi visualizza ancora un valore precedente. Come posso rimediare? Modificato: 15 febbraio 2015 da SabinoDelia
simuffa Inserita: 15 febbraio 2015 Segnala Inserita: 15 febbraio 2015 come mai non aggiorni il testo nelle label all'interno dell'evento DataReceived e utilizzi un timer?
Livio Orsini Inserita: 15 febbraio 2015 Segnala Inserita: 15 febbraio 2015 Walter ricordavo bene per le conversioni, che per altro son quasi identiche a quelle di Vb. Dovresti usare un interrupt sulla ricezione, cosìda attivare il tutto quan do il buffer ha inserito almeno un carattere. Se usi un timer il tempo di aggiornamento lo detta lui.
Messaggi consigliati
Crea un account o accedi per commentare
Devi essere un utente per poter lasciare un commento
Crea un account
Registrati per un nuovo account nella nostra comunità. è facile!
Registra un nuovo accountAccedi
Hai già un account? Accedi qui.
Accedi ora