Habe ich versehentlich die 4. Dimension programmiert?

hey leute :v:

ihr müsst mich mal aufklären und mir sagen was los ist ...

Eine, an den "elego mega 2560 r3", angeschlossene LED scheint eine eigenleben in der stromzufuhr entwickelt zu haben, nachdem ich ein, von "chat gpt" generierten sketch hochgeladen habe.

sie scheint irgendwie auf nähe zu reagieren, obwohl ich (neben 2 druckschaltern zum an- und ausschalten) keinerlei näherungssensoren oder sonstiges angeschlossen habe.

wenn ich mich auf ca 15 cm nähere, beginnt sie zu flackern, bei 14,5 cm ist das flackern stärker und bei 14,0 cm bis 0 mm ist die LED aus. innerhalb des bereiches zwischen 14 und 15 cm ist es so als könnte ich das flackern präzise, mit jedem millimeter näherung, verstärken und im gegensatz dazu mit jedem millimeter entfernung, verringern :flushed: :man_shrugging:

ich bin weder elektriker noch physiker und ich kann mir nur irgendwas mit "magnetfeld" vorstellen aber habe auch echt keinen plan !? :face_with_raised_eyebrow: könnt ihr euch/mir das erklären?

das schema ist folgendes:

und der mysteriöse sketch, dieser:

int pinLed     = 5;
int pinButtonA = 9;
int pinButtonB = 8;

void setup() {
  pinMode(pinLed, OUTPUT);
  pinMode(pinButtonA, INPUT);
  pinMode(pinButtonB, INPUT);
}

void loop() {
  int buttonStateA = digitalRead(pinButtonA);
  int buttonStateB = digitalRead(pinButtonB);

  // Wenn Button A gedrückt wird, schalte die LED ein
  if (buttonStateA == LOW) {
    digitalWrite(pinLed, HIGH);
    // Warte, bis der Button losgelassen wird, bevor du weitere Eingaben akzeptierst
    while (digitalRead(pinButtonA) == LOW) {
      // Warte, bis der Button losgelassen wird
    }
  }

  // Wenn Button B gedrückt wird, schalte die LED aus
  if (buttonStateB == LOW) {
    digitalWrite(pinLed, LOW);
    // Warte, bis der Button losgelassen wird, bevor du weitere Eingaben akzeptierst
    while (digitalRead(pinButtonB) == LOW) {
      // Warte, bis der Button losgelassen wird
    }
  }
}

Dein Problem sind die fehlenden PullDown-Widerstände an den Tastern. Bei offenen Tastern sind die Eingänge extrem hochohmig, und fangen jede Art von Störung auf und reagieren dann zufällig mal als HIGH und mal als LOW.

!! zur info am rande !!

int pinLed = 5;
int pinButtonA = 9;
int pinButtonB = 8;


void setup() 
{
  pinMode(pinLed, OUTPUT);
  pinMode(pinButtonA, INPUT_PULLUP);  
  pinMode(pinButtonB, INPUT_PULLUP);  
}

void loop() 
{
  if (digitalRead(pinButtonA) == LOW)
     {digitalWrite(pinLed, HIGH); }
  if (digitalRead(pinButtonB) == LOW)
     {digitalWrite(pinLed, LOW); }
}

das war der originale sketch, den ich abändern lassen habe, um die "input_Pullup" funktion zu vermeiden.

Warum? die wäre eine Gute Idee gewesen, dann hättest Du auch keine externen Widerstände gebraucht.

ach so, also liegt es an dem sketch aber was meinst du mit hochohmig?

der würde vermutlich auch funktionieren.

Eben nicht, sondern an der externen Beschaltung. Da fehlen eben Widerstände, die Du bei 'INPUT_PULLUP' nicht brauchst, weil da Widerstände intern im Chip verwendet werden.

Hmm, ein paar elektrische Grundlagen wären nicht schlecht...
Letzendlich wirken die Eingänge wie Antennen, die eben alle möglichen elektrischen Störfelder - magnetische und/oder elektrische Auffangen und dann als Eingangssignal fehlinterpretieren. Der Widerstand am Eingang leitet dieses Störungen ab.

weil ich gerade am lernen bin und nicht genau verstehe, warum der befehl benötigt wird :man_shrugging:

warum kann der pin "8" und "9" nicht einfach "low" sein und kurzzeitig auf "high" schalten so lange jeweils "button A" oder "button b" gedrückt wird? warum müssen sie stattdessen mit dem befehl "input_pullup" auf "high" gehalten werden?

meine schulphysik stellt sich das ungefähr so vor:
stromkreis von "button a" offen (nicht gedrückt) = kein strom fließt (also 0V oder "low")
stromkreis von "button b" offen (nicht gedrückt) = kein strom fließt (also 0V oder "low")
stromkreis von "button a" geschlossen (gedrückt) = strom fließt (also 5V oder "high")
stromkreis von "button b" geschlossen (gedrückt) = strom fließt (also 5V oder "high")

wenn "button a" gedrückt = pin "9" status von "0V/LOW" zu "5V/HIGH"
signaländerung von "low" zu "high" erkannt - setze pinLed "5" dauerhaft zu status "high"
wenn "button a" nicht gedrückt = pin "9" status zurück von "5V/HIGH" zu "0V/LOW"
signaländerung von "high" zu "low" erkannt - keine aktion / lasse pin "5" auf status "high"

wenn "button b" gedrückt = pin "8" status von "0V/LOW" zu "5V/HIGH"
signaländerung von "low" zu "high" erkannt - setze pinLed "5" dauerhaft zu status "low"
wenn "button b" nicht gedrückt = pin "8" status zurück von "5V/HIGH" zu "0V/LOW"
signaländerung von "high" zu "low" erkannt - keine aktion / lasse pin "5" auf status "low"

Ganz einfach: Deine Schulphysik ist unvollständig. Das was Du Dir vorstellst gilt bei niederohmigen Eingängen, wie etwa dem Schalter an einer Beleuchtungslampe aka Glühbirne, wo richtig Strom fließt.
Die Elektronik ist darauf ausgelegt, das in der Regel mit Spannungen gesteuert wird (Stromschleifen ausgeblendet) und dabei fast kein Strom fließt. Also genügen geringe Ladungsmengen auf den Eingängen(aus der Umgebung, den Händen usw.), um deren Zustand zu verändern. Deshalb muss im offenen Zustand (der Taster/Schalter hat nicht geschaltet) ein definierter Spannungswert(Pegel) auf den Eingang gelegt werden, damit der nicht zum Zufallsgenerator wird. Der interne PullUp mit Taster nach GND ist eine sinnvolle Variante dazu.
Taster gedrückt ist dann LOW.

Gruß Tommy

Wenn ich mich recht erinnere gehört zur Schulphysik auch das Ohmsche Gesetzt: U=RxI.
Der Eingangswiderstand der offenen Arduino-INPUTS ist sehr sehr hoch - fast wie Isolation. Da bewirken auch extrem geringe Ströme bereits eine nennenswerte Spannung, die als HIGH interpretiert wird. Und solche winzigen Ströme werden wie bei einer Radioantenne bereits durch das Umfeld erzeugt. Das wird dann auch durch deinen Körper/ die Hände beeinflußt.
'kein Strom fließt' gilt also nur bei grober Betrachtung - und die reicht durch die extrem hohen Eingangswiderstände halt nicht aus ...
Machst Du den Eingangswiderstand durch einen entsprechend geschalteten Widerstand kleiner, reicht auch die grobe Betrachtung wieder :sunglasses:

ja, da muss ich dir/euch leider recht geben! an unser "dorfschule" bestand physik/chemie leider nur aus grauer theorie und genau das experiment hatte ich vor augen als, ich diesen beitrag erstellte, da es traurigerweise wohl das spannendste, der maximal fünf durchgeführten experimente war.

bestimmt auch zu unserer ... wenn der physikunterricht aber daraus besteht, schüler jahrelang irgendwelche texte aus büchern oder arbeitsblättern abschreiben, lesen oder vorlesen zu lassen, ohne mal das ein oder andere experiment zur veranschaulichung oder motivation durchzuführen, kann man sich sicher sein, dass sich irgendwann auch der letzte % der, im physikraum anwesenden, gehirnmasse lediglich damit beschäftigt, die minuten und sekunden bis zum "pausengong" zu zählen. :joy:

wie auch immer ... eure antworten haben mir schon mal wieder ein stück weit weitergeholfen und mich neues lernen lassen :+1: irgendwie so etwas in der art habe ich mir schon gedacht aber war doch sehr verwundert, weil sich das flackern in wiederholten experimenten so exakt steuern ließ. als neuling erfreut man sich an nun mal an solchen sachen :sweat_smile: wie "edison" sich damals wohl gefühlt haben muss? :sweat_smile:

ich plane mich in zukunft wirklich intensiv mit dem arduino zu beschäftigen. welche/s "elektronik" skills und wissen muss ich mir dafür auf jeden fall zulegen?

Als Einstieg/Nachschlagewerk kann ich Dir das Elektronik-Kompendium empfehlen.

Gruß Tommy

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.