Kein definierter Pegel

Hallöchen

Ich habe mich recht intensiv über den Arduino belesen und dachte ich hätte alles soweit verstanden. Jetzt kam heute meine Bestellung und wollte direkt loslegen. Doch leider scheitere ich schon in den Anfängen.

Ich möchte einfach nur den Pegel an einem Port auswerten, den ich über einen Taster auf high lege. Das script ist ohne Schnickschnak und easy:

Ich initialisiere den PIN damit ich einen definierten Anfangslevel habe:

setup() {
Serial.beginn(9600);
pinMode(6, INPUT);
digitalWrite(6, LOW);
}

Und nun lasse ich den einfach laufen und lese den Zustand an der Konsole aus:

loop() {
Serial.println(digitalRead(6));
}

num würde ich erwarten das ich in der Konsole im normalzustand (nicht gedrückte Taste) eine Liste von 0 kommt und wenn ich den Taster betätige eine Liste von 1. Doch ich sehe im ungedrückten Zustand einen unregelmäßigen Wechsel von 0 auf 1. im gedrückten Zustand sehe ich die nur die einsen.

Nun meine Frage. Wie kann es sein das trotz Definition des Pins ein unbestimmter Pegel anliegt? Oder mache ich hier einen Fehler?

Für eure Mühe bedanke ich mich im voraus

Du kannst die internen Pullups mit INPUT_PULLUP aktivieren. Wenn du dann den Taster gegen Masse anschließt hast du gedrückt LOW

Interne Pulldowns gibt es nicht. Deshalb geht dein Code nicht. Pulldownwiderstände sind in der Elektronik generell selten, auch wenn sie von Arduino-Anfängern gerne verwendet werden

Und wenn Du den Pin per Programm auf LOW schaltest und dann mit dem Taster an 5 Volt legst hast Du diesen Ausgangspin möglicherweise schon zerstört.

Hallo,

in der IDE gibts unter Beispiele viel zu lernen

unter anderem schau dir das mal an

Beispiel Digital Button

Beispiel Button

Ok ... Port ist noch i.O. Mit pullup und Low-Level funktioniert es. Danke!

Hast du das "Warum" denn auch verstanden ?

Ulli

Hi

setup() {
Serial.beginn(9600);
pinMode(6, INPUT);
digitalWrite(6, LOW);
}

Dein digitalWrite macht hier NICHT, was Du Dir denkst.
Wenn der Pin ein INPUT ist, schaltest Du mit digitalWrite den PullUp-Widerstand AN oder AUS.
In diesem Fall hast Du den PullUP AUS geschaltet.
Durch die Definition als INPUT, war Dieser aber bereits aus.
Hättest Du digitalWrite(6,HIGH); geschrieben, wäre der PullUP AN gewesen und Du hättest 5V am offenen Pin.

ACHTUNG:
Als INPUT kannst Du diesen Pin auf GND ziehen und liest dann ein LOW ein - ist auch genau so geplant!
Wenn der Pin jedoch ein OUTPUT ist, wird nicht der PullUP geschaltet, sondern der Ausgang treibt aktiv 5V - wenn Du Diese auf GND ziehst, stirbt der Arduino (mindestens dieser Pin).

Wenn Du den PullUP einschalten willst, geht Das im setup() auch mit
pinMode(6,INPUT_PULLUP);
Das schaltet den Pin (vom Start-Zustand Inpul, PullUp aus) auf Input, PullUp AN.

Man kann die Definition auf INPUT auch weglassen, da Das der Start-Zustand JEDES Pin am Arduino ist, Der ein INPUT sein kann.
Spätestens bei INPUT_PULLUP oder OUTPUT musst Du aber die Pinne zuweisen.

Gewöhne Dir auch an, keine 'magic numbers' also irgendwelche Nummern, Die keine Erklärung haben, im Code zu verwenden.
Deine 6 sol lDein Taster-Pin sein - dann benenne Ihn auch so - ganz oben, noch vor setup()

const byte TasterPin=6;  //Pin, an Dem der Taster angeschlossen wird. LOW-Aktiv
...
setup(){
pinMode(TasterPin,INPUT_PULLUP);
}
...
loop(){
if (digitalRead(TasterPin)==LOW){
  //Taster ist gedrückt
  ...
}

const: Konstanter Wert, ändert sich NIE, der Kompiler kann mit diesem Wert machen, was Er will (also optimieren)
byte: Zahlenbereich 0...255 - so viele Pinne hat der Arduino dann doch nicht, hier reicht ein BYTE
TasterPin: Der Name. Großbuchstabe=fester Wert, CamelCase
=6; :Dem 'TasterPin' wird der Wert 6 zugewiesen.

MfG