Vai al contenuto
PLC Forum


Domanda Su Arduino E Visual Basic-riunita con altra discussione


SabinoDelia

Messaggi consigliati

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

Link al commento
Condividi su altri siti


  • Risposte 78
  • Created
  • Ultima risposta

Top Posters In This Topic

  • SabinoDelia

    33

  • simuffa

    22

  • walterword

    11

  • Livio Orsini

    9

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

Link al commento
Condividi su altri siti

Con millis non ho capito come fare :huh:

E se faccio così:

int y;

void setup ()
{
  Serial.begin(9600);
}

void loop ()
{
  y= analogRead(A0);
  Serial.println(y);
  delay (1000);
}

Modificato: da SabinoDelia
Link al commento
Condividi su altri siti

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') :thumb_yello:

<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: da TeleMan
Link al commento
Condividi su altri siti

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 !!!

Link al commento
Condividi su altri siti

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 ?

Link al commento
Condividi su altri siti

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#"

Link al commento
Condividi su altri siti

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 :smile:

Per favore potete aiutarmi ?

ho più ingressi analogici e voglio mostrali in label su VB.NET
Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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. :toobad:

Link al commento
Condividi su altri siti

Prima domanda: i segnali analogici li spedisci regolarmente? Fai una verifica con un tool come Hyperterrminal.

seconda domanda : quanti caratteri ricevi sulla Comm?

Link al commento
Condividi su altri siti

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: da walterword
Link al commento
Condividi su altri siti

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: da SabinoDelia
Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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 account

Accedi

Hai già un account? Accedi qui.

Accedi ora

×
×
  • Crea nuovo/a...