Skip to content

Technik Blog

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

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

Arduino Lektion #113: Multi-Purpose Shield V2 von Keyestudio

Posted on 24. August 20208. März 2024 by Stefan Draeger

In diesem Beitrag möchte ich dir das recht einfache und übersichtliche Multi-Purpose Shield V2 von Keyestudio  für den Arduino vorstellen.

Multi Purpose Shield V2 von Keyestudio

Bezug

Das Multifunktionale Shield findest du auf aliexpress.com zu einem Preis von ca. 5,90€ inkl. Versandkosten. Alternativ kannst du das Shield auch im offiziellen Shop von Keyestudio für etwas mehr Geld beziehen.

Aufbau des Multi-Purpose Shield V2 von Keyestudio

Dieses Multifunktionale Shield verfügt über folgende verbaute Bauteile:

  • einen Drehpotentiometer
  • einen Piezo Buzzer,
  • eine 4fach 7 Segmentanzeige,
  • drei Buttons,
  • sechs SMD LEDs

Des Weiteren sind einige Schnittstellen nach außen gelegt zbsp. um 4 Servomotoren oder aber einen Bluetoothadapter anzuschließen.

Das Shield ist die Version 2 des bereits vorgestellten Multifunktionalen Shields V1 von Keyestudio.

Arduino Multishield Version mit Temperatursensor und RGB LED usw.
Arduino Multishield Version mit Temperatursensor und RGB LED usw.
Multi Purpose Shield V2 von Keyestudio
Multi Purpose Shield V2 von Keyestudio

Meiner Meinung nach sollte eine neue Version immer etwas mehr bieten als die Version zuvor, hier ist es genau anders herum. Aber durch die begrenzte Anzahl der Pins (14 digitale und 6 analoge) des Arduino UNOs ist man hier etwas eingeschränkt. Alternativ sollte man hier ggf. einmal über ein Multifunktionales Shield für den Arduino Mega 2560 nachdenken.

Programmieren

Für das programmieren des Shields benötigst du ein passendes Datenkabel und einen Arduino UNO, Leonardo oder Mega 2560.

Multi-Purpose Shield V2 von Keyestudio auf dem Arduino UNO
Multi-Purpose Shield V2 von Keyestudio auf dem Arduino UNO
Multi-Purpose Shield V2 von Keyestudio auf dem Arduino UNO

Natürlich kannst du mit Breadboardkabel auch die einzelnen Bauteile an einen Arduino Nano oder ähnlichem anschließen.

Zum programmieren verwende ich wiederum die Arduino IDE welche du unter https://www.arduino.cc kostenfrei herunterladen kannst.

Pins der Sensoren & Aktoren auf dem Multi-Purpose Shield V2

Sensor / AktorPin
Piezo Buzzerdigitaler Pin D3
SMD LEDsdigitaler Pin D8..D13
Buttons / Tasteranaloger Pin A1..A3
Drehpotentiometeranaloger Pin A0

Normalerweise würde ich nun jeden einzelnen Sensor / Aktor auf diesem Shield vorstellen und einzeln ein kleines Sketch / Programm präsentieren. Jedoch habe ich diese Bauteile ausgiebig auf dem Blog behandelt und daher möchte ich gerne kleine Projekte zeigen welche du nachprogrammieren kannst.

Zähler mit Display und Sound

Für dieses kleine Projekt benötigst du die 3 Buttons, die 4fach 7 Segmentanzeige und den Piezo Buzzer.

Ziel

Das Ziel soll es sein über die drei Buttons Zahlen auf der 4fach 7 Segmentanzeige aufsteigend oder absteigend zu zählen. Der dritte Button soll als Reset der Anzeige dienen. Zusätzlich soll bei jedem 10er Übergang  ein Ton erzeugt werden.

Sketch

#include <Bounce2.h> //Bibliothek um die Taster zu entprellen

//Die Taster sind an den analogen Pins A1..A3 angeschlossen
#define btnUpPin A1
#define btnResetPin A2
#define btnDownPin A3

//Der Piezo Buzzer ist am digitalen Pin D3 angeschlossen
#define piezoBuzzer 3

//das Schieberegister ist an folgenden Pins angeschlossen
#define latchPin 4 //ST_CP
#define clockPin 5 //SH_CP 
#define dataPin 2  //DS 

//Adressen der Segmente im Display
int segmente[4] = {0x01, 0x02, 0x04, 0x08};
//Hexadezimalwerte der Zahlen von 0 bis 9
int numbers[10] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};

//Konstante für eine Pause zwischen den Tastenbetätigungen
const int BTN_PAUSE = 50;

Bounce btnUpBounce = Bounce(btnUpPin, BTN_PAUSE);
Bounce btnResetBounce = Bounce(btnResetPin, BTN_PAUSE);
Bounce btnDownBounce = Bounce(btnDownPin, BTN_PAUSE);

//Variable zum halten der aktuellen Zahl
int counter = 0;

void setup() {
  Serial.begin(9600);
  
  //Taster als Eingänge definieren
  pinMode(btnUpPin, INPUT);
  pinMode(btnResetPin, INPUT);
  pinMode(btnDownPin, INPUT);

  //Piezo Buzzer als Ausgang definieren
  pinMode(piezoBuzzer, OUTPUT);

  //die Pins des Schieberegisters als Ausgang definieren
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);

  //zunächst das Display einmal löschen / leeren
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST , 0x00);
  shiftOut(dataPin, clockPin, MSBFIRST , 0x00);
  digitalWrite(latchPin, HIGH);
}

void loop() {
  //die Taster aktualisieren
  btnUpBounce.update();
  btnResetBounce.update();
  btnDownBounce.update();
  
  //Wenn der linke Taster losgelassen wird dann...
  if(btnUpBounce.rose()){
    //Zähler um eins erhöhen
    counter = counter +1;
    //Wenn der Zähler einen 10er Übergang hat dann einen Ton ausgeben
    if(counter % 10==0){
      tone(piezoBuzzer, 600,95);
    }
  }

  //Wenn der Taster in der Mitte betätigt wird dann den Zähler auf "0" zurücksetzen.
  if(btnResetBounce.rose()){
     counter = 0;
  }

  //Wenn der rechte Taster betätigt wird dann den Zähler um eins verringern
  if(btnDownBounce.rose()){
    //aber nur wenn die Zahl größer als 0 ist
    //negative Zahlen werden nicht angezeigt
    if(counter >0){
      //Zähler um eins verringern
      counter = counter -1;
    } else {
      //alternativ einen Ton ausgeben
      tone(piezoBuzzer, 900,125);
    }    
  }
   
    displayNumber(counter);
 }

//Die Funktion erhält als Parameter eine Ganzzahlige Zahl
//und Splittet diese in die Tausender, Hunderter, Zehner sowie
//einer Stellen und zeigt diese auf dem Display an.
void displayNumber(int number) {
  int tausend = number / 1000;
  int hundert = number % 1000;
  hundert = hundert / 100;
  int zehn = number % 100;
  zehn = zehn / 10;
  int ein = number % 10;

  int values[4] = {tausend, hundert, zehn, ein};
  
  for (int a = 3; a >= 0; a--) {
    digitalWrite(latchPin, LOW); 
    shiftOut(dataPin, clockPin, MSBFIRST , numbers[values[a]]);
    shiftOut(dataPin, clockPin, MSBFIRST , segmente[a]);
    digitalWrite(latchPin, HIGH);
    delay(5);
  }
  
}

Video

Servomotor mit Drehpotentiometer steuern

Mit dem Drehpotentiometer kannst du auch einen Servomotor vom Typ SG90 steuern. Wie einfach das geht erfährst du im folgenden Abschnitt. Den benötigten Servomotor findest du auf ebay.de* für knapp 4€. Wenn du diesen jedoch in einer größeren Anzahl kaufst dann ist dieser im Einzelpreis deutlich günstiger.

Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!

Ziel

Der Wert des Drehpotentiometers (analoger Wert 0..1023) wird auf die möglichen Winkel 0..180 des Servos gemappt und ausgeführt.

In dem Nachfolgenden Beispiel steuere ich ein Pan Tilt Bausatz welcher aus 2 Servos vom Typ SG90 besteht.
Diesen Bausatz habe ich bereits im Beitrag Arduino: Pan Tilt Bausatz vorgestellt.

PanTilt Bausatz auf Bodenplatte montiert
PanTilt Bausatz auf Bodenplatte montiert

Sketch

#include <Servo.h>

#define servo1Pin 7
#define servo2Pin 6

#define rotaryResistor A0

Servo servo1;
Servo servo2;

//das Schieberegister ist an folgenden Pins angeschlossen
#define latchPin 4 //ST_CP
#define clockPin 5 //SH_CP 
#define dataPin 2  //DS 

//Adressen der Segmente im Display
int segmente[4] = {0x01, 0x02, 0x04, 0x08};
//Hexadezimalwerte der Zahlen von 0 bis 9
int numbers[10] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};


void setup() {
  pinMode(servo1Pin, OUTPUT);
  pinMode(servo2Pin, OUTPUT);
  
  servo1.attach(servo1Pin);
  servo2.attach(servo2Pin);

 //die Pins des Schieberegisters als Ausgang definieren
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);

  //zunächst das Display einmal löschen / leeren
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST , 0x00);
  shiftOut(dataPin, clockPin, MSBFIRST , 0x00);
  digitalWrite(latchPin, HIGH);
}

void loop() {
  int resistorValue = analogRead(rotaryResistor);
  int servoValue = map(resistorValue, 0, 1022, 0, 180);
  servo1.write(servoValue);
  int servo2Value = map(resistorValue, 0, 1022, 180, 0);
  servo2.write(servo2Value);
  displayNumber(servoValue);
}

//Die Funktion erhält als Parameter eine Ganzzahlige Zahl
//und Splittet diese in die Tausender, Hunderter, Zehner sowie
//einer Stellen und zeigt diese auf dem Display an.
void displayNumber(int number) {
  int tausend = number / 1000;
  int hundert = number % 1000;
  hundert = hundert / 100;
  int zehn = number % 100;
  zehn = zehn / 10;
  int ein = number % 10;

  int values[4] = {tausend, hundert, zehn, ein};
  
  for (int a = 3; a >= 0; a--) {
    digitalWrite(latchPin, LOW); 
    shiftOut(dataPin, clockPin, MSBFIRST , numbers[values[a]]);
    shiftOut(dataPin, clockPin, MSBFIRST , segmente[a]);
    digitalWrite(latchPin, HIGH);
    delay(5);
  }
  
}

Video

Bluetooth zum steuern der LEDs

Im nachfolgenden zeige ich dir ein etwas aufwändigeres Projekt, denn hier wollen wir per Bluetooth die SMD LEDs auf dem Shield steuern (AN/AUS). Du benötigst hier zusätzlich ein Bluetoothmodul welches dem Shield NICHT bei liegt. Das passende Bluetooth Modul HC-06 kannst du auf ebay.de für knapp 4€ inkl. Versandkosten erwerben.

Ziel

Über eine Handy-App (Android / iOS) wird eine Kommunikation mit dem Shield aufgebaut und durch das absenden bestimmter Zeichenfolgen wird eine SMD LED aktiviert bzw. deaktiviert.

Blueoothmodul HC-06

Für den Aufbau benötigst du neben einem Arduino UNO, dem Multi-Purpose Shield V2 zusätzlich ein Bluetooth HC-06 Modul. Dieses Bluetoothmodul findest du du auf ebay.de für knapp 4,5€ inkl. Versandkosten.

Bluetoothmodul HC-06
Bluetoothmodul HC-06

Dieses Bluetoothmodul habe ich bereits im Beitrag Arduino Lektion 21: Bluetooth Modul HC-06 ausgiebig vorgestellt. In diesem Beitrag möchte ich dir zeigen wie du dieses Modul verwendest um die SMD LEDs des Multi-Pupose Shield V2 von Keyestudio schaltest.

Das Modul wird auf den 6 Pin Sockel gesteckt dabei muss natürlich auf die korrekte Polung geachtet werden.

Sketch

Wenn du das Sketch auf den Microcontroller hochladen möchtest DARF das Bluetoothmodul nicht aufgesteckt sein, denn es werden die beiden digitalen Pin 1 & 0 benötigt. Diese beiden Pins sind jedoch durch TX & RX der seriellen Verbindung belegt somit kommt es dann durch die IDE zu einem Timeout.

#include <SoftwareSerial.h>

#define TX 1 //TX Pin des Bluetoothadapters am digitalen Pin 1
#define RX 0 //RX Pin des Bluetoothadapters am digitalen Pin 0

#define led1 13
#define led2 12
#define led3 11
#define led4 10
#define led5 9
#define led6 8

//Variablen zum speichern des Status der LEDs
int led1Status = 0;
int led2Status = 0;
int led3Status = 0;
int led4Status = 0;
int led5Status = 0;
int led6Status = 0;

SoftwareSerial BT(RX, TX); 

char a; //Variable um das Zeichen vom Bluetoothadaper zu speichern

void setup(){
  //Pins der LEDs als Ausgang definieren
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(led5, OUTPUT);
  pinMode(led6, OUTPUT);
  
  BT.begin(9600); 
}

void loop(){
  //Wenn Daten anliegen dann...
  if (BT.available()){    
    //lesen der Daten
    a=(BT.read());
    
    switch(a){
      case '1': 
          led1Status = led1Status == 1?0:1;
          activateLED(led1, led1Status);
          break;
      case '2': 
          led2Status = led2Status == 1?0:1;
          activateLED(led2, led2Status);
          break;
      case '3': 
          led3Status = led3Status == 1?0:1;
          activateLED(led3, led3Status);
          break;
      case '4': 
          led4Status = led4Status == 1?0:1;
          activateLED(led4, led4Status);
          break;
     case '5': 
          led5Status = led5Status == 1?0:1;
          activateLED(led5, led5Status);
          break;
     case '6': 
          led6Status = led6Status == 1?0:1;
          activateLED(led6, led6Status);
          break;
    }
  }
}

//Diese Funktion aktiviert bzw. deaktiviert eine LED
void activateLED(int pin, int statusLED){
  digitalWrite(pin, statusLED==0?LOW:HIGH);
}

Aufbau der Verbindung mit einem mobilen Gerät

Für den Test benötigst du ein Bluetoothfähiges Gerät (iPhone, Android, oder ähnliches). Ich verwende mein Huawei P20 lite. Und natürlich eine Bluetooth Terminal Software bzw. eine App. Da ich ein Android Handy nutze schaue ich mich im Playstore um und nutze die App „Serial Bluetooth Terminal„. Diese ist kostenfrei und sehr intuitiv zu bedienen.

Damit man mit der App eine Verbindung aufbauen kann muss man zunächst das Handy mit dem Bluetoothadapter verbinden, hierzu aktiviert man Bluetooth und sollte in der Liste der Geräte den Eintrag „HC-06“ auffinden.

Bluetoothadapter HC-06 gefunden
Bluetoothadapter HC-06 gefunden

Nach einem tip auf diesen Eintrag kann eine Verbindung aufgebaut werden, ggf. wird ein Passwort abgefragt. Das initiale Passwort im Modul ist 1234.

eingeben des Passwortes für den Aufbau der Verbindung (Pairing)
eingeben des Passwortes für den Aufbau der Verbindung (Pairing)

Als nächstes geht es nun in der Terminal App weiter. Hier müssen wir aus der Liste der verfügbaren Geräte den bereits gekoppelten Adapter HC-06 auswählen.

gekoppeltes Modul HC-06 in der Liste der verfügbaren Geräte
gekoppeltes Modul HC-06 in der Liste der verfügbaren Geräte

Da unserer Programm auf dem Arduino erwartet das nur Zahlen von 1 bis 6 gesendet werden, müssen wir in der App unter den Settings > Send das hinzufügen einer neuen Zeile beim Absenden deaktivieren.

Das Sketch auf dem Arduino ist jedoch so geschrieben das nur die Zahlen von 1 bis 6 behandelt werden, es wird somit nicht auf die Zeilenumbrüche und andere Sonderzeichen reagiert. Wir könnten somit die Einstellung auch weglassen!

deaktivieren der neuen Zeile in der Terminal App
deaktivieren der neuen Zeile in der Terminal App

Damit ist die App fertig eingerichtet und wir können nun die Zahlen 1 bis 6 absenden und die entsprechenden LEDs sollten aktiviert bzw. deaktiviert werden.

Video

alternative Multifunktionale Shields

Ich habe bereits einige folgende Multifunktionale Shields vorgestellt:

  • Multifunktionales Shield „Easy Module MIX V1“ von YwRobot
  • Arduino Lektion 85: Multifunktionales Shield von Open-Smart
  • Arduino Lektion 57: Multifunktionales Shield (Teil2)
  • Arduino Lektion 36: Multifunktionales Shield

Diese Shields liegen Preislich in der gleichen Richtung wie dieses bieten jedoch etwas mehr Funktionalitäten und bieten somit einen deutlicheren Mehrwert für Anfänger.

Multifunktionale Shields
Multifunktionale Shields

Schreibe einen Kommentar Antworten abbrechen

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

Fragen oder Feedback?

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

Newsletter abonnieren

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

Jetzt Newsletter abonnieren

Unterstütze meinen Blog

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

draeger-it.blog auf Tipeee unterstützen

Vielen Dank für deinen Support!
– Stefan Draeger

Kategorien

Tools

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

Links

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

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

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

Folge mir auf

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