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:
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.
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.
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.
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.
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.
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