Skip to content

Instantly share code, notes, and snippets.

@haeshh
Created March 23, 2021 21:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save haeshh/8e2223e5e61209bf07c5cad3162682b7 to your computer and use it in GitHub Desktop.
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)
/* 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