Due o più ingressi analogici

Salve io dovrei leggere tramite Arduino più ingressi analogici ed inviarli a visual basic. con un solo ingresso l' ho già fatto e funziona bene. Qui i codici:

Arduino:

int y;
long previousMillis = 0;        
long interval = 1000;          

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

void loop()
{
  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > interval) {
      previousMillis = currentMillis;   
    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

Così funziona bene soltanto che come dicevo prima io devo leggere più ingressi analogici contemporaneamente ed inviarli su visual basic e leggerli in Label come il precedente. Se potete aiutarmi e farmi eventuali esempi, Grazie.

Da Arduino puoi spedirli uno dietro l’altro, ma in VB quando ricevi non sai bene quali stai ricevendo, perciò conviene anche spedire un numero che indica quale analogico stai spedendo. In pratica una specie di protocollo.
Esempio spedisci @0#34 per il primo analogico, @1#123 per il secondo e via di seguito. Da VB ricevi una linea di testo, che dovrai “analizzare”.

y= analogRead(A0);
Serial.print("@0#"); Serial.println(y);
y= analogRead(A1);
Serial.print("@1#"); Serial.println(y);
y= analogRead(A2);
Serial.print("@2#"); Serial.println(y);

E come faccio con visual basic a dirgli questo è il segnale analogico ("@0#") quindi scrivilo in Label1.text mentre invece questo è il segnale analogico ("@1#") quindi scrivilo in Label2.text ?

In VB dovrai avere più variabili analogic, una per ogni analogico/label

Dim an0, an1, an2 as string

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

Codice NON testato, l'ho scritto ma non provato

OK grazie, ho capito, dopo lo proverò e se invece voglio leggere su visual basic lo stato degli ingressi digitali ? Come devo procedere ? Il metodo è lo stesso ?

Si, direi lo stesso. Magari potresti spedire 2 msg diversi, per gli analogici Ax#val mentre per i digitali Dx#val

Altrimenti li spedisci separati con una ',' un ':' quello che vuoi e poi fai uno split lato Vb, otterrai valori che vengono messi in un array da 0 a n.

Serial.print(val_A0 + ","+ val_A1 +","+ val_A2....); qualcosa di simile https://msdn.microsoft.com/it-it/library/6x627e5f%28v=vs.90%29.aspx

Però leggere ingressi analogici contemporaneamente, si fa per dire, dovrai dare un piccolo ritardo tra una lettura e l'altra o ti ritrovi valori sballati.

ciao

nid69ita:
In VB dovrai avere più variabili analogic, una per ogni analogico/label

Dim an0, an1, an2 as string

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



Codice NON testato, l'ho scritto ma non provato

Ho fatto come mi hai detto tu e funziona solo che un po’ lento in pratica quando ad esempio A2 è zero il software mi visualizza che è ancora ad un valore precedente. come posso risolvere ?

quando ad esempio A2 è zero il software mi visualizza che è ancora ad un valore precedente. come posso risolvere

te l'ho scritto nel reply 8

non puoi leggere correttamente gli ingressi analog in sequenza in questo modo

y= analogRead(A0);
Serial.print("@0#"); Serial.println(y);
y= analogRead(A1);
Serial.print("@1#"); Serial.println(y);
y= analogRead(A2);
Serial.print("@2#"); Serial.println(y);

il chip ha un solo ADC devi dare il tempo all'elettronica di portarsi ai valori e stabilizzarsi, ti serve un millis() che legga a distanza di 100-200 ms e stai sul sicuro Fare 10 letture consecutive, ma fa perdere tempo al loop() se ne hai troppi

E come posso fare per ridurre almeno questo ritardo ? Devo dare un delay ad ogni analogRead ?

Su Arduino ho fatto così:

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);
  }

Ti è stato detto come fare, ora studiando e cercando con Google vedrai che trovi il modo

"arduino problemi letture analog" esempio qui http://forum.arduino.cc/index.php?topic=78956.0

E se aggiorno il testo nelle label all’interno dell’evento DataReceived invece che nel timer non si dovrebbe ridurre il ritardo ?

ce lo devi mettere un ritardo tra una lettura e l'altra non ridurlo ...

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