problema long, mancano 65535

problema Long via UDP:
stesso procedimento, via seriale i valori sono corretti,
via UDP mancano 65536 noccioline :.

via seriale funziona   
arduino
 long latitudine = 4512345;
 
   Serial.write (latitudine) ; 
   Serial.write ((latitudine) >>8 ) ;
    Serial.write ((latitudine) >>16 );
    Serial.write ((latitudine) >>24 );
   
//  lato processingprocessing

 if (myPort.available() >3){ 
   for (int i = 0; i < 4;i++){
   latLong [i] = myPort.read();
   }
 int a = (latLong[0]) ;
 int b = (latLong[1]  <<8);
 int c = (latLong[2]  <<16);
 int d = (latLong[3]  <<24);
 int latitudine = a+b+c+d; 
   println (latitudine);
 //stampa 4512345

via UDP non funziona

 //arduino (libreria wifiUdp)

 long latitudine = 4512345; 
 Udp.beginPacket( Udp.remoteIP(),  Udp.remotePort());
 Udp.write((latitudine) ) ;
 Udp.write((latitudine) >>8 ) ;
 Udp.write((latitudine) >>16 ) ;
 Udp.write((latitudine) >>24 ) ;
 Udp.endPacket();

//lato processing (libreria hypermedia.net)

 void receive( byte[] data ) {
int a  = (data[0] ) ;
 int b = (data[1]  <<8);
 int c = (data[2] <<16);
 int d = (data[3] <<24);
 int longitudine = a+b+c+d ;
 
println (longitudine);
//stampa  4446809, se aggiungo + 65536 esce giusto cioè 4512345
}

quale puo essere il problema ? sono due giorni che ci provo :~
che sia il procedimento del tutto sbagliato

Che vuol dire? Spiegati meglio

da arduino parte 4512345
a processing arriva 4446809

ma questo solo via UDP,

mentre via seriale, processing riceve il valore giusto, 4512345

Hai visto che tu parti con numeri di tipo long (4 byte) e poi metti il risultato in un dato di tipo int (2 byte)?

int latitudine

se ho ben capito int di processing è di 4 byte

comunque ho provato ancvhe con Long ma non cambia

edit: ok, provo con byte

camperos:
da arduino parte 4512345 a processing arriva 4446809 ma questo solo via UDP,
mentre via seriale, processing riceve il valore giusto, 4512345

4.512.345 - 0044DA59
4.446.809 - 0043DA59

sembra che perda 1 bit

grazie per le risposte.
provato con byte mi da valori sballati.
@nid69ita
cosa potrebbe essere, la libreria?
nel mio progetto utilizzo esclusivamente il sistema UDP, finora gli interascambi sono andati a buon fine,
ma questa è la prima volta che uso un numero lungo, Long

La mia è solo una annotazione, non conosco quella libreria. Comunque tu spedisci i dati con Udp.write() e se ci fossero dei problemi in quella istruzione, ogni byte dovrebbe perdersi un bit.
Ma hai provato a spedire un pò di volte con Udp? Arriva sempre lo stesso valore?

sempre lo stesso( 4446809) , viene inviato (4512345) ogni 2 secondi, ho provato per 3 minuti.

Se cambi formato da long ad unsigned long, perdendo i negativi, ma l'errore si presenta?

camperos:
//lato processing (libreria hypermedia.net)

Che libreria è ? Hai un link?
Qui su sito Processing: Libraries / Processing.org
tra le librerie l'unica Udp è questa: http://ubaa.net/shared/processing/udp/

hypermedia.net,
la usa come esempio anche arduino.
nel link sotto in "grigietto" c'è lo sketch di processing

si, alla fine la libreria è quella che è indicata su sito Processing che porta qui:
http://ubaa.net/shared/processing/udp/udp_method_send.htm
si vede nome hypermedia.net

Però qui quella libreria fa elenco delle funzioni (una specie di help), ma la write() non viene citata ?!?
http://ubaa.net/shared/processing/udp/udp_method_send.htm

in questo caso, processing riceve solamente, arduino con wifiUdp scrive
il punto è che non so se è arduino o processing che crea il problema

fermatevi.
ho cenato e quando sono tornato al pc ho visto i valori corretti, senza toccare nulla.
non mi spiego cosa possa essere successo.
ora spengo tutto e provo da "freddo"

no, no... non mi muovo :grin:

OT: ho visto il video che hai linkato, il cruscotto lo hai disegnato tu in Processing o hai usato una libreria. E' molto bello.

grazie :slight_smile:
nessuna libreria
il cruscotto è progettato e disegnato da me :slight_smile:
.nel mio progetto ho eliminato tutte le immagini jpg gif ecc in modo che lo sketch sia "puro",
nel caso lo devessi pubblicare non serve scaricare altro oltre lo sketch.
il problema è che continuo ad aggiungere funzioni e quindi non lo finisco mai.

ora..praticamente funzionante, manca poco da perfezionare ho aggiunto il GPS faxtrax,
sono riuscito a fare in modo che con cartografia googlemaps, oltre che su pc, su android (ingannando un pò)rilevo la posizione di arduino.

tornando al topic, forse qui c'e il mio stesso problema, per il momento in standby
http://forum.arduino.cc/index.php?topic=71030.0

OT: tachimetro

float lancettachiaree= 100;

void setup() {
  size (1000, 800);
  strokeCap (SQUARE); //lo stroke termina piatto
}

void draw() {
  background(0);
  textSize (width/48);
  pushMatrix();
  translate (width/2, width/3);
  fill(0);
  noStroke();
  ellipse (0, 0, width/2.6, width/2.6); 

  stroke (42, 22, 7);
  strokeWeight (width/100);
  arc ( 0, 0, width/2.6, width/2.6, PI/1.2, 2*PI+PI/5.7);

  noFill();
  stroke (255, 0, 0, 5);
  strokeWeight (width/12);
  for (int i = 0; i<51; i++) {
    arc ( 0, 0, width/4.5, width/4.5, 2*PI/2.4, 2*PI/(2.4 -0.013*i));
  } 
  stroke (255, 75, 33);
  for (int i=0;i<15; i++) {
    pushMatrix(); 
    rotate (radians (240+17.3*i));
    strokeWeight (width/200);
    line (  0, -width/6.5, 0, -width/5.7 );
    popMatrix();
  }
  for (int i=0;i<14; i++) {
    pushMatrix(); 
    rotate (radians (248.5+17.3*i));
    strokeWeight (width/400);
    line (  0, -width/6.2, 0, -width/5.7 );
    popMatrix();
  }
  for (int i=0;i<140; i++) {
    pushMatrix(); 
    rotate (radians (240+1.73*i));
    strokeWeight (width/800);
    line (  0, -width/6, 0, -width/5.7 );
    popMatrix();
  }
  pushMatrix(); 
  fill(255);
  text ("0", -width/8.5, width/13);
  text ("10", -width/7, width/25);
  text ("20", -width/7, 0);
  text ("30", -width/7.5, -width/25);
  text ("40", -width/ 8.5, -width/13);
  text ("50", -width/12, -width/10);
  text ("60", -width/20, -width/8.5);
  text ("70", -width/100, -width/8 );

  text ("140", width/12, width/13);
  text ("130", width/10, width/25);
  text ("120", width/9.5, 0);
  text ("110", width/10.5, -width/25);
  text ("100", width/13, -width/14);
  text ("90", width/16, -width/10);
  text ("80", width/40, -width/8.5);
  fill(150, 150, 150);
  text ("Litres", width/50, width/25);
  text ("Claire", -width/13, -width/30);

  stroke(255, 90, 40);
  strokeWeight(width/250); 
  rotate(radians(lancettachiaree));//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  line( 0, -width/16, 0, -width/6);
  stroke(100, 100, 100);
  noFill();
  triangle (0, -width/16, width/66, width/66, width/162, width/66);
  triangle (0, -width/16, -width/162, width/66, -width/66, width/66);
  noStroke();
  fill (51, 9, 111);
  ellipse (0, 0, width/66, width/66);
  popMatrix();
  popMatrix();
}

ho aggiunto la longitudine e il problema si è ripresentato,
ho inserito "unsigned" ma non cambia nulla

latitudine, processing ora stampa giusto (ardu 4554321) (proces 4554321)
longitudine, processing stampa sbagliato (ardu 954320) (proces 888528)

tenendo presente che la latitudine improvvisamente ha iniziato a stampare giusto, credo che ilproblema sia qualcosa nel mio pc.

 unsigned long latitudine =  4554321; 
 unsigned long longitudine =   954320;
 
 Udp.beginPacket( Udp.remoteIP(),  Udp.remotePort());
 Udp.write((latitudine));
 Udp.write((latitudine) >>8 ) ;
 Udp.write((latitudine) >>16 ) ;
 Udp.write((latitudine) >>24 ) ;
 
 Udp.write((longitudine));
 Udp.write((longitudine) >>8 ) ;
 Udp.write((longitudine) >>16 ) ;
 Udp.write((longitudine) >>24 ) ;
 Udp.endPacket();

processing

 int a = (data[0] ) ;
 int b = (data[1] <<8);
 int c = (data[2]<<16);
 int d = (data[3]<<24);
  latitudine = a+b+c+d; 
  
 int e = (data[4] ) ;
 int f = (data[5] <<8);
 int g = (data[6]<<16);
 int h = (data[7]<<24);
  longitudine = e+f+g+h;

  println (latitudine); // stampa 4512345
  println (longitudine);//stampa 888528

camperos:
OT: tachimetro

Grazie. Karma +1 :smiley:

Grazie 8)

ho rinunciato all'invio dati UDP con sistema binario, non ne vengo a capo.
ora sto trasferendo dati UDP con stringhe, sono 16 byte, volrvo risparmiarne 8 :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes:

OT:
al posto di "lancettechiaree" in rotate(radians
metti
mouseX/4-120

all'incirca il giro del tachimetro è 240 gradi, zero è il centro
il 4 divide il mouse in base alla larghezza del tuo schermo, individui la rotazione lancetta che da lato a lato sketch deve fare 240 gradi