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