Amazon Echo-Style Smart Speaker mit Arduino und 1Sheeld selbst bauen
Komponenten und Zubehör
| Komponente | Menge |
|---|---|
| Arduino 101 | 1 |
| 1Sheeld | 1 |
| Stablampe (Stick lamp) | 1 |
| RGB LED-Streifen | 1 |
| Relais-Platine | 1 |
| Apple iPhone | 1 |
| Steckbrett (Breadboard, generisch) | 1 |
| USB-A auf B Kabel | 1 |
| Jumper-Kabel (generisch) | 30 |
| Allzweck-Transistor NPN | 3 |
Benötigte Werkzeuge und Maschinen
- Bohrmaschine (Driller)
- PVC-Rohr
Apps und Online-Dienste
- Arduino IDE
Über das Projekt
Vor einigen Monaten besuchte ich einen Freund und war beeindruckt von seinem Amazon Echo. Er kann Musik abspielen, Hauslichter steuern, Nachrichten und Wetter vorlesen, sogar Datum und Uhrzeit ansagen – alles per Sprachbefehl.
In diesem Moment rief der Maker in mir: „Warum baue ich es nicht selbst!“
Seitdem suchte ich nach Komponenten für einen Arduino-basierten Amazon Echo, bis ich das fantastische 1Sheeld entdeckte.
1Sheeld ist eine Plattform für Arduino, die es ermöglicht, die Sensoren und Fähigkeiten des Smartphones in Arduino-Projekten zu nutzen. Es ist ein Hardware-Shield, das auf dem Arduino-Board sitzt und per Bluetooth mit der Android-App kommuniziert, um Daten zwischen Smartphone und Arduino auszutauschen.
Das Einstiegstutorial auf der 1Sheeld-Website führt Schritt für Schritt zur Bedienung und ist eine großartige Referenz für Arduino-Projekte.
In diesem Projekt habe ich fünf der 40+ Shields in 1Sheeld verwendet:
- Voice Recognition Shield – Steuerung des gesamten Systems per Sprachbefehl. Aktivierung mit nur einer Codezeile:
VoiceRecognition.start(); - Music Player Shield – Zugriff auf den Smartphone-Musikplayer, Titelwahl. Start per
MusicPlayer.play(); - Text to Speech Shield – Verleiht dem Projekt menschenähnliche Interaktion. Antwort per
TextToSpeech.say("time in cairo is"); - Clock Shield – Liefert Echtzeit-Uhrzeit. Abruf per
Clock.queryDateAndTime(); - Internet Shield – Meiner Meinung nach das mächtigste Shield. Abruf des aktuellen Wetters via OpenWeatherMap API:
HttpRequest request1("/*API-Adresse*/");
Schritt 1: Komponenten beschaffen
- Arduino 101 – 30,99 $
- 1Sheeld+ Board – 54,94 $
- iPhone – 155,50 $
- PVC-Rohr – 2 $
- LED-Streifen – 5 $
- 12 V Netzteil – 7 $
- Relais-Platine – 3 $
- Jumper & Kabel – 3 $
- 3 NPN-Transistoren – 1 $
Schritt 2
Löcher in das Rohr bohren, damit der Schall austreten kann.
Schritt 3
PVC-Rohr mit schwarzer Sprühfarbe lackieren.
Schritt 4: Verkabelung
- LED-Streifen an Transistoren und Netzteil anschließen
- Lampe an Relais-Platine und AC-Anschlüsse anschließen
- Relais-Platine und LED-Streifen an Arduino 101 anschließen (wie im Code unten)
- Alles mit dem iPhone im PVC-Rohr montieren
Schritt 5: 1Sheeld Library einrichten
In der Arduino IDE: Sketch → Include Library → Manage Libraries → „OneSheeld“ suchen → Installieren. Oder Library von 1sheeld.com/downloads herunterladen und als .zip hinzufügen.
Schritt 6: 1Sheeld App installieren
1Sheeld Mobile App von der Website, Apple App Store oder Google Play Store herunterladen.
Schritt 7: Shields aktivieren
Dem 1Sheeld Getting Started Tutorial folgen und am Ende folgende Shields auswählen:
- Voice Recognition
- Text to Speech
- Clock
- Internet
- Music Player
Dann den „Multiple Shield“-Button drücken.
Code
- Amazon Echo Code
Amazon Echo Code Arduino
/* OPTIONAL: Um die Bibliotheksgröße und Speichernutzung zu reduzieren,
* können Sie angeben, welche Shields Sie einbinden möchten.
*/
#define CUSTOM_SETTINGS
#define INCLUDE_INTERNET_SHIELD
#define INCLUDE_VOICE_RECOGNIZER_SHIELD
#define INCLUDE_TEXT_TO_SPEECH_SHIELD
#define INCLUDE_MUSIC_PLAYER_SHIELD
#define INCLUDE_CLOCK_SHIELD
#include <OneSheeld.h>
unsigned long previousMillis = 0;
bool state = 0;
// API für Wetter in Kairo, Ägypten
HttpRequest request1("https://api.openweathermap.org/data/2.5/weather?q=Cairo,EG&appid=43d95b4cf5d0573e2dfe5186c160017a");
#define strip1 3
#define strip2 6
#define strip3 5
int lamp = 13;
int hour, minute;
char b[4], c[4];
String strh, strm, noon;
const char mainCommand[] = "alexa";
const char weatherCommand[] = "how is the weather today";
const char playCommand[] = "play music";
const char clockCommand[] = "what time is it";
const char stopCommand[] = "stop";
const char lightonCommand[] = "turn on the lights";
const char lightoffCommand[] = "turn off the lights";
void setup() {
OneSheeld.begin();
pinMode(strip1, OUTPUT);
pinMode(strip2, OUTPUT);
pinMode(strip3, OUTPUT);
pinMode(lamp, OUTPUT);
request1.setOnSuccess(&onSuccess1);
request1.getResponse().setOnJsonResponse(&onJsonReply1);
VoiceRecognition.setOnNewCommand(&myFunction);
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= 5000) {
previousMillis = currentMillis;
Clock.queryDateAndTime();
VoiceRecognition.start();
}
hour = Clock.getHours();
minute = Clock.getMinutes();
if (hour > 12) { hour -= 12; noon = "P M"; } else { noon = "A M"; }
strh = String(hour); strm = String(minute);
strh.toCharArray(b, 4); strm.toCharArray(c, 4);
}
void myFunction(char *commandSpoken) {
if (!strcmp(mainCommand, VoiceRecognition.getLastCommand())) {
alexon(); MusicPlayer.setVolume(5); state = 1;
}
if (!strcmp(playCommand, VoiceRecognition.getLastCommand()) && state == 1) {
alexoff(); MusicPlayer.play(); delay(10000); MusicPlayer.stop(); state = 0;
}
else if (!strcmp(weatherCommand, VoiceRecognition.getLastCommand()) && state == 1) {
alexoff(); Internet.performGet(request1); OneSheeld.delay(5000); state = 0;
}
if (!strcmp(clockCommand, VoiceRecognition.getLastCommand()) && state == 1) {
alexoff();
TextToSpeech.say("time in cairo is"); delay(1300);
TextToSpeech.say(b); delay(600);
TextToSpeech.say(c); delay(800);
TextToSpeech.say(noon); delay(500);
state = 0;
}
if (!strcmp(lightonCommand, VoiceRecognition.getLastCommand()) && state == 1) {
alexoff(); digitalWrite(lamp, HIGH); TextToSpeech.say("the lights turned on"); delay(6000); state = 0;
}
else if (!strcmp(lightoffCommand, VoiceRecognition.getLastCommand()) && state == 1) {
alexoff(); digitalWrite(lamp, LOW); TextToSpeech.say("the lights turned off"); delay(3000); state = 0;
}
}
void onSuccess1(HttpResponse & response1) {
response1["weather"][0]["main"].query(); delay(200);
}
void onJsonReply1(JsonKeyChain & hell, char * output) {
if (hell == request1.getResponse()["weather"][0]["main"]) {
TextToSpeech.say("the weather today in cairo is"); delay(2000);
TextToSpeech.say(output);
}
}
void alexon() {
digitalWrite(strip1, HIGH); delay(200);
digitalWrite(strip2, HIGH); delay(200);
digitalWrite(strip3, HIGH);
}
void alexoff() {
digitalWrite(strip1, LOW); digitalWrite(strip2, LOW); digitalWrite(strip3, LOW);
}
Schaltpläne
Herstellungsprozess
- Temperatur- und Luftfeuchtedaten zwischen zwei Arduinos via Firebase übertragen
- Arduino Digitaler Würfel: LCD-Würfel mit Zufallszahlen (1–6)
- Universelle Android-Fernbedienung mit Arduino, 1Sheeld & IR-Steuerung
- DIY Arduino USB Gaming Controller – Bauen Sie Ihren eigenen High-Performance Gamepad
- Echtzeit-Entfernungsmessung mit Arduino Sonar & Processing-Visualisierung
- Pixel Chaser: Interaktives One-Tap-LED-Spiel mit Arduino Nano
- Stufenlose LED-Helligkeitssteuerung mit Bolt IoT und Arduino UNO
- Intelligenter Arduino-Roboterarm bauen: Einfaches DIY-Tutorial
- Autonomer Roboter-Panzer bauen: Walabot, Arduino, Raspberry Pi & Alexa-Integration
- Kompaktes FM-Radio mit Arduino Nano und RDA5807M selbst bauen