// ----------------------------------------
// Programm: M5_Stick_Wasserwaage.ino
// Aufgabe:  Lagesensor als Neigungsanzeige
// Autor:    R. Hoermann  m5.8266.de
//           inspiriert von draeger-it.blog/eine-digitale-wasserwaage-mit-dem-m5stickc
// Version:  2021-01-05
// Hardware: M5-Stick C mit MPU6886
//           +----------------------+
//           |ESP32 +-------------+ |
//           |      | LCD 160x80  | |
//           |BtnA  | 64k Farben  | |
//           |      +-------------+ |
//           |            BtnB      |
//           +----------------------+
// ----------------------------------------

#include     // Bibliothek einbinden

#define i_yc        40   // Y-Koordinate des Kreises=Halbe LCD Hoehe
#define radius      28   // Radius der Bubble
#define INTERVAL   250   // Update-Interval in Millisec
#define col_bg     GREEN // Hintergrundfarbe
#define col_bubble WHITE // Bubble-Farbe

float f_accX=0, f_accY=0, f_accZ=0; //FliesskommaVariblen fuer Sensorwerte
int   i_xcold=80;        // Alte x-Position des Bubble-Kreises
long  l_mslast=0;        // Zeitpunkt des Letzten Updates der Sensordaten

void update_Bubble()     // Sensorwerte einlesen und Bubble neu zeichnen
{
  M5.MPU6886.getAccelData(&f_accX, &f_accY, &f_accZ);
  int i_xcnew=round(f_accY * 1000) + 80;
  M5.Lcd.fillCircle(i_xcold,i_yc,radius,col_bg);
  M5.Lcd.fillCircle(i_xcnew,i_yc,radius,col_bubble);
  M5.Lcd.drawLine( 50, 0,  50, 80, BLACK);
  M5.Lcd.drawLine(110, 0, 110, 80, BLACK);
  String s=String(f_accY*90,1); while(s.length()<6){s=" "+s;}
  M5.Lcd.drawRightString(s,160,0,1);  // Anzeige der Neigung -90 .. +90
  i_xcold=i_xcnew; l_mslast=millis();
}

void setup() 
{
  M5.begin();            // Den M5-Stick initialisieren
  M5.Lcd.setRotation(3); // Displays um 90° drehen
  M5.MPU6886.Init();     // Den 6 Achsenlagesensor MPU6886 initalisieren
  M5.Lcd.drawCentreString("Wasserwaage",80,30,4);
  M5.Lcd.drawCentreString("Version 2021-01-05",80,60,2);
  while(millis()<5000)   // nach 5 sec gehts weiter oder durch Tastendruck
  { M5.update(); if( M5.BtnA.wasPressed() || M5.BtnB.wasPressed() ){break;} }
  M5.Lcd.fillScreen(col_bg); // Hintergrundfarbe fuer Bildschirm
  M5.Lcd.setTextColor(BLACK,col_bg); // Textfarbe,Hintergrundfarbe
}

void loop() 
{
  if(millis()-l_mslast>INTERVAL){update_Bubble();}
}