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

omega

Well-Known Member
Hallo Sabri,

sabrikara":3802hz7h schrieb:
Klingt interessant aber jetzt wo ich alles fertig verbaut habe, vielleicht dann doch erst fürs "nächste Mal". Am Arduino rumfuschen ist zu dem jetzigen Zeitpunkt einfacher als in der Lampe die KSQ zu tauschen und die Platine einzubauen.
ich meinte damit nicht, Du sollst Dir eine Coralux-Platine holen sondern einen 10k Widerstand einlöten. :)

Grüße, Markus
 

omega

Well-Known Member
Hi Stefan,

steppy":3izw0eqe schrieb:
du kannst auch die komplette LED Stromversorgung über ein Relais ausschalten.
das hatte ich bei meiner Lampensteuerung ursprünglich auch vor, es aber aufgegeben. Ein passendes Relais für den hohen Einschaltstrom des Netzteils zu finden, ist nicht ganz einfach. Und mit Relais, die bei Nulldurchgang schalten, kenne ich mich nicht aus, z.B. ob diese für Schaltnetzteile überhaupt geeignet sind.

Grüße, Markus
 

Wuestenrose

Well-Known Member
'N Abend...

Ich schalte seit zweieinhalb Jahren zwei parallelgeschaltete Meanwell HLG-80H-C700B zur Pflanzenbeleuchtung mit einem Finder 40.52.8.230.0000 Das funktioniert bislang problemlos. Laut Vinaricky, Elektrische Kontakte, Werkstoffe und Anwendungen, kann man AgNi-Kontakte bis 100 Ampere Schaltstrom einsetzen.

Ja, ich weiß, daß Finder für diese Verwendung eigentlich Relais mit AgSnO2-Kontakten empfiehlt.

Edit: Mit AgSnO2-Kontakten habe ich es hier gefunden.

Grüße
Robert
 

sabrikara

Member
Hi zusammen,

eventuell kann einer mal hier drüber schauen. Ich hab an den ARduion ein Display angeschlossen läuft auch soweit allerdings ....
Das Display soll mir den aktuellen "PWM-Wert" angeben. Es bleibt aber bei der Anzeige vom Start-Wert 255. Blitzt kurz aber es wird dann doch wieder 255 angezeigt. Im Seriellen-Monitor werden die richtigen Werte angezeigt.

Code:
  //60/3 Min Sonnenaufgang gelbe led
  for(int fadeValue = 255; fadeValue >= 0; fadeValue -=1)
  {
  word n_PWM;  
  n_PWM = pgm_read_word(&pwmtable[fadeValue]);
  analogWrite(gelb, n_PWM);
  
  Serial.begin(9600);
  Serial.println(n_PWM);
  
  display.begin(SSD1306_SWITCHCAPVCC);
  display.display();
  display.println(n_PWM);
  delay(4687);
  
  }

Wäre schön, wenn jemand einen Tipp hätte. Danke.
 

omega

Well-Known Member
Hi,

kann es sein, daß Du
Code:
display.begin(SSD1306_SWITCHCAPVCC);
nur einmal auführen solltest, am besten in der setup-Funktion?
Dito
Code:
Serial.begin(9600);

Grüße, Markus
 

sabrikara

Member
Morgen Markus,

wenn ichs nur im Setup drin hab, klappt es gar nicht.

Zufälligerweise hab ich die Textgröße verkleinert und das hier dann gesehen. Siehe Bild. (Man kanns nicht gut lesen aber da steht 255, 244, 244 - wie programmiert.)
Nach jedem blitzen, von dem ich gesprochen hab, kommt scheinbar der jeweilige PWm-Wert dazu. Vorher hab ichs nicht gesehen, weil die Textgröße so groß war, dass nur die 255 drauf gepasst hat. Theoretisch müsste ich jetzt sagen, er soll die Anzeige vorher bereinigen. Teste ich mal aus :)

----

Muss mich korrigieren. Es klappt auch ohne das zweite display.begin. Das hatte ich vorher auch noch mal im Setup drin. Allerdings klappt das mit dem alten Wert löschen und nur den neuen Anzeigen noch nicht.
 

Anhänge

  • IMAG0267.jpg
    IMAG0267.jpg
    1,4 MB · Aufrufe: 871

sabrikara

Member
Huhu,

so klappts :)

Code:
    //60/3 Min Sonnenaufgang gelbe LED
  for(int fadeValue = 255; fadeValue >= 0; fadeValue -=1)
  {
  word n_PWM;  
  n_PWM = pgm_read_word(&pwmtable[fadeValue]);
  analogWrite(gelb, n_PWM);
  

 
  Serial.println(n_PWM);
  
  display.setCursor(0,0);
  display.println(n_PWM);
  display.display();
  
  delay(4687);
  display.clearDisplay();
  }
  }
 

sabrikara

Member
Hi,

läuft.

Code:
  //60/3 Min Sonnenaufgang gelb
  for(int fadeValue = 255; fadeValue >= 0; fadeValue -=1)
  {
  word n_PWM;  
  n_PWM = pgm_read_word(&pwmtable[fadeValue]);
  analogWrite(gelb, n_PWM);
  

 
  Serial.println(n_PWM);
  
  display.setTextSize(2);
  display.setCursor(0,0);
  display.print("Gelbe LED");
  display.setTextSize(1);
  display.setCursor(0,20);
  display.print("PWM-Wert bei ");
  display.println(n_PWM);
  display.display();
  
  delay(4687);
  display.clearDisplay();
  }
 

Anhänge

  • IMAG0270.jpg
    IMAG0270.jpg
    1,8 MB · Aufrufe: 842

woller

New Member
Hallo,
mein Name ist Heinz und ich bin auch gerade dabei eine Lichtsteuerung für mein Aquarium zu bauen, doch komme ich mit meinem Sketch nicht weiter.
Besitze einen Arduino Mega mit ds3231 und möchte 2 Leuchtstoffröhren mit 0-10V und ein LED-Stip dimmen.
Momentan teste ich den Aubau noch mit 3 LED´s, doch diese leuchten wann sie wollen.
hier einmal mein Sketch:

#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);
Serial.println("YourDuino.com DS1307 Real Time Clock - Set / Run Utility");
#ifdef AVR
Wire.begin();
#else
Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
#endif


}

/****************************************************************************************************
*/
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

int maxlicht = 255 ;
long dimmsekunde = date[1]*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( date[ 2 ] <= 5 && date[ 1 ] < 45 ) { // von Mitternacht bis 5:45 Uhr (5:44:59)
licht1 = 0; // ist das Licht aus
licht2 = 0;

}

if( date[ 2 ] <= 5 && date[ 1 ] < 50 ) { // bis 5:49:59 ist das Mondlicht an
licht3 = 150;
}



// von 5:45 Uhr, bis 6 Uhr 15 berechnet sich eine Dimmstufe
// hochdimmen!
if ( date[2] == 5 && date[1] >= 45 ) {
licht1 = dimmrauf ;
}
if( date[2] == 5 && date[1] >= 55 ) {
licht2 = dimmrauf ;
}


if( date[2] >= 6 && date[1] >= 15){ // von 6:15 Uhr
licht1 = maxlicht ; //ist Lampe1 an
}
if( date[2] >= 6 && date[1] >=25){ // von 6:25Uhr
licht2 = maxlicht ; // ist Lampe2 an
}

// von 10:30 bis 11 Uhr wird wieder eine Dimmstufe berechnet
// runterdimmen!
if( date[2] >= 10 && date[1] >= 30 ) {
licht1 = dimmrunter;
}
if( date[2] >= 10 && date[1] >= 40 ) {
licht2 = dimmrunter;
}

if( date[2] >= 11 && date[2] <= 13 ) // von 11 Uhr, bis 13:59:59 Uhr Lampe1 auf Dimmstufe 50
{
licht1 = 50;
}
if( date[2] >= 11 && date[2] <= 13 ) { // von 11 Uhr, bis 13:59:59 Uhr Lampe2 auf Dimmstufe 50
licht2 = 50;
}

// von 14 Uhr, bis 14 Uhr 30 berechnet sich eine Dimmstufe
// hochdimmen!
if( date[2] = 14 ) {
licht1 = dimmrauf ;
}
if( date[2] = 14 && date[1] >= 10) {
licht2 = dimmrauf ;
}

// von 14:30 bis 21:44:59 ist das Licht an
if ( date[2] >= 14 && date[2] >= 30 ){ // ab 14:30
licht1 = maxlicht ; //ist Lampe1 an
}
if ( date[2] >= 14 && date[2] >= 40 ){ // ab14:40
licht2 = maxlicht ; // ist Lampe2 an
}


if( date[2] == 22 && date[2] < 35 ) { // ab 22:35 Uhr Lampe1 runterdimmen
licht1 = dimmrunter;
}
if( date[2] == 22 && date[2] < 45 ) { // ab 22:45 Uhr Lampe2 runterdimmen
licht2 = dimmrunter;
}
// und für den Rest des Tages (ab22 Uhr 05)
// wird das Licht abgedreht

if ( date[2] >= 22 && date[1] >= 5 ) { // ab22 Uhr 05
licht1 = 0; // wird das Lampe1 abgedreht
}
if ( date[2] >= 22 && date[1] >= 15 ) { // ab22 Uhr 15
licht2 = 0; // wird das Lampe2 abgedreht
}

if ( date[2] >= 22 ) // ab 22 Uhr
{
licht3 = 150; //Mondlicht auf Dimmstufe 150
}
analogWrite (Lampe1 , licht1 ); // jetzt noch schnell die Lampe tatsächlich anhand der
analogWrite (Lampe2 , licht2 );
analogWrite (Mond , licht3 ); // vorher bestimmten Werte einstellen
 

omega

Well-Known Member
Hallo Heinz,

zweimal eine Zuweisung statt eines Vergleichs ist mir beim Überfliegen aufgefallen:
if( date[2] = 14 ) {
[tab=30]licht1 = dimmrauf ;
}
if( date[2] = 14 && date[1] >= 10) {
[tab=30]licht2 = dimmrauf ;
}

Mach mal für date[...] wenigstens Makros wie z.B.
Code:
#define STUNDE date[2]
Dann liest sich Deine Scetch leichter. Und nutze die Code-Formatierung hier (Button <> oben) oder manuell
Code:
[code]...
[/code]

Grüße, Markus
 

woller

New Member
Hallo,
habe den Code noch deinem Vorschlag bearbeitet.
Komme mit den Bedingungen noch nicht so klar.

Gruß Heinz



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);
 Serial.println("YourDuino.com DS1307 Real Time Clock - Set / Run Utility");
 #ifdef AVR
  Wire.begin();
#else
  Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
#endif


}

/****************************************************************************************************
 */
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 <= 6  ) {                              // bis 6 Uhr 
      licht3 = 150;                                 // ist das Mondlicht an
      }
  
  
   if (STUNDE == 5 && MINUTE >= 45 ) {              // ab 5:45 Uhr
          licht1 = dimmrauf ;                       // Lampe1 hochdimmen!
  }
  if( STUNDE == 5 && MINUTE >= 55 ) {               // ab 5:45 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;                       // wird Lampe1 runter gedimmt
  } 
   if( STUNDE >= 10 && MINUTE >= 40 ) {              // ab 10:40 Uhr 
          licht2 = dimmrunter;                       // 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 == 22 && 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 )     {                              // ab 22 Uhr
           licht3 = 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 );     
    

}
 

sabrikara

Member
Hi Heinz,

bin auch nicht der Pro. Probieren bis es irgendwann geht, so mache ichs ;)
Du hast auch noch eine Uhr angebaut. Das hab ich nicht. Sieht aber auf den ersten Blick kompliziert aus. Aber ist ja immer so wenn man sich mit etwas noch nicht beschäftigt hat, dann ist alles kompliziert.

Was heißt denn leuchten wann sie wollen? Vielleicht kann mans eingrenzen wo es hängt wenn man mehr weiß was genau passiert. Das sie überhaupt schon mal irgendwann, irgendwie leuchten ist ja schon mal gut.
 

woller

New Member
Hallo,
habe mal einige Zeiten notiert also,
17 Uhr Lampe1 und 2 aus gegangen
17:01Uhr L1 angefangen mit dimm rauf
17:10 Uhr L2 angefangen mit dimm rauf
17:30 Uhr L2 aus und wieder dimm rauf (L1 bleibt an)
18:00 Uhr beide aus gegangen
18:01 L1 dimm rauf
18:10 L2 dim rauf
18:31 L2 aus gegangen und wieder dimm rauf (L1 bleibt an)

Das heißt meine LED machen was sie wollen, kann mit diesen Zeite und den Sketch noch keinen Zusammenhang finden.

Gruß Heinz
 

omega

Well-Known Member
Hallo Heinz,

manno, bei Stunde 14 hast Du noch immer eine Zuweisung statt eines Vergleichs stehen.
Bei 21:45 Uhr hast Du einen Gleichheits-Vergleichgsoperator (==) stehen, bei 14 Uhr und 14:10 Uhr dagegen den Zuweisungsoperator (=). Hatte ich oben extra rot markiert.
Kauf Dir doch mal ein C-Buch, z.B. von Kerninghan & Ritchie. Das ist DIE C-Bibel.

Grüße, Markus
 

Ähnliche Themen

Oben