M5-Stick-Neigungsensor als Wasserwaage
Mit dem MPU6886 Chip hat der M5-Stick C einen Lage- und Beschleunigungssensor "onBoard".
Damit lässt sich ohne zusätzlichen Hardwareaufwand eine einfache Wasserwaage realisieren.
Die Idee dazu stammt von: draeger-it.blog/eine-digitale-wasserwaage-mit-dem-m5stickc
M5 AB

BASIC-Version:
Quellcode von M5_Sti_WasserWaage.ino
// ----------------------------------------
// 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 <M5StickC.h>    // 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();}
}
WasserWaage mit WebInterface:
Quellcode von M5_Sti_WasserWaage_WiFi.ino
// ----------------------------------------
// Programm: M5_Stick_Wasserwaage_WiFi.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    Y WiFi
//           +----------------------+  |
//           |ESP32                 o--+
//           |      +-------------+ |
//           |      | LCD 160x80  | |
//           |BtnA  | 64k Farben  | |
//           |      +-------------+ |
//           |            BtnB      |
//           +----------------------+
// ----------------------------------------

#include <M5StickC.h>    // Bibliothek einbinden
#include <WiFi.h>
#include <WebServer.h>

WebServer serv_WEB(80);
#include "html.h"

#define  WiFi_SSID "mySoHo-WiFi"  // <== CHANGE THIS !!
#define  WiFi_PASS "TopSecret"    // <== CHANGE THIS !!

#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=160;       // Alte x-Position des Bubble-Kreises
long  l_mslast=0;        // Zeitpunkt des Letzten Updates der Sensordaten

void wait_BtnA(String s,int ms=5000)
{
  long l_msw0=millis();
  M5.Lcd.drawCentreString("[ "+s+ " ]",80,64,2);
  while(true){ M5.update(); if(M5.BtnA.wasPressed()){break;} if(millis()-l_msw0>ms){break;}}
  M5.Lcd.fillScreen(TFT_BLACK);
}

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();
}

bool setup_WiFi(int i_countdown=20)
{
  uint16_t xc=M5.Lcd.width()/2;
  M5.Lcd.print("setup_WiFi");
  WiFi.begin(WiFi_SSID,WiFi_PASS);
  M5.Lcd.drawCentreString("Wait for Wi-Fi-Connect",xc,10,1); 
  M5.Lcd.drawCentreString(String(WiFi_SSID),xc,20,4); 
  while(i_countdown >0 ) 
  {
    if(WiFi.status() == WL_CONNECTED) 
    {
      M5.Lcd.fillScreen(TFT_BLACK);
      M5.Lcd.setTextColor(TFT_GREEN); 
      M5.Lcd.drawCentreString("myIP (byDHCP) from "+String(WiFi_SSID),xc,10,1); 
      M5.Lcd.drawCentreString(WiFi.localIP().toString(),xc,32,4);
      wait_BtnA("OK",3000);
      return true;
    }
    delay(500); String s=String(i_countdown); if(i_countdown<10){s="_"+s;} M5.Lcd.drawCentreString(s,xc,50,2); i_countdown--;
  }
  M5.Lcd.setTextColor(TFT_RED); M5.Lcd.drawCentreString("TIMEOUT",xc,50,2);
  wait_BtnA("RESTART",20000);
  ESP.restart();
}

void serv_HTML()
{
  String s=s_html; s.replace("%cx%",String(i_xcold)); s.replace("%rot%",String(-f_accY*90));
  serv_WEB.send(200,"text/html",s);
}

void serv_FAVICO(){ serv_WEB.send(200,"image/svg+xml",s_favicon); }

void serv_CSS()   { serv_WEB.send(200,"text/css",s_css);}

void setup() 
{
  M5.begin();            // Den M5-Stick initialisieren
  M5.Lcd.setRotation(3); // Display um 90° drehen
  M5.MPU6886.Init();     // Den 6 Achsenlagesensor MPU6886 initalisieren
  M5.Lcd.drawCentreString("Wasserwaage",80,20,4);
  M5.Lcd.drawCentreString("Version 2021-01-05",80,50,2);
  wait_BtnA("OK");
  setup_WiFi();
  serv_WEB.on("/",              serv_HTML);
  serv_WEB.on("/favicon.ico",   serv_FAVICO);
  serv_WEB.on("/_css/style.css",serv_CSS);
  serv_WEB.begin();
  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();}
  serv_WEB.handleClient();
}

Download Quelltexte gezippt mit html.h