android arduino ADK temperatura con virgola (Risolto)

(principiante)
buongiorno
con sistema ADB riesco a far comunicare Android con Arduino e Processing

collegato i sensori di temperatura ad arduino,
la temperatura su android li leggo a numeri interi, 21 gradi, 22 gradi ecc

mentre li vorrei come su lcd, 21,1....21,2 ecc...
penso che il problema si nel "uint" di arduino.

codice arduino 1.0.5

/*
  Basic Communication Example

  this is the easiest example to try out with the Arduino ADK board
  using the ADB communication scenario. It sends data from an analog
  sensor plugged on pin A0 to the phone and reads touches from the
  phone screen into the Arduino board execution analogWrite commands 
  to pin D11

  by Mads Hobye and Benjamin Weber from Illutron.dk and bw.nu
 */

#include <SPI.h>
#include <Adb.h>
#define MAX_RESET 8

 float Thermister(int RawADC) {
 float Temp;
 Temp = log(((10240000/RawADC) - 10000));
 Temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp ))* Temp );
 Temp = Temp - 273.15;            // Convert Kelvin to Celcius
 return Temp;
}

// Adb connection.
Connection * connection;

// Elapsed time for ADC sampling
long lastTime;
boolean r = true;

// Event handler for the shell connection. 
void adbEventHandler(Connection * connection, adb_eventType event, uint16_t length, uint8_t * data)
{
  int i;

  // Data packets contain two bytes, one for each servo, in the range of [0..180]
  if (event == ADB_CONNECTION_RECEIVE)
  {
   r = !r;
    analogWrite(9,data[0]);
    analogWrite(13,data[1]);
    Serial.println("sd");
  }
 

}

void setup()
{
 // pinMode(11, OUTPUT);
pinMode(9, OUTPUT);
 pinMode(13, OUTPUT);
  // Initialise serial port
  Serial.begin(57600);
  
  // Note start time
  lastTime = millis();


  // Initialise the ADB subsystem.  
  ADB::init();

  // Open an ADB stream to the phone's shell. Auto-reconnect
  connection = ADB::addConnection("tcp:4567", true, adbEventHandler);  
}

void loop()
{  
  if ((millis() - lastTime) > 20)
  {
    uint16_t data[5];
     
    
    data[0] = Thermister (analogRead(A0));
    data[1] = Thermister (analogRead(A1));
    data[2] = Thermister (analogRead(A2));
    data[3] = Thermister (analogRead(A3));
    data[4] = Thermister (analogRead(A4));
    data[5] = Thermister (analogRead(A5));
    
    //connection->write(2, (uint8_t*)&data);
    connection->write(12,(uint8_t*)&data); 
    
    Serial.println (data[0],DEC);
    Serial.println(data[1],DEC); 
    Serial.println (data[2],DEC);
    Serial.println(data[3],DEC);
    Serial.println (data[4],DEC);
    Serial.println(data[5],DEC);
    
    lastTime = millis();
  }

  // Poll the ADB subsystem.
  ADB::poll();
}

codice Processing 2.0.1

/*
  Basic Communication Example

  this is the easiest example to try out with the Arduino ADK board
  using the ADB communication scenario. It sends data from an analog
  sensor plugged on pin A0 to the phone and reads touches from the
  phone screen into the Arduino board execution analogWrite commands
  to pin D11

  by Mads Hobye and Benjamin Weber from Illutron.dk and bw.nu
 */

import java.io.IOException;
import android.util.Log;
private Server server;
private int sensorValue;

private int tempH2o;
private int tempEst;
private int tempMot;
private int tempBatt;
private int tempGas;
private int tempPan;

PImage prova, ciao, wing, metro1,vuoto,ball,winga,pneus,tachimetro,molla2,cp125,wingbianco,gas,batt,tanica;
color off = color(50);
color on = color(255);
PFont LiquidCristal,arial, Impact;

void setup()
{		
  orientation(LANDSCAPE);
  size(1000, 700,P3D);
 // smooth();
 orientation(LANDSCAPE);
  
 LiquidCristal = loadFont("LiquidCrystal-24.vlw");
 arial = loadFont("ArialMT-48.vlw");
 gas = loadImage("gas.gif"); 
 Impact = createFont("Impact", 32);
 
  // Create TCP server
  server = null;
  try
  {
    server = new Server(4567);
    server.start();
  } 
  catch (IOException e)
  {
    println(e.toString());
  } 

  this.server.addListener(new AbstractServerListener() {

    @Override
      public void onReceive(Client client, byte[] data)
    {

      if (data.length<12) return;

      tempH2o = (data[0] & 0xff) | ((data[1] & 0xff) << 8);
 tempEst = (data[2] & 0xff) | ((data[3] & 0xff) << 8);
 tempMot =  (data[4] & 0xff) | ((data[5] & 0xff) << 8);
 tempBatt =  (data[6] & 0xff) | ((data[7] & 0xff) << 8);
 tempGas =  (data[8] & 0xff) | ((data[9] & 0xff) << 8);
 tempPan =  (data[10] & 0xff) | ((data[11] & 0xff) << 8);

};
  }
  );





}

void draw() 
{
  background(100,200,255);

   textFont(Impact, 48);
    fill(255, 100, 100);
 
 //text ("Buon Viaggio",300,400,300,300);
 image (gas, 650, 280, 90, 70);


String tempH20UnDec = nf(tempH2o,2,1);
    textFont(LiquidCristal, 34);
    fill(255, 0,0,255);
    text (tempH20UnDec, 520, 130);

String tempEstUnDec = nf(tempEst,2,1);
    textFont(LiquidCristal, 34);
    fill(255, 0,0,255);
    text (tempEstUnDec, 520, 200);
 

String tempMotUnDec = nf(tempMot,2,1);
    
    textFont(LiquidCristal, 34);
    fill(255, 0,0,255);
    text (tempMotUnDec, 520, 270);



String tempBattUnDec = nf(tempBatt,2,1);
    
    textFont(LiquidCristal, 34);
    fill(255, 0,0,255);
    text (tempBattUnDec, 520, 340);



String tempGasUnDec = nf(tempGas,2,1);
    
    textFont(LiquidCristal, 34);
    fill(255, 0,0,255);
    text (tempGasUnDec, 520, 410);



String tempPanUnDec = nf(tempPan,2,1);
    
    textFont(LiquidCristal, 34);
    fill(255, 0,0,255);
    text (tempPanUnDec, 520, 480);
 
}

cambiando il codice,
sostituendo "data[2]" con "temperatura,1" a monitor seriale vedo la temperatura con virgola.
ma non so come fare a ricevere tale dato lato processing

.............
float temperatura;
.............
void loop()
{  
  if ((millis() - lastTime) > 20)
  {
    uint16_t data[5];
     
    
    data[0] = Thermister (analogRead(A0));
    data[1] = Thermister (analogRead(A1));
    temperatura = Thermister (analogRead(A2));   //xxxxxxxxxxxxxxxxxxxxxxx
    data[3] = Thermister (analogRead(A3));
    data[4] = Thermister (analogRead(A4));
    data[5] = Thermister (analogRead(A5));
    
    //connection->write(2, (uint8_t*)&data);
    connection->write(12,(uint8_t*)&data); 
    
    Serial.print (data[0],DEC);
    Serial.print("    ");
    Serial.print(data[1],DEC); 
    Serial.print("    ");
    Serial.print (temperatura,1); //xxxxxxxxxxxxxxxxxxxxxxxxx
    Serial.print("    ");
    Serial.print(data[3],DEC);
    Serial.print("    ");
    Serial.print (data[4],DEC);
    Serial.print("    ");
    Serial.println(data[5],DEC);
    
    lastTime = millis();
  }

  // Poll the ADB subsystem.
  ADB::poll();
}

Prima di passare il dato moltiplica la temperatura per 10 oppure cento se vuoi 2 decimali.
Esempio:

data[0] = (Thermister (analogRead(A0)) * 10);

In questo modo passi il decimale come intero.

Poi al momento della lettura la ridividi per 10 e la stampi su LCD.
Devi rimettere mano al codice su Processing.

Grazie Paolo, questa sera provo

in pratica ,ad esempio ho un valore di 22.37 gradi,
quando processing lo riceve, nel migliore dei casi provati diventa 22
tagliando i decimali.

stando in arduino se faccio

data[0] = (Thermister (analogRead(A0))

mi ritorna 22, se lo moltiplico per 10 diventa 220.

per avere il dato giusto devo fare

float ciao;
ciao = (Thermister (analogRead(A0))

leggo sul monitor seriale 22.37

ma poi come lo invio per farlo leggere a Processing?

sbagliando ho provato fare:
data[0]= ciao;
mi invia 22

Fai come ti ha detto Paolo:

data[0] = ciao * 10;

data[] vedo che è di tipo int, non può contenere numeri con la virgola. ciao è float per cui può contenere 22.37 ma se assegni ciao a data[0] il compilatore passa solo la parte intera.

:slight_smile:
grazie Paolo, Grazie Leo
ora posso modificare lato processing

Comunque per evitare di rendere il codice illeggibile (ora lo capisci, se lo riprendi in mano fra 6 mesi non ci capirai poi nulla ]:smiley: ), metti un casting esplicito così non aiuti solo il compilatore a trattare correttamente i dati ma anche tu nella manutenzione del codice perché vedi subito cos'è che viene fatto.

data[0] = (uint16_t)(ciao * 10);