Temperaturabhängiges Dimmer per PWM, DHT11, 22, o.ä. Arduino UNO R3

Hallo zusammen,

bevor ich mein Vorhaben genauer beschreibe, kurze info zu meiner Person:

ich bin gelernter Elektrotechniker Meister und von daher mit Ohm und Strom bestens vertraut, wenn auch die Berührungspunkte mit Halbleitertechnik schon etwas verblasst sind. Bisher habe ich alle meine Projekte mit SPS realisieren können, doch jetzt, aufgrund der Funktionalität, habe ich den Schritt in die µC - Welt gewagt.

Ich habe den Einstieg mit einem UNO R3 Starterkit und entsprechenden Tutorials zu den einzelnen Komponenten und Beispielschaltung absolviert, doch jetzt geht es für mich ans Eingemachte, bzw. den eigentlichen Grund warum ich den µC ausgewahlt habe, was allerdings aufgrund mangelnder Kenntnisse in C/C++ nicht ganz einfach werden könnte.

Vorhaben:

Ein LED Treiber (MeanWell HLG Serie) soll über seine PWM Dimmfunktion abhänging von der Raumtemperatur gedimmt werden.

Als Temperatursensor steht mir der DHT11 zur Verfügung (war halt bei dem Starterkit dabei), wurde aber spater gerne aufgrund der höheren Genauigkeit auf DHT22 wechseln (oder gar, falls sinnvoll, einen Analogen Sensor verwenden?)

Die Schnittstelle zwischem dem 5V PWM Output des UNO und dem 10V Dimm-Input des MW Treibers stellt ein 2N7000 Transistor dar.

Grobe Funktionsbeschreibung:

Gemessene Temperatur <30°C = Volle Lichtleistung
Gemessene Temperatur >30°C = Verringerung der Lichtleistung und damit der entstehenden Abwärme. Mit entsprechenden Delays zwischen den Stufen (welche Zeiten und Stufen da sinnvoll sind wird die Praxis zeigen) so lange verringern bis die Temperatur wieder unter 30°C sinkt und bestenfalls erstmal dort bleibt und nicht gleich wieder das Licht auf 100% geschaltet wird.
Bedingung: Lichtleistung nie geringer als 20% , auch wenn die Temperatur 30°C überschreitet.

Die Frage an dieser Stelle wäre, ob es irgendwelche passenden Beispiele gibt, die ich als Basis nehmen und für meine Zwecke verändern kann?

Z.b. weiß ich noch nicht genau wie das mit der Verarbeitung des Temperaturwertes aus dem DHT abläuft, und wie der in Bedingungen eingebunden werden kann.

Habe früher halt solche Sachen mit 10V Analogsignalen über eine SPS mit Logik-Verknüpfungen realisiert.

Ich habe natürlich im Vorfeld bei google reichlich Rechersche betrieben und unzählige tutorials zu den DHT sensoren gefunden, aber nur wie wie man deren Werte anzeigen und ausgeben kann, jedoch nicht wie ich damit eine entsprechende funktion realisieren kann.

Für alle die bis hier her gelesen haben: Vielen Dank dass du dir die Zeit genommen hast dich mit meiner Problematik auseinander zu setzen!

Hi

Wie sich der DHT11 bei der Temperatur schlägt - hätte dazu noch Nichts negatives gelesen - bei Luftfeuchte soll Der 'nicht so der Hit' sein.
Du hast die Temperatur als Wert, als Grad, Zehntelgrad, Sechzehntelgrad (z.B. Rohwert DS18B20, 1-wire) - und kannst damit machen, was Dir gerade nettes einfällt.
2N7000 sollte ein kleiner N-FET sei (kein LL-Typ) - wie wolltest Du mit Dem auf die 1...10V kommen?
Wenn sich der Dimmer per schnödem PWM ansteuern lässt, geht auch der 2N7000, Der muß hier ja nur hochgezogene 10V nach GND ableiten - Das sollte damit am Arduino gehen - sonst gibt's für kleines Geld LL-N-FETs (Logik-Level - Die schalten bei 5V schon voll durch).

MfG

jnhmk:
Ich habe natürlich im Vorfeld bei google reichlich Rechersche betrieben und unzählige tutorials zu den DHT sensoren gefunden, aber nur wie wie man deren Werte anzeigen und ausgeben kann, jedoch nicht wie ich damit eine entsprechende funktion realisieren kann.

jetzt überlege mal: was ist der Unterschied ob du den Wert auf der Seriellen Schnittstelle ausgibst oder ihn in einem IF auf einen bestimmten Wert oder Grenze abfragst?

Hast du schon mit IF gearbeitet? Beispiele in der IDE angesehen?

Verstehe ich es richtig, dass du die Temperatur der Elektronik überwachen willst und bei zu hoher Temperatur willst du das Licht dimmen, um die abwärme zu reduzieren? Ich meine, es ist deine Entscheidung und du hast meinen Segen, aber ich persönlich würde in dem Fall temperaturgesteuert einen Lüfter anschalten statt das Licht aus.

Das Einbinden des Sensorwertes geht super einfach. Das meiste machst du mit if-Abfragen, z.B:

if(Sensorwert > 30){
  analogWrite(PWM_Pin, 50);
}

Das wäre das einfachste, du hast fast unbegrenzte Möglichkeiten noch mehr zu tun, dazu musst du dich vielleicht noch mehr mit der sprache befassen und aus Beispielen lernen (es muss ja kein beispiel sein wo genau das gemacht wird, jedes Projekt der Art "ich will etwas abhängig von einem Sensorwert beeinflussen" kann dir Anregungen geben. Youtube ist voll davon, auch von weiteren einfachen Tutorials.

Hallo,

Wenn Du von einer SPS kommst musst Du etwas umdenken, es ist halt eine andere Spache.

die grudsätzlichen Dinge sind auch in der HIlfe der IDE ganz gut oft auch mit Beispielen beschrieben.

Die Beispiele in der IDE sind auch leicht verständlich.

Heinz

Moin!

Vielen Dank für die schnellen Rückmeldungen!

postmaster-ino:
Wenn sich der Dimmer per schnödem PWM ansteuern lässt, geht auch der 2N7000, Der muß hier ja nur hochgezogene 10V nach GND ableiten - Das sollte damit am Arduino gehen

genau so soll es funktionieren!

Rentner:
Hallo,

Wenn Du von einer SPS kommst musst Du etwas umdenken, es ist halt eine andere Spache.

genau da scheint letztenendes das größte Problem zu liegen.
könnt ihr mir vielleicht eine Quelle empfehlen, wo man grundlegenden Funktionen von C/C++ auf Aurduino zugeschnitten erlernen kann?
Ich denke langfristig macht es am meisten Sinn sich mit der Sprache von Grund auf nochmal vertraut zu machen, da ich bisher wirklich nur Beispiele genommen habe... Habe schon diverse Sachen dazu gefunden, bloß nichts was irgendwie step by step erklärt wie ich ein Sketch mit Leben fülle, und vor allem welche Befehle, Variablen, etc es gibt und was genau ihre Funktion ist...

Hallo,

hatte ich schon angesprochen . Arbeite die Beispiele in der IDE durch Datei/Beispiele . Syntax gibts unter Hilfe / Referenz

Links

http://www.cplusplus.com/reference/

Nachteil alle sind mehr auf PC bezogen und die Arduino speziellen Dinge ( z.B E/A ) sind da nicht drin. Aber dazu gibts ja die Beispiele oder:

Kompendium

gibts auch als E-Book

Heinz

jnhmk:
könnt ihr mir vielleicht eine Quelle empfehlen, wo man grundlegenden Funktionen von C/C++ auf Aurduino zugeschnitten erlernen kann?
Ich denke langfristig macht es am meisten Sinn sich mit der Sprache von Grund auf nochmal vertraut zu machen,

Hier kannst du alles zur Sprache nachschlagen: Arduino Reference - Arduino Reference

Ich dachte du hättest die Beispiele durchgearbeitet, das beinhaltet nachvollziehen und verstehen. Jetzt klingt es so, als hättest du sie nur kopiert und ausprobiert.
Ich persönlich finde Lernen aus Youtube Videos sehr angenehm, suche dazu einfach "Arduino Tutorial". Ich hab ein paar einfache Anleitungen am Anfang durchgearbeitet, Sketch nicht kopieren sondern mindestens mal selbst tippen und immer überlegen was man da macht. Ich hab versucht den Sketch dann noch etwas zu modifizieren. Wenn man das kann, hat man ihn halbwegs verstanden.

Wenn Du noch ein wenig tiefer eindteigen willst oder einfach was nachschlagen: die AVR-libc

Gruß Tommy

Hallo Miteinander!

erstmal vielen Dank für die ganzen Infos und Quellen zum schlau-lesen... habe ich gemacht und dank diverser youtube tutorials mein eigenes kleines Programm geschrieben, was erstmal (wenn auch sicherlich nicht gerade elegant) das tut was es soll. ich habe dazu eine Map Funktion und ein bisschen If für das begrenzen der PWM Ausgabe genutzt. Prinzipiell funktioniert das erstmal.

Allerdings habe ich ein problem mit dem tatsächlichen dimmen des LED Treibers.

ich habe einen 2N7000 N-Channel Mosfet wie folgt beschaltet:

GNDino ---------|--------- Dim-
|
|Source
pwm-Pin --gate--<
|drain
|
|--------- Dim +

nun folgendes Verhalten: Das Licht wird bei kleiner werdendem PWM Signal heller und und bei größer werdendem PWM Signal dunkler... mit anderen Worten genau umgekehrt, wie es eigentlich sein sollte.
analogWrite(PWM, 0) = 100% Licht
analogWrite(PWM, 255) = 0% Licht

das Datenblatt des LED Treibers sagt aber dass bei 0% dutycycle 0% Licht ausgegeben, und bei 100% Dutycycle 100% ausgegeben wird...

habe ich den transistor falsch beschaltet?
lässt sich das irgendwie inverteiren?

Gemessene Temperatur <30°C = Volle Lichtleistung
Gemessene Temperatur >30°C = Verringerung der Lichtleistung und damit der entstehenden Abwärme.

Wofür macht man sowas?
Wärmelampe für Enten oder Ferkel oder so?!

Lieben Gruß,
Chris

Hallo,

vermutlich hast Du da was falsch angeschlossen. Gogle mal nach "Arduino Mosfet" dann Bilder, da gibts die Schaltungen dazu. Widerstand vor Gate ist zwar nicht unbedingt nötg macht aber Sinn. Aus dem Datenblatt bekommst Du dann die Pinbelegung des Mosfet, Bauform beachten !!

Wenn Du dann mit Gate auf 5V gehst sollte er duchschalten, bei 0V sperren.

Heinz

Sind die Anschlüsse Dim+/- nur Inputs oder liegt an Dim+ eine Spannung an?

Mahimus:
Sind die Anschlüsse Dim+/- nur Inputs oder liegt an Dim+ eine Spannung an?

der LED Treiber hat eine 3in1 Dimmfunktion, siehe Bild im Anhang.

aus diversen Beiträgen betreffend der PWM-Dimmfunktion für diese Geräte konnte ich entnehmen, dass zwischen Dim+ und Dim- die 10V Bereitgestellt werden müssten (oder jedenfalls eine Spannung x, denn sonst würde sich der Treiber nicht per Potentiometer dimmen lassen)
Ich habe in enstprechenden Beiträgen auch schon gesehen, dass es mit einem Optokoppler noch einfacher gehen soll...

jnhmk:
der LED Treiber hat eine 3in1 Dimmfunktion, siehe Bild im Anhang.

aus diversen Beiträgen betreffend der PWM-Dimmfunktion für diese Geräte konnte ich entnehmen, dass zwischen Dim+ und Dim- die 10V Bereitgestellt werden müssten (oder jedenfalls eine Spannung x, denn sonst würde sich der Treiber nicht per Potentiometer dimmen lassen)
Ich habe in enstprechenden Beiträgen auch schon gesehen, dass es mit einem Optokoppler noch einfacher gehen soll...

Das sieht im Datenblatt aber anders aus.
Der Treiber möchte entweder 0 - 10Volt als Steuerspannung, oder 10Volt PWM zur Steuerung haben.
Also musst du ihm 10Volt PWM anbieten, die du mit einem zusätzlichem Mosfet schaltest.
Da ist aber ein LL-Mosfet angesagt, der 2N7000 ist das nicht. Zumindest habe ich nichts darüber gefunden.

Ich vermute mal, dass durch das invertieren des FET, der LED-Treiber während der H-Phase der Arduino-PWM ein LOW an 'sieht' und und damit ne Impuls-Pause und während der L-Phase der Arduino-PWM (also in der PWM Pause des Arduinos, 'sieht der LED-Trieber 10V, also HIGH , und damit ist das für ihn ein Impuls.

Darum läuft das umgekehrt.
2 Möglichkeiten:
Hardware: nen 2. Transistor (oder Fet) NPN od. N-Fet ,um das Signal nochmals zu invertieren.
Software: das Mapping so ändern dass die PWM genau umgekehrt ausgegeben wird wie jetzt.

Alles sehr merkwürdig...

ich habe den Treiber mit dem 2n7000 ja bereits gesteuert bekommen, allerdings scheint der 2n7000 in dieser Anschlussvariante, ohne externe 10V, einfach Dim+ und Dim- über Source und Drain, das Signal zu invertieren.

Deltaflyer:
Ich vermute mal, dass durch das invertieren des FET, der LED-Treiber während der H-Phase der Arduino-PWM ein LOW an 'sieht' und und damit ne Impuls-Pause und während der L-Phase der Arduino-PWM (also in der PWM Pause des Arduinos, 'sieht der LED-Trieber 10V, also HIGH , und damit ist das für ihn ein Impuls.

genau das scheint es zu sein...

in meiner Vorstellung müsste "einfach" der Transistor durchschalten wenn er am Gate/Base ein high signal bekommt...

daher auch die Überlegung Optokoppler? habe da was von PC817 gelesen, gibts sogar Anschlussfertig zu kaufen. Hätte zusätzlich den charme die beiden Systeme galvanisch voneinander zu trennen...

jemand ne Meinung, oder bestenfalls ne Erfahrung dazu?

Ja, du kannst es mit einem Optokoppler machen, dann hast du eine sichere Trennung zwischen 10Volt und dem Arduino.
Oder nimmst einfach einen NPN-Transistor als Treiber des Mosfet.

Das warum hab ich vorhin doch erklärt.
Der Transistor schaltet ja bei einem High am Gate, Drain zu Source durch. Und Source liegt auf GND (od, 10V PWM -) Also invertiert der Transistor.
Das PWM Signal besteht ja aus (in der Länge veränderbaren) Impulsen (HIGH) .und Impuls-Pausen (LOW)
Durch die Invertierung, die ein Transistor nunmal macht, werden aus Impulsen Impuls-Pausen und umgekehrt.

@Deltaflyer: Ja genau, ich habe leider erst nach abschicken meines letzten beitrags gesehen dass du das schon erklärt hast! Vielen Dank!

aber wenn ich dann einen Optokoppler nehme, der bei PWM High vom Arduino an der Anode und GND an Kathode die Emitter-Collector Strecke durchschaltet (was dann ja an Dim+ u. Dim- hängt), passiert dann da nicht im Prinzip das gleiche, oder habe ich einen Denkfehler?