Problema Arduino e Processing

Buonasera,

ho bisogno di plottare su un grafico i vari dati che mi da arduino a cui sono collegati 5 sensori. Ho provato a importare i log in excel e a fare un grafico ma il pc mi si impalla e poi ho bisogno di una cosa in real-time.
il mio codice arduino semplificato è questo:

#include "DHT.h"
DHT dht;
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
#define TEMPERATURE_PRECISION 9

OneWire oneWire(ONE_WIRE_BUS);

DallasTemperature sensors(&oneWire);

DeviceAddress scaldiglie, salamacchine;

void setup()
{
  Serial.begin(9600);
  Serial.println();
  sensors.begin();
   if (!sensors.getAddress(scaldiglie, 0)) Serial.println("Unable to find address for Device 0"); 
   if (!sensors.getAddress(salamacchine, 1)) Serial.println("Unable to find address for Device 1"); 
  sensors.setResolution(scaldiglie, TEMPERATURE_PRECISION);
  sensors.setResolution(salamacchine, TEMPERATURE_PRECISION);
  dht.setup(3);
}

void loop()
{
// inizializzo i sensori
  delay(dht.getMinimumSamplingPeriod());
  sensors.requestTemperatures();
//eseguo misure
  float humidity = dht.getHumidity();
  float temperature = dht.getTemperature();
  int suolo = analogRead(A1);
  int sensorValue = analogRead(A0);
//per prova printo sulla seriale solo queste due misure
  float tempC2 = sensors.getTempC(scaldiglie);
  float tempC1 = sensors.getTempC(salamacchine);
  Serial.print(tempC2);
  Serial.print(",");
  Serial.println(tempC1);
  }

Ecco il codice processing che ho tirato fuori:

Questa è la prova per 2 linee

import processing.serial.*;

Serial myPort;        // The serial port
int xPos = 1;         // horizontal position of the graph 

//Variables to draw a continuous line.
int lastxPos=1;
int lastheight=0;

void setup () {
  // set the window size:
  size(600, 400);        

  // List all the available serial ports
  println(Serial.list());
  // Check the listed serial ports in your machine
  // and use the correct index number in Serial.list()[].

  myPort = new Serial(this, Serial.list()[1], 9600);  //

  // A serialEvent() is generated when a newline character is received :
  myPort.bufferUntil('\n');
  background(0);      // set inital background:
}
void draw () {
  // everything happens in the serialEvent()
}

void serialEvent (Serial myPort) {
  // get the ASCII string:
  String inString1 = myPort.readStringUntil(',');
  String inString2 = myPort.readStringUntil('\n');
  if (inString1 != null) {
    inString1 = trim(inString1);                // trim off whitespaces.
    float inByte1 = float(inString1);           // convert to a number.
    inByte1 = map(inByte1, 0, 1023, 0, height); //map to the screen height.
    inString2 = trim(inString2);                // trim off whitespaces.
    float inByte2 = float(inString2);           // convert to a number.
    inByte2 = map(inByte2, 0, 1023, 0, height); //map to the screen height.
    
    //Drawing a line from Last inByte to the new one.
    stroke(127,34,255);     //stroke color
    strokeWeight(4);        //stroke wider
    line(lastxPos, lastheight, xPos, height - inByte1); 
    lastxPos= xPos;
    lastheight= int(height-inByte1);
    
    stroke(35,50,255);     //stroke color
    strokeWeight(4);        //stroke wider
    line(lastxPos, lastheight, xPos, height - inByte2); 
    lastxPos= xPos;
    lastheight= int(height-inByte2);
    // at the edge of the window, go back to the beginning:
    if (xPos >= width) {
      xPos = 0;
      lastxPos= 0;
      background(0);  //Clear the screen.
    } 
    else {
      // increment the horizontal position:
      xPos++;
    }
  }
}

ecco cosa ottengo…

ma non riesco a capire dove sbaglio…

Ciao,
inizierei a farmi un print su processing per vedere che dati gli arrivano.
Il codice sembrerebbe ok.

Cmq io di solito sulla SerialEvent mi salvo tutto su una stringa:

String inString = myPort.readString();

e poi con split() mi estraggo i valori

ciao
per piu sensori dovresti splittare come nell'esempio "VirtualColorMixer":
e sembra che che hai messo variabili identiche per i 2 valori,
poi tuttie due i valori che vanno da 0 a height, credo si sormontino

pitusso:
Ciao,
inizierei a farmi un print su processing per vedere che dati gli arrivano.
Il codice sembrerebbe ok.

Cmq io di solito sulla SerialEvent mi salvo tutto su una stringa:

String inString = myPort.readString();

e poi con split() mi estraggo i valori

era quello che volevo fare anche io ma non conoscevo l'istruzione per farlo, grazie mille.

camperos:
ciao
per piu sensori dovresti splittare come nell'esempio "VirtualColorMixer":
e sembra che che hai messo variabili identiche per i 2 valori,
poi tuttie due i valori che vanno da 0 a height, credo si sormontino

Io, da ignorante, pensavo che height fosse una variabile fissa che indica l'altezza del riquadro che compare quando premo "play" su processing... comunque ottimo esempio, oggi pomeriggio faccio un po' di prove e vi faccio rispapere.

Quindi anche per disegnare due linee va bene line?
io all inizio pensavo che line fosse una specie di classe e che potessi creare varie linee tipo line1, line2 ecc ecc con i vari attributi ecc ecc ma mi sa che sto facendo un po' di confusione... :cold_sweat:

Calamaro:
era quello che volevo fare anche io ma non conoscevo l'istruzione per farlo, grazie mille.

scusa ho letto male, pensavo tu mi avessi scritto una funzione tipo

-leggo sulla seriale
-scrivo a schermo quello che ho letto

ancora non avevo il cervello in funzione! :cold_sweat:

14:30:57	38.0	26.0	63	58.50	29.00	262
14:30:58	39.0	26.0	63	58.50	29.00	262
14:30:59	39.0	26.0	63	58.50	29.00	262
14:31:0	38.0	26.0	62	58.50	29.00	262
14:31:1	38.0	26.0	62	58.50	29.00	262
14:31:3	38.0	26.0	62	58.50	29.00	262
14:31:4	38.0	26.0	62	58.50	29.00	262
14:31:5	38.0	26.0	62	58.50	29.00	262
14:31:6	39.0	26.0	62	58.50	29.00	264
14:31:7	39.0	26.0	62	58.50	29.00	262

sulla seriale ho questo e ho scritto il codice sotto su processing per vedere cosa legge...

 import processing.serial.*;
 Serial myPort;
 float[] value = new float[7];
 
 void setup() {
 size(200, 200);
 println(Serial.list());
 myPort = new Serial(this, Serial.list()[1], 9600);
 myPort.bufferUntil('\n');
 }
 
 void serialEvent(Serial myPort) {
 String inString = myPort.readStringUntil('\n');
   if (inString != null) {
     inString = trim(inString);
     value = float(split(inString, ","));
     println(value[1]);
     }
 }
 void draw(){
 }

Ma mi da

Error, disabling serialEvent() for COM null

EDIT ci sono riuscito

 import processing.serial.*;
 Serial myPort;
 int pos_vect = 2;
 float[] value = new float[pos_vect];
 
 void setup() {
 size(200, 200);
 println(Serial.list());
 myPort = new Serial(this, Serial.list()[1], 9600);
 myPort.bufferUntil('\n');
 }
 
 void serialEvent(Serial myPort) {

     String inString1 = myPort.readStringUntil(',');
     String inString2 = myPort.readStringUntil('\n');
   if (inString1 != null) {
     inString1 = trim(inString1);
     inString2 = trim(inString2);
     print(inString1);
     print("\t");
     println(inString2);
     }
 }
 void draw(){
 }

ora rimane il problema di plottarli e di togliere la virgola davanti al primo numero

COM3 COM7
58.50,	29.00
58.50,	29.00
58.50,	29.00
58.50,	29.00
58.50,	29.00

Io uso una “com” sola per due serie di dati per farlo faccio sommare ad arduino ad uno dei dati un valore fuori dal grafico che poi faccio sottrarre a processing se vuoi ti posto i codici il mio ha anche lo sfondo in jpg 8).
Basta che imposti la “com” corretta

dimmer_per_boiler_3.ino (4.64 KB)

Sfondo_per_grafico.pde (2.11 KB)

grazie capitankevin ma ho risolto :smiley:

 import processing.serial.*;
 Serial myPort;
// int pos_vect = 2;
// float[] value = new float[pos_vect];
 int xPos = 1;         // horizontal position of the graph

 void setup() {
 size(800, 600);        
 background(0);
 println(Serial.list());
 myPort = new Serial(this, Serial.list()[1], 9600);
 myPort.bufferUntil('\n');
 }
 
 void serialEvent(Serial myPort) {

     String t1 = myPort.readStringUntil('\t');
     String t2 = myPort.readStringUntil('\t');
     String t3 = myPort.readStringUntil('\t');
     String humA = myPort.readStringUntil('\t');
     String humS = myPort.readStringUntil('\t');
     String CO2 = myPort.readStringUntil('\n');
   if (t1 != null) {
     t1 = trim(t1);
     float t_1 = float (t1);
     t2 = trim(t2);
     float t_2 = float (t2);
     t3 = trim(t3);
     float t_3 = float (t3);
     humA = trim(humA);
     float hum_A= float (humA);
     humS = trim(humS);
     float hum_S = float (humS);
     CO2 = trim(CO2);
     float CO_2 = float (CO2);

     print(t1);
     print("\t");
     print(t2);
     print("\t");
     print(t3);
     print("\t");
     print(humA);
     print("\t");
     print(humS);
     print("\t");
     println(CO2);
 // Grafico T1 Scaldiglie Bianco
     t_1 = map(t_1, 0, 100, 0, height);
     stroke(255,255,255);
     strokeWeight(2);
     point(xPos, height - t_1);
//Grafico T2 SalaMacchine Acquamarina
     t_2 = map(t_2, 0, 100, 0, height);
     stroke(127,255,212);
     strokeWeight(2);
     point(xPos, height - t_2);
//Grafico T3 Serra Amaranto
     t_3 = map(t_3, 0, 100, 0, height);
     stroke(229,43,80);
     strokeWeight(2);
     point(xPos, height - t_3);
//Grafico humA umidità aria Ametista
     hum_A= map(hum_A, 0, 100, 0, height);
     stroke(153,102,204);
     strokeWeight(2);
     point(xPos, height - hum_A);
//Grafico humS umidità suolo Arancio
     hum_S = map(hum_S, 0, 1023, 0, height);
     stroke(255,153,0);
     strokeWeight(2);
     point(xPos, height - hum_S);
//Grafico CO2 -> CO2 :D Azzurro
     CO_2 = map(CO_2, 0, 1023, 0, height);
     stroke(0,127,255);
     strokeWeight(2);
     point(xPos, height - CO_2);
     
//controllo posizione su asse X
     if (xPos >= width) {
     xPos = 0;
     background(0);
     }
     else {
     xPos++;
     }

     
     
   } //if diverso da null
 } //Void
 void draw(){
   
   
 }

Che ne dite?

PS

penso che uno bravo riesca a mettere tutto in un array ma io sono ancora un nabbo in programmazione...