Interaktive LED-Matrix Tür-Anzeige mit PIR-Bewegungssensor – Arduino Feiertagsgruß
Komponenten und Materialien
| Arduino UNO | 1 |
| Arduino Nano R3 | 1 |
| PIR-Bewegungssensor (allgemein) | 1 |
| Relais (allgemein) | 1 |
| Jumper-Wires (diverse) | 1 |
| PC-Netzteil-Kabel | 1 |
| RGB LED-Strip | 1 |
| 8x8 NeoPixel Panel (WS2812B) | 3 |
Benötigte Werkzeuge und Maschinen
- Lötkolben (allgemein)
- Abisolierzange
Über dieses Projekt
Dieses Projekt kombiniert 3 WS2812B 8x8 RGB LED-Matrizen und einen PIR-Bewegungssensor, um Besucher mit dem Text „Happy Holidays & Happy New Year!“ zu begrüßen, wenn sie nah genug an der Tür sind. Bei inaktivem Sensor laufen Effekte wie ein Bildschirmschoner.
Gesteuert von einem Arduino UNO, versorgt von 5V 30A Netzteil.
Ich kombinierte 3 Code-Sets:
- FastLED Library DemoReel100 Beispiel für Idle/Standby-Effekte
- PIR-Bewegungssensor-Code
- NeoPixel-Setup-Code (genaue Quelle unsicher, da vor ~1 Monat zusammengebaut)
Zusätzlich: Ein zweiter PIR-Sensor an einem 5V-Relais mit 12V RGB LED-String per Verlängerungskabel, gesteuert von Arduino Nano. LED-String + Weihnachtsbeleuchtung am Verlängerungskabel aktivieren sich, wenn der 1. PIR-Sensor Bewegung erkennt (an der Decke nahe 1. Treppenstufe). Nach wenigen Stufen sagt der 2. PIR-Sensor dem UNO, den Text auf den Matrizen anzuzeigen, wenn jemand nah an der Tür ist.
Social Media Links:
- Facebook: https://fb.me/HeathenHacks
- Twitter: https://twitter.com/HeathenHacks
- Instagram: https://instagr.am/HeathenHacks
Code
Arduino Holiday (für UNO mit 3 Matrizen & PIR)
#include
FASTLED_USING_NAMESPACE
#include
#include
#include
#ifndef PSTR
#define PSTR // Für Arduino Due
#endif
#define PIN 6
#define DATA_PIN 6
#define LED_TYPE WS2811
#define COLOR_ORDER GRB
#define NUM_LEDS 192
CRGB leds[NUM_LEDS];
const uint8_t kMatrixWidth = 24;
const uint8_t kMatrixHeight = 8;
const bool kMatrixSerpentineLayout = true;
#define MAX_DIMENSION ((kMatrixWidth>kMatrixHeight) ? kMatrixWidth : kMatrixHeight)
#define BRIGHTNESS 50
#define FRAMES_PER_SECOND 120
static uint16_t x, y, z;
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(24, 8, PIN,
NEO_MATRIX_TOP + NEO_MATRIX_RIGHT + NEO_MATRIX_COLUMNS + NEO_MATRIX_PROGRESSIVE,
NEO_GRB + NEO_KHZ800);
const uint16_t colors[] = {
matrix.Color(255, 0, 0), matrix.Color(0, 255, 0), matrix.Color(0, 0, 255),
matrix.Color(0, 255, 255), matrix.Color(255, 0, 255), matrix.Color(255, 255, 0),
matrix.Color(255, 255, 255)
};
uint16_t speed = 20;
uint16_t scale = 30;
uint8_t noise[MAX_DIMENSION][MAX_DIMENSION];
CRGBPalette16 currentPalette(PartyColors_p);
uint8_t colorLoop = 1;
int pirSensorPin = 5;
int pirState = true;
int val = 0;
int minimummSecsLowForInactive = 5000;
long unsigned int timeLow;
boolean takeLowTime;
int calibrationTime = 30;
void setup() {
delay(3000);
FastLED.addLeds(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
FastLED.setBrightness(BRIGHTNESS);
matrix.setTextWrap(false);
matrix.setBrightness(40);
matrix.setTextColor(colors[0]);
pinMode(pirSensorPin, INPUT);
LEDS.addLeds(leds, NUM_LEDS);
x = random16(); y = random16(); z = random16();
}
int a = matrix.width();
int pass = 0;
typedef void (*SimplePatternList[])();
SimplePatternList gPatterns = { rainbow, rainbowWithGlitter, confetti, sinelon, juggle, bpm, cylon };
uint8_t gCurrentPatternNumber = 0;
uint8_t gHue = 0;
void fadeall() {
for (int i = 0; i < NUM_LEDS; i++) leds[i].nscale8(250);
}
void loop() {
val = digitalRead(pirSensorPin);
if (val == HIGH) {
matrix.fillScreen(0);
matrix.setCursor(a, 0);
matrix.print(F("Happy Holidays & Happy New Year!"));
if (--a < -200) {
a = matrix.width();
if (++pass >= 6) pass = 0;
matrix.setTextColor(colors[pass]);
}
matrix.show();
delay(100);
if (pirState) { pirState = false; }
takeLowTime = true;
} else {
gPatterns[gCurrentPatternNumber]();
FastLED.show();
FastLED.delay(1000 / FRAMES_PER_SECOND);
EVERY_N_MILLISECONDS(20) { gHue++; }
EVERY_N_SECONDS(10) { nextPattern(); }
}
}
#define ARRAY_SIZE(A) (sizeof(A) / sizeof((A)[0]))
void nextPattern() {
gCurrentPatternNumber = (gCurrentPatternNumber + 1) % ARRAY_SIZE(gPatterns);
}
void rainbow() { fill_rainbow(leds, NUM_LEDS, gHue, 7); }
void rainbowWithGlitter() { rainbow(); addGlitter(80); }
void addGlitter(fract8 chanceOfGlitter) {
if (random8() < chanceOfGlitter) leds[random16(NUM_LEDS)] += CRGB::White;
}
void confetti() {
fadeToBlackBy(leds, NUM_LEDS, 10);
int pos = random16(NUM_LEDS);
leds[pos] += CHSV(gHue + random8(64), 200, 255);
}
void sinelon() {
fadeToBlackBy(leds, NUM_LEDS, 20);
int pos = beatsin16(13, 0, NUM_LEDS - 1);
leds[pos] += CHSV(gHue, 255, 192);
}
void bpm() {
uint8_t BeatsPerMinute = 62;
CRGBPalette16 palette = PartyColors_p;
uint8_t beat = beatsin8(BeatsPerMinute, 64, 255);
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = ColorFromPalette(palette, gHue + (i * 2), beat - gHue + (i * 10));
}
}
void juggle() {
fadeToBlackBy(leds, NUM_LEDS, 20);
byte dothue = 0;
for (int i = 0; i < 8; i++) {
leds[beatsin16(i + 7, 0, NUM_LEDS - 1)] |= CHSV(dothue, 200, 255);
dothue += 32;
}
}
void cylon() {
static uint8_t hue = 0;
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = CHSV(hue++, 255, 255);
FastLED.show();
fadeall();
delay(10);
}
for (int i = NUM_LEDS - 1; i >= 0; i--) {
leds[i] = CHSV(hue++, 255, 255);
FastLED.show();
fadeall();
delay(10);
}
}
Schaltplan
Schaltplan als Bild verfügbar (siehe Originalprojekt).
Herstellungsprozess
- Eigenen LUMAZOID bauen: DIY Arduino Musik-Visualisierer
- DHT11 Temperatur- & Feuchtesensor mit LED-Anzeige & Piezo-Summer
- River Health Monitor: Arduino-basiertes Wasserqualitäts-Messsystem
- Einfachen Hindernissensor mit Arduino bauen – IR-LED & Photodiode Tutorial
- Find Me: Smarter Gegenstands-Finder mit Arduino und Bluetooth
- Intelligenten Arduino-Vierbeiner-Roboter bauen: Schritt-für-Schritt-Anleitung
- Intelligente, bewegungsaktivierte Wasserpistole mit Arduino Nano
- Echtzeit-Entfernungsmessung mit Arduino Sonar & Processing-Visualisierung
- DIY-Oszilloskop mit Arduino Nano (10 Hz–50 kHz) und 128×64-LCD
- Arduino Flip Clock mit 8×8 LED-Matrix – DIY Echtzeituhr-Projekt