Skip to content

Technik Blog

Programmieren | Arduino | ESP32 | MicroPython | Python | Raspberry Pi | Raspberry Pi Pico

Menu
  • Smarthome
  • Arduino
  • ESP32 & Co.
  • Raspberry Pi & Pico
  • Solo Mining
  • Über mich
  • Deutsch
  • English
Menu

M5Stack BugC #3: steuern per WiFi-Verbindung

Posted on 28. Februar 202229. April 2023 by Stefan Draeger

In diesem Beitrag möchte ich dir nun zeigen, wie du den M5Stack BugC per WiFi Verbindung von einem Handy / Tablett oder Computer steuern kannst.

M5Stack BugC steuern per Webseite
M5Stack BugC steuern per Webseite

Im Beitrag M5Stack BugC #1 – Programmieren und erster Test habe ich dir bereits gezeigt, wie dieser in UI Flow programmiert werden kann.

In diesem Beitrag verwende ich die Arduino IDE zur Programmierung da die WiFi Verbindung speziell eingerichtet werden muss und dieses mit den Blöcken von UI Flow nicht möglich ist.

  • Benötigte Ressourcen für dieses Projekt
  • Wie soll die Steuerung des BugC per WiFi-Verbindung funktionieren?
  • Aufbau der Webseite
  • Arduino Sketch zum Steuern der Motoren

Benötigte Ressourcen für dieses Projekt

Für dieses Projekt benötigst du:

  • einen M5StickC,
  • ein USB Typ-C Datenkabel,
  • den M5Stack BugC

Du benötigst zusätzlich noch ein Handy, Tablett oder Computer mit Zugang zum WiFi Netzwerk.
Für dieses Projekt reicht ein altes, ausgedientes Handy wie zbsp. ein Samsung S3 völlig aus.

Wie soll die Steuerung des BugC per WiFi-Verbindung funktionieren?

Ich werde eine kleine Webseite programmieren, welche fünf Buttons / Schaltflächen enthält, welche für die Richtungen stehen, in welche der BugC fahren soll.

M5Stack BugC - WiFi Control via Website
Dieses Video auf YouTube ansehen.

Wenn die Schaltfläche mit dem Pfeil nach oben betätigt wird, soll der BugC sich im Uhrzeigersinn drehen und wenn die Schaltfläche nach rechts betätigt wird nach rechts fahren usw.

Aufbau der Webseite

Bauen wir zunächst die kleine Webseite in einem Editor auf. Da wir diese Webseite als Zeichenkette einbinden müssen, werden wir im Abschluss diese Seite über einen HTML Minifier komprimieren.

Webseite zum steuern des M5Stack BugC
Webseite zum steuern des M5Stack BugC

Die benötigten Ressourcen findest du auf meinem GitHub Repository unter StefanDraeger/m5Stack/bugc/wifi_controll/website/. Die JavaScript & CSS Dateien habe ich zusätzlich auf einer Subdomain gespeichert, so kann man recht einfach aus der HTML Datei darauf referenzieren und spart so noch etwas Speicherplatz auf dem Mikrocontroller.

  • jQuery – https://progs.draeger-it.blog/bugc/js/jquery.js
  • functions.js – https://progs.draeger-it.blog/bugc/js/function.js
  • styles.css – https://progs.draeger-it.blog/bugc/css/styles.css

Bei der Erstellung des HTML Codes muss darauf geachtet werden, keine doppelten Anführungszeichen zu verwenden, sondern einfache. Das liegt daran, dass wir ja diesen Text in eine String Variable auf Mikrocontroller speichern wollen.

Des Weiteren habe ich einen kleinen JavaScript Block implementiert, wo du deine IP-Adresse eintragen kannst, somit kannst du diesen Code aus dem Beitrag 1:1 auf deinen Mikrocontroller kopieren und musst hier lediglich die IP-Adresse anpassen.

<html>
   <head>
      <script src='https://progs.draeger-it.blog/bugc/js/jquery.js'></script>
      <script src='https://progs.draeger-it.blog/bugc/js/function.js'></script>
      <link rel='stylesheet' type='text/css' href='https://progs.draeger-it.blog/bugc/css/styles.css'/>
   </head>
   <script>
      var ipAdresse = '192.168.178.55';
   </script>
   <body>
      <h1 style='text-align:center;'>M5Stack BugC - WiFi Control</h1>
      <table style='width:400px; height: 400px;margin:0 auto;'>
         <tr>
            <td></td>
            <td><center><button type='button' id='topBtn'>&#8593;</button></center></td>
            <td></td>
         </tr>
         <tr>
            <td><center><button type='button' id='leftBtn'>&#8592;</button></center></td>
            <td><center><button type='button' id='stopBtn'>&#9723;</button></center></td>
            <td><center><button type='button' id='rightBtn'>&#8594;</button></center></td>
         </tr>
         <tr>
            <td></td>
            <td><center><button type='button' id='bottomBtn'>&#8595;</button></center></td>
            <td></td>
         </tr>
      </table>
   </body>
</html>   

In der Datei „functions.js“ schreiben wir nun unsere Funktion für den Aufruf der Befehle auf dem Mikrocontroller. Wir müssen quasi für jeden Tastendruck einen HTTP Request starten.

$( document ).ready(function() {
	console.log("ready");
	$("button").click(function() {
		var direction = "";
		switch ($(this).attr("id")){
			case "topBtn": direction = "forward"; break;
			case "bottomBtn": direction = "backward"; break;
			case "leftBtn": direction = "left"; break;
			case "rightBtn": direction = "right"; break;
			case "stopBtn": direction = "stop"; break;
		}
		console.log("move BugC to: " + direction);
		moveBugC(direction);
	});
});

function moveBugC(direction){
	var url = "http://"+ipAdresse+"/move?direction=" + direction;
	console.log("call: " + url);
	$.get(url);
}

Arduino Sketch zum Steuern der Motoren

Hier nun der Arduino Sketch / das Programm, welches auf dem M5StickC gespielt werden muss. Du benötigst zusätzlich noch die Bibliothek zum Steuern des BugC welche du im offiziellen GitHub Repository m5stack/M5StickC/examples/Hat/BUGC/ findest.

Den Sketch sowie die benötigen Ressourcen findest du zum Download auf dem GitHub Repository StefanDraeger/m5Stack/bugc/wifi_controll/ArduinoCode/BugCWiFiControl/

#include <M5StickC.h>
#include <WiFi.h>
#include <WebServer.h>
#include "bugC.h"

#define debug

//SSID aus dem Router
const char* ssid = "";
//Passwort für den Zugang zum WLAN
const char* password = "";

//Port auf welchem der Server laufen soll.
WebServer server(80);
//Servlet welches aufgerufen werden muss
//um die Funktionen als GET-Parameter
//zu übergeben
const String SERVLET = "/move";

//Funktionen
const String FORWARD = "forward";
const String BACKWARD = "backward";
const String LEFT = "left";
const String RIGHT = "right";
const String STOPP = "stop";

BUGC BugC;
//Farben für die LEDs
uint32_t COLOR_RED = 0x100000;
uint32_t COLOR_BLACK = 0x000000;


void callHandleAction();
String getPage();

void setup() {
  M5.begin();
  M5.Lcd.setTextColor(TFT_GREEN);
  M5.Lcd.setRotation(1);

  BugC.Init();

  // if add battery, need increase charge current
  M5.Axp.SetChargeCurrent(CURRENT_360MA);

  Serial.begin(115200);

  WiFi.begin(ssid, password);

  // Warten auf die WiFi Verbindung
  while (WiFi.status() != WL_CONNECTED) {
    delay(250);
    Serial.print(".");
  }

  //Wenn erfolgreich verbunden
  //die Daten auf der seriellen Schnittstelle ausgeben
  Serial.println("");
  Serial.print("Erfolgreich verbunden zu ");
  Serial.println(ssid);
  Serial.print("IP Adresse: ");
  Serial.println(WiFi.localIP());

  //Ausgeben der Adresse auf dem Display
  M5.Lcd.setTextSize(1);
  M5.Lcd.drawCentreString(WiFi.localIP().toString() + SERVLET, 45, 30, 2);

  //Server starten und warten auf Verbindungen
  server.begin(); // Starten des Servers.
  server.on(SERVLET, callHandleAction);
}

void loop() {
  server.handleClient();
}

void callHandleAction() {
  //behandeln der GET-Parameter
  Serial.println("callHandleAction");
  for (int i = 0; i < server.args(); i++) {
    String parameterName = server.argName(i);
    String parameterValue = server.arg(i);

#ifdef debug
    Serial.print("paramName: ");
    Serial.print(parameterName);
    Serial.print(" paramValue:");
    Serial.println(parameterValue);
#endif
    //Funktion abhandlen
    if (parameterValue == FORWARD) {
      drawText("F");
      lightUpLeds(COLOR_RED, COLOR_RED);
      moveBugC(100, 100, 100, 100);
    } else if (parameterValue == BACKWARD) {
      drawText("B");
      lightUpLeds(COLOR_RED, COLOR_RED);
      moveBugC(-100, -100, -100, -100);
    } else if (parameterValue == LEFT) {
      drawText("L");
      lightUpLeds(COLOR_RED, COLOR_BLACK);
      moveBugC(100, -100, 100, -100);
    } else if (parameterValue == RIGHT) {
      drawText("R");
      lightUpLeds(COLOR_BLACK, COLOR_RED);
      moveBugC(-100, 100, -100, 100);
    } else if (parameterValue == STOPP) {
      drawText("S");
      lightUpLeds(COLOR_BLACK, COLOR_BLACK);
      moveBugC(0, 0, 0, 0);
    }
  }
  M5.update();
  //Zum Schluss noch die Seite ausliefern
  server.send(200, "text/html", getPage());
}

void drawText(String text) {
  M5.Lcd.setRotation(0);
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setTextSize(3);
  M5.Lcd.drawCentreString(text, 45, 75, 2);
}

void lightUpLeds(uint32_t left, uint32_t right) {
  BugC.BugCSetColor(left, right);
}

void moveBugC(int speed0, int speed1, int speed2, int speed3) {
  BugC.BugCSetAllSpeed(speed0, speed1, speed2, speed3);
}

String getPage() {
  return "<html><head><script src='https://progs.draeger-it.blog/bugc/js/jquery.js'></script><script src='https://progs.draeger-it.blog/bugc/js/function.js'></script><link rel='stylesheet' type='text/css' href='https://progs.draeger-it.blog/bugc/css/styles.css'/></head><script>var ipAdresse='192.168.178.55';</script><body><h1 style='text-align:center;'>M5Stack BugC - WiFi Control</h1><table style='width:400px; height: 400px;margin:0 auto;'><tr><td></td><td><center><button type='button' id='topBtn'>&#8593;</button></center></td><td></td></tr><tr><td><center><button type='button' id='leftBtn'>&#8592;</button></center></td><td><center><button type='button' id='stopBtn'>&#9723;</button></center></td><td><center><button type='button' id='rightBtn'>&#8594;</button></center></td></tr><tr><td></td><td><center><button type='button' id='bottomBtn'>&#8595;</button></center></td><td></td></tr></table></body></html>";
}

Wenn nun das Programm gestartet wird, wird nach einer erfolgreichen Verbindung die Adresse auf dem Display angezeigt.

M5StickC mit Adresse für die WiFi Steuerung
M5StickC mit Adresse für die WiFi Steuerung

Schreibe einen Kommentar Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Fragen oder Feedback?

Du hast eine Idee, brauchst Hilfe oder möchtest Feedback loswerden?
Support-Ticket erstellen

Newsletter abonnieren

Bleib auf dem Laufenden: Erhalte regelmäßig Updates zu neuen Projekten, Tutorials und Tipps rund um Arduino, ESP32 und mehr – direkt in dein Postfach.

Jetzt Newsletter abonnieren

Unterstütze meinen Blog

Wenn dir meine Inhalte gefallen, freue ich mich über deine Unterstützung auf Tipeee.
So hilfst du mit, den Blog am Leben zu halten und neue Beiträge zu ermöglichen.

draeger-it.blog auf Tipeee unterstützen

Vielen Dank für deinen Support!
– Stefan Draeger

Kategorien

Tools

  • Unix-Zeitstempel-Rechner
  • ASCII Tabelle
  • Spannung, Strom, Widerstand und Leistung berechnen
  • Widerstandsrechner
  • 8×8 LED Matrix Tool
  • 8×16 LED Matrix Modul von Keyestudio
  • 16×16 LED Matrix – Generator

Links

Blogverzeichnis Bloggerei.de TopBlogs.de das Original - Blogverzeichnis | Blog Top Liste Blogverzeichnis trusted-blogs.com

Stefan Draeger
Königsberger Str. 13
38364 Schöningen

Tel.: 01778501273
E-Mail: info@draeger-it.blog

Folge mir auf

  • Impressum
  • Datenschutzerklärung
  • Disclaimer
  • Cookie-Richtlinie (EU)
©2025 Technik Blog | Built using WordPress and Responsive Blogily theme by Superb
Cookie-Zustimmung verwalten
Wir verwenden Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wir tun dies, um das Surferlebnis zu verbessern und um personalisierte Werbung anzuzeigen. Wenn Sie diesen Technologien zustimmen, können wir Daten wie das Surfverhalten oder eindeutige IDs auf dieser Website verarbeiten. Wenn Sie Ihre Zustimmung nicht erteilen oder zurückziehen, können bestimmte Funktionen beeinträchtigt werden.
Funktional Immer aktiv
Die technische Speicherung oder der Zugang ist unbedingt erforderlich für den rechtmäßigen Zweck, die Nutzung eines bestimmten Dienstes zu ermöglichen, der vom Teilnehmer oder Nutzer ausdrücklich gewünscht wird, oder für den alleinigen Zweck, die Übertragung einer Nachricht über ein elektronisches Kommunikationsnetz durchzuführen.
Vorlieben
Die technische Speicherung oder der Zugriff ist für den rechtmäßigen Zweck der Speicherung von Präferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.
Statistiken
Die technische Speicherung oder der Zugriff, der ausschließlich zu statistischen Zwecken erfolgt. Die technische Speicherung oder der Zugriff, der ausschließlich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zusätzliche Aufzeichnungen von Dritten können die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.
Marketing
Die technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder über mehrere Websites hinweg zu ähnlichen Marketingzwecken zu verfolgen.
Optionen verwalten Dienste verwalten Verwalten von {vendor_count}-Lieferanten Lese mehr über diese Zwecke
Einstellungen anzeigen
{title} {title} {title}