Hallo,
hat mal jemand einen Beispiel Code für mich um per Arduino (Uno), zusammen mit dem Zeit Modul eine LED je nach Uhrzeit auf und ab zu dimmen?
Danköööö
Lars
Leider bist Du nicht angemeldet und kannst daher dieses Forum nur eingeschränkt benutzen. Möchtest Du die volle Vielfalt unserer Community erleben, so registriere Dich jetzt kostenlos & unverbindlich oder melde dich mit Deinen Benutzerdaten an.
Hallo,
hat mal jemand einen Beispiel Code für mich um per Arduino (Uno), zusammen mit dem Zeit Modul eine LED je nach Uhrzeit auf und ab zu dimmen?
Danköööö
Lars
Sorry aber verstehe ich nicht.
Hallo Lars,
auf der Seite gibt es einen Link für die Firmware, in der auch die .ino Dateien sind, wo der Klartext des Arduino-Programmcodes zu sehen ist. Dort kannst Du Dich bedienen. Schwierig wird es dann, wenn Du keine Kenntnisse in der Arduino-Programmierung hast, dann wird der Weg zum Ziel sehr weit.
Marco (Vanles) hat auch den Code von seiner Implementation veröffentlicht, diese ist etwas schlichter als der Storm-X Controller und ein guter Anfang. Bei seinem Platinen-Layout kann man auch direkt mit der Fritzing-Software sehen, wie die Komponenten verlötet sind.
Gruß
Sandy
Hi Lars,
Wirklich wild ist das nicht.hast du dir die IDE mal installiert?
Da gibt es Basis Sketche. Zum einen für die ds1307 und dann auch einfache fade Sketche.
Ein wenig beschäftigen damit würde ich die schon raten, sonst wird das nix.
Im arduino Forum wird auch Super geholfen.
Wenn du schon eine erste Version gebastelt hast poste sie mal hier, schau mit die gerne an und helfe dir weiter, bis das Ding dann steht.
Glaub mir wenn ich die meinen Sketch schicke bringt dir das nix, andere lineares, andere Komponenten etc...
BG thorsten
Sent from my iPhone using Tapatalk
Nabend,
auf der Seite gibt es einen Link für die Firmware, in der auch die .ino Dateien sind, wo der Klartext des Arduino-Programmcodes zu sehen ist. Dort kannst Du Dich bedienen. Schwierig wird es dann, wenn Du keine Kenntnisse in der Arduino-Programmierung hast, dann wird der Weg zum Ziel sehr weit.
Ich hab mir die Firmware mal angesehen. Ich habe zwar schon in diversen Sprachen Programmiert (und sogar mal eine Handy-App veröffentlicht) aber halt immer Just For Fun und noch nie für Arduino. Von daher war mir die Firmware erstmal etwas zu komplex
Wirklich wild ist das nicht.hast du dir die IDE mal installiert?
Da gibt es Basis Sketche. Zum einen für die ds1307 und dann auch einfache fade Sketche.
Jup, IDE ist drauf und ein erster Test mit der OnBoard LED läuft.
Wenn du schon eine erste Version gebastelt hast poste sie mal hier, schau mit die gerne an und helfe dir weiter, bis das Ding dann steht.
Glaub mir wenn ich die meinen Sketch schicke bringt dir das nix, andere lineares, andere Komponenten etc...
´Danke für das Angebot. Das mit dem reinen Dimmen bekomme ich sicher hin. Mich interessiert vor allem eine Routine die z.B. um 8 Uhr morgens über eine eine Stunde auf dimmt. Da das ganze ja immer in einem Dauerloop des Processors ausgeführt wird bin ich mir noch nicht ganz im klaren wie ich das am besten realisieren soll.
Gruß
Lars
grundprinzip:
eine funktion die einen kanal mit übergabewert auf einen DIMwert setzt
void PWM_set( unsigned char led , unsigned int value )
// led ist eine variable die den canal bestimmt ...
// value der wert der aktuell gesetzt werden soll
dann einen timer der zB 1x die sekunde aufgerufen wird
( viele nutzen hier die RTC in dem mainloop )
hier überprüfst du ob :
1: die startzeit erreicht ist
2:UND ob der aktuelle wert dem zielwert entspricht (
solange dieser nicht erreicht ist erhöhst du diesen wert wert++;
damit bei jedem timerdurchlauf wird die PWM neu gesetzt wird ( mit obiger funktion ) bis der wert erreicht ist
damit leuctet die LED langsam heller
wenn du die zeit bestimmen willst von 8uhr bis 9uhr sonnenaufgang . dann musst du die zeit rausrechnen und entweder
1: timer schneller laufen lassen für diesen kanal
2: den stritt ausrechnen den man je drchlauf raufrechnet
das ist das raufdimmen ..
runterdimmen ist das gleiche nur mit rückwärtszählen
Pro kanal brauchst du nun ein paar parameter
startzeit - helligkeit - stopzeit
für tagesverläufe musst du weiter parameter hinzufügen
die überprüfung ist dann genau so .. nur das du dir noch merken musst wo du gerade bist
In einem anderen Thread habe ich gelesen das die KSQ nur 2.5 Volt am PWW Eingang verträgt, der Arduino aber 5 Volt raus bläst.. zum Glück noch rechtzeitig gesehen. .sonst wäre der erst mal im Eimer
Hi,
welche KSQ nutzt du denn?
Hier mal ganz kurz und knapp mein ANsatz:
Zunächst habe ich Beleuchtungsarrays definiert (nur ein Ausschnitt, eine Zeile je PWM out:
// 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23
const int lightArray[16] [24] = { { 4095, 4095, 4095, 4095, 4095, 4095, 4095, 3500, 2500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3500, 4095, 4095, 4095 },
In der Loop frage ich regelmäßih Uhrzeit und PWM values ab
void loop()
{
getTime(); // die entsprechende FUnktion ist relativ ähnlich wie aus den Beispielsketches, hier nicht aufgeführt
getLight();
setLight();
PWM value wird für jeden der 16 Kanäle (bei mir) berechnet
void getLight() {
for (int i=0; i<16; i++) {
if (hour<23) valueLight[i] = fadeLight(mins, sec, lightArray[i][hour+1], lightArray[i][hour]);
else if (hour==23) valueLight[i] = fadeLight(mins, sec, lightArray[i][0], lightArray[i][hour]);
}}
int fadeLight(int minute, int sekunde, const int PWMvalueSoon, const int PWMvalueNow) {
float bruch = (float)3600 / (PWMvalueSoon - PWMvalueNow);
int result;
result = PWMvalueNow + ((3600 - (3600 - ((minute * 60) + (sekunde * 1)))) / bruch);
return result;
}
Alles anzeigen
Und dann wird der Wert gesetzt
Ist ein alter COde von mir, habe gerade keinen aktuelleren hier, sollte aber vom Ansatz her helfen
BG
//EDIT
nicht wundern, der TLC arbeitet mit 12Bit, daher Werte bis 4095.
Zudem musste ich Aufbau bedingt die Werte invertieren, d.h. PWM=0 entspricht hier 100%.
Ist aber irrelevant für den Ablauf.
ich bin fast fertig (hoffe ich).
Ich muss noch den PWM anschließen und den Wert setzen:
// SC270 LED Steuerung
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;
void setup () {
// RTC Setup
Serial.begin(57600);
Wire.begin();
RTC.begin();
if (! RTC.isrunning()) {
Serial.println("RTC is NOT running!");
// following line sets the RTC to the date & time this sketch was compiled
RTC.adjust(DateTime(__DATE__, __TIME__));
}
}
int DayStart = 12;
int DimLength = 60;
int NightStart = 21;
int NightPower= 1;
int DayPower = 100;
int CurrentPower;
int ledPin = 9;
void Set_Led (int fadeValue)
{
fadeValue = 255 * fadeValue / 100;
Serial.print (fadeValue);
Serial.print (" / ");
}
void check_time (int CurrentHour, int CurrentMinute) {
if (CurrentHour < DayStart)
{
Serial.print ("LED Nachtmodus ");
if (CurrentPower != NightPower)
{
CurrentPower = NightPower;
Set_Led (CurrentPower);
}
if (CurrentHour == DayStart) {
Serial.print ("LED Hochfahren ");
CurrentPower = (DayPower * CurrentMinute / DimLength);
Set_Led (CurrentPower);
}
if (CurrentHour > DayStart)
{
if (CurrentHour == NightStart)
{
Serial.print ("LED Runterfahren ");
CurrentPower = ((100-NightPower) * (60-CurrentMinute) / DimLength);
Set_Led (CurrentPower);
}
else if (CurrentHour > NightStart)
{
Serial.print ("LED Nachtmodus ");
if (CurrentPower != NightPower)
{
CurrentPower = NightPower;
Set_Led (CurrentPower);
}
}
else
{
Serial.print ("LED Tagmodus ");
if (CurrentPower != DayPower)
{
CurrentPower = DayPower;
Set_Led (CurrentPower);
}
}
}
Serial.print (CurrentPower);
Serial.print ("%");
Serial.println();
}
void loop () {
DateTime now = RTC.now();
Serial.print ("SC70 Time: ");
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
check_time (now.hour(), now.minute());
delay(5000);
}
Alles anzeigen
Hi,
ohne großartig Deinen Code gelesen zu haben, eines vorab:
Nimm das Delay(5000) raus!!! Ist ein NoGo und hat da nix zu suchen, du stoppst damit das komplette Programm für 5 Sekunden! Was genau willst du damit bezwecken?
Ein hartes Delay wird meist nur bei Sensoren eingesetzt, dann auch nur mit wenigen ms.
Wenn du ein Delay benötigst, bitte in dieser Form:
http://playground.arduino.cc/Learning/BlinkWithoutDelayDe
BG
Thorsten
Ich hab den Delay drin weil mir gesagt worden ist das das RTC Modul es nicht verträgt so oft abgefragt zu werden.
in den Beipeilcodes sind dafür auch immer Delays drin.
Werde mal das Beispiel mit ein bauen.
BTW gibt es irgendwo einen Arduino Emulator wo ich den Code testen kann ohne den Arduino vor Ort zu haben?
Hi,
ich würde die Uhr auch nur jede Sekunde abfragen. Wenn man das nicht dürfte, könnte ja nie eine Uhr mit Sekundenanzeige gebastelt werden
Aber bitte nicht mittels Delay:
unsigned long previousMillis = 0;
void loop () {
if (millis() - previousMillis > 1000) {
DateTime now = RTC.now();
Serial.print ("SC70 Time: ");
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
check_time (now.hour(), now.minute());
previousMillis = millis();
}
}
Alles anzeigen
Hab den Code noch etwas Optimiert und das PWN Dimmen eingebaut. Morgen das Modul Anlöten und testen:
// SC270 LED Steuerung
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;
int DayStart = 12;
int DimLength = 60;
int NightStart = 21;
int NightPower= 1;
int DayPower = 100;
int CurrentPower;
int ledPin = 9;
void setup () {
pinMode(ledPin, OUTPUT);
// RTC Setup
Serial.begin(57600);
Wire.begin();
RTC.begin();
if (! RTC.isrunning()) {
Serial.println("RTC is NOT running!");
// following line sets the RTC to the date & time this sketch was compiled
RTC.adjust(DateTime(__DATE__, __TIME__));
}
}
void Set_Led (int CurrentHour, int CurrentMinute) {
if (CurrentHour < DayStart)
{
Serial.print ("LED Nachtmodus ");
CurrentPower = NightPower;
}
if (CurrentHour == DayStart) {
Serial.print ("LED Hochfahren ");
CurrentPower = (DayPower * CurrentMinute / DimLength);
}
if (CurrentHour > DayStart)
{
if (CurrentHour == NightStart)
{
Serial.print ("LED Runterfahren ");
CurrentPower = ((100-NightPower) * (60-CurrentMinute) / DimLength);
}
else if (CurrentHour > NightStart)
{
Serial.print ("LED Nachtmodus ");
CurrentPower = NightPower;
}
else
{
Serial.print ("LED Tagmodus ");
CurrentPower = DayPower;
}
}
Serial.print (CurrentPower);
Serial.print ("%");
Serial.println();
analogWrite(ledPin,(255 * CurrentPower / 100));
}
unsigned long previousMillis = 0;
void loop () {
if (millis() - previousMillis > 5000) {
DateTime now = RTC.now();
Serial.print ("SC70 Time: ");
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
Set_Led (now.hour(), now.minute());
previousMillis = millis();
}
}
Alles anzeigen
Also ich habe mir so etwas auch schon mal gebaut. Leider kann ich das RTC Modul nicht empfehlen, da der Sekunden Versatz viel zu hoch ist. Sprich jeden Tag verlierst du 30-60 Sekunden. Versuche dir lieber einen LAN Anschluss zu basteln, um die Zeit aus dem Internet zu ziehen, somit läuft die immer richtig und du musst nicht jeden Monat dein Modul neu kalibrieren, bzw. Eine Stunde nachstellen. Außerdem kann später eventuell noch mit einem Web Interface drauf zugegriffen werden. Grüße
Hoi,
ich hatte das auf einem arduino Yun laufen. pwm dimmung mittels zeit aus dem internet mit der Time library (arduino hat selbst eine uhr dann, ohne RTC). jede stunde updaten aus dem internet. auch sensor data auf ner internet seite (auch mit webcam zum fische schauen ).
habe aber jetzt eine X1 drüber, somit ist die ganze dimmschaltung entfallen und wird nurnoch jede minute die wasser und umgebungs temperatur gelogd.
bei pwm dimmung mit arduino rate ich dringend dazu die auflösung der analogen ausgänge zu erhöhen. Standard ist diese 256 punkte, und da sieht man vorallem bei niedrigen werten den helligkeitssprung der lampen sehr arg. bei 1024 ist dies viel gleichmässiger.
Auch hilft eine lineare mapping der led helligkeit, weil sonst ist 50% pwm nicht gleich 50% helligkeit der leds, und man sieht kaum dimmung bis die leds fast aus sind.
Wenn du den code noch brauchst, ich hab noch ein backup davon. kann es posten wenn ich zuhause binn.
Grüsse,
Lorenz
Auch hilft eine lineare mapping der led helligkeit, weil sonst ist 50% pwm nicht gleich 50% helligkeit der leds, und man sieht kaum dimmung bis die leds fast aus sind.
das ist aber nur für das auge so ...
die strahlungsleistung ist ja wichtig ..
und die liegt bei 50% PWM irgendwo in der nähe von 50% ...
das ist aber nur für das auge so ...
die strahlungsleistung ist ja wichtig ..
und die liegt bei 50% PWM irgendwo in der nähe von 50% ...
das kann gut sein, nur kriegt man dan den effekt das man über eine stunde verteilt runterdimmt, und das licht sich nicht verändert für 55 minuten und in den letzten 5 minuten sehr schnell aus geht. Dann kan man ja fast genausogut einfach das licht aus machen ohne dimmung.
Wie gesagt, das ist meine erfahrung und ich fand es als sehr störend zu dimmen ohne die werte anders zu mappen.
Ich hab meine Uhr nach etwas über 3 Wochen Laufzeit Kontrolliert. Ergebniss 3 Minuten off.
ich hab bei mir einen timerinterrupt mit 1ms
seit dem letzten stromausfall vor > 1/" jahr geht die uhr ( softwareuhr mit 1ms zeitbasis )
um ein paar sek falsch
Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!