Slimme woning in de les met Arduino
FunduinoLaatst bijgewerkt op
Das Smart Home Education System – Aufbau, 16 Module und Home Assistant
Hardware-Übersicht
1 / 2
Aufbau und Vorbereitung
Arduino IDE für den ESP32 einrichten
Modul 1: Rote LED
Rote LED blinken lassen
// Auf der Platine ist die rote LED mit dem digitalen Pin 25 des ESP32 verbunden.
int ledPin = 25;
void setup()
{
pinMode(ledPin, OUTPUT);
}
void loop()
{
digitalWrite(ledPin, HIGH); // LED an
delay(1000); // 1 Sekunde warten
digitalWrite(ledPin, LOW); // LED aus
delay(1000); // 1 Sekunde warten
}Modul 2: Grüne LED
Grüne LED blinken lassen
// Die grüne LED hängt an Pin 26 statt an Pin 25.
int ledPin = 26;
void setup()
{
pinMode(ledPin, OUTPUT);
}
void loop()
{
digitalWrite(ledPin, HIGH); // LED an
delay(1000); // 1 Sekunde warten
digitalWrite(ledPin, LOW); // LED aus
delay(1000); // 1 Sekunde warten
}Modul 3: Taster
Taster: beide LEDs für 5 Sekunden einschalten
#define LED_RED 25
#define LED_GREEN 26
#define BUTTON_PIN 23
void setup()
{
pinMode(LED_RED, OUTPUT);
pinMode(LED_GREEN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
digitalWrite(LED_RED, LOW);
digitalWrite(LED_GREEN, LOW);
}
void loop()
{
if (digitalRead(BUTTON_PIN) == HIGH) // Wenn der Taster gedrückt ist ...
{
digitalWrite(LED_RED, HIGH); // rote LED einschalten
digitalWrite(LED_GREEN, HIGH); // grüne LED einschalten
delay(5000); // 5 Sekunden an lassen
digitalWrite(LED_RED, LOW); // rote LED ausschalten
digitalWrite(LED_GREEN, LOW); // grüne LED ausschalten
}
}Modul 4: Buzzer
Buzzer: Ton im Wechsel ein- und ausschalten
int buzzer = 19;
void setup()
{
pinMode(buzzer, OUTPUT);
}
void loop()
{
digitalWrite(buzzer, HIGH); // Ton an
delay(1000); // 1 Sekunde warten
digitalWrite(buzzer, LOW); // Ton aus
delay(5000); // 5 Sekunden warten
}Modul 5: Potentiometer
Potentiometer: Helligkeit der roten LED regeln
#define LED_RED 25
#define POT_PIN 39 // Poti an ADC 39
void setup()
{
pinMode(LED_RED, OUTPUT);
}
void loop()
{
// Der analoge Wert wird unter der Variablen v gespeichert.
// Die Messwerte liegen zwischen 0 und 4095.
int v = analogRead(POT_PIN);
// Der map-Befehl wandelt die Werte von 0 bis 4095 in Werte von 0 bis 255 um.
int duty = map(v, 0, 4095, 0, 255);
// Am Pin der roten LED wird ein Wert zwischen 0 und 255 ausgegeben.
// Je nach Stellung des Potentiometers leuchtet sie heller oder dunkler.
analogWrite(LED_RED, duty);
}Modul 6: Ultraschall-Entfernungsmessung
Ultraschall: Abstandswarnung mit dem Buzzer
#define TRIG_PIN 18
#define ECHO_PIN 17
#define BUZZER 19
void setup()
{
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(BUZZER, OUTPUT);
digitalWrite(BUZZER, LOW);
}
void loop()
{
// Messimpuls senden
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// Echo messen: Zeit, bis die Schallwelle zurückgeworfen wurde
long messzeit = pulseIn(ECHO_PIN, HIGH);
long cm = messzeit / 58;
// Buzzer steuern
if (cm < 20)
{
digitalWrite(BUZZER, HIGH);
delay(150);
digitalWrite(BUZZER, LOW);
delay(150);
}
else
{
digitalWrite(BUZZER, LOW);
delay(50);
}
}Modul 7: OLED-Display
OLED-Display: Text anzeigen
#include <Wire.h>
#include <SSD1306Ascii.h>
#include <SSD1306AsciiWire.h>
SSD1306AsciiWire oled;
void setup()
{
Wire.begin(); // ESP32: SDA = 21, SCL = 22
oled.begin(&Adafruit128x64, 0x3C); // Display starten (Adresse 0x3C)
oled.setFont(System5x7); // einfache Schrift
oled.clear();
oled.setCursor(0, 0);
oled.println("Funduino"); // Text ausgeben
}
void loop()
{
// nichts weiter nötig
}Modul 8: Lüfter
Lüfter: 5 Sekunden ein, 5 Sekunden aus
#define FAN_PIN 4
void setup()
{
pinMode(FAN_PIN, OUTPUT);
}
void loop()
{
digitalWrite(FAN_PIN, HIGH); // EIN
delay(5000);
digitalWrite(FAN_PIN, LOW); // AUS
delay(5000);
}Modul 9: Infrarot-Fernbedienung
Infrarot: Tastencodes der Fernbedienung auslesen
#include <IRremote.hpp>
#define IR_PIN 16 // VS1838 Signal an GPIO 16
void setup()
{
Serial.begin(115200);
delay(200);
IrReceiver.begin(IR_PIN, ENABLE_LED_FEEDBACK); // IR-Empfang starten
Serial.println("IR-Ready: Druecke eine Taste auf der Fernbedienung.");
}
void loop()
{
if (IrReceiver.decode())
{
// Kurzinfo und Rohcode in HEX ausgeben
IrReceiver.printIRResultShort(&Serial);
Serial.print(" Raw: 0x");
Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX);
// Fuer das naechste Signal bereit machen
IrReceiver.resume();
}
}Modul 10: WS2812-LED-Stab
WS2812: acht Pixel in acht Farben
#include <Adafruit_NeoPixel.h>
#define WS_PIN 15
#define NUM_LEDS 8
Adafruit_NeoPixel strip(NUM_LEDS, WS_PIN, NEO_GRB + NEO_KHZ800);
void setup()
{
strip.begin();
strip.setBrightness(80); // optional
}
void loop()
{
strip.setPixelColor(0, strip.Color(255, 0, 0)); // Rot
strip.setPixelColor(1, strip.Color( 0, 255, 0)); // Grün
strip.setPixelColor(2, strip.Color( 0, 0, 255)); // Blau
strip.setPixelColor(3, strip.Color(255, 255, 0)); // Gelb
strip.setPixelColor(4, strip.Color( 0, 255, 255)); // Cyan
strip.setPixelColor(5, strip.Color(255, 0, 255)); // Magenta
strip.setPixelColor(6, strip.Color(255, 255, 255)); // Weiß
strip.setPixelColor(7, strip.Color(255, 128, 0)); // Orange
strip.show(); // Farben anzeigen
}Modul 11: Temperatur und Luftfeuchtigkeit mit dem DHT11
DHT11: Temperatur und Luftfeuchtigkeit im seriellen Monitor
#include <DHT.h>
#define DHTPIN 14 // Datenpin des DHT am ESP32
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
void setup()
{
Serial.begin(115200);
dht.begin();
Serial.println("DHT gestartet. Lese Temperatur und Feuchte ...");
}
void loop()
{
float hum = dht.readHumidity();
float temp = dht.readTemperature(); // in Grad Celsius
if (isnan(hum) || isnan(temp))
{
Serial.println("Fehler beim Lesen vom DHT!");
}
else
{
Serial.print("Temp: ");
Serial.print(temp, 1); // Die 1 bedeutet: eine Nachkommastelle
Serial.print(" °C Feuchte: ");
Serial.print(hum, 1);
Serial.println(" %");
}
delay(2000); // Der DHT11 liefert höchstens etwa alle 2 Sekunden neue Werte.
}DHT11: Messwerte auf dem OLED-Display anzeigen
#include <Wire.h>
#include <SSD1306Ascii.h>
#include <SSD1306AsciiWire.h>
#include <DHT.h>
#define DHTPIN 14
#define DHTTYPE DHT11 // bei Bedarf zu DHT22 ändern
SSD1306AsciiWire oled;
DHT dht(DHTPIN, DHTTYPE);
void setup()
{
Wire.begin(); // ESP32: SDA = 21, SCL = 22
oled.begin(&Adafruit128x64, 0x3C); // OLED-Adresse 0x3C
oled.setFont(System5x7);
oled.clear();
oled.println("DHT -> OLED");
dht.begin();
}
void loop()
{
float hum = dht.readHumidity();
float temp = dht.readTemperature(); // in Grad Celsius
oled.clear();
oled.setCursor(0, 0);
if (isnan(hum) || isnan(temp))
{
oled.println("Fehler beim Lesen!");
}
else
{
oled.println("Funduino");
oled.setCursor(0, 2);
oled.print("Temp: ");
oled.print(temp, 1);
oled.println(" C");
oled.setCursor(0, 3);
oled.print("Feuchte: ");
oled.print(hum, 1);
oled.println(" %");
}
delay(2000);
}Modul 12: Lichtstärke mit dem LDR
LDR: Helligkeit messen
#define LDR_PIN 35 // Pin 35 am ESP32
void setup()
{
Serial.begin(115200);
}
void loop()
{
// Unter raw wird der rohe Messwert als Zahl zwischen 0 und 4095 gespeichert.
int raw = analogRead(LDR_PIN);
// Der map-Befehl wandelt den Wert in einen prozentualen Wert um.
int pct = map(raw, 0, 4095, 0, 100);
Serial.print("LDR raw: ");
Serial.print(raw);
Serial.print(" Helligkeit: ");
Serial.print(pct);
Serial.println(" %");
delay(200);
}Modul 13: Bewegungsmelder PIR SR602
Bewegungsmelder: rote LED bei Bewegung
#define PIR_PIN 13
#define LED_RED 25
void setup()
{
pinMode(PIR_PIN, INPUT); // Der SR602 liefert ein aktives HIGH.
pinMode(LED_RED, OUTPUT);
digitalWrite(LED_RED, LOW);
}
void loop()
{
int motion = digitalRead(PIR_PIN);
if (motion == HIGH)
{
digitalWrite(LED_RED, HIGH); // Alarm: Bewegung erkannt
}
else
{
digitalWrite(LED_RED, LOW); // keine Bewegung
}
}Modul 14: Servo und automatische Tür
Servo: Positionen anfahren
#include <ESP32Servo.h>
#define SERVO_PIN 12
Servo servo;
void setup()
{
servo.attach(SERVO_PIN);
}
void loop()
{
servo.write(0); delay(1000); // 0 Grad
servo.write(90); delay(1000); // 90 Grad
servo.write(180); delay(1000); // 180 Grad
servo.write(90); delay(1000); // zurück auf 90 Grad
}Modul 15: Gassensor MQ135
MQ135: Gaswert im seriellen Monitor
#define MQ135_PIN 34
int messwert = 0;
int prozent = 0;
void setup()
{
Serial.begin(115200);
delay(200);
Serial.println("MQ135 Start - bitte einige Minuten aufwaermen lassen");
}
void loop()
{
messwert = analogRead(MQ135_PIN);
// grobe Skalierung auf 0 bis 100 Prozent - nur als Tendenz!
prozent = map(messwert, 0, 4095, 0, 100);
Serial.print("MQ135 messwert: ");
Serial.print(messwert);
Serial.print(" Tendenz: ");
Serial.print(prozent);
Serial.println(" %");
delay(500);
}Modul 16: Tropfensensor
Tropfensensor: Nässe messen und LEDs schalten
#define Tropfen_PIN 36 // Tropfensensor, analog
#define LED_ROT 25
#define LED_GRUEN 26
void setup()
{
Serial.begin(115200);
pinMode(LED_ROT, OUTPUT);
pinMode(LED_GRUEN, OUTPUT);
}
void loop()
{
int raw = analogRead(Tropfen_PIN); // 0 bis 4095
int Prozent = map(raw, 0, 4095, 0, 100); // grobe Naesse in Prozent
// LEDs schalten
if (raw > 100) // Schwellwert
{
digitalWrite(LED_ROT, HIGH);
digitalWrite(LED_GRUEN, LOW);
}
else
{
digitalWrite(LED_ROT, LOW);
digitalWrite(LED_GRUEN, HIGH);
}
// Ausgabe
Serial.print("RAW: ");
Serial.print(raw);
Serial.print(" Naesse in Prozent: ");
Serial.print(Prozent);
Serial.println(" %");
delay(200);
}Einbindung in Home Assistant
Handleiding beoordelen