meta data for this page
  •  
Übersetzungen dieser Seite:
  • de-informal

Dies ist eine alte Version des Dokuments!


Servo

zurück zur Übersicht

Dieses Beispiel zeigt wie man Servos verwendet. Es wird die Bibliothek ESP32Servo von Kevin Harrington und John Bennett verwendet. Diese kann über die Bibliotheksverwaltung installiert werden. Es werden 2 Servos und 2 Taster zur Bedienung verwendet.

Achtung! Das Servo für das Fenster darf nur bis 90 geöffnet werden. Grundsätzlich sollen Servos, um Überlastung bei Verklemmen zu vermeiden, nur direkt vor der Bewegung eingeschaltet und danach wieder ausgeschaltet werden. Dies geschieht über attach und detach.

Servo.ino
/*
 * Dieser Sketch verwendet die Bibliothek ESP32Servo von Kevin Harrington und John Bennett.
 * Sie kann über die Bibliotheksverwaltung installiert werden.
 */
 
#include <ESP32Servo.h>
#define BTN1 14
#define BTN2 27
#define SVPIN_A 16
#define SVPIN_B 17
#define OPEN 1
#define CLOSED 0
 
void toggleDoor();
void toggleWindow();
 
Servo svoA;
Servo svoB;
 
int doorstate = CLOSED;
int windowstate = CLOSED;
int doorcmd = CLOSED;
int windowcmd = CLOSED;
int btn1last = HIGH;
int btn2last = HIGH;
 
/** Setup */
void setup() {
  Serial.begin(115200);
  Serial.println("\n----------------\nSetup");
 
  // Servos initialisieren und stellen
  svoA.attach(SVPIN_A);
  svoA.write(0);
  svoB.attach(SVPIN_A);
  svoB.write(0);
  delay(200);
  svoA.detach();
  svoB.detach();
 
  // Taster initialisieren
  pinMode(BTN1, INPUT);
  pinMode(BTN2, INPUT);
  btn1last = digitalRead(BTN1);
  btn2last = digitalRead(BTN2);
 
  Serial.println("Setup abgeschlossen");
}
 
/** loop */
void loop() {
  int btn1val = digitalRead(BTN1);
  int btn2val = digitalRead(BTN2);
 
  // Druck auf Taster 1 erkennen
  if (btn1val != btn1last) // Tasterzustand geändert
  {
    btn1last = btn1val;
    if (btn1val == LOW)  // drücken erkannt, kein loslassen
    {
      if (doorstate == CLOSED)
      {
        doorcmd = OPEN;
      }
      else if (doorstate == OPEN)
      {
        doorcmd = CLOSED;
      }
    }
  }
 
  // Druck auf Taster 2 erkennen
  if (btn2val != btn2last) // Tasterzustand geändert
  {
    btn2last = btn2val;
    if (btn2val == LOW) // drücken erkannt, kein loslassen
    {
      if (windowstate == CLOSED)
      {
        windowcmd = OPEN;
      }
      else if (windowstate == OPEN)
      {
        windowcmd = CLOSED;
      }
    }
  }
 
  // Befehle auslösen
  if (windowstate != windowcmd)
  {
    toggleWindow();
  }
 
  if (doorstate != doorcmd)
  {
    toggleDoor();
  }
 
  delay(500);
}
 
 
/** toggleDoor */
void toggleDoor()
{
  // Sollzustand ermitteln
  int dst = 0;
  if (doorcmd == OPEN)
  {
    dst = 180;
    Serial.println("Tür öffnen");
  }
  else if (doorcmd == CLOSED)
  {
    dst = 0;
    Serial.println("Tür schließen");
  }
  // Bewegung durchführen
  svoA.attach(SVPIN_A);
  svoA.write(dst);
  doorstate = doorcmd;
  delay(1000);
  svoA.detach();
}
 
 
/** toggleWindow */
void toggleWindow()
{
  // Sollzustand ermitteln
  int dst = 0;
  if (windowcmd == OPEN)
  {
    dst = 90; // Das Fenster darf nur bis 90 geöffnet werden!
    Serial.println("Fenster öffnen");
  }
  else if (windowcmd == CLOSED)
  {
    dst = 0;
    Serial.println("Fenster schließen");
  }
  // Bewegung durchführen
  svoB.attach(SVPIN_B);
  svoB.write(dst);
  windowstate = windowcmd;
  delay(1000);
  svoB.detach();
}

zurück zur Übersicht