Scrivere numero da processing a arduino

Buonasera ragazzi, avrei bisogno di aiuto.

Da qualche giorno ho iniziato a provare processing 2 per leggere le temperature mandate tramite arduino di due sonde DS18B20.

Fin qui tutto a posto, visto che la mia idea è quella di utilizzare le sonde e applicarle a mò di termostato, sto provando ad inviare da processing ad arduino un setpoint da mantenere.

Tramite controlP5 ho creato una textbox e un button con il quale inviare il valore nuovo di setpoint (poi lo rileggo sempre in processing e faccio un print per ricontrollarlo). I problemi che ho sono due, il primo è che se io scrivo per esempio 20, mi ritorna 50, scrivo 60 mi torna 54.
Il secondo problema è che non riesco a fare in modo che il setpoint che invio resti memorizzato in arduino, se scrivo un valore dopo poco torna a zero.

Aggiungo i codici lasciando anche quelli per la lettura dalla sonde se può tornare comodo a qualcuno, grazie in anticipo.

LATO ARDUINO

#include <OneWire.h>
#include <DallasTemperature.h>
#include <string.h>

// Data wire is plugged into pin 2 on the Arduino
#define ONE_WIRE_BUS 2

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

// Assign the addresses of your 1-Wire temp sensors.
DeviceAddress sensore1 = { 0x28, 0x4A, 0x25, 0x4C, 0x05, 0x00, 0x00, 0x49 };
DeviceAddress sensore2 = { 0x28, 0x52, 0x3A, 0x3D, 0x05, 0x00, 0x00, 0x87 };

void setup(void) {
  
 // start serial port
  Serial.begin(115200);
  
  // Start up the library
  sensors.begin();

  // set the resolution to 12 bit
  sensors.setResolution(sensore1, 12);
  sensors.setResolution(sensore2, 12);
}


void loop(void) { 

  int isteresi = 1;
  float letturaSeriale;
  
  sensors.requestTemperatures();

  float t_1 = sensors.getTempC(sensore1);
  float t_2 = sensors.getTempC(sensore2);
   
  if(Serial.available()>0) {     
       letturaSeriale = Serial.read();
  }

 Serial.print(letturaSeriale);
Serial.print(" ");
Serial.print("\n\r");

 delay(500);
}

LATO PROCESSING

import processing.serial.*;
import cc.arduino.*;
import controlP5.*;

Serial myPort;
PFont font;
ControlP5 cp5;

 String nuovoSP;

void setup() {
   
  myPort = new Serial(this, "COM5", 115200); //setto la porta COM
  myPort.bufferUntil('\n'); 
  cp5 = new ControlP5(this);
   
  size(700,400);  
  font = createFont(PFont.list()[2],32);  
  textFont(font);
  
       
  //INSERIMENTO LABEL SETPOINT SONDA 1
  cp5.addTextlabel("lbl_SP_sonda1")
      .setText("Setpoint sonda 1: ")
      .setPosition(160,125)
      .setColorValue(0xffffff00)
      .setFont(createFont("Georgia",20))
      ;
  
  //INSERIMENTO TEXTBOX 
   cp5.addTextfield("newSP")
     .setPosition(330,120)
     .setSize(100,40)
     .setFont(font)
     .setFocus(true)
     .setColor(color(255,0,0))
     ;


  //INSERIMENTO COMMANDBUTTON INVIO NUOVO SETPOINT
   cp5.addBang("INVIA_SP")
    .setPosition(450,120)
      .setSize(80, 40)
        .getCaptionLabel().align(ControlP5.CENTER, ControlP5.CENTER)
          ;   
}


//LEGGO I VALORI DALLA SERIALE
void serialEvent (Serial myPort){
String setpoint = myPort.readStringUntil(' ');
 println(setpoint);
 }

void draw() {
   
  background(100, 100, 100);
  fill(255, 255, 255);
  }  


public void INVIA_SP () {
  nuovoSP = cp5.get(Textfield.class, "newSP").getText();
  myPort.write(nuovoSP);
}

Ma dentro la INVIA_SP tu spedisci un testo di più di un carattere? Esempio 20 ovvero la cifra 2 e 0 ?
Credo di si. Addirittura ti aspetti di spedire un numero con le virgole.
Attenzione, perchè in Arduino tu leggi solo 1 carattere alla volta:

letturaSeriale = Serial.read();

NON leggi con quella istruzione tutto quello che spedisci. Esempio spedisci "20" ovvero '2' e poi '0'
Quindi ci sarà un momento in cui letturaSeriale ='2' carattere 2 ovvero codice in tabella ascii 50
subito dopo c'e' ancora un carattere, perciò letturaSeriale legge carattere '0' ovvero numero 48

'0'-> 48
'1'->49
'2'->50 etc.

Lato Arduino può esserti d'aiuto parseFloat()

Grazie per l'aiuto e grazie per il parseFloat(), con quello ho risolto, purtroppo è da meno di una settimana che smanetto con Arduino e le mie conoscenze sono vermente minime.

Ho risolto anche il discorso che dopo aver impostato il setpoint nuovo me lo riportava subito a zero, avevo dichiarato la variabile nel loop.

Bene! Puoi editare il titolo del topic mettendo [Risolto] e, se vuoi, puoi condividere i codici corretti perchè possano essere utili a chi trova un problema simile. Ciao.

Modificato :wink:

LATO ARDUINO

#include <OneWire.h>
#include <DallasTemperature.h>
#include <string.h>

// Data wire is plugged into pin 2 on the Arduino
#define ONE_WIRE_BUS 2

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

// Assign the addresses of your 1-Wire temp sensors.
DeviceAddress sensore1 = { 0x28, 0x4A, 0x25, 0x4C, 0x05, 0x00, 0x00, 0x49 };
DeviceAddress sensore2 = { 0x28, 0x52, 0x3A, 0x3D, 0x05, 0x00, 0x00, 0x87 };
  
float letturaSeriale;

void setup(void) {
  
 // start serial port
  Serial.begin(115200);
  
  // Start up the library
  sensors.begin();

  // set the resolution to 12 bit
  sensors.setResolution(sensore1, 12);
  sensors.setResolution(sensore2, 12);
}


void loop(void) { 

  int isteresi = 1;
  
  sensors.requestTemperatures();

  float t_1 = sensors.getTempC(sensore1);
  float t_2 = sensors.getTempC(sensore2);
   
 if(Serial.available()>0) {      
     letturaSeriale = Serial.parseFloat();
  }

 Serial.print(letturaSeriale);
Serial.print(" ");
Serial.print("\n\r");

 delay(500);
}

LATO PROCESSING

import processing.serial.*;
import cc.arduino.*;
import controlP5.*;

Serial myPort;
PFont font;
ControlP5 cp5;

 String nuovoSP;

void setup() {
   
  myPort = new Serial(this, "COM5", 115200); //setto la porta COM
  myPort.bufferUntil('\n'); 
  cp5 = new ControlP5(this);
   
  size(700,400);  
  font = createFont(PFont.list()[2],32);  
  textFont(font);
  
       
  //INSERIMENTO LABEL SETPOINT SONDA 1
  cp5.addTextlabel("lbl_SP_sonda1")
      .setText("Setpoint sonda 1: ")
      .setPosition(160,125)
      .setColorValue(0xffffff00)
      .setFont(createFont("Georgia",20))
      ;
  
  //INSERIMENTO TEXTBOX 
   cp5.addTextfield("newSP")
     .setPosition(330,120)
     .setSize(100,40)
     .setFont(font)
     .setFocus(true)
     .setColor(color(255,0,0))
     ;


  //INSERIMENTO COMMANDBUTTON INVIO NUOVO SETPOINT
   cp5.addBang("INVIA_SP")
    .setPosition(450,120)
      .setSize(80, 40)
        .getCaptionLabel().align(ControlP5.CENTER, ControlP5.CENTER)
          ;   
}


//LEGGO I VALORI DALLA SERIALE
void serialEvent (Serial myPort){
String setpoint = myPort.readStringUntil(' ');
 println(setpoint);
 }

void draw() {
   
  background(100, 100, 100);
  fill(255, 255, 255);
  }  


public void INVIA_SP () {
  nuovoSP = cp5.get(Textfield.class, "newSP").getText();
  myPort.write(nuovoSP);
}