Un'elegante illuminazione automatica delle scale (parte 1)

Nella prima Parte di una nuova emozionante Serie di eleganti automatico Treppenbeleuchtung per un massimo di 16 Livelli, in ogni Livello della Scala alla volta, come si Spostano, si illumina non appena uno dei due Infrarotmelder, singolarmente nella parte superiore e nella parte inferiore delle Scale è stato apposto un Movimento segnalare. Qui, ogni singola Scala ancora dolcemente tramite PWM Controllo sulla Luminosità massima hochgedimmt e, successivamente, fino a spegnersi di nuovo heruntergedimmt. Dei Periodi in cui la Scala rimane acceso, o la Fase di caricamento o herabdimmt è libero di Sketch a suo Piacimento regolabile. Una Soluzione di questo tipo ci sono già commercialmente (qui nel Video Funzionamento).

Oggi vi mostrerò come fare una Funzione simile Controllo utilizzando Arduino e l'esterno di alcuni Componenti di costruire.

 

Abbiamo bisogno per il nostro do-it-yourself Treppenbeleuchtung seguente Elektronik-Componenti:

 

Numero

Descrizione

Nota

2

PIR Modulo HC-SR501 PIR

Sensore di movimento

1

PCA9685 16 Canale 12 Bit PWM Driver

 

1

Nano V3

 

1

MB102 Alimentatore Adattatore

Per Breadboardaufbau

fino a 16

IRF520 MOS Driver Modulo 0-24V 5A

Numero a seconda Treppenzahl

1

Alimentatore per LED/Lampade per i Livelli di

Massimo 24 Volt

 

Nel seguente Schema è la Kernsteuerung vedere. In modo esemplare, tuttavia, sono solo 2 Treiberstufen il numero massimo di 16 Treiberstufen vedere. Se si dispone di più Treiberstufen necessaria, questa, mutatis mutandis, come i due tracciate collegato. Da notare è necessariamente una rispondenti ai criteri di sicurezza Utilizzo di Cavi di alimentazione e Cavi e di un sufficiente dimensioniertes Alimentatore. L'Alimentatore deve essere in Sovraccarico essere protetto e tutti Treppenstufenlichter e l'Arduino con stabilizzazione Tensione in grado di fornire senza problemi! Sussiste il pericolo di Incendio in caso di non idoneo Installazione e/o Funzionamento!

 

Stiamo costruendo il Circuito per la nostra Scala come indicato di seguito su una Breadboard per verificare:

 

montaggio su Breadboard

 

Im Passo successivo, dobbiamo modificare il codice Sorgente del Arduino alle proprie Esigenze. Interessanti sono le seguenti 3 Righe di Codice:

#define Num_Stages 15
#define Delay_Stages 10
#define Delay_ON_to_OFF 5

 

Num_Stages

Definisce il Numero di illuminare le Scale (per un massimo di 16, 0 anzählend per iniziare. Massimo: 15)

Delay_Stages

Fade Periodo di tempo per ogni Scalino -> più piccolo è il Valore, maggiore è il Periodo di tempo più lento.

Delay_ON_to_OFF

Periodo passa mostrando le Scale in Stato di "a" rimane.

 

Dopo i valori, le proprie Preferenze, può il Codice su Arduino essere caricati :

 

 

// 2019 Tobias Kuch GPL 3.0
#include <Wire.h>

#define PWM_Module_Base_Addr 0x40 //10000000b L'ultimo Bit del Adressbytes definisce l'Operazione che si desidera eseguire. L'Impostazione logico 1 0x41 Modulo 2
//è un'operazione di Lettura sceglie, durante una logica 0 una operazione di Scrittura casuale.
#define OE_Pin  8           // Pin di Output Enable
#define PIRA_Pin 2
#define PIRB_Pin 3

#define Num_Stages  15
#define Delay_Stages  10
#define Delay_ON_to_OFF  30  // Minimo Delay_ON_to_OFF in Seconds

byte Pwm_Channel = 0;
int Pwm_Channel_Brightness = 0;

bool Motion_Trigger_Down_to_Up = false;
bool On_Delay = false;

// interrupt Control
byte A60telSeconds24 = 0;
byte Seconds24;

ISR(TIMER1_COMPA_vect)
{   A60telSeconds24++;   if (A60telSeconds24 > 59)   {     A60telSeconds24 = 0;     Seconds24++;     if (Seconds24 > 150)     {       Seconds24 = 0;     }   }
}

void ISR_PIR_A()
{   bool PinState = digitalRead(PIRA_Pin);   if (PinState)   {     Motion_Trigger_Down_to_Up = true; // PIR A generato   }
}

void ISR_PIR_B()
{   bool PinState = digitalRead(PIRB_Pin);   if (PinState)   {     Motion_Trigger_Down_to_Up = true; // PIR B generato   }
}

void Init_PWM_Module(byte PWM_ModuleAddr)
{   pinMode(OE_Pin, USCITA);   digitalWrite(OE_Pin, ALTA); // Pin di attivazione dell'uscita LOW (OE) attivo.   filo.iniziare la trasmissione(PWM_ModuleAddr); // Avvia il trasferimento di dati   filo.write(0x01);                       // Seleziona la modalità 2 Register (Command Register)   filo.write(0x04);                       // Configura chip: 0x04: uscita totem 0x00: uscita drain aperta.   filo.trasmissione finale();                 // Arresta comunicazione - invia bit di stop   filo.iniziare la trasmissione(PWM_ModuleAddr); // Avvia il trasferimento di dati   filo.write(0x00);                      // Seleziona il registro modalità 1 (Registro comandi)   filo.write(0x10);                      // Configura SleepMode   filo.trasmissione finale();                // Arresta comunicazione - invia bit di stop   filo.iniziare la trasmissione(PWM_ModuleAddr); // Avvia il trasferimento di dati   filo.write(0xFE);                       // Scegli il registro PRE_SCALE (Registro comandi)   filo.write(0x03);                       // Imposta prescaler. La frequenza PWM massima è 1526 Hz se PRE_SCALEer Regsiter è impostato su "0x03h". Standard: 200 Hz   filo.trasmissione finale();                 // Arresta comunicazione - invia bit di stop   filo.iniziare la trasmissione(PWM_ModuleAddr); // Avvia il trasferimento di dati   filo.write(0x00);                       // Seleziona il registro modalità 1 (Registro comandi)   filo.write(0xA1);                       // Configura chip: consenti tutti gli indirizzi I2C di chiamata, utilizza l'orologio interno, // Consenti funzione di incremento automatico   filo.trasmissione finale();                 // Arresta comunicazione - invia bit di stop
}


vuoto Init_PWM_Outputs(byte PWM_ModuleAddr)
{   digitalWrite(OE_Pin, ALTA); // Pin di attivazione dell'uscita LOW (OE) attivo.   per ( int z = 0; z < 16 + 1; z++)   {     filo.iniziare la trasmissione(PWM_ModuleAddr);     filo.write(z * 4 + 6);      // Scegli il registro PWM_Channel_ON_L     filo.write(0x00);                     // valore per quanto sopra registro     filo.trasmissione finale();     filo.iniziare la trasmissione(PWM_ModuleAddr);     filo.write(z * 4 + 7);      // Scegli il registro PWM_Channel_ON_H     filo.write(0x00);                     // valore per quanto sopra registro     filo.trasmissione finale();     filo.iniziare la trasmissione(PWM_ModuleAddr);     filo.write(z * 4 + 8);   // Scegli il registro PWM_Channel_OFF_L     filo.write(0x00);        // valore per quanto sopra registro     filo.trasmissione finale();     filo.iniziare la trasmissione(PWM_ModuleAddr);     filo.write(z * 4 + 9);  // Scegli il registro PWM_Channel_OFF_H     filo.write(0x00);             // valore per quanto sopra registro     filo.trasmissione finale();   }   digitalWrite(OE_Pin, LOW); // Pin di attivazione dell'uscita LOW (OE) attivo.
}

vuoto configurazione()
{   // inizializzazione   pinMode(PIRA_Pin, INGRESSO);   pinMode(PIRB_Pin, INGRESSO);   serial.iniziare(9600);   filo.iniziare(); // Inizializza bus I2C A4 (SDA), A5 (SCL)   Init_PWM_Module(PWM_Module_Base_Addr);   Init_PWM_Outputs(PWM_Module_Base_Addr);   noInterrupts();   attachInterrupt(0, ISR_PIR_A, CAMBIO);   attachInterrupt(1, ISR_PIR_B, CAMBIO);   TCCR1A = 0x00;   TCCR1B = 0x02;   TCNT1 = 0;      // inizializza il registro con 0   OCR1A =  33353;      // preassegna il registro di confronto delle uscite   TIMSK1 |= (1 << OCIE1A);  // Attiva l'interruzione del confronto timer   interrupt();
}

vuoto Down_to_Up_ON()
{   Pwm_Channel = 0;   Pwm_Channel_Brightness = 0;   mentre (Pwm_Channel < Num_Stages + 1)   {     filo.iniziare la trasmissione( PWM_Module_Base_Addr);     filo.write(Pwm_Channel * 4 + 8);   // Scegli il registro PWM_Channel_0_OFF_L     filo.write((byte)Pwm_Channel_Brightness & 0xFF);        // valore per quanto sopra registro     filo.trasmissione finale();     filo.iniziare la trasmissione( PWM_Module_Base_Addr);     filo.write(Pwm_Channel * 4 + 9);  // Scegli il registro PWM_Channel_0_OFF_H     filo.write((Pwm_Channel_Brightness >> 8));             // valore per quanto sopra registro     filo.trasmissione finale();     se (Pwm_Channel_Brightness < 4095)     {       Pwm_Channel_Brightness = Pwm_Channel_Brightness + Delay_Stages;       se (Pwm_Channel_Brightness > 4095) {         Pwm_Channel_Brightness = 4095;       }     } altro se ( Pwm_Channel < Num_Stages + 1)     {       Pwm_Channel_Brightness = 0;       ritardo(200);       Pwm_Channel++;     }   }
}

vuoto Down_to_Up_OFF()
{   Pwm_Channel = 0;   Pwm_Channel_Brightness = 4095;   mentre (Pwm_Channel < Num_Stages + 1)   {     Filo.beginTransmission( PWM_Module_Base_Addr);     Filo.Scrivi(Pwm_Channel * 4 + 8);   // Registro Wähle PWM_Channel_0_OFF_L     Filo.Scrivi((byte)Pwm_Channel_Brightness & 0xFF);        // Wert für o.g. Registrati     Filo.endTransmission();     Filo.beginTransmission( PWM_Module_Base_Addr);     Filo.Scrivi(Pwm_Channel * 4 + 9);  // Registro Wähle PWM_Channel_0_OFF_H     Filo.Scrivi((Pwm_Channel_Brightness >> 8));             // Wert für o.g. Registrati     Filo.endTransmission();     Se (Pwm_Channel_Brightness > 0)     {       Pwm_Channel_Brightness = Pwm_Channel_Brightness - Delay_Stages;       Se (Pwm_Channel_Brightness < 0) {         Pwm_Channel_Brightness = 0;       }     } altro Se ( Pwm_Channel < Num_Stages + 1)     {       Pwm_Channel_Brightness = 4095;       ritardo(200);       Pwm_Channel++;     }   }
}

vuoto ciclo continuo() {   Se ((Motion_Trigger_Down_to_Up) e !(In ritardo))   {     Seconds24 = 0;     In ritardo = vero;     Down_to_Up_ON();     Motion_Trigger_Down_to_Up = falso;   }   Se ((In ritardo) e  (Seconds24 > Delay_ON_to_OFF))   {     Motion_Trigger_Down_to_Up = falso;     In ritardo = falso;     Down_to_Up_OFF();   }
}

 

 

Ich wünsche viel Spaß beim Nachbauen diees Projektes und bis zum nächsten Teil.

 

 

 

 

Für arduinoProjekte für anfängerSensoren

13 Kommentare

Helmut Tack

Helmut Tack

Zunächst, tolles Projekt. Ich habe mich schon an einem Projekt eines anderen Entwicklers heran getraut, aber die von ihm implementierte 220V Abschaltung mit Relais funktioniert nicht wirklich. Irgendwas am Quellcode ist da im Argen. Hilfe, wie so oft, der Fehler sitz vor der Tastatur. Da ich nicht gerne in anderen Codes herumkrame, habe ich mit Freuden dieses Projekt gefunden.
1. Frage : Brauch ich für 10 SDufen 10 PCA9685 16 Kanal 12 Bit PWM Driver oder nur einen?
2. Frage : Kann der Code um eine 220V Stromabschaltung per Relais erweitert werden. Wäre der Sicherheits- un d Umweltgedanke.
Ich werde das Projekt mal umsetzen und sehen, ob ich wieder (wie beim Mitbewerber) die Materialien und die Zeit in die “Tonne kloppe”
Das Projekt ist für einen lieben Menschen gedacht, dessen sehfähigkeit im Dunkeln gleich Null ist. Damit er noch lange sein Schlafzimmer im Obergeschoss des Hauses nutzen kann, will ich eine soche LED Beleuctung implementieren.
Liebe Grüße und schon mal danke für die Antwort, gerne auch per Mail.

Tobias

Tobias

Ich kann Wolfgang nur zustimmen. Bitte beachtet im eigenen Interesse alle Sicherheitsbestimmungen, VDE Bestimmungen, im Text genannte Hinweise und natürlich auf eine sichere und saubere Verlegung der Kabel.

Tobias

Tobias

Ich kann Wolfgang nur zustimmen. Bitte beachtet im eigenen Interesse alle Sicherheitsbestimmungen, VDE Bestimmungen, im Text genannte Hinweise und natürlich auf eine sichere und saubere Verlegung der Kabel.

Wolfgang

Wolfgang

Die Idee finde ich toll und ein Anstoß für das Zusammenwirken von Komponenten (auch für andere Projekte.
Aber:
Das Zusammenwirken von Steuerungen mit Lichtstrom (Netzstrom) ist eine echte Herausforderung, weil in unserer technischen Welt alles diesbezüglich mit Sicherheitsvorschriften geregelt ist, deren Nichtbeachtung fatale Folgen haben kann. In diesem Falle trifft die VDE für Kleinspannungen zu. Damit meine ich nicht die ARDUINO Steuerung sondern die Leistungssteuerung. Deswegen unterstütze ich die Kommentare meiner Vorgänger, die Beleuchtung auf LED im Kleinleistungsbereich (<5W) gegenüber X* max ca.100W vorschlagen. Abgesehen von der Wärmeentwicklung. Bei allen Projekten sollte auch die “Klimaverträglichkeit” mitspielen. Etwas, woran sich die “Maker-Szene” heran tasten sollte.

In einigen Kommentaren war die Aktivierung mit Lichtempfindlichkeit angesprochen: Die PIR Module haben 2 Einstellungen: Pulslänge bei Aktivierung und Umgebungshelligkeit.

Im Rettungsdienst sind wir immer wieder mit Verunglückten konfrontiert, die auf Treppen stürzen. Kabel sind nicht selten dabei ein Grund. Bitte, im eigenen Interesse, wenige Kabel und sichere Verlegung, gerade bei Stiegen und Treppen!

Udo Schulz

Udo Schulz

Es wäre schön, wenn die Lampen , wenn man oben an der Treppe ist, von oben nach unten angehen und wenn man unten ist, von unten nach oben angehen und entsprechend auch ausgehen.

Tobias

Tobias

vielen Dank für die ganze positive Rückmeldung ! Das Projekt kann ganz einfach auch mit LED Streifen ohne Änderung der Schaltung oder des Codes verwendet werden. Einfach an den Ausgang ein LED Streifen hängen, das wars..

Tim

Tim

Hallo
Ich bekomme nur Fehlermeldungen beim Kompilieren.
Arduino: 1.8.10 (Windows 10), Board: “Arduino Nano, ATmega328P”

treppenlicht1:58:16: error: expected primary-expression before ‘,’ token

pinMode(OE_Pin8, OUTPUT); ^

treppenlicht1:59:21: error: expected primary-expression before ‘,’ token

digitalWrite(OE_Pin8, HIGH); // Active LOW-Ausgangsaktivierungs-Pin (OE). ^

C:\Users\frogg\Documents\Arduino\treppenlicht1\treppenlicht1.ino: In function ‘void Init_PWM_Outputs(byte)’:

treppenlicht1:81:21: error: expected primary-expression before ‘,’ token

digitalWrite(OE_Pin8, HIGH); // Active LOW-Ausgangsaktivierungs-Pin (OE). ^

treppenlicht1:101:21: error: expected primary-expression before ‘,’ token

digitalWrite(OE_Pin8, LOW); // Active LOW-Ausgangsaktivierungs-Pin (OE). ^

C:\Users\frogg\Documents\Arduino\treppenlicht1\treppenlicht1.ino: In function ‘void Down_to_Up_ON()’:

treppenlicht1:128:22: error: ‘Num_Stages’ was not declared in this scope

while (Pwm_Channel < Num_Stages + 1) ^~~~~~~~~~

C:\Users\frogg\Documents\Arduino\treppenlicht1\treppenlicht1.ino:128:22: note: suggested alternative: ‘Num_Stages15’

while (Pwm_Channel < Num_Stages + 1) ^~~~~~~~~~ Num_Stages15

treppenlicht1:140:51: error: ‘Delay_Stages’ was not declared in this scope

Pwm_Channel_Brightness = Pwm_Channel_Brightness + Delay_Stages; ^~~~~~~~~~~~

C:\Users\frogg\Documents\Arduino\treppenlicht1\treppenlicht1.ino:140:51: note: suggested alternative: ‘Delay_Stages10’

Pwm_Channel_Brightness = Pwm_Channel_Brightness + Delay_Stages; ^~~~~~~~~~~~ Delay_Stages10

C:\Users\frogg\Documents\Arduino\treppenlicht1\treppenlicht1.ino: In function ‘void Down_to_Up_OFF()’:

treppenlicht1:158:22: error: ‘Num_Stages’ was not declared in this scope

while (Pwm_Channel < Num_Stages + 1) ^~~~~~~~~~

C:\Users\frogg\Documents\Arduino\treppenlicht1\treppenlicht1.ino:158:22: note: suggested alternative: ‘Num_Stages15’

while (Pwm_Channel < Num_Stages + 1) ^~~~~~~~~~ Num_Stages15

treppenlicht1:170:51: error: ‘Delay_Stages’ was not declared in this scope

Pwm_Channel_Brightness = Pwm_Channel_Brightness – Delay_Stages; ^~~~~~~~~~~~

C:\Users\frogg\Documents\Arduino\treppenlicht1\treppenlicht1.ino:170:51: note: suggested alternative: ‘Delay_Stages10’

Pwm_Channel_Brightness = Pwm_Channel_Brightness – Delay_Stages; ^~~~~~~~~~~~ Delay_Stages10

C:\Users\frogg\Documents\Arduino\treppenlicht1\treppenlicht1.ino: In function ‘void loop()’:

treppenlicht1:192:32: error: ‘Delay_ON_to_OFF’ was not declared in this scope

if ((On_Delay) and(Seconds24 > Delay_ON_to_OFF)) ^~~~~~~~~~~~~~~

C:\Users\frogg\Documents\Arduino\treppenlicht1\treppenlicht1.ino:192:32: note: suggested alternative: ‘Delay_ON_to_OFF30’

if ((On_Delay) and(Seconds24 > Delay_ON_to_OFF)) ^~~~~~~~~~~~~~~ Delay_ON_to_OFF30

Mehrere Bibliotheken wurden für “Wire.h” gefunden
Benutzt:
expected primary-expression before ‘,’ token

Diddi

Diddi

Das Projekt finde ich sehr gelungen, aber es fehlt noch ein Lichtsensor um bei Tageslicht nicht unnötig Strom zu verbrauchen.
Ein Kombisensor wäre die ideale Ergänzung.

Andreas

Andreas

Ich kann Mustafa Sari nur zustimmen, eine Umsetzung mit LED wäre super.

HJThom

HJThom

Hallo zusammen, ich finde das Thema auch total spannend. Direkt habe ich mir den Aufbau mal angeschaut und stellte mir wie Mustafa die Frage, warum das Geraffel wenn man das Ganze auch mitWS2812B realisieren kann? Die Möglichkeiten sind hier vielfältiger. Die HC-SR501 sind mir persönlich zu großflächig und somit ungenau aber das ist je nach Anwendung verschieden, ich würde auf eine Lichtschranke setzten. Ich verfolge das Thema mal weiter.

Danke und Gruß
HJThom

Dirk

Dirk

ein toller Sketch den ich ähnlich auch bei YouTube gesehen habe. Was mir fehlt sind ein paar Erklärungen um den Sketch nachvollziehen zu können. Ich werde es auf jeden Fall bauen uns ausprobieren.

Stephan Strittmatter

Stephan Strittmatter

Tolles Projekt! Ich kann mich da nur anschließen: ich fände eine Variante mit LED-Streifen auch super finden!
Ich bin gespannt.

Mustafa sari

Mustafa sari

Hi es wäre super, wenn ihr die Beleuchtung mal mit dem LED Streifen umsetzt.
Ich hatte schon lange überlegt ein Lauflicht pro Stufe zu realisieren und ich glaube das würde den meisten auch gefallen.
Über das PWM kann man die einzelnen Stufen dann nach und nach immer heller werden lassen.

Einen Kommentar hinterlassen

Alle Kommentare werden vor der Veröffentlichung moderiert

Post di blog consigliati

  1. Installa ESP32 ora dal gestore del consiglio di amministrazione
  2. Lüftersteuerung Raspberry Pi
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1
  4. ESP32 - das Multitalent
  5. OTA - Over the Air - Programmazione ESP tramite WLAN

Prodotti consigliati