Forum: Mikrocontroller und Digitale Elektronik Arduino Uno R3 Frage zur Funktionsweise


von Marco G. (twinkie750)


Lesenswert?

Guten Abend,
mein Name ist Marco Gebhardt und ich bin neu hier im Forum. Ich hoffe 
mit der Frage bin ich in der richtigen Abteilung.
Mit dem ganzen Mikrocontrollerthema würde ich mich als Neulich 
bezeichnen. Ich habe für unser Terrarium (welches konstant 28° benötigt) 
einen Dimmer gebaut, zuerst nur aus einem ESP8266 später aus dem ESP und 
einem Arduino Uno.
Anfänglich:
Der ESP8266 (NodeMCU) erhällt alle 5 min Sensorwerte von einem DHT22 
Temperatursensorwerte, auf ihm läuft ein Webserver sodass ich von 
unterwegs die Werte abrufen kann und er steuert den Dimmer. Der Dimmer 
ist Mittels Phasenanschnittssteuerung realisiert (Triac + 2 
Optokoppler). Der Controller erhällt also bei Nullphasendurchgang ein 
Interrupt und schickt dann mit einer eingestellten Zeitverzögerung das 
Signal zum Durchschalten des Triacs. Nun war es aber so dass alle paar 
Sekunden wenn der ESP andere Aufgaben wie z.B. das bearbeiten des 
Webservers, Temperatur oder WIFI bearbeitet hat, die Lampe flackerte.
Also habe ich:
jetzt auf einem Arduino Uno nur die Interrupts (Nullphasendurchgang) 
sowie das Schalten des Triacs laufen. Über I2C erhällt er alle 5 Minuten 
entweder den Befehl das Dimm-delay zu erhöhen oder zu verringern (je 
nach Temperatur). Der Loop()-Teil vom Arduino ist leer, bzw. stand da 
nur ein delay(100) drinnen die ganze Zeit.

Nun das Problem: Jeden Tag zwischen 12 und 14 Uhr flackert irgendwann 
das Licht oder geht ganz aus für 10-20 Minuten, den Rest vom Tag macht 
alles genau was es soll. An was könnte das liegen? im Loop Teil ist ja 
nur ein Delay(100)... gibt es Probleme wenn der eingebaute Timer einen 
gewissen Wert erreicht? (Arduino startet jeden Morgen neu, Nachts ist er 
vom Netz genommen)

Und die zweite Frage:
Wenn ich beim Arduino den Loop() Teil ganz weglasse oder leer lasse, 
wird der Prozessor dann so stark beansprucht wie wenn er permanent 
rechnen würde? Da ja kein Delay mit dabei ist was ihn bremst? Ich weiß, 
blöde Formulierung aber ich weiß nicht wie ich es gerade besser 
beschreiben kann.

Liebe Grüße Marco

von Einer K. (Gast)


Lesenswert?

Der UNO läuft immer auf Vollgas.
Auch im Delay.

In den Sleep könntest du ihn zwingen. Bringt aber nicht viel, wg. dem 
restlichen Gedöns auf dem Board.

Marco G. schrieb:
> Nun das Problem: Jeden Tag zwischen 12 und 14 Uhr flackert irgendwann
> das Licht oder geht ganz aus für 10-20 Minuten, den Rest vom Tag macht
> alles genau was es soll. An was könnte das liegen?

Wie soll man das beurteilen?
Schaltung geheim
Code geheim

Am UNO selber liegts eher nicht.
Weder das Board, noch das Framework hat solche Probleme.

Es liegt meist an dem, was ausblendet wird.
Hier: Code oder Schaltung

von Marco G. (twinkie750)


Lesenswert?

Hallo und danke für die Antwort, dann schicke ich mal meinen Code 
hinterher. Vielleicht fällt ja einem was auf:

#include "Wire.h"

int Triac = 5;
int ZC = 3;
int dimming = 4;  // Dimming level (0-128)  0 = ON, 128 = OFF
int c;

void setup()
{
  pinMode(Triac, OUTPUT);
  pinMode(ZC, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(ZC) , zero_crosss_int, RISING);
  Wire.begin(8);
  Wire.onReceive(receiveEvent);
}

void loop()
{
}

void receiveEvent()               //Befehle vom ESP kommend um
{                                 //Dimmer anzupassen
  while(0<Wire.available())
  {
    c = Wire.read();
  }
    if(c == 1 && dimming <= 115.2)
    {
     dimming = dimming + 6.4;
     }
    if( c== 0 && dimming >= 10.4)
    {
      dimming = dimming - 6.4;
      }
}


void zero_crosss_int()
{
  // 50Hz-> 10ms (1/2 Cycle) -> maximale Zeit damit Lampe komplett aus 
bl.
  // (10000us - 10us) / 128 = 78
  int dimtime = (78*dimming);
  delayMicroseconds(dimtime);
  digitalWrite(Triac, HIGH);   // triac ein
  delayMicroseconds(10);
  digitalWrite(Triac, LOW);    // triac aus
 }

: Bearbeitet durch User
von Christian K. (the_kirsch)


Lesenswert?

'dimming' ist Integer aber du vergleicht und rechnest mit 
float-Konstanten.

'dimming' wird in zwei Interrupt Routinen verwendet => mach es zu 
volatile.

Innerhalb einer ISR machst du ein delay => Niemals in einer ISR warten, 
setze Flags und behandelt es in der Main über ein Zustandsautomat.

Soll dein while in der receiveEvent() nur über  Wire.read() gehen?

: Bearbeitet durch User
von Marco G. (twinkie750)


Angehängte Dateien:

Lesenswert?

Danke für die Antwort, wie gesagt bin Neuling und für jeden Tipp 
dankbar.
Die ersten beiden Fehler habe ich beseitigt.
Delays in Interrupts sollte man vermeiden weil der restliche 
Programmfluss aufgehalten wird. In meinem Fall gibt es außer der Dimmer 
Steuerung aber sonst nichts außer den Erhalt von Daten vom ESP was nur 
alle 10 min einmal passiert. Ist es dann trotzdem noch wichtig?
Ja das while bezieht sich nur auf das wire.read(), ich glaube ich hatte 
anfänglich noch etwas anderes drinnen deswegen eine while Schleife, 
könnte ich dann auch rausnehmen.
Aber anhand des Codes gibt es keine Anzeichen warum er den ganzen Tag 
perfekt arbeitet außer Mittags, meistens um die selbe Zeit erst flackert 
und dann für ca. eine halbe Stunde ausfällt? Wenn das passiert ist es 
unabhängig ob bereits gedimmt ist oder die Lampe noch auf 100% gefahren 
ist.

Verwende das Modul im Anhang (BTA-16 Triac mit 2 Optokopplern)

: Bearbeitet durch User
von Christian K. (the_kirsch)


Lesenswert?

Marco G. schrieb:
> Aber anhand des Codes gibt es keine Anzeichen warum er den ganzen Tag
> perfekt arbeitet außer Mittags, meistens um die selbe Zeit erst flackert
> und dann für ca. eine halbe Stunde ausfällt?

Macht vielleicht der ESP zu der Zeit faxen?

von 2 Cent (Gast)


Lesenswert?

Marco G. schrieb:
> Der Controller erhällt also bei Nullphasendurchgang ein
> Interrupt
Das kann im Fehlerfall einen Interrupt neu auslösen, während in 
demMoment der aktuelle Interrupt noch nicht fertig bearbeitet ist.

möglicher Auslöser:
https://de.wikipedia.org/wiki/Rundsteuertechnik

von Manfred (Gast)


Lesenswert?

2 Cent schrieb:
> möglicher Auslöser:
> https://de.wikipedia.org/wiki/Rundsteuertechnik

Aber nur, wenn das Netzteil großer Mist ist.

Auf dem Klo habe ich einen 12V 60VA Trafo, wo anstatt der Halogenlampen 
nun fertige China-LED-Strahler dran hängen. Die habe im Innenleben einem 
Brückengleichrichter und einen sehr kleinen Laddelko vor dem 
Schaltregler (MC 34063) - da flackert es abends um die volle Stunde 
herum.

An anderen Stellen habe ich Schaltnetzteile vor den LEDs, da kommen 
keine Rundsteuersignale durch.

von Marco (Gast)


Lesenswert?

Falls es wirklich Störsignale durch Rundsteuertechnik sind, was hätte 
das mit dem Netzteil zu tun? Die Nullphasendurchgänge werden doch direkt 
an der Steckdose abgegriffen/gemessen

von 2 Cent (Gast)


Lesenswert?

Manfred schrieb:
> 2 Cent schrieb:
>> möglicher Auslöser:
>> https://de.wikipedia.org/wiki/Rundsteuertechnik
>
> Aber nur, wenn das Netzteil großer Mist ist.
??? Die  Nulldurchgangserkeunnung des TO (und der Interruptauslöser) hat 
irgendwas mit "Mist" des NT zu tun??? ???


> Auf dem Klo habe ich einen 12V 60VA Trafo, wo anstatt der Halogenlampen
> nun fertige China-LED-Strahler dran hängen. Die habe im Innenleben einem
> Brückengleichrichter und einen sehr kleinen Laddelko vor dem
> Schaltregler (MC 34063) - da flackert es abends um die volle Stunde
> herum.
Dann mach dir mal Gedanken. Und einen neuen Thread.


> An anderen Stellen habe ich Schaltnetzteile vor den LEDs, da kommen
> keine Rundsteuersignale durch.
Auch dies kann vorkommen. Prima :D

von 2 Cent (Gast)


Lesenswert?

Marco schrieb:
> Die Nullphasendurchgänge werden doch direkt
> an der Steckdose abgegriffen/gemessen
Anscheinend.

von winnetu (Gast)


Lesenswert?

Code Murks
Technik Murks
=
Ergebnis Murks

von Gnorm (Gast)


Lesenswert?

Marco G. schrieb:
> int dimtime = (78*dimming);

Wie gross ist denn ein int auf Arduino???

von STK500-Besitzer (Gast)


Lesenswert?

Gnorm schrieb:
> Marco G. schrieb:
>> int dimtime = (78*dimming);
>
> Wie gross ist denn ein int auf Arduino???
groß genug?! (78*128 = 9984)
https://www.arduino.cc/reference/de/language/variables/data-types/int/

von Stefan F. (Gast)


Lesenswert?

Die dimming Variable muss auf jeden Fall volatile sein.

Du musst dein Problem in Teile zerlegen. Ich würde dazu als die Lampe in 
einen gedimmten Zustand bringen und dann die I²C Verbindung zwischen AVR 
und ESP trennen.

Die Lampe sollte dann ihre aktuelle Helligkeit beibehalten, richtig? Tut 
sie das denn auch den ganzen Tag lang?

Danach weisst du, ob das Problem vom ESP aus geht, oder von woanders her 
kommt.

Wie hast du denn die Stromversorgung realisiert? Woher bekommt der AVR 
seine Versorgung, woher der ESP? Zeige den vollständigen Schaltplan. 
Welche Netzteile hast du verwendet? Wie ist die Leitungsführung (mache 
Fotos)?

All das sind wichtige Fragen, ganz besonders bei sporadischen 
Aussetzern.

von Marco G. (twinkie750)


Angehängte Dateien:

Lesenswert?

Danke für deine Antwort! Ich wollte erst alles verlöten wenn es richtig 
funktioniert, daher ist es derzeit noch auf dem Breadboard gesteckt. Die 
Spannungsversorgung über dieses Standart 5 Volt Breadboard Netzteil was 
es immer dazu gibt... sollte ich das mal tauschen? Ich habe keine 
geeignete Software um professionelle Pläne zu erstellen, aber habe 
trotzdem mal einen groben Plan in den Anhang gesetzt.
Also seinen gedimmten Zustand behällt er eigentlich... es wird ja 
meistens gegen 11-12 Uhr in der Wohnung so warm, dass das Dimmen 
einsetzt und angenommen er dimmt bis 60 Prozent runter, dann bleibt es 
auch so bis Abends. Er setzt nur um die Mittagszeit zwischen 12.30 und 
14 Uhr mal für eine halbe Stunde komplett aus eingeleitet von heftigem 
Flackern.
Ich habe heute den Uno mal durch einen Nano ersetzt und beobachte das 
Phenomen. Sollte es heute wieder passieren werde ich den Code für die 
Kommunikation mit dem ESP mal auskommentieren und schauen was passiert.
Danke

von Marco G. (twinkie750)


Lesenswert?

winnetu schrieb:
> Code Murks
> Technik Murks
> =
> Ergebnis Murks

Ok, das mag sein. Aber dann bitte mit Verbesserungsvorschlag sonst ist 
das ein ziemlich unproduktiver Kommentar.

von Cubalibre (Gast)


Lesenswert?

Marco G. schrieb:
> Die ersten beiden Fehler habe ich beseitigt.
> Delays in Interrupts sollte man vermeiden weil der restliche
> Programmfluss aufgehalten wird. In meinem Fall gibt es außer der Dimmer
> Steuerung aber sonst nichts außer den Erhalt von Daten vom ESP was nur
> alle 10 min einmal passiert. Ist es dann trotzdem noch wichtig?

Ja, das ist wichtig. Die I2C Kommunikation läuft ja auch Interrupt 
getrieben, und eventuell kommen sich deine zero_crosss_int() ISR und die 
Wire ISR zu bestimmten Zeiten so in die Quere, daß die Wire Interrupt 
Routine an irgendeiner Stelle noch auf ein Ereignis wartet das nicht 
mehr eintritt, und damit weitere Interrupts blockiert. Bis dann nach 5 
oder N x 5 Minuten weitere I2C Datenpakete vom Master den Fehler 
auflösen. Soweit erst mal nur eine Theorie.

Du könntest das testen, indem du deine Delays erst noch in der ISR 
belässt, und einfach nur in der Loop() eine LED blinken läßt. Falls die 
Wire ISR längere Zeit blockiert, wird die LED nicht mehr blinken.

Da die 50Hz Netzfrequenz und dein 5 Minuten Kommunikationszyklus nicht 
synchronisiert sind, wird irgendwann der Nulldurchgang und eine I2C 
Kommunikation quasi gleichzeitig stattfinden, und anschließend wieder 
auseinanderlaufen (Schwebung). Das könnte den langen Zeitraum zwischen 
den Fehlverhalten erklären.

von Stefan F. (Gast)


Lesenswert?

Marco G. schrieb:
> Ich wollte erst alles verlöten wenn es richtig
> funktioniert, daher ist es derzeit noch auf dem Breadboard gesteckt.

Schöne Zeichnung. An SDA und SCL gehören Pull-Up Widerstände mit 4,7kΩ.

Breadboards eignen sich nicht zur Stromversorgung von ESP Modulen, sie 
haben zu hohe Kontaktwiderstände.

Dein kleines Spannungsgregler Board könnte überfordert sein. Wenn da nur 
100mA fließen, muss es bereits 700 mW verheizen, was für Chips dieser 
Größe schon sehr grenzwertig ist. Hast du ein Oszilloskop, mit dem du 
die Stabilität der Versorgungsspannung prüfen kannst?

Hast du ein Oszilloskop? Wenn nicht, besorge Dir eins. Wenn es billig 
sein muss, dann wenigstens ein DSO138. Damit kannst du die 
Stromversorgung und die I²C Kommunikation prüfen.

von Wolfgang (Gast)


Lesenswert?

Cubalibre schrieb:
> Da die 50Hz Netzfrequenz ...
Die 50Hz Netzfrequenz tritt beim Dimmen nicht zu Tage. Der Dimmer muss 
die Halbwellen mit 100Hz Wiederholfrequenz zünden. Bei einem durch den 
5min Kommunikationszyklus ausgelösten Flackern, müsste das Flackern auch 
diesen 5min Rhythmus zeigen.
Grundsätzlich hört sich Flackern nach fehlenden Zündungen an, was man am 
besten mit passenden Messgeräten, z.B. einem kleinen Logikanalysator 
erfassen könnte. Alles andere ist Kaffeesatzleserei.

von Stefan F. (Gast)


Lesenswert?

Die Pull-Up Widerstände müssen nach 3,3V gehen. Wenn du keine 4,7kΩ 
vorliegen hast, nimm weniger Ohm (nicht mehr).

> Grundsätzlich hört sich Flackern nach fehlenden Zündungen an

Warte erst mal ab, ob das Problem nicht schon von der Steuerung durch 
den ESP ausgeht.

Wenn mein Auto nicht fährt, kann ich natürlich auch den Reifendruck 
messsen, falls ich möchte. Aber erst einmal sollte man gucken, ob der 
Motor überhaupt läuft.

von Hubert G. (hubertg)


Lesenswert?

Marco G. schrieb:
> int dimming = 4;  // Dimming level (0-128)  0 = ON, 128 = OFF

Weiss jetzt nicht ob es hier relevant ist, aber bei int8 ist der 
positive Zahlenbereich 0-127. Was kommt also bei der multiplikation 
78*128 heraus? Also besser "volatile unsigend int dimming"

von Stefan F. (Gast)


Lesenswert?

Hubert G. schrieb:
> Weiss jetzt nicht ob es hier relevant ist, aber bei int8 ist der
> positive Zahlenbereich 0-127. Was kommt also bei der multiplikation
> 78*128 heraus? Also besser "volatile unsigend int dimming"

Du hast die beiden Variablen "dimming" und "dimtime" verwechselt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.