-
-
Save haeshh/8e2223e5e61209bf07c5cad3162682b7 to your computer and use it in GitHub Desktop.
Bewegungssensor HC-SR505 schaltet bei Inaktivität SSD1306-Display dunkel (Beispielcode für ESP32, Arduino)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* Anzeige von Dummy-Text auf OLED-Display | |
* (Typ SSD1306 128*64 Pixel) | |
* | |
* PIR-Sensor SR505 prüft, ob Bewegung in der Nähe | |
* stattfindet; bei einer gewissen Zeit Ruhe wird das | |
* Display gelöscht (wie ein Bildschirmschoner) | |
* | |
* 2021-01-20 Heiko (unsinnsbasis.de) | |
*/ | |
// Bibliothek für das Display | |
// bindet auch <Adafruit_GFX.h>, <SPI.h>, <Wire.h> ein | |
#include <Adafruit_SSD1306.h> | |
// Digitalpin für den Bewegungssensor | |
#define SR505_PIN 13 // entspricht D7 | |
// Zeitspanne von Inaktivität bis zum "Abschalten" des Displays | |
// 900 Sekunden = 15 min | |
#define NO_ACTIVITY_SECS 900 | |
// I2C-Adresse des Displays (0x3C oder 0x3D) | |
#define DISPLAY_I2C_ADDRESS 0x3C | |
// Auflösung des SSD1306-OLED-Displays | |
#define DISPLAY_WIDTH 128 // Breite in Pixeln | |
#define DISPLAY_HEIGHT 64 // Höhe in Pixeln | |
// Datenstruktur für das Display | |
// - Verbindung per I2C (Standard-Pins SCL, SDA) | |
// - Display hat keinen Reset-Pin | |
Adafruit_SSD1306 display(DISPLAY_WIDTH, DISPLAY_HEIGHT, &Wire, -1); | |
// Bitrate für die Datenübertragung zum seriellen Monitor | |
// (ESP: z.B. 115200, Arduino: zwingend 9600) | |
#define BITRATE 115200 // Arduino: 9600 | |
unsigned long t_motion; // Zeitpunkt der letzten erkannten Bewegung | |
// Anzeigen eines Leer-Textes | |
void display_text() { | |
display.clearDisplay(); | |
display.setTextColor(WHITE); // helle Schrift, dunkler Grund | |
display.setTextSize(2); // doppelt hohe Schrift | |
display.setCursor(0, 0); | |
display.print("Lorem ipsum dolor sit amet, consectetur adipisici elit"); | |
display.display(); | |
} | |
//---------------------------------------- | |
void setup() { | |
// Übertragungsrate zum seriellen Monitor setzen | |
Serial.begin(BITRATE); | |
delay(500); // kurz warten, bis ser. Monitor bereit | |
// Digitalpin für den Bewegungssensor | |
pinMode(SR505_PIN, INPUT); | |
// Display initialisieren | |
// im Fehlerfall Meldung ausgeben und Programm nicht | |
// fortsetzen (leere Dauerschleife)) | |
if(!display.begin(SSD1306_SWITCHCAPVCC, DISPLAY_I2C_ADDRESS)) { | |
Serial.println("SSD1306 nicht gefunden"); | |
for(;;); | |
} | |
// Zeitpunkt der letzten Bewegung initialisieren | |
t_motion = millis() / 1000; | |
} | |
//---------------------------------------- | |
void loop() { | |
unsigned long t_now; // Sekunden seit Programmstart | |
// Sekunde, in der die letzte Ausgabe war | |
static unsigned long t_last {0}; | |
// Flag, ob Display "ruhen" soll | |
static bool b_display_off {false}; | |
t_now = millis() / 1000; | |
if (t_now != t_last) { | |
// neue Sekunde, also Textanzeige aktualisieren, | |
// wenn das Display nicht im Ruhemodus ist | |
if (!b_display_off) | |
display_text(); | |
t_last = t_now; | |
// bei Bedarf (Fehlersuche?) den Pegel des Sensors ausgeben | |
// Serial.println(digitalRead(SR505_PIN) ? "HIGH" : "LOW"); | |
// außerdem prüfen, ob eine Bewegung erkannt wurde | |
if (digitalRead(SR505_PIN) == HIGH) { | |
t_motion = t_now; // ja, also Zeitpunkt merken | |
b_display_off = false; | |
} else { | |
// wenn seit längerem keine Bewegung erkannt -> Displaypuffer | |
// löschen und anzeigen | |
if ((t_motion + NO_ACTIVITY_SECS) < t_now) { | |
b_display_off = true; | |
display.clearDisplay(); | |
display.display(); | |
} | |
} | |
} | |
delay(100); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment