Logisches UND, Einsteiger

Hallo, ich habe mich gerade angemeldet und bin ein Einsteiger!

Und schon habe ich 2 Fragen:

  1. Gibt es hier keine Rubriken?
  2. Ich möchte mit dem Multifunction Shield vom Uno eine UND-Verknüpfung ausprobieren und bin kurz vor dem Verzweifeln - wer gibt mir da einen Tipp? Wenn die beiden Taster S1 und S2 (fest verdrahtet an A1 und A2) betätigt werden, soll die LED D1 auf dem Board (verdrahtet mit Digital-Ausgang 13) leuchten.
    So bekomme ich das NICHT zum Laufen:

#define S1 digitalRead (A1)
#define S2 digitalRead (A2)
#define D1 13

void setup() {
// put your setup code here, to run once:

pinMode (A1, INPUT);
pinMode (A2, INPUT);
pinMode (D1, OUTPUT);
}

void loop() {
// put your main code here, to run repeatedly:

D1=S1&&S2;
digitalWrite (D1, HIGH);

}

Du musst die Taster mit digitalRead erst auslesen.
Und dann mit einer if-Abfrage auswerten.

Und wozu brauchst du Rubriken ?
Aber warum nimmst du keine digitalen Pins ?
Und nicht vergessen, die Eingänge benötigen auch Pullup- oder Pulldown-Widerstände, jenachdem worauf du abfragst.

Hallo,
so geht es.
Gruß und Spaß
Andreas

Noch ein paar Hinweise zum Multi-Function-Shield:

Die 4 LEDs sind "active LOW", das heißt sie leuchten, wenn die jeweiligen Ausgänge LOW geschalten sind und sie leuchten nicht, wenn der Ausgang HIGH ist.

Sehr ähnlich ist es bei den Tastern. Sie haben Pullup-Widerstände am Shield (R6, R7, R8). Ein gedrückter Taster erzeugt ein LOW am jeweiligen Eingang.

Ja, dieses Board habe ich auch. Ich möchte ja die vorhandenen Taster verwenden und diese sind nun mal an A1, A2 etc. angeschlossen. Muss das also mit analogRead eingelsen werden, obwohl nur Taster angeschlossen sind?
Leider funktioniert das auch mit der von Skobymobil erwähnten If...then... Bedingung nicht. Brauche ich dann überhaupt noch eine Zuweisung?
Wenn die Taster Low aktiv sind, heisst das dann, wenn ich ein UND möchte, dann ein NAND habe etc.? Alles also dann invertiert?

Habe das Board nicht, deswegen ohne jede Gewähr

void setup() 
{
  pinMode (A1, INPUT_PULLUP);
  pinMode (A2, INPUT_PULLUP);
  pinMode (13, OUTPUT);
}

void loop() 
{
  digitalWrite(13,(!digitalRead (A1))&&(!digitalRead (A2)));
}

Gerd50:
Wenn die Taster Low aktiv sind, heisst das dann, wenn ich ein UND möchte, dann ein NAND habe etc.? Alles also dann invertiert?

Hallo Gerd,
auf logischer Ebene: Du drückst eine Taste, die entsprechende LED leuchtet. Auf elektrischer Ebene zieht die Taste den Pegel von High auf Low, und die LED leuchtet bei LOW am Ausgang, da sie nach HIGH verdrahtet ist.
Gruß André

Die so genannten "Analogen Eingänge" sind eigentlich ganz normale digitale Eingänge, sie können aber AUCH analoge Spannungen messen. Du kannst also jeden "Analogen Eingang" ganz normal wie einen digitalen behandeln (zumindest am Arduino UNO).

Combie, dank deinen Gedanken habe ich nun das folgende Konstrukt, aber immernoch mit den folgenden Problemen:

Wenn ich jetzt beide Taster ggleichzeitig betätige, geht die LED aus - sie sollte aber angehen.
Wenn ich die beiden "!" in der Zeile digitalWrite für die Ausgabe weglasse, habe ich nun eine ODER-Verknüpfung an der LED. (Inklusiv-Oder, d.h. bei einem oder beiden Tastern geht die LED an)
mit den 'Befehlen INPUT_PULLDOWN' geht es nicht, warum existiert dieser nicht?

#define S1 digitalRead (A1)
#define S2 digitalRead (A2)
#define D1 13

void setup()
{
pinMode (A1, INPUT_PULLUP);
pinMode (A2, INPUT_PULLUP);
pinMode (13, OUTPUT);
}

void loop()
{
digitalWrite(13,(!digitalRead (A1))&&(!digitalRead (A2)));
}

uxomm:
Die 4 LEDs sind "active LOW", das heißt sie leuchten, wenn die jeweiligen Ausgänge LOW geschalten sind und sie leuchten nicht, wenn der Ausgang HIGH ist.

digitalWrite(13,!(!digitalRead (A1))&&(!digitalRead (A2)));

Vielleicht etwas anschaulicher:

void setup() {
  pinMode (A1, INPUT_PULLUP);
  pinMode (A2, INPUT_PULLUP);
  pinMode (13, OUTPUT);
}

void loop() {
  if ( (digitalRead(A1) == LOW) && (digitalRead(A2) == LOW) ) {   // wenn beide Taster gedrückt sind
    digitalWrite(13, LOW);  // schalte LED1 ein
  }
  else {
    digitalWrite(13, HIGH);   // schalte LED1 aus
  }
}

Anschaulicher schon, aber weiter weg von seinem ursprünglichen Beispiel zur && Verknüpfung.

In seinem Beispiel hat er 2 Bit miteinander &&
Du && das Ergebnis zweier Vergleiche.
Kommt das gleiche raus.
Und bei seinem Beispiel
S1&&S2 hätte es ja beinahe gepasst

digitalWrite (D1, S1&&S2);

uxxom, dein Beispiel funktioniert, warum auch immer? Warum man noch den Ausgang auf LOW setzen muss, damit die LED leuchtet, ist mir noch ein Rätsel? Auch wenn die Eingänge Low-aktiv sind?

Was ich grundsätzlich nicht verstehe ist, warum macht dieser Shield-Hersteller denn das mit den Pullup-Widerständen und das somit bei gedrücktem Taster ein Low erscheint.
Macht es nicht mehr Sinn, sowas alles mit Pulldown-Widerständen zu machen und ganz normal dann mit High zu schalten, wie der normale Mensch also denkt? Oder was steckt technisch dahinter, dass man lieber mit Low-schaltet als mit High?

Ich habe die Variante von combie nochmal aufgegriffen und bei div. Änderungen festgestellt:

Hier habe ich eine ODER-Verknüfung (LED geht bei Betätigen der Taste/n an), obwohl ich nun eine && Operation durchführe und die "!" vorab weglasse.

#define S1 digitalRead (A1)
#define S2 digitalRead (A2)
#define D1 13

void setup()
{
pinMode (A1, INPUT_PULLUP);
pinMode (A2, INPUT_PULLUP);
pinMode (13, OUTPUT);
}

void loop()
{
digitalWrite(13,(digitalRead (A1))&&(digitalRead (A2)));
}

Wenn ich das && durch ein || (Oder) ersetze, bekomme ich dann eine reale UND-Verknüpfung mit LED an realisiert. Seltsam? Denn ich dachte immer, dass nur eine NAND-Funktion mit negierten Eingängen lt. Theorem de Morgan eine ODER-Verknüpfung gibt und analog dazu eine NOR-Funktion mit neg. Eingängen eine UND-Funktion!?
Fragen über Fragen...!?!?

Pull-ups kommen noch aus der TTL-Technik, da hat man Taster immer gegen Ground angeschlossen.

Der Shield-Hersteller hat das doch aber dokumentiert?

Und die Leds sind auch LOW aktiv, sprich, es wird Ground geschaltet

digitalWrite(13,(digitalRead (A1))&&(digitalRead (A2)));

und

digitalWrite(13,!(!digitalRead (A1))&&(!digitalRead (A2)));

Sind offenbar zwei paar Stiefel

Gerd50:
Warum man noch den Ausgang auf LOW setzen muss, damit die LED leuchtet, ist mir noch ein Rätsel? Auch wenn die Eingänge Low-aktiv sind?

Weil die LEDs bei diesem Shield so beschalten sind:
MFS_LEDs.png
Sie hängen mit der Anode an 5 Volt und mit Widerstand und Kathode an den Ausgängen.

Warum der Shield-Hersteller das so gemacht hat, kann nur er beantworten :slight_smile:

wie der normale Mensch also denkt

Der Kopf ist rund, damit das Denken die Richtung ändern kann!
:o :o :o

Dieses Beispiel verwendet Objekte, welche selber die Invertierung intern erledigen.
So, dass die && Verknüpfung "wie der normale Mensch also denkt" erledigt werden kann/muss.

Er braucht etwas mehr RAM, für die Entpreller, hat dagegen weniger Flash Verbrauch.
Die Ausgabeklasse ist für die China üblichen Relaisboards gedacht, erfüllt aber auch hier seinen Zweck.

#include <CombiePin.h>
#include <CombieTimer.h>

Combie::Pin::RelaisINV<13>  led; 
Combie::Pin::TasterGND<A0>  tasterA; 
Combie::Pin::TasterGND<A1>  tasterB; 

Combie::Timer::EntprellTimer entprellenA(20);  
Combie::Timer::EntprellTimer entprellenB(20);  

void setup() 
{
  led.init();
  tasterA.initPullup();
  tasterB.initPullup();
}

void loop() 
{
  led = entprellenA(tasterA) && entprellenB(tasterB);
}

Statt: tasterX.initPullup() könnte man auch tasterX.init() verwenden, denn Pullups scheinen ja schon da zu sein.

CombieLib.zip (66.4 KB)

Danke Jungs für eure aufschlussreichen Erklärungen. Bei dem MF-Shield waren bei mir leider keine technischen Spezifikationen dabei etc.
Wenn ich das auf eine Prototypen- oder Lochraster-Platine aufbauen möchte, muss ich dann überhaupt auch die Pullup- bzw. Pulldown-Widerstände verwenden oder kann man auch mit einer satten 5V-Spg. oder einer sauberen GND- / 0V-Spannung die Eingänge über die Taster auch beschalten, d.h. ohne diese Widerstände. Es erschließt mir also noch nicht ganz, warum man bei den digitalen Eingängen diese Widerstände braucht. Jedoch ist es mir klar, dass bei den Outputs mit den LED's Widerstände benötigt werden als Vorwiderstände, damit der Strom in den LEDs begrenzt wird und nur die jeweilige UF lt. Farbe anliegt.
Aber warum überhaupt Pullup- oder Pulldown-Widersände, damit die Signale eindeutiger sind und keine undefinierten 'Zwischenwerte' annehmen können?

Gerd50:
.....
Aber warum überhaupt Pullup- oder Pulldown-Widersände, damit die Signale eindeutiger sind und keine undefinierten 'Zwischenwerte' annehmen können?

Genau, speziell bei offenen Eingängen, wenn der Taster nicht gedrückt ist.

Und jetzt habe ich noch eine ganz doofe Frage:
Kann man denn auch ein auf dem Arduino befindliches Programm auch mit der IDE downloaden oder geht das nur in die Upload-Richtung?
Kenne das von der Siemens LOGO!, dass man in beide Richtungen das Programm loaden kann.