Arduino 230v Glühbirne dimmen

Hey Leute, ich habe viel recherchiert und an verschiedenen Schaltungen zum Dimmen von 230 V (50 Hz) oder 220 V Licht getestet, aber ich kann mein Arduino nicht dazu bringen, mein Licht zu dimmen. Dies ist das letzte, was ich versucht habe.

machte diese Schaltung: Schaltung und Code Link

Code, den ich ausprobiert habe:

int AC_LOAD = 3;    // Output to Opto Triac pin
int dimming = 128;  // Dimming level (0-128)  0 = ON, 128 = OFF

void setup()
{
  pinMode(AC_LOAD, OUTPUT);       // Set the AC Load as output
  attachInterrupt(0, zero_crosss_int, RISING);  // Choose the zero cross interrupt # from the table above
}

void zero_crosss_int()  // function to be fired at the zero crossing to dim the light
{
  // Firing angle calculation :: 50Hz-> 10ms (1/2 Cycle)
  // (10000us - 10us) / 128 = 75 (Approx)
  int dimtime = (75*dimming);      
  delayMicroseconds(dimtime);    // Off cycle
  digitalWrite(AC_LOAD, HIGH);   // triac firing
  delayMicroseconds(10);         // triac On propogation delay
  digitalWrite(AC_LOAD, LOW);    // triac Off
}

void loop()
{
  dimming = 128; 
  delay(100);
  dimming = 75;  
  delay(100);
  dimming = 25;  
  delay(100);

}
Vergessen Sie für einige Augenblicke die Interrupt-Routine. Haben Sie überprüft, ob Sie tatsächlich die Nulldurchgänge an Ihrem Eingangspin sehen? Vielleicht möchten Sie eine Skizze schreiben, die die Pin13-LED alle 50 oder 60 oder Nulldurchgänge umschaltet. Sie sollten ein sichtbares 1-Hz-Blinken sehen.
Welchen Eingangspin haben Sie zum Anschließen des Nulldurchgangsdetektors verwendet? Beachten Sie, dass die Interrupt-Nummer möglicherweise nicht mit der Eingangs-Pin-Nummer identisch ist und die Interrupt-Pin-Nummern je nach Arduino-Board-Typ variieren können. Welchen Arduino verwendest du denn?
@jippie Ich verwende Arduino uno und mein Interrupt-Pin ist 2
@jippie ich bin neu dabei kannst du mir dabei helfen

Antworten (4)

Ich würde mit dem Debuggen beginnen, indem ich versuche, die Last einige Male im Setup ein- und auszuschalten, um sicherzustellen, dass der TRIAC zündet, zum Beispiel:

void setup()
{
  pinMode(AC_LOAD, OUTPUT);       // Set the AC Load as output
  for (int i=0; i < 10; i++)
  {
      digitalWrite(AC_LOAD, HIGH);   // triac firing
      delay(1000);
      digitalWrite(AC_LOAD, LOW);    // triac Off
      delay(1000);
  }
}

Das MOC3021SM-Datenblatt zeigt, dass 15 mA erforderlich sein können, um die LED anzusteuern. Bei 3,3 V, wie im Schema R5 gezeigt, würde der 470R-Widerstand den Strom auf 7 mA begrenzen und bei 5 V wären es immer noch nur 10 mA, und das ignoriert den Durchlassspannungsabfall.

Sie können eine normale LED-Widerstandsberechnung verwenden, um den Widerstand zu bestimmen. Es sieht aus wie ein Durchlassspannungsabfall von etwa 1,15 V für diesen Teil bei Raumtemperatur, sodass 120 Ohm bei 3,3 V angemessener wären, um etwas mehr als 15 mA zu ergeben. Im Folgenden finden Sie die Empfehlungen zum LED-Strom aus dem Datenblatt:

Alle Geräte lösen garantiert bei einem IF-Wert aus, der kleiner oder gleich der maximalen IFT ist. Daher liegt die empfohlene Betriebs-IF zwischen der maximalen IFT (30 mA für MOC3020M, 15 mA für MOC3010M und MOC3021M, 10 mA für MOC3011M und MOC3022M, 5 mA für MOC3012M und MOC3023M) und der absoluten maximalen IF (60 mA).

Wenn das funktioniert, besteht der nächste Schritt möglicherweise darin, die Nulldurchgangserkennung mindestens einmal zu testen, indem Sie möglicherweise Folgendes verwenden und prüfen, ob sie sich nach 10 Sekunden einschaltet:

void setup()
{
  pinMode(AC_LOAD, OUTPUT);       // Set the AC Load as output
  digitalWrite(AC_LOAD, LOW);     // triac Off
  delay(10000);
  attachInterrupt(0, zero_crosss_int, RISING);  // Choose the zero cross interrupt # from the table above
}


void zero_crosss_int()  // function to be fired at the zero crossing to dim the light
{
    digitalWrite(AC_LOAD, HIGH);   // triac firing
}

Wenn das nicht funktioniert, entfernen Sie vielleicht U1 den Optokoppler (falls in einer Buchse?) Und prüfen Sie, ob das oben Gesagte funktioniert, wenn Sie den Ausgang zwischen Emitter und Kollektor (vorsichtig!) Auf U1 kurzschließen, um den Eingang auf Masse zu ziehen. Es kann sein, dass Sie ein allgemeines Problem mit der Interrupt-Konfiguration haben, je nachdem, mit welchem ​​​​Pin es verbunden ist, was Sie der Frage hinzufügen sollten, aber das hilft, ein Software-gegen-Hardware-Problem zu isolieren.

Danke für die Antwort. Der MOC3021SM funktioniert perfekt, ich habe den von Ihnen angegebenen Code und seine perfekte Umschaltung satt.
Ich glaube, ich vermassele die Nulldurchgangserkennung. Können Sie mich weiter führen?
Jetzt leuchtet es nicht mehr. Ich werde meine Komponenten ändern und Ihnen dann die Ergebnisse mitteilen.
Hey Peter, ich kann den Interrupt bekommen, aber nur, wenn der Schalter ein- oder ausgeschaltet ist. keine Vorschläge zu anderen Zeiten?
@DanielEuchar, der ZCD-Erkennungsteil dieser Schaltung sieht ebenfalls zwielichtig aus und lässt selbst bei Spitzenspannungen nur wenige Milliampere fließen. Vielleicht ist es besser, eine neue Frage zu stellen, die diesen Teil der Schaltung zeigt, und sich beraten zu lassen, wie man eine zuverlässige macht. Wie meine Antwort und die von Russell hervorheben, gibt es viele Designprobleme mit der Schaltung nur im TRIAC-Treiber (obwohl es manchmal funktionieren kann), und der ZCD scheint nicht viel besser zu sein.

Vergessen Sie für einige Augenblicke die Interrupt-Routine. Haben Sie überprüft, ob Sie tatsächlich die Nulldurchgänge an Ihrem Eingangspin sehen? Vielleicht möchten Sie eine Skizze schreiben, die die Pin13-LED alle 50 oder 60 oder Nulldurchgänge umschaltet. Sie sollten ein sichtbares 1-Hz-Blinken sehen.

Ich kann die Skizze nicht testen (aber sie wird ohne Fehler kompiliert), aber ich denke, sie sollte ungefähr so ​​​​aussehen:

const uint8_t ledPin = 13;                          // Digital output pin that has the on board LED
const uint8_t zeroPin = 2;                          // Digital input pin to which the zero crossing detector is connected

uint8_t zeroCounter = 0;
bool zeroState = 0;
bool ledState = 0;

void setup() {
  pinMode( ledPin , OUTPUT );                       // Enable output driver for LED pin
}

void loop() {
  while ( digitalRead( zeroPin ) == zeroState ) {}; // Wait for the state of the zero crossing detector to change
  zeroState != zeroState;
  zeroCounter++;
  if ( zeroCounter == 50 ) {                        // Every 50 zero crossings change the LED state
    ledState != ledState;
    digitalWrite( ledPin , ledState );
    zeroCounter = 0;
  }
}
Ich habe den obigen Code ausprobiert und nein, die LED hat überhaupt nicht geblinkt :( Ich habe sogar den seriellen Druck versucht, um den Wert zu überprüfen, es war alles mit '1' gefüllt
Beginnen Sie, indem Sie R1 (10k) an +5VDC anstelle von +3V3 anschließen, das kann nicht schaden.
Kein Glück :( Ich denke, ich muss die Komponenten ersetzen. Werde es versuchen

Wenn Sie nicht die genauen Schaltungen und Verbindungen zeigen, die SIE verwenden, sind ALLE Fragen dieser Art sinnlos.

Dies ist der Schaltplan, auf den Sie über die Seite zugreifen, auf die Sie verwiesen haben. Bitte fügen Sie IHRE Verbindungen hinzu und posten Sie sie als Teil Ihrer Frage.

Geben Sie hier die Bildbeschreibung ein


Die Masse des Arduino MUSS mit der Masse des MOC3021 verbunden werden.


Achtung!!! - Im Folgenden wird ein Fehler im Design der Schaltung hervorgehoben. Dies kann an Ihrer Schaltung liegen oder auch nicht. Beispielsweise haben sie möglicherweise festgestellt, dass der MOC3021SM nicht zuverlässig funktioniert und einen MOC3023 oder MOC 022 ersetzt. Ihr Problem KANN damit nichts zu tun haben.

  1. Verbinden Sie 3,3 V + mit einem Draht mit dem Dimmer-Eingangsstift.
    Der Triac sollte funktionieren und die Last treiben.

  2. Wenn 1. funktioniert, schließen Sie 3,3 V + an der Pin-Verbindung des Arduino-Antriebsausgangs an. Idealerweise sollten Sie die Arduino-Pin-Verbindung entfernen, da dies den Arduino beschädigen kann. In fast allen Fällen sollte es in Ordnung sein, aber das Zurückspeisen von 3,3 V in ein tiefes Einspeisen ist bestenfalls "ungezogen". TRIAC sollte funktionieren.

Wenn 1. & 2. nicht funktionieren, könnte das Problem an der Schaltung wie unten liegen oder immer noch Ihre Schuld sein. Ändern Sie R5 wie unten und wiederholen Sie 1 & 2.

Wenn Arduino High OR +3,3 V an Dimmer angeschlossen ist, sollte ein Spannungsabfall über R5 (sehr grob 1,5 V +) auftreten und der U@-Eingangspin sollte bei 1,2 - 1,5 V über Grpund liegen.

Die Schaltung wurde schlecht "entworfen" und funktioniert mit 3,3-V-Antrieb nicht mit Optokopplern, die die typischen Datenblattspezifikationen erfüllen, und ist (natürlich) noch schlechter mit den Worst-Case-Datenblattspezifikationen. Selbst mit 5-V-Antrieb wird es die typischen Spezifikationen nicht erfüllen.
Der Designer, falls es einen gab, hatte an dem Tag, an dem dies entworfen wurde, eine starke Gehirnschwäche.

MOC3021 Datenblatt - Marke KANN wichtig sein, leider.

Opto-Eingangsspannung bei 20 mA = 1/15 V / 1,5 V typisch / max.
Strom zum Latch-TRIAC = 8 / 15 mA typisch / max.

Arbeiten mit TYPISCHEM Opto-Vin und typischem Treiberstrom (dh optimistischster Fall).
Iopto = (Vin - Vopto)/R5 = (3,3-1,15)/470 = 4,6 mA.
Typischer Optostrom = 8 mA.
Optostrom im ungünstigsten Fall = 15 mA !!!

Arduino-Antriebsstrom min = ??? mA.

Für den ungünstigsten Fall gilt: R5 = (Vin-Vopto_max)/Imax = (3,3-1,5)/15 mA = 120 Ohm.

Vopto_max liegt bei 20 mA, aber Sie benötigen möglicherweise den größten Teil von 20 mA im schlimmsten Fall.
Was ist die maximale Arduino-Antriebsstromfähigkeit und worauf fällt Vhi bei diesem Strom ab?

Ändere R5 auf 100 Ohm. Oder legen Sie 120 Ohm oder 150 Ohm parallel zu R5.

8-15 mA 1,15-1,5 V (3,3-1,5)/470 =


HINZUGEFÜGT

Es wurde eine Frage zu Geräten mit sehr niedrigem Auslösestrom gestellt.

Verwenden Sie diese Suche , um alle Nulldurchgangs-Optokoppler von Digikey anzuzeigen, sortiert nach aufsteigendem Troggerstrom. Abgesehen von den Fällen, für die Ift nicht angezeigt wird, hat die (Vishay IL411x- Familie den niedrigsten Ift-Wert von 1,3 mA im schlimmsten Fall. Sie sagen, dass der tatsächlich verwendete Strom ein Vielfaches davon betragen sollte, und zeigen, dass der Auslösestrom mit der Lastspannung und -temperatur und mehr variiert., Lesen Sie das Datenblatt für weitere Informationen.

Die Familie Fairchild **FOD4xx und xxx ist ähnlich.

Der MOC3063 von Liteon und anderen hat Ift = 5 mA. Details siehe Datenblatt.

AVR-basiertes Arduino kann 40 mA pro Pin mit einem max. von 200mA pro Paket. AVR-basiertes Arduino läuft normalerweise mit 5 VDC. Arduino Due (nicht Duemilanove) ist ein ARM-basierter Controller, der über einen 3V3-Chip verfügt und sich nicht sicher ist, ob die Ausgangssenke / -quelle max. aktuell.
Ich habe den Code von @PerterJ ausprobiert und der Triac scheint gut zu funktionieren. Können Sie mich anleiten? da ich ziemlich verloren bin
@DanielEuchar - PeterJ scheint auf dem richtigen Weg zu sein, um zu codieren. Tun Sie nicht nur, was er sagt, SONDERN verstehen Sie auch, warum Tangas funktionieren oder nicht funktionieren, wenn Sie die Dinge ändern. Funktioniert der Originalcode von der Website, auf der Sie das Board gekauft haben? Was sagen Sie? WENN der TRIAC-Antrieb in Ordnung ist UND der Nulldurchgang in Ordnung ist (was Sie anhand der bereitgestellten Beispiele beweisen müssen), unterscheidet sich der von Ihnen ausgeführte Code in seiner Funktionsweise von den Beispielen. Wie? Warum?
Hallo! Ich versuche, dieses Schema auf Arduino Due mit MOC3043 (Nulldurchgang, für Heizung) zu implementieren. Ich habe ähnliche Probleme mit dem maximalen Quellstrom bei Due (15 mA). Kann jemand einen Niedrigstromersatz für MOC*-Optoelemente empfehlen?

Der obige Code von Jippie hat bei mir nicht funktioniert, aber dieser, der auf diesem Code basiert, hat es getan. Es testet auch die ISR.

const uint8_t ledPin = 13;                          // Digital output pin that has the on board LED
const uint8_t zeroPin = 2;                          // Digital input pin to which the zero crossing detector is connected

uint8_t zeroCounter = 0;
bool zeroState = 0;
bool ledState = LOW;

void setup() {
  Serial.begin(9600);
  pinMode( ledPin , OUTPUT );                       // Enable output driver for LED pin
  attachInterrupt(0, zero_crosss_int, RISING);  // Choose the zero cross interrupt # from the table above
}

void loop() {

}

void zero_crosss_int()  // function to be fired at the zero crossing to dim the light
{
  zeroState != zeroState; 
  zeroCounter++;

  if ( zeroCounter == 60 ) {                        // Every 50 zero crossings change the LED state
    ledState = (ledState == LOW) ? HIGH : LOW;
    digitalWrite( ledPin , ledState );
    zeroCounter = 0;
  }
}
Willkommen bei EE.SE. Beachten Sie, dass der Verweis auf den obigen Code auf einer Site bedeutungslos ist, auf der Antworten mit Stimmen und Benutzersortierungseinstellungen auf und ab schweben. Sie haben sich jedoch den Namen von Jippie notiert, damit wir ihn klären können.
Deshalb erwähnte ich, dass es Jippies Code war.