Meanwell LCM-40 (10V PWM) dimmen mit Arduino 5V PWM

omega

Well-Known Member
Hi Sabri,

sabrikara":125bknvn schrieb:
Probieren bis es irgendwann geht, so mache ichs ;)
wenn das alle so gemacht hätten, würden wir noch immer auf Bäumen leben. Man sollte schon verstehen, was man macht. Die meisten, die es damals nämlich nicht verstanden haben, sind beim Ausprobieren ex gegangen.
Benjamin Frankling z.B. hatte mit seinem Drachen lediglich einen Haufen Glück. Er hätte genausgut bei seinem Humbug drauf gehen können und wir hätten heute keinen Blitzableiter.

Grüße, Markus
 

sabrikara

Member
Hi Markus,

das ist richtig. Aber ich muss nicht zwingend erst verstehen dann machen. Durchs Probieren lernt und versteht man dann, was da passiert.
 

woller

New Member
oh mann, hatte es nur noch nicht gepostet aber auf dem Arduino schon umgeschrieben.
sieht so aus als ob der Code in der 14 Uhr Dimmschleife hängen bleibt.
hier mein jetziger Code:
Code:
#include <Time.h>
#include <TimeLib.h>
#include "Wire.h"

int Lampe1 = 11;                                          // Lampen Pin auf 11 setzen Licht
int Lampe2 = 12;                                          // Lampen Pin auf 12 setzen Licht2
int Mond = 13;                                            // Lampen Pin auf 13 setzen Mondlicht


int loga[64] =
   {0,1,1,2,2,3,3,4,4,5,6,7,8,9,10,11,12,13,14,
   16,17,19,21,23,25,27,29,32,
   35,38,41,44,47,50,55,60,65,70,75,80,85,
   90,95,100,105,110,115,120,125,130,135,
   130,140,150,160,170,180,190,200,210,220,230,240,255};
   
   
#define DS1307_I2C_ADDRESS 0x68                          // I2C Adresse
char buffer[20] = "";


byte bcdToDec(byte val)
{
  return ( (val/16*10) + (val%16) );
}


//Zeit und Datum aus DS1307 auslesen und konvertieren

void getDateDs1307(int date[])
{
  Wire.beginTransmission(DS1307_I2C_ADDRESS);         // I2C-Kommunikation im Schreibmodus starten
  Wire.write(0x00);                                   // Registerzeiger auf 0 setzen
  Wire.endTransmission();                             // I2C-Kommunikation beenden 
  Wire.requestFrom(DS1307_I2C_ADDRESS, 7);            // I2C-Kommunikation im Lesemodus starten

  date[ 0 ] = bcdToDec(Wire.read() & 0x7f);        // Sekunden
  date[ 1 ] = bcdToDec(Wire.read());               // Minuten
  date[ 2 ] = bcdToDec(Wire.read() & 0x3f);        // Stunden
  date[ 3 ] = bcdToDec(Wire.read());               // Wochentag
  date[ 4 ] = bcdToDec(Wire.read());               // Tag
  date[ 5 ] = bcdToDec(Wire.read());               // Monat
  date[ 6 ] = bcdToDec(Wire.read());               // Jahr
}

/****************************************************************************************************
 */
void setup() {
  Wire.begin();                                      // I2C-Bus einrichten

pinMode(Lampe1, OUTPUT);
pinMode(Lampe2, OUTPUT);
pinMode(Mond, OUTPUT);
 Serial.begin (9600);

}

/****************************************************************************************************
 */
void loop() {

  Serial.begin (9600);


  int licht1 ;
  int licht2 ;
  int licht3 ;
  
  int date[ 7 ];

  char str[30];
  
  
  
getDateDs1307( date     );                            // Datum und Uhrzeit aus DS1307 holen

#define STUNDE date[2]
#define MINUTE date[1]

int maxlicht = 255 ;
long  dimmsekunde = MINUTE*60;
int gesamtdimmsekunden = 1800;  // Zeitliche Spanne des rauf und runter dimmens 1800sekunden sind 30 Minuten
int dimmrauf = maxlicht * dimmsekunde / gesamtdimmsekunden ;
int dimmrunter = maxlicht - (maxlicht * dimmsekunde / gesamtdimmsekunden);




  if( STUNDE <= 5 && MINUTE < 45 ) {                // von Mitternacht bis 5:45 Uhr (5:44:59)
        licht1 = 0;                                 // ist Lampe1 aus     
      }
  
     if( STUNDE <= 5 && MINUTE < 55 ) {              // von Mitternacht bis 5:45 Uhr (5:54:59)
        licht2 = 0;                                 // ist Lampe1 aus
        }
  
  
   if (STUNDE >= 5 && MINUTE >= 45 ) {              // ab 5:45 Uhr
          licht1 = dimmrauf ;                       // Lampe1 hochdimmen!
  }
   if( STUNDE >= 5 && MINUTE >= 55 ) {               // ab 5:55 Uhr
          licht2 = dimmrauf ;                       // Lampe2 hochdimmen!
     }
 
  
   if( STUNDE >= 6 &&  MINUTE >= 15 ) {              // ab 6:15 Uhr
       licht1 = maxlicht ;                           // ist Lampe1 an
      }
      
    if( STUNDE >= 6    &&  MINUTE >= 25){             // ab 6:25 Uhr
         licht2 = maxlicht ;                         // ist Lampe2 an
       }
  
 
   if( STUNDE >= 10 && MINUTE >= 30 ) {              // ab 10:30 Uhr 
          licht1 = dimmrunter , -50 ;                       // wird Lampe1 runter gedimmt
  } 
   if( STUNDE >= 10 && MINUTE >= 40 ) {              // ab 10:40 Uhr 
          licht2 = dimmrunter , -50 ;                       // wird Lampe2 runter gedimmt
  } 

   if( STUNDE >= 11  )      {                        // ab 11 Uhr
           licht1 = 50;                              // ist Lampe1 auf Dimmstufe 50

}
   if( STUNDE  >= 11  &&  MINUTE >= 10   ) {          // ab 11:10 Uhr
         licht2 = 50;                                // ist Lampe2 auf Dimmstufe 50
 }

    if( STUNDE >= 14 ) {                              // ab 14 Uhr
          licht1 = dimmrauf ;                         // wird Lampe1 hoch gedimmt
  }
    if( STUNDE >= 14  &&  MINUTE >= 10) {               // ab 14:10 Uhr
          licht2 = dimmrauf ;                         // wird Lampe2 hoch gedimmt
  }

  
   if ( STUNDE >= 14 && MINUTE >= 30  ){               // ab 14:30     
         licht1 = maxlicht ;                           // ist Lampe1 an
  }
  if  ( STUNDE  >= 14 && MINUTE >= 40 ){                // ab 14:40                      
           licht2 = maxlicht ;                         // ist Lampe2 an 
  }
 
  if( STUNDE >= 21  && MINUTE >= 35  ) {                // ab 21:35 Uhr 
          licht1 = dimmrunter;                          // wird Lampe1 runter gedimmt
  }    
    if( STUNDE >= 21 && MINUTE >= 45  ) {               // ab 21:45 Uhr 
           licht2 = dimmrunter;                         // wird Lampe2 runter gedimmt
   }

  // wird das Licht abgedreht
 
   if ( STUNDE >= 22 && MINUTE >= 5 ) {                  // ab 22:05 Uhr 
           licht1 = 0;                                   // ist Lampe1 aus
  }
    if ( STUNDE >= 22 && MINUTE >= 15 ) {                 // ab 22:15 Uhr 
          licht2 = 0;                                    // ist Lampe2 aus
  }
  


   if ( STUNDE >= 22 ||  STUNDE <=5 )     {               // ab 22 Uhr  bis 5:59:59 Uhr 
         licht3 = dimmrauf ,-150;                         // ist Mondlicht auf Dimmstufe 150
}
   
 analogWrite (Lampe1 , licht1 );                          // jetzt noch schnell die Lampe tatsächlich anhand der
 analogWrite (Lampe2 ,  licht2);                          // vorher bestimmten Werte einstellen
 analogWrite (Mond ,  licht3);     
    

}

Gruß Heinz
 

omega

Well-Known Member
Hallo Heinz,

woller":284k6lrf schrieb:
sieht so aus als ob der Code in der 14 Uhr Dimmschleife hängen bleibt.
Dein Sketch enthält keine einzige Schleife. In einer Schleife geht es bekanntermaßen rund. Das passiert aber nur bei einem for, while oder do, nicht aber bei einem if.

das selbe Ergebnis zur vollen Stunde geht sie aus um dann wieder hoch zu dimmen
Bau mal einen delay(1000) in loop() ein, damit sich Dein Arduino nicht tot rennt. Dem wird ja ganz schwindelig. Einmal pro Sekunde die PWM-Werte bei 255 Helligkeitsänderungen in 30 Minuten zu errechnen und zu setzen, ist mehr als ausreichend.
Dann nimmst Du den Poor Man's Debugger: gib mit Serial.println die Werte auf Deinem PC aus, die Dir verdächtig erscheinen. An die Lampen braucht Dein Arduino dazu nicht angeschlossen zu sein.
So kommst Du Deinem Problem vielleicht eher auf die Spur.

Serial.begin(9600) brauchst Du in loop() nicht. Steht ja schon in setup().

Was bezweckst Du mit dem Comma Operator bei z.B.
Code:
licht1 = dimmrunter , -50 ;
licht1 wird dadurch immer auf -50 gesetzt. Da gibt's noch andere solche Stellen.

Hast Du schon mal ausgerechnet was
Code:
int dimmrauf = maxlicht * dimmsekunde / gesamtdimmsekunden ;
int dimmrunter = maxlicht - (maxlicht * dimmsekunde / gesamtdimmsekunden);
ergeben, wenn dimmsekunde = 59*60 ist? dimmrauf wird dann 501 und dimmrunter -246.

Grüße, Markus
 

woller

New Member
würde mich mal als totalen Anfänger bezeichnen und bin schon mal froh das ich mit dem Code so weit wie jetzt bin und hoffe mit eurer Hilfe bekommen ich den Rest auch hin. Mit dem Poor Man's Debugger kann ich leider momentan noch gar nichts anfangen.
habe den Code geändert und möchte damit bezwecken das licht1 von 255 bis Stufe 50 runterdimmt

Code:
  if( STUNDE >= 10 && MINUTE >= 30 ) {
 licht1 = dimmrunter > 50 ;

aber funktioniert wohl auch wieder nicht :nosmile:

komme irgentwie nicht weiter
könnte die Formel so funktionieren?

Code:
int dimmrauf = 0 ++ (dimmsekunde / gesamtdimmsekunden) ;
int dimmrunter = maxlicht - (dimmsekunde / gesamtdimmsekunden);
 

omega

Well-Known Member
Hallo,

woller":2d0tsrrk schrieb:
Mit dem Poor Man's Debugger kann ich leider momentan noch gar nichts anfangen.
dann wird es höchste Zeit, daß Du Dich damit beschäftigst. Wenn Du Deinen eigenen Code nicht verstehst, solltest Du Dir mal ansehen, was er mit Deinen Variablen anstellt.

habe den Code geändert und möchte damit bezwecken das licht1 von 255 bis Stufe 50 runterdimmt
Code:
  if( STUNDE >= 10 && MINUTE >= 30 ) {
 licht1 = dimmrunter > 50 ;
aber funktioniert wohl auch wieder nicht :nosmile:
An Deiner Stelle würde ich jetzt mal beginnen zu verstehen, was Du da eigendlich programmiert hast.
In Worten:
Wenn es halb elf oder später ist, dann setze licht1 auf eins, wenn dimmrunter größer fünfzig ist.
Wenn dagegen dimmrunter kleiner oder gleich fünfzig ist, setze licht1 auf Null.
"dimmrunter > 50" ist ein Vergleich, der als Ergebnis true (1) oder false hat (0) hat.

könnte die Formel so funktionieren?

Code:
int dimmrauf = 0 ++ (dimmsekunde / gesamtdimmsekunden) ;
int dimmrunter = maxlicht - (dimmsekunde / gesamtdimmsekunden);
Könnte? Warum rechnest Du es denn nicht nach?
Die erste Zeile compiliert nicht. Der Inkrement-Operator "++" ist unär, hat demnach nur einen Operanden. Bei Dir sind es aber zwei. Aus "0 ++" würde 1, aber dann fehlt ein Operater zum Rest des arithmetischen Ausdrucks.

Grüße, Markus
 

max4flowgrow

New Member
Meanwell LCM-40 (10V PWM) dimmen mit Raspberry Pi 5V PWM

Hi,

sorry, wenn ich hier zwischenfunke - es geht mir aber dezidiert um den Einstiegstopic, nämlich eine LED-Leuchte (Smartarray Q16) mit dem Netzteil Meanwell LCM-40 zu dimmen - allerdings direkt mit dem RaspberryPi 3 und nicht mit einem Arduino.

Hierzu habe ich genau die Schaltung befolgt, wie sie auf den ersten Seiten hier im thread beschrieben wird - lediglich hab ich den 5V-Ausgang des RaspberryPi genommen anstelle des Arduino. Das müsste doch auch gehen, oder?

Ergebnis: Ich kann zwar an- und ausschalten, aber wenn ich z.B. auf 80% dimme, dann flackert die LED-Leuchte... Von Dimmen kann ansonsten keine Rede sein.

Die Schaltung scheint zu stimmen, aber die Art und Weise, wie ich die PWM in Python anspreche, die ist mir nicht klar, denn das, was Ihr im Arduino macht, das lässt sich wohl leider nicht einfach übertragen...

Hat jemand einen Tipp, wie das zu lösen ist? Wäre super...

Liebe Grüße
Markus
 

max4flowgrow

New Member
Hi,

muss mich korrigieren: Gate ist an PIN 11 (phys.) des Raspberry angeschlossen, erhält also nur 3,3V.

Wenn ich nun nach einer Anleitung wie dieser vorgehe (vgl. http://www.toptechboy.com/raspberry-pi/raspberry-pi-lesson-27-analog-voltages-using-gpio-pwm-in-python/), dann kann ich die LED bestenfalls zum Flackern bringen, z.B. wenn ich den cycle extrem heruntersetze, aber sie leuchtet immer mit derselben Stärke, d.h. lässt sich so nicht dimmen.

Was mache ich falsch?

Liebe Grüße
Markus
 

steppy

Active Member
Hallo Markus,
wenn es flackert tut sich ja schonmal was. Ich würde zunächt einmal eingrenzen, ob die Software oder die Hardware Probleme macht. Hast du die einfache Schaltung aus deinem Link getestet, also nur ein Widerstand und eine mini-LED an dem Port. Falls das nämlich geht, ist der Fehler in deiner Schaltung zu suchen, sonst in der Software.

Gruß
Stefan
 

Wuestenrose

Well-Known Member
'N Abend...

max4flowgrow":13mng5no schrieb:
muss mich korrigieren: Gate ist an PIN 11 (phys.) des Raspberry angeschlossen, erhält also nur 3,3V.
Dann schaltet der MOSFET vermutlich nicht ganz durch. Alternative: Durch einen Transistor ersetzen, dessen Basis Du allerdings nicht direkt mit dem Raspberry ansteuern kannst. Du schaltest einfach einen 47-kOhm-Widerstand zwischen den Ausgangspin des Raspberry und die Basis des Transistors. Sein Kollektor kommt ohne irgendetwas dazwischen oder sonstwie dazuzuschalten an "DIM +" des LCM-40. Seinen Emitter verbindest Du mit Minus der Raspberry-Spannungsversorgung und "DIM -" des LCM-40. Es gibt sonst keine weitere Verbindung zum LCM.

Grüße
Robert
 

Wuestenrose

Well-Known Member
Morgen…

Ein simpler NPN-Kleinleistungstransistor wie der BC547 genügt. Habe ich vergessen zu erwähnen.


Grüße
Robert
 

Silverdriver

New Member
Hallo, ich bin neu hier im Forum und habe mich extra wegen diesem Beitrag angemeldet.
Ich habe vor genau diese Schaltung mit einem Arduino UNO + Echtzeituhr DS3231 nachzubauen um mein Meanwell Netzteile zu Dimmen mit Sonnenaufgang und Sonnenuntergang.
Jetzt habe ich das Problem das ich in der Programmierung noch ein frischling bin, aber vielleicht würde mir ja jemand helfen oder sogar eine Quelle für einen laufendes Programm nennen.

Das ganze soll recht simpel sein.
Ich möchte einfach zu Uhrzeit X die dimmung starten (Sonnenaufgang)
Dann eine gewisse Zeit beleuchten (Tageslicht 10 Stunden)
Dann das Licht wieder runterdimmen bzw ganz abschalten (Sonnenuntergang)

Ich würde mich sehr freuen wenn ihr mir da weiterhelfen würdet.

Als Hardware habe ich: Arduino UNO, DS3231 Echtzeituhr, LCD Display 1602 und für das PWM Problem 5V auf 10V habe ich einen NPN BD241B + 1K widerstand + 5,1K widerstand das sollte so funktionieren oder?

So wurde mir der Anschluss empfohlen: An den Kollektor des Transistors kommt ein 5k widerstand und dann an DIM+, am Emitter geht es zurück zu DIM- (=GND) und die Basis wird über einen Widerstand (so...1000 Ohm oder größer) mit dem Microcontroller-Pin verbunden.
DIM- muss zudem noch mit der Masse vom Microcontroller verbunden sein.

Vielen Dank
 

Ridcully

New Member
Hallo,

ich bin froh, dass ich nach ewiger Suche auf diese Seite gestoßen bin, da ihr hier mein Problem schon fast besprochen habt. Ich möchte auch meine Aquarium LEDs dimmen, allerdings mittels RasPi. Meine Situation ist folgende: Ich habe 21 High Power CREE LEDs kaltweiß, 8 HP CREE LEDs warmweiß, 4 HP Osram LEDs rot und 4 HP Osram LEDs blau, jeweils an einer regelbaren KSQ 700mA (Meanwell), damit ich alle Farben einzeln an und ausschalten kann. Momentan hängt das an einer programmierbaren Steckerleiste und funktioniert ganz gut, bis auf den sehr ungenauen Timer der Steckerleiste. Jetzt möchte ich aber auch, dass das Licht nicht plötzlich an und aus geht sondern, wie gesagt, dass die LEDs allmählich heller und dunkler werden. Die Konstanstromquellen können ja über ein PWM-Signal gesteuert werden. Wie kann ich mit dem Pi realisieren, dass die KSQ getrennt eingeschaltet werden können (ohne die ungenaue Steckerleiste) und gleichzeitig die LEDs gedimmt werden können. Ich habe mir schon das PCA9685 und ein 5 Volt Relais Modul besorgt. Wenn ich mittels PCA9685 die PWM Signale zu den Meanwell-KSQs gebe (mittels BS 170 auf 10V geschaltet) kann ich dann vlt auch über die V+ Leitung des PCA9685 das 5V Relais Modul schalten, um den Strom für die KSQs an- und auszuschalten? Oder ist V+ genauso moduliert wie das PWM-Signal? Und wie würde so ein Pythonscript aussehen? Vielen Dank schon mal.
 

Ähnliche Themen

Oben