Projekt Treppenbeleuchtung

Hallo, ich bin neu im Arduino Sketch schreiben.

Das projekt besteht derzeit aus einem Arduino Uno, 5 Meter weiße LED's, einem PIR Sensor und einem TIP120 zur ansteuerung der LED's.

Mein Problem ist folgendes:
Das schreiben von Sketches beherrsche ich noch nicht und habe mir zur Vorlage den hier zu findenden Sketch genommen.
Vorlage: Arduino Playground - PIRsense
Ich bekomme es hin alles anzusteuern, jedoch möchte ich die LED's nicht sofort auf voller Helligkeit einschalten sonder diese 'langsam hochfahren'.
dazu habe ich folgendes probiert:

for (int i=0; i<=255; i++)
{
analogWrite(9, i)
}

Die LED's flackern aber nur.

Könnt ihr mir einige Tips geben?
Danke im voraus!

analogWrite() geht nur bis 255. Und deine Schleife läuft in paar µs durch. Also alles andere als langsam.

Das was du möchtest ist "faden".
Dann lies dir dies mal durch.

for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 5) {
    // sets the value (range from 0 to 255):
    analogWrite(ledPin, fadeValue);
    // wait for 30 milliseconds to see the dimming effect
    delay(30);
}

Das steht in Fade, ich nutze hier statt dem Wert 'fadeValue' den Wert 'i'
Macht es viel aus wenn ich den delay, also die pause weg lasse?

sobald ich jedoch das in der Volage vorhandene

{
digitalWrite(9, HIGH)
}

mit dem oberen ersetze dann blinken die LED's nur

Und warum willst du das ändern?
Und Variablen solltest du richtig benennen, damit du diese später auseinander halten kannst.

Du bist wohl nicht nicht nur neu beim Arduino, sondern beim programmieren allgemein.

Ob die Variable "i" oder "fade" heißt ist egal. "i" steht normal glaube ich für "index", aber man kann da auch aussagekräftigere Namen nehmen wenn man möchte.

Macht es viel aus wenn ich den delay, also die pause weg lasse?

Hier fehlt dir das Gefühl für die Geschwindigkeit des Prozessors. 16MHz sind nicht sehr viel heutzutage, aber viele der einfachen Funktionen liegen im ein- bis zwei-stelligem µs-Bereich. Eventuell auch darunter wenn nicht viel zu tun ist. delay(30) bedeutet eine Pause von 30ms

verstehe so langsam, wie es funktionieren soll.

wenn ich nun diesen code nutze:

for (int fade = 0; fade <= 255; fade += 5) {
   analogWrite(9, fade);
   delay(50);
  }

Dann fadet das Licht ein wenn der PIR Sensor eine Bewegung erkennt, wenn die Bewegung nun durchgehend ist fängt dann die LED nicht wieder bei dem Wert 0 an und fadet dann bis 255?

Digital_Operator:
verstehe so langsam, wie es funktionieren soll.

wenn ich nun diesen code nutze:

for (int fade = 0; fade <= 255; fade += 5) {

analogWrite(9, fade);
  delay(50);
 }



Dann fadet das Licht ein wenn der PIR Sensor eine Bewegung erkennt, wenn die Bewegung nun durchgehend ist fängt dann die LED nicht wieder bei dem Wert 0 an und fadet dann bis 255?

Das stimmt, wenn dieser code in der Loop ist.

Könntest du mir bitte ein bespiel Sketch schreiben?
Dann könnte ich es mir in einem Sketch anschauen. :slight_smile:

Digital_Operator:
Könntest du mir bitte ein bespiel Sketch schreiben?
Dann könnte ich es mir in einem Sketch anschauen. :slight_smile:

Ichp habe dir doch schon den Link mit dem Beispiel gepostet.

in dem bespiel ist aber gerade in der loop.
da wird es ja wieder nur von 0 bis 255 faden und dann wieder 0 bis 255 usw.

wie schreibe ich es damit es nicht loop ist?

Das gehört schon in loop(). Du musst das halt mit einem externen Ereignis verknüpfen und nur machen wenn der PIR anschlägt

Wobei man dann auch besser die for-Schleife auflöst. Sonst wird erst wieder abfragt wenn die einmal komplett durchgelaufen ist.

Aloha!

Ich verstehe nicht so richtig, was Du eigentlich möchtest und wie es funktionieren soll. Könntest Du nochmal kurz erklären, was Du möchtest, und aktuellen Code sowie Schaltplan dazu tun?

Gruß

Gregor

Und poste doch auch mal den Link des verwendeten PIR.

versuch es mal so:

#define led_pin 3
#define Pir_Sensor 2
uint8_t fadeValue;
bool Pir_Sensor_val;
void setup() 
{
 // pinMode(Pir_Sensor,INPUT_PULLUP);

}

void loop()
{
     Pir_Sensor_val=digitalRead(Pir_Sensor);
     
     static uint32_t millisalt;
     const uint8_t dt=30;//Verögerungszeit
     if (Pir_Sensor_val&&millis()-millisalt>dt)  {fade_up(); millisalt=millis();}
     if (!Pir_Sensor_val&&millis()-millisalt>dt)  {fade_down();millisalt=millis();}
 }
void fade_up()
{
   if (fadeValue <255) fadeValue ++;
       analogWrite(led_pin, fadeValue);
  }

void fade_down()
{
   if (fadeValue >0)fadeValue --;
       analogWrite(led_pin, fadeValue);
       
  }

gregorss:
Aloha!

Ich verstehe nicht so richtig, was Du eigentlich möchtest und wie es funktionieren soll. Könntest Du nochmal kurz erklären, was Du möchtest, und aktuellen Code sowie Schaltplan dazu tun?

Gruß

Gregor

Ich möchte mit einem PIR sensor eine 5 Meter LEDkette ansteuern.

HotSystems:
Und poste doch auch mal den Link des verwendeten PIR.

Ich nutze "HC-SR501 Sensor Module"
Gekauft hier: Link!
Datenblatt: Link!

ardubu:
versuch es mal so:

#define led_pin 3

#define Pir_Sensor 2
uint8_t fadeValue;
bool Pir_Sensor_val;
void setup()
{
// pinMode(Pir_Sensor,INPUT_PULLUP);

}

void loop()
{
    Pir_Sensor_val=digitalRead(Pir_Sensor);
   
    static uint32_t millisalt;
    const uint8_t dt=30;//Verögerungszeit
    if (Pir_Sensor_val&&millis()-millisalt>dt)  {fade_up(); millisalt=millis();}
    if (!Pir_Sensor_val&&millis()-millisalt>dt)  {fade_down();millisalt=millis();}
}
void fade_up()
{
  if (fadeValue <255) fadeValue ++;
      analogWrite(led_pin, fadeValue);
 }

void fade_down()
{
  if (fadeValue >0)fadeValue --;
      analogWrite(led_pin, fadeValue);
     
 }

ardubu ich danke dir!
Habe versucht den Sketch zu verstehen aber, komme nicht so ganz klar.
Funktioniert super!

Wenn ich nun aber 4x PIR (HC-SR501) & 1x Lichtstärke Sensor (BH1750FVI) am Ende meines Projektes verwenden möchte, was ändert sich dann?


2x PIR soll 3M LED's ansteuern (Treppe)
2x PIR soll 2M LED's ansteuern (Flur)
1x Lichtstärke Sensor soll Helligkeit messen

Der geplante Ablauf der Schaltung soll in etwa so sein:
Wenn einer bzw beide PIR Sensoren eine Bewegung erkennt, dann soll die Helligkeit ermittelt werden und wenn dieser z.b unter 50 lux ist sollen die LED's an gehen.

Datenblatt zum Lichtstärke Sensor: Link!

ich vermute mal du möchtest 2 x Pir-Sensor an der Treppe (oben und unten?) und 2 x Pir-Sensor im Flur (Anfang und Ende?) montieren. Wo soll der Licht-Sensor hin?

Wenn einer bzw beide PIR Sensoren eine Bewegung erkennt, dann soll die Helligkeit ermittelt werden und wenn dieser z.b unter 50 lux ist sollen die LED's an gehen.

Wann sollen die LED's wieder ausgehen? Wenn der Licht-Sensor z.B. im Flur sitzt und das Licht an ist, was soll passieren, wenn jetzt einer die Treppe runter will?

Richtig, die PIR Sensoren sollen genau so angebracht werden wie du es geschrieben hast.
Der Licht Sensor soll an den Anfang des Flures, wo eine Tür nach draußen ist und diesen Sensor wollte ich am Glas der Tür montieren.
Das schlimmste was passieren kann ist, dass das Licht auf der Treppe in der Nacht zu hell ist.

Kompliziert wird es jedoch um einiges mit dem Licht Sensor, da er im Flur bestimmen soll ob das Licht an geht und auf der Treppe welche Helligkeit das Licht hat.

Der Ablauf soll folgender sein (dies mal genauer) :
Ein PIR-Sensor erkennt eine Bewegung, der Licht Sensor wird aus dem standby geweckt, fragt die Helligkeit ab und speichert diesen in einer variable, der Wert wird verglichen
'Helligkeit<50" und wenn dies zutrifft geht im Flur das Licht an bzw. das Licht an der Treppe geht nur noch mit niedriger Helligkeit an.

Zum Verständnis:
Das Licht im Flur soll nur einschalten wenn es dunkel ist.
Das Licht an der Treppe kann auch tagsüber mit normaler Helligkeit einschalten, sollte jedoch abends/nachts nur mit niedriger Helligkeit einschalten.

Digital_Operator:
Wenn ich nun aber 4x PIR (HC-SR501) & 1x Lichtstärke Sensor (BH1750FVI) am Ende meines Projektes verwenden möchte, was ändert sich dann?

Basierend auf dem Vorschlag von #14 die Erweiterung mit Hilfe von Feldern:

const byte ledPin[2] = {3, 6};
const byte pirPin[2][2] = {{2, 4}, {5, 7}};
uint8_t fadeValue[2];
bool Pir_Sensor_val;

void setup()
{
  pinMode(ledPin[0], OUTPUT);
  pinMode(ledPin[1], OUTPUT);
  pinMode(pirPin[0][0], INPUT_PULLUP);
  pinMode(pirPin[1][0], INPUT_PULLUP);
  pinMode(pirPin[0][1], INPUT_PULLUP);
  pinMode(pirPin[1][1], INPUT_PULLUP);
}

void loop()
{
  bereich(0);
  bereich(1);
}
void bereich(byte ber) {
  Pir_Sensor_val = digitalRead(pirPin[ber][0]) || digitalRead(pirPin[ber][1]);
  static uint32_t millisalt[2];
  const uint8_t dt = 30; //Verögerungszeit
  if (Pir_Sensor_val && (millis() - millisalt[ber] > dt))  {
    millisalt[ber] = millis();
    fade_up(ber);
  }
  if (!Pir_Sensor_val && (millis() - millisalt[ber] > dt))  {
    millisalt[ber] = millis();
    fade_down(ber);
  }
}
void fade_up(byte b)
{
  if (fadeValue[b] < 255) fadeValue[b] ++;
  analogWrite(ledPin[b], fadeValue[b]);
}

void fade_down(byte b)
{
  if (fadeValue[b] > 0)fadeValue[b] --;
  analogWrite(ledPin[b], fadeValue[b]);
}

Ich hoffe, es hilft Dir weiter :slight_smile:

Die Auswertung der Helligkeit bekommst Du doch selbst hin, oder?

wenn ich mir die Beschreibung zu deinen Pir-Sensoren anschaue, sehe ich was von CDS (Photosensitiv Control), damit müsstest du dir den Lichtsensor eigentlich einsparen können.