Analog-Input als Digital-Input

Hallo,
ich muss bei meinem Uno auf die Analog-Eingänge zurückgreifen, um Digitaleingänge zu konfigurieren, da das Arduino L293D Motor Driver Shield eigentlich alle digitalen belegt hat.
Wäre kein Problem für mich, ich kann auf Analog-In in diesem Falle verzichten. Aber: Es geht nichts. Ich habe den A2 mit einem 10k-Pullup auf 5V gesetzt und daran einen Taster, der den Eingang auf GND zieht. Messtechnisch ist das nachgewiesenermaßen auch der Fall.
Der Minimalcode:

void setup() {

pinMode(A2, INPUT);

Serial.begin(115200);

}

void loop() {
  if (!A2){
    Serial.println("One Step");
  }

}


Den Pullup habe ich verwendet, weil ich gelesen habe, dass die Anweisung INPUT_PULLUP bei Analogeingängen nicht funktionieren würde.
Aber wie geschrieben, es kommt kein Ausdruck auf dem Serial-Monitor und auch andere Dinge in dieser IF-Anweisung gehen nicht. Entweder wird das A2 nicht korrekt erkannt oder was auch immer. Im Moment habe ich keine Idee.
Grüße
Dieter

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Probier mal

 if (digitalRead(A2) == LOW) 
1 Like

Hallo Paul,

ja genau, das geht. Vielen Dank.
Anscheinend geht nur eine explizite Schreibart.
Sehr gut, danke.
Gruß
Dieter

Also Uno R3 Nano R3 haben am analogen Pins PullUP
Pull-up-Widerstände

Die analogen Pins verfügen außerdem über Pull-up-Widerstände, die genauso funktionieren wie Pull-up-Widerstände an den digitalen Pins. Sie werden aktiviert, indem Sie einen Befehl wie z. B. ausgeben

pinMode(A0, INPUT_PULLUP);  // set pull-up on analog pin 0

Beachten Sie jedoch, dass das Einschalten eines Pull-Ups Auswirkungen auf die von analogRead() gemeldeten Werte hat.

Deklariere stat A1 15 das ist als Digital der A1
A0= 14, A1=15, A2=16 usw.

Nein.
Das

 if (!digitalRead(A2))

geht auch.
Vergleiche mit Deiner Zeile und finde den Fehler.

Ja, die vereinfachte Schreibweise habe ich auch schon erfolgreich versucht. Und es stimmt auch das mit den Pullups, es geht auch ohne.
Danke. So funktioniert's wie gewünscht.

genau, zufällig Buchstaben tippen bringt nix.

Es gibt nur diese Schreibart.
Da gebe ich C recht daß

if (!A2){

nicht so funktioniert wie Du es Dir erwartest.

Hier wird der numerische Wert von A2 (müßte 15 sein, was TRUE entspricht) logisch invertiert (wird zu FALSE) und dann der bedingte Programmteil nicht ausgeführt.

Wenn Du den Zustand des Pins, und nicht die Pinnummer, mit etwas vergleichen willst, dann mußt Du schon den Zustand des Pins einlesen.
C ist sehr logisch aufgebaut, aber es gibt keine logischen Verbote, die dann zu einer anderen Funktionsweise bzw automatischen korrektur führen. Man muß schon das schreiben, was man scheiben will.

Es gibt da so Eigenheiten wie den Ternäre Opertor den man wenn man ihn nicht kennt, einen Wolf sucht:

Noch was zu den Pins.

Der Atmega328 auf dem UNO hat 20 Pins, die als Eingänge oder Ausgänge, mit oder ohne Pullupwiderstand definiert werden können. Viele Pins haben noch weitere Funktionen wie Serieller UART, I2C, SPI, Interrupteingang decodiert, genereller Interrupteingang, Analoger Eingang, PWM Ausgang, Ausgang der durch Timer oder Counter angesteuert werden kann, bzw eine Counter ansteuern kann (hab ich noch was vergessen?)
Theoretisch lassen sich der Reseteingang und die Quarzoszillatorpins auch umwidmen, um als digitale Pins verwendet zu werden. In der Hardware des UNO ist dies aber nicht sinnvoll, da sie beschaltet sind und teilweise nicht herausgeführt sind.

Der ATmega328 in SMD wie zB auf dem NANO oder einigen UNO SMD Versionen hat 2 Pins mehr (A6 und A7) die aber nur analoge Eingänge sind bzw nicht herausgeführt sind.

Grüße Uwe

Ja, alles verstanden. Danke.

Hallo bulova

Die Arduino-Funktion "digitalRead()" gibt ein "HIGH" oder "LOW" im Type INT zurück.

1 Like

Wohl eher 1 oder 0 ?

ArduinoCore-avr/cores/arduino/wiring_digital.c at master · arduino/ArduinoCore-avr · GitHub

HIGH oder LOW
ist aber müßig zu diskutieren.
Die einen halten sich an die Spezifikation (HIGH/LOW), die anderen machen halt irgendwelche Abkürzungen.

2 Likes

ist eine Präprozessorersetzung ArduinoCore-avr/cores/arduino/Arduino.h at 63092126a406402022f943ac048fa195ed7e944b · arduino/ArduinoCore-avr · GitHub

dann wäre es besser gewesen nicht damit anzufangen :wink:

1 Like

Das ist ein Widerspruch.
Eine Buchstabenfolge kann keine numerische vorzeichenbehaftete Variable mit 16 bit Größe (auf einem 8Bit Arduino) sein.
Ein String wäre ein Array von 4 bis 5 Byte ( 3/4 Buchstaben und 1 Byte Terminierung).
Andererseits wenn Du Serial.print(digitalRead(2)); schreibst bekommst Du 1 oder 0 zurück.

Intern wird mit Zahlen gearbeitet, für uns Lebewesen auf Kohlenstoffbasis sind "HIGH", "true", "LOW" oder "false" zulässig und werden im Preprozessor von der IDE in Zahlen umgewandelt.

Grüße Uwe

1 Like

Danke fürs like. (der Angesprochene weiß das schon daß er gemeint ist)

Ich beharre so auf Klarstellung, nicht weil ich mich wichtig machen will, sondern weil es wichtig ist, unerfahrenen Usern die Hintergrüne richtig zu vermitteln.
Grüße Uwe

3 Likes

Siehe Post#13.

In der Arduino-Referenz fehlt nur der Hinweis das "HIGH" oder "LOW" im Typ INT zurückgeben wird.

Ist eigentlich ganz einfach, eigentlich.

Falsch. Es wird 1 und 0 zurück gegeben. Was durch die Macros mit HIGH und LOW verglichen werden kann.

Gruß Tommy

1 Like

Akzeptiert.