Forum: Mikrocontroller und Digitale Elektronik Arduino Mega für Programm nicht richtig aus


von Thomas Kloiber (Gast)



Lesenswert?

Guten Morgen,

Ich habe auf einem Bauernhof ein Programm für automatische Fütterung von 
Ziegen installiert. Leider scheint es so, als würde der Arduino Mega 
2560 teilweise Programmzeilen überspringen.

Dazu gibt es 2 brisante Beispiele:
1) Während des Melkbetriebes bleibt das Karussell manchmal einfach 
stehen und de LED leuchtet blau. um das Karussell aber wieder wegfahren 
zulassen muss der Stoptaster aber 2 mal gedrückt werden statt nur einmal

Entprellung beginnt ab Zeile 534
die Variable „Var_KarusellStop“ wird im Melkbetrieb (state = 2) in Zeile 
875 abgefragt und der Motor ausgeschaltet. Die Variablen 
„EntprellenStopTaster“, „Var_KarusellStopAlt“ usw. werden komischerweise 
nicht verändert(siehe Foto Debugger).

2) Der im Nebenraum stehende PC sendet dem Mega die Futtermege zu jeder 
Ziege bzw bietet einige Einstellungen wie zum Beispiel das der 
Futterschneck auf Dauerlauf geschaltet wird (falls er einmal leer 
gelaufen ist..)

Als Bestätigung, das der Arduino alles Richitg erledigt hat, sollte er 
dem PC eine Antwort senden, in diesem Beispiel sendet er "Dauerlauf ein" 
und "DA" abwechselnd wie es sich gehört - schaltet den schneck aber nie 
ein...

Im Programm ab Zeile 479 + Foto SchneckDauerlauf


Weiters noch im Anhang der ganz aufbau des Karussells mit allen 
Sensoren.

Schaltkasten
Alle 230V & 400 V Leitungen gehen oben Hinein/Hinaus – alle 
Signalleitungen (Taster, geber…) sind geschiermt und gehen unten 
Hinein/Hinaus
Arduino und RFID Reader werden mit 12V DC versorgt, Relais mit 9V DC 
(habe dort den einen Rückschlag vermutet – hat aber nichts geändert)

von Cyblord -. (cyblord)


Lesenswert?

Für den Schaltkasten sollte man jemanden züchtigen. Aber ordentlich.

Hast du WIKRLICH Lüsterklemmen auf nen Euro-Stecker gemacht?

Und dann der restliche Verhau mit irgendwelchen Arduino Boards und 
Lochrastern. Dich sollte man nichts für den produktiven Einsatz, und 
dann noch an LEBEWESEN, machen lassen.

Dein Programm ist genau so Pfusch. Kannst du nur Pfusch?

von Oliver S. (oliverso)


Lesenswert?

Thomas Kloiber schrieb:
> Als Bestätigung, das der Arduino alles Richitg erledigt hat, sollte er
> dem PC eine Antwort senden, in diesem Beispiel sendet er "Dauerlauf ein"
> und "DA" abwechselnd wie es sich gehört - schaltet den schneck aber nie
> ein...

Warum sollte der das auch tun?

Oliver

von Stefan F. (Gast)


Lesenswert?

Der Code ist zum umfangreich, um ihn mal eben schnell per Sichtkontrolle 
zu prüfen.

An den Fotos sehe ich allerdings relativ dünne Käbelchen zur 
Stromversorgung, die anscheinen nicht sternförmig zu einem Masse-Punkt 
am Arduino Board zusammen laufen. Das ist vor allem für die GND 
Leitungen wichtig. Ändere das.

Dann würde ich die Steckverbindung der Stromversorgung am Arduino Board 
durch eine gelötete oder geschraubte Verbindung ersetzen.

Sehe ich es richtig, dass das größere Netzteil dein Arduino Board 
versorgt und das kleinere die Relais? Im Prinzip ist das eine gute Idee, 
aber mir stellt sich die Frage, was sonst noch alles an den großen 
Netzteil hängt. Ich würde alle größeren Verbraucher (Motoren, Relais, 
Lichterketten) an das Zweit-Netzteil hängen damit das Arduino Board von 
allen bösen Störungen fern gehalten wird. Denn großartige Filter enthält 
es ja leider nicht.

Diese Relais sind meiner Meinung nach nicht geeignet, da sie nur auf 
1500V isolieren. Hier wären nach VDE 4000V angebracht. Vermutlich ist 
das jedoch derzeit nicht dein Hauptproblem.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Cyblord -. schrieb:
> Hast du WIKRLICH Lüsterklemmen auf nen Euro-Stecker gemacht?

 Und du meinst, dass die Steckdose einen besseren Kontakt hat ?

> Und dann der restliche Verhau mit irgendwelchen Arduino Boards und
> Lochrastern. Dich sollte man nichts für den produktiven Einsatz, und
> dann noch an LEBEWESEN, machen lassen.

 3D-Printer werden auch mit Arduino Boards gemacht.
 Das übersteigt natürlich deine Fähigkeiten bei weitem, deswegen auch
 dein idiotischer Kommentar über Arduino Boards und Lochraster.

: Bearbeitet durch User
von Lothar (Gast)


Lesenswert?

Du könntest ein Schaltschrank taugliches Arduino MEGA einsetzen das 
Schutz gegen elektrostatische Entladung eingebaut hat z.B.

https://www.conrad.de/de/sps-steuerungsmodul-controllino-maxi-pure-100-100-10-12-vdc-24-vdc-1595716.html

https://www.conrad.de/de/sps-steuerungsmodul-controllino-mega-pure-100-200-10-1595718.html

von Bauern Beobachter (Gast)


Lesenswert?

- Händeüberdemkopfzusammenschlag -

von Falk B. (falk)


Lesenswert?

Thomas Kloiber schrieb:

> Ich habe auf einem Bauernhof ein Programm für automatische Fütterung von
> Ziegen installiert. Leider scheint es so, als würde der Arduino Mega
> 2560 teilweise Programmzeilen überspringen.

Mal ganz sicher nicht.

Aber du hast hier mehrere Probleme. Dein Programm hat keine gescheite 
Struktur! Du hast ALLES als eine MEGA-Funktion in deine Loop() Funktion 
geschrieben! Das ist sehr schwer nachvollziehbar und damit auch schwer 
analysierbar. Ebenso ist eine Fehlersuche deutlich erschwert. Du 
solltest das umstrukturieren und in sinnvolle Funktion packen. Dann 
sieht man eher durch und es wird einfacher und damit weniger 
fehleranfällig.

Strukturierte Programmierung auf Mikrocontrollern

von Cyblord -. (cyblord)


Lesenswert?

Marc V. schrieb:
> Cyblord -. schrieb:
>> Hast du WIKRLICH Lüsterklemmen auf nen Euro-Stecker gemacht?
>
>  Und du meinst, dass die Steckdose einen besseren Kontakt hat ?

Irrelevent. Da gehört ein Hutschienennetzteil mit passenden Klemmen rein 
und kein Steckernetzteil.

> 3D-Printer werden auch mit Arduino Boards gemacht.

Die sind ja auch von Pfuscher für Pfuscher, äh Maker. Interessiert uns 
hier aber nicht. Das ist nämlich kein 3D Printer fürs Kinderzimmer.

> Das übersteigt natürlich deine Fähigkeiten bei weitem, deswegen auch
> dein idiotischer Kommentar über Arduino Boards und Lochraster.

Natürlich. Ich könnte NIE einen Arduino Board absolut amateurhaft SO in 
einen Schaltschrank bauen und dann nicht funktionierenen Pfusch-Code 
dafür schreiben. Übersteigt meine Fahigkeiten. Sorry.

: Bearbeitet durch User
von Thomas (Gast)


Lesenswert?

>An den Fotos sehe ich allerdings relativ dünne Käbelchen zur
>Stromversorgung, die anscheinen nicht sternförmig zu einem Masse-Punkt
>am Arduino Board zusammen laufen. Das ist vor allem für die GND
>Leitungen wichtig. Ändere das.

Masse Punkt mitten über dem Board oder ist das egal wo? Und dabei Alle 
GND Pins des Boards + Netzeil-GND verbinden?


>>Leider scheint es so, als würde der Arduino Mega
>>2560 teilweise Programmzeilen überspringen.

>Mal ganz sicher nicht.
Dann bitte ich dich, mir zu erklären wie es sein kann, dass lt. Bild 
"Debugger" die Variable "EntprellenStopTaster" 0 sein kann (in der 
Spalte Max) und trotzdem die Variable "D" 37 ist - außerdem sollte dann 
auch die Variable "C" 36,37 oder 38 sein, oder? Weiters ist die Variable 
"A" auch 0, was zwar dafür spricht das "EntprellenStopTaster" 
richtigerweise 0 ist, aber nicht dass "D" 37 ist

- zur info-laut "millis()" lief dabei das Programm noch nicht lange und 
es wurde der Stoptaster auch nicht gedrückt

>Sehe ich es richtig, dass das größere Netzteil dein Arduino Board
>versorgt und das kleinere die Relais? Im Prinzip ist das eine gute Idee,
>aber mir stellt sich die Frage, was sonst noch alles an den großen
>Netzteil hängt. Ich würde alle größeren Verbraucher (Motoren, Relais,
>Lichterketten) an das Zweit-Netzteil hängen damit das Arduino Board von
>allen bösen Störungen fern gehalten wird. Denn großartige Filter enthält
>es ja leider nicht.

Auf dem 12V Netzteil hängt der Mega, der RFID Reader und ein 
Kapazitivsensor(nicht ab Bild) diese wurden aber alle schon abgehängt - 
ohne Erfolg

>Aber du hast hier mehrere Probleme. Dein Programm hat keine gescheite
>Struktur! Du hast ALLES als eine MEGA-Funktion in deine Loop() Funktion
>geschrieben! Das ist sehr schwer nachvollziehbar und damit auch schwer
>analysierbar. Ebenso ist eine Fehlersuche deutlich erschwert. Du
>solltest das umstrukturieren und in sinnvolle Funktion packen. Dann
>sieht man eher durch und es wird einfacher und damit weniger
>fehleranfällig.

Das Programm lief vorher ca 3 Monate lang ohne Reset ohne Motoren im 
Test.. Dabei hatte ich diese Problem nicht. Für eine Umstrukturierung 
bitte ich um ein Programm das deinen Vorstellungen entsprechend 
programmiert ist.

von Sebastian R. (sebastian_r569)


Lesenswert?

Thomas schrieb:
> Dann bitte ich dich, mir zu erklären wie es sein kann, dass lt. Bild [...]

Ein Controller ist nur so schlau wie sein Programmierer ;)

von Stefan F. (Gast)


Lesenswert?

Thomas schrieb:
> Masse Punkt mitten über dem Board oder ist das egal wo?

Möglichst nahe an dem Punkt, wo du das Netzteil anschließt. Also 
momentan noch die Steckbuchse, die du durch etwas festeres austauschen 
sollst.

Es könnte hilfreich sein, eine Menge Debug Meldungen hinzuzufügen (z.B. 
hinter jedem if und else) und diese mit Zeitstempel in eine Datei 
aufzuzeichnen.

von Thomas (Gast)


Lesenswert?

>Ein Controller ist nur so schlau wie sein Programmierer ;)
und du anscheinend nicht schlauer als ich ;)

aber wieso funktioniert es dann ohne Motoren?

von Cyblord -. (cyblord)


Lesenswert?

Thomas schrieb:
>>Ein Controller ist nur so schlau wie sein Programmierer ;)
> und du anscheinend nicht schlauer als ich ;)
>
> aber wieso funktioniert es dann ohne Motoren?

Vielleicht weil deine horrende Verkabelung und deine Hobbyplatine für 
diese Umgebung nicht geeignet sind?
Dein schlechter Code verhindert eben auch eine schnelle Fehlersuche. 
Liegts an der HW oder der SW? Wäre die SW sauberer, ließe sich die Frage 
schneller beantworten.
Es kann auch eine Kombination sein: Ein schlecht beschalteter 
Eingang/Sensor liefert durch anlaufende Motoren falsche Daten ans 
Programm. Programm macht daraufhin Unsinn.

ICH würde bei einer passenden Stromversorgung nebst ordentlicher 
Verkabelung mit passenden Querschnitten anfangen. Das ist das A und O.
Von da aus kann man dann weiter machen.

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

Thomas schrieb:

>>Aber du hast hier mehrere Probleme. Dein Programm hat keine gescheite
>>Struktur! Du hast ALLES als eine MEGA-Funktion in deine Loop() Funktion
>>geschrieben! Das ist sehr schwer nachvollziehbar und damit auch schwer
>>analysierbar. Ebenso ist eine Fehlersuche deutlich erschwert. Du
>>solltest das umstrukturieren und in sinnvolle Funktion packen. Dann
>>sieht man eher durch und es wird einfacher und damit weniger
>>fehleranfällig.
>
> Das Programm lief vorher ca 3 Monate lang ohne Reset ohne Motoren im
> Test..

Dann war das nur ein halber Test. Vermutlich hast du ein EMV-Problem, 
die Motoren spucken dir in die Suppe und deine Entprellung wird 
ausgehebelt.

> Dabei hatte ich diese Problem nicht. Für eine Umstrukturierung
> bitte ich um ein Programm das deinen Vorstellungen entsprechend
> programmiert ist.

Du meinst ein Beispiel? Ok, etwa so. Allerdings ist dort keine 
statemachine drin, die als Vorbild dienen könnte. Die gibt es aber 
im gleichnamigen Artikel. Oder wie im Artikel Multitasking.

Beitrag "Re: I2CLCD Library für HD44780 LCDs"

Bist du der OP? Dann sollte man aber bitte schön IMMER unter dem 
gleichen, idealerweise angemeldeten Namen schreiben.

von gdfgsdgsg (Gast)


Lesenswert?

erstmal gratulation das du das nach unten geschreibe in einer funktion 
so lange durchgehalten hast ^^
sowes hab ich auch noch nicht gesehen.

Man kann da vieles umbauen und in funktionen  umlagern.
Das macht die ganze sache übersichtlicher ,
zumal sich einige teile stark ähneln.

Es gibt auch lokale Variablen.
zB bei der Eepromgeschichte
1
void EEPROMWritelong(int address, long value)
2
{
3
  //Write the 4 bytes into the eeprom memory.
4
  EEPROM.write(address    ,  (value & 0xFF) );
5
  EEPROM.write(address + 1, ((value >> 8) & 0xFF) );
6
  EEPROM.write(address + 2, ((value >> 16) & 0xFF) );
7
  EEPROM.write(address + 3, ((value >> 24) & 0xFF) );
8
}
9
10
long EEPROMReadlong(long address)
11
{
12
  long value = 0; 
13
  value   =  EEPROM.read(address);
14
  value  |= (EEPROM.read(address + 1)<<8);
15
  value  |= (EEPROM.read(address + 2)<<16);
16
  value  |= (EEPROM.read(address + 3)<<24);
17
  return value;
18
}

wenn man das so weiter führt kann man minimum 50% der globalen variablen 
wegwerfen.

in jedem Status setzt du die 3 strings immer zurück.
Wenn man die auswertung in eine extrafunktion auslagert kannst du das am 
ende vor dem rücksprung erledigen.
Gleichzeitig sind die stati insgesammt deutlich kürzer und wiederholen 
sich stellenweise sogar -> weniger code

die 3 strings ..
1
 if (Serial2.available() > 2)
2
  {
3
    Empfangen = Serial2.readStringUntil(':');
4
    Empfangen1 = Serial2.readStringUntil(':');
5
    Empfangen2 = Serial2.readStringUntil(':');
6
  }

auf was wartetst du hier genau?
Was sendest du dem arduino?


"xx:yy:zz\r\n" ?
Wenn ja dann würde ich nur auf das \r\n triggern

1
for (Hilfsvariable = 0; Hilfsvariable < 11; Hilfsvariable++)

lokale variable :
1
uint8_t i;
2
for (i= 0; i< 11; i++)

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

LOOOOOOOOOOOOOOOOOL
Der traut sich tatsächlich, Bilder von diesem Schaltkasten hier 
anzuhängen?
Sorry, aber schalte die Scheiße ab und lass das von jemandem machen, der 
Ahnung davon hat und vor allem weiß, was er tut. Ansonsten werden sich 
Deine Ziegen bald als Brathähnchen verkaufen lassen nachdem die 
Feuerwehr wieder weg ist. Versicherung zahlt bei so einem Pfusch 
übrigens auch keinen Cent.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Cyblord -. schrieb:
> Natürlich. Ich könnte NIE einen Arduino Board absolut amateurhaft SO in
> einen Schaltschrank bauen

 Arduino Board ist eigentlich ziemlich gut bis gut gemacht, kein
 Grund ihn so anzuspucken. Das gleiche gilt für Lochraster wenn es
 anständig gemacht wird.
 Das die Verkabelung Pfusch ist, gebe ich allerdings zu.


> und dann nicht funktionierenen Pfusch-Code
> dafür schreiben. Übersteigt meine Fahigkeiten. Sorry.

 ob der Code Pfusch ist oder nicht, will ich gar nicht beurteilen,
 wird wahrscheinlich so sein.
 Die Behauptung vom TO, dass der MEGA Programmzeilen überspringt ist
 auf jeden Fall Blödsinn.

: Bearbeitet durch User
von spess53 (Gast)


Lesenswert?

Hi

>Arduino Board ist eigentlich ziemlich gut bis gut gemacht, kein
> Grund ihn so anzuspucken.

Stimmt. Ziemlich gut kastriert das Board.

MfG Spess

von Einer K. (Gast)


Lesenswert?

gdfgsdgsg schrieb:
> Es gibt auch lokale Variablen.
> zB bei der Eepromgeschichte
> void EEPROMWritelong(int address, long value)
> {
>   //Write the 4 bytes into the eeprom memory.
>   EEPROM.write(address    ,  (value & 0xFF) );
>   EEPROM.write(address + 1, ((value >> 8) & 0xFF) );
>   EEPROM.write(address + 2, ((value >> 16) & 0xFF) );
>   EEPROM.write(address + 3, ((value >> 24) & 0xFF) );
> }
>
> long EEPROMReadlong(long address)
> {
>   long value = 0;
>   value   =  EEPROM.read(address);
>   value  |= (EEPROM.read(address + 1)<<8);
>   value  |= (EEPROM.read(address + 2)<<16);
>   value  |= (EEPROM.read(address + 3)<<24);
>   return value;
> }

Tipp:
Sowas muss man mit Arduino nicht tun!

Denn so gehts auch:
1
#include <EEPROM.h>
2
long value = 4711L;
3
4
struct 
5
{
6
  long value;
7
  // hier weitere Dinge im EEPROM
8
} EEMEM imEEPROM;
9
10
11
// in einer Funktion:
12
EEPROM.put((int)&imEEPROM.value,value); // schreiben
13
EEPROM.get((int)&imEEPROM.value,value); // lesen
Die Adressberechnung kann man so dann auch noch dem Kompiler überlassen

von Thomas (Gast)


Lesenswert?

>ICH würde bei einer passenden Stromversorgung nebst ordentlicher
>Verkabelung mit passenden Querschnitten anfangen. Das ist das A und O.
>Von da aus kann man dann weiter machen.

Querschnittswunsch? ich meine Telefonkabel sollten für die kleinen Stöme 
die der µC liefert reichen - wenn nicht wären sie schon längst 
verschmort


>Ein schlecht beschalteter Eingang/Sensor liefert durch anlaufende Motoren 
>falsche Daten ans Programm. Programm macht daraufhin Unsinn.

Ich bin der Meinung dass ich das so ausschließen kann. Es ist zwar 
absolut richtig, dass der µC vorallem beim anlaufen Signale erhält - das 
ist aber der Grund warum nicht auf die erste fallende Flanke der 
Taster/Schalter geschaltet wird.

Da mein code anscheinend Pfusch ist, möchte ich zu meiner Verteidigung 
sagen, dass ich mir Programmieren selbst beigebracht habe (klar sieht 
man dass, aber die meisten hätten vermutlich schon lange aufgegeben)

>Es gibt auch lokale Variablen
habe einmal gehört, dass so ev. einige Variablen doppelt angelegt werden 
und dann die flasche ausgelesen werden kann. und ich sah keinen Nachteil 
alle Variablen einfach zu machen. lieg ich da Falsch?





vor wenigen Stunden getestet - Alle motoren von den Schützen abgeklemmt 
und alles Funktioniert wie am Schnürchen. ankelemmt = gleiches Problem
>Vermutlich hast du ein EMV-Problem
bin seither auch der Meinung, aber kann es sein, das µC dadurch in 
irgendwelche Zeilen hüpft? und wie schirme ich die am besten ab?

von derjaeger (Gast)


Lesenswert?

>dass ich mir Programmieren selbst beigebracht habe

Mein Professor sagte zu mir, dass JEDER Mensch auf der Welt 
programmieren kann. >>*Gute<< (effiziente) Programmierer findet man aber 
selten.

Dein Code ist sehr unübersichtlich. Wenn ich in deinem Code "den einen 
Fehler" suchen müsste der das alles verursacht was dir passiert dann 
würde ich nach einer halben Stunde das Handtuch schmeissen aus Frust und 
Verzweiflung weil dein Code nicht systematisch durchgearbeitet werden 
kann. Ich würde mich ständig im Kreis drehen. Daher bringt es hier gar 
nichts den Quellcode anzuhängen, da sich niemand durcharbeiten wird.

Es besteht nur aus haufenweisen if-Abfragen: sowas ist als 
Spaghetti-Code bekannt.


*"gut": Strukturiertes Programmieren, effizent, gut dokumentierter Code 
(Variablennamen, Kommentare), einfache Portabilität, erweiterbar und 
wartbar durch Dritte (z.B. Mitarbeiter aus einem Unternehmen wenn man 
z.B. krank ist) ohne notwendige Einweisung in den Code durch dich selber

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Thomas schrieb:
>>Vermutlich hast du ein EMV-Problem
> bin seither auch der Meinung, aber kann es sein, das µC dadurch in
> irgendwelche Zeilen hüpft?

 µC kennt keine Zeilen, kann also auch keine überspringen.


>  und wie schirme ich die am besten ab?

 Metal Gehäuse für Arduino Board.
 Abgeschirmte Kabel (und ordentlich verlegen).
 Elkos und Entstörkondensatoren verwenden.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Thomas schrieb:
> Querschnittswunsch? ich meine Telefonkabel sollten für die kleinen Stöme
> die der µC liefert reichen - wenn nicht wären sie schon längst
> verschmort

Es geht nicht um die Belastbarkeit der Leitungen, sondern um den 
Spannungsabfall.

Fehlfunktion sind zu erwarten, wenn GND Pegel zwischen Modulen um mehr 
als 0,5V unterschiedlich sind, weil die Pegel von digitalen Signalen aus 
Sicht des Empfängers um eben diesen Wert vom Soll abweichen.

Wenn der Sender z.B. LOW mit 0,2V sendet und das GND Potential des 
Empfängers um 0,5V nach unten verschoben ist, das "sieht" dieser ein 
Signal mit 0,7V, was er unter Umständen nicht mehr zuverlässig als LOW 
verarbeitet.

Dazu kommt, das Spannungen unterhalb von GND und oberhalb von VCC ab 
einer gewissen Stromstärke einen Latch-Up Effekt auslösen können. Der 
betroffene Eingang blockiert sich dann selbst und es fliesst so lange 
ein erhöhter Strom, bis die Stromversorgung unterbrochen wird. Manche 
Chips gehen dabei kaputt, andere erwärmen sich nur harmlos.

Dabei kommt es nicht nur auf den Gleichtstrom an, sondern auch auf HF 
Anteile, die dazu überlagert sind. Für HF ist jede Leitung wesentlich 
hochohmiger, als für Gleichstrom. Eine verdrillte Telefonleitung hat zum 
Beispiel einen Wellenwiderstand von ca. 100 Ohm! Da kann schon der 
Lichtbogen einer startenden Leuchtstoffröhre ganz erhebliche Spannung 
induzieren.

von derjaeger (Gast)


Lesenswert?

>Alle motoren von den Schützen abgeklemmt und alles Funktioniert wie am Schnürchen


Wäre ja alles zu einfach auf der Welt wenn der Betrieb im Feld genauso 
wäre wie im störungsfreien Labor.

Nicht umsonst geben Unternehmen tausende Euros aus für EMV-Prüfungen um 
ein "CE-Zeichen zu bekommen und das Produkt auf dem Markt vertreiben zu 
dürfen.

Ja: Du hast ein enormes EMV-Problem und EMV ist Voodoo und kann man 
nicht aus Büchern lernen, sondern erfordert jahrelange 
Praxis-Erfahrungen.

von Stefan F. (Gast)


Lesenswert?

Die Grundlagen des EMV Voodoos kannst du hier nachlesen: 
https://www.sieb-meyer.de/tl_files/media/Produkte/Downloads/EMC_EMV/Deutsch/EMV_Geraeteaufbau.pdf

Danach kommt die Erfahrung.

von Falk B. (falk)


Lesenswert?

Thomas schrieb:

>>Ein schlecht beschalteter Eingang/Sensor liefert durch anlaufende Motoren
>>falsche Daten ans Programm. Programm macht daraufhin Unsinn.
>
> Ich bin der Meinung dass ich das so ausschließen kann.

1. Fehler!

Siehe Fehlersuche

>>Es gibt auch lokale Variablen
> habe einmal gehört, dass so ev. einige Variablen doppelt angelegt werden
> und dann die flasche ausgelesen werden kann. und ich sah keinen Nachteil
> alle Variablen einfach zu machen. lieg ich da Falsch?

Du liegst falsch. Think global, act local ist auch bei der 
Programmierung das Mittel der Wahl. Dadurch verhindert man 
Unübersichtlichkeit und komische Quereffekte. Man sollte möglichst 
wenige, globale Variablen nutzen.

> vor wenigen Stunden getestet - Alle motoren von den Schützen abgeklemmt
> und alles Funktioniert wie am Schnürchen. ankelemmt = gleiches Problem
>>Vermutlich hast du ein EMV-Problem
> bin seither auch der Meinung, aber kann es sein, das µC dadurch in
> irgendwelche Zeilen hüpft?

Kann sein, ist hier aber eher nicht der Fall.

> und wie schirme ich die am besten ab?

Du mußt erstmal eine systematische Fehlersuche betreiben, ehe du da 
was "abschirmen" kannst. EMV ist zwar logisch, aber trotzdem komplex. 
Man muss erstmal rausfinden, an welcher Stelle die böse Störung 
zuschlägt. Bei Einschalten oder Ausschalten welches Motors? Dann kann 
man weiter suchen, wie die Störung einkoppelt. Viele Sachen sind 
leitungsgebunden, da hilft eine Blechdose so gut wie gar nicht. Es kann 
aber auch ein Motor sein, der durch seinen Anfahrstrom ein Netzteil kurz 
in die Knie zwingt. Dann macht deine CPU einen Reset und rennt wieder 
vom Anfang los. Wenn du 230VAC bzw. 400VAC Motoren direkt mit Schützen 
schaltest, wirst du wohl auch Snubber brauchen, denn ohne die funkt 
es schon ganz ordentlich.

von Falk B. (falk)


Lesenswert?

Stefanus F. schrieb:
> Dabei kommt es nicht nur auf den Gleichtstrom an, sondern auch auf HF
> Anteile, die dazu überlagert sind. Für HF ist jede Leitung wesentlich
> hochohmiger, als für Gleichstrom. Eine verdrillte Telefonleitung hat zum
> Beispiel einen Wellenwiderstand von ca. 100 Ohm! Da kann schon der
> Lichtbogen einer startenden Leuchtstoffröhre ganz erhebliche Spannung
> induzieren.

Kaum. Denn gerade verdrillte Leitungen haben sehr kleine effektive 
Querschnittsflächen. Du malst mal wieder den Teufel an die Wand.

von Stefan F. (Gast)


Lesenswert?

Falk B. schrieb:
> Stefanus F. schrieb:
>> Dabei kommt es nicht nur auf den Gleichtstrom an, sondern auch auf HF
>> Anteile, die dazu überlagert sind. Für HF ist jede Leitung wesentlich
>> hochohmiger, als für Gleichstrom. Eine verdrillte Telefonleitung hat zum
>> Beispiel einen Wellenwiderstand von ca. 100 Ohm! Da kann schon der
>> Lichtbogen einer startenden Leuchtstoffröhre ganz erhebliche Spannung
>> induzieren.
>
> Kaum. Denn gerade verdrillte Leitungen haben sehr kleine effektive
> Querschnittsflächen. Du malst mal wieder den Teufel an die Wand.

Ich bezog mich auf unsymmetrisch betriebene Leitungen, zum Beispiel eine 
für GND und die andere für das Signal. Hätte ich hinschreiben sollen.

Und nein, ich male den Teufel nicht an die Wand. Meine Hobbyschaltungen 
haben bisher alle tadellos viele Jahre lang funktioniert - auch in 
Industrie-Anlagen. Keine einzige wurde je reklamiert. Denn ich habe 
diesen EMV Kram vor 30 Jahren in einer ordentlichen Berufsausbildung 
gelernt und einigermassen korrekt angewendet.

Wie krass sich schlechte Masseführung auswirken kann, könnt ihr in 
diesem Thread in Bildern sehen: 
Beitrag "Oszi Tastkopf <> Schaltungsmasse"
Oder auch hier: Beitrag "Fehler im Datenblatt oder schlechte Messung?"

von Thomas (Gast)


Lesenswert?

Falk B. schrieb:

> Bei Einschalten oder Ausschalten welches Motors?

Beim Karussell Motor nur beim einschalten (400VAC 0,2kW) und beim 
Schneckmotor beim Ausschalten (400VAC 0,5kW)

von Frank S. (sauttefk)


Lesenswert?

Wie wärs mit galvanischer Abtrennung deiner Eingänge z.B mit 
Optokopplern oder Koppelrelais um dein offensichtliches EMV-Problem zu 
lösen.

von Falk B. (falk)


Lesenswert?

Frank S. schrieb:
> Wie wärs mit galvanischer Abtrennung deiner Eingänge z.B mit
> Optokopplern oder Koppelrelais um dein offensichtliches EMV-Problem zu
> lösen.

Jaja, der Optokopplerwahn mal wieder. Der Heilsbringer schlechthin. Was 
für ein Irrtum!

Solange der Koppelpfad nicht mal ansatzweise nachgewiesen ist, ist das 
alles nur ein Schuß ins Blaue.

von Falk B. (falk)


Lesenswert?

Thomas schrieb:
> Falk B. schrieb:
>
>> Bei Einschalten oder Ausschalten welches Motors?
>
> Beim Karussell Motor nur beim einschalten (400VAC 0,2kW) und beim
> Schneckmotor beim Ausschalten (400VAC 0,5kW)

Was zum Geier ist ein Schneckmotor? Einer der Firma Schneck?

Nun, da kommen wir der Sache schon mal näher.
Zunächst sollte man prüfen, ob der uC einen Reset hinlegt. Das geht 
einfach, indem man zum Start einen Text per UART ausgibt "Hallo Reset" 
oder die LEDs in einer eindeutigen Weise schaltet bzw. blinken läßt.

Wenn das nicht der Fall ist, wird es wohl in eine Signalleitung 
reinspucken und falsche Signale vorgaukeln. Hier spielen 3 Dinge eine 
Rolle.

1.) Leitungs- und Masseführung; dafür braucht es einen Verdrahtungsplan, 
ggf. auch eine Skizze des realen Aufbaus mit ein paar Längenangaben (1m 
Sensorkabel oder 10m Sensorkabel?) Zu jedem Taster/Schalter etc. muss 
sowohl das Signal aus auch die zugehörge Masse direkt hingehen! Wenn man 
da die Masse spart und über mehrere Taster zieht, die weit verteilt sind 
(>20cm), spannt man sich Koppelschleifen auf, in die Störungen gut und 
gern einkoppeln.

2.) Eingangsfilter auf deiner Schaltung (Hardware), -> Schaltplan; Auf 
deinem Schaltkastenbild sehe ich nur ein winziges Stück 
Lochrasterplatine mit fast nix drauf und Kabelsalat. Da fehlt mindestens 
ein gescheiter RC-Filter für jeden Sensor/Tastereingang. Der macht dann 
auch gleichzeitig eine Entprellung. Der Pull-Up R1 sollte eher 
niederohmig sein, so 1-5k.

https://www.mikrocontroller.net/articles/Entprellung#Einfacher_Taster

3.) Entprellung per Software. Deine Software sehen wir, wenn gleich 
nicht wirklich durch 8-0

Weiterhin hilft es ungemein, wenn der Steuerungsablauf durch eine 
gescheit aufgebaute, lesbare Statemachine gebildet wird. Denn dann 
sieht man sofort, daß diese wegen der falschen Signale in den falschen 
Zustand springt. Dabei sollte man mit einem enum arbeiten, welcher mit 
sinnvollen Namen die States benennt, dann braucht man nämlich keine 
zusätzlichen Kommentare. Siehe Artikel Statemachine.

von gdfgsdgsg (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Tipp:
> Sowas muss man mit Arduino nicht tun!
>
> Denn so gehts auch:#include <EEPROM.h>
> long value = 4711L;
>
> struct
> {
>   long value;
>   // hier weitere Dinge im EEPROM
> } EEMEM imEEPROM;
>
> // in einer Funktion:
> EEPROM.put((int)&imEEPROM.value,value); // schreiben
> EEPROM.get((int)&imEEPROM.value,value); // lesen
> Die Adressberechnung kann man so dann auch noch dem Kompiler überlassen

 ^^
ok das es das schon fertig gibt war mir nicht bewusst.
kenne die arduino umgebung nur von unseren Praktikanten
die kommen damit recht brauchbar klar.

von Falk B. (falk)


Lesenswert?

Noch ein Tipp zur Software. Du musst die einzelnen Aufgaben in einzelne 
Funktionen auslagern. Dabei ist es wichtig, daß diese Funktion nur das 
machen, was sie WIRKLICH sollen. D.h. ein Funktion zur Entprellung tut 
eben nur das und greift NICHT in den Steuerablauf ein! Diese Funktion 
entprellt nur die Eingänge und gibt sie entprellt über Variablen weiter! 
Das gleiche für deinen Befehlsdekoder am UART. Nur die Ablaufsteuerung 
in Form einer FSM steuert die Ausgänge und greift dabei auf die 
entprellten Eingänge und dekodierten Befehle zu! Deine Loop() sieht dann 
ca. so aus. Den Watchdog brauchst du nicht, das ist nur ein Würg-Around 
für schlechte Software.
1
void loop() {
2
  UART_COM();
3
  Entprellung();
4
  Verarbeitung();
5
}

Diese einzelnen Funktionen könnte man sogar in einzelne .cpp Files 
stecken, wie es bei Profis gemacht wird.

von Edson (Gast)


Lesenswert?

Marc V. schrieb:
> Metal Gehäuse für Arduino Board.
>  Abgeschirmte Kabel (und ordentlich verlegen).
>  Elkos und Entstörkondensatoren verwenden.

So einfach kann das sein, muss aber nicht ;)

Generell ist es im günstigsten Fall die zweitbeste Idee, eine 
empfindliche Stelle zu schirmen. Besser ist es, eine Störung dort zu 
bekämpfen, wo sie entsteht. Beides ist aber ohne Erfahrung wenig 
aussichtsreich und es macht MMN erst recht keinen Sinn, den TO jetzt zu 
Experimenten mit Kondensatoren zu animieren.

Und ein Metallgehäuse mag schön und oft sinnvoll für HF-Baugruppen sein, 
ist aber nicht nötig für ein Controllerboard.

von Thomas (Gast)


Lesenswert?

Falk B. schrieb:
> Was zum Geier ist ein Schneckmotor?

ein Motor mit Schneckengetriebe (Umgangssprache)

Falk B. schrieb:
> Nun, da kommen wir der Sache schon mal näher.
> Zunächst sollte man prüfen, ob der uC einen Reset hinlegt. Das geht
> einfach, indem man zum Start einen Text per UART ausgibt "Hallo Reset"
> oder die LEDs in einer eindeutigen Weise schaltet bzw. blinken läßt.

Nein, er führt keinen Reset durch. - er verändert nur einzelne 
Variablen(ohne Code davor bzw danach auszuführen) kann es sein, dass 
durch EMV der Speicher des Arduinos Variablen verändert/kippt?

Falk B. schrieb:
> Wenn das nicht der Fall ist, wird es wohl in eine Signalleitung
> reinspucken und falsche Signale vorgaukeln

Wenn mir ausschließlich NUR der "Stoptaster" Probleme bereitet, kann der 
"Fehler" trotzdem auch bei anderen Signalleitungen liegen?

von Cyblord -. (cyblord)


Lesenswert?

Thomas schrieb:
> Nein, er führt keinen Reset durch. - er verändert nur einzelne
> Variablen(ohne Code davor bzw danach auszuführen) kann es sein, dass
> durch EMV der Speicher des Arduinos Variablen verändert/kippt?

Unsinn. Nein das kann NICHT sein.

Jetzt strukturiere dein Programm mal ordentlich und stell es hier 
nochmal, als Code nicht als Bild, ein. Dann kann man auch was dazu 
sagen.

: Bearbeitet durch User
von Thomas (Gast)


Lesenswert?

Thomas Kloiber schrieb:
> Während des Melkbetriebes bleibt das Karussell manchmal einfach
> stehen und de LED leuchtet blau. um das Karussell aber wieder wegfahren
> zulassen muss der Stoptaster aber 2 mal gedrückt werden statt nur einmal

Da dass anscheinend von Bedeutung ist, muss man "manchmal" auf "manchmal 
ABER NUR beim ausschalten des Motors mit Schneckengetriebe" ändern. 
(blieb in den letzten Tagen ca 20 mal stehen, dabei wurde der Motor 
150mal Ein/Aus geschalten)

2 mal gedrückt heißt, dass der Arduino kein LOW an der Signalleitung vom 
Stoptaster erhalten hat - sonst müsst man nur einmal drücken, um wieder 
loszufahren

von Cyblord -. (cyblord)


Lesenswert?

Du solltest dir auch mal klar machen welche globalen Zustände dein 
Controller intern überhaupt verwalten muss. Diese kannst du dann auch 
einfach mal dauernd über UART ausgeben. Damit siehst du, was der 
Controller so denkt was da draussen eigentlich abgeht.

Aber auch dafür muss man sich erst mal im Kopf und dann im Code etwas 
ordnen.

Schon mal eine Zustandsdiagramm gesehen? Kannst du so was für deine 
Anlage malen?

von Stefan F. (Gast)


Lesenswert?

Thomas schrieb:
> kann es sein, dass durch EMV der Speicher des Arduinos
> Variablen verändert/kippt?

Kann sein, ist aber sehr unwahrscheinlich. Ich würde zuerst alle anderen 
möglichen Ursachen in Betracht ziehen.

von Udo S. (urschmitt)


Lesenswert?

Thomas schrieb:
> NUR beim ausschalten des Motors

Klingt nach EMV-Problem durch induktive Störungen.

Hast du Snubber an deinen Relais verbaut?


Ist das eigentlich deine Eigenkonstruktion und gehörend die Ziegen dir 
oder hast du das verkauft?

von Thomas (Gast)


Lesenswert?

Udo S. schrieb:
> Hast du Snubber an deinen Relais verbaut?

Nein, habe habe ich nicht - lediglich das Relais Shield mit einem 
zweiten Netzteil versorgt.

Udo S. schrieb:
> Ist das eigentlich deine Eigenkonstruktion und gehörend die Ziegen dir
> oder hast du das verkauft?

Ja, Eigenkonstruktion für Zuhause - alles was irgendwie mit Strom zu tun 
hat habe ich (18 Jahre) gemacht bzw. war vorher schon.

von Cyblord -. (cyblord)


Lesenswert?

Thomas schrieb:
> Udo S. schrieb:
>> Hast du Snubber an deinen Relais verbaut?
>
> Nein, habe habe ich nicht - lediglich das Relais Shield mit einem
> zweiten Netzteil versorgt.

Warum gönnst du dir nicht eine Logo oder S7-1200 und ein paar richtige 
Hutschienenrelais und ein Industrienetzteil und machst diesem Graus ein 
Ende?
So eine Mini-SPS wurde genau für Leute erfunden die nur so programmieren 
können wie du. Also gar nicht.

Ein Arduino-Relais-Shield in so einen Schaltschrank auf ne Hutschiene 
gedübelt ist echt nicht schön.
Schau dir doch mal die obere Hälfte an und vergleiche mit der unteren 
Hälfte.
Oben professionell, unten Bastler-Pfusch. Willst du das wirklich? Willst 
du das in 5 Jahren nochmal durchschauen wenn da irgendwas nicht mehr 
geht (Falls du es jemals zum laufen bekommst.)?

Was ist wenn sich das mal ein Fachmann anschauen muss weil du gar keine 
Zeit mehr hast oder im KH liegst oder sonst was?

Das ist doch kein Jugend-Forscht Projekt, das soll doch wohl über 
längere Zeit zuverlässig laufen und wird ja wohl gewerblich genutzt.

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

Thomas schrieb:

>> Was zum Geier ist ein Schneckmotor?
>
> ein Motor mit Schneckengetriebe (Umgangssprache)

Dachte ich mir schon.

> Nein, er führt keinen Reset durch. - er verändert nur einzelne
> Variablen(ohne Code davor bzw danach auszuführen)

Naja, bei dem Kauderwelsch von "Struktur" ist das keine Kunst

> kann es sein, dass
> durch EMV der Speicher des Arduinos Variablen verändert/kippt?

Theoretisch möglich, praktisch aber eher SEEEEEHR Unwahrscheinlich. Denn 
einzelne Bits kippen eher bei ionisierender Strahlung als bei EMV.

>> Wenn das nicht der Fall ist, wird es wohl in eine Signalleitung
>> reinspucken und falsche Signale vorgaukeln
>
> Wenn mir ausschließlich NUR der "Stoptaster" Probleme bereitet, kann der
> "Fehler" trotzdem auch bei anderen Signalleitungen liegen?

Kann sein.

von Falk B. (falk)


Lesenswert?

Was kann man machen? Man baue sich ein minimales Testprogramm, das im 
1-10s Takt den "Schneckmotor" ein- und aus schaltet. Im gleichen 
Programm muss dann auch der GLEICHE Code zur Entprellung der Eingänge 
laufen, auch wenn die Ergebnisse nicht weiter verwendet werden. Dann 
sieht man aber, in welche Eingänge was reinkoppelt. Dazu braucht man 
aber eine Funktion zur Entprellung, die wie schon geschrieben NUR 
entprellt und nicht weiter direkt in die Steuerung reingreift.

von Otto (Gast)


Lesenswert?

Hallo Thomas,

aus meiner Sicht gibt es ein paar augenscheinliche Mängel:

Es fehlen RC-Glieder zur Entstörung der Schützspulen. Ohne diese kann 
bereits das Ein- und Ausschalten der Schütze Probleme verursachen.

Es fehlen wahrscheinlich auch 3-phasige Motorentstörglieder.

Es fehlt ein Steuertrafo, welcher bei Verwendung von mehr als einem 
Schütz zwingend vorgeschrieben ist. Hier hast du weiterhin das Problem, 
dass jeder Spike, welcher durch das Schalten der Motoren entsteht, ohne 
jede Dämpfung in das Netzteil des Arduino einkoppelt.

Wahrscheinlich hast du die Taster Melkbetrieb, Zurück und Stop direkt 
mit 5V beschaltet und auf die Eingänge des Arduino geführt. Dies ist 
aber deshalb ungünstig, weil die Leitungen wie Antennen wirken und die 
Störimpulse bis zu den Eingängen gelangen. Obwohl die Kollegen oben 
anderer Meinung sind, solltest du die Taster mit 24V beschalten und über 
Interfacerelais oder Optokoppler auf den Arduino führen, dann hast du 
diese Fehlerursache sicher ausgeschlossen.

Wurde für den Stopp-Taster ein Öffner verwendet? Ausser das dies eine 
Vorschrift (Drahtbruchsicher) ist, hat es noch weitere Vorteile.

Wie wurde der Personenschutz (Bedienpersonal) und der der Tiere 
realisiert? Sind z. B. Sicherheitseinrichtungen gegen Quetschung 
vorhanden? Ich sehe weiterhin weder Not-Aus-Taster für den Gefahrenfall 
noch einen Hauptschalter.

Viel Glück und Grüße
Otto

von Thomas (Gast)


Lesenswert?

Falk B. schrieb:

> Man baue sich ein minimales Testprogramm, das im
> 1-10s Takt den "Schneckmotor" ein- und aus schaltet.

Danke für den Tipp, werde ich morgen machen.

Habe den Arduino heute den ganzen Tag lang mit Metall abgeschirmt und es 
gab keine Probleme - kaum klemmte ich die Erdung von der Schirmung ab 
hüpfte die Variable auf 1..

Cyblord -. schrieb:
> Du solltest dir auch mal klar machen welche globalen Zustände dein
> Controller intern überhaupt verwalten muss. Diese kannst du dann auch
> einfach mal dauernd über UART ausgeben.

Es verändert sich NUR die StopVariable - alle anderen machen was sie 
sollen.

Das gleiche Programm läuft übrigens seit vorgestern wieder in meiner 
Wohnung (klar ohne Starkstromleitungen in der nähe) aber trotzdem ohne 
Probleme

von Falk B. (falk)


Lesenswert?

Thomas schrieb:
> Falk B. schrieb:
>
>> Man baue sich ein minimales Testprogramm, das im
>> 1-10s Takt den "Schneckmotor" ein- und aus schaltet.
>
> Danke für den Tipp, werde ich morgen machen.
>
> Habe den Arduino heute den ganzen Tag lang mit Metall abgeschirmt und es
> gab keine Probleme - kaum klemmte ich die Erdung von der Schirmung ab
> hüpfte die Variable auf 1..

Ahhhh, ich glaube dein Steckernetzteil ist schuld. Das hat nämlich keine 
Schutzerde. Die holst du dir zufällig irgendwo rein. Das ist aber 
schlecht. Du brauchst eine DIREKTE, SOLIDE Verbindung von der 
Arduino-Masse nach PE!
Ebenso dein 2. Netzteil für deine Relais. Diese Billig-China-Dinger sind 
sowieso ein schlechter Witz! Dort hat man Billigst-Relais verbaut, die 
einen sehr geringen Kriechweg zwischen Steueranschluß und 
Schaltkontakten haben. Mit dem Optokoppler meint man, die 
Isolationsfestigkeit zu erhöhen. Aber Murks bleibt Murks. Tu dir einen 
Gefallen und beschaff dir gescheite Relais mit ordentlichen Abständen. 
Dann braucht es auch keine Optokoppler und kein 2. Netzteil.

> Das gleiche Programm läuft übrigens seit vorgestern wieder in meiner
> Wohnung (klar ohne Starkstromleitungen in der nähe) aber trotzdem ohne
> Probleme

Nett, aber weniger als die halbe Wahrheit.

von Thomas (Gast)


Lesenswert?

Falk B. schrieb:
> Man baue sich ein minimales Testprogramm, das im
> 1-10s Takt den "Schneckmotor" ein- und aus schaltet.

Hab ich gerade 30min lang getestet (ohne PE anzuschließen, oder Bleche 
im Schaltkasten) - es wurden keine Variablen verändert. ich habe dem uC 
auch zählen lassen wie oft er verschiedene Eingänge als LOW erkennt - 
waren beim Stoptaster in den 30 min 75 Durchläufe - alle anderen lagen 
bei max 20.

Weiters habe ich gerade ein Mini Programm geschrieben, dass einfach in 
jeden Futterstand Futter hineinschmeißt (= Schneckmotor einschaltet), 
bin gespannt was sich dabei rausstellt.

von Falk B. (falk)


Lesenswert?

Thomas schrieb:
> Falk B. schrieb:
>> Man baue sich ein minimales Testprogramm, das im
>> 1-10s Takt den "Schneckmotor" ein- und aus schaltet.
>
> Hab ich gerade 30min lang getestet (ohne PE anzuschließen, oder Bleche
> im Schaltkasten) - es wurden keine Variablen verändert. ich habe dem uC
> auch zählen lassen wie oft er verschiedene Eingänge als LOW erkennt -
> waren beim Stoptaster in den 30 min 75 Durchläufe - alle anderen lagen
> bei max 20.

Wie ist das zu verstehen? Es wurden in 30min 75x LOW erkannt, obwohl 
keiner gedrückt hat? Ist das nicht eher ein Fehler?

> Weiters habe ich gerade ein Mini Programm geschrieben, dass einfach in
> jeden Futterstand Futter hineinschmeißt (= Schneckmotor einschaltet),
> bin gespannt was sich dabei rausstellt.

Ja, aber schließe erstmal PE sauber an deinen Arduino an! Siehe mein 
anderer Beitrag!

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Falk B. schrieb:
>> auch zählen lassen wie oft er verschiedene Eingänge als LOW erkennt -
>> waren beim Stoptaster in den 30 min 75 Durchläufe - alle anderen lagen
>> bei max 20.
>
> Wie ist das zu verstehen? Es wurden in 30min 75x LOW erkannt, obwohl
> keiner gedrückt hat? Ist das nicht eher ein Fehler?

 Ja, das würde mich auch interessieren.
 Pull-Up am Taster ?

 Frag doch mal die Taster in der Timer ISR ab und warte in loop() nur
 auf gesetzte Flags - ist übersichtlicher und sicherer auf jeden Fall.

 Für seriellen Empfang und Wiegand getrennte Funktionen vorsehen, in
 loop() nur eine Statemachine und schon wird es viel übersichtlicher.

von Tuxpilot (Gast)


Lesenswert?

Da gehen doch rot-schwarze Kabel vom Arduino zum Relais-Modul. Hast du 
damit die beiden Netzteile parallel geschaltet?

von Thomas (Gast)


Lesenswert?

Falk B. schrieb:
> Wie ist das zu verstehen? Es wurden in 30min 75x LOW erkannt, obwohl
> keiner gedrückt hat? Ist das nicht eher ein Fehler?

Ja, richtig verstanden

Marc V. schrieb:
> Pull-Up am Taster

Ja, sind 4k7 gegen 5V

von Falk B. (falk)


Lesenswert?

Thomas schrieb:
> Falk B. schrieb:
>> Wie ist das zu verstehen? Es wurden in 30min 75x LOW erkannt, obwohl
>> keiner gedrückt hat? Ist das nicht eher ein Fehler?
>
> Ja, richtig verstanden

Na immerhin ein eindeutiges Ergebnis!

Schließ PE an den Arduino an und test nochmal. Denn durch das 
undefinierte Massepotential am Arduino können die tollsten Dinge 
passieren, vor allem weil in den meisten dieser Netzteile 
Y-Kondensatoren von L und N gegen die Ausgangsmasse geschaltet sind. 
Dort huschen Störungen liebend gern drüber!

von Tuxpilot (Gast)


Lesenswert?

Versuch mal, die beiden Lüsterklemmen am Eurostecker zu tauschen. 
Dadurch geht der Y-Kondensator vielleicht ja an den Nullleiter, so dass 
das 50Hz Brummen nicht mehr in die Schaltung gerät. Übrigens: Das Foto 
sieht einfach geil aus!

Im Ernst: Hast du einen Schaltplan davon? Oder ein Blockschaltbild oder 
Prinzipzeichnung oder hingerotzte Skizze oder so?
Selbst etwas in dieser Art könnte schon ein wenig Klarheit bringen:
https://xkcd.com/730/
Und vielleicht entdeckst du beim Zeichnen ja selbst das Problem...

von Stefan F. (Gast)


Lesenswert?

Eingänge mit Taster und Schalter würde ich etwa so entstören:
1
        ____    100Ω         100nF
2
GND |----  ----[===]---+------||------|
3
                       |
4
                       |    4,7kΩ
5
                       +----[===]-----o 5V
6
                       |
7
                       |     47kΩ
8
                       +----[===]-----o µC Eingang

Der 47kΩ Widerstand schützt den µC vor Überspannung.

Jemand anders empfahl Optokoppler, das ist auch eine gute Lösung:
1
        _____    2,2kΩ     
2
24V o----   ----[===]------|>|------| GND
3
                         ______  
4
                          /  \
5
5V o---[===]--------+----/    \>----| GND
6
       4,7kΩ        |
7
                    +-----||--------| GND
8
                    |      100nF
9
                    |
10
                    o µC Eingang

Der Vorteil ist, dass du so die "empfindlichen" 5V von den externen 
Kabeln fernhalten kannst.

von Falk B. (falk)


Lesenswert?

Stefanus F. schrieb:

> Eingänge mit Taster und Schalter würde ich etwa so entstören:

Jaja, und noch so ein "Expertentip". Der Rest der Welt macht das anders, 
und das aus gutem Grund.

https://www.mikrocontroller.net/articles/Entprellung#Einfacher_Taster

Denn dann hat man einen echten Tiefpaß vor dem Eingang, der sowohl gegen 
HF als auch sehr gut gegen ESD schützt. Vor allem weil es immer ein 
hochohmiges Längselement gibt (R2) und ein HF-mäßig niederohmiges 
Querelement (C1). Und zwar genau DORT, wo es am wirksamsten ist, direkt 
am uC-Pin!

Aber das hast du ja alles schon vor langer Zeit in der Le(e)hre gelernt 
und immer wieder erfolgreich umgesetzt . . .

von Thomas (Gast)


Lesenswert?

Werden Bauernhöfe nicht durch Gewerbeaufsicht/BG überprüft?.
Wenn die den Schaltkasten sehen werden sie die Stilllegung veranlassen.

Bitte mach das neu.

Thomas

von Cyblord -. (cyblord)


Lesenswert?

Thomas schrieb:
> Werden Bauernhöfe nicht durch Gewerbeaufsicht/BG überprüft?.
> Wenn die den Schaltkasten sehen werden sie die Stilllegung veranlassen.

Die ordnen eher das komplette Niederbrennen an. Sicher ist sicher.

von Stefan F. (Gast)


Lesenswert?

Dafür gibt es eine simple Lösung: Schaltkästen mit undurchsichtigem 
Deckel :-)

von Thomas (Gast)


Lesenswert?

Falk B. schrieb:
> Schließ PE an den Arduino an und test nochmal.

hab ich Heute gemacht - waren deutlich weniger.. es wurde aber trotzdem 
noch 20x LOW erkannt

von Falk B. (falk)


Lesenswert?

Thomas schrieb:
> Falk B. schrieb:
>> Schließ PE an den Arduino an und test nochmal.
>
> hab ich Heute gemacht - waren deutlich weniger.. es wurde aber trotzdem
> noch 20x LOW erkannt

Na dann pack an die Eingänge eine Hardwareentprellung wie hier schon 
gefordert.

Beitrag "Re: Arduino Mega für Programm nicht richtig aus"

R1 = 4k7
R2 = 22k
C1 = 100nF

: Bearbeitet durch User
von Zeno (Gast)


Lesenswert?

Also wenn ich den Drahtverhau sehe möchte ich echt keine Ziege sein!

So etwas kann man auch ordentlich aufbauen.

Gerade bei Projekten wo Leistungselektronik und µC bzw. Logikschaltungen 
eingesetzt werden ist Spannungsversorgung und Kabelführung extrem 
wichtig. Längere Zuleitungen zu den Sensoren / Aktoren sollten geschirmt 
sein. Den Schirm nicht als Masseleitung benutzen, sondern nur einseitig 
mit Masse verbinden.
Nächste Sache ist die Stromversorgung. Logikschaltungen - auch der 
Arduino - sollten eine eigene Spannungsversorgung erhalten. Ob man da 
Hutschienennetzteile oder Steckernetzteile verwendet ist erst mal egal. 
Allerdings der Anschluß des Steckernetzteils mit Lüsterklemmen ist ein 
Nogo. Wenn man schon Steckernetzteile vorsieht, dann gehört da eine 
Hutschienensteckdose hin.
Den Relais würde ich eine eigene Stromversorgung spendieren.
Werden mehrere Sachen über eine Stromversorgung betrieben, dann sollte 
am Spannungseingang ein Elko und ein Kerko vorgesehen werden. In 
hartnäckigen Fällen kann man auch noch über eine Ferritdrossel in der 
Spannungszuführung nachdenken.
Bei großen induktiven Lasten (Motoren 400V/>0,1kW sind große induktive 
Lasten) können auch noch Netzfilter vor den Netzteilen für 
Logikeinheiten/µC erforderlich werden.
Die Leitungen der Sensoren werden auch nicht so wild wie bei Dir am 
Arduino angesteckt/geklemmt. Da sollte man über eine passende 
Interfaceplatte mit passenden Steckern oder Printklemmen nachdenken. Auf 
diese Interfaceplatte gehören dann auch alle für die Entstörung der 
Signale erforderlichen Bauelemente.

Wenn das dann alles klar ist, macht man sich erst mal einen ordentlichen 
Plan vom mechanischen Aufbau. Übrigens gibt es auch für den Arduino 
passende Hutschienengehäuse.


Zu Deinem Code: Ohne das ich ihn jetz bis ins Detail studiert habe sieh 
er schon etwas chaotisch aus und ich möchte dort nicht unbedingt 
Fehlersuche betreiben. Dein Code ist quasi unwartbar. Allerdings scheint 
das derzeit Dein geringstes Problem zu sein, da er ja nach Abklemmen der 
Verbraucher zu funktionieren scheint - Deine Aussage. Also bringe erst 
mal den elektrischen/mechanischen Aufbau in Ordnung.

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.