conversione in gradi dell'accelerometro

buona sera a tutti gli amici di arduino,dopo svariati tentativi ed una accurata lettura delle lezioni trovate in rete sono riuscito finalmente a fa leggere il mio arduino uino ,la scheda lsm303 dlhc, adesso pero’ chiedo gentilmente aiuto come convertire in gradi i risultati visti sul display, escono numeri addirittura a quattro cifre.
uso scheda arduino uno;
scheda accelerometro LSM303DLHC;
lcd shield.

#include <LiquidCrystal.h>
LiquidCrystal lcd(8,9,4,5,6,7);
char report[80];
#include <LSM303.h>
#include <Wire.h>
LSM303::vector<int16_t> running_min = {32767, 32767, 32767}, running_max = {-32768, -32768, -32768};
LSM303 compass;
float dirIn = 0; // lettura bussola in gradi
int buffer = 16; // buffer letture accelerometro
float elevIn=0;  // lettura bussola elevazione




void setup() {
 Serial.begin(9600);
  lcd.begin(16, 2);              
  Wire.begin();

 pinMode (SDA,INPUT);
  pinMode (SCL,INPUT);
  pinMode(SDA,LOW);
  pinMode(SCL,LOW);
  compass.init();
  compass.enableDefault();
 




}

void loop() {
  snprintf(report, sizeof(report), "A:%6d%6d%6d                M:%6d%6d%6d",
    compass.a.x, compass.a.y, compass.a.z,
    compass.m.x, compass.m.y, compass.m.z);
  
   Wire.begin();
 
 
  lcd.setCursor(0,0);
  lcd.setCursor(0,1);
lcd.print(report);
 compass.read();
delay(200);
}

Prova ad usare map(, -32767, 32767, -18000, 18000)

Dovrebbe restituire la variabile int relativa all’asse X, Y, Z convertita in centesimi di grado.

Ciao Cyberhs, prima di tutto ti ringrazio per la tua disponibilità, ho provato in vari modi, ma mi da sempre errore, prima di tutti dice che map in cclass LSM303 does not name type. puoi, cortesemente scrivermi per esteso come devo inserire cio' che mi hai suggerito, e se lo devo fare dev o sostituirla con la stringa esistente? Grazie ancora per la tua cortese collaborazione.

Ho trovato questo sketch negli esempi di POLOLU: dovrebbe restituire i valori angolari con riferimento al versore usato.

#include <Wire.h>
#include <LSM303.h>

LSM303 compass;

void setup() {
  Serial.begin(9600);
  Wire.begin();
  compass.init();
  compass.enableDefault();
  
  /*
  Calibration values; the default values of +/-32767 for each axis
  lead to an assumed magnetometer bias of 0. Use the Calibrate example
  program to determine appropriate values for your particular unit.
  */
  compass.m_min = (LSM303::vector<int16_t>){-32767, -32767, -32767};
  compass.m_max = (LSM303::vector<int16_t>){+32767, +32767, +32767};
}

void loop() {
  compass.read();
  
  /*
  When given no arguments, the heading() function returns the angular
  difference in the horizontal plane between a default vector and
  north, in degrees.
  
  The default vector is chosen by the library to point along the
  surface of the PCB, in the direction of the top of the text on the
  silkscreen. This is the +X axis on the Pololu LSM303D carrier and
  the -Y axis on the Pololu LSM303DLHC, LSM303DLM, and LSM303DLH
  carriers.
  
  To use a different vector as a reference, use the version of heading()
  that takes a vector argument; for example, use
  
    compass.heading((LSM303::vector<int>){0, 0, 1});
  
  to use the +Z axis as a reference.
  */
  float heading = compass.heading();
  
  Serial.println(heading);
  delay(100);
}

Ciao cyberhs, gentilissimo, ho modificato questo skech e leggo sul display la bussola, riesco a leggere tutti i 360 gradi, però sto cercando uno skech che mi faccia visionare anche l'elevazione, visto che tutto questo lo sto realizzando per una parabola motorizzata per il mio camper, sto girando in rete ma non riesco a trovare nulla, hai qualche suggerimento? Grazie ancora per la tua collaborazione.

Quello sketch può misurare l’angolo formato dagli assi X, Y e Z del magnetometro (bussola) rispetto ad uno vettore di riferimento.

Di default misura l’angolo rispetto al vettore unitario (versore) parallelo all’asse Y e con verso opposto (0, -1, 0) (per il modello LSM303DLHC).

E’ possibile indicare un versore diverso, ad esempio parallelo all’asse Z e con verso concorde (0, 0, 1) con l’istruzione posta prima del compass.read():

compass.heading((LSM303::vector){0, 0, 1});

questo ti dovrebbe fornire l’elevazione richiesta.

cyberhs, non risponde, è sempre tutto uguale, mi da solo la bussola.

non ho capito bene, ma devo semplicemente inserire la voce compass.heading((LSM303::vector){0, 0, 1});
oppure devo variare qualcosa?
qualcuno puo’ essere cosi’ cortese a darmi una mano?

Questo è quello che si desume dallo sketch.

Non ho quel sensore, ma credo si debba fare così:

void loop() {
compass.heading((LSM303::vector){0, 0, 1});
compass.read();

Cosa ti restituisce il serialPrint(heading); ?

restituisce solo ed esclusivamente la bussola. Ho fatto numerose prove, io presumo che bisogna cambiare qualcosa nel " vector, almeno credo, ma non tutto ciò che inserisco mi da errore.

ciao cyberhs, ho trovato. funziona, int heading = compass.heading((LSM303::vector){0, 0, 1}); mi legge l’elevazione, però, mi dice che va in conflitto con la bussola che è float heading = compass.heading();
se li alterno, mi da l’elevazione e poi la bussola in gradi ed è abbastanza preciso, il fatto è che devo inserirli tutti e due sulle due righe del display.Come uscirne?

Devi misurare prima l’una e poi l’altra:

void loop() {

compass.heading((LSM303::vector){0, -1, 0}); // default
compass.read();
float inclinazione = compass.heading();

compass.heading((LSM303::vector){0, 0, 1});
compass.read();
float elevazione = compass.heading();