4 einzelne digitale Pins als Variable zusammenfassen

Hallo zusammen,

ich bin noch ein Neuling beim Thema Arduino und habe deshalb eine Frage.

Ich möchte 4 digitale Pins schon beim einlesen zu einer Variable zusammenfassen.
Ich habe 4 Lichtsensoren, welche alle durch diese Variable abgefragt werden sollen.

Kann mir da jemand weiterhelfen?

Mit freundlichen Grüßen
Sam

Wenn alle 4 Sensoren auf dem gleichen Port sind, geht das mit direktem Zugriff auf den I/O Port am einfachsten.

Grüße Uwe

Ich habe die 4 Digitalen Anschlüsse meiner Sensoren (welche die Zustände High und Low einnehmen können) an die digitalen Eingänge 4-7 angeschlossen.
Aus diesen Werten möchte ich eine Variable machen, welche die Werte 0 bis 15 einnehmen kann.

Ich hoffe, dass diese Schilderung verständlicher ist.

Wie müsstemeine Programm dafür aussehen??

Gruß Sam

Hast Du wenigstens versucht zu verstehn was ich Dir vorgeschlagen habe?
Grüße Uwe

Was versteht man unter einem Port?
1 Port = 1 Pin
Oder
1 Port mehrere Pins
???

Gruß Sam

Falls du dem Link, den Uwe gepostet hat, folgen möchtest, könntest du dort lesen

"The chips used on the Arduino board (the ATmega8 and ATmega168) have three ports:
B (digital pin 8 to 13)
C (analog input pins)
D (digital pins 0 to 7)"

Aber ich denke, das ist etwas zu komplex.

Probiers mal so:

byte var;

var = digitalRead(4);  // Pin 4 ins unterste Bit schreiben
var << 1;                  //  eines nach links schieben.,
var | digitalRead(5);
var << 1;
var | digitalRead(6);
var << 1;
var | digitalRead(7);

jetzt sollte (ich habe es nicht ausprobiert) ein 4-Bit Wert in var stehen, der deine Eingänge repräsentiert.

Es ginge auch so, kostet aber mehr Zeit:

int var = digitalRead(4) *8 + digitalRead(3) * 4 + digitalRead(2) * 2 + digitalRead(1);

SamBOT:
Was versteht man unter einem Port?
1 Port = 1 Pin
Oder
1 Port mehrere Pins
???

Gruß Sam

Ein Port ist ein Register dessen 1 bzw 0 Zustände die einzelnen Pins auf H bzw LOW setzen bzw falls Eingänge den Zustand der einzelnen Pins lesen.
Grüß Uwe

Danke Gunther habe es jetzt glaube ich ein wenig verstanden.

Wann schreibt er die Variablen rein, wenn es Low oder wenn es High ist?

Gruß Sam

Hallo Sam,
er schreibt immer den Zustand (egal ob Low oder High) rein, schiebt dann den gesamten Inhalt des Byte um ein nach links usw. Dann steht in den untersten 4 Bit in "var" der Zustand der Eingänge.

Wenn zum Beispiel alle 4 High wären, würde das Byte Bitweise dargestellt so aussehen:

00000001 Der erste Eingang
00000010 einmal geschogben
00000011 der zweite Eingang dazu
00000110 nochmal geschoben
00000111 dritter Eingang dazu
00001110 erneut geschoben
00001111 vierter Eingang dazu

Grüße,
Jürgen

Danke Jürgen

Bedeutet das, wenn ein Wert Low ist, wird einfach eine 0 geschrieben?

genau!

@guntherb

byte var;

var = digitalRead(4);  // Pin 4 ins unterste Bit schreiben
var << 1;                  //  eines nach links schieben.,
var | digitalRead(5);
var << 1;
var | digitalRead(6);
var << 1;
var | digitalRead(7);

Du hast die = vergessen

byte var;

var = digitalRead(4);  // Pin 4 ins unterste Bit schreiben
var <<= 1;                  //  eines nach links schieben.,
var |= digitalRead(5);
var <<= 1;
var |= digitalRead(6);
var <<= 1;
var |= digitalRead(7);

Jetzt sollte der Code funktionieren.

Grüße,
J3RE

Schonmal danke für eure Hilfe

Was haltet ihr von dem Code:

#include <Servo.h>


Servo SERVO_LINKS; // Linkes Rad
Servo SERVO_RECHTS; // Rechtes Rad
int SERVOANSCHLUSS_RECHTS=2; //Zuordnung Servoanschluss vom rechten Rad
int SERVOANSCHLUSS_LINKS=3; //Zuordnung Servoanschluss vom linken Rad
byte var;

void setup()
{
  SERVO_LINKS.attach(SERVOANSCHLUSS_LINKS); //linkes Rad 89-0 Vorwärts 91-180 Rückwärts
  SERVO_RECHTS.attach(SERVOANSCHLUSS_RECHTS); //rechtes Rad 91-180 Vorwärts 89-0 Rückwärts

  
}


void LICHTSENSOREN()
{
  var = digitalRead(4);  // Pin 4 ins unterste Bit schreiben
var <<= 1;                  //  eines nach links schieben.,
var |= digitalRead(5);
var <<= 1;
var |= digitalRead(6);
var <<= 1;
var |= digitalRead(7);
}

Bißchen einsam das setup() ohne loop() :wink: :wink:

Das ist nicht der ganze Sketch.
Bitte benutze die code Tags für den sketch (Ikone mit dem Doppelkreuz).

Grüß Uwe

Wenn es um Laufzeit geht, ist das direkte Auslesen von PORTD am besten (wie guntherb uwefed vorgeschlagen hat):

var = PORTD >> 4

Das liest den gesamten PORTD (also die Pins 0-7) rein und schiebt das Ganze um 4 Bit nach rechts, da wir ja nur die oberen 4 Bit (Pins 4-7) brauchen. Der Rest wird einfach unten rausgeschoben, oben kommen Nullen rein.

PORTD: b 'pin7-pin6-pin5-pin4-pin3-pin2-pin1-pin0'
Nach dem Schieben:
var: b '0-0-0-0-pin7-pin6-pin5-pin4'

MGOS:
Wenn es um Laufzeit geht, ist das direkte Auslesen von PORTD am besten (wie guntherb vorgeschlagen hat):

Da wird sich guntherb aber freuen :wink: :wink: :wink:
Grüße Uwe

uwefed:
Da wird sich guntherb aber freuen :wink: :wink:
Grüße Uwe

Klar freue ich mich!
Man kann sich doch auch über fremde Federn freuen! :wink:
Nein, die Lorbeeren gebühren eindeutig Dir!

Sorry uwefed, hab nur auf den letzten Post geachtet und gedacht alle seien von gunterb :wink:

MGOS:
Sorry uwefed, hab nur auf den letzten Post geachtet und gedacht alle seien von gunterb :wink:

Ist nicht schlimm, ich muß nur manchmal etwas lärmen. :wink: :wink: :wink:

guntherb hat's aber eindeutiger ausführlicher behandelt. 8) 8)

Grüße Uwe

Hey,
ich war in den letzten Tagen leider nicht im Forum aktiv, möchte mich aber nochmal für alle Tipps bedanken.

Mein Problem ist jetzt jedoch, dass mir für die 4 Lichtsensoren ingesamt nur 4 Pins zur verfügung stehen, da alle anderen Pins bereits belegt sind.

Wie lese ich diese 4 am besten aus?
Und wie kann ich die Varaible danach wieder auswerten?

ich würde mich über eine weitere schnelle Antwort freuen.

Gruß Sam