M5-Stick-Neigungsensor als Wasserwaage
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
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