Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Gesteuerter Bewegungs- & Gesten-Detektor mit PIR-Sensor & Arduino Nano

Komponenten und Zubehör

Arduino Nano R3×1
TPA81 Devantech 8-Pixel Thermopile Array (I²C)×1
HC-SR505 Mini PIR Bewegungsmelder×8
0,96" SPI OLED 128x64 Display×1
Steckbrett & Jumper-Kabel×1

Apps & Online-Dienste

Über dieses Projekt

Erstellen Sie einen Gesten-Detektor mit einfachen Komponenten: PIR-Sensor und Arduino Nano. Am Ende können Sie:

Passiver Infrarotsensor (PIR): Wie funktioniert er?

Ein PIR-Sensor misst infrarote Strahlung (Wärmestrahlung, 2–22 µm) von Objekten in seinem Sichtfeld. Alle Objekte über 0 K emittieren diese Strahlung. Der Sensor ist „passiv“, da er keine Energie aussendet, sondern nur detektiert.

Der TPA81 ist ein Thermopile-Array mit 8 nebeneinanderliegenden Sensoren (Silizium-Linse, eingebaute Elektronik). Er misst simultan die Temperatur von 8 adjacent Punkten, kann einen Servo schwenken für thermische Bilder und erkennt eine Kerzenflamme bei 2 m Entfernung – unbeeinflusst von Umgebungslicht.

Kostengünstige Alternative: 8 einzelne HC-SR505 PIR-Sensoren (ohne Fresnel-Linse) an 8 digitale Pins – nacheinander auslesen.

Schaltung

Variante A (TPA81): I²C an A4 (SDA), A5 (SCL), VCC/GND. OLED an SPI (D11=MOSI, D13=SCK, D10=CS, D8=DC, D9=RST).

Variante B (8× HC-SR505): Jeder Sensor an einen digitalen Pin (z.B. D2–D9), VCC/GND parallel.

(Schaltbilder im Originalprojekt)

Code

Bibliotheken installieren: Wire (Standard), TPA81, SSD1306 (für OLED). In Arduino IDE: Sketch → Bibliothek einbinden → .ZIP hinzufügen.

Test 1: Rohdaten auslesen


#include "Wire.h"
#include "TPA81.h"
TPA81 tpa;
void setup() {
  Serial.begin(9600);
  Wire.begin();
}
void loop() {
  Serial.print(tpa.getAmbient()); Serial.print(" ");
  for(int i=1; i<=8; i++) { Serial.print(tpa.getPoint(i)); Serial.print(" "); }
  Serial.println(); delay(100);
}

Serieller Monitor zeigt 8 Temperaturwerte. Hand vor Sensor → Werte steigen.

Test 2: Schwellenwert-Visualisierung (29 °C)


void loop() {
  Serial.print(tpa.getAmbient()); Serial.print(" ");
  for(int i=1; i<=8; i++) {
    if(tpa.getPoint(i) > 29) Serial.print("# ");
    else Serial.print(". ");
  }
  Serial.println(); delay(100);
}

Ausgabe: # = Hand erkannt, . = Hintergrund.

Hauptprogramm: Gestenerkennung (Lautstärke Hoch/Runter) + OLED-Anzeige


#include "Wire.h"
#include "TPA81.h"
#include "ssd1306.h"
#include "DHT.h"

TPA81 tpa;
#define VCCSTATE SSD1306_SWITCHCAPVCC
#define WIDTH 128, HEIGHT 64, PAGES 8
#define OLED_RST 9, OLED_DC 8, OLED_CS 10, SPI_MOSI 11, SPI_SCK 13
uint8_t oled_buf[WIDTH * HEIGHT / 8];

int gesture[8][20], tgesture[8], sum=0, sflag=0, gcount=0, c=0, ex=0, vol=5;

// Volume-Bitmaps (v1..v11) in PROGMEM – hier gekürzt dargestellt
const uint8_t v1[] PROGMEM = { ... }; // 128x64 Bitmap Daten
const uint8_t v2[] PROGMEM = { ... };
// ... v3 bis v11 analog

void dsply(int input) { // Zeigt zweistellige Zahl auf OLED
  int n1,n2;
  if(input<10){ SSD1306_char3216(10,25,'0',oled_buf); n1=0; n2=input; }
  else { n1=input/10; n2=input%10; }
  // Ziffern zeichnen (Switch-Case für 0-9)
  // ... Implementierung für n1 an Pos 10, n2 an Pos 26
}

void setup() {
  Serial.begin(9600);
  Wire.begin();
  SSD1306_begin();
  SSD1306_clear(oled_buf);
}

void loop() {
  // 1. Aktuelle 8 Pixel einlesen & Summe bilden
  for(int i=0;i<=7;i++){
    if(tpa.getPoint(i+1)>29){ Serial.print("# "); gesture[i][0]=1; }
    else { Serial.print(". "); gesture[i][0]=0; }
  }
  for(int y=0;y<=7;y++) sum+=gesture[y][0];
  Serial.println(sum); Serial.println(" "); delay(100);

  // 2. Standby: Alle 8 Pixel "heiß" → Warte auf Bewegung
  if(sum==8){ sflag=1; Serial.println("standby"); }
  else { sum=0; }

  // 3. Gesten-Erkennung: Start wenn sflag=1 und sum!=8
  if(sflag==1 && sum!=8){
    Serial.println("start gesture");
    gcount=0; c=0; sum=0;
    while(sum<8){
      sum=0;
      for(int i=0;i<=7;i++){
        if(tpa.getPoint(i+1)>29){ Serial.print("# "); gesture[i][gcount]=1; }
        else { Serial.print(". "); gesture[i][gcount]=0; }
      }
      for(int y=0;y<=7;y++){ sum+=gesture[y][gcount]; delay(5); }
      Serial.println(" "); delay(50); gcount++;
    }
    Serial.print("sum: "); Serial.println(sum);
    Serial.print("gesture length: "); Serial.println(gcount); delay(5);

    // 4. Spaltenweise Summen bilden (Links vs Rechts)
    for(c=0;c<=7;c++){
      for(int z=0;z<=gcount;z++){ tgesture[c]+=gesture[c][z]; delay(5); }
      Serial.println("processing");
    }
    tgesture[0]+=tgesture[1]; tgesture[2]+=tgesture[3];
    tgesture[4]+=tgesture[5]; tgesture[6]+=tgesture[7];
    tgesture[0]+=tgesture[2]; tgesture[4]+=tgesture[6];

    // 5. Entscheidung: Links mehr → Vol+, Rechts mehr → Vol-
    if(tgesture[0] < tgesture[4]) { vol += (gcount/2); Serial.println("volume up"); }
    if(tgesture[4] < tgesture[0]) { vol -= (gcount/2); Serial.println("volume down"); }
    sflag=0;
  }
  sum=0;

  // 6. OLED: Volume-Bitmap anzeigen (v1..v11)
  SSD1306_clear(oled_buf);
  switch(vol){
    case 1: SSD1306_bitmap(0,0,v1,128,64,oled_buf); break;
    case 2: SSD1306_bitmap(0,0,v2,128,64,oled_buf); break;
    case 3: SSD1306_bitmap(0,0,v3,128,64,oled_buf); break;
    case 4: SSD1306_bitmap(0,0,v4,128,64,oled_buf); break;
    case 5: SSD1306_bitmap(0,0,v5,128,64,oled_buf); break;
    case 6: SSD1306_bitmap(0,0,v6,128,64,oled_buf); break;
    case 7: SSD1306_bitmap(0,0,v7,128,64,oled_buf); break;
    case 8: SSD1306_bitmap(0,0,v8,128,64,oled_buf); break;
    case 9: SSD1306_bitmap(0,0,v9,128,64,oled_buf); break;
    case 10: SSD1306_bitmap(0,0,v10,128,64,oled_buf); break;
    case 11: SSD1306_bitmap(0,0,v11,128,64,oled_buf); break;
  }
  SSD1306_display(oled_buf);
}

(Animierte GIFs im Original zeigen die Erkennung)

Was kommt als Nächstes?

Die Methode lässt sich erweitern für: Tippen, Wischen, Ziehen, Strecken etc. Definieren Sie für jede Geste Aktionen (Befehle, Steuerung).

Bibliotheken

Herstellungsprozess

  1. Arduino-Sensoren: Typen, Anwendungen und reale Projekte
  2. PIR-Sensorschaltungen: Design, Betrieb und reale Anwendungen
  3. LED mit PIR-Bewegungsmelder am Raspberry Pi steuern
  4. Raspberry Pi GPIO meistern: PIR-Bewegungsmelder an B+/Model 2 anschließen
  5. HC-SR501 PIR-Bewegungssensor an Raspberry Pi anschließen, kalibrieren und programmieren
  6. DHT11 Temperatur- & Feuchtesensor mit LED-Anzeige & Piezo-Summer
  7. Arduino-Uno-Roboter zur Personenerkennung – Sensorintegration Schritt für Schritt
  8. Smart IoT-Glas bauen: Füllstand überwachen mit ESP8266, Arduino & Ultraschall
  9. Interaktive LED-Matrix Tür-Anzeige mit PIR-Bewegungssensor – Arduino Feiertagsgruß
  10. Sensorturm mit Arduino Cloud: Temperatur, Bewegung & Gase überwachen