android processing bluetooth invio/rice

salve
ho provato a simulare questo:

funziona modificando lo sketch di Arduino per fare funzionare la mia scheda bluetooth (seeedbtslave).
i dati vengono trasmessi e ricevuti.

il problema è che sul tablet, anzichè ricevere i dati del sensore (temperatura), mi scrive saltuariamente -8…-128.
ho simulato l’invio da 0 a 1023 anzichè la temperatura, il risultato è lo stesso.

il link sopra modifica lo skethch di un altro sito (con filmato, a lui funziona) provato, mi da lo stesso risultato, -8, - 128
dove sta l’inghippo ?
ciao

edit
dal lato arduino i dati escono giusti, provato con monitor serial,
lato processing (link sopra) le righe che interessano sono dal
247 al 258

magari è il sensore che butta fuori quei valori, il perchè lo dovresti scoprire dal datasheet

no, scatta da -8 a -128, qualsiasi segnale invio, anche un testo non lo legge, solo i 2 numeri.
comunque, di esempi funzionanti da android processing via bluetooth ad arduino ce ne sono parecchi,
il contrario, da arduino ad android via bluetooth ce ne sono pochissimi e tutti non funzionanti.
rinuncio...
prendo uno shield wifi e ritento :slight_smile:

processing pc-arduino
processing android - arduino adk
funzionano correttamente per quello che voglio fare, non con bluetooth

era un problema di settaggio porta :zipper_mouth_face: :zipper_mouth_face:

ora però una domanda…
ho aggiunto 1 sensore, ora sono 2 , dalla parte di arduino ho modificato, ok.
dalla parte processing ho modificato semplicemente raddoppiando le voci e miracolo apparentemente funziona.

chi mi spiega come fa Processing a distingure i 2 valori e darli giusti rispettivamente :

parte <processing

 byte valor;
byte valor2;
------------------
{     
    while(ins.available() > 0)
    {
      valor = (byte)ins.read();
    valor2 = (byte)ins.read();
  }

arduino

#define  SENSOR  A0 
#define  SENSOR2  A1 
------------------------
void loop()
{
  int val;
  int val2;
  delay(256); 
  val = analogRead(SENSOR);  
  val2 = analogRead(SENSOR2);
  mySerial.write(val>>3);
  mySerial.write(val2>>3);

grazie :roll_eyes:

Ciao, sto creando un app Android che tramite blueTooth si connette ad Arduino.
I dati che invio ad Arduino vengono interpretati correttamente, mentre quelli che ricevo da Arduino spesso non rispecchiano lo sketch. Dovrei ricevere tempo|sensore1|sensore2, ma spesso mi arrivao stringhe del tipo |sensore1 oppure invece di tre me ne arrivano quattro...Che problemi hai avuto con la porta? potresti delucidarmi questo passaggio? Grazie mille :slight_smile:
Questo è lo sketch

long timeout=900000;
long  time=0;
char myChar = 'n';
long zero=0;

void setup() {

  Serial.begin(9600);
}


void loop() {
  if (Serial.available()) {

    myChar = Serial.read();
  }

  if (myChar=='n') {
    zero=millis();

  }

  if (myChar=='s') {
    time = (millis()-zero);
    Serial.print(time);

    int sensorValue1 = analogRead(A1);
    int sensorValue2 = analogRead(A2);
    Serial.print("|");
    Serial.print(sensorValue1);
    Serial.print("|");
    Serial.println(sensorValue2);
    // Serial.flush();

    if (time>timeout){
      zero=millis();
      myChar='n';
    }
  }
  delay(10);        
}

apri una nuova discussione, usa i tag code, e mostra il codice processing, che mi sa tanto che è quello ad essere buggato.

se stai facendo il mio stesso lavoro ti risparmio giorni…
comunque lascia perdere quanto detto sopra da me .

ora i sensori di temperatura funzionano egregiamente, in più hasnno un decimale dopo la virgola, in rete non trovi sketch funzionanti da prendere spunto.

il problema era che dalla parte processing accettava solo 0-255,
quindi max temperatura leggibile 25,5 gradi, e sotto zero segnava numeri strani.

però chiedo al forum una spiegazione in modo da capire meglio il funzionamento e il perchè XD XD XD

allora…funziona bene
si "splitta un sensore in 2 byte
poi lo si ricuce
i sensori sono 2 (anche questo é interessante)

arduino

  val = Thermister (analogRead (A0));   //lettura sensore
  val = val*10;  //moltiplica per farlo diventare intero es 25,2---->252 (tanks al forum)
  ciao = val ; //ciao è il risultato

val2 = Thermister (analogRead(A5));
  val2 = val2*10;
  motore = val2 ; 
 
////////////////// 
mySerial.write(ciao & 0xFF); ///primo byte primo sensore
  mySerial.write((ciao >> 8) & 0xFF); //secondo byte primo sensore
delay(25 );
  mySerial.write(motore & 0xFF); //terzo byte secondo sensore
  mySerial.write((motore >> 8) & 0xFF); //quarto byte secondo sensore

processing android

///////////////////
import java.io.InputStream;
InputStream ins;
////////////////////// 
  int b1=ins.read(); //lettura byte 1
    int b2=ins.read(); //lettura byte 2
    int b3=ins.read(); //lettura byte 3
    int b4=ins.read(); //lettura byte 4
    
    int low=b1 & 0xff;  
    int high=b2 & 0xff;   
   
     int lo=b3 & 0xff;
    int hig=b4 & 0xff; 
    
    ciao =  (short) (low | high << 8 );// incollaggio byte 1 e byte 2
  motore =  (short) (hig << 8 | lo);  incollaggio byte 3 e byte 4

la parte con "short" anziche  "int" serve per la virgola

spero di non aver scritto cavolate :roll_eyes:

prima volta che uso un forum, non so aprire una nuova discussione!
Sembra si ariuscita a manipolare i dati in arivo, ora non ne perdo manco uno e riesco a parsarli, ma cosa che prima funzionava e ora non più il grafico!!!
Mi spiego…ricevo stringhe del tipo time|dato io le parso e costruisco un point(time, dato) che vado a disegnare sul grafico utilizzando la libreria aChartEngine.
Posto il codice…

Ricezione dei dati dallo StringInput

private class ReadInput implements Runnable {

private boolean bStop = false;
private Thread t;

public ReadInput() {
t = new Thread(this, “Input Thread”);
t.start();
}

public boolean isRunning() {
return t.isAlive();
}

@Override
public void run() {
InputStream inputStream;

int bytes;

try {
inputStream = mBTSocket.getInputStream();
while (!bStop) {
byte buffer = new byte[256];
if (inputStream.available() > 0) {
bytes = inputStream.read(buffer);
int i = 0;
/*

  • This is needed because new String(buffer) is taking

  • the entire buffer i.e. 256 chars on Android 2.3.4

  • http://stackoverflow.com/a/8843462/1287554
    */
    for (i = 0; i < buffer.length && buffer != 0; i++) {

  • }*

  • // strInput string from arduino*

  • //final String strInput = new String(buffer, 0, i);*

  • h.obtainMessage(RECIEVE_MESSAGE, bytes, -1, buffer).sendToTarget();*

  • }*

  • }*

  • Thread.sleep(500);*

  • } catch (IOException e) {*

  • // TODO Auto-generated catch block*

  • e.printStackTrace();*

  • } catch (InterruptedException e) {*

  • // TODO Auto-generated catch block*

  • e.printStackTrace();*

  • }*

  • }*
    //fine run()

  • public void stop() {*

  • bStop = true;*

  • }*

  • }*
    dentro onCreate dell’Activity
    h = new Handler() {

  • public void handleMessage(android.os.Message msg) {*

  • switch (msg.what) {*

  • case RECIEVE_MESSAGE: // if receive massage*

  • byte readBuf = (byte) msg.obj;*

  • String strIncom = new String(readBuf, 0, msg.arg1); // create string from bytes array*

  • //Log.d(TAG, "strIncom: " +strIncom);*

  • sb.append(strIncom);*

  • String resta = sb.substring(0, sb.length());*

  • Log.d(TAG, "-----RESTA: " + resta);*

  • if (resta.length() > 0) {*

  • StringTokenizer st1 = new StringTokenizer(resta,*

  • “\r\n”);*

  • while (st1.hasMoreTokens()) {*

  • list.add(st1.nextToken());*

  • }*

  • }*

  • mBtnOff.setEnabled(true);*

  • mBtnOn.setEnabled(true);*

  • // sb.delete(0, sb.length()); // and clear*

  • for (String s : list) {*

  • Log.d(TAG, "-------------------Stringhe di resta: "*

    • s);*
  • if (s.contains("|") && !s.contains("\n") && !s.startsWith("|") && !s.endsWith("|")) {*

  • StringTokenizer parse = new StringTokenizer(s, “|”);*

  • while (parse.hasMoreTokens()) {*

  • String time = parse.nextToken();*

  • String data = parse.nextToken();*

  • Log.d(TAG, ">>>>>TIME: " + time+ " >>>DATA: " + data);*

  • int timeMilliseconds = Integer.parseInt(time);*

  • Log.d(TAG, "Millisecondi: "+ timeMilliseconds);*

  • double timeSeconds = (timeMilliseconds / 1000.0);*

  • Log.d(TAG, "Secondi: " + timeSeconds);*

  • point = new Point(timeSeconds, Integer.parseInt(data));*

  • //point.setTime(timeSeconds);*

  • //point.setStrength(Integer.parseInt(data));*

  • Log.d(TAG, "Tempo: " + point.getTime()+ "\tForza: " + point.getStrength());*

  • // draw graph*

  • thread = new Thread() {*

  • public void run() {*

  • //for(int i = 1; i <= 10000; i++){*

  • Log.d(TAG, “>>>>>>>>>>>>>>>>>>>>>>>>>>DENTRO THREAD!!!”);*

  • try {*

  • Thread.sleep(2000);*

  • } catch (InterruptedException e) {*

  • // TODO Auto-generated catch block*

  • e.printStackTrace();*

  • }*

  • line.addNewPoints(point);*

  • view.repaint();*

  • //}*

  • }*

  • };*

  • thread.start();*

  • }*

  • }*

  • }*

  • break;*

  • }*

  • }*

  • };*
    Vi prego sto uscendo pazza!!!