Ho realizzato con un hmc5883 e lcd16x2 una bussola per il puntamento della parabola motorizzata del camper ma in nessun modo sono riuscito a compensare il fatto che il sensore non sempre è in perfetta bolla, di conseguenza anche la lettura non è precisa al 100%.
Cosa devo modificare o aggiungere al codice?
#include <HMC5883L.h>
#include <Wire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
#define Addr 0x1E // 7-bit address of HMC5883 compass
void setup() {
lcd.begin(16, 2);
Wire.begin();
Serial.begin(9600);
// Set operating mode to continuous
Wire.beginTransmission(Addr);
Wire.write(byte(0x02));
Wire.write(byte(0x00));
Wire.endTransmission();
}
void loop() {
int x, y, z, k;
// Initiate communications with compass
Wire.beginTransmission(Addr);
Wire.write(byte(0x03)); // Send request to X MSB register
Wire.endTransmission();
Wire.requestFrom(Addr, 6); // Request 6 bytes; 2 bytes per axis
if (Wire.available() <= 6) { // If 6 bytes available
x = Wire.read() << 8 | Wire.read();
z = Wire.read() << 8 | Wire.read();
y = Wire.read() << 8 | Wire.read();
}
//Print out values of each axis
Serial.print("x: ");
Serial.print(x);
Serial.print(" y: ");
Serial.print(y);
Serial.print(" z: ");
Serial.println(z);
lcd.setCursor(0, 0);
lcd.print(" BUSSOLA");
// Display the angle in LCD with respect to Nord
float h = atan2(x, y) / 0.0174532925;
if (h < 0) h += 360;
h = 360 - h;
lcd.setCursor(1, 1);
k = int(h);
lcd.print(k);
lcd.print((char)223);
if ( k > 337)
{
lcd.setCursor(6, 1); lcd.print("Nord"); lcd.setCursor(13, 0); lcd.print("-");lcd.print((char)126);
}
else
{
if (k > 23 && k <= 67)
{
lcd.setCursor(6, 1); lcd.print("Nord-Est");lcd.setCursor(13, 0); lcd.print((char)127);lcd.print("-");
}
else
{
if (k > 67 && k < 112)
{
lcd.setCursor(6, 1); lcd.print("Est");lcd.setCursor(13, 0); lcd.print((char)127);lcd.print("-");
}
else
{
if (k > 112 && k < 158)
{
lcd.setCursor(6, 1); lcd.print("Sud-Est");lcd.setCursor(13, 0); lcd.print((char)127);lcd.print("-");
}
else
{
if (k > 158 && k < 202)
{
lcd.setCursor(6, 1); lcd.print("Sud");lcd.setCursor(12, 0); lcd.print((char)127);lcd.print("-");lcd.print((char)126);
}
else
{
if (k > 202 && k < 248)
{
lcd.setCursor(6, 1); lcd.print("Sud-Ovest");lcd.setCursor(13, 0); lcd.print("-");lcd.print((char)126);
}
else
{
if (k > 248 && k < 293)
{
lcd.setCursor(6, 1); lcd.print("Ovest");lcd.setCursor(13, 0); lcd.print("-");lcd.print((char)126);
}
else
{
if (k > 293 && k < 337)
{
lcd.setCursor(6, 1); lcd.print("Nord-Ovest");lcd.setCursor(13, 0); lcd.print("-");lcd.print((char)126);
}
else
{
if (k <= 23)
lcd.setCursor(6, 1); lcd.print("Nord"); lcd.setCursor(13, 0); lcd.print((char)127);lcd.print("-");
}
}
}
}
}
}
}
}
delay(200);
lcd.clear();
}