Vai al contenuto
PLC Forum


Domanda Su Arduino E Visual Basic-riunita con altra discussione


SabinoDelia

Messaggi consigliati


  • Risposte 78
  • Created
  • Ultima risposta

Top Posters In This Topic

  • SabinoDelia

    33

  • simuffa

    22

  • walterword

    11

  • Livio Orsini

    9

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" : Label0.Text = val
            Case "1" : Label1.Text = val
            Case "2" : Label2.Text = val
        End Select
    End Sub

End Class
Link al commento
Condividi su altri siti

Ma forse il problema è il rinfresco delle lables che richiama a tempo con il timer, scrivendole come hai esemplificato tu dovrebbe eliminare il ritardo

Link al commento
Condividi su altri siti

io fossi in te i tre valori in arduino li concatenerei e farei un unico println da seriale, con vb riceverei in una volta tutti i valori e li suddividerei nelle label.

Link al commento
Condividi su altri siti

Ho risolto, ora la visualizzazione si può dire che è immediata ho aggiunto un ritardo ad ogni trasmissione

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()
{
y= analogRead(A0);
Serial.print("[at]0#"); Serial.println(y);
delay (200);
y= analogRead(A1);
Serial.print("[at]1#"); Serial.println(y);
delay(200);
y= analogRead(A2);
Serial.print("[at]2#"); Serial.println(y);
delay(200);
  }
Modificato: da SabinoDelia
Link al commento
Condividi su altri siti

int y;
string valori;
long previousMillis = 0;        
long interval = 1000;          
void setup() 
{
       Serial.begin(9600); 
}
void loop()
{
    valori=analogRead(A0)+","+analogRead(A1)+","+analogRead(A2);
    Serial.println(valori);
    delay(500);
}

mentre in visual basic dividi la stringa con substring

se hai risolto meglio :thumb_yello:

Link al commento
Condividi su altri siti

Ora ho solo questo problema: #17

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

supponiamo che la string analogic contenga -23°C
potresti risolvere così


If Integer.Parse(analogic.Replace("°C","")) < 3 Then 
Label4.text = "Allerta Ghiaccio"
End If

mi scuso se ho sbagliato la sintassi, ma ora non ho VB per provare e sto facendo a mente

Link al commento
Condividi su altri siti

se hai piu forms di visualizzazione devi implementare un evento e delegato oppure un design pattern Observer .

Nellevento comm della seriale di arrivano i dati , li converti , li processi e poi invochi gli update dei vari form di visualizzazione

Se invece il form di visualizzazione e' quello di ricezione allora fai i refresh con textxbox[nome].caption=dato.toString()

Link al commento
Condividi su altri siti

Ho risolto così:

 Public Class Form1
    Dim analogic As String
    Dim analogic2 As Integer

If analogic2 < 300 Then
            Label4.Text = "Allerta Ghiaccio"
        Else
            Label4.Text = ""
        End If

Ora funziona ;)


Adesso mi servirebbe trovare il valore massimo e il valore minimo nella variabile analogic2 come faccio ?

Link al commento
Condividi su altri siti

ahah non capisco come faccia a funzionare e cosa ci sia in analogic2 comunque se per te va bene, va bene anche per me :superlol:

per il minimo e il massimo:

confronti il valore attuale col valore minimo [massimo] memorizzato, inizializzi le variabili minimo a 1000°C e massimo a -1000°C così la prima volta vengono sovrascritti

se il valore della variabile analogica è minore [maggiore] del minimo [massimo] sostituisci il valore nelle variabili

Link al commento
Condividi su altri siti

scusami ma non ho capito, io devo: trovare il valore massimo e il valore minimo registrato ogni 24h in una variabile integer (analogic2) e scriverlo in label

Link al commento
Condividi su altri siti

ma sei sicuro che l'allerta ghiaccio funzioni? per me no, o almeno manca qualcosa

crei due variabili, massimo e minimo e le inizializzi ad un valore che non raggiungeranno mai (ad esempio massimo a -1000°C) in modo che vengano sovrascritte il primo ciclo

se il valore attuale è maggiore del massimo salvato metti il valore attuale nel massimo, altrimenti nulla.

se il valore attuale è minore del minimo metti il valore nel minimo.

se vuoi evitare di inizializzare le variabili con valori assurdi, puoi, il primo ciclo mettere il valore attuale di temperatura in massimo e minimo

per scriverlo in label non è il problema credo

Link al commento
Condividi su altri siti

        If max < analogic2 Then
            max = analogic2
        End If
        If min > analogic2 Then
            min = analogic2
        End If
        LabelMax.Text = max.ToString() + "°C"
        LabelMin.Text = min.ToString() + "°C"

per il reset e per il primo avvio basterà mettere

max = min = analogic2
Link al commento
Condividi su altri siti

Hai ragione ! :lol: La minima non mi funziona. <_<

Imports System.IO.Ports.SerialPort
Public Class Form1
    Dim analogic As String
    Dim analogic2 As Integer

    Private Property max As Integer

    Private Property min As Integer

    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
        analogic2 = SerialPort1.ReadLine
    End Sub

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        Label1.Text = analogic
        Label3.Text = "°C"
        If analogic2 < 300 Then
            Label4.Text = "Allerta Ghiaccio"
        Else
            Label4.Text = ""
        End If
        If max < analogic2 Then
            max = analogic2
        End If
        If min > analogic2 Then
            min = analogic2
        End If
        Label5.Text = max.ToString() + "°C"
        Label6.Text = min.ToString() + "°C"
    End Sub

    Private Sub Label5_Click(sender As Object, e As EventArgs) Handles Label5.Click

    End Sub
End Class
Link al commento
Condividi su altri siti

dentro form load metti

max=-1000

min=1000

al primo dato ricevuto vanno a posto, se vuoi fare qualcosa di più complesso (senza i valori 1000.. fammi sapere)

il 300 comunque mi suona strano :smile:

Modificato: da simuffa
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...