Treppenbeleuchtung

Hallo Community,

ich bin gerade dabei eine Treppenbeleuchtung zu machen.

Verwendet wurden dazu ein Arduino Uno, 3m WS2812B, ein 5V 8A Led-Netzteil und 2 PIR-Sensoren (AMN31112J Panasonic 3 - 6 V/DC (Ø) 10 mm).

Beim Data-Output habe ich einen Widerstand (470 Ohm) zwischengelötet.

Dazu habe ich folgenden Sketch geschrieben:

#include <FastLED.h>
#include <SPI.h>
#include <SD.h>

#define NUM_LEDS 92
#define DATA_PIN 6
#define CHIPSET WS2812B
#define CMD_NEW_DATA 1
#define COLOR_ORDER GRB

uint8_t max_bright = 80;
File fxdata;
CRGB leds[NUM_LEDS];

//Sensor 1 & 2 definieren
// constants won't change. They're used here to set pin numbers:
const int sensor_oben = 9;
const int sensor_unten = 11;         // the number of the pushbutton pin

void setup() {
  // put your setup code here, to run once:
  FastLED.addLeds<CHIPSET, DATA_PIN>(leds, NUM_LEDS); //see doc for different LED strips
  // initialize the pushbutton pin as an input:
  pinMode(DATA_PIN, OUTPUT);
  pinMode(sensor_oben, INPUT_PULLUP);
  pinMode(sensor_oben, INPUT_PULLUP);
  digitalWrite(sensor_oben, LOW);
  digitalWrite(sensor_unten, LOW);
}

void loop() {
  // put your main code here, to run repeatedly:  
  readSensors();  // read the state of the pushbutton value:  
  moveup();
  movedown();  
}

void readSensors(){
  if ( digitalRead(sensor_oben) == HIGH ){  // Walk Down.
    movedown();    
  } else if ( digitalRead(sensor_unten) == HIGH  ){ // Walk Up.
    moveup();
  }
}

void moveup(){

    for(int i=0;i<NUM_LEDS;i++){        // Licht wird von unten nach oben EIN geschaltet
       leds[i].setRGB(255,255,255);
       FastLED.show();
       delay(50);
    }
    delay(10000);
    for(int i=NUM_LEDS; i>0;i--){
      leds[i].setRGB(0,0,0);
      FastLED.show();
      delay(100);
    }    
}

void movedown(){
    for(int i=NUM_LEDS;i>0;i--){        // Licht wird von unten nach oben EIN geschaltet
       leds[i].setRGB(255,255,255);
       FastLED.show();
       delay(50);
    }
    delay(10000);
    for(int i=0; i<NUM_LEDS; i++){
      leds[i].setRGB(0,0,0);
      FastLED.show();
      delay(100);
    }    
  }

Soweit so gut, ich weiß, dass ist kein gutes Programm und ich sollte es mit millis() machen, aber ich möchte gerne, dass zumindest übergangsmäßig ein Programm läuft. Weiters wollte ich gerne die Sensoren und LED’s damit testen.

Nun zu meinem Problem. Die PIR Sensoren senden anscheinend ununterbrochen “HIGH”. Ich denke, dass die PIR Sensoren einen Pullup Widerstand benötigen oder? Ich habe ja mit input_pullup den internen Pullupwiderstand aktiviert? Ist es möglich, dass nur bestimmte Pins den internen Widerstand haben? Wen ja welche?
Oder brauche ich für die Panasonic PIR Sensoren eine spezielle Schaltung?

Ich weiß, das ist eher ein Elektronikproblem, aber ich denke hier sind viele schlaue Köpfe vertreten, deswegen hoffe ich hier um Antworten :slight_smile:

Danke!!

Hallo,
du hättest dir das Datenblatt des Sensors ansehen sollen.

Da geht daraus hervor, wie der Sensor angeschlossen werden soll.

Ich habe ihn wie im beiliegenden Schaltbild am Arduino an einem digitalen Pin angeschlossen und frage auf HIGH ab.

IR-Sensor.jpg

So funktioniert es super, am Arduino oder auch an einem ATtiny85 o.ä.

Edit:
Die Schaltung hatte ich dir im letzten Thread auch schon gezeigt, warum machst du das nicht so ?

Hi

Laut Datasheet @ Conrad kann der Ausgang des Sensor nur aktiv auf HIGH schalten.
Somit ist ein PullUP die denkbar schlechteste Lösung, da Du so IMMER ein HIGH bekommst.
Hier wirst Du den internen PullUP abschalten und einen externen PullDN (also Widerstand gegen GND) verbauen.
Dieser darf ruhig etwas hochohmiger ausfallen, da laut Datenblatt der Ausgang wohl nur 100µA (0,1mA) liefern kann.
Ich beziehe mich hierbei auf das verlinkte Datenblatt, Seite 6

MfG

... ok .. zu spät ... (dann eben 'nicht schnell genug und aus Trotz trotzdem stehen lassen' :wink: )

postmaster-ino:
... ok .. zu spät ...

Nöö...wieso, ist doch gut erklärt.

find ich auch

Hi

Zumindest für die Nachwelt - dem TO sind die Äußerungen hier wohl nicht weiter wichtig genug, um Diese zu kommentieren.
Naja, wie geschrieben, vll. hilft's 'nem Sucher in der Zukunft :slight_smile:

Danke für den Zuspruch :wink:

MfG

postmaster-ino:

Zumindest für die Nachwelt - dem TO sind die Äußerungen hier wohl nicht weiter wichtig genug, um Diese zu kommentieren.

Der TO hat ja geschrieben, er hofft auf Antworten.

Vermutlich sind es ihm noch nicht genug Antworten, oder der Inhalt entspricht nicht seinen Wünschen.

Und funktioniert deine Treppenbeleuchtung jetzt ?
Nett wäre ja eine Rückmeldung deinerseits.

Hallo,

danke für eure Antworten und euer Interesse, ob es nun funktioniert.

@hotsystems stimmt du hattest mir die Schaltung schon mal gezeigt, die habe ich fatalerweise mit gefährlichem Halbwissen ignoriert, sorry :smiley:

Zur Frage ob es nun funktioniert: Da ich beruflich unterwegs bin, konnte ich es noch nicht testen.

Frazor:
Hallo,

danke für eure Antworten und euer Interesse, ob es nun funktioniert.

@hotsystems stimmt du hattest mir die Schaltung schon mal gezeigt, die habe ich fatalerweise mit gefährlichem Halbwissen ignoriert, sorry :smiley:

Zur Frage ob es nun funktioniert: Da ich beruflich unterwegs bin, konnte ich es noch nicht testen.

Ok, danke für die Zwischenmeldung.
Dann warten wir, bis es soweit ist.

Hallo, ich melde mich mal zurück.

Problem: habe leider keinen 100k Ohm Widerstand zuhause. Morgen dann.

Zur Verständis: bin ich da richtig, wenn ich denke, dass ich jetzt den Widerstand so lange erhöhen muss, bis die Sensoren nicht mehr von alleine auslösen?

Frazor:
Hallo, ich melde mich mal zurück.

Problem: habe leider keinen 100k Ohm Widerstand zuhause. Morgen dann.

Zur Verständis: bin ich da richtig, wenn ich denke, dass ich jetzt den Widerstand so lange erhöhen muss, bis die Sensoren nicht mehr von alleine auslösen?

Die Sensoren lösen nicht von alleine aus.
Die liefern bei Auslösung HIGH, also +5Volt. Der Widerstand zieht den Ausgang def. auf LOW, wenn keine Auslösung erfolgt.
Nimm 100 k und es passt. Ich habe so mehrere Sensoren verbaut und das funktioniert.
Oder 2 x 47 k in Reihe, oder 3 x 33 k oder 5 x 22 k oder 10 x 10 k oder.....oder.....oder.

Hab jetzt aus mehreren Widerständen gemessene 130k Ohm gebastelt.

Angehängt - Led's schalten sich direkt ein :astonished:

Frazor:
Hab jetzt aus mehreren Widerständen gemessene 130k Ohm gebastelt.

Angehängt - Led's schalten sich direkt ein :astonished:

Was heißt direkt ?
Mit Bewegung davor oder ohne ?
Dann zeig mal den aktuellen Sketch.

Naja ich stecke das Netzteil an, und die Leds schalten sich nach der Reihe an. ohne Bewegung, stehe weit weg von den Sensoren.

Sketch:

[tt]#include <FastLED.h>


#include <SPI.h>
#include <SD.h>

#define NUM_LEDS 92
#define DATA_PIN 6
#define CHIPSET WS2812B
#define CMD_NEW_DATA 1
#define COLOR_ORDER GRB

uint8_t max_bright = 80;
File fxdata;
CRGB leds[NUM_LEDS];

//Sensor 1 & 2 definieren
// constants won't change. They're used here to set pin numbers:
const int sensor_oben = 9;
const int sensor_unten = 11;         // the number of the pushbutton pin

void setup() {
  // put your setup code here, to run once:
  FastLED.addLeds<CHIPSET, DATA_PIN>(leds, NUM_LEDS); //see doc for different LED strips

  // initialize the pushbutton pin as an input:
  pinMode(DATA_PIN, OUTPUT);
  pinMode(sensor_oben, INPUT);
  pinMode(sensor_oben, INPUT);

  digitalWrite(sensor_oben, HIGH);
  digitalWrite(sensor_unten, HIGH);
}

void loop() {
  // put your main code here, to run repeatedly:
  
  readSensors();  // read the state of the pushbutton value:
  
  moveup();
  movedown();
  
}

void readSensors(){
  if ( digitalRead(sensor_oben) == LOW ){  // Walk Down.

    movedown();
    
  } else if ( digitalRead(sensor_unten) == LOW ){ // Walk Up.

    moveup();
  }
}


void moveup(){

    for(int i=0;i<NUM_LEDS;i++){        // Licht wird von unten nach oben EIN geschaltet
       leds[i].setRGB(255,255,255);
       FastLED.show();
       delay(50);
    }
    delay(10000);
    for(int i=NUM_LEDS; i>0;i--){
      leds[i].setRGB(0,0,0);
      FastLED.show();
      delay(100);
    }
    
}

void movedown(){

    for(int i=NUM_LEDS;i>0;i--){        // Licht wird von unten nach oben EIN geschaltet
       leds[i].setRGB(255,255,255);
       FastLED.show();
       delay(50);
    }
    delay(10000);
    for(int i=0; i<NUM_LEDS; i++){
      leds[i].setRGB(0,0,0);
      FastLED.show();
      delay(100);
    }
    
  }[/tt]

Ja, kein Wunder....du setzt den Eingang im Setup auf HIGH, dann muss das auch so sein.
Nimm die beiden Anweisungen raus.
Beide digitalWrite(pin, HIGH); müssen weg.

Hi

Denke ich nicht - da Er die Sensoren auf LOW abfragt, ist der aktivierte PullUp nicht die schlechteste Idee - wenn man Das auch mit Einem Befehl hinbekommen könnte.
pinMode(sensor_oben, INPUT);
digitalWrite(sensor_oben, HIGH);

--> pinMode(sensor_oben, INPUT_PULLUP);

Liest sich auch gleich viel besser.

Mache die Sensoren einen Funktionstest? (sollte im Datenblatt stehen, hatte ich oben ja schon verlinkt)
Die 'richtigen' PIR machen beim Zuschalten einen Selbsttest, schalten also 1x durch, egal welche Helligkeit oder Erkennung.
Erst danach wird auf Bewegungen reagiert, unter Rücksicht auf die eingestellte Helligkeitsschwelle.

MfG

Edit Satzrückstand gelöscht

Ja grade gesehen, er muss natürlich auf HIGH abfragen, nicht auf LOW, da der Sensor ja HIGH rausgibt.

Wieso hast du das wieder geändert ?

Ja stimmt, ich muss ja jetzt wieder auf High abfragen…

Sketch:

#include <FastLED.h>


#include <SPI.h>
#include <SD.h>

#define NUM_LEDS 92
#define DATA_PIN 6
#define CHIPSET WS2812B
#define CMD_NEW_DATA 1
#define COLOR_ORDER GRB

uint8_t max_bright = 80;
File fxdata;
CRGB leds[NUM_LEDS];

//Sensor 1 & 2 definieren
// constants won't change. They're used here to set pin numbers:
const int sensor_oben = 9;
const int sensor_unten = 11;         // the number of the pushbutton pin

void setup() {
  // put your setup code here, to run once:
  FastLED.addLeds<CHIPSET, DATA_PIN>(leds, NUM_LEDS); //see doc for different LED strips

  // initialize the pushbutton pin as an input:
  pinMode(DATA_PIN, OUTPUT);
  pinMode(sensor_oben, INPUT);
  pinMode(sensor_oben, INPUT);


}

void loop() {
  // put your main code here, to run repeatedly:
  
  readSensors();  // read the state of the pushbutton value:
  
  moveup();
  movedown();
  
}

void readSensors(){
  if ( digitalRead(sensor_oben) == HIGH ){  // Walk Down.

    movedown();
    
  } else if ( digitalRead(sensor_unten) == HIGH ){ // Walk Up.

    moveup();
  }
}


void moveup(){

    for(int i=0;i<NUM_LEDS;i++){        // Licht wird von unten nach oben EIN geschaltet
       leds[i].setRGB(255,255,255);
       FastLED.show();
       delay(50);
    }
    delay(10000);
    for(int i=NUM_LEDS; i>0;i--){
      leds[i].setRGB(0,0,0);
      FastLED.show();
      delay(100);
    }
    
}

void movedown(){

    for(int i=NUM_LEDS;i>0;i--){        // Licht wird von unten nach oben EIN geschaltet
       leds[i].setRGB(255,255,255);
       FastLED.show();
       delay(50);
    }
    delay(10000);
    for(int i=0; i<NUM_LEDS; i++){
      leds[i].setRGB(0,0,0);
      FastLED.show();
      delay(100);
    }
    
  }

Aber du schreibst nicht, ob es jetzt funktioniert.