Dimmbare LED Beleuchtung mit Arduino und IR Fernbedienung Modul
Vorgeschichte
Für ein Diorama Projekt benötigte ich mehrere kleine LED Bänder zur Ausleuchtung. Diese sollten zur Darstellung verschiedener Tagesabläufe bzw. diverser Wetterszenarien in der Helligkeit gedimmt werden können. Eine Fernbedienung dieser Einstellungen und in Zukunft das Schalten anderer Funktionen sollte ermöglicht werden. Meine Wahl zur Realisierung der Wünsche fiel, wie so oft, auf einen Arduino Nano mit einer selbst geschrieben Software.
Materialliste
Für dieses Vorhaben benötigte ich nicht sehr viel, da hatte ich sogar noch etwas in der „Bastelkiste“ herum liegen.
Arduino Nano mit Schraubklemmen Adapter
Technische Daten:
Microcontroller: ATmega328
Flash Speicher: 32 KB
SRAM: 2 KB
EEPROM: 1 KB
Taktrate: 16 MHz
I/O-Pins: 14
Anschluss: Mini-USB
LEDs: RXD, TXD, Power, Pin 13,
Größe: ca. 1,85 cm x 4,3 cm
Betriebsspannung: 5 V
Empfohlene Eingangsspannung: 7-12 V
IR Fernbedienung und Empfänger Kit / Modul
Sensor IR Empfänger HX1838
Betriebsspannung: 5V
Ausgang: Digital
VCC: 3,3V – 5V
GND: externer GND
IN: externer Mikrocontroller I/O port, I/O-port pull-up Widerstand auf Platine
Empfangsabstand: 5-8 meter
Kit:
IR Fernbedienung
HX1838 Empfängermodul
3Pin Anschlussleitung
Motor Treiber Modul mit LN298N
Doppelte H-Brücke
Chip: L298N
Logik Spannung: 5V
Treiber Spannung: 5V-35V
Logik Strom: 0mA-36mA
Treiber Strom: 2A (MAX single bridge)
Maximale Leistung: 25W
Diesen Motortreiber mit dem Leistungsteil verwendete ich zum Dimmen, da dieser unkompliziert über die Software angesteuert werden konnte. Dazu wird einfach über den Enable Eingang ein analoger Wert zwischen 0 und 255 vom Arduino übertragen.
Montage im Diorama
Die Bauelemente wurden mit Heißkleber auf dem Dioramaboden befestigt. Das hält im Normalfall sehr fest, ermöglicht aber auch wieder die Demontage. Die LED Streifen wurden in einzelne Segmente in der richtigen Länge unterteilt und mittels PIN Verbindern angeschlossen. Diese ermöglichen eine einfache Montage ohne Löten. Für die Leitungsverbindungen wurden Mehrfachverbinder und klassische Verbindungsklemmen von WAGO benutzt.
Schaltplan für den Arduino Nano
Der Schaltplan ist recht einfach. Im folgenden Bild können die Verbindungen verfolgt werden.
Arduino Testprogramm
Nach der Installation erfolgte die Programmierung des Arduino, um erst einmal diverse Sachen auszuprobieren.
Zuerst musste ich die Codes der Infrarot Fernbedienung herausbekommen. Dazu wurde ein kleiner Sketch mit Hilfe IRremote (GitHub) geschrieben und auf den Arduino übertragen. Mit dem seriellen Monitor konnten die ausgelesenen Fernbedineungscodes auf dem PC-Monitor angezeigt werden.
Den Sketch dazu gibt es hier:
/**
* @file IRremote.hpp
*
* @brief Public API to the library.
*
* @code
* !!! All the macro values defined here can be overwritten with values, !!!
* !!! the user defines in its source code BEFORE the #include <IRremote.hpp> !!!
* @endcode
*
* This file is part of Arduino-IRremote https://github.com/Arduino-IRremote/Arduino-IRremote.
*
************************************************************************************
* MIT License
*
* Copyright (c) 2015-2023 Ken Shirriff http://www.righto.com, Rafi Khan, Armin Joachimsmeyer
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is furnished
* to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
* CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
************************************************************************************
*
* For Ken Shiriffs original blog entry, see http://www.righto.com/2009/08/multi-protocol-infrared-remote-library.html
* Initially influenced by:
* http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1210243556
* and http://zovirl.com/2008/11/12/building-a-universal-remote-with-an-arduino/
*/
#include <IRremote.hpp>
#define IR_RECEIVE_PIN 2
void setup() {
Serial.begin(9600);
IrReceiver.begin(IR_RECEIVE_PIN);
}
void loop() {
if (IrReceiver.decode()) {
delay(50);
IrReceiver.resume();
int command = IrReceiver.decodedIRData.command;
Serial.print("Dezimalwert: ");
Serial.print(" -> ");
Serial.println(IrReceiver.decodedIRData.command);
}
}
Der Sketch zum Dimmen der LEDs mit der Fernbedienung
Nachdem nun geklärt welcher IR Code zu welcher Taste auf der Fernbedienung passt, konnte das eigentliche Programm geschrieben werden.
Auf der Fernbedienung werden die Tasten + und – zum Einstellen der Helligkeit verwendet und die Taste 0 zum Ausschalten. Die Codes dafür waren bei mir die 21 für +, die 7 für – und 22 für 0. Demzufolge mussten mit Hilfe einer switch-Anweisung nur diese Codes abgefragt werden, um entsprechend den Analogwert für für den Ausgang zum Treiberbaustein festzulegen.
#include <IRremote.hpp>
const int Bel = 6;
const int BIn = 5;
int BStatus = 125;
#define IR_RECEIVE_PIN 2
void setup() {
pinMode(Bel, OUTPUT);
pinMode(BIn, OUTPUT);
Serial.begin(9600);
IrReceiver.begin(IR_RECEIVE_PIN);
digitalWrite(Bel, HIGH);
analogWrite(BIn, BStatus);
}
void loop() {
if (IrReceiver.decode()) {
delay(50);
IrReceiver.resume();
int command = IrReceiver.decodedIRData.command;
switch (command) {
case 21: {
BStatus = BStatus + 10;
if (BStatus > 220){ BStatus = 220;}
digitalWrite(Bel, HIGH);
analogWrite(BIn, BStatus);
break;
}
case 7: {
BStatus = BStatus - 10;
if (BStatus < 1){ BStatus = 1;}
digitalWrite(Bel, HIGH);
analogWrite(BIn, BStatus);
break;
}
case 22: {
digitalWrite(Bel, LOW);
break;
}
}
}
}
Das Aktivieren des Enable Eingangs des Treibermoduls erfolgt über die Variable Bel, welche am PIN D6 angeschlossen wurde und auf HIGH steht. Über den Ausgangspin D5 (BIn) erfolgt die Ausgabe des analogen Wertes der Variable BStatus, welche für die Helligkeit der LEDs zuständig ist. Für das vollständige Abschalten setze ich die Variable Bel auf LOW.
Damit funktionert das Dimmen der LED Bänder einwandfrei. Die Abstufungen (BStatus) zwischen den einzelnen Helligkeitsstufen habe ich für mich auf den Wert 10 festgelegt.
Hallo Sven
Ich finde die Idee mit einer Fernbedienung von LED gut, aber bei Deinem Programm erhalte ich die Fehlermeldung beim Prüfen des Programms an der Zeile 29:
exit status 1, assignment of read-only varible ´BStatus´
Leider kenn ich mich da nicht so richtig aus, kannst du mir da vielleicht bitte helfen?
Z.Zt. habe ich den Uno und den Ir Sensor, ich weiß auch dien Tasten Code von den einzelnen Tasten.
Die H-Brücke habe ich bestellt.
Wollte mein Wohnzimmer renovieren, dabei wollte ich die LED Beleuchtung Dimmbar machen. Auf 12V basis.
Habe keine Webseite, wie unten zum eintragen
Hallo Wilfried,
Wie das so ist beim „Schönmachen“ des Codes fürs Internet hat sich der Fehlerteufel eingeschlichen.
In Zeile 4 muss es richtig heißen: „int BStatus = 125;“. Das const davor war zuviel.
Danke für das Feedback.
Bitte beachte, dass das Treibermodul pro Kanal nur 2A Strom verträgt. Nicht, dass du das überlastest.