Arduino Tutorials – Pollux Labs https://polluxlabs.net Arduino, ESP32 & ESP8266 | Projekte & Tutorials Thu, 25 Sep 2025 11:20:57 +0000 de hourly 1 https://wordpress.org/?v=6.8.3 https://polluxlabs.net/wp-content/uploads/2020/05/cropped-pollux-labs-p-32x32.png Arduino Tutorials – Pollux Labs https://polluxlabs.net 32 32 Mit einem Durchflussmesser den Wasserverbrauch messen https://polluxlabs.net/arduino-projekte/mit-einem-durchflussmesser-den-wasserverbrauch-messen/ Thu, 25 Sep 2025 11:19:44 +0000 https://polluxlabs.net/?p=19918 In diesem Projekt erfährst du, wie du mit einem Arduino, einem Durchflussmesser und einem OLED-Display einen einfachen, aber effektiven Wasserzähler baust. Der Zähler misst die verbrauchte Wassermenge in Echtzeit und visualisiert sie direkt auf dem Display.

Benötigte Bauteile

Diese Bauteile brauchst du für dieses Projekt:

  • Mikrocontroller: Zum Beispiel ein Arduino Nano oder Arduino UNO
  • Durchflussmesser: Ein Turbinen-Durchflussmesser (z.B. YF-S201C*)
  • Display: Ein 0,91“ OLED-Display (SSD1306-Chip)
  • Breadboard und Jumper-Kabel
  • Messbecher: Für die Kalibrierung, idealerweise 500 ml oder 1 Liter

Aufbau des Wasserzählers

Der Aufbau ist kompakt und nutzt die I²C-Pins des OLED-Displays und deines Arduinos, um die Verkabelung zu vereinfachen. Der Durchflussmesser benötigt (neben 5V und Erde) nur eine Verbindung. Auf der folgenden Skizze verwende ich einen Arduino Nano, du kannst aber auch einen UNO oder jeden anderen Arduino oder ESP32/8266 verwenden.

Anschluss des Durchflussmessers am Arduino

Hier noch einmal die Verbindungen im Detail:

Verbindung des Durchflussmessers:

  • VCC: An den 5V-Pin des Arduinos
  • GND: An einen GND-Pin des Arduinos
  • Signal: An den digitalen Pin D2 des Arduinos. Dieser Pin ist für Interrupts geeignet, was eine präzise Messung der Impulse ermöglicht.

Verbindung des OLED-Displays:

  • VCC: An den 3.3V-Pin des Arduinos
  • GND:An einen GND-Pin des Arduinos
  • SDA (Daten): An den SDA-Pin des Arduino. Beim Nano und UNO ist das Pin A4.
  • SCL (Takt): An den SCL-Pin des Arduinos. Beim Nano und UNO ist das Pin A5.

Die benötigten Bibliotheken

Für dieses Projekt benötigst du zwei Bibliotheken für das OLED-Display. Suche hierfür im Bibliotheksverwalter nach Adafruit SSD1306. Bei der Installation wirst du gefragt, ob du auch die Bibliothek Adafruit GFX Library installieren möchtest – bestätige das bitte mit Ja.

Für den Durchflussmesser benötigst du in der Regel keine Bibliothek – seine Impulse verarbeitest du selbst im Sketch.

Der Sketch für den Wasserzähler

Der folgende Code liest die Impulse des Durchflussmessers und zeigt die gemessene Wassermenge auf dem OLED-Display an. Im Folgenden gehe ich von einer Wassermenge von 2,25ml pro Impuls aus. Ich empfehle dir jedoch, deinen Sensor selbst zu kalibrieren.

//Wasserverbrauch messen mit einem Durchflussmesser
//polluxlabs.net

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// Deklariere die Display-Parameter für ein 0,91'' Display
#define SCREEN_WIDTH 128 // OLED-Breite in Pixel
#define SCREEN_HEIGHT 32 // OLED-Höhe in Pixel

// Deklariere ein OLED-Display Objekt
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

// Pin für den Durchflussmesser
const int sensorPin = 2;

// Variable für die Impulszählung. `volatile` ist wichtig für Interrupts.
volatile long impulse_count = 0;

// Die kalibrierte Konstante für deinen Sensor (2.25 ml/impuls)
const float ML_PER_IMPULSE = 2.25;

void setup() {
  // Startet die serielle Kommunikation zur Fehlersuche
  Serial.begin(9600);

  // Initialisiert das OLED-Display
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306-Zuweisung fehlgeschlagen"));
    for (;;); // Endlosschleife, wenn das Display nicht gefunden wird
  }
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  
  // Initialisiert den Sensor-Pin als Eingang
  pinMode(sensorPin, INPUT);
  
  // Richtet einen Interrupt ein, der die Funktion count_impulses bei jedem Impuls aufruft
  attachInterrupt(digitalPinToInterrupt(sensorPin), count_impulses, RISING);
}

void loop() {
  // Eine Kopie des Zählers erstellen, um race conditions zu vermeiden
  long current_impulses = impulse_count; 

  // Berechnung des Wasserverbrauchs
  float water_volume_ml = current_impulses * ML_PER_IMPULSE;

  // Löscht den Display-Inhalt
  display.clearDisplay();

  // Zeigt den Titel an
  display.setTextSize(1);
  display.setCursor(0, 0);
  display.println("Wasserverbrauch:");

  // Zeigt den Wert an
  display.setTextSize(2);
  display.setCursor(0, 16);
  display.print(water_volume_ml);
  display.print(" ml");

  // Aktualisiert das Display
  display.display();

  // Kleine Pause, um das Display nicht zu überfordern
  delay(100);
}

// Interrupt-Service-Routine (ISR)
// Diese Funktion wird automatisch bei jedem Impuls aufgerufen
void count_impulses() {
  impulse_count++;
}

Kalibrierung des Sensors

Der Wert in der Zeile const float ML_PER_IMPULSE = 2.25; ist entscheidend für die Genauigkeit deiner Messung. Je nachdem, welches Modell du verwendest oder auch, wenn dein Sensor nicht präzise misst, kann dieser Wert abweichen. Um die richtige Wassermenge pro Impuls zu ermitteln, gehe wie folgt vor:

  1. Vorbereitung: Halte einen Messbecher mit bekanntem Volumen (z. B. 500 ml) bereit. Lade den obenstehenden Sketch auf deinen Arduino.
  2. Nullstellung: Starte den Sketch neu, indem du den Reset-Knopf auf deinem Arduino drückst. Das Display sollte 0.00 ml anzeigen.
  3. Messung: Lasse genau 500 ml Wasser konstant schnell durch den Sensor in den Messbecher laufen.
  4. Wert ablesen: Warte, bis die Messung auf dem Display nicht mehr steigt. Notiere den angezeigten Wert (z.B. 650 ml).
  5. Neuer Menge: Berechne die korrekte Menge Wasser pro Impuls: 2,25ml x (500ml / 650ml) = 1,73ml/Impuls
  6. Code anpassen: Ändere die Zeile im Sketch zu const float ML_PER_IMPULSE = 1.73;.
  7. Testen: Lade den Sketch erneut hoch und wiederhole den Test mit 500 ml Wasser. Der angezeigte Wert sollte nun sehr nah an 500 ml liegen.

Um das Ergebnis genauer zu machen, kannst du auch mehrere Messungen durchführen und einen Mittelwert finden. Es kann durchaus sein, dass z.B. die Fließgeschwindigkeit des Wassers Auswirkungen auf die Zahl der gemessenen Impulse hat.

So funktioniert der Sketch

Lass uns schnell einen Blick auf die wichtigsten Teile des Sketchs werfen:

1. Die Setup-Funktion

Der Befehl attachInterrupt() ist hier das Herzstück. Anstatt im Loop ständig zu prüfen, ob ein Impuls vom Sensor kommt, richtest du hier einen sogenannten Hardware-Interrupt ein. Das bedeutet, dass der Arduino-Chip sofort seine aktuelle Aufgabe unterbricht und direkt zu der kleinen Funktion count_impulses() springt, sobald er ein Signal am Pin D2 empfängt. Das macht die Messung extrem reaktionsschnell und präzise.

2. Der Loop: Die Hauptlogik

Dieser Teil wird immer wieder wiederholt.

  • Impulse auslesen: long current_impulses = impulse_count; kopiert den Wert des Volatile-Zählers. Das ist eine Schutzmaßnahme. Da der Zähler impulse_count jederzeit von der Interrupt-Funktion geändert werden könnte, sichern wir den Wert, bevor wir damit rechnen, um Fehler zu vermeiden.
  • Berechnung: float water_volume_ml = current_impulses * ML_PER_IMPULSE; ist der Kern des Projekts. Hier wird die Anzahl der Impulse mit dem Kalibrierungsfaktor multipliziert, um das tatsächliche Wasservolumen in Millilitern zu erhalten.
  • Display-Update: Die folgenden Befehle, wie display.clearDisplay(), display.setCursor() und display.print(), kümmern sich darum, die berechneten Daten auf dem OLED-Display darzustellen. Der Befehl display.display() sendet am Ende die gesammelten Daten an das Display, um die Anzeige zu aktualisieren.
  • Pause: delay(100); sorgt für eine kurze Pause. Das ist wichtig, um zu verhindern, dass das Display zu schnell aktualisiert wird und um die CPU-Ressourcen des Arduinos zu schonen.

3. Die Funktion count_impulses(): Der Interrupt

Dies ist die kleine, aber sehr wichtige Funktion, die durch den Interrupt-Befehl ausgelöst wird. Sie wird nicht vom Loop aufgerufen, sondern springt automatisch in Aktion, sobald der Sensor einen Impuls sendet. Ihre einzige Aufgabe ist es, den Zähler impulse_count um eins zu erhöhen.

Wie geht es weiter?

Du kannst du nun den Wasserverbrauch messen und auf einem Display anzeigen. Eine interessante Weiterentwicklung könnte z.B. ein LED-Ring sein, der anzeigt, wie sehr du dich beim Händewaschen einem festgelegten Maximalverbrauch näherst. Oder du misst in deinem Garten den Wasserverbrauch und speicherst die Daten z.B. bei Adafruit IO in der Cloud.

]]>
Arduino RFID: Der Einstieg mit dem RC522-Reader https://polluxlabs.net/arduino-tutorials/arduino-rfid-der-einstieg-mit-dem-rc522-reader/ Mon, 23 Jun 2025 08:57:01 +0000 https://polluxlabs.net/?p=19411 In diesem Tutorial tauchen wir in eine faszinierende Technologie ein, die uns im Alltag ständig begegnet: RFID. Ob beim kontaktlosen Bezahlen, bei der Zeiterfassung oder in modernen Schließsystemen – die kleinen Chips sind überall. Aber hast du dich schon mal gefragt, wie das eigentlich funktioniert? Und noch besser: Wie du es selbst für deine eigenen Projekte nutzen kannst?

Du wirst einen RFID-Reader an einen Arduino anschließen und die einzigartige ID von RFID-Tags und -Karten auslesen. Also, schnapp dir deinen Arduino und lass uns loslegen!

Was ist RFID eigentlich?

RFID steht für „Radio-Frequency Identification“, also die Identifizierung mithilfe von Radiowellen. Ein RFID-System besteht immer aus zwei Teilen:

  1. Einem Transponder (der Tag oder die Karte): Dieser enthält einen winzigen Chip mit einer Antenne. Auf dem Chip ist eine eindeutige Kennung (UID – Unique Identifier) gespeichert.
  2. Einem Lesegerät (der Reader): Dieses erzeugt ein elektromagnetisches Feld. Kommt ein Transponder in die Nähe dieses Feldes, wird er mit Energie versorgt und sendet seine Informationen zurück an das Lesegerät.

Das Schöne daran ist, dass dies alles kontaktlos und ohne Sichtverbindung funktioniert.

Für dieses Arduino RFID Tutorial brauchst du

  • Ein Arduino-Board (im Folgenden ein Arduino Uno)
  • Ein RFID-RC522 Modul (meistens kommen hier schon eine Karte und ein Schlüsselanhänger-Tag mit)
  • Ein Breadboard & Kabel

Schritt 1: Die Verkabelung

Das Herzstück ist das RC522-Modul. Es kommuniziert mit dem Arduino über eine Schnittstelle namens SPI (Serial Peripheral Interface).

Wichtiger Hinweis: Das RC522-Modul arbeitet mit 3.3V! Schließe es auf keinen Fall an den 5V-Pin deines Arduinos an, da es sonst beschädigt werden könnte.

Verbinde die Pins des RC522-Moduls wie folgt mit deinem Arduino Uno:

RC522 PinArduino Uno PinBeschreibung
3.3V3.3VSpannungsversorgung
RSTPin 9Reset-Pin
GNDGNDMasse
MISOPin 12Master In, Slave Out (SPI)
MOSIPin 11Master Out, Slave In (SPI)
SCKPin 13Serial Clock (SPI)
SDAPin 10Slave Select (SPI)
IRQ(wird nicht verbunden)

Nimm dir für die Verkabelung einen Moment Zeit und prüfe alles doppelt. Eine saubere Verkabelung ist die halbe Miete!

Schritt 2: Die Bibliothek installieren

Damit dein Arduino versteht, wie er mit dem RFID-Modul sprechen soll, benötigst du eine passende Bibliothek. Für das RC522-Modul gibt es eine sehr beliebte und gut gepflegte Bibliothek von „GitHubCommunity“.

So installierst du sie ganz einfach über die Arduino IDE:

  1. Öffne deine Arduino IDE.
  2. Gehe zum Menüpunkt Werkzeuge > Bibliotheken verwalten….
  3. Gib in das Suchfeld MFRC522 ein.
  4. Suche nach der Bibliothek „MFRC522 by GithubCommunity“ und klicke auf Installieren.

Das war’s schon! Jetzt kennt dein Arduino die Befehle, um mit dem RFID-Modul zu kommunizieren.

Schritt 3: Einen Tag auslesen

Jetzt wird es spannend! Hier kommt der Sketch, um die einzigartige ID eines Tags auszulesen. Diese UID ist quasi der Personalausweis des Chips, den du in deinen Projekten verwenden kannst.

Öffne die Arduino IDE und füge den folgenden Code ein:

// Arduino RFID
//polluxlabs.net

#include <SPI.h>
#include <MFRC522.h>

#define RST_PIN 9          // Reset-Pin, den wir an Pin 9 angeschlossen haben
#define SS_PIN 10          // Slave-Select-Pin, den wir an Pin 10 angeschlossen haben

// Erstellen einer Instanz des MFRC522-Objekts
MFRC522 mfrc522(SS_PIN, RST_PIN);  

void setup() {
  Serial.begin(9600);   // Starten der seriellen Kommunikation für die Ausgabe am PC
  while (!Serial);      // Warten, bis der serielle Monitor bereit ist
  SPI.begin();          // Initialisieren der SPI-Kommunikation
  mfrc522.PCD_Init();   // Initialisieren des RFID-Moduls
  Serial.println("Halte einen RFID-Tag an das Lesegerät...");
}

void loop() {
  // Suche nach neuen Karten
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    return;
  }

  // Wähle eine der Karten aus
  if ( ! mfrc522.PICC_ReadCardSerial()) {
    return;
  }

  // Zeige die UID im Seriellen Monitor an
  Serial.print("UID des Tags: ");
  String content= "";
  for (byte i = 0; i < mfrc522.uid.size; i++) {
     Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
     Serial.print(mfrc522.uid.uidByte[i], HEX);
     content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
     content.concat(String(mfrc522.uid.uidByte[i], HEX));
  }
  Serial.println();
  Serial.println("------------");
  
  // Halte die Kommunikation an, damit derselbe Tag nicht ständig neu gelesen wird
  mfrc522.PICC_HaltA();
}

Was macht dieser Code?

  • #include: Wir binden die benötigten Bibliotheken für SPI und das RFID-Modul ein.
  • #define: Wir legen fest, welche Arduino-Pins wir für RST und SS verwenden.
  • setup(): Hier wird die serielle Kommunikation gestartet und das RFID-Modul initialisiert.
  • loop(): Die Hauptschleife wartet darauf, dass ein neuer Tag (PICC_IsNewCardPresent()) in Reichweite kommt. Wenn einer erkannt wird, wird seine UID ausgelesen (PICC_ReadCardSerial()) und anschließend in einer lesbaren Form (Hexadezimal) auf dem Seriellen Monitor ausgegeben.

Lade den Sketch auf deinen Arduino hoch und halte nun eine RFID-Karte oder den Schlüsselanhänger an dein Modul. Voilà! Du solltest die UID des Tags auf dem Monitor sehen.

Wie geht es weiter?

Glückwunsch! Du hast soeben deinen eigenen RFID-Reader in Betrieb genommen und gelernt, wie man die ID eines Tags ausliest. Allein damit sind die Möglichkeiten schon riesig:

  • Baue ein smartes Türschloss: Speichere die UID deines Tags im Code. Wird diese UID erkannt, steuert der Arduino ein Servo an, um ein Schloss zu öffnen.
  • Erstelle eine Musikbox: Weise verschiedenen UIDs im Code unterschiedliche Lieder zu. Je nachdem, welchen Tag du an den Reader hältst, wird eine andere Melodie abgespielt.
  • Ein personalisiertes Begrüßungssystem: Der Arduino erkennt deine UID und begrüßt dich mit Namen auf einem LCD-Display.

Experimentiere mit dem Code und entwickle deine eigenen Ideen.

]]>
So verwendest du einen Arduino Joystick https://polluxlabs.net/arduino-tutorials/arduino-joystick-erste-schritte/ Wed, 27 Nov 2024 10:41:40 +0000 https://polluxlabs.net/?p=18031 Das Joystick-Modul ist ein vielseitiges Eingabegerät, das häufig in Maker-Projekten verwendet wird. In diesem Artikel erfährst du, wie du einen Arduino Joystick an einen Arduino UNO anschließt, wie er funktioniert und wie du ihn in deinem nächsten Projekt einsetzen kannst.

So funktioniert der Joystick

Das Joystick-Modul verwendet Potentiometer für die x- und y-Achse. Wenn der Joystick bewegt wird, ändert sich der Widerstand der Potentiometer, was zu einer Änderung der Ausgangsspannung führt. Diese Spannung wird vom Arduino ausgelesen und in einen Zahlenwert zwischen 0 und 1023 umgewandelt.

Mit diesen Werte kannst du dann weiterarbeiten: Die Höhe des Werts zeigt dir an, in welche Richtung der Joystick bewegt wurde, also nach oben, unten, links oder rechts. Neben den Potis für die x- und y-Achse findest du meistens noch einen Button, den du betätigst, indem den Stick drückst. Auch das kannst du natürlich in deinem Sketch auslesen und bei Bedarf in deinem Projekt verwenden.

Und so schließt du ihn an

Ein typischer Arduino Joystick hat fünf Pins. Die Stromversorgung und die beiden Anschlüsse für die x- und y-Achse sind hierbei obligatorisch. Der Pin SW ist mit dem Button verbunden – wenn in deinem Projekt später keinen Button benötigst, brauchst du ihn nicht mit deinem Microcontroller verbinden. Im Folgenden verwenden wir jedoch alle fünf Anschlüsse:

Anschlussdiagramm des Arduino Joysticks am Arduino UNO R4

___STEADY_PAYWALL___

Beachte, dass die Beschriftung der Pins je nach Modell variieren kann: Meistens findest du jedoch VRx für die horizontale x-Achse (HOR) und VRy für die vertikale y-Achse (VER).

Ein erster Test mit dem ARduino Joystick

Nun, wo du den Joystick angeschlossen hast, wird es Zeit für einen ersten Test. Hierbei liest du einfach die Bewegungen des Sticks und den Button aus und zeigst deine Aktionen entsprechend im Seriellen Monitor an.

Kopiere den folgenden Sketch und lade ihn auf deinen Arduino:

const int joyPinX = A0; // Pin für die x-Achse des Joysticks
const int joyPinY = A1; // Pin für die y-Achse des Joysticks
const int joyPinSW = A2; // Pin für den Button des Joysticks

void setup() {
  pinMode(joyPinSW, INPUT_PULLUP); // Button-Pin als Eingang mit internem Pull-up-Widerstand
  Serial.begin(9600); // Serielle Kommunikation starten
}

void loop() {
  int xValue = analogRead(joyPinX); // x-Achse auslesen
  int yValue = analogRead(joyPinY); // y-Achse auslesen
  int swValue = analogRead(joyPinSW); // Button auslesen

  // Richtung ermitteln
  String direction = "Mitte";
  if (xValue > 600) {
    direction = "Rechts";
  } else if (xValue < 400) {
    direction = "Links";
  }
  if (yValue > 600) {
    direction = "Unten";
  } else if (yValue < 400) {
    direction = "Oben";
  }

  // Werte im seriellen Monitor anzeigen
  Serial.print("Richtung: ");
  Serial.print(direction);
  Serial.print(" | X: ");
  Serial.print(xValue);
  Serial.print(" | Y: ");
  Serial.print(yValue);
  Serial.print(" | Button: ");
  Serial.print(swValue);
  if (swValue < 20) {
    Serial.println(" | Gedrückt!");
  } else {
    Serial.println(" | ");
  }

  delay(100); // Kurze Pause
}

Teste nun deinen Joystick – siehst du im Seriellen Monitor die Richtungen und einen Hinweis, wenn du den Button drückst? Falls du dich wunderst, dass die ermittelten Richtungen nicht mit deinen Absichten übereinstimmen: Dann positioniere deinen Arduino Joystick bitte wie auf diesem Foto. 😉

Arduino Joystick richtig ausrichten

So funktioniert der Sketch

Zunächst legst du die Pins fest, an denen dein Joystick mit dem Arduino UNO verbunden ist:

const int joyPinX = A0; // Pin für die x-Achse des Joysticks
const int joyPinY = A1; // Pin für die y-Achse des Joysticks
const int joyPinSW = A2; // Pin für den Button des Joysticks

Im Setup legst du fest, dass der Button des Arduino Joysticks den internen Pullup-Widerstand nutzt, damit du seine Werte zuverlässig auslesen kannst. Außerdem startest du den Seriellen Monitor:

void setup() {
  pinMode(joyPinSW, INPUT_PULLUP); // Button-Pin als Eingang mit internem Pull-up-Widerstand
  Serial.begin(9600); // Serielle Kommunikation starten
}

Der Loop beginnt damit, dass dein Arduino die aktuellen Werte des Joysticks einliest und basierend darauf die gedrückte Richtung ermittelt:

void loop() {
  int xValue = analogRead(joyPinX); // x-Achse auslesen
  int yValue = analogRead(joyPinY); // y-Achse auslesen
  int swValue = analogRead(joyPinSW); // Button auslesen

  // Richtung ermitteln
  String direction = "Mitte";
  if (xValue > 600) {
    direction = "Rechts";
  } else if (xValue < 400) {
    direction = "Links";
  }
  if (yValue > 600) {
    direction = "Unten";
  } else if (yValue < 400) {
    direction = "Oben";
  }

Wie eingangs erwähnt sind im Arduino Joystick zwei Potentiometer verbaut, für jede Achse eines. Am Beispiel der x-Achse bedeutet das: Ein Drücken nach links bis zum Anschlag erzeugt den Wert 0. Diese Werte steigen an, bis sie in der Ruheposition des Sticks im Bereich von 500 liegen. Dein Drücken nach rechts lässt die Werte weiter steigen, bis sie am Anschlag den vollen Wert 1023 erreichen.

Fehlen noch zwei Dinge: Die Ausgabe der Richtungen im Seriellen Monitor und der Check, ob du den Button des Sticks gedrückt hast:

  // Werte im seriellen Monitor anzeigen
  Serial.print("Richtung: ");
  Serial.print(direction);
  Serial.print(" | X: ");
  Serial.print(xValue);
  Serial.print(" | Y: ");
  Serial.print(yValue);
  Serial.print(" | Button: ");
  Serial.print(swValue);
  if (swValue < 20) {
    Serial.println(" | Gedrückt!");
  } else {
    Serial.println(" | ");
  }

  delay(100); // Kurze Pause
}

Eine Besonderheit des Arduino Joysticks ist, dass du an einem Analog-Pin ermitteln musst, ob der Button gedrückt wurde. Der ungedrückte Button liefert an seinem Pin SW immer einen Wert von ungefähr 500. Erst wenn du ihn betätigst fällt dieser Wert auf Null. Diesen Moment fängst du im Code oben mit einer If-Abfrage ein und gibst entsprechend ein Gedrückt! im Seriellen Monitor aus.

Analog-Stick und diagonale Bewegungen

Wie du im Seriellen Monitor erkennst, ermittelt dein Arduino Werte, die von der Intensität deiner Bewegungen abhängen. Das heißt konkret, dass zum Beispiel der Wert bei einer Bewegung nach rechts immer weiter ansteigt, bis er ab einer Größe von 600 als „nach rechts gedrückt“ gilt. Damit kannst du aber auch feine Bewegungen erkennen, ähnlich wie bei einem Analog-Stick eines herkömmlichen Controllers für die Playstation, Xbox oder Switch.

Falls du also für dein Projekt sowohl schnelle als auch langsame Bewegungen erkennen möchtest, setze bei den Werten mehrere Schwellenwerte: Der Wert 600 könnte dann ein gemächliches Schleichen sein, der Maximalwert von 1023 (also der Anschlag des Joysticks nach rechts) dann die volle Geschwindigkeit.

Auch diagonale Möglichkeiten sind möglich, denn diese sind nichts anderes als eine Kombination von x- und y-Werten. Ersetze in deinem Sketch den Teil Richtung ermitteln durch folgenden Code:

  // Richtung ermitteln
  String direction = "Mitte";
  if (xValue > 600 && yValue > 600) {
    direction = "Rechts-Unten";
  } else if (xValue > 600 && yValue < 400) {
    direction = "Rechts-Oben";
  } else if (xValue < 400 && yValue > 600) {
    direction = "Links-Unten";
  } else if (xValue < 400 && yValue < 400) {
    direction = "Links-Oben";
  } else if (xValue > 600) {
    direction = "Rechts";
  } else if (xValue < 400) {
    direction = "Links";
  } else if (yValue > 600) {
    direction = "Unten";
  } else if (yValue < 400) {
    direction = "Oben";
  }

Hier wird zum Beispiel eine Bewegung nach links oben erkannt, wenn sowohl der x-Wert als auch der y-Wert unter 400 liegt. Entsprechend behandelst du die anderen drei diagonalen Richtungen. Das ermöglicht dir weitere Möglichkeiten für deine Steuerung – mit etwas Fleißarbeit sind sogar noch weitere Abstufungen möglich.

Wie geht es weiter?

Jetzt wo du weißt, wie du deinen Arduino Joystick anschließt und verwendest, möchtest du bestimmt ein passendes Projekt bauen. In diesem Tutorial lernst du, wie du den Spieleklassiker Snake auf einem Arduino und ESP32 umsetzt.

]]>
OTA Updates für den ESP32 – Aktualisierungen aus der Ferne https://polluxlabs.net/arduino-tutorials/ota-updates-fuer-den-esp32/ Mon, 11 Nov 2024 08:30:57 +0000 https://polluxlabs.net/?p=17845 Der ESP32 unterstützt OTA (Over-the-Air), mit dem du den Sketches drahtlos aktualisieren kannst. OTA ist besonders hilfreich, wenn der Mikrocontroller schwer zugänglich ist oder du Änderungen ohne physische Verbindung übertragen möchtest. In diesem Tutorial erfährst du, wie du OTA einrichtest und lernst Schritt für Schritt ein Beispielprojekt kennen: Eine blinkende LED, deren Blinkfrequenz per OTA-Update verändert wird.

Die Bibliothek ArduinoOTA

Falls du die ESP32-Boards über den Boardverwalter der Arduino-IDE hinzugefügt hast, ist die Bibliothek ArduinoOTA normalerweise schon dabei. Die Bibliothek ermöglicht dir eine unkomplizierte Integration der OTA-Funktionalität.

Sollte die Bibliothek dennoch fehlen, kannst du sie über den Bibliotheksverwalter installieren. Gehe dazu in der Arduino-IDE zu Sketch > Bibliothek einbinden > Bibliotheken verwalten und suche nach „ArduinoOTA“. Stelle sicher, dass die neueste Version installiert ist, damit du alle aktuellen Features und Sicherheitsverbesserungen nutzen kannst.

Die Bibliothek ArduinoOTA installieren

Schritt 1: Der erste Sketch für eine blinkende LED

Du startest mit einem einfachen Sketch, der eine LED am ESP32 im Sekundentakt blinken lässt. Die LED ist dabei über einen passenden Vorwiderstand an den GPIO-Pin 2 des ESP32 angeschlossen. Dieser Sketch dient als Grundlage für das OTA-Update.

#include <WiFi.h>
#include <ArduinoOTA.h>

const char* ssid = "Dein_WLAN-NETZWERK";          // Ersetze durch deinen WLAN-Namen
const char* password = "Dein_WLAN_Passwort";  // Ersetze durch dein WLAN-Passwort

#define LED_PIN 2 // GPIO-Pin der LED

unsigned long previousMillis = 0;
const long interval = 1000; // Blinkintervall in Millisekunden (1 Sekunde)

void setup() {
  Serial.begin(115200);
  pinMode(LED_PIN, OUTPUT);

  // WLAN-Verbindung herstellen
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nVerbunden mit WiFi");

  // OTA-Setup
  ArduinoOTA.setHostname("esp32_led_ota");
  ArduinoOTA.setPassword("Dein_Sicheres_Passwort"); // Setze hier ein starkes Passwort für OTA-Updates, um unbefugten Zugriff zu verhindern
  ArduinoOTA.begin();
}

void loop() {
  ArduinoOTA.handle(); // Nach OTA-Updates suchen

  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    digitalWrite(LED_PIN, !digitalRead(LED_PIN)); // Zustand der LED umschalten
  }
}

So funktioniert der Sketch

  1. Bibliotheken einbinden: Der Sketch beginnt mit dem Einbinden der notwendigen Bibliotheken WiFi.h und ArduinoOTA.h. Erstere ermöglicht die Verbindung des ESP32 mit einem WLAN-Netzwerk, während ArduinoOTA.h die OTA-Funktionalität bereitstellt. Diese Bibliotheken sind notwendig, um die gewünschten Netzwerk- und Update-Funktionen auf dem ESP32 zu implementieren.
  2. Netzwerk-Konfiguration: Die Variablen ssid und password speichern die Zugangsdaten für dein WLAN. Diese werden verwendet, um den ESP32 mit deinem Netzwerk zu verbinden.
  3. GPIO-Pin-Definition: #define LED_PIN 2 definiert den Pin, an den die LED angeschlossen ist. In diesem Fall nutzt du den GPIO-Pin 2 des ESP32.
  4. WLAN-Verbindung herstellen: Im setup()-Teil des Codes wird die Verbindung zum WLAN hergestellt. Mit WiFi.begin(ssid, password) verbindet sich der ESP32 mit dem Netzwerk. Die Schleife while (WiFi.status() != WL_CONNECTED) sorgt dafür, dass das Programm wartet, bis die Verbindung hergestellt ist.
  5. OTA-Setup: Im setup()-Teil wird auch die OTA-Funktionalität initialisiert. Mit ArduinoOTA.setHostname("esp32_led_ota") wird der Name des ESP32 im Netzwerk festgelegt. Dieser Name erleichtert es, das Gerät im Netzwerk zu identifizieren, besonders wenn du mehrere ESP32-Geräte verwendest. Ein (möglichst sicheres) Passwort hinterlegst du mit Hilfe der Funktion ArduinoOTA.setPassword("Mein_OTA_Passwort"), damit nur du Updates durchführen kannst. ArduinoOTA.begin() startet den OTA-Service, damit der ESP32 auf eingehende Updates wartet.
  6. LED-Blinken: Die Funktion loop() enthält den Code, der die LED im Sekundentakt blinken lässt. Mit der Funktion millis() wird überprüft, ob der festgelegte Intervall (1000 Millisekunden) vergangen ist. Wenn dies der Fall ist, wird der Zustand der LED umgeschaltet mit digitalWrite(LED_PIN, !digitalRead(LED_PIN)).
  7. OTA-Handler: In der loop()-Funktion wird ArduinoOTA.handle() aufgerufen, um kontinuierlich nach OTA-Updates zu suchen. Dies ermöglicht es, jederzeit ein Update zu empfangen, während das Hauptprogramm weiterläuft.

Schritt 2: OTA-Update zur Änderung des intervalls

Nun nimmst du eine Änderung am Code vor, um die Blinkfrequenz der LED auf 500 ms zu reduzieren. Diese Änderung überträgst du drahtlos per OTA auf den ESP32.

Ändere im obigen Sketch den Wert des Intervalls von 1000 auf 500:

const long interval = 500; // Blinkintervall in Millisekunden (500 ms)

Update via OTA durchführen

Nun folgt der Upload des aktualisierten Sketchs. Sofern dein ESP32 mit deinem WLAN-Netzwerk verbunden ist, sollte er in der Arduino-IDE als Netzwerkport sichtbar sein. Gehe hierfür zu Werkzeuge > Port und wähle den ESP32 (esp32_led_ota) aus.

Der ESP32 im Netzwerk finden für das Update per OTA

OTA-Update hochladen: Lade den neuen Sketch (mit 500 ms Blinkintervall) über den Netzwerkport hoch. Klicke hierfür einfach wie gewohnt auf den Upload-Button – so wie du es auch machst, wenn dein ESP32 über ein USB-Kabel verbunden ist. Achte darauf, dass in deinem Update wieder die WLAN-Zugangsdaten und dein Passwort hinterlegt sind.

Die Arduino-IDE fordert dich auf, das OTA-Passwort einzugeben. Gib das definierte Passwort („Mein_OTA_Passwort“) ein und das Update wird drahtlos übertragen.

Hinweis: Solltest du Updates mit verschiedenen Passwörtern machen, kann es sein, dass die Arduino IDE ein falsches Passwort automatisch verwenden möchte. Schließe in diesem Fall die IDE und öffne sie erneut – dann wirst du wieder nach dem Passwort für deinen ESP32 gefragt.

Nachdem das Update drahtlos auf deinen ESP32 übertragen wurde, sollte die LED nun im neuen Halbsekundentakt aufleuchten. Und das war es auch schon – du kennst nun eine Möglichkeit, Programme zu aktualisieren, ohne den Microcontroller irgendwo ausbauen und an deinen Computer anschließen zu müssen. Weitere Informationen zum Thema findest du bei Espressif.

]]>
UX-Design für Maker: So baust du benutzerfreundliche Projekte https://polluxlabs.net/arduino-tutorials/ux-design-fur-maker/ Tue, 05 Nov 2024 19:15:12 +0000 https://polluxlabs.net/?p=17071 Als Maker sind wir oft so fasziniert von unseren Projekten, dass wir einen entscheidenden Aspekt übersehen: die Benutzerfreundlichkeit. Wir löten begeistert Bauteile zusammen, programmieren Mikrocontroller und konstruieren komplexe Mechanismen. Doch wenn unser Projekt fertig ist, stellen wir fest, dass nur wir selbst es richtig bedienen können. Freunde und Familie, denen wir unsere neueste Kreation vorführen wollen, stehen ratlos davor.

Hier kommt UX-Design ins Spiel. UX steht für „User Experience“, also Nutzererfahrung. Es geht darum, wie Menschen mit unserem Produkt interagieren und welche Erfahrungen sie dabei machen. Gutes UX-Design sorgt dafür, dass die Bedienung intuitiv, effizient und angenehm ist.

Don Norman, einer der Pioniere des UX-Designs, hat in seinem Buch „The Design of Everyday Things“ grundlegende Prinzipien formuliert, die auch für uns Maker Gold wert sind. In diesem Artikel werden wir diese Prinzipien auf die Welt der DIY-Elektronik und Maker-Projekte übertragen.

Warum ist UX-Design für Maker wichtig?

Zum einen macht es unsere Projekte zugänglicher für andere. Ein gut designtes Gerät kann von jedem genutzt werden, nicht nur vom Erfinder. Zum anderen verbessert es auch unsere eigene Nutzererfahrung. Wer hat sich nicht schon einmal über seine eigenen, unübersichtlich angeordneten Buttons und Regler geärgert?

Gutes UX-Design muss dabei nicht bedeuten, dass wir Kompromisse bei der Funktionalität eingehen. Im Gegenteil: Oft führt die Auseinandersetzung mit UX-Fragen zu cleveren Lösungen, die unser Projekt noch verbessern.

Grundprinzipien des UX-Designs nach Don Norman

In seinem wegweisenden Werk The Design of Everyday Things* hat Don Norman einige fundamentale Prinzipien des UX-Designs formuliert, die für uns Maker von großem Wert sind. In diesem Beitrag soll es um drei der wichtigsten Konzepte gehen:

  1. Gulf of Execution und Gulf of Evaluation:Der Gulf of Execution beschreibt die Kluft zwischen den Zielen des Nutzers und den Möglichkeiten des Systems. Der Gulf of Evaluation ist die Kluft zwischen dem, was das System tut, und dem Verständnis des Nutzers davon.
  2. Affordances und Signifiers: Affordances sind die möglichen Interaktionen zwischen einem Objekt und dem Nutzer. Ein Drehregler „bietet“ das Drehen an. Signifiers sind die sichtbaren Hinweise auf diese Möglichkeiten.
  3. Feedback:Jede Aktion des Nutzers sollte eine wahrnehmbare Reaktion hervorrufen.

Diese Prinzipien bilden das Fundament für benutzerfreundliches Design. Als Maker können wir sie nutzen, um Projekte zu bauen, die nicht nur funktionieren, sondern auch Freude bei der Benutzung bereiten. In den folgenden Abschnitten werden wir uns ansehen, wie wir diese Konzepte konkret in unseren DIY-Projekten umsetzen können.

Gulf of Execution und Evaluation

Zwei zentrale Konzepte in Don Normans Theorie, die für uns Maker besonders relevant sind, sind der „Gulf of Execution“ und der „Gulf of Evaluation“. Diese beschreiben die Herausforderungen, mit denen Nutzer bei der Interaktion mit unseren Projekten konfrontiert werden.

Gulf of Execution und Gulf of Evaluation im UX-Design

Der „Gulf of Execution“ ist die Kluft zwischen dem, was der Nutzer tun möchte, und den Möglichkeiten, die unser Gerät bietet. Stelle dir einen selbstgebauten Synthesizer vor: Der Nutzer möchte einen bestimmten Sound erzeugen, aber wie? Sind die Regler logisch angeordnet? Sind die Funktionen klar beschriftet? Je größer diese Kluft, desto frustrierender die Erfahrung.

Der „Gulf of Evaluation“ hingegen beschreibt die Schwierigkeit, den aktuellen Zustand des Systems zu verstehen. Hat unser Arduino die Eingabe verarbeitet? Wurde die Einstellung gespeichert? Läuft das Programm überhaupt? Ohne klares Feedback tappt der Nutzer im Dunkeln.

Als Maker ist es unsere Aufgabe, Brücken über diese Klüfte zu bauen:

  1. Überbrücken des Gulf of Execution:
    • Verwenden eindeutige Beschriftungen und Symbole
    • Gruppiere zusammengehörige Funktionen
    • Benutze vertraute Metaphern, zum Biespiel ein Zahnrad-Symbol für Einstellungen
  2. Überbrücken des Gulf of Evaluation:
    • Integriere Status-LEDs für wichtige Funktionen
    • Verwende Displays zur Anzeige komplexer Informationen
    • Gibt akustisches Feedback bei wichtigen Ereignissen

Ein Beispiel: Bei einem Smart-Home-Projekt könnte ein Touch-Display die aktuelle Raumtemperatur anzeigen (Evaluation) und gleichzeitig als Schieberegler zur Temperatureinstellung dienen (Execution). Eine kurze Vibration bestätigt die Eingabe, während eine animierte Kurve den Temperaturverlauf visualisiert.

Indem wir diese Konzepte berücksichtigen, machen wir unsere Projekte nicht nur funktional, sondern auch intuitiv bedienbar. Das Ziel ist es, dass der Nutzer mühelos von der Idee zur Ausführung und dann zum Verständnis des Ergebnisses gelangt.

Affordances und Signifiers

Affordances und Signifiers sind zentrale Konzepte, die uns helfen, die Interaktionen zwischen Nutzer und Objekt zu verbessern. Affordances beschreiben, welche Aktionen ein Objekt anbietet. Ein einfacher Drehregler an einem Verstärker bietet beispielsweise die Affordance, gedreht zu werden, um die Lautstärke zu verändern. Das Design eines Objekts sollte klar machen, welche Interaktionen möglich sind.

Signifiers sind die visuellen Hinweise, die dem Nutzer zeigen, wie er interagieren soll. Sie können physisch (z.B. eine Markierung auf einem Schalter) oder digital (z.B. ein Symbol auf einem Touchscreen) sein. Signifiers können oft auch dazu beitragen, Missverständnisse zu vermeiden. Wenn ein Knopf gedrückt werden soll, könnte er leicht hervorgehoben und beschriftet sein, um die Funktion deutlich zu machen.

Als Maker können wir Affordances und Signifiers gezielt einsetzen, um unsere Projekte benutzerfreundlicher zu gestalten. Zum Beispiel könnten wir:

  • Einen Drehregler mit einer sichtbaren Markierung versehen, um zu verdeutlichen, in welche Richtung gedreht werden kann.
  • Bei einem selbstgebauten Bedienfeld alle Tasten so gestalten, dass deren Funktionen klar erkennbar sind (z.B. durch eindeutige Symbole).
  • LED-Streifen als Signifiers nutzen, um den Nutzer zu bestimmten Bereichen des Geräts zu leiten, besonders bei komplexeren Projekten.

Ein weiteres Beispiel sind Touch-Interfaces: Wenn wir ein Touchscreen-Display nutzen, sollten wir darauf achten, dass die zu drückenden Bereiche klar markiert und ausreichend groß sind, um eine präzise Eingabe zu ermöglichen. Das Verwenden von Signifiers sorgt dafür, dass der Nutzer die beabsichtigte Interaktion schnell erkennt und umsetzen kann.

Indem wir Affordances und Signifiers bewusst einsetzen, machen wir die Benutzung unserer Projekte intuitiver und senken die Einstiegshürde für neue Nutzer.

Feedback

Feedback ist ein weiterer essenzieller Aspekt des UX-Designs. Jede Aktion, die ein Nutzer durchführt, sollte eine wahrnehmbare Reaktion hervorrufen. Ohne Feedback ist es für den Nutzer schwer zu erkennen, ob seine Interaktion erfolgreich war oder ob ein Fehler aufgetreten ist – siehe den erwähnten Gulf of Evaluation.

Als Maker können wir viele verschiedene Formen von Feedback einsetzen:

  • Visuelles Feedback: LED-Anzeigen, die aufleuchten, wenn eine Funktion aktiviert wird, oder ein Display, das den aktuellen Status zeigt. Zum Beispiel kann eine grüne LED anzeigen, dass ein System betriebsbereit ist, während eine rote LED einen Fehler signalisiert.
  • Akustisches Feedback: Ein Piepton kann darauf hinweisen, dass eine Eingabe erfolgt ist oder ein Fehler aufgetreten ist. Ein sanfter Signalton kann bestätigen, dass eine Einstellung erfolgreich vorgenommen wurde.
  • Haptisches Feedback: Vibrationen bei der Berührung eines Touchscreens können dem Nutzer zusätzliche Bestätigung bieten, dass eine Eingabe registriert wurde.

Ein Beispiel für gutes Feedback bei einem selbstgebauten Code-Schloss: Wenn der Nutzer den richtigen Code eingibt, leuchtet eine grüne LED auf. Bei einem falschen Code hingegen leuchtet eine rote LED.

Code-Schloss Arduino

Feedback hilft nicht nur dem Nutzer, die Funktionalität zu verstehen, sondern trägt auch dazu bei, Vertrauen in das System aufzubauen. Es reduziert Unsicherheit und sorgt dafür, dass der Nutzer immer weiß, was gerade passiert. Besonders bei komplexeren Projekten ist es wichtig, dass der Nutzer sofort Rückmeldung erhält, ob seine Eingaben erfolgreich waren oder nicht.

Indem wir in unseren Projekten stets Feedback einplanen, sorgen wir dafür, dass Nutzer mit unseren Kreationen besser interagieren können und die Bedienung angenehmer und effizienter wird.

Fazit

UX-Design ist ein unverzichtbarer Bestandteil des Entwicklungsprozesses, der unsere Projekte von rein technischen Spielereien zu benutzerfreundlichen und inspirierenden Kreationen macht. Indem wir die Prinzipien von Don Norman – wie den Gulf of Execution und Evaluation, Affordances und Signifiers sowie Feedback – in unsere DIY-Projekte integrieren, können wir die Benutzerfreundlichkeit erheblich steigern.

Unsere Projekte sollen nicht nur funktionieren, sondern auch von anderen Menschen genutzt und geschätzt werden können. Gutes UX-Design ermöglicht es uns, Barrieren abzubauen, die Bedienung zu vereinfachen und das Nutzererlebnis zu verbessern. Letztendlich schaffen wir damit Geräte, die nicht nur uns selbst stolz machen, sondern auch andere begeistern und inspirieren.

Also, denke bei deinen nächsten Projekten nicht nur an die Technik, sondern auch an die Menschen, die sie nutzen werden. Denn die beste Technologie ist die, die Freude bringt und von allen verstanden wird.

]]>
Nachrichten mit dem ESP8266 und ESP32 versenden https://polluxlabs.net/arduino-tutorials/nachrichten-mit-dem-esp8266-und-esp32-versenden/ Mon, 04 Sep 2023 14:15:55 +0000 https://polluxlabs.net/?p=14335 Möchtest du mit deinem ESP8266 oder ESP32 Nachrichten verschicken, um zum Beispiel eine Warnung von einem Bewegungsmelder oder Temperatursensor zu erhalten? In diesem Tutorial erfährst du gleich drei Möglichkeiten, wie du das umsetzen kannst – per Telegram, E-Mail und WhatsApp.

Inhalt diese Tutorials

Nachrichten per Telegram senden

Eine gängige Möglichkeit ist es, Nachrichten per Telegram zu senden – genauer gesagt an einen Telegram-Bot. Diese Nachrichten kannst du dann umgehend auf deinem Smartphone lesen. Auf Pollux Labs gibt es einige Projekte, die auf Telegram zurückgreifen, zum Beispiel einen Dash Button oder eine Fotofalle mit der ESP32-CAM. Für letzteres Projekt ist Telegram besonders interessant, denn es ist damit auch möglich, Bilder zu senden.

Zunächst benötigst du einen Telegram-Bot. Wie du diesen im Handumdrehen einrichtest, erfährst du in diesem Tutorial. Außerdem benötigst du die Bibliothek UniversalTelegramBot, die du im Bibliotheksverwalter der Arduino IDE findest. Achte darauf, die neueste Version zu installieren und die Bibliothek aktuell zu halten. Sollte die Version im Bibliotheksverwalter veraltet sein, findest du auf GitHub immer die neueste Version zum Download.

Hier der Beispiel-Sketch für deinen ESP8266. Dieser versendet nach dem Start des Boards eine Nachricht:

#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>

// Deine WLAN-Zugangsdaten
const char* ssid = "DEIN WLAN-NETZWERK";
const char* password = "DEIN PASSWORT";

// Dein Bot-Token
#define botToken "DEIN TOKEN"  // den Bot-Token bekommst du vom Botfather)

//Deine User ID
#define userID "DEINE USER ID"

WiFiClientSecure client;
UniversalTelegramBot bot(botToken, client);

void setup() {
  Serial.begin(115200);
  client.setInsecure();

  // Verbindung zum WLAN
  Serial.print("Verbinde mit mit: ");
  Serial.println(ssid);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }

  Serial.println("");
  Serial.println("Verbunden!");

  bot.sendMessage(userID, "Hier spricht dein ESP8266.", "");
}

void loop() {
}

Nach dem Upload sollte in deiner Telegram-App folgende Nachricht erscheinen:

Telegram-Nachricht vom ESP8266

So funktioniert der Sketch

Nachdem du die benötigten Bibliotheken eingebunden hast (die zwei ersten sind bereits vorinstalliert), musst du ein paar Daten ergänzen. Das sind deine WLAN-Zugangsdaten sowie dein Bot-Token und deine User-ID. Wenn du die beiden letzteren noch nicht hast, schau dir zunächst unser oben verlinktes Tutorial an.

Anschließend initialisierst du den WifiClient sowie den UniversalTelegramBot mit jeweiligen Instanzen:

WiFiClientSecure client;
UniversalTelegramBot bot(botToken, client);

Im Setup stellst du dann die Verbindung zu deinem WLAN her. Sobald die Verbindung steht, verwendest du die Funktion bot.sendMessage, um eine Nachricht an deinen Telegram-Bot zu senden:

bot.sendMessage(userID, "Hier spricht dein ESP8266.", "");

Der erste Parameter in dieser Funktion ist deine userID, die du zu Beginn des Sketchs hinterlegt hast – gefolgt von der Nachricht, die du senden möchtest. Und das war es im Prinzip auch schon! Du kannst dieses Muster nun für dein Projekt adaptieren, indem du die Nachricht zum Beispiel sendest, wenn eine bestimmte Temperatur überschritten wurde – als Inhalt der Nachricht könnte dann z.B. der aktuelle Messwert dienen.

Mit dem ESP32 eine Telegram-Nachricht senden

Natürlich kannst du statt des ESP8266 auch mit einem ESP32 oder einer ESP32-CAM Nachrichten per Telegram senden. Hierfür musst du nur eine Bibliothek austauschen. Statt ESP8266WiFI.h verwendest du WiFi.h.

#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>

Und: Um eine korrekte Nachricht zu senden, kannst du noch den Inhalt anpassen. 😉

bot.sendMessage(userID, "Hier spricht dein ESP32.", "");

E-Mails mit dem ESP8266 oder ESP32 versenden

Nach Telegram schauen wir uns den Klassiker der elektronischen Nachrichten an, E-Mails. In diesem Tutorial verwenden wir den Service Gmail, um die E-Mails zu versenden. Auch wenn du schon eine Adresse bei Gmail haben solltest, empfehlen wir fürs Experimentieren auf jeden Fall eine brandneue Mail-Adresse anzulegen. Sollte etwas schief laufen, z.B. eine Kontosperrung, weil dein ESP8266 versehentlich zahllose Mails in kurzer Abfolge versendet, ist deine private Mail-Adresse hiervon nicht betroffen.

Um eine neue Adresse anzulegen, rufe zunächst hier Gmail auf und klicke auf Konto erstellen. Sobald dein Konto eingerichtet ist, benötigst du ein App-Passwort, das dein ESP8266 verwenden kann. Um ein App-Passwort anzulegen, öffne dein Google-Konto und klicke auf den Menüpunkt Sicherheit. Klicke anschließend auf den Menü-Punkt Bestätigung in zwei Schritten und folge den Anweisungen, um diese Zwei-Faktor-Authentifizierung zu aktivieren – sie ist nämlich die Voraussetzung für ein App-Passwort.

Sobald du mit der Einrichtung fertig bist, öffne wieder Sicherheit > Bestätigung in zwei Schritten und scrolle ganz nach unten zum Eintrag App-Passwörter. Erstelle nun ein Passwort für E-Mail und wähle als Gerät Andere (benutzerdefinierter Name) aus. Anschließend kannst du einen Namen vergeben, also z.B. ESP8266 oder ESP32.

Das war es zunächst mit den Vorbereitungen, weiter geht es mit einem Beispielsketch, der eine E-Mail an dich versendet.

Eine E-Mail senden

Zunächst benötigst du eine Bibliothek, die du über den Bibliotheksverwalter installieren kannst: ESP Mail Client

Nach der Installation kannst du dich gleich dem Sketch zuwenden. Wir verwenden in diesem Tutorial den Sketch des Blogs RandomNerdTutorials, der ein sehr guter Startpunkt für dieses Thema ist. Im folgenden Sketch musst du nur ein paar Anpassungen machen. Trage an den folgenden Stellen deine Daten ein:

#define WIFI_SSID "REPLACE_WITH_YOUR_SSID" //Dein WLAN-Name
#define WIFI_PASSWORD "REPLACE_WITH_YOUR_PASSWORD" //Dein WLAN-Passwort
#define AUTHOR_EMAIL "YOUR_EMAIL@XXXX.com" //Deine Absendeadresse (die du bei Gmail angelegt hast)
#define AUTHOR_PASSWORD "YOUR_EMAIL_APP_PASS" //Dein App-Passwort
#define RECIPIENT_EMAIL "RECIPIENTE_EMAIL@XXXX.com" //Die Empfänger-Adresse

Der gesamte Sketch:

/*
  Rui Santos
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
  Example adapted from: https://github.com/mobizt/ESP-Mail-Client
*/

#include <Arduino.h>
#if defined(ESP32)
  #include <WiFi.h>
#elif defined(ESP8266)
  #include <ESP8266WiFi.h>
#endif
#include <ESP_Mail_Client.h>

#define WIFI_SSID "REPLACE_WITH_YOUR_SSID"
#define WIFI_PASSWORD "REPLACE_WITH_YOUR_PASSWORD"

/** The smtp host name e.g. smtp.gmail.com for GMail or smtp.office365.com for Outlook or smtp.mail.yahoo.com */
#define SMTP_HOST "smtp.gmail.com"
#define SMTP_PORT 465

/* The sign in credentials */
#define AUTHOR_EMAIL "YOUR_EMAIL@XXXX.com"
#define AUTHOR_PASSWORD "YOUR_EMAIL_APP_PASS"

/* Recipient's email*/
#define RECIPIENT_EMAIL "RECIPIENTE_EMAIL@XXXX.com"

/* Declare the global used SMTPSession object for SMTP transport */
SMTPSession smtp;

/* Callback function to get the Email sending status */
void smtpCallback(SMTP_Status status);

void setup(){
  Serial.begin(115200);
  Serial.println();
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  Serial.print("Connecting to Wi-Fi");
  while (WiFi.status() != WL_CONNECTED){
    Serial.print(".");
    delay(300);
  }
  Serial.println();
  Serial.print("Connected with IP: ");
  Serial.println(WiFi.localIP());
  Serial.println();

  /*  Set the network reconnection option */
  MailClient.networkReconnect(true);

  /** Enable the debug via Serial port
   * 0 for no debugging
   * 1 for basic level debugging
   *
   * Debug port can be changed via ESP_MAIL_DEFAULT_DEBUG_PORT in ESP_Mail_FS.h
   */
  smtp.debug(1);

  /* Set the callback function to get the sending results */
  smtp.callback(smtpCallback);

  /* Declare the Session_Config for user defined session credentials */
  Session_Config config;

  /* Set the session config */
  config.server.host_name = SMTP_HOST;
  config.server.port = SMTP_PORT;
  config.login.email = AUTHOR_EMAIL;
  config.login.password = AUTHOR_PASSWORD;
  config.login.user_domain = "";

  /*
  Set the NTP config time
  For times east of the Prime Meridian use 0-12
  For times west of the Prime Meridian add 12 to the offset.
  Ex. American/Denver GMT would be -6. 6 + 12 = 18
  See https://en.wikipedia.org/wiki/Time_zone for a list of the GMT/UTC timezone offsets
  
  config.time.ntp_server = F("pool.ntp.org,time.nist.gov");
  config.time.gmt_offset = 1;
  config.time.day_light_offset = 0;
  */

  /* Declare the message class */
  SMTP_Message message;

  /* Set the message headers */
  message.sender.name = F("ESP");
  message.sender.email = AUTHOR_EMAIL;
  message.subject = F("ESP Test Email");
  message.addRecipient(F("Sara"), RECIPIENT_EMAIL);
    
  /*Send HTML message*/
  /*String htmlMsg = "<div style=\"color:#2f4468;\"><h1>Hello World!</h1><p>- Sent from ESP board</p></div>";
  message.html.content = htmlMsg.c_str();
  message.html.content = htmlMsg.c_str();
  message.text.charSet = "us-ascii";
  message.html.transfer_encoding = Content_Transfer_Encoding::enc_7bit;*/

   
  //Send raw text message
  String textMsg = "Hallo Mensch!";
  message.text.content = textMsg.c_str();
  message.text.charSet = "us-ascii";
  message.text.transfer_encoding = Content_Transfer_Encoding::enc_7bit;
  
  message.priority = esp_mail_smtp_priority::esp_mail_smtp_priority_low;
  message.response.notify = esp_mail_smtp_notify_success | esp_mail_smtp_notify_failure | esp_mail_smtp_notify_delay;


  /* Connect to the server */
  if (!smtp.connect(&config)){
    ESP_MAIL_PRINTF("Connection error, Status Code: %d, Error Code: %d, Reason: %s", smtp.statusCode(), smtp.errorCode(), smtp.errorReason().c_str());
    return;
  }

  if (!smtp.isLoggedIn()){
    Serial.println("\nNot yet logged in.");
  }
  else{
    if (smtp.isAuthenticated())
      Serial.println("\nSuccessfully logged in.");
    else
      Serial.println("\nConnected with no Auth.");
  }

  /* Start sending Email and close the session */
  if (!MailClient.sendMail(&smtp, &message))
    ESP_MAIL_PRINTF("Error, Status Code: %d, Error Code: %d, Reason: %s", smtp.statusCode(), smtp.errorCode(), smtp.errorReason().c_str());

}

void loop(){
}

/* Callback function to get the Email sending status */
void smtpCallback(SMTP_Status status){
  /* Print the current status */
  Serial.println(status.info());

  /* Print the sending result */
  if (status.success()){
    // ESP_MAIL_PRINTF used in the examples is for format printing via debug Serial port
    // that works for all supported Arduino platform SDKs e.g. AVR, SAMD, ESP32 and ESP8266.
    // In ESP8266 and ESP32, you can use Serial.printf directly.

    Serial.println("----------------");
    ESP_MAIL_PRINTF("Message sent success: %d\n", status.completedCount());
    ESP_MAIL_PRINTF("Message sent failed: %d\n", status.failedCount());
    Serial.println("----------------\n");

    for (size_t i = 0; i < smtp.sendingResult.size(); i++)
    {
      /* Get the result item */
      SMTP_Result result = smtp.sendingResult.getItem(i);

      // In case, ESP32, ESP8266 and SAMD device, the timestamp get from result.timestamp should be valid if
      // your device time was synched with NTP server.
      // Other devices may show invalid timestamp as the device time was not set i.e. it will show Jan 1, 1970.
      // You can call smtp.setSystemTime(xxx) to set device time manually. Where xxx is timestamp (seconds since Jan 1, 1970)
      
      ESP_MAIL_PRINTF("Message No: %d\n", i + 1);
      ESP_MAIL_PRINTF("Status: %s\n", result.completed ? "success" : "failed");
      ESP_MAIL_PRINTF("Date/Time: %s\n", MailClient.Time.getDateTimeString(result.timestamp, "%B %d, %Y %H:%M:%S").c_str());
      ESP_MAIL_PRINTF("Recipient: %s\n", result.recipients.c_str());
      ESP_MAIL_PRINTF("Subject: %s\n", result.subject.c_str());
    }
    Serial.println("----------------\n");

    // You need to clear sending result as the memory usage will grow up.
    smtp.sendingResult.clear();
  }
}

So funktioniert der sketch

Weiter oben hast du bereits die Stellen kennengelernt, die du anpassen musst, damit der Sketch funktioniert. Außerdem kannst du noch deine Zeitzone einstellen, um der E-Mail den richtigen Timestamp zu geben:

  config.time.ntp_server = F("pool.ntp.org,time.nist.gov");
  config.time.gmt_offset = 1;
  config.time.day_light_offset = 0;

Der gmt_offset für Deutschland (also der Abstand zur Greenwich Mean Time) wäre in diesem Beispiel 1 – in der Winterzeit. Im Sommer sind es hingegen 2 Stunden.

Den Betreff und den Absender- bzw. Empfängernamen trägst du hier ein:

  /* Set the message headers */
  message.sender.name = F("ABSENDERNAME");
  message.sender.email = AUTHOR_EMAIL;
  message.subject = F("BETREFF");
  message.addRecipient(F("EMPFÄNGERNAME"), RECIPIENT_EMAIL);

Die eigentliche Nachricht findest du hier:

  //Send raw text message
  String textMsg = "Hallo Mensch!";

Hier kannst du, je nachdem was in deinem eigenen Projekt sinnvoll ist, natürlich auch Variablen mitsenden. Lade den Sketch mit deinen Anpassungen auf deinen ESP8266 oder ESP32. Im Seriellen Monitor kannst du mitverfolgen, wie die E-Mail versendet wird und schließlich im Posteingang deines Empfängers landet.

Der obige Sketch funktioniert sowohl für den ESP8266 als auch für den ESP32. Anpassungen sind beim Wechsel der Boards nicht nötig.

Eine WhatsApp-Nachricht mit dem ESP8266 und ESP32 versenden

Kommen wir zu dritten Möglichkeit, deinen ESP8266 oder ESP32 eine Nachricht versenden zu lassen: WhatsApp. Voraussetzung ist hier ein externer Service. Im Folgenden verwenden wir CallMeBot.com – eine kostenlose API, mit deren Hilfe du WhatsApp-Textnachrichten auf dein Smartphone senden kannst.

Hierfür ist keine aufwändige Registrierung nötig, du musst nur kurz deine Mobilfunknummer bei der API anmelden, um einen API-Key zu erhalten. Über den Link oben kannst du die offizielle Anleitung aufrufen – oder einfach die folgenden Schritte ausführen:

  • Füge über WhatsApp die folgende Nummer deinen Kontakten hinzu (den Kontaktnamen kannst du frei wählen): +34 644 71 81 99
  • Sende anschließend die folgende Nachricht an diese Nummer: I allow callmebot to send me messages
  • Du erhältst daraufhin eine Antwort mit deinem API-Key – und das war’s auch schon

Die Bibliothek zum Codieren der Nachrichten

Auch um Nachrichten per WhatsApp senden zu können, benötigst du eine Bibliothek, die du ganz schnell über den Bibliotheksverwalter installieren kannst: UrlEncode

Diese brauchst du, da die Nachrichten über eine URL übertragen werden – z.B. so:

https://api.callmebot.com/whatsapp.php?phone=+49123123123&text=Dieser+Text+ist+codiert&apikey=123123

Die Bibliothek, die du gleich installierst, übernimmt die Aufgabe, deinen Nachrichten-String in das richtige Format zu bringen. Öffne also den Bibliotheksverwalter und suche nach UrlEncode. Installiere anschließend die neueste Version.

die WhatsApp-Nachricht senden

Hier kommt der vollständige Sketch, um eine WhatsApp-Nachricht mit deinem ESP8266 zu verschicken:

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
#include <UrlEncode.h>

const char* ssid = "DEIN WLAN-NETZ";
const char* password = "DEIN WLAN-PASSWORT";

// Deutschland +49, Beispiel: +49176999888777
String phoneNumber = "DEINE MOBILFUNKNUMMER";
String apiKey = "DEIN API-KEY";

void sendMessage(String message) {

  // Daten, die gesendet werden
  String url = "http://api.callmebot.com/whatsapp.php?phone=" + phoneNumber + "&apikey=" + apiKey + "&text=" + urlEncode(message);
  WiFiClient client;
  HTTPClient http;
  http.begin(client, url);

  // Header
  http.addHeader("Content-Type", "application/x-www-form-urlencoded");

  // HTTP Post request senden
  int httpResponseCode = http.POST(url);
  if (httpResponseCode == 200) {
    Serial.print("Message sent successfully");
  } else {
    Serial.println("Error sending the message");
    Serial.print("HTTP response code: ");
    Serial.println(httpResponseCode);
  }

  http.end();
}

void setup() {
  Serial.begin(115200);

  WiFi.begin(ssid, password);
  Serial.println("Connecting");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to WiFi network with IP Address: ");
  Serial.println(WiFi.localIP());

  // WhatsApp-Nachricht
  sendMessage("Hier spricht dein ESP8266");
}

void loop() {
}

Zu Beginn des Sketchs hinterlegst du wieder deine WLAN-Zugangsdaten. Außerdem benötigst du deine eigene Mobilfunknummer, die du im internationalen Format (also z.B. für Deutschland mit einem +49 zu Beginn) hinterlegen musst. Zuletzt trägst du noch deinen API-Key ein, den du per WhatsApp-Nachricht empfangen hast:

const char* ssid = "DEIN WLAN-NETZ";
const char* password = "DEIN WLAN-PASSWORT";

// Deutschland +49, Beispiel: +49176999888777
String phoneNumber = "DEINE MOBILFUNKNUMMER";
String apiKey = "DEIN API-KEY";

Alles weitere im Sketch dient der Verbindung zu deinem WLAN und dem API-Request (in der Funktion sendMessage(String message)). Recht weit am Ende kannst du deine Textnachricht eingeben, die gesendet werden soll:

// WhatsApp-Nachricht
sendMessage("Hier spricht dein ESP8266");

Lade den Sketch auf deinen ESP8266. Nach dem Upload sollte innerhalb von wenigen Sekunden die entsprechende Nachricht auf deinem Smartphone erscheinen.

Die WhatsApp-Nachricht mit dem ESP32 senden

Wenn du statt eines ESP8266 einen ESP32 oder eine ESP32-CAM verwenden möchtest, musst du nur ein paar andere Bibliotheken zu Beginn des Sketchs einbinden:

#include <WiFi.h>
#include <HTTPClient.h>
#include <UrlEncode.h>

Den restlichen Sketch kannst du beibehalten ohne weitere Anpassungen. Beachte bitte, dass du mit CallMeBot nur reine Textnachrichten (die natürlich auch Variablen enthalten können) senden kannst. Bilder zu senden, funktioniert mit diesem Service leider nicht. Solltest du das vorhaben, verwende besser Telegram oder schaue dir einmal textmebot.com an – diese API ist allerdings kostenpflichtig.

Fazit

In diesem Tutorial hast du drei Methoden kennengelernt, mit denen du Nachrichten versenden kannst – per Telegram, E-Mail oder WhatsApp. Passende Projekte findest du auf Pollux Labs: Du könntest zum Beispiel die ESP8266 Wetterstation um Warnungen ergänzen, die du erhältst, sobald bestimmte Messwerte über- oder unterschritten werden.

]]>
ESP8266 Deep Sleep – So legst du deinen ESP schlafen https://polluxlabs.net/arduino-tutorials/esp8266-deep-sleep-so-legst-du-deinen-esp-schlafen/ Fri, 12 May 2023 06:20:19 +0000 https://polluxlabs.net/?p=13867 Der ESP8266 ist ein vielseitiger und preiswerter Mikrocontroller mit integrierter WiFi-Funktionalität. Eine seiner bemerkenswertesten Funktionen ist jedoch der Deep-Sleep-Modus, der es ermöglicht, den Stromverbrauch drastisch zu senken, wenn der Mikrocontroller nicht aktiv ist. Dies ist besonders nützlich in batteriebetriebenen IoT-Projekten, in denen die Energieeffizienz entscheidend ist.

So kann dein ESP zum Beispiel alle 20 Minuten aufwachen, einen Sensorwert übermitteln und sich dann wieder schlafen legen. In diesem Tutorial erfährst du, wie du dabei vorgehst und wie den Deep-Sleep-Modus programmierst.

Benötigte Materialien

Für einen ersten Test ohne Sensoren benötigst du nicht viel:

  • Ein ESP8266 Modul (z.B. NodeMCU oder Wemos D1 Mini)
  • Ein USB-Kabel zum Programmieren
  • Arduino IDE

Übrigens – falls du es noch nicht weißt – bei uns erfährst du, wie du deinen ESP8266 mit der Arduino IDE programmierst.

Verkabelung für den ESP8266 Deep Sleep

Die gute Nachricht, du benötigst nur ein einziges Kabel: Um den Deep-Sleep-Modus zu nutzen, muss der RESET-Pin des ESP8266 mit dem D0-Pin verbunden werden. Entweder verwendest du hier ein Female-Female-Kabel, das du direkt an die Pins des ESP steckst – oder du verwendest ein Breadboard. Mehr musst du für den Schlafmodus nicht tun.

Der Sketch

Lege in der Arduino IDE einen neuen Sketch an und füge den folgenden Code ein und lade ihn auf deinen ESP8266.

void setup() {
  // Beginne die serielle Kommunikation mit einer Baudrate von 9600
  Serial.begin(9600);

  // Ausgabe einer Nachricht, wenn der ESP8266 aufwacht
  Serial.println("Der ESP8266 ist aufgewacht!");
}

void loop() {
  // Warte ein wenig, bevor der ESP8266 in den Deep-Sleep-Modus wechselt
  delay(2000);

  // Ausgabe einer Nachricht, bevor der ESP8266 in den Deep-Sleep-Modus wechselt
  Serial.println("Der ESP8266 geht in den Deep-Sleep-Modus...");

  // Gib dem ESP8266 Zeit, die Nachricht zu senden, bevor er in den Deep-Sleep-Modus geht
  delay(100);

  // ESP8266 in den Deep-Sleep-Modus versetzen
  // Die Zeit ist in Mikrosekunden angegeben
  // 1 Sekunde = 1.000.000 Mikrosekunden
  // In diesem Fall wird der ESP8266 alle 10 Sekunden aufwachen
  ESP.deepSleep(10e6);
}

Nun sollte dein ESP8266 alle 10 Sekunden für 2 Sekunden aufwachen.

]]>
Ein OLED-Display (Adafruit SSD1306) am Arduino oder ESP8266 anschließen https://polluxlabs.net/arduino-tutorials/ein-oled-display-am-arduino-oder-esp8266-anschliessen/ Wed, 10 May 2023 08:26:35 +0000 https://polluxlabs.net/?p=13854 Willst Du Deinem Arduino-Projekt einen Hauch von Eleganz verleihen? Wie wäre es mit einem coolen OLED-Display? Sie sind flach, leicht, energieeffizient und bieten ein gestochen scharfes Bild. In diesem Blog-Artikel zeigen wir Dir, wie Du ein OLED-Display (Adafruit SSD1306) an Deinen Arduino anschließt und verwendest. Also, lass uns direkt loslegen!

Benötigte Materialien:

  1. Arduino (z.B. Arduino Uno, Mega oder Nano)
  2. OLED-Display (z.B. 128×64 Pixel, I2C-Kommunikation)
  3. Jumper-Kabel (männlich-männlich)
  4. Breadboard (optional)

Schritt 1: Verkabelung

Bevor wir mit der Programmierung beginnen, müssen wir das Display mit dem Arduino verbinden. Hier ist, wie Du es verkabelst:

  1. Schließe GND (Ground) des OLED-Displays an den GND-Pin des Arduino an.
  2. Verbinde VCC (Power) des Displays mit dem 5V-Pin des Arduino.
  3. Schließe SDA (Daten) des Displays an den A4-Pin (SDA) des Arduino Uno oder Mega, bzw. an den A4-Pin (SDA) des Arduino Nano an.
  4. Verbinde SCL (Clock) des Displays mit dem A5-Pin (SCL) des Arduino Uno oder Mega, bzw. an den A5-Pin (SCL) des Arduino Nano.

Wenn Du ein Breadboard verwendest, stecke das -Display auf das Breadboard und verbinde es mit dem Arduino über Jumper-Kabel.

Schritt 2: Bibliotheken installieren

Um das OLED-Display mit dem Arduino zu verwenden, benötigen wir zwei Bibliotheken: die Adafruit-GFX-Bibliothek und die Adafruit-SSD1306-Bibliothek. Du kannst sie direkt aus der Arduino-IDE heraus installieren:

  1. Öffne die Arduino-IDE und gehe zu „Sketch“ > „Bibliothek einbinden“ > „Bibliotheken verwalten…“.
  2. Suche nach „Adafruit GFX Library“ und installiere die neueste Version.
  3. Suche anschließend nach „Adafruit SSD1306“ und installiere auch hier die neueste Version.

Schritt 3: Beispielcode laden und anpassen

Jetzt, wo die Verkabelung und die Bibliotheken bereit sind, können wir den Beispielcode laden und anpassen:

  1. Öffne die Arduino-IDE und gehe zu „Datei“ > „Beispiele“ > „Adafruit SSD1306“ > „ssd1306_128x64_i2c“.
  2. Suche im Code nach der Zeile #define OLED_RESET 4 und ändere sie in #define OLED_RESET -1, um den Reset-Pin zu deaktivieren (wir benötigen ihn nicht).
  3. Suche im Code nach der Zeile Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); und ändere sie in Adafruit_SSD1306 display(128, 64, &Wire, -1); für ein 128×64 Pixel OLED-Display.

Schritt 4: Code hochladen und Display testen

Es ist Zeit, den angepassten Beispielcode auf Deinen Arduino zu laden und das OLED-Display zu testen:

  1. Stelle sicher, dass Dein Arduino über USB mit Deinem Computer verbunden ist.
  2. Wähle in der Arduino-IDE unter „Werkzeuge“ > „Board“ das richtige Arduino-Board aus (z.B. Arduino Uno, Mega oder Nano).
  3. Wähle unter „Werkzeuge“ > „Port“ den richtigen USB-Anschluss für Deinen Arduino aus.
  4. Klicke auf den „Hochladen“-Button (Pfeilsymbol) in der Arduino-IDE, um den Code auf Deinen Arduino zu übertragen.

Sobald der Code erfolgreich hochgeladen wurde, sollte das Display verschiedene Muster und Text anzeigen. Herzlichen Glückwunsch, Du hast erfolgreich ein OLED-Display an Deinen Arduino angeschlossen und verwendet!

Schritt 5: Dein eigenes Display-Design erstellen

Nun, da Du weißt, wie Du ein OLED-Display anschließt und den Beispielcode verwendest, kannst Du Deine eigenen Designs und Texte erstellen! Hier sind einige grundlegende Funktionen, die Du nutzen kannst:

  • display.clearDisplay(); – Löscht den Display-Inhalt.
  • display.setTextSize(1); – Setzt die Textgröße (1, 2, 3…).
  • display.setTextColor(WHITE); – Setzt die Textfarbe (OLED-Displays sind normalerweise monochrom, daher ist Weiß die Standardfarbe).
  • display.setCursor(0, 0); – Setzt den Cursor an die angegebene Position (x, y).
  • display.println("Hallo, Maker!"); – Gibt Text auf dem Display aus.
  • display.display(); – Aktualisiert das Display, um die vorgenommenen Änderungen anzuzeigen.

Fühle Dich frei, mit diesen Funktionen zu experimentieren und Dein eigenes Display-Design zu erstellen. Denke daran, den Befehl display.display(); nach Deinen Anweisungen zu verwenden, um die Änderungen auf dem Display sichtbar zu machen. Übrigens, in diesem Tutorial lernst du, wie du Bilder auf dem OLED-Display anzeigst.

Bilder auf OLED-Display anzeigen

Der Anschluss am ESP8266

Der Anschluss eines OLED-Displays an einen ESP8266 ist ebenso einfach wie beim Arduino. Hier ist, wie Du es verkabelst:

Benötigte Materialien:

  1. ESP8266 (z.B. NodeMCU, Wemos D1 Mini)
  2. OLED-Display (z.B. 128×64 Pixel, I2C-Kommunikation)
  3. Jumper-Kabel (männlich-männlich)
  4. Breadboard (optional)

Schritt 1: Verkabelung und Code

Um das OLED-Display mit dem ESP8266 zu verbinden, führe die folgenden Schritte aus:

  1. Schließe GND (Ground) des OLED-Displays an den GND-Pin des ESP8266 an.
  2. Verbinde VCC (Power) des Displays mit dem 3.3V-Pin des ESP8266.
  3. Schließe SDA (Daten) des Displays an den D2-Pin (GPIO4, SDA) des ESP8266 an.
  4. Verbinde SCL (Clock) des Displays mit dem D1-Pin (GPIO5, SCL) des ESP8266.

Wenn Du ein Breadboard verwendest, stecke das OLED-Display auf das Breadboard und verbinde es mit dem ESP8266 über Jumper-Kabel.

Die restlichen Schritte zur Installation der Bibliotheken und zum Anpassen des Beispielcodes bleiben dieselben. Du musst lediglich eine kleine Änderung am Beispielcode vornehmen, um die Pin-Belegung für den ESP8266 festzulegen:

  1. Füge im Code die Zeile #include <Wire.h> hinzu, um die Wire-Bibliothek einzubinden.
  2. Füge direkt nach der Zeile Wire.begin(); die folgenden Zeilen hinzu, um die I2C-Pins für den ESP8266 festzulegen:
#if defined(ESP8266)
  Wire.begin(4, 5); // SDA, SCL
#endif

Das war’s! Jetzt kannst Du den angepassten Code auf Deinen ESP8266 hochladen und das Display wie zuvor beschrieben verwenden.

]]>
So misst du Entfernungen mit dem VL53L0X-Sensor und dem Arduino UNO https://polluxlabs.net/arduino-tutorials/entfernungen-messen-mit-dem-vl53l0x-sensor-und-dem-arduino-uno/ Tue, 09 May 2023 21:42:04 +0000 https://polluxlabs.net/?p=13835 In diesem Blogartikel möchten wir Dir zeigen, wie Du ganz einfach den VL53L0X-Sensor mit Deinem Arduino UNO verbindest und verwendest. Mit diesem faszinierenden Sensor kannst Du präzise Entfernungen messen, und das mit einer Reichweite von bis zu 2 Metern.

Was ist der VL53L0X-Sensor?

Der VL53L0X ist ein Time-of-Flight (ToF)-Laserabstandssensor, der mithilfe von Infrarot-Licht die Entfernung zu einem Objekt misst. Er ist kompakt und leicht zu integrieren, was ihn ideal für die Anwendung in Roboterprojekten, Drohnen oder zur Objekterkennung macht.

Was benötigst Du für dieses Projekt?

Neben dem Sensor benötigst du nur einen Microcontroller – in diesem Tutorial verwenden wir den Arduino UNO. Selbstverständlich kannst du auch jedes andere verwenden, sofern es über I²C verfügt.

Verkabelung des Sensors mit dem Arduino UNO

Bevor wir anfangen, den Sensor zu programmieren, müssen wir ihn erst einmal mit dem Arduino UNO verbinden. Die Verkabelung ist denkbar einfach:

  1. Verbinde den VCC (oder auch VIN)-Pin des VL53L0X mit dem 5V-Pin des Arduino UNO.
  2. Verbinde den GND-Pin des Sensors mit dem GND-Pin des Arduino UNO.
  3. Verbinde den SDA-Pin mit dem A4-Pin (SDA) des Arduino UNO.
  4. Verbinde den SCL-Pin mit dem A5-Pin (SCL) des Arduino UNO.

Programmierung des Arduino UNO

Um den VL53L0X-Sensor verwenden zu können, musst Du zunächst die passende Bibliothek in Deiner Arduino IDE installieren. Hierzu gehst Du wie folgt vor:

  1. Öffne die Arduino IDE auf Deinem Computer.
  2. Klicke im Menü auf „Sketch“ > „Bibliothek einbinden“ > „Bibliotheken verwalten…“.
  3. Suche im Bibliotheksmanager nach „VL53L0X“ und installiere die Bibliothek „VL53L0X von Pololu“.

Jetzt können wir mit dem Programmieren beginnen! Erstelle einen neuen Sketch und füge den folgenden Code ein:

#include <Wire.h>
#include <VL53L0X.h>

VL53L0X sensor;

void setup() {
  Serial.begin(9600);
  Wire.begin();

  sensor.init();
  sensor.setTimeout(500);

  Serial.println("VL53L0X-Sensor bereit!");
}

void loop() {
  int distance = sensor.readRangeSingleMillimeters();

  if (sensor.timeoutOccurred()) {
    Serial.print("Timeout! ");
  }

  Serial.print("Abstand: ");
  Serial.print(distance);
  Serial.println(" mm");

  delay(1000);
}

Lade den Sketch auf Deinen Arduino UNO hoch und öffne den seriellen Monitor. Du solltest nun alle Sekunden die gemessene Entfernung in Mill

imetern angezeigt bekommen.

Wie funktioniert der Code?

Lass uns einen Blick auf die einzelnen Bestandteile des Codes werfen, um besser zu verstehen, wie das Programm funktioniert: Zuerst binden wir die benötigten Bibliotheken ein, nämlich Wire.h für die I2C-Kommunikation und VL53L0X.h für den Sensor.

#include <Wire.h>
#include <VL53L0X.h>

Danach erstellen wir ein Objekt sensor der Klasse VL53L0X.

VL53L0X sensor;

Im setup()-Funktionsteil initialisieren wir die serielle Kommunikation mit einer Baudrate von 9600, die I2C-Kommunikation und den Sensor. Wir setzen außerdem ein Timeout von 500 ms für den Sensor, damit das Programm nicht ewig hängt, falls es Probleme bei der Messung geben sollte.

void setup() {
  Serial.begin(9600);
  Wire.begin();

  sensor.init();
  sensor.setTimeout(500);

  Serial.println("VL53L0X-Sensor bereit!");
}

In der loop()-Funktion lesen wir die Entfernung in Millimetern mit sensor.readRangeSingleMillimeters() und speichern den Wert in der Variable distance. Wir überprüfen, ob ein Timeout aufgetreten ist, und geben eine entsprechende Meldung aus. Anschließend geben wir den gemessenen Abstand auf dem seriellen Monitor aus und warten eine Sekunde, bevor wir die nächste Messung durchführen.

void loop() {
  int distance = sensor.readRangeSingleMillimeters();

  if (sensor.timeoutOccurred()) {
    Serial.print("Timeout! ");
  }

  Serial.print("Abstand: ");
  Serial.print(distance);
  Serial.println(" mm");

  delay(1000);
}

Jetzt weißt Du, wie Du den Time-of-Flight-Sensor mit Deinem Arduino UNO verbinden und verwenden kannst, um präzise Entfernungsmessungen durchzuführen. Mit dieser neuen Fähigkeit kannst Du nun kreative Projekte entwickeln, bei denen Entfernungen eine wichtige Rolle spielen, wie beispielsweise Parkassistenten, Hinderniserkennung für Roboter oder sogar interaktive Kunstinstallationen.

Die ENtfernung auf einem OLED-Display anzeigen

Um das Projekt zu erweitern und die gemessene Entfernung auf einem OLED-Display anzuzeigen, benötigst Du zusätzlich:

  • Ein I2C-OLED-Display (128×64 Pixel, z.B. SSD1306)
  • Ein paar zusätzliche Jumper-Kabel

Verkabelung des OLED-Displays mit dem Arduino UNO

Die Verkabelung des OLED-Displays ist ähnlich einfach wie beim VL53L0X-Sensor:

  1. Verbinde den VCC-Pin des OLED-Displays mit dem 5V-Pin des Arduino UNO.
  2. Verbinde den GND-Pin des OLED-Displays mit dem GND-Pin des Arduino UNO.
  3. Verbinde den SDA-Pin des OLED-Displays mit dem A4-Pin (SDA) des Arduino UNO.
  4. Verbinde den SCL-Pin des OLED-Displays mit dem A5-Pin (SCL) des Arduino UNO.

Da das OLED-Display und der VL53L0X-Sensor beide I2C-Geräte sind, können sie gemeinsam an den I2C-Bus des Arduino UNO angeschlossen werden.

Programmierung des Arduino UNO

Um das OLED-Display zu verwenden, musst Du zunächst die passenden Bibliotheken in Deiner Arduino IDE installieren. Hierzu gehst Du wie folgt vor:

  1. Öffne die Arduino IDE auf Deinem Computer.
  2. Klicke im Menü auf „Sketch“ > „Bibliothek einbinden“ > „Bibliotheken verwalten…“.
  3. Suche im Bibliotheksmanager nach „Adafruit SSD1306“ und installiere die Bibliothek „Adafruit SSD1306 by Adafruit“.
  4. Suche im Bibliotheksmanager nach „Adafruit GFX“ und installiere die Bibliothek „Adafruit GFX Library by Adafruit“.

Jetzt können wir den Code erweitern, um das OLED-Display zu nutzen. Erstelle einen neuen Sketch oder bearbeite den bestehenden und füge den folgenden Code ein:

#include <Wire.h>
#include <VL53L0X.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

VL53L0X sensor;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire);

void setup() {
  Serial.begin(9600);
  Wire.begin();

  sensor.init();
  sensor.setTimeout(500);

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);

  Serial.println("VL53L0X-Sensor bereit!");
}

void loop() {
  int distance = sensor.readRangeSingleMillimeters();

  if (sensor.timeoutOccurred()) {
    Serial.print("Timeout! ");
  }

  display.clearDisplay();
  display.setCursor(0, 0);
  display.print("Abstand: ");
  display.print(distance);
  display.print(" mm");
  display.display();

  Serial.print("Abstand: ");
  Serial.print(distance);
  Serial.println(" mm");

  delay(1000);
}

Lade den Sketch auf Deinen Arduino UNO hoch. Die gemessene Entfernung sollte nun auf dem OLED-Display angezeigt werden.

Möchtest du die Entfernung lieber mit Ultraschall messen? Bei uns erfährst du auch, wie das geht.

]]>
CircuitMess Spencer – Sprachassistent im Eigenbau https://polluxlabs.net/arduino-tutorials/circuitmess-spencer-sprachassistent-im-eigenbau/ Fri, 21 May 2021 17:58:52 +0000 https://polluxlabs.net/?p=8618 Es gibt mittlerweile viele Bausätze, die Kindern und Erwachsenen die Welt der Elektronik näher bringen. Dank der immer günstigeren Technik, sind diese Kits aber längst nicht mehr auf das gute alte UKW-Radio begrenzt.

Das Internet of Things liegt im Trend und wird sicherlich auch nicht wieder verschwinden. So ist es nur logisch, dass sich auch ältere Kinder und Heranwachsende mit diesem spannenden Thema beschäftigen möchten.

Ein besonders interessanter Bausatz in diesem Bereich ist Spencer – der DIY Sprachassistent von CircuitMess.

CircuitMess Spencer

Spencer ist ein Sprachassistent, der eine Vielzahl von Anweisungen verstehen und ebenso viele Fragen beantworten kann. Du kannst ihn z.B. nach der Uhrzeit fragen, oder wie das Wetter draußen ist. Oder ihn bitten, dir einen Witz zu erzählen. Der Fokus liegt hier auf Spaß – viele deiner Fragen wird Spencer mit einem launischen Kommentar beantworten. Trotzdem ist er immer wieder für einen Überraschung gut.

Allerdings: Aktuell (Stand Mai 2021) versteht und spricht Spencer nur Englisch. Da die Gespräche jedoch recht einfach gehalten sind, sollten auch größere Kinder (der Bausatz ist ab 11 Jahren) mit ihrem Schulenglisch gut zurecht kommen.

Was kann ich lernen?

Du steckst den Bausatz nicht einfach nur zusammen und fertig. Um Spencer aufbauen zu können, musst du ein paar wenige Bauteile verlöten – deshalb ist ein Lötkolben unbedingt erforderlich. Das Löten hält sich aber in Grenzen und ist auch recht einfach gehalten. Du musst lediglich ein paar Stiftleisten, Widerstände, Kondensatoren etc. auf die Platinen löten. Schiefgehen kann hier eigentlich nichts.

Abgesehen vom Löten lernst du auch deine eigenen Programme zu erstellen. CircuitMess hat hierfür einen eigenen Code-Editor erstellt, mit dem du grafisch – also ohne tatsächlich Code zu schreiben – sogenannte Sketches für den Spencer programmieren kannst.

CircuitBlocks Programm
Ein einfaches Programm in CircuitBlocks

Die Bedienung erinnert hier stark an den beliebten Editor Scratch. Du kannst damit z.B. deinen Spencer so programmieren, dass er dir auch Knopfdruck zuhört und nachspricht, was er verstanden hat.

Was ist der CircuitMess Spencer eigentlich?

Spencer ist im Prinzip ein kleiner Kasten aus Acryl-Glas mit einem großen roten Knopf darauf. 🙂 In ihm schlummert aber recht aktuelle Technik.

An der Frontseite verleiht im ein großen Panel mit LEDs ein Gesicht. Hier kannst du Animationen laufen lassen oder auch die Uhrzeit anzeigen.

Angetrieben wird Spencer von einem ESP32 – ein Microcontroller, der für seinen Bereich recht leistungsstark ist und sich auch mit deinem WLAN verbinden kann. Apropos Internet: Um Spencer sinnvoll verwenden zu können, solltest du Zugriff auf ein WLAN-Netzwerk haben.

Auf der Rückseite befindet sich ein kleiner Lautsprecher, über den dir Spencer antworten kann. Fehlt noch der große rote Knopf – diesen drückst du, um Fragen zu stellen und Anweisungen zu geben. Natürlich kannst du ihn in deinen eigenen Programmen auch anderweitig einsetzen.

Das ist im Bausatz enthalten

Du findest im Karton natürlich alle benötigten Teile:

  • Zwei Platinen mit LEDs und dem ESP32
  • Widerstände, Kondensatoren, LED etc. zum selbst verlöten
  • Die Box aus Acrylglas
  • Lautsprecher und Knopf
  • Schrauben und Muttern
  • Das passende USB-Kabel

Nicht enthalten ist das Werkzeug. Du benötigst du noch einen Lötkoblen samt Lötzinn, einen Saitenschneider und einen Kreuzschraubendreher.

Auch ein Netzteil ist nicht dabei – du kannst deinen Spencer zwar über USB von deinem Computer aus mit Strom versorgen. Falls du das nicht möchtest, benötigst du noch ein handelsübliches 5V-Netzeil mit USB-Port.

Spencer aufbauen

Für den Aufbau solltest du dir ungefähr zwei Stunden Zeit nehmen, um dich in aller Ruhe dem Löten widmen zu können. Denn damit fängt alles an.

CircuitMess hat eine sehr gute Anleitung bereitgestellt, die dich Schritt für Schritt mit vielen Bildern durch den Aufbau führt. Du findest die Anleitung hier. Auch diese Anleitung ist auf Englisch – allerdings sehr einfach geschrieben, sodass sie dir keine Probleme bereiten sollte.

Wie gesagt, beginnst du mit dem Löten. Hier ist alles klar beschrieben und auf den Platinen beschriftet. Damit finden sich auch Löteinsteiger gut zurecht, zumal die Lötstellen sehr gut zugänglich sind und weit entfernt von sensiblen Teilen liegen.

Die Gefahr, dass du beim Löten also etwas kaputt machst, ist sehr gering.

Nach dem Löten folgt der Zusammenbau. Auch das macht aufgrund der Einfachheit recht viel Spaß. Alle Teile passen perfekt zusammen, sodass sich die Fummelei stark in Grenzen hält.

Die Maker von CircuitMess haben hier ganze Arbeit geleistet und dafür gesorgt, dass zu keiner Zeit auch nur ein Hauch Frust aufkommt. 🙂

CircuitBlocks installieren

Nachdem du deinen Spencer zusammengebaut hast, wird es Zeit für etwas Code! Auf dem ESP32 ist bereits eine sogenannte Firmware vorinstalliert. Sobald du deinen neuen Sprachassistenten per USB mit Strom versorgst, startet er mit einer Begrüßung und dem Hinweis, dass er dein Zugangsdaten fürs Internet braucht.

Um diese Einstellung vorzunehmen – und Spencer danach auch neu zu programmieren – eignet sich der hauseigene Editor CircuitBlocks, den du hier herunterladen kannst. Sobald du CircuitBlocks installiert hast, erwartet dich eine aufgeräumte Oberfläche.

CircuitBlocks Programm-Oberfläche
CircuitBlocks nach dem ersten Start

Oben rechts findest du die beiden Buttons Restore firmware und Spencer Settings. Mit ersterem kannst du deinen Spencer jederzeit wieder in den Anfangszustand versetzen. Hinter dem zweiten trägst du deine WLAN-Zugangsdaten ein und legst fest.

Wir möchten an dieser Stelle nicht zu tief in die Grundlagen von CircuitBlocks einsteigen, denn auch hierfür gibt es eine sehr gute Anleitung.

Dein erstes eigenes Programm

Diese Anleitung führt dich auch Schritt für Schritt durch die Basics und du „schreibst“ deinen ersten eigenen Code für deinen CircuitMess Spencer. Allerdings „schreibst“ du ihn nicht wirklich, sondern verwendest die Code-Blöcke auf der linken Seite. Du kannst dir aber jederzeit den Code, der hieraus in der Programmiersprache C++ generiert wird, anzeigen lassen.

Mit den Beispiel-Programmen in der Anleitung zauberst du zunächst Animationen auf das LED-Panel und lässt verschiedene Sound abspielen. Anschließend wird es allerdings schon spannender: Mit wenigen Blöcken bringst du Spencer dazu, dir zuzuhören und das, was er gehört hat, nachzusprechen. Er versteht allerdings nur Englisch, wie gesagt.

Programm für Spencer in CircuitBlocks

Fazit

Dieser Bausatz vom jungen, kroatischen Unternehmen CircuitMess vereint mehrere interessant Aspekte des Bastelns mit Elektronik. Da wäre zum Einen das Löten, das seinen ganz eigenen Charme hat – allerdings hier auch Anfänger nicht überfordert. Allerdings hat natürlich nicht jede*r einen Lötkolben zu Hause – diese gibt es jedoch schon sehr günstig im Handel. Und wer weiß, vielleicht ist das ja nicht das letzte Lötprojekt.

Zum Anderen, dass Spencer zum Themenbereich Internet of Things gehört, also mit der Welt da draußen interagieren kann. CircuitMess spricht auch gerne davon, dass Bastler etwas über künstliche Intelligenz und Spracherkennung lernen. Das stimmt zwar im weitesten Sinne, wir hätten uns jedoch etwas mehr „Stoff“ zu diesem Thema gewünscht.

Apropos, zu vielen Aspekten dieser Themen findest du Tutorials bei Pollux Labs.

Die Verarbeitung aller Bauteile ist exzellent und auch die Verpackung ist liebevoll gestaltet und hochwertig – was für den relativ hohen Preis auch gerechtfertigt ist.

Angehende Makerinnen und Maker finden im CircuitMess Spencer viel Anregung und eine Herausforderung, die gut zu bewältigen ist. Und auch nach dem Aufbau bietet das Programmieren und Ausprobieren noch viele Wochen Spaß – wenn das Thema denn begeistert.

]]>
Die Uhrzeit mit einer RTC (Real Time Clock) ermitteln und anzeigen https://polluxlabs.net/arduino-tutorials/die-uhrzeit-mit-einer-rtc-real-time-clock-ermitteln-und-anzeigen/ Fri, 14 May 2021 14:31:46 +0000 https://polluxlabs.net/?p=8571 Brauchst du für dein Arduino-Projekt die aktuelle Uhrzeit – vielleicht, weil du dir mit einem LCD-Display eine Uhr bauen möchtest, oder einen Zeitstempel für deine Daten benötigst? Dann eignet sich hierfür perfekt die RTC, oder Real Time Clock.

In diesem Tutorial erfährst du, wie du die das RTC-Modul DS1307 am Arduino anschließt und damit die aktuelle Uhrzeit samt Datum auf einem Display anzeigst.

Was ist eine Real Time Clock?

In den meisten Fällen erhältst du beim Kauf einer Real Time Clock* ein Modul, auf dem oft ein DS1307 samt einer kleinen Batterie verbaut ist. Diese sorgt dafür, dass dein Arduino die aktuelle Zeit ermitteln kann, auch wenn es zwischenzeitlich zu einem Stromausfall gekommen ist – denn die RTC wird weiterhin mit Strom versorgt.

Diese Bauteile sind in der Regel recht preisgünstig und werden per I²C am Microcontroller angeschlossen. Die Genauigkeit ist für die allermeisten Projekte ausreichend und die Knopfbatterie hält bis zu fünf Jahre durch.

Die RTC am Arduino anschließen

Dank der Verbindung per I²C benötigst du nur vier Kabel, um die Real Time Clock an deinem Arduino anzuschließen. Wenn du einen Arduino UNO verwendest, benötigst du (neben GND und 5V) hierfür die Pins A4 und A5. Orientiere dich an folgender Skizze:

RTC am Arduino UNO

Wenn du ein anderes Arduino-Modell verwendest, findest du die benötigten Pins in der Arduino-Referenz. Am ESP8266 kommunizierst du mit den Pins D1 (SCL) und D2 (SDA) per I²C. Da der ESP8266 über WLAN verfügt, kannst du hier natürlich aber auch die aktuelle Zeit von einem NTP-Server abfragen.

Die benötigten Bibliotheken

Um eine RTC mit dem Chip DS1307 verwenden zu können, benötigst du zwei Bibliotheken. Öffne hierfür den Bibliotheksverwalter und suche dort nach nach DS1307rtc. Du findest neben der gleichnamigen Bibliothek auch die Bibliothek Time. Installiere jeweils die aktuelle Version.

Sollte deine Real Time Clock einen anderen Chip haben, suche stattdessen nach dessen Namen. Im Folgenden arbeiten wir jedoch mit dem DS1307 weiter.

Wenn beide Bibliothek in deiner Arduino IDE installiert sind, kann es auch schon mit dem Einstellen der Uhr weitergehen.

Die aktuelle Uhrzeit in der RTC einstellen

Bevor in deinem RTC-Modul die Uhr ticken kann, muss es natürlich erst einmal wissen, wie viel Uhr es ist. Hierfür benötigst du einen Sketch, der bereits in den mitgelieferten Beispielen der Bibliothek DS1307RTC vorhanden ist.

Den Sketch findest du in der Arduino IDE unter Datei > Beispiele > DS1307RTC > SetTime

Öffne ihn und lade ihn auf deinen Arduino. Mit diesem Sketch „lädt“ dein Arduino die aktuelle Uhrzeit samt Datum von deinem Computer und speichert beides in der RTC.

RTC mit SetTime einstellen

Das war es auch schon mit der Konfiguration. Den Sketch SetTime musst du erst wieder nach dem nächsten Batteriewechsel ausführen.

Uhrzeit und Datum im Seriellen Monitor ausgeben

Für einen ersten Test reicht ebenfalls ein Beispiel-Sketch der Bibliothek. Öffne im gleichen Verzeichnis den Sketch ReadTest und lade ihn auf deinen Arduino.

In deinem Seriellen Monitor sollte nun im Sekundentakt die aktuelle Uhrzeit und das Datum erscheinen.

RTC aktuelle Uhrzeit im Seriellen Monitor

Uhrzeit und Datum auf einem LCD-Display anzeigen

Der Serielle Monitor ist das Eine – aber eine Digitaluhr ist etwas ganz Anderes. Schließe hierfür zunächst dein LCD-Display am Arduino zusätzlich zur RTC an.

Danach kommt der Sketch an die Reihe. Um es einfach zu halten, haben wir einfach den Sketch ReadTest modifiziert und um das Setup des LCD-Displays und der Ausgabe darauf erweitert.

Du findest im Loop nun unter jeder Ausgabe von Stunden, Minuten etc. auch den entsprechenden lcd.print() direkt darunter.

Ein besonderer Clou ist hierbei die Funktion void print2digits(), die auch schon im Sketch vorhanden ist. Diese Funktion sorgt dafür, dass jede Zahl zweistellig angezeigt wird. Ohne diese Funktion würde die Uhrzeit 16:08 als 16:8 auf dem Display dargestellt.

Hier nun der gesamte Sketch:

#include <Wire.h>
#include <TimeLib.h>
#include <DS1307RTC.h>

#include <LiquidCrystal.h>
const int rs = 11, en = 12, d4 = 2, d5 = 3, d6 = 4, d7 = 5; //Anschlüsse LCD -> Arduino
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup() {
  Serial.begin(9600);
  while (!Serial) ; // wait for serial
  delay(200);
  Serial.println("DS1307RTC Read Test");
  Serial.println("-------------------");
}

void loop() {

  // Festlegen, wie viele Zeichen und Reihen das Display hat:
  lcd.begin(16, 2);

  tmElements_t tm;

  if (RTC.read(tm)) {
    Serial.print("Ok, Time = ");
    print2digits(tm.Hour);
    lcd.setCursor(0, 0);
    lcd.print(tm.Hour);

    Serial.write(':');
    lcd.print(':');

    print2digits(tm.Minute);
    lcd.print(tm.Minute);

    Serial.write(':');
    lcd.print(':');

    print2digits(tm.Second);
    lcd.print(tm.Second);

    Serial.print(", Date (D/M/Y) = ");
    Serial.print(tm.Day);
    lcd.setCursor(0, 1);
    lcd.print(tm.Day);

    Serial.write('/');
    lcd.print('/');
    
    Serial.print(tm.Month);
    lcd.print(tm.Month);

    Serial.write('/');
    lcd.print('/');
    
    Serial.print(tmYearToCalendar(tm.Year));
    lcd.print(tmYearToCalendar(tm.Year));
    
    Serial.println();
  } else {
    if (RTC.chipPresent()) {
      Serial.println("The DS1307 is stopped.  Please run the SetTime");
      Serial.println("example to initialize the time and begin running.");
      Serial.println();
    } else {
      Serial.println("DS1307 read error!  Please check the circuitry.");
      Serial.println();
    }
    delay(9000);
  }
  delay(1000);
}

void print2digits(int number) {
  if (number >= 0 && number < 10) {
    Serial.write('0');
    lcd.print('0');
  }
  Serial.print(number);
}

Wie geht es weiter?

Weiter Anleitungen zu Bauteilen und vollständige Arduino Projekte findest du in unserem Buch für angehende Maker:

Du hast nun die Möglichkeit, in deinem Projekt immer die aktuelle Uhrzeit zu verwenden. Welche Ideen kommen dir nun in den Sinn? Wie wäre es z.B. mit einem Wecker, der dich mit einem Piezo weckt?

]]>
Mit dem DHT11 und DHT22 Temperatur und Luftfeuchtigkeit messen https://polluxlabs.net/arduino-tutorials/mit-dem-dht22-temperatur-und-luftfeuchtigkeit-messen/ Fri, 12 Mar 2021 15:20:24 +0000 https://polluxlabs.net/?p=7246 Für den Arduino und andere Microcontroller gibt es eine Vielzahl von Sensoren, die die Temperatur messen. Zwei davon sind der DHT11 und der DHT22, die darüber hinaus auch die Luftfeuchtigkeit ermitteln können.

In diesem Tutorial lernst du, wie du den DHT11 und den DHT22 am Arduino und ESP8266 anschließt und verwendest.

Den Sensor DHT11 anschließen

Der Anschluss des DHT11 am Arduino ist ganz leicht, du benötigst lediglich drei Kabel. Orientiere dich beim Anschluss an folgender Skizze. An welchen Digital-Pin du deinen Sensor anschließt, steht dir natürlich frei. Damit der Code dieses Tutorials passt, wähle bitte den Pin 4.

Anschluss DHT11 am Arduino

Den Sensor DHT22 anschließen

Um deinen DHT22 am Arduino oder ESP8266 anzuschließen, benötigst du neben Sensor, Microcontroller, Breadboard und Kabeln einen Widerstand mit 10 kΩ. Orientiere dich beim Anschluss am Arduino an folgender Skizze:

Anschluss DHT22 am Arduino

Hier ist der Signalpin des DHT22 am Digital-Pin 4 des Arduinos angeschlossen – so passt der Anschluss zum Sketch unten. Prinzipiell steht es dir natürlich frei, welchen Digital-Pin du verwendest.

Der Anschluss am ESP8266 sieht folgendermaßen aus:

Anschluss DHT22 am ESP8266

Beim Arduino kannst du den DHT11 oder DHT22 entweder mit 5 Volt oder 3,3 Volt versorgen. Beim ESP8266 stehen dir natürlich nur 3,3 Volt zur Verfügung.

Die passenden Bibliotheken

Du benötigst zwei Bibliotheken, von denen du jedoch nur eine im Sketch einbinden musst. Öffne zunächst deinen Bibliotheksmanager und suche dort nach Adafruit Unified Sensor. Installiere anschließend die aktuelle Version.

Bibliothek Adafruit Unified Sensor

Suche nun nach DHT11 oder DHT22 und installiere die Bibliothek DHT sensor library.

Wenn du beide Bibliotheken erfolgreich installiert hast, geht es weiter mit der Messung.

Temperatur und Luftfeuchtigkeit messen

Binde als erstes die Bibliothek für den Sensor zu Beginn deines Sketchs ein:

#include "DHT.h"

Anschließend definierst du den Pin, an dem der Sensor angeschlossen ist. In der Zeile danach legst du den Typ des DHT fest: In unserem Fall also DHT22 – wenn du einen DHT11 verwendest, kannst du die Zeile entsprechend abändern.

#define DHTPIN 4   
#define DHTTYPE DHT22

Nun fehlen noch zwei Variablen für die Temperatur und die Luftfeuchtigkeit sowie ein Objekt für den Sensor namens dht.

float temp;
float humidity;

DHT dht(DHTPIN, DHTTYPE);

In der Setup-Funktion startest du den Sensor mit

dht.begin();

Die eigentliche Messung findet dann im Loop statt. Diese könnte dank der eingebundenen Bibliothek kaum einfacher sein, da es passende Funktionen gibt. Die Messergebnisse speicherst du in den entsprechenden Variablen:

temp = dht.readTemperature();
humidity = dht.readHumidity();

Und das war es schon. Hier nun der vollständige Sketch, in dem du die Messergebnisse alle zwei Sekunden im Seriellen Monitor ausgibst:

#include "DHT.h"

#define DHTPIN 4   
#define DHTTYPE DHT22

float temp;
float humidity;

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  dht.begin();
}

void loop() {

  temp = dht.readTemperature();
  humidity = dht.readHumidity();
  
  Serial.print("Temperatur: ");
  Serial.print(temp);
  Serial.println(" *C");
  Serial.print("Luftfeuchtigkeit: ");
  Serial.print(humidity);
  Serial.println(" %");

  Serial.println();
  delay(2000);

}

Wie geht es weiter?

Wie wäre es mit einem eigenen ESP8266 Web Server, über den du die aktuelle Temperatur vom Smartphone aus abrufen kannst?

]]>
Farben erkennen mit einem Farbsensor und dem Arduino https://polluxlabs.net/arduino-tutorials/farben-erkennen-mit-einem-farbsensor-und-dem-arduino/ Sun, 27 Dec 2020 18:50:27 +0000 https://polluxlabs.net/?p=4597 Mit einem Farbsensor bringst du deinem Arduino bei, verschiedene Farben voneinander unterscheiden zu können. Zwar können die meisten Sensoren keine feinen Unterschiede erkennen – um aber zum Beispiel die Farben von M&Ms oder Skittles erkennen zu können, reichen sie allemal!

Hier lernst du, wie du einen Farbsensor* anschließt, damit Farben erkennst und diese in das bekannte RGB-Modell umrechnest. In diesem Tutorial verwenden wir den gängigen Sensor TC3200.

AZDelivery Farbsensor TCS230 TCS3200 Farben Sensor Modul kompatibel mit Arduino inklusive E-Book!
AZDelivery Farbsensor TCS230 TCS3200 Farben Sensor Modul kompatibel mit Arduino inklusive E-Book!
✅ Chip: TAOS TCS3200 RGB Sensor; ✅ Eingangsspannung: DC 3 ~ 5V; ✅ Hellweiße LEDs...
8,99 €

Den Farbsensor am Arduino anschließen

Am Sensor findest du insgesamt 8 Pins, von denen du 7 mit deinem Arduino wie folgt verbinden kannst. Die Wahl der Digitalpins ist natürlich dir selbst überlassen.

FarbsensorArduino (Digitalpin)
VCC5V
GNDGND
S06
S17
S28
S39
OUT10

Eine kurze Erklärung zu den einzelnen Pins am Farbsensor: Mit den Pins S0 und S1 kannst du die Ausgangsfrequenz des Sensors steuern. So kannst du deine Ergebnisse optimieren, was wir in diesem Tutorials allerdings erst einmal beiseite lassen.

Die Pins S2 und S3 steuern die einzelnen Photodioden des Sensors. Hiervon gibt es je 16 Stück für die Farben Rot, Grün, Blau und Clear (also ohne Farbfilter). Die beiden Pins kannst du von deinem Arduino entweder auf HIGH oder LOW setzen – die Kombination bestimmt dann, welche Dioden angesprochen und welche Farbe also „gelesen“ werden soll:

S2S3Farbe
LOWLOWRot
LOWHIGHBlau
HIGHLOWClear (kein Filter)
HIGHHIGHGrün

Gleich im Sketch schauen wir uns diese Kombinationen genauer an. Es fehlt allerdings noch der Pin OUT – hierüber liest dein Arduino die Messergebnisse ein.

Der Sketch zum Farben erkennen

Kommen wir also zum Code. Du benötigst für den Farbsensor keine eigene Bibliothek, sondern kannst die Messungen mit ein paar einfachen Funktionen selbst erledigen. Definiere zunächst die verwendeten Anschlüsse zu Beginn des Sketchs:

#define S0 6
#define S1 7
#define S2 8
#define S3 9
#define sensorOut 10

Anschließend benötigst du noch je drei Variablen für die Roh- und RGB-Werte der einzelnen Farben Rot, Grün und Blau:

int frequencyR = 0;
int frequencyG = 0;
int frequencyB = 0;

int red = 0;
int green = 0;
int blue = 0;

Die Setup-Funktion

Hier startest du deinen Seriellen Monitor und definierst die einzelnen pinModes:

Serial.begin(115200);

pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
pinMode(sensorOut, INPUT);

Wie du siehst, sprichst du die Pins S1 bis S3 von deinem Arduino aus an (OUTPUT) und möchtest vom Pin sensorOut Messdaten erhalten (INPUT). Fehlt noch eine Sache: Wie oben kurz erwähnt, steuerst du mit den Pins S1 und S2 die Ausgangsfrequenz. Diese setzt du mit den folgenden zwei Zeilen auf 20%:

digitalWrite(S0, HIGH);
digitalWrite(S1, LOW);

Für die Ausgangsfrequenz gibt es festgelegte Werte und Kombinationen. Wenn du etwas tiefer einsteigen und die Ergebnisse deines Sensors optimieren möchtest, orientiere dich an dieser Tabelle:

S0S1Ausgangsfrequenz
LOWLOWAus
LOWHIGH2%
HIGHLOW20%
HIGHHIGH100%

Der Loop

Kommen wir also zu den Messungen. Im Loop deines Sketchs führst du für jede der drei Farben Rot, Grün und Blau eine separate Messung durch und rechnest deine Ergebnisse in den RGB-Farbraum um. Zunächst der Code für Rot:

digitalWrite(S2, LOW);
digitalWrite(S3, LOW);

frequencyR = pulseIn(sensorOut, LOW);
Serial.print("Red = ");
Serial.print(frequencyR);

Als erstes setzt du die beiden Pins S2 und S3 auf LOW, um nur die Photodioden mit rotem Farbfilter anzusprechen. Anschließend liest du den Wert mit der Funktion pulseIn() ein und speicherst den Wert in der Variablen frequencyR. Zuletzt gibst du ihn im Seriellen Monitor aus. In der Arduino-Referenz lernst du mehr über die Funktion pulseIn().

Mit diesen Messergebnissen kannst du noch nicht viel anfangen – besser ist es, wenn du einen bekannten Wert wie den Rotanteil im RGB-Modus erhältst. So kannst du nämlich zusammen mit den Ergebnissen der Farben Grün und Blau die Farbe vor deinem Sensor mehr oder weniger genau bestimmen und sie z.B. zur Kontrolle auf einem TFT-Display* anzeigen.

Um das zu erreichen, bietet sich die Funktion map() an:

map(frequencyR, 20, 120, 255, 0)

In dieser Funktion benötigst du fünf Argumente: Zunächst den Messwert frequencyR und den Messbereich des Sensors. Hierfür machst du am besten ein paar Testmessungen mit verschiedenfarbigen Objekten vor deinem Farbsensor und schaust dir die Minimal- und Maximalwerte im Seriellen Monitor an. Bei uns lagen die Werte ungefähr im Bereich von 20 bis 120 – das kann bei dir jedoch anders sein.

Wenn du deinen passenden Wertebereich ermittelt hast, kommen die letzten beiden Argumente ins Spiel. Diese geben den maximalen (255) und minimalen Rotwert (0) im RGB-Modus an. Je „mehr“ Rot dein Farbsensor erkennt, desto geringer sein Messwert (bei uns also in Richtung 20). Das entspricht jedoch einem hohen Wert im RGB-Farbraum – deshalb „mappst“ du die 20 auf die 255 und andersherum die 120 auf die 0.

Alle Farben zusammen

Und das war es im Prinzip. Für die Farben Blau und Grün wiederholst du einfach das Prozedere der Farbe Rot. In deinem Seriellen Monitor siehst du nun die RGB-Werte jeder einzelnen Farbe, die zusammen in etwa die Farbe des Objekts vor dem Sensor ergeben sollten.

Hier nun der gesamte Sketch zum Rauskopieren:

//pins for color sensor
#define S0 6
#define S1 7
#define S2 8
#define S3 9
#define sensorOut 10

//raw and RGB values for each color
int frequencyR = 0;
int frequencyG = 0;
int frequencyB = 0;

int red = 0;
int green = 0;
int blue = 0;

void setup() {
  Serial.begin(115200);

  pinMode(S0, OUTPUT);
  pinMode(S1, OUTPUT);
  pinMode(S2, OUTPUT);
  pinMode(S3, OUTPUT);
  pinMode(sensorOut, INPUT);
  digitalWrite(S0, HIGH);
  digitalWrite(S1, LOW);
}

void loop() {
  digitalWrite(S2, LOW);
  digitalWrite(S3, LOW);

  frequencyR = pulseIn(sensorOut, LOW);
  Serial.print("Red = ");
  //Serial.print(frequencyR);
  red = map(frequencyR, 20, 150, 255, 0);
  Serial.print(red);


  digitalWrite(S2, LOW);
  digitalWrite(S3, HIGH);

  frequencyB = pulseIn(sensorOut, LOW);
  Serial.print(" Blue = ");
  //Serial.print(frequencyB);
  blue = map(frequencyB, 20, 150, 255, 0);
  Serial.print(blue);


  digitalWrite(S2, HIGH);
  digitalWrite(S3, HIGH);

  frequencyG = pulseIn(sensorOut, LOW);
  Serial.print(" Green = ");
  //Serial.println(frequencyG);
  green = map(frequencyG, 20, 150, 255, 0);
  Serial.println(green);

  delay(100);
}

Wie geht es weiter?

Du kannst nun Farben mit einem Farbsensor erkennen und sie in den RGB-Farbraum übertragen. Wie wäre es, wenn du dir einen eigenen Color Picker baust, mit dem du die RGB-Werte einzelner Objekte ermittelst? Hierfür bietet sich ein TFT-Display an, auf dem du die ermittelte Farbe auch gleich darstellen kannst.

]]>
Einen Servo am Arduino anschließen und verwenden https://polluxlabs.net/arduino-tutorials/einen-servo-am-arduino-anschliessen-und-verwenden/ Mon, 30 Nov 2020 19:26:23 +0000 https://polluxlabs.net/?p=4137

Früher oder später kommt jeder Maker an den Punkt, an dem er ein Projekt mit einem Servo-Motor bauen möchte – z.B. für einen Zeiger oder für einen Roboterarm. In diesem Tutorial lernst du, wie du einen Servo am Arduino anschließt und steuerst. Du erfährst, wie du den kleinen Motor mit einem Poti verwendest, Sensordaten damit visualisierst und was es bei der Stromzufuhr zu beachten gilt.

Was ist ein Servo?

Zunächst ein paar Worte darüber, was ein Servo eigentlich ist: Hierbei handelt es sich um einen Motor, der nicht einfach nur anfängt zu laufen, sondern den du auf eine bestimmte Position drehen kannst. Das heißt, du kannst ihm einen Winkel von 0° bis 180° zuweisen und damit z.B. einen am Servo montierten Zeiger im Halbkreis drehen lassen.

Die Bibliothek Servo.h

Damit die Steuerung für dich so einfach wie möglich ist, gibt es die Bibliothek Servo.h – die in der Regel bereits vorinstalliert ist, sodass du sie ohne Umwege in deinem Sketch einbinden kannst. Mit ihr kannst du bis zu 12 Motoren an einem Arduino verwenden (am Arduino Due sogar 60).

Binde die Bibliothek am Anfang deines Sketchs wie folgt ein:

#include <Servo.h>

Zwei Funktionen der Bibliothek benötigst du immer wieder, wenn du mit Servos arbeitest:

  • attach(pin) – Hier legst du einmalig den Pin fest, an dem dein Servo-Motor angeschlossen ist
  • write(angle) – Damit „fährst“ du den Servo an den gewünschten Winkel (angle)

Im Verlauf dieses Tutorials schauen wir uns diese Funktionen genauer an. Weitere Funktionen dieser Bibliothek lernst du in der Arduino-Referenz kennen.

Die Minimalschaltung

Für die allerersten Gehversuche reicht es, wenn du deinen Servo wie folgt mit deinem Arduino verbindest. Für das Signal (orange) kannst du natürlich einen Digitalpin deiner Wahl verwenden. In den folgenden Sketches verwenden wir jedoch immer Pin 8.

Anschluss eines Servos am Arduino Uno
Screenshot: Tinkercad

Hinweis: Jeder Servo hat drei Kabel: Strom (5V), Masse (GND) und Signal. Diese haben jedoch je nach Modell eine unterschiedliche Reihenfolge. Vergewissere dich immer, dass du alles richtig angeschlossen hast, bevor du ihn mit Strom versorgst.

Der erste Sketch

Auch hier halten wir alles so einfach wie möglich. Kopiere dir den folgenden Sketch und lade ihn auf deinen Arduino.

#include <Servo.h>

Servo myServo;

void setup() {
  myServo.attach(8);
}

void loop() {
  myServo.write(0);
  delay(2000);
  myServo.write(90);
  delay(2000);
  myServo.write(180);
  delay(2000);
  myServo.write(90);
  delay(2000);
}

Ganz oben im Sketch bindest du die Bibliothek Servo.h ein. Danach erstellst du ein Objekt mit dem Namen myServo.

Im Setup verknüpfst du mithilfe der Funktion attach() den Digitalpin mit diesem Objekt – oder einfacher gesagt, du teilst deinem Arduino mit, dass dein Servo am Pin 8 hängt.

Im Loop steuerst du mit deinem Motor nun verschiedene Winkel mit der Funktion write() an. Du beginnst bei 0° und wartest zwei Sekunden. Danach drehst du weiter auf 90°, dann auf 180°, zurück auf 90° – und wieder von vorne.

Einen Kondensator verwenden

Ein Servo benötigt recht viel Strom, vor allem zu Beginn einer Bewegung. Das kann zu einem Spannungsabfall führen, der zu ungewünschten Ergebnissen bis hin zu einem Reset des Arduinos führen kann.

Um dem vorzubeugen, kannst du einen Kondensator* in die Stromversorgung des Motors einbauen, wie du hier sehen kannst:

Arduino mit Servo und dazwischen geschaltetem Kondensator
Screenshot: Tinkercad

Der Kondensator mit einer Kapazität von mindestens 470µF speichert Energie, die der Servo neben jener vom Arduino nutzen kann. Damit kannst du den Spannungsabfall etwas verringern.

Hinweis: Wenn du einen Elektrolytkondensator* (Elko) verwendest, achte unbedingt auf die richtige Polarität: Die Seite mit dem hellen Strich (s. Screenshot oben) muss an Erde (GND). Wenn du die Seiten vertauschst, kann der Kondensator explodieren!

Wenn auch ein Kondensator nicht hilft, kannst du deinen Servo an seinen eigenen Stromkreis anschließen, der vom Arduino (und weiteren dort angeschlossenen Teilen) unabhängig ist.

Den Servo mit einem Poti steuern

Jetzt gehen wir noch einen Schritt weiter: Du steuerst deinen Motor mit einem Poti*. Ziel ist es hierbei, dass er sich analog zu den Bewegungen des Potentiometers dreht.

Füge also deinem Aufbau ein Poti wie folgt hinzu.

Einen Servo mit dem Poti steuern
Screenshot: Tinkercad

Kopiere dir anschließend den folgenden Sketch und lade ihn auf deinen Arduino:

#include <Servo.h>

int servoPosition;
int potiValue;

Servo myServo;

void setup(){
  pinMode(0, INPUT);
  myServo.attach(8);
}

void loop(){
  delay(10);
  potiValue = analogRead(0);
  servoPosition = map(potiValue, 0, 1024, 0, 180);
  myServo.write(servoPosition);
}

Neu in diesem Sketch sind zwei Variablen. In servoPosition speicherst du den Winkel, den der Servo ansteuern soll. In potiValue steht der aktuelle Wert des Potis, den du so ausliest und speicherst:

 potiValue = analogRead(0);

Jetzt wird es interessant: Den Winkel des Servos bestimmst du mit der Funktion map(). Hier „mappst“ du den Wert, den dein Poti ausgibt (potiValue) auf den entsprechenden Winkel des Servos (servoPosition). Hierfür benötigst du sowohl für den Poti als auch für den Motor den Minimal- und Maximalwert. Für den Poti sind das 0 und 1024 – für den Servo 0 und 180 (Grad).

 servoPosition = map(potiValue, 0, 1024, 0, 180);

Zuletzt bewegst du den Motor auf die errechnete Position:

 myServo.write(servoPosition);

Steuerung mit einem Sensor

Noch ein letztes Experiment: Diesmal lässt du einem Temperatursensor den Servo steuern. Hier verwenden wir einen einfachen TMP36*, aber du kannst natürlich auch jeden anderen Temperatursensor verwenden.

Du ahnst sicher schon, worauf das Ganze hinausläuft – genau, ein Analogthermometer. Ersetze den Poti zunächst einfach durch den TMP36:

Servo mit einem Temperatursensor steuern
Screenshot: Tinkercad

Im Sketch musst du ebenfalls nicht viel verändern. Wir haben nur den Namen der Variablen und die Funktion map() angepasst:

#include <Servo.h>

int servoPosition;
int temp;

Servo myServo;

void setup() {
  pinMode(0, INPUT);
  myServo.attach(8);
  Serial.begin(115200);
}

void loop() {
  delay(10);
  temp = analogRead(0);
  servoPosition = map(temp, 20, 358, 0, 180);
  myServo.write(servoPosition);
}

Wie du in der Funktion siehst, haben wir für den TMP36 einen Bereich von 20 bis 358 angegeben. Achte darauf, dass du hier einen für deinen Sensor passenden Wertebereich angibst. Übrigens, wenn du nicht die volle Bandbreite nutzen möchtest, also z.B. den Sensor nur zwischen 20° und 160° drehen möchtest, kannst du das natürlich in der Funktion anpassen.

Möchtest du ein reales Beispiel? Dann wir feinen Blick in unser Analogthermometer. Oder auf das Code-Schloss mit Folientastatur.

Und das soll es gewesen sein. 🙂 Du weißt jetzt, wie du einen Servo-Motor am Arduino anschließt und ihn auf verschiedene Arten und Weisen steuern kannst. Viel Spaß bei deinen weiteren Experimenten!

]]>
Video-Livestream mit der ESP32-CAM https://polluxlabs.net/arduino-tutorials/video-livestream-mit-der-esp32-cam/ Fri, 23 Oct 2020 06:23:00 +0000 https://polluxlabs.net/?p=3211 Mit der ESP32-CAM kannst du einfach und günstig deine Kameraprojekte umsetzen, wie z.B. unsere Fotofalle. Aber es müssen ja nicht immer nur Fotos sein – ein Video-Livestream geht auch!

In diesem Tutorial lernst du, wie du mit deiner ESP32-CAM einen Livestream aufsetzt, den du in deinem Browser aufrufen kannst. Hierfür benötigst du:

Vorbereitungen

Wenn du deine ESP32-CAM noch nie mit der Arduino IDE programmiert hast, musst du sie dort erst verfügbar machen. Da dieses Board keinen eigenen USB-Anschluss hat, benötigst du außerdem eine FTDI-Programmer, um deinen Sketch hochzuladen.

Wie beides funktioniert lernst du in diesem Tutorial hier bei uns. 🙂

Sobald die Verbindung von deinem Computer zur ESP32-CAM steht, kann es weitergehen.

Den Sketch hochladen

Die Konfiguration und das Hochladen des passenden Sketchs fallen in diesem Tutorial ziemlich angenehm aus: er befindet sich nämlich schon in deiner Arduino IDE. Wähle im Menü Datei -> Beispiele -> ESP32 -> Camera -> CameraWebServer. Daraufhin öffnet sich der Sketch, den du benötigst.

Zwei Kleinigkeiten musst du jedoch noch anpassen: Trage zunächst den Namen und das Passwort deines WLAN-Netzwerks ein.

Netzwerkdaten für den Videostream

Außerdem musst du noch das richtige Board auswählen. In unserem Fall (und in den meisten anderen Fällen auch) ist das AI Thinker. Lösche hierfür den Kommentar vor dem Board, sodass nur deines aktiv ist.

Board auswählen für den Video-Livestream

Lade nun den Sketch auf die ESP32-CAM. Vergiss nicht für den Upload die Pins IO0 und GND zu verbinden. Sobald der Code auf dem Board ist, trenne diese Verbindung wieder, starte deinen Seriellen Monitor und drücke zuletzt den RESET-Button auf dem Board.

Den Video-Livestream starten

Nun solltest du nach ein paar Sekunden (zwischenzeitliche Fehlermeldungen machen nichts) folgendes in deinem Seriellen Monitor sehen. Die IP-Adresse kann variieren.

Ausgabe im Seriellen Monitor

Klicke nun auf den Link oder kopiere dir die Adresse heraus und setze sie in deinem Browser ein. Du solltest nun auf der linken Seite eine ganze Reihe von Einstellungsmöglichkeiten sehen. Ganz unten befindet sich der Button Start Stream – ein Klick darauf startet den Stream.

Der Video-Livestream

Und das war es auch schon. Du kannst nun mit den Einstellungen experimentieren, um die bestmögliche Leistung zu erhalten. Außerdem hast du ganz unten auch die Option, eine Gesichtserkennung zu aktivieren, die wir hier jedoch nicht weiter behandeln.

Zwei Hinweise noch: Du kannst den Livestream nur aus deinem eigenen WLAN-Netz aus aufrufen. Dieses Tutorial ist zum Ausprobieren gedacht – wenn du die Kamera produktiv einsetzen möchtest, mache dir vorab Gedanken zur IT-Sicherheit.

]]>
Künstliche Intelligenz für Alle – mit Teachable Machine https://polluxlabs.net/arduino-tutorials/kuenstliche-intelligenz-fuer-alle-mit-teachable-machine/ Thu, 22 Oct 2020 10:53:29 +0000 https://polluxlabs.net/?p=3181 Denkst du beim Schlagwort Künstliche Intelligenz an AlphaGo, Unsupervised Learning und komplizierte Statistik? Dann hast du zwar Recht, aber das heißt nicht, dass der Einstieg in dieses spannende Thema schwer ist.

In diesem Tutorial lernst du Googles Anwendung Teachable Machine kennen, mit der du in wenigen Minuten selbst ein KI-Modell erstellst, um z.B. Objekte zu erkennen. Wir haben hierfür dem Computer beigebracht, Tomaten, Zitronen und Zauberwürfel voneinander unterscheiden zu können.

Googles Teachable Machine unterscheidet Objekte

Was ist Teachable Machine?

Mit dem Service Teachable Machine von Google erstellst du im Handumdrehen Modelle, mit denen dein Computer Bilder, Töne und Posen unterscheiden kann. Die benötigten Daten stellst du entweder per Upload oder direkt über die Webcam bzw. das Mikrofon deines Computers zur Verfügung. Diese werden laut Google übrigens nicht hochgeladen, sondern verlassen deinen Computer nicht.

Anschließend erstellst du hieraus mit wenigen Klicks ein KI-Modell, das du anschließend gleich testen kannst. Wenn du mit deinem Modell zufrieden bist, kannst du es exportieren und es z.B. auf deinem Raspberry Pi weiterverwenden. Teachable Machine läuft in deinem Browser und ist kostenlos.

Homepage von Teachable Machine

Zitronen von Tomaten unterscheiden – und von Zauberwürfeln

Im Folgenden möchten wir dem Computer beibringen, drei Objekte voneinander zu unterscheiden – und zwar anhand von Bildern dieser Objekte. Hierfür benötigen wir so viele Bilder wie möglich, denn beim maschinellen Lernen gilt: Je mehr Daten, desto besser.

Teachable Machine bietet hierfür zwei Möglichkeiten: den Upload von Fotos oder die Verwendung der Webcam, die dann eine Reihe von Fotos schießt.

Um zu starten, besuche die Webseite von Teachable Machine und klicke auf den Button Erste Schritte. Wähle anschließend Bildprojekt. Auf der nächsten Seite findest du dein leeres Projekt. Links findest du die Klassen, die dein Computer voneinander unterscheiden soll.

Leeres Bildprojekt in Teachable Machine

Vergebe hier also zunächst aussagekräftige Namen und füge bei Bedarf über Klasse hinzufügen weitere hinzu. Wähle dann in jeder Klasse einen der beiden Buttons Webcam und Hochladen, je nachdem wie du das Bildmaterial zur Verfügung stellen möchtest.

Praktisch ist die Webcam – hier hältst du einfach ein Objekt vor die Kamera und hältst den Button Zum Aufnehmen halten gedrückt. Die Webcam schießt dann in schneller Folge Fotos. Damit die KI das Objekt von allen Seiten kennenlernt, solltest du es vor der Kamera drehen.

Ein paar wenige Fotos reichen fürs maschinelle Lernen nicht aus. Erstelle deshalb von jedem Objekt mindestens 250 Stück. Keine Angst, mit der Webcam dauert das nur wenige Sekunden. Wenn du mit jedem deiner Objekte fertig bist, wird es Zeit, das Modell zu trainieren.

Das KI-Modell trainieren

Jetzt kommt die nächste Karte in deinem Browserfenster dran. Klicke auf den Button Modell trainieren. Dieser Vorgang kann einige Minuten dauern, während denen du das Tab nicht schließen darfst.

Modell trainieren in Teachable Machine

Mit einem Klick auf Erweitert kannst du noch weitere Einstellungen öffnen, mit denen du das Training feinjustieren kannst. Du erhältst zu jeder Option eine kurze Erklärung und kannst über Details noch etwas tiefer in die Materie einsteigen.

Wenn das Training beendet ist, springt die dritte Karte an: die Vorschau deines Modells.

Teste dein Modell

Falls noch nicht geschehen, kannst du in der Vorschau deine Webcam anschalten und testen, ob deine KI die Objekte richtig unterscheiden kann. Alternativ kannst du hier auch Fotos der Objekte hochladen.

Unterhalb des Vorschau- bzw. Testbilds siehst du für jede deiner Klassen einen Balken mit einer Prozentangabe. Dieser Balken füllt sich, je nachdem, was die KI glaubt zu erkennen. In unserem Test haben wir eine Zitrone vor die Kamera gehalten und voilá – der Computer konnte sie erkennen.

Erkannte Zitrone in Teachable Machine

Solltest du mit dem Ergebnis unzufrieden sein, gehe entweder noch einmal zurück zum Anfang und stelle mehr Daten zur Verfügung. Achte darauf, dass du der KI dein Objekt nicht nur von einer Seite „zeigst“. Wenn die KI immer noch keine guten Ergebnisse liefert, spiele mit den Einstellungen im Training – so lange bis die die Maschine versteht, was sie vor der Linse hat. 🙂

Exportiere dein Modell

Wenn du zufrieden bist und dein KI-Modell für ein Projekt einsetzen möchtest, kannst du es über den Button Modell exportieren herunterladen. Hierfür stehen dir verschiedene Optionen zur Verfügung. Du kannst es z.B. als Tensorflow Lite exportieren und mit einem Raspberry Pi und einer Kamera ein mobiles Projekt bauen, das deine Objekte unterscheiden kann.

Übrigens, Teachable Machine ist nicht der einzige Service, mit dem einfach KI-Modelle trainieren kannst. In unserem Themenbereich Künstliche Intelligenz erfährst du mehr über Edge Impulse. Mit dieser ebenfalls kostenlosen Anwendung kannst du z.B. Gesten mit einem Arduino Nano erkennen.

Wie immer gilt: Deiner Fantasie sind keine Grenzen gesetzt! 🙂

]]>
Leg los mit CircuitPython https://polluxlabs.net/arduino-tutorials/leg-los-mit-circuitpython/ Mon, 12 Oct 2020 12:30:12 +0000 https://polluxlabs.net/?p=2972

Suchst du einen leichten Zugang in die Welt der Microcontroller und Elektronikprojekte? Oder bist du schon ein alter Hase und hast einfach Lust auf etwas Neues? Es gibt eine Menge Gründe, CirycuitPython auszuprobieren!

In diesem Artikel erfährst du, was CircuitPython ist und was du brauchst, um damit durchzustarten. Wir schreiben zusammen etwas Python-Code und lassen ein paar LEDs wilde Sachen machen. 🙂

Was ist CircuitPython?

Das New Yorker Unternehmen Adafruit hat im Sommer 2017 ihre „neue“ Programmiersprache vorgestellt: CircuitPython. Hierbei handelt es sich um einen sogenannten Fork von MicroPython, einer anderen Sprache, die ebenso für die Programmierung von Microcontrollern entwickelt wurde. Beide Programmiersprachen basieren auf Python 3 – CircuitPython wurde jedoch mit dem Ziel entwickelt, besonders einsteigerfreundlich zu sein.

Python gilt als leicht zu erlernende Programmiersprache und wird mittlerweile auch bereits in der Schule unterrichtet. Dabei ist Python nicht nur etwas für Einsteiger – auch komplexe Projekte im Bereich der künstlichen Intelligenz werden z.B. mit Python realisiert.

Welche Vorteile hat CircuitPython?

Abgesehen davon, dass Python relativ leicht zu lernen ist, hat der Einsatz von CircuitPython noch weitere Vorteile.

Vermutlich hast du bereits in der Arduino IDE Sketches in C++ geschrieben und auf dein Board geladen. Dann weißt du, dass jede Änderung im Code mit einem längeren Update des Boards verbunden ist: Der Sketch wird kompiliert und dann vollständig auf den Microcontroller geladen – was ganz schön lange dauern kann.

Anders bei CircuitPython: Wenn du dein Board per USB an deinen Computer anschließt, wird es als Laufwerk erkannt. Hierauf befindet sich der Python-Code z.B. in der Datei code.py – diese Datei kannst du theoretisch mit jedem Text-Editor öffnen und verändern. Sobald du deine Änderungen gespeichert hast, resettet sich dein Board automatisch und läuft mit dem neuen Code – eine Sache von wenigen Sekunden.

Der große Unterschied hierbei ist, dass C++ kompiliert wird und Python (also auch CircuitPython) interpretiert. Wie bitte? Um nicht den Rahmen dieses Artikel zu sprengen, lies bitte hier mehr über Kompilieren und Interpretieren, wenn dich das Thema interessiert.

Die REPL

Das klingt schon ziemlich schnell, aber es geht noch schneller. Wenn auf deinem Board CircuitPython läuft, kannst du mit ihm über die REPL (engl. Read–eval–print loop) kommunizieren. Das heißt, du kannst Befehle direkt an deinen Microcontroller senden, die dieser dann sofort ausführt.

Das ist besonders praktisch zum Debuggen, also um schnell mal auszuprobieren, ob eine LED richtig angeschlossen ist oder eine Funktion so funktioniert, wie du es dir vorgestellt hast. Mit der Arduino IDE und C++ kann das mitunter frustrierend sein, da du auch für kleine Änderungen im Sketch alles wieder neu kompilieren und hochladen musst.

Die REPL im Mu Editor mit CircuitPython

Später lernst du in diesem Artikel den Mu Editor kennen. Dann werden wir genauer auf die REPL eingehen.

Und die Nachteile?

Natürlich hat der Einsatz von CircuitPython auch Nachteile. Ein gewichtiger ist der Support mit Bibliotheken: Adafruit und die Community haben bereits für viele Sensoren und Bauteile passende Bibliotheken veröffentlicht und stellen diese selbstverständlich kostenfrei zur Verfügung. An die Menge, die dir in der Arduino IDE zur Verfügung steht, kommen sie aber noch nicht heran.

Da CircuitPython jedoch eine noch relativ junge Technologie ist, sind wir davon überzeugt, dass sich das im Laufe der Zeit ändern wird. Bereits jetzt veröffentlicht Adafruit regelmäßig neue Bundles mit Bibliotheken, die dir das Leben leichter machen.

Stichwort Geschwindigkeit: Die Geschwindigkeit beim Entwickeln ist bei CircuitPython zwar höher, dafür können Programme jedoch langsamer laufen als es beim kompilierten Code in C++ der Fall ist. Aber dieser Unterschied dürfte bei den meisten Hobby-Anwendungen kaum ins Gewicht fallen.

Der passende Microcontroller

Der einfachste Weg, mit CircuitPython und Microcontrollern zu experimentieren, ist, ein speziell dafür ausgelegtes Board zu kaufen. Adafruit hat hier eine fast schon überwältigende Menge an verschiedenen Boards in vielen Größen und für viele Anwendungsbereiche produziert.

Du kannst CircuitPython aber auch auf einigen Arduino-Boards wie dem Zero oder dem MKR Zero zum Laufen bringen. In der Dokumentation von Adafruit erfährst du mehr darüber.

In diesem Artikel verwenden wir das Board Metro M0 Express von Adafruit. Es hat dieselben Maße wie ein Arduino UNO und verfügt über ähnlich viele Analog- und Digitalpins. Außerdem hat es 4 LEDs und einen NeoPixel an Bord und verfügt über 2MB Speicher. Genug Platz für deinen Code, Dateien und Bibliotheken.

Alle Boards, die CircuitPython unterstützen, findest du in einer Übersicht von Adafruit.

Vorbereitungen

Du hast dich entschlossen, mit CircuitPython loszulegen? Großartig! Bevor du anfängst, musst du allerdings noch etwas Zeit in Vorbereitungen stecken.

Zunächst solltest du dir die passende Firmware für dein Board, die aktuellen Bibliotheken und einen passenden Editor herunterladen und installieren.

Die Firmware

Suche in der Übersicht von Adafruit nach deinem Board und klicke darauf. Anschließend siehst du die verfügbaren Versionen der Firmware. Achte darauf, die neueste stable Version herunterzuladen – in unserem Beispiel die Version 5.3.1

Firmware Metro M0 Express

Schließe nachdem Download dein Board per USB an deinem Computer an. Als nächstes musst du es in den Boot-Modus versetzen: Das machst du, indem du zweimal kurz hintereinander den Reset-Button auf dem Board drückst.

Adafruit weist darauf hin, dass das in der „richtigen“ Geschwindigkeit erfolgen soll – wie auch immer, wenn es geklappt hat, findest du im Explorer (oder Finder auf deinem Mac) ein neues Laufwerk. Der Name des Laufwerks setzt sich aus dem Boardnamen und „BOOT“ zusammen. In unserem Fall heißt es also METROBOOT.

Das Board im Boot-Modus im Finder

Ziehe nun die Datei, die du vorhin heruntergeladen hast, auf dieses Laufwerk. Damit installierst du die Firmware. Nach wenigen Sekunden sollte das Laufwerk automatisch ausgeworfen werden und dafür ein anderes mit dem Namen CIRCUITPY erscheinen.

Wenn das der Fall ist, hat alles funktioniert und dein Board ist bereit. 🙂 Falls es nicht klappt, wirf einen Blick in die Dokumentation von Adafruit – hier werden einige weitere Hilfestellungen gegeben.

Die Bibliotheken

Jetzt wo dein Board bereit ist, fehlen noch die Bibliotheken. Wie eingangs erwähnt, gibt es bereits für viele Anwendungen eine Bibliothek, die dir Arbeit abnimmt.

Adafruit bietet hier ganze Bundles an, die du dir hier herunterladen kannst. Lade dir von dort das Bundle herunter, das deiner Firmware-Version entspricht. Wenn du also eine Firmware in der Version 5.x installiert hast benötigst du das Bibliotheken-Bundle mit derselben Versionsnummer.

Entpacke die heruntergeladene Datei und öffne den Ordner. Im Unterordner lib findest du nun alle verfügbaren Bibliotheken. Suche dir die aus, die du benötigst und kopiere sie in den gleichnamigen Ordner des Laufwerks CIRCUITPY. Wenn dein Board genug Speicher besitzt, kannst du auch einfach alle Bibliotheken dort rüberkopieren.

Bibliotheken für CircuitPython auf dem Metro M0 Express

Wenn du auf Probleme stößt, konsultiere die Dokumentation von Adafruit zum Thema Bibliotheken. Hier werden recht viele Sonderfälle besprochen.

Examples

Aus der Arduino IDE kennst du sicherlich die Beispiele, die den meisten Bibliotheken beiliegen. Diese sind recht nützlich, um herauszufinden, welche Funktionen eine Bibliothek bietet und wie du diese verwendest.

Diese Beispiele gibt es auch für CircuitPython. Auf der Seite, von der du das Bibliotheken-Bundle heruntergeladen hast, kannst du unter Bundle Examples eine ZIP-Datei mit Beispielen herunterladen.

Wie du diese Beispiele auf deinem Board ausführst, sehen wir gleich. Zunächst fehlt jedoch noch der passende Editor.

Der Mu Editor

Um Code in CircuitPython schreiben zu können, benötigst du natürlich einen Editor. Hier reicht im Prinzip der einfachste Text Editor – wir möchten dir jedoch den Mu Editor ans Herz legen. Der ist gratis, einsteigerfreundlich und für CircuitPython ausgelegt. So findest du darin z.B. einen Seriellen Monitor und Plotter wie du es vermutlich schon von der Arduino IDE gewohnt bist. Außerdem kannst du hier auch die oben beschriebene REPL problemlos verwenden.

Lade dir die aktuelle Version hier von der offiziellen Seite für dein Betriebssystem herunter.

Erste Schritte

Öffne nun den Mu Editor. Als nächstes schauen wir uns die wichtigsten Funktionen an. Danach schreibst du auch schon deinen ersten Code in Python und bringst ihn auf deinem Board zum Laufen.

Oberfläche des Mu Editors

Im oberen Bereich findest du eine Leiste mit Funktionen:

Modus: Hier kannst du einstellen, für welchen Zweck du den Mu Editor verwenden möchtest. Unserer heißt Adafruit CircuitPython.

Neu: Erstellt eine neue leere Datei.

Laden & Speichern: Das ist sicherlich klar. 🙂 Ein Hinweis vorab: Wenn dein Board deinen Code automatisch starten soll, musst du den Dateinamen cody.py verwenden.

Seriell & Plotter: Diese beiden kennst du sicherlich schon von der Arduino IDE. Hier kannst du wie gewohnt Daten einsehen und Statements ausgeben, die dir beim Debuggen helfen.

Prüfen: Hiermit kannst du deinen Code auf Fehler checken lassen.

Die REPL öffnen und verwenden

Um die REPL zu öffnen und direkt mit deinem Board interagieren zu können, öffne zunächst über den entsprechenden Button oben den Seriellen Monitor. Drücke anschließend gleichzeitig Strg + C und danach eine beliebige Taste. Nun öffnet sich die REPL:

Die REPL im Mu Editor

Zeit für einen kurzen Test: Kopiere den folgenden Code, füge ihn in deiner REPL ein und drücke Enter:

import board
import digitalio
import time
 
led = digitalio.DigitalInOut(board.D13)
led.direction = digitalio.Direction.OUTPUT

Jetzt kannst du direkt die Onboard-LED anschalten, indem du folgendes eingibst und wieder Enter drückst:

led.value = True

Ist sie angegangen? Dann schalte sie versuchsweise wieder aus, indem du led.value auf False setzt. Hinweis: Auf den meisten kompatiblen Boards kannst du die interne LED über den Pin D13 ansteuern. Bei einigen ist es jedoch D17 und einige wenige haben keine interne LED.

So speicherst du dein Programm auf dem Board

Die REPL ist toll, um schnell etwas zu testen. In den meisten Fällen wirst du jedoch ein reguläres Programm in CircuitPython schreiben und direkt auf deinem Board abspeichern.

Dein Board sucht automatisch nach einer Datei mit dem Namen code.py. Wenn es keine findet, hält es Ausschau nach der Datei main.py und führt diese aus. Heißt konkret: Speichere das Programm, das ausgeführt werden soll unter dem Namen code.py direkt auf dem Laufwerk CIRCUITPY deines Boards ab.

Immer wenn dein Board hier eine Änderung feststellt – weil du den Code im Mu Editor aktualisiert und gespeichert hast – rebootet es und führt den neuen Code aus. Das ganze dauert in der Regel nur wenige Sekunden.

Dein erstes Programm in CircuitPython

Jetzt wird es Zeit, dein erstes Programm zu schreiben, auf deinem Board abzuspeichern und auszuführen. Auch für dieses Beispiel soll erst einmal eine blinkende LED reichen.

Schnapp dir ein Breadboard, eine LED und einen Vorwiderstand und baue folgendes auf:

Ein erster Test mit CircuitPython und Adafruit Metro Express

Kopiere nun folgenden Code in eine leere Datei in deinem Mu Editor und speichere sie als code.py ab.

import board
import digitalio
import time
 
led = digitalio.DigitalInOut(board.D1)
led.direction = digitalio.Direction.OUTPUT
 
while True:
    led.value = True
    time.sleep(0.5)
    led.value = False
    time.sleep(0.5)

Deine LED sollte nun im Halbsekundentakt an- und wieder ausgehen. Werfen wir nun einen Blick auf die einzelnen Teile des Codes.

Zunächst bindest du drei Bibliotheken ein so wie du es aus der Arduino IDE kennst. Viele Bibliotheken sind in extra Dateien ausgelagert und müssen von dir in den Ordner lib auf deinem Board gespeichert werden, bevor du sie verwenden kannst.

Die drei Bibliotheken in diesem Beispiel sind jedoch Teil von CircuitPython. Das heißt, du musst nichts weiter tun, bevor du sie verwenden kannst, außer sie einzubinden:

import board
import digitalio
import time

Die Bibliothek board benötigst du für den Zugriff auf deine Hardware, digitalio kümmert sich um die Inputs und Outputs des Boards und mit time kannst du dein Programm „schlafen legen“ – ähnlich wie du das mit delay() in C++ machst.

Anschließend legst du den Pin der LED (D1) und seine „Richtung“ (OUPUT) fest. Auch das kennst du aus der Arduino IDE von der Funktion pinMode().

led = digitalio.DigitalInOut(board.D1)
led.direction = digitalio.Direction.OUTPUT

Zuletzt erstellst du einen While-Loop, der ununterbrochen läuft. Hier schaltest du die LED mit led.value = True ein, wartest eine halbe Sekunde und schaltest sie für eine weitere halbe Sekunde wieder aus.

while True:
    led.value = True
    time.sleep(0.5)
    led.value = False
    time.sleep(0.5)

Spiele an den Werten etwas herum, um zu sehen, wie sich die Intervalle der LED verändern. Wenn du dein Programm speicherst, sollten deine Änderungen nach wenigen Sekunden sichtbar werden.

Wie geht es weiter?

Du hast nun alles, was du brauchst, um mit CircuitPython loszulegen. Zeit für deine Experimente. Schaue als nächstes in den Bibliotheken nach, für welche deiner Bauteile und Sensoren du hier etwa passendes findest. Wirf anschließend einen Blick in die Beispiel-Codes, die jeder Bibliothek beiliegen und beginne deine Abenteuer mit CircuitPython!

]]>
So erstellst du einen Telegram-Bot https://polluxlabs.net/arduino-tutorials/so-erstellst-du-einen-telegram-bot/ Mon, 12 Oct 2020 09:20:03 +0000 https://polluxlabs.net/?p=3051

Wenn du von deinem Smartphone deine Projekte steuern, oder aktuelle Sensordaten empfangen möchtest, ist ein Telegram-Bot ein praktische Sache.

In diesem Tutorial lernst du, wie du in wenigen Minuten einen Telegram-Bot einrichtest und auch gleich deine UserID herausfindest, die du für viele Projekte benötigst.

1. Telegram installieren

Zunächst die leichteste Übung: Damit du über Telegram mit deinem Projekt interagieren kannst, musst du natürlich Telegram auf deinem Smartphone haben. Falls das noch nicht der Fall ist, öffne den Play Store bzw. App Store und installiere dir die App. Öffne nun Telegram und erstelle dir einen Account.

Telegram im App Store
Telegram im App Store

Falls du Telegram noch nicht kennst: Die App ist kostenlos und macht im Prinzip nichts anderes als WhatsApp. Allerdings hast du hier die Möglichkeit, sogenannte Bots zu erstellen. 

Mit diesen Bots kannst du interagieren – du kannst z.B. sowohl Daten von deinem ESP8266 an dein Smartphone senden als auch von dort aus Befehle empfangen, um auf deinem Breadboard z.B. das Licht einzuschalten. Natürlich bist du nicht auf einen ESP8266 beschränkt.

2. Einen Telegram-Bot erstellen und deinen Token speichern

Wähle in Telegram nun Chats. Im oberen Bildschirmbereich findest du ein Suchfeld – suche hier nach Botfather.

telegram-botfather
Suche nach Botfather

Öffne den Botfather und tappe anschließend auf Start. Nach seiner Begrüßung erhältst du eine Anleitung. Diese kannst du dir jetzt durchlesen, oder gleich auf /newbot tappen. Danach fragt dich der Botfather nach einem Namen für deinen Bot und einen Usernamen.

Telegram neuen Bot erstellen
Vergebe einen Namen für den Bot und einen Usernamen

Nachdem du die Namen vergeben hast, erhältst du eine Nachricht mit deinem Token. Den benötigst du später in deinem Sketch, um deinen ESP8266 mit deinem Telegram-Bot zu verbinden.

Token in Telegram
Kopiere deinen Token

Das war der erste Teil der Vorbereitungen in Telegram. Eine Information fehlt allerdings noch: die UserID.

3. Deine UserID herausfinden

Öffne in Telegram wieder die Chats und suche dort nach IDBot.

IDBot suchen
Suche nach IDBot

Tappe nun auf IDBot und im folgenden Chat-Fenster auf /getid. Du erhältst umgehend eine Nachricht mit deiner UserID:

Deine UserID in Telegram
Kopiere deine UserID

Und das war es auch schon mit den Vorbereitungen in Telegram. Halte deinen Token und deine UserID bereit, um sie später im jeweiligen Sketch des Projekts einzutragen. Und halte sie vor allem geheim, damit niemand anders deinen Bot verwenden kann.

Diese Projekte kannst du mit deinem Telegram-Bot bauen:

Eine Fotofalle mit der ESP32-CAM

Ein stiller Alarm mit dem ESP8266

Ein Dash Button mit ESP8266

]]>
Eine ESP32-CAM (AI Thinker) mit der Arduino IDE programmieren https://polluxlabs.net/arduino-tutorials/eine-esp32-cam-ai-thinker-mit-der-arduino-ide-programmieren/ Fri, 02 Oct 2020 09:08:19 +0000 https://polluxlabs.net/?p=2802 Du möchtest Fotos aufnehmen und sie auf einer SD-Karte speichern, übers Internet verschicken oder gleich einen Video-Stream einrichten? Dann ist die ESP32-CAM eine tolle Sache! Es gibt da nur einen Umstand: Das Board hat keinen USB-Port. Also was tun?

In diesem Tutorial lernst du, wie du deine ESP32-CAM über einen USB/Serial-Adapter direkt in der Arduino IDE programmierst. Du benötigst hierfür:

AZDelivery Kompatibel mit FT232RL USB zu TTL Serial Adapter für 3,3V und 5V kompatibel mit Arduino inklusive E-Book!
AZDelivery Kompatibel mit FT232RL USB zu TTL Serial Adapter für 3,3V und 5V kompatibel mit Arduino inklusive E-Book!
✅ AZDelivery Adapter kompatibel mit FT232RL USB zu TTL Serial für 3,3V und 5V.
6,99 €

Vorbereitungen in der Arduino IDE

Wenn du die ESP32-CAM noch nicht mit deiner Arduino IDE verbunden hast, hole das schnell nach. In diesem Tutorial erfährst du, wie du ESP32-Boards verfügbar machst.

Wenn du das erledigt hast, findest du im Menü Werkzeuge > Board den Eintrag AI Thinker ESP32-CAM – den brauchst du später.

Programmieren über einen Adapter

Da du die ESP32-CAM nicht direkt an deinen Computer anschließen kannst, benötigst du einen Adapter, der die serielle Kommunikation per USB ermöglicht. Diese werden auch FTDI-Adapter genannt – nach dem Unternehmen FTDI, das sich auf diese Anwendungen spezialisiert hat. Ein bisschen wie Tempo also. 🙂

Diese Adapter gibt es in vielen Ausführungen von vielen Herstellern. Oben haben wir dir einen verlinkt, den du zwischen 3,3V und 5V umschalten kannst – was ganz praktisch ist.

Um nun also einen Sketch hochzuladen, verbinde deine ESP32-CAM und den FTDI-Adapter wie folgt:

ESP32-CAM mit FTDI-Adapter programmieren

Hier noch einmal die Verbindungen übersichtlich dargestellt:

FTDI-AdapterESP32-CAM
GNDGND
VCC5V
TXDU0R
RXDU0T

Wichtig: Wenn du einen Sketch hochlädst, musst du an deiner ESP32-CAM den Pin IO0 mit GND verbinden – im Schema oben hellblau dargestellt. Um den Sketch später auszuführen, trenne diese Verbindung wieder und drücke den Reset-Button.

Wenn du den Adapter und die ESP32-CAM wie oben beschrieben miteinander verkabelt hast, verbinde den Adapter mit deinem Computer. Wähle dann in der Arduino IDE das Board AI Thinker ESP32-CAM und den richtigen Port aus und lade deinen Sketch hoch.

Funktioniert nicht?

Der häufigste Fehler ist die fehlende Verbindung zwischen IO0 und GND, die du beim Upload herstellen musst. Wenn du hierfür ein Kabel verwendest, prüfe es auf seine Funktion.

Eine weitere Fehlerquelle kann auch das USB-Kabel sein: Kannst du damit Daten übertragen oder liefert es nur Strom? Manchmal kommt es auch zu Problemen, wenn das Kabel zu lang ist – probiere einfach mal ein anderes.

Wenn der Fehler woanders liegen muss, findest du möglicherweise in der recht umfangreichen Dokumentation bei Random Nerd Tutorials (Englisch) eine Lösung.

]]>
Deinen ESP32 mit der Arduino IDE programmieren https://polluxlabs.net/arduino-tutorials/deinen-esp32-mit-der-arduino-ide-programmieren/ Thu, 01 Oct 2020 13:52:35 +0000 https://polluxlabs.net/?p=2806 Der ESP32 ist so etwas wie der große Bruder des ESP8266. Mit ihm verfügst du nicht nur über WiFi, sondern kannst auch Bluetooth nutzen. Und das beste: Du kannst es ganz einfach mit deiner Arduino IDE programmieren – genauso wie deine Arduino-Boards. Ein paar Vorbereitungen musst du hierfür allerdings treffen.

Lerne hier, wie du in 5 Minuten deinen ESP32 in deiner Arduino IDE installierst und anschließend mit dem Programmieren loslegen kannst.

Dein Board in der Arduino IDE installieren

Öffne zuerst die Einstellungen deiner Arduino IDE. Dort findest du das Feld Zusätzliche Boardverwalter-URLs. Trage hier die folgende Adresse ein:

https://dl.espressif.com/dl/package_esp32_index.json
ESP32 URL in der Arduino IDE eintragen

Tipp: Wenn du dort schon die URL deines ESP8266 eingetragen hast, schreibe die des ESP32 einfach mit einem Komma getrennt dahinter. Dann verfügst du in der Arduino IDE über beide.

Schließe nun das Fenster mit einem Klick auf OK. Öffne als nächstes das Menü Werkzeuge und wähle dort den Menüpunkt Boards und anschließend Boardverwalter.

Suche in dem Fenster, das sich jetzt öffnet, nach ESP32. Vermutlich wirst du dort nur einen Eintrag finden. Noch ein Klick auf Installieren, kurz warten und das sollte es gewesen sein. 🙂

ESP32 im Boardverwalter
Das Paket für deinen ESP32 installieren

Einen Sketch auf den ESP32 hochladen

Schließe nun deinen ESP32 an und wähle im Menü unter Werkzeuge > Board dein Modell und den richtigen Port aus.

Unter Datei > Beispiele findest du unter WiFi den Sketch WiFiScan. Dieser eignet sich für einen ersten Test, denn er macht nichts anderes als die verfügbaren WLAN-Netzwerke in der Umgebung anzuzeigen.

Öffne also diesen Sketch und lade ihn auf deinen ESP32. Nach dem Upload findest du in deinem Seriellen Monitor (115200 Baud) die Netzwerke in der Umgebung.

Funktioniert nicht?

Solltest du beim Upload Probleme haben, probiere folgendes:

Halte den Button BOOT auf deinem ESP32 gedrückt und starte den Upload. Sobald in der Arduino IDE der Status „Connecting…“ erscheint, kannst du den Button wieder loslassen. Der Upload sollte jetzt durchlaufen.

]]>
Daten sammeln in Edge Impulse mit dem Arduino Nano 33 BLE Sense https://polluxlabs.net/arduino-tutorials/daten-sammeln-in-edge-impulse-mit-dem-arduino-nano-33-ble-sense/ Tue, 25 Aug 2020 06:25:44 +0000 https://polluxlabs.net/?p=2223 Wenn du mit Edge Impulse per maschinellem Lernen KI-Modelle entwickeln möchtest, benötigst du vor allem eines: Daten. Viele Daten.

In diesem Tutorial lernst du, wie du mit dem Beschleunigungssensor des Arduino Nano 33 BLE Sense Bewegungsdaten sammelst und in Edge Impulse speicherst.

Du hast noch keinen Arduino Nano 33 BLE Sense?

Arduino® Board Nano 33 BLE Sense with headers
Arduino® Board Nano 33 BLE Sense with headers
Arduino Board Nano 33 BLE Sense with headers; Inhalt: 1 Stück

Vorbereitungen

Bevor du anfangen kannst, Daten zu sammeln, musst du zunächst deinen Arduino mit einem Projekt bei Edge Impulse verknüpfen. Wie das funktioniert, erfährst du in diesem Tutorial auf pollux labs.

Wenn die Verbindung steht, siehst du deinen Microcontroller in Edge Impulse unter dem Menüpunkt Devices.

Arduino Nano 33 BLE Sense mit Edge Impulse verbunden

So sammelst du Bewegungsdaten

Jetzt kannst du beginnen, mit dem Beschleunigungssensor Daten zu sammeln, die dann dazu dienen, per maschinellem Lernen ein KI-Modell zu entwickeln.

Wechsle zunächst in den Menüpunkt Data acquisition. Das ist die zentrale Stelle, in der du Daten mit deinem Arduino misst (samplest) und bereitstellst. Rechts siehst du das Feld Collect data. Hier sollte unter Device dein Arduino Nano mit dem Namen auftauchen, den du ihm beim Verbinden gegeben hast.

Wie gesagt, verwendest du in diesem Tutorial den Beschleunigungssensor (engl. accelerometer). Wähle deshalb im Dropdown-Menü Sensor den Eintrag built-in accelerometer.

Daneben befindet sich das Feld Frequency – stelle hier 62.5 Hz ein. Im Feld Sample Rate trägst du 10000 (Millisekunden, also 10 Sekunden) ein.

Fehlt nur noch ein Name für die Samples. Du startest in diesem Tutorial zunächst mit einer Nicht-Bewegung, d.h. du lässt den Arduino Nano 33 BLE Sense während der Datenerfassung einfach ruhig liegen. Damit weiß dein KI-Modell später, was Keine Bewegung ist.

Ein passender Name für diese Art Samples ist auf Englisch idle. Du kannst aber jeden beliebigen Namen nehmen. Er muss für diese Art von Daten aber immer gleich sein.

So ungefähr sollten deine Einstellungen dann aussehen:

Erfasse dein erstes Sample

Jetzt geht es los. Lege deine Arduino ruhig auf den Tisch und klicke auf den Button Start sampling. Edge Impulse misst jetzt 10 Sekunden lang, in welche Richtungen sich dein Arduino entlang der X-, Y- und Z-Achse bewegt. Anschließend wird das Sample gespeichert.

Da du ja keine Bewegung ausgeführt hast, sieht das Ergebnis entsprechend ruhig aus:

Erstes Sample mit dem Arduino in Edge Impulse

Beim maschinellen Lernen gilt das Motto: Je mehr, desto besser. Das bedeutet für dich, dass eine Messung des Ruhezustands nicht ausreicht, um ein akkurates KI-Modell zu entwickeln.

Du solltest für jede Art Bewegung, die dein Modell später erkennen soll, mindestens 3 Minuten Daten bereitstellen. Für den Ruhezustand hast du bereits 10 Sekunden, fehlen also noch 2 Minuten und 50 Sekunden – oder anders gesagt 17 Durchgänge. 🙂

Eine echte Bewegung messen

Den Ruhezustand hast du jetzt. Zeit für etwas mehr Bewegung. Ändere den Namen im Feld Label zu wave – denn jetzt kommt Winken an die Reihe.

Nimm deinen Arduino in die Hand und klicke wie gehabt auf Start sampling. Jetzt winke mit dem Arduino, sobald die Messung startet. Anschließend solltest du ungefähr so eine Messbild erhalten:

Winken in Edge Impulse

Hier siehst jetzt ein ganz anderes Bild, dass deutlich eine charakteristische Bewegung anzeigt. Wenn du diese in dein Modell integrieren möchtest, musst du allerdings wieder viele weitere Samples aufnehmen.

Diese Bewegungen unterscheiden sich immer leicht voneinander und so lernt das KI-Modell viele Arten von Winken kennen und später zu unterscheiden.

Probiere noch viele weitere Arten von Bewegungen aus und schau dir die dazugehörigen Schaubilder an.

Wie geht es weiter?

Sobald du eine einigermaßen große Sammlung von Bewegungsdaten hast, kannst du dich an die Entwicklung des KI-Modells machen. In diesem Projekt erfährst du, wie du komplexe Bewegungen und Gesten mit Hilfe von künstlicher Intelligenz erkennst.

Keine Lust auf Edge Impulse? Lerne in diesem Tutorial Googles Teachable Machine kennen.

Daten sammeln mit dem Mikrofon

Mit Edge Impulse kannst du nicht nur Bewegungsdaten ermitteln, sondern auch Geräusche mit dem eingebauten Mikrofon des Arduino Nano 33 BLE Sense aufnehmen. So kannst du z.B. einen laufenden Wasserhahn von einer Kaffemühle unterscheiden. 😉

Das Sampling funktioniert dabei ganz ähnlich wie oben beschrieben. Probiere es doch gleich einmal aus!

]]>
Arduino Nano 33 BLE Sense mit Edge Impulse verbinden https://polluxlabs.net/arduino-tutorials/arduino-nano-33-ble-sense-und-edge-impulse/ Mon, 24 Aug 2020 16:14:05 +0000 https://polluxlabs.net/?p=2197 Mit Edge Impulse sammelst du ganz einfach Sensordaten, entwickelst daraus KI-Modelle und spielst diese wieder zurück auf einen Microcontroller. Der perfekte Kompagnon hierfür ist der Arduino Nano 33 BLE Sense – denn hier befinden sich nicht nur passende Sensoren direkt auf dem Board, sondern er ist auch in der Lage, deine KI-Modelle auszuführen.

Lerne in diesem Tutorial, wie du deinen Arduino Nano 33 BLE Sense bei Edge Impulse verfügbar machst. Wir folgen hierbei weitestgehend dem englischen Leitfaden bei Edge Impulse.

Beachte bitte: Für dieses Tutorial benötigst du einen (kostenlosen) Account bei Edge Impulse und ein bereits angelegtes Projekt, mit dem du deinen Arduino verbinden kannst.

Arduino® Board Nano 33 BLE Sense with headers
Arduino® Board Nano 33 BLE Sense with headers
Arduino Board Nano 33 BLE Sense with headers; Inhalt: 1 Stück

Benötigte Software

Um mit deinem Arduino Nano 33 BLE Sense bei Edge Impulse starten zu können, musst du zunächst folgende Software auf deinem PC / Mac installieren:

  • Node.js v12 oder höher
  • Arduino CLI
  • Edge Impulse CLI

Aber keine Sorge, die Software ist gratis und normalerweise in wenigen Minuten installiert.

Node.js installieren

Bei Node.js handelt es sich um eine Laufzeitumgebung auf Basis von JavaScript, die Code auch außerhalb von Browsern ausführen kann. Die Software ist open source und funktioniert plattformübergreifend.

Um Node.js zu installieren, besuche die offizielle Webseite und lade dir die aktuelle Version herunter. Führe anschließend die Installation aus und folge den dortigen Anweisungen.

Arduino CLI installieren

Die Abkürzung CLI steht für Command Line Interface – das heißt in diesem Fall, dass du mit der Arduino CLI einen Sketch statt in der Arduino IDE auch über das Terminal kompilieren und hochladen kannst.

Um die Arduino CLI zu installieren, besuche die offizielle Webseite von Arduino. Hier hast du mehrere Möglichkeiten: Mac- und Linux-User können Homebrew verwenden. Wenn du Windows verwendest, oder die benötigten Dateien lieber selbst herunterladen möchtest, findest du diese unter Latest packages.

Nach der erfolgreichen Installation geht es mit dem CLI von Edge Impulse weiter.

Edge Impulse CLI installieren

Dieses Command Line Interface besteht aus mehreren Paketen, die du für die Kommunikation zwischen Arduino und Edge Impulse benötigst.

Öffne für die Installation das Terminal und führe folgenden Befehl aus:

npm install -g edge-impulse-cli

Die Installation sollte in wenigen Minuten abgeschlossen sein. Sollte es zu Problemen kommen, prüfe die Hinweise in der Dokumentation von Edge Impulse (englisch).

Als nächstes verbindest du deinen Arduino Nano 33 BLE Sense mit Edge Impulse, damit du mit dem Sammeln von Sensordaten beginnen kannst.

Den Arduino mit Edge Impulse verbinden

Hierfür sind noch einmal ein paar Schritte und eine Software nötig. Die Verbindung sollte jedoch in wenigen Minuten stehen.

Den Arduino vorbereiten

Verbinde deinen Arduino Nano 33 BLE Sense via USB mit deinem Computer. Drücke jetzt zwei Mal hintereinander den RESET-Button. Jetzt sollte eine gelbe LED dauerhaft leuchten, die dir signalisiert, dass du die benötigte Firmware von Edge Impulse aufspielen kannst.

Die Firmware von Edge Impulse installieren

Noch einmal ist etwas Software nötig für die Verbindung mit Edge Impulse. Diesmal nicht für deinen Computer, sondern für den Arduino selbst. Lade dir hier zunächst die aktuelle Firmware herunter und entpacke die Zip-Datei.

Starte jetzt – je nachdem, welches Betriebssystem (Windows, Mac, Linux) du verwendest – eine der folgenden Installationsdateien. Dein Arduino muss hierfür mit deinem Computer verbunden sein und die LED gelb leuchten.

  • flash_windows.bat
  • flash-mac.command
  • flash_linux.sh
Das Flashen der Edge Impulse Firmware

Wenn die Installation durchgelaufen ist, drücke noch einmal den RESET-Button auf deinem Arduino, um die neue Firmware zu booten.

Die Einrichtung abschließen

Alles, was jetzt noch fehlt, ist die Verknüpfung deines Arduinos mit einem deiner Projekte bei Edge Impulse. Starte hierfür im Terminal den Wizard mit folgendem Befehl:

edge-impulse-daemon

Der Wizard führt dich durch alle Schritte. Prüfe anschließend in deinem Projekt bei Edge Impulse, ob die Verbindung steht.

Erfolgreich mit Edge Impulse verbundener Arduino Nano 33 BLE Sense

Und das sollte es gewesen sein! Jetzt kannst du mit verschiedenen Sensoren deines Arduinos Daten sammeln und in Edge Impulse zu einem KI-Modell verarbeiten.

Beachte bitte: Dein Arduino Nano ist jetzt grundsätzlich mit Edge Impulse und deinem Projekt dort verbunden. Wenn du ihn zwischenzeitlich jedoch für etwas Anderes verwendest und ihn danach wieder mit Edge Impulse verbinden möchtest, führe den Befehl edge-impulse-daemon wie oben beschrieben erneut aus. Danach steht dir dein Arduino in Edge Impulse wieder zur Verfügung.

Und noch etwas: Möchtest du den Arduino mit einem anderen Projekt in Edge Impulse verknüpfen, musst du die bestehende Verbindung zunächst trennen. Das machst du, indem du im Terminal diesen Befehl ausführst:

edge-impulse-daemon --clean

Der Wizard fragt dich dann nach Username und Passwort von Edge Impulse. Anschließend kannst du direkt im Terminal ein anderes Projekt auswählen.

Wie geht es weiter?

Jetzt, wo du deinen Arduino Nano mit Edge Impulse verknüpft hast, wird es Zeit, dass du ein paar Daten für deine KI sammelst. In diesem Tutorial lernst du, wie du mit dem eingebauten Bewegungssensor des Arduino Nano 33 BLE Sense Bewegungsdaten sammelst und speicherst.

]]>
Den Alkoholsensor MQ-3 anschließen und verwenden https://polluxlabs.net/arduino-tutorials/den-alkoholsensor-mq-3-anschliessen-und-verwenden/ Sun, 23 Aug 2020 16:56:26 +0000 https://polluxlabs.net/?p=2169 Mit dem Sensor MQ-3* kannst du messen, wie viel Ethanol sich in der Luft – z.B. in der Atemluft – befindet. Allerdings: du kannst so nicht feststellen, wie viele „Promille“ ein Proband intus hat und ob er noch fahrtüchtig ist. Ebenso erhältst du keine absoluten Werte, sondern immer nur einen relativen Wert in Bezug auf die „Frischluft“, die du vorab kalibrieren musst.

Das alles klingt komplizierter als es ist! Fangen wir mit einem einfachen Test an.

Verbinde zunächst den Sensor MQ-3 wie folgt mit deinem Arduino:

MQ-3Arduino
VCC5V
GNDGND
DODigitalpin 2
AOAnalogpin 0

Den Analogpin des MQ-3 auslesen

Um die Analogdaten des Sensors auszulesen und im Seriellen Monitor anzuzeigen, benötigst du nur sehr wenig Code. Kopiere dir den folgenden Sketch und lade ihn auf deinen Arduino. Achte darauf, dass die Baudrate des Sketchs und deines Seriellen Monitors übereinstimmen.

int analogValue = 0;

void setup() {
  Serial.begin(115200);
  pinMode(analogValue, INPUT);
}

void loop() {
  Serial.println(analogRead(analogValue));
  delay(200);
}

Wenn du jetzt deinen Seriellen Monitor öffnest, wirst du einen Haufen stetig fallender Zahlen sehen. Wie eingangs erwähnt, kannst du anhand dieser Zahlen noch keine Aussage über den Ethanolgehalt in der Luft treffen.

Stattdessen musst den Sensor einige Minuten in „frischer“ Luft stehen lassen und warten, bis sich die Zahlen auf einen Wert einpendeln. Dieser Wert zeigt dir dann an, dass der Sensor gerade kein Ethanol misst. Ist das jedoch der Fall, springt der Wert hoch – der Abstand zum Referenzwert ermöglicht dir dann eine vage Aussage über die Menge an Alkohol in der Luft.

Bei unserem Test hat sich der „Frischluft-Wert“ des MQ-3 nach einigen Minuten auf circa 100 eingependelt. Dieser Wert kann jedoch bei dir anders sein.

Wenn du jetzt z.B. eine offene Flasche Gin an den Sensor hältst, wirst du sehen, wie der Wert in deinem Seriellen Monitor steigt. Bei uns ging er hoch bis auf knapp 300.

MQ-3 im Praxistest über einer Flasche Gin

Über den Analogpin des MQ-3 erhältst du also den relativen Wert des Alkoholgehalts in der Umgebungsluft. In deinem Sketch kannst du einen Schwellenwert festlegen, bei dessen Überschreiten etwas passieren soll – z.B. eine LED aufleuchtet.

Du kannst diesen Schwellenwert jedoch auch direkt am Sensor einstellen und seine Überschreitung vom Digitalpin des MQ-3 auslesen.

So verwendest du den Digitalpin des MQ-3

Für einen ersten Test reicht wieder ein ganz simpler Sketch aus. Lade den folgenden Code auf deinen Arduino:

int digitalValue = 2;

void setup() {
  Serial.begin(115200);
  pinMode(digitalValue, INPUT);
}

void loop() {
  Serial.println(digitalRead(digitalValue));
  delay(200);
}

In deinem Seriellen Monitor solltest du statt den Analogwerten vom ersten Test jetzt entweder eine 0 oder eine 1 sehen. Auch beim Verwenden des Digitalpins musst du den Sensor zunächst ein paar Minuten in Betrieb nehmen und ruhen lassen, bis er „weiß“, was Frischluft bedeutet.

Wenn du das getan hast, widmest du dich der Rückseite des MQ-3: Hier findest du ein Potentiometer, das du mit einem Schraubendreher einstellen kannst. Drehe die Schraube so weit, bis die Zahl in deinem Seriellen Monitor gerade auf die 1 springt und so bleibt.

Wiederhole jetzt den Test mit einer Flasche Alkohol und du wirst sehen, dass die Anzeige auf 0 springt.

Wie geht es weiter?

Wie zu Beginn gesagt, eignet sich der Sensor MQ-3 auf keinen Fall, um einzuschätzen, wie viel Alkohol jemand getrunken hat und welche Konsequenzen daraus zu ziehen sind.

Aber für ein paar Spielereien eignet er sich sehr wohl. Du könntest den Analogpin auslesen und dir eine Art Ampelsystem bauen, das je nach Abstand zum Frischluftwert verschieden viele LEDs auf einem NeoPixel-Ring aufleuchten lässt.

]]>
So lernt dein Arduino sprechen https://polluxlabs.net/arduino-tutorials/so-lernt-dein-arduino-sprechen/ Wed, 12 Aug 2020 13:23:44 +0000 https://polluxlabs.net/?p=2140 Hast du ein Arduino-Projekt, mit dem du gerne Sprache ausgeben würdest? Dann kannst du natürlich selbst zum Mikrofon greifen, Wörter oder Sätze aufnehmen und z.B. mit dem DFPlayer Mini abspielen – oder du nutzt Text to Speech. Hierbei trägst du Text in ein Tool ein, dass dir diesen anschließend vorliest.

Dieses Feature gibt es schon sehr lange und üblicherweise assoziiert man damit blecherne Roboterstimmen, die alles andere als natürlich klingen. Aber es hat sich auf diesem Feld viel getan und es gibt mittlerweile Stimmen, die beeindruckend natürlich klingen.

Das Tool TTSMP3

Auf ttsmp3.com findest du ein Gratis-Tool, mit dem deinem Arduino Leben einhauchen kannst. Es besteht hauptsächlich aus einem einfachen Textfeld, in das du einzelne Wörter oder auch ganze Sätze mit einer Länge von maximal 3.000 Zeichen eintragen kannst.

Das Tool ttsmp3.com

Darunter befindet sich ein Dropdown, in dem du verschiedene Sprachen und eine/n Sprecher/in auswählen kannst. Die Webseite behauptet zwar, sie würde nur US English unterstützen, du kannst aber sehr wohl auch deutsche Texte vertonen lassen. Allerdings hast du im Englischen noch verschiedene Dialekte zur Auswahl. Dieses Feature gibt es für das Deutsche nicht.

Nachdem du testweise etwas Text eingetragen hast, klicke auf Read, um ihn dir vorlesen zu lassen. Mit einem Klick auf Download as MP3 lädst du ihn dir als Audio-Datei auf deinen Rechner.

Feineinstellungen vornehmen

Das Tool bietet dir die Möglichkeit, verschiedene Wörter oder Satzteile zu betonen. Setze diese hierfür in folgenden Tag:

Hallo, <emphasis level="strong">das</emphasis> ist ein Test.

Flüstern geht auch (auch wenn wir das Ergebnis nicht allzu berauschend – oder eigentlich zu rauschend – finden):

Hallo, das <amazon:effect name="whispered">ist ein Test.</amazon:effect> 

Interessanter ist hingegen die Möglichkeit, Dialoge zu erzeugen. Hierfür verwendest du einfach mehrere Sprecher aus dem Repertoire von ttsmp3:

[speaker:Marlene] Hallo, das ist ein Test.
[speaker:Hans] Ach ja? Ist das so?

Zuletzt kannst du noch die Tonhöhe und die Geschwindigkeit einstellen. Die jeweiligen Tags hierfür findest du direkt auf der Webseite.

Mach dich gleich an ein Projekt! Wie wäre es z.B. mit einem Countdown, der die letzten 10 Ziffern vorliest – wie bei einem Raketenstart? Viel Spaß mit deinem sprechenden Arduino! 🙂

]]>
Gesten erkennen mit dem Sensor APDS9960 https://polluxlabs.net/arduino-tutorials/gesten-erkennen-mit-dem-sensor-apds9960/ Tue, 04 Aug 2020 20:01:11 +0000 https://polluxlabs.net/?p=2078 Mit deinem Arduino Gesten erkennen zu können, eröffnet dir die Möglichkeit, ihn und angeschlossene Bauteile berührungslos zu steuern. Der Sensor APDS9960 leistet hierfür gute Dienste: Er erkennt vier Bewegungsrichtungen, wenn du deine Hand unmittelbar vor ihm bewegst – hoch, runter, links & rechts.

Was du mit den erkannten Bewegungen anstellst, ist dabei ganz dir überlassen: LEDs an- und ausschalten oder einen Roboter steuern – alles ist möglich.

Du kannst diesen Sensor einzeln auf einem Breakout-Board kaufen und an deinem Arduino Board anschließen oder – so wie wir es in diesem Tutorial beschreiben – den Arduino Nano 33 BLE Sense verwenden, auf dem dieser Sensor (und ganz viele andere) bereits installiert ist.

Arduino® Board Nano 33 BLE Sense with headers
Arduino® Board Nano 33 BLE Sense with headers
Arduino Board Nano 33 BLE Sense with headers; Inhalt: 1 Stück

Die passende Bibliothek

Für den Sensor APDS9960 gibt es gleich mehrere Bibliotheken, die dir das Leben leichter machen. In diesem Tutorial verwenden wir die die Bibliothek ArduinoAPDS9960. Öffne deinen Bibliotheksverwalter und installiere dir die neueste Version.

Arduino Bibliothek ArduinoAPDS9960 um Gesten zu erkennen.

Mithilfe dieser Bibliothek ist es ein Kinderspiel, Gesten zu erkennen. Und nicht nur das, wie du sicher weißt, kann dieser Sensor auch Farben und physische Nähe erkennen – auch das kannst du mit dieser Bibliothek regeln.

Gesten erkennen leicht gemacht

Wenn du die Bibliothek installiert hast, findest du im Menü unter Datei->Beispiele->APDS_9960 den Sketch GestureSensor. Öffne und lade ihn auf deinen Arduino, um einen ersten Test zu starten.

In deinem Seriellen Monitor (achte auf die Baudrate) kannst du jetzt verfolgen, ob alles funktioniert. Bewege deine Hand direkt vor dem Sensor in eine Richtung und prüfe, ob er die Richtung korrekt erkannt hat. Wenn nicht, drehe ihn (bzw. den Arduino Nano 33 BLE Sense) so, dass deine Geste mit der erkannten Bewegung übereinstimmt.

Ein bisschen wirst du deine Gesten üben müssen, damit der APDS9960 sie zuverlässig erkennt. In unseren Tests kam es relativ häufig vor, dass eine natürliche Bewegung falsch interpretiert wurde.

Ein genauer Blick auf den Code

Schauen wir uns den Sketch einmal genauer an. Es sind nur sehr wenige Funktionen nötig, um den Gestensensor zu verwenden. Zunächst bindest du natürlich die oben erwähnte Bibliothek ein:

#include <Arduino_APDS9960.h>

Anschließend initialisierst du im Setup den Sensor mit

APDS.begin();

Im Loop prüfst du zunächst, ob der Sensor verfügbar ist und arbeitet. Anschließend prüfst du solange das der Fall ist mit APDS.gestureAvailable(), ob er eine Geste erkannt hat. Mit einem switch…case checkst du dann, welche das war, gibst sie im Seriellen Monitor aus und verlässt die Abfrage bis zu ihrem nächsten Aufruf.

  if (APDS.gestureAvailable()) {
    int gesture = APDS.readGesture();

    switch (gesture) {
      case GESTURE_UP:
        Serial.println("Detected UP gesture");
        break;

      case GESTURE_DOWN:
        Serial.println("Detected DOWN gesture");
        break;

      case GESTURE_LEFT:
        Serial.println("Detected LEFT gesture");
        break;

      case GESTURE_RIGHT:
        Serial.println("Detected RIGHT gesture");
        break;

      default:
        break;
    }
  }

Und das war es auch schon mit der grundsätzlichen Funktionalität des APDS9960. Für alle weiteren Einsatzmöglichkeiten ist deine Kreativität gefragt. 🙂

Die Feineinstellungen

Bei deinen Tests wirst du schnell merken, dass der Sensor nicht immer richtig liegt und Gesten auch gerne mal falsch erkennt. Mit der Funktion setGestureSensitivity(sensitivity) kannst du hier nachjustieren.

Das Argument sensitivity kann einen Wert von 0 bis 100 besitzen. Standardmäßig – also wenn du diese Funktion nicht verwendest – liegt der Wert bei 80.

Ein niedrigerer Wert macht die Gestenerkennung zwar genauer, dafür wird jedoch möglicherweise nicht immer erkannt, dass eine Geste ausgeführt wurde. Ein höherer Wert lässt den Sensor zwar besser Gesten erkennen, dafür aber nicht immer richtig.

Wie so oft, ist also Fingerspitzengefühl gefragt, bis du die für dich passende Einstellung gefunden hast.

Deinen Arduino mit Gesten steuern

Natürlich bist du nicht darauf beschränkt, die erkannten Gesten im Seriellen Monitor auszugeben. Du könntest damit das Licht in deiner Wohnung oder auch einfach nur ein simples Jump’n’Run steuern.

Dieses Projekt ist für dich spannend, wenn du komplexere Gesten mit Hilfe von künstlicher Intelligenz erkennen möchtest.

]]>
Eine 7-Segment-Anzeige am Arduino anschließen und verwenden https://polluxlabs.net/arduino-tutorials/eine-7-segment-anzeige-am-arduino-anschliessen-und-verwenden/ Tue, 04 Aug 2020 06:58:04 +0000 https://polluxlabs.net/?p=1996 Es gibt eine Vielzahl von Displays für den Arduino, aber keines davon hat so einen Old-School-Faktor wie die 7-Segment-Anzeige. Back To The Future? Bitte schön! In diesem Tutorial lernst du, wie du dieses Display anschließt und Zahlen darauf anzeigst.

Wir verwenden eine MAX7219 Anzeige, auf der du insgesamt 8 Ziffern darstellen kannst.

Der Anschluss am Arduino

Um die 7-Segment-Anzeige anzuschließen, benötigst du drei freie Digitalpins am Arduino. Du kannst das Display wahlweise mit 3,3V oder 5V betreiben. In diesem Tutorial erfolgt der Anschluss wie folgt:

Arduino7-Segment-Anzeige
GNDGND
3,3V oder 5VVCC
10CS
11CLK
12DIN

Meistens wird das Display mit verlöteten Pins ausgeliefert, sodass du 5 Kabel der Sorte male-female benötigst.

Die passende Bibliothek für die 7-Segment-Anzeige

Für die Steuerung der Anzeige gibt es eine passende Bibliothek, die dir das Leben erleichtert. Öffne also deinen Bibliotheksverwalter in der Arduino IDE, suche nach LedControl und installiere die aktuelle Version.

Bibliothek LedControl.h im Bibliotheksverwalter, um die 7-Segment-Anzeige zu steuern

Der Sketch für den ersten Test

Für den allerersten Gehversuch mit der 7-Segment-Anzeige soll eine einzige Ziffer auf dem Display genügen. Wie so oft ist der erste Schritt, die oben genannte Bibliothek einzubinden:

#include "LedControl.h"

Anschließend legst du fest, an welchen Digitalpins du das Display angeschlossen hast. Hierbei ist die Reihenfolge DIN, CLK, CS entscheidend. Das letzte Argument in der folgenden Codezeile ist die Anzahl der Displays, die du steuern möchtest. Theoretisch könntest du mit der Bibliothek so viele Ziffern darstellen, dass es für die globale Schuldenuhr der nächsten Jahrzehnte reichen würde – aber wir bleiben hier erst einmal bei einer 7-Segment-Anzeige. 😉

LedControl lc=LedControl(12,11,10,1);

Die Anzeige anschalten und eine Ziffer anzeigen

Kommen wir zur Funktion setup(). Hier erledigst du zu Beginn des Sketchs drei Dinge: das Display aus dem Sleep Mode aufwecken, die Helligkeit einstellen und alle Ziffern darauf löschen, die vielleicht noch darauf zu sehen sein könnten.

lc.shutdown(0,false);
lc.setIntensity(0,8);
lc.clearDisplay(0);

Was die Helligkeit angeht, kannst du der Funktion lc.setIntensity() eine Zahl von 0 bis 15 mitgeben.

Kommen wir also zum entscheidenden Moment. Ebenfalls in der Setup-Funktion schreiben wir in das erste Feld der 7-Segment-Anzeige (ganz rechts) die Ziffer 9:

  lc.setDigit(0, 0, 9, false);

Wenn du die 9 ins erste Feld ganz links schreiben möchtest, wäre der Code hierfür folgender. Wie üblich fängst du bei der 0 an zu zählen – und zwar von rechts. Das ganz linke Feld erhält dann die Nummer 7:

  lc.setDigit(0, 7, 9, false);

Was passiert, wenn du statt der 9 eine 10 einträgst? Dann wird diese Dezimalzahl im Hexadezimalsystem dargestellt, also mit dem Buchstaben A. Das geht bis zur Zahl 15, die dann entsprechend als F ausgegeben wird.

Lange Zahlen auf der 7-Segment-Anzeige darstellen

Jedes Feld der Anzeige mit einer Ziffer zu belegen funktioniert also, ist unter Umständen aber recht mühselig. Was, wenn du einfach die Zahl 12345678 auf einmal ausgeben möchtest? Mit zwei Hilfsfunktionen ist das kein Problem.

Zunächst definierst du 8 Variablen, die später die einzelnen Ziffern deiner Zahl enthalten. Die Variable a wird erste Ziffer und h die letzte Ziffer enthalten.

int a;
int b;
int c;
int d;
int e;
int f;
int g;
int h;

Anschließend benötigst du eine (auf den ersten Blick etwas komplizierte) Funktion, die deine Zahl in diese Ziffern aufteilt. Das bewerkstelligst du mit dem Operator Modulo, der den Rest der Division einer ganzen Zahl durch eine andere berechnet.

Die letzte Ziffer der Zahl 12345678 ist – die 8, die im Feld ganz rechts stehen soll. Mit folgender Rechnung erhältst du diese Ziffer und speicherst sie in der Variablen h:

h = number % 10;

Ausgeschrieben lautet diese Rechnung wie folgt: h = 12345678 : 10 = 1234567,8 – der Rest hinter dem Komma ist also die 8, unsere Ziffer ganz rechts.

Weiter geht es mit der vorletzten Ziffer. Hier prüfst du zunächst, ob die darzustellende Zahl überhaupt zwei Ziffern hat (hat sie, deine Zahl hat sogar 8). Falls ja teilst du sie zunächst durch 10 und erhältst dadurch die Zahl 1234567. Hier fällt die Nachkommastelle weg, da wir die Variable number ja mit long angelegt haben und bei diesem Typ die Nachkommastellen automatisch gestrichen werden, da er nur ganze Zahlen speichern kann.

Eine weitere Rechnung mit dem Modulo beschert dir dann die vorletzte Ziffer 7:

if (number > 9) {
  g = (number / 10) % 10;
}

Diese Rechnungen führst du für alle Ziffern in deiner Zahl aus, wie du unten im vollständigen Sketch sehen kannst. Sobald die Funktion durchgelaufen ist, musst du nur noch alle Ziffern auf die 7-Segment-Anzeige bringen. Hierfür verwendest du eine weitere Funktion, die prüft, wie viele Ziffern deine Zahl hat und diese in den Variablen a – h gespeicherten Ziffern darstellt:

lc.setDigit(0, 0, h, false);

if (number > 9) {
  lc.setDigit(0, 1, g, false);
}
.
.
.

Hier nun der gesamte Sketch, mit dem du Zahlen auf das Display bringst. Speichere zum Testen verschiedene, maximal achtstellige Zahlen in der Variable number.

#include "LedControl.h"

long number = 1234;

//Variablen für die einzelnen Ziffern
int a;
int b;
int c;
int d;
int e;
int f;
int g;
int h;

LedControl lc=LedControl(12,11,10,1);

void numberIntoDigits() {

  h = number % 10;

  if (number > 9) {
    g = (number / 10) % 10;
  }
  if (number > 99) {
    f = (number / 100) % 10;
  }
  if (number > 999) {
    e = (number / 1000) % 10;
  }
  if (number > 9999) {
    d = (number / 10000) % 10;
  }
  if (number > 99999) {
    c = (number / 100000) % 10;
  }
  if (number > 999999) {
    b = (number / 1000000) % 10;
  }
  if (number > 9999999) {
    a = (number / 10000000) % 10;
  }
}

void displayNumber() {

  lc.setDigit(0, 0, h, false);

  if (number > 9) {
    lc.setDigit(0, 1, g, false);
  }
  if (number > 99) {
    lc.setDigit(0, 2, f, false);
  }
  if (number > 999) {
    lc.setDigit(0, 3, e, false);
  }
  if (number > 9999) {
    lc.setDigit(0, 4, d, false);
  }
  if (number > 99999) {
    lc.setDigit(0, 5, c, false);
  }
  if (number > 999999) {
    lc.setDigit(0, 6, b, false);
  }
  if (number > 9999999) {
    lc.setDigit(0, 7, a, false);
  }
}

void setup() {
  lc.shutdown(0,false);
  lc.setIntensity(0,8);
  lc.clearDisplay(0);
  numberIntoDigits();
  displayNumber();
  }

void loop() { 
}

Effektiverer Code

Du kannst den Code oben auch komprimieren, sodass du nur noch eine Funktion benötigst. Definiere hierfür zunächst, wie viele Ziffern dein Display darstellen kann – in unserem Fall also 8. Anschließend erledigst du die Berechnung der einzelnen Ziffern und ihre Darstellung in fünf Zeilen Code:

const int NUM_DIGITS = 8;

void drawDigits(int num) {
  for (int i = 0; i < NUM_DIGITS ; i++) {
    lc.setDigit(0, i, num % 10, false);
    num /= 10;
    if (num == 0)
      return;
  }
}

Wie geht es weiter?

Weiter Anleitungen zu Bauteilen und vollständige Arduino Projekte findest du in unserem Buch für angehende Maker:

Baue die 7-Segment-Anzeige gleich in deinen DeLorean ein und ab ins Jahr 1985! Scherz beiseite, wie wäre es z.B. mit einem Retro-Timer? Oder du verpasst dem ISS Würfel oder deiner LEGO ISS einen Countdown, um die Gelegenheit nicht zu verpassen, die echte ISS vorüberfliegen zu sehen.

]]>
Mit dem Arduino JSON abrufen & dekodieren mit (ArduinoJson) https://polluxlabs.net/arduino-tutorials/json-abrufen-dekodieren-mit-arduinojson/ Sun, 02 Aug 2020 18:15:40 +0000 https://polluxlabs.net/?p=1999 Wenn du mit deinem ESP8266 oder ESP32* oder auch mit dem Arduino im Internet bist, dann sicher nicht ohne Grund. Vielleicht möchtest du Daten von einer API abrufen und in deinem Projekt weiterverwenden. In diesem Tutorial lernst du, wie du mit dem Arduino JSON lädst und mithilfe der Bibliothek ArduinoJson dekodierst (oder parst).

Hier verwenden wir einen ESP8266* – du kannst mit ein paar Anpassungen im Code aber auch jeden anderen Microcontroller verwenden, mit dem du ins Internet kommst. In diesem Tutorial auf pollux labs erfährst du, wie du deinen ESP8266 mit dem Internet verbindest.

Anschließend wirst du eine API kontaktieren und dir JSON-Daten herunterladen, die die aktuelle Anzahl von Menschen im Weltraum enthalten. Diese Daten wirst du lokal dekodieren (oder parsen) und in deinem Seriellen Monitor anzeigen.

Die Bibliothek ArduinoJson

Bevor du loslegen kannst, benötigst du die aktuelle Version der Bibliothek ArduinoJson. Hierbei handelt es sich um eine wirklich praktische Erweiterung, die dir die meiste Arbeit mit JSON abnimmt.

Hinweis: Dieses Tutorial bezieht sich auf die Bibliothek ArduinoJson bis zur Version 6.17 – in unserem kostenlosen ESP8266 Online-Kurs erklären wir, wie die neueste Version funktioniert.

Öffne also deinen Bibliotheksverwalter in der Arduino IDE und suche dort nach ArduinoJson. Installiere dir die neueste Version.

ArduinoJson Bibliothek

Binde die Bibliothek nun ganz oben in deinem Sketch ein:

#include <ArduinoJson.h>

Der API Call

Um herauszufinden, wie viele Astronauten gerade im Weltall sind, fragen wir eine API von open-notify.org ab – und zwar unter folgender URL:

  http://api.open-notify.org/astros.json

Wenn du diese URL kopierst und in deinem Browser öffnest, siehst du bereits die Rohdaten im JSON-Format. Recht am Anfang findest du „number“ und dahinter die aktuelle Anzahl Astronauten im Weltraum. Heute – am 2. August 2020 – sind das 5.

Um diese Zeichenkette auf deinen ESP8266 zu bekommen, benötigst du folgenden Code:

HTTPClient http; //Instanz von HTTPClient starten
http.begin("http://api.open-notify.org/astros.json"); //URL für die Abfrage
int httpCode = http.GET(); //Antwort des Servers abrufen
    if (httpCode == 200) { 
      String payload = http.getString(); //Daten in eine Variable speichern
      }

Jetzt befinden sich die Rohdaten, die du von der API geladen hast, in der Variable payload. Schön und gut, aber um diese Daten weiterverarbeiten zu können – z.B. die aktuelle Anzahl Astronauten auf einem Display anzuzeigen – musst du sie zunächst dekodieren. Und hier kommt wieder die Bibliothek ArduinoJson ins Spiel.

Mit dem Arduino JSON dekodieren

Mit dieser Bibliothek greifst du dir einzelne Daten aus dem JSON-String (den Rohdaten) und speicherst sie in Variablen deiner Wahl. Damit sie jedoch ihre Arbeit erledigen kann, muss sie zunächst wissen, wie groß die Rohdaten sind, um sich selbst genügend Arbeitsspeicher zu reservieren.

Hierfür gibt es einen praktischen Assistenten. Öffne zunächst die URL der API und kopiere dir mit Strg + A und Strg + C sämtliche Zeichen.

Öffne anschließend den Assistenten von ArduinoJson und füge sie dort ins linke Feld ein.

Anschließend siehst du unter dem Eingabefeld den Abschnitt Parsing program – hier befinden sich sämtliche Befehle und Informationen, die du nun benötigst. In der ersten Zeile steht die Speichermenge in der Konstanten capacity. In unserem Fall ist das

const size_t capacity = JSON_ARRAY_SIZE(5) + 5*JSON_OBJECT_SIZE(2) + JSON_OBJECT_SIZE(3) + 200;

Beachte hierbei: Sollte der JSON-String länger werden (weil z.B. ein ganzer Haufen Astronauten in den Weltraum aufbricht), dann benötigst du auch mehr Speicher für ArduinoJson. Ansonsten würde es zu einer entsprechenden Fehlermeldung kommen.

Der nächste Befehl, den du nun anpassen musst ist dieser:

deserializeJson(doc, payload);

Hier findest du die Variable payload, in der die Rohdaten von der API stecken. Mit der Funktion deserializeJson() werden diese nun dekodiert.

Anschließend kannst du sie deinen eigenen Variablen zuweisen. Wir beschränken uns hier ja auf die Anzahl Astronauten im Weltraum, weswegen wir nur eine Variable benötigen. Der Assistent von ArduinoJson schlägt dir bereits eine vor, deren Name auf dem Key („number“) in den JSON-Daten beruht.

int number = doc["number"];

Um zu prüfen, ob alles funktioniert hat, gibst du diese Variable nun in deinem Seriellen Monitor aus:

Serial.println(number);

Wir haben hier heute eine 5 stehen – welche Zahl hast du? Hier nun der gesamte Sketch zum Kopieren und Weiterverwenden:

#include <ESP8266WiFi.h> //WiFI
#include <ArduinoJson.h> //JSON
#include <ESP8266HTTPClient.h> //API-Abfrage

// WIFI-Zugangsdaten
const char* ssid = "NETZWERK";
const char* password =  "PASSWORT";

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password); //Internet-Verbindung starten

  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }
  delay(1000);
  Serial.println("Hello, world!");
}

void loop() {
  if ((WiFi.status() == WL_CONNECTED)) {

    HTTPClient http; //Instanz von HTTPClient starten
    http.begin("http://api.open-notify.org/astros.json"); //Abfrage-URL
    int httpCode = http.GET(); //Antwort des Servers abrufen

    if (httpCode == 200) {
      String payload = http.getString(); //Daten in eine Variable speichern
      const size_t capacity = JSON_ARRAY_SIZE(5) + 5 * JSON_OBJECT_SIZE(2) + JSON_OBJECT_SIZE(3) + 200;
      DynamicJsonDocument doc(capacity);
      deserializeJson(doc, payload);
      int number = doc["number"];
      Serial.println(number);
    }
  }
  delay(10000);
}

Wie geht es weiter?

Jetzt wo du weißt, wie du an Daten im JSON-Format herankommst und sie weiterverwendest, stehen dir ganz neue Möglichkeiten offen. Wie wäre es z.B. mit einer LEGO ISS, die leuchtet, wenn die echte ISS über ihr fliegt?

]]>
So verwendest du Bluetooth am ESP32 https://polluxlabs.net/arduino-tutorials/so-verwendest-du-bluetooth-am-esp32/ Thu, 30 Jul 2020 07:27:43 +0000 https://polluxlabs.net/?p=1845 Bluetooth ist allgegenwärtig und auch dein ESP32 kann damit umgehen. Lerne in diesem Tutorial, wie du Bluetooth Classic verwendest und Daten zwischen einem Smartphone und deinem ESP32 austauschst.

Für dieses Tutorial benötigst du nur einen ESP32 und ein Android-Smartphone, auf dem du die kostenfreie App Serial Bluetooth Terminal installieren kannst.

So machst du deinen ESP32 in der Arduino IDE verfügbar

Falls du deinen ESP32 bisher noch nicht mit der Arduino IDE programmiert hast, führe bitte erst die folgenden Schritte durch:

Öffne die Einstellungen der IDE und trage in des Feld Zusätzliche Boardverwalter-URLs folgenden Link ein.

https://dl.espressif.com/dl/package_esp32_index.json

Öffne anschließend den Boardverwalter unter Werkzeuge/Board. Suche dort nach ESP32 und installiere dir die neueste Version des gleichnamigen Pakets von espressif Systems. Und das war es auch schon – du solltest deinen ESP32 nun wie jedes andere Board in der Arduino IDE auswählen und verbinden können.

Der Sketch für deinen ESP32

Für ein grundlegendes Experiment mit Bluetooth benötigst du nur wenig Code:

#include "BluetoothSerial.h"

BluetoothSerial SerialBT;

void setup() {
  Serial.begin(115200);
  SerialBT.begin("ESP32test"); //Name des ESP32
  Serial.println("Der ESP32 ist bereit. Verbinde dich nun über Bluetooth.");
}

void loop() {
  if (Serial.available()) {
    SerialBT.write(Serial.read());
  }
  if (SerialBT.available()) {
    Serial.write(SerialBT.read());
  }
  delay(25);
}

Schauen wir uns die wichtigsten Teile genauer an: Zunächst bindest du die Bibliothek BluetoothSerial.h ein, die bereits in deiner Arduino IDE verfügbar ist und nicht extra installiert werden muss. Anschließend erstellst du eine Instanz namens SerialBT.

Im Setup startest du die serielle Kommunikation mit einer Baudrate von 115200 – achte darauf, dass dein Serieller Monitor auch auf diese Rate eingestellt ist. Anschließend initialisierst du Bluetooth und gibst deinem ESP32 den Namen ESP32test.

Im Loop befinden sich zwei Abfragen: Die erste prüft, ob du etwas in den Seriellen Monitor eingetragen und abgeschickt hast.

Wenn das der Fall ist, schickst du die Daten an den ESP32:

SerialBT.write(Serial.read());

In der zweiten Abfrage wird geprüft, ob der ESP32 etwas über Bluetooth empfangen hat. Diese Daten werden dann im Seriellen Monitor ausgegeben.

Ein erster Test

Gehen wir also zur Praxis über. Für diesen Test verbindest du ein Android-Smartphone mit deinem ESP32 und schickst Nachrichten von einem Gerät aufs andere.

Lade zunächst den obigen Sketch wie gewohnt auf deinen ESP32 und starte den Seriellen Monitor mit der Baudrate 115200. Sollte sich hier nichts tun, drücke den Reset- oder Enable-Button am ESP32. Anschließend sollte nach einigen Hardware-Informationen folgender Satz aus deinem Sketch angezeigt werden: Der ESP32 ist bereit. Verbinde dich nun über Bluetooth.

In den Bluetooth-Einstellungen deines Smartphone solltest du nun deinen ESP32 mit dem Namen ESP32test sehen und eine Verbindung herstellen können.

ESP32 mit dem Smartphone pairen

Falls noch nicht geschehen, lade dir die App Serial Bluetooth Terminal aus dem Play Store und öffne sie. Unter dem Menüpunkt Devices/Bluetooth Classic erscheint nun ebenfalls dein ESP32, mit dem du dich mit einem Tap verbinden kannst.

ESP32 im Serial Bluetooth Terminal auswählen

Zeit für etwas Konversation! Schreibe deinem ESP32 in der App eine Nachricht und sende sie ab. Dein Text wird auf der Gegenseite empfangen und im Seriellen Monitor ausgegeben.

Nachricht an einen ESP32 senden

In die andere Richtung funktioniert das genauso. Schreibe etwas in das Eingabefeld oben in deinem Seriellen Monitor und klicke auf Senden. Diese Nachricht wird dann von deinem ESP32 aus an dein Smartphone gesendet und dort angezeigt:

Nachricht vom ESP32 empfangen

Und das war auch schon dein erster Test. Wenn du Nachrichten hin und herschicken kannst, geht das natürlich auch mit allen anderen Daten.

Als nächstes kannst du einen Sensor an den ESP32 anschließen und dessen Daten in regelmäßigen Abständen an dein Smartphone senden. Oder andersherum mit deinem Smartphone z.B. eine LED an deinem Microcontroller an- und ausschalten. Wie du vom Smartphone aus Geräte steuert, lernst du auch in unserem Kurs Dein eigener ESP8266 Webserver.

]]>
Mit einem Piezo Töne erzeugen https://polluxlabs.net/arduino-tutorials/mit-einem-piezo-toene-erzeugen/ Wed, 10 Jun 2020 08:36:37 +0000 https://polluxlabs.net/?p=1843 Wenn du mit deinem Arduino einfache Töne erzeugen möchtest, bietet sich ein günstiger Piezo an. Für musikalischen Hochgenuss sorgst du damit zwar nicht, aber für schlichte Anwendungen reicht er allemal.

Lerne in diesem Tutorial, wie du einen Piezo mit deinem Arduino verbindest und Töne in verschiedenen Höhen ausgibst.

Aktiver vs. Passiver Piezo

Es gibt zwei Arten von Piezos: Aktive – hier wird einfach nur Strom angelegt, damit sie einen einzigen vordefinierten Ton abgeben. Passive: Diese Piezos eignen sich hingegen, verschiedene Töne, also auch Melodien zu erzeugen.

Wenn du also mehr als nur einen einzigen Ton erzeugen möchtest, achte darauf, dir einen passiven Piezo zuzulegen. Im Folgenden sprechen wir ausschließlich über passive Piezos.

Den Piezo am Arduino anschließen

Da dein Piezo nur über zwei Pins verfügt, benötigst du auch nur zwei Kabel, um ihn an deinem Arduino anzuschließen. Schließe zunächst einen der Pins – welcher ist egal – an GND an. Den anderen Pin verbindest du mit einem Digitalpin des Arduinos. Im folgenden Aufbau ist das Pin 9:

Anschluss des Piezo am Arduino
Screenshot: Tinkercad

Und das war auch schon alles. Zeit für etwas Musik!

Mit der Funktion tone() Töne erzeugen

Um Töne und Melodien mit verschieden langen Noten zu spielen, benötigst du nur die Funktion tone(). Du kannst auf diese Funktion direkt in deiner Arduino IDE zugreifen und musst hierfür nichts installieren oder vorbereiten.

Die Funktion rufst du immer mit mindestens zwei Parametern auf: dem Pin, an dem der Piezo angeschlossen ist und die Tonhöhe in Hertz.

Wenn dein Piezo also wie oben zu sehen an Digitalpin 9 angeschlossen ist und du den Kammerton A mit seinen 440 Hertz spielen möchtest, wäre der Code hierfür

tone(9, 440);

Dein Piezo spielt diesen Ton dann so lange, bis er den Befehl erhält, etwas anderes zu tun – z.B. einen anderen Ton auszugeben.

Du hast allerdings die Möglichkeit, die Tonlänge direkt über einen dritten Parameter vorzugeben. Soll der Piezo den Ton A genau 1000 Millisekunden spielen, trägst du folgendes in deinen Sketch ein:

tone(9, 440, 1000);

Wenn du deinen Piezo ganz ausschalten möchtest, erreichst du das ganz einfach mit der Funktion noTone().

noTone(9);

Noten und Melodien spielen

Jeder Note entspricht eine bestimmte Frequenz. Wie du oben gesehen hast, ist die Frequenz des Kammertons A genau 440Hz. Das A in der nächsten Oktave hat die Frequenz 880Hz.

Eine sehr umfangreiche Sammlung von Tönen und ihren entsprechenden Frequenzen findest du hier auf Github.

Zu jeder guten Melodie gehören auch Pausen. Diese kannst du wie gewohnt mit der Funktion delay() zwischen die Töne setzen.

Instrumente bauen

Natürlich ist es eine Sache, alle Töne und ihre Abfolge im Sketch vorzugeben und dann abspielen zu lassen. Spannender wird es jedoch, wenn du sie selbst spontan nach deinen Wünschen spielen kannst – also ein richtiges Instrument baust.

Hier findest du zwei Arduino Projekte, mit denen du deinen Arduino als Instrument verwenden kannst:

Arduino Orgel aus Überraschungseiern

Arduino Theremin mit A-Moll Pentatonik

]]>
NeoPixel RGB LED Ring anschließen & verwenden https://polluxlabs.net/arduino-tutorials/neopixel-rgb-led-ring-anschliessen-verwenden/ Wed, 27 May 2020 06:00:00 +0000 https://polluxlabs.net/?p=1815 In diesem Tutorial erfährst du, wie du den Adafruit NeoPixel RGB LED Ring (oder einen kompatiblen Ring)* an deinem Arduino anschließt und verwendest. Den Ring gibt es mit unterschiedlich vielen LEDs, wir verwenden hier einen Ring mit 12.

Das Besondere am NeoPixel ist, dass du jede LED einzeln ansteuern und ihr auch einen individuellen RGB-Farbton zuweisen kannst. So kannst du ganz einfach Animationen mit tollen Farbverläufen zaubern.

Vorbereitungen & Anschluss des RGB LED Rings

In den meisten Fällen erhältst du den NeoPixel LED Ring ohne Pins. Um ihn verwenden zu können, musst du selbige also zunächst an die Anschlüsse GND, 5V und IN (oder auch DI) löten. Pass hierbei auf, dass du die Anschlüsse auf dem Ring nicht allzu lange erhitzt, ansonsten können sie sich lösen und das Bauteil wird unbrauchbar.

NeoPixel LED Ring with Pins

Wenn die Anschlüsse sitzen, verbinde GND und 5V mit den gleichnamigen Pins an deinem Arduino. Der Pin IN (oder DI) kommt an einen Digitalpin deiner Wahl – in unserem Beispiel-Sketch ist das der Pin 2.

Die passende Bibliothek

Wie für viele Bauteile gibt es auch für den NeoPixel RGB LED Ring eine Bibliothek, die dir das Leben erleichtert. Öffne deinen Bibliotheksmanager und suche nach Adafruit Neopixel. Installiere anschließend die neueste Version:

neopixel led ring bibliothek

Den RGB LED Ring ansteuern

Jetzt kann es auch schon losgehen. Kopiere den folgenden Sketch und lade ihn auf deinen Arduino. Wenn alles passt, leuchten alles LEDs auf deinem Ring nacheinander rot auf und gehen zusammen wieder aus.

//Bibliothek einbinden
#include <Adafruit_NeoPixel.h>

int leds = 12; //Anzahl der LEDs
int ledPin = 2; //Pin, an dem der NeoPixel angeschlossen ist

int red = 255; //Rot
int green = 0; //Grün
int blue = 0;  //Blau

//NeoPixel als "pixels" instanziieren
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(leds, ledPin, NEO_GRB + NEO_KHZ800);

void setup() {
  pinMode (ledPin, OUTPUT);
  pixels.begin();
  pixels.setBrightness(100); //Helligkeit: 0 (aus) - 255
}

void loop() {
  for (int i = 0; i < 12; i++) {
    pixels.setPixelColor(i, pixels.Color(red, green, blue));
    pixels.show();
    delay(500);
  }
  pixels.clear();
  delay(500);
}

Gehen wir den Sketch Schritt für Schritt durch: Als erstes bindest du die Bibliothek ein und definierst einige Variablen für die Anzahl der LEDs, den Anschluss des Rings und die Farbwerte.

#include <Adafruit_NeoPixel.h>

int leds = 12; //Anzahl der LEDs
int ledPin = 2; //Pin, an dem der LED Ring angeschlossen ist

int red = 255; //Rot
int green = 0; //Grün
int blue = 0;  //Blau

Mit einer RGB LED kannst du über 16 Millionen verschiedene Farben ausgeben, die sich aus den drei Einzelfarben Rot, Grün und Blau zusammensetzen. Für jede dieser Farben kannst du einen Wert zwischen 0 und 255 bestimmen – die Mischung macht’s!

Mit diesem Tool kannst du die passenden Einzelwerte für deine Wunschfarbe bestimmen.

Als nächstes erstellst du die Instanz pixels:

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(leds, ledPin, NEO_GRB + NEO_KHZ800);

Hier definierst du die Anzahl der LEDs auf deinem Ring mit Hilfe der Variablen leds und den Pin ledPin, an den dein NeoPixel RGB LED Ring angeschlossen ist. Die anderen Parameter sind erst einmal nicht wichtig.

Die Setup-Funktion

Hier definierst du den ledPin als OUTPUT und aktivierst den LED Ring. Zuletzt legst du die Helligkeit der LEDs fest:

void setup() {
  pinMode (ledPin, OUTPUT);
  pixels.begin();
  pixels.setBrightness(100); //Helligkeit: 0 (aus) - 255
}

Der Loop

Jede LED hat eine eigene Nummer von 0 bis 11, mit der du sie individuell ansteuerst. Gezählt wird normalerweise von der LED unten an den Anschlüssen im Uhrzeigersinn.

In diesem Tutorial schaltest du die LEDs nacheinander mit einer kurzen Verzögerung an. Hierfür bietet sich ein For-Loop an:

void loop() {
  for (int i = 0; i < 12; i++) {
    pixels.setPixelColor(i, pixels.Color(red, green, blue));
    pixels.show();
    delay(500);
  }
  pixels.clear();
  delay(500);
}

Innerhalb des For-Loops legst du zunächst die Farbe fest, die die LED i ausgeben soll. Hierfür stehen in der Funktion pixels.Color() die Einzelwerte, die du zu Beginn des Sketchs definiert hast:

pixels.setPixelColor(i, pixels.Color(red, green, blue));

Anschließend bringst du die LED mit pixels.show() zum Leuchten und wartest 500 Millisekunden. Anschließend kümmert sich der For-Loop um die nächste LED i.

Sind alle 12 LEDs erleuchtet springt der Sketch aus dem For-Loop und schaltet alle LEDs mit pixels.clear() wieder aus. Nach weiteren 500 Millisekunden beginnt dann alles wieder von vorne.

Wie geht es weiter?

Jetzt kennst du den Code für eine einfache Animation in einer Farbe. Deiner Fantasie sind jedoch keine Grenzen gesetzt, wie wäre es z.B. mit einer LEGO ISS, die für die Dauer des Überflug der echten ISS die Farbe wechselt? Du findest den Code für den ISS Tracker hier auf pollux labs.

Weitere Ideen findest du in unseren Arduino-Projekten.

]]>