Elegancia de las escaleras automáticas.

En la primera Parte de un nuevo y emocionante Serie una elegante automática de la iluminación de escaleras hasta un máximo de 16 Niveles, en la que cada Peldaño en la Escalera de forma sucesiva como una Secuencia que se ilumina cuando uno de los dos Infrarrojo, cada uno en la parte superior y el Extremo inferior de la Escalera colocada en un Movimiento de informar. Además, cada Escalera, todavía suavemente por PWM, Control de Brillo máximo hochgedimmt y, más tarde, hasta que se apagan heruntergedimmt. Los Periodos de tiempo en la Escalera permanece encendido, o un Nivel encima o herabdimmt está libre en el Sketch a su Voluntad ajustable. Una Solución de este tipo ya han sido comercialmente (aquí en el Vídeo en Funcionamiento).

Hoy os muestro cómo hacer una en la Función de Control similar mediante el Arduinos y de algunos de los Componentes externos, incluso se puede construir.

 

Necesitamos para nuestros do-it-yourself iluminación de escaleras siguiente Electrónica de las Partes:

 

Número

Descripción

Nota

2

PIR Módulo HC-SR501 PIR

Sensor de movimiento

1

PCA9685 16 de Canal 12 Bit PWM Driver

 

1

Nano V3

 

1

MB102 Adaptador de fuente de Alimentación

Para Breadboardaufbau

hasta 16

IRF520 MOS Driver Módulo 0-24V 5A

Número Treppenzahl

1

fuente de Alimentación para LED/Lámparas para los Niveles

Máximo de 24 Voltios

 

En el siguiente Diagrama es la Kernsteuerung ver. De manera ejemplar, sin embargo, son sólo 2 Treiberstufen máxima de 16 Treiberstufen ver. Si más Treiberstufen necesita, ser, mutatis mutandis, al igual que los dos trazados conectado. A tener en cuenta es necesariamente una sicherheitsgerechte Uso de Cables de alimentación y Cables , así como una suficiente dimensioniertes fuente de Alimentación. La fuente de Alimentación debe Sobrecarga protegido y todos Treppenstufenlichter y el Arduino con la Cc se puede alimentar sin sobrecargar demasiado! Existe riesgo de Incendio si no incorrecta Instalación y/o Funcionamiento.

 

Vamos a construir el Circuito para que nuestra Escalera de la siguiente manera en una placa de pruebas para probar:

 

montaje en el Tablero

 

Im el siguiente Paso, vamos a ajustar el código Fuente del Arduinos a sus propias Necesidades. Son interesantes las siguientes 3 Líneas de Código:

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

 

Num_Stages

Define el Número de iluminar las Escaleras (un máximo de 16, de 0 anzählend, para empezar. Valor máximo: 15)

Delay_Stages

Fade Período de tiempo para cada Escalón de la escalera -> cuanto más pequeño sea el Valor, mayor será el Período de tiempo, más lento.

Delay_ON_to_OFF

Período de tiempo la pasa haciendo la Escalera en el Estado "a" permanece.

 

Después de que los valores de los Gustos de adaptar tengo, el Código en el Arduino cargar :

 

 

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

#define PWM_Module_Base_Addr 0x40 //10000000b El último Bit de la Bytes define la Operación que desee realizar. En caso de Ajuste de nivel lógico 1 0x41 Módulo 2
//se una operación de Lectura selecciona, mientras que un 0 lógico de Escritura selecciona.
#define OE_Pin  8           // Pin de salida (Output Enable
#define PIRA_Pin 2
#define PIRB_Pin 3

#define Num_Stages  15
#define Delay_Stages  10
#define Delay_ON_to_OFF  30  // Mínimo Delay_ON_to_OFF en Segundos

bytes Pwm_Channel = 0;
int Pwm_Channel_Brightness = 0;

bool Motion_Trigger_Down_to_Up = false;
bool On_Delay = false;

// interrupción de 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 desencadenar   }
}

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

void Init_PWM_Module(byte PWM_ModuleAddr)
{   pinMode(OE_Pin, SALIDA);   digitalWrite(OE_Pin, ALTO); // Pin de activación de salida BAJA activa (OE).   Alambre.beginTransmission(PWM_ModuleAddr); // Iniciar transferencia de datos   Alambre.escribir(0x01);                       // Seleccione el registro del modo 2 (registro de comandos)   Alambre.escribir(0x04);                       // Configurar chip: 0x04: salida de tótem 0x00: salida de drenaje abierto.   Alambre.endTransmission();                 // Detener comunicación - enviar bit de parada   Alambre.beginTransmission(PWM_ModuleAddr); // Iniciar transferencia de datos   Alambre.escribir(0x00);                      // Seleccione el registro del modo 1 (registro de comandos)   Alambre.escribir(0x10);                      // Configurar SleepMode   Alambre.endTransmission();                // Detener comunicación - enviar bit de parada   Alambre.beginTransmission(PWM_ModuleAddr); // Iniciar transferencia de datos   Alambre.escribir(0xFE);                       // Elija el registro PRE_SCALE (registro de comando)   Alambre.escribir(0x03);                       // Establecer preescalador. La frecuencia PWM máxima es 1526 Hz si el Regulador PRE_SCALEer está configurado en "0x03h". Estándar: 200 Hz   Alambre.endTransmission();                 // Detener comunicación - enviar bit de parada   Alambre.beginTransmission(PWM_ModuleAddr); // Iniciar transferencia de datos   Alambre.escribir(0x00);                       // Seleccione el registro del modo 1 (registro de comandos)   Alambre.escribir(0xA1);                       // Configurar Chip: Permitir todas las direcciones I2C de llamada, usar reloj interno, // Permitir función de incremento automático   Alambre.endTransmission();                 // Detener comunicación - enviar bit de parada
}


nulo Init_PWM_Outputs(byte PWM_ModuleAddr)
{   digitalWrite(OE_Pin, ALTO); // Pin de activación de salida BAJA activa (OE).   para ( int p. = 0; p. < 16 + 1; p.++)   {     Alambre.beginTransmission(PWM_ModuleAddr);     Alambre.escribir(p. * 4 + 6);      // Elija el registro PWM_Channel_ON_L     Alambre.escribir(0x00);                     // valor para lo anterior Registrarse     Alambre.endTransmission();     Alambre.beginTransmission(PWM_ModuleAddr);     Alambre.escribir(p. * 4 + 7);      // Elija el registro PWM_Channel_ON_H     Alambre.escribir(0x00);                     // valor para lo anterior Registrarse     Alambre.endTransmission();     Alambre.beginTransmission(PWM_ModuleAddr);     Alambre.escribir(p. * 4 + 8);   // Elija el registro PWM_Channel_OFF_L     Alambre.escribir(0x00);        // valor para lo anterior Registrarse     Alambre.endTransmission();     Alambre.beginTransmission(PWM_ModuleAddr);     Alambre.escribir(p. * 4 + 9);  // Elija el registro PWM_Channel_OFF_H     Alambre.escribir(0x00);             // valor para lo anterior Registrarse     Alambre.endTransmission();   }   digitalWrite(OE_Pin, BAJA); // Pin de activación de salida BAJA activa (OE).
}

nulo configuración()
{   // inicialización   pinMode(PIRA_Pin, ENTRADA);   pinMode(PIRB_Pin, ENTRADA);   De serie.comenzar(9600);   Alambre.comenzar(); // Inicializa el bus I2C A4 (SDA), A5 (SCL)   Init_PWM_Module(PWM_Module_Base_Addr);   Init_PWM_Outputs(PWM_Module_Base_Addr);   noInterrupts();   adjuntarInterrumpir(0, ISR_PIR_A, CAMBIO);   adjuntarInterrumpir(1, ISR_PIR_B, CAMBIO);   TCCR1A = 0x00;   TCCR1B = 0x02;   TCNT1 = 0;      // inicializa el registro con 0   OCR1A =  33353;      // preasignar salida comparar registro   TIMSK1 |= (1 << OCIE1A);  // Activar temporizador comparar interrupción   interrumpe();
}

nulo Down_to_Up_ON()
{   Pwm_Channel = 0;   Pwm_Channel_Brightness = 0;   mientras que (Pwm_Channel < Num_Stage + 1)   {     Alambre.beginTransmission( PWM_Module_Base_Addr);     Alambre.escribir(Pwm_Channel * 4 + 8);   // Elija el registro PWM_Channel_0_OFF_L     Alambre.escribir((byte)Pwm_Channel_Brightness & 0xFF);        // valor para lo anterior Registrarse     Alambre.endTransmission();     Alambre.beginTransmission( PWM_Module_Base_Addr);     Alambre.escribir(Pwm_Channel * 4 + 9);  // Elija el registro PWM_Channel_0_OFF_H     Alambre.escribir((Pwm_Channel_Brightness >> 8));             // valor para lo anterior Registrarse     Alambre.endTransmission();     si (Pwm_Channel_Brightness < 4095)     {       Pwm_Channel_Brightness = Pwm_Channel_Brightness + Delay_Stage;       si (Pwm_Channel_Brightness > 4095) {         Pwm_Channel_Brightness = 4095;       }     } otra cosa si ( Pwm_Channel < Num_Stage + 1)     {       Pwm_Channel_Brightness = 0;       retrasar(200);       Pwm_Channel++;     }   }
}

nulo Down_to_Up_OFF()
{   Pwm_Channel = 0;   Pwm_Channel_Brightness = 4095;   mientras (Pwm_Channel < Num_Stage + 1)   {     Cable.beginTransmission( PWM_Module_Base_Addr);     Cable.escribir(Pwm_Channel * 4 + 8);   // Wähle PWM_Channel_0_OFF_L registrarse     Cable.escribir((byte)Pwm_Channel_Brightness & 0xFF);        // Wert für o.g. Registrarse     Cable.endTransmission();     Cable.beginTransmission( PWM_Module_Base_Addr);     Cable.escribir(Pwm_Channel * 4 + 9);  // Registro Wähle PWM_Channel_0_OFF_H     Cable.escribir((Pwm_Channel_Brightness >> 8));             // Wert für o.g. Registrarse     Cable.endTransmission();     Si (Pwm_Channel_Brightness > 0)     {       Pwm_Channel_Brightness = Pwm_Channel_Brightness - Delay_Stage;       Si (Pwm_Channel_Brightness < 0) {         Pwm_Channel_Brightness = 0;       }     } más Si ( Pwm_Channel < Num_Stage + 1)     {       Pwm_Channel_Brightness = 4095;       retrasar(200);       Pwm_Channel++;     }   }
}

vacío lazo() {   Si ((Motion_Trigger_Down_to_Up) y !(Con retraso))   {     Segundos24 = 0;     Con retraso = cierto;     Down_to_Up_ON();     Motion_Trigger_Down_to_Up = falso;   }   Si ((Con retraso) y  (Segundos24 > Delay_ON_to_OFF))   {     Motion_Trigger_Down_to_Up = falso;     Con retraso = falso;     Down_to_Up_OFF();   }
}

 

 

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

 

 

 

 

Para arduinoProyectos para principiantesSensores

15 comentarios

Andreas Wolter

Andreas Wolter

@Tony: RGB LEDs (die adressierbaren Neopixel mal ausgenommen) sind im Grunde drei LEDs mit verschiedenen Farben. Als erstes würde ich versuchen, statt zwei einfarbige LEDs drei farbige LEDs anzuschließen. Im Code müsste man dann die Helligkeit der drei Kanäle per Offset einstellen, um die gewünschte Farbe zu erhalten.

Tony

Tony

Moin, cooles Projekt, aber bekomme ich es mit RGBs umgesetzt? VG Tony

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.

Deja un comentario

Todos los comentarios son moderados antes de ser publicados

Artículos de blog

  1. Ahora instalamos el esp32 a través de la administración.
  2. Lüftersteuerung Raspberry Pi
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1
  4. ESP32 - das Multitalent
  5. Transporte Aéreo - programación de ESP mediante redes locales inalámbricas