4 einzelne digitale Pins als Variable zusammenfassen

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

Wenn die Sensoren tatsächlich an Pins 4 - 7 angeschlossen sind, dann liest du die mit der bereits geposteten Zeile aus:

byte var = PORTD >> 4;

Den Status der einzelnen Pins kannst du wiederrum dannmit einer Verundung auswerten:
if (var & 1 ) für den ersten Sensor
if (var & 2 ) für den zweiten Sensor
if (var & 4 ) für den dritten Sensor
if (var & 8 ) für den vierten Sensor
Stichwort: [

Bitweise Operatoren

](& - Arduino Reference)

Diese Variante ist v. A. dann sinnvoll, wenn es darauf ankommt, dass alle Sensoren exakt gleichzeitig reingelesen werden sollen und deren Zustände mit wenig Speicherbedarf zu speichern und zu kopieren. Wenn es darauf nicht ankommt, würde ich auch den klassischen [

digitalRead()

](http://arduino.cc/en/Reference/DigitalRead) benutzen!

Anmerkung (1):
Evtl musst du mit geigneten Pull-up- bzw. -down-Widerständen die Sensoren so anpassen, dass sie als klare High- und Low-Signale erkannt werden können (High: Spannung > ~2/3 der Versorgung, Low: Spannung < ~1/3 der Versorgung)

Anmerkung (2):
Wenn du die Lichtsensoren analog betreibst, müssen sie natürlich an die analogen Arduino-Pins angeschlossen werden. Hier ist es dann aber nicht möglich, alle Werte gleichzeitig einzulesen, da es nur einen Analog-Digital-Wandler gibt, der nacheinander mit dem jeweiligem Pin verknüpft wird.
Stichwort: [

analogRead()

](http://arduino.cc/en/Reference/AnalogRead)

#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 LICHTSENSORWERT=0; // In dieser Variablen werden die Ergebnisse der 4 Lichtsensoren zusammengefasst
boolean LICHTSENSOR_1=10; //Lichtsensor 1 wird Pin 10 zugeordnet
boolean LICHTSENSOR_2=11; //Lichtsensor 2 wird Pin 11 zugeordnet
boolean LICHTSENSOR_3=12; //Lichtsensor 3 wird Pin 12 zugeordnet
boolean LICHTSENSOR_4=13; //Lichtsensor 4 wird Pin 13 zugeordnet

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 loop()
{
LICHTSENSOREN();

switch (LICHTSENSORWERT)
{
case 0:
SERVO_LINKS.write(0); //Links vorwärts
break;

case 1:
SERVO_LINKS.write(0); //Links vorwärts
break;

case 2:
SERVO_LINKS.write(0); //Links vorwärts
break;

case 3:
SERVO_LINKS.write(0); //Links vorwärts
break;

case 4:
SERVO_LINKS.write(180); //Links rückwärts
break;

case 5:
SERVO_LINKS.write(180); //Links rückwärts
break;

case 6:
SERVO_LINKS.write(180); //Links rückwärts
break;

case 7:
SERVO_LINKS.write(180); //Links rückwärts
break;

case 8:
SERVO_RECHTS.write(180); //Rechts vorwärts
break;

case 9:
SERVO_RECHTS.write(180); //Rechts vorwärts
break;

case 10:
SERVO_RECHTS.write(180); //Rechts vorwärts
break;

case 11:
SERVO_RECHTS.write(180); //Rechts vorwärts
break;

case 12:
SERVO_RECHTS.write(0); //Rechts rückwärts
break;

case 13:
SERVO_RECHTS.write(0); //Rechts rückwärts
break;

case 14:
SERVO_RECHTS.write(0); //Rechts rückwärts
break;

case 15:
SERVO_RECHTS.write(0); //Rechts rückwärts
break;

}
}

void LICHTSENSOREN()
{
LICHTSENSORWERT=0;
LICHTSENSORWERT = digitalRead(LICHTSENSOR_1); // Pin 4 ins unterste Bit schreiben
LICHTSENSORWERT <<= 1; // eines nach links schieben.,
LICHTSENSORWERT |= digitalRead(LICHTSENSOR_2);
LICHTSENSORWERT <<= 1;
LICHTSENSORWERT |= digitalRead(LICHTSENSOR_3);
LICHTSENSORWERT <<= 1;
LICHTSENSORWERT |= digitalRead(LICHTSENSOR_4);
}

Das ist mein Programmcode.
Wenn ich es ablaufen lasse, drehen sich aus irgend einem Grund beide Servos.

Habe ich einen Fehler gemacht?

Wenn jemand den Fehler findet, würde ich mich sehr freuen.

Gruß Sam

Hab den Fehler ;). Du hast die Pin-Nummern als "boolean" festgelegt (die können dann nur true oder false annehmen, nicht 10,11,12..."- das geht natürlich nicht, die sollten entweder vom Typen "(const) int" sein oder vordefiniert (#define).

boolean LICHTSENSOR_1=10; //Lichtsensor 1 wird Pin 10 zugeordnet  - neee!!!
...

Machs besser so:

const int LICHTSENSOR_1=10; //Lichtsensor 1 wird Pin 10 zugeordnet
...

oder so:

#define LICHTSENSOR_1 10; //Lichtsensor 1 wird Pin 10 zugeordnet
...

hier darfst du kein "=" setzen!

Tipp: verwende doch die Code-Tags wenn du Quellcode postest, das macht es einfacher zu lesen :wink: (das Rautezeichen "#")

Danke für deine Hilfsbereitschaft, aber das mit Boolean muss so sein, weil ich die Variable ja sowieso nur mit 1 & 0 (binär) füllen möchte.

Das Programm läuft jetzt auch fehlerfrei:

#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 LICHTSENSORWERT = 0; // In dieser Variablen werden die Ergebnisse der 4 Lichtsensoren zusammengefasst
boolean LICHTSENSOR_1 = 10; //Lichtsensor 1 wird Pin 10 zugeordnet
boolean LICHTSENSOR_2 = 11; //Lichtsensor 2 wird Pin 11 zugeordnet
boolean LICHTSENSOR_3 = 12; //Lichtsensor 3 wird Pin 12 zugeordnet
boolean LICHTSENSOR_4 = 13; //Lichtsensor 4 wird Pin 13 zugeordnet
int LED = 7; // Der LED wird Pin 7 zugeordnet (Später der Pin vom Taster)
int ZAHL_BLINKEN = 0; //Die Anzahl wie oft das Programm LED_BLINKEN ausgeführt wird
int ZAHL_GEBLINKT = 0; //Die Anzahl wie oft schon geblink wurde

void setup()
{
  pinMode(LED, OUTPUT);
 } 
 
 
void loop()
{
   ZAHL_GEBLINKT=0;
   delay(5000);

  LICHTSENSOREN();
  
  switch (LICHTSENSORWERT) 
  {
   case 0:
  ZAHL_BLINKEN = 2;  //Lichtsensoren 1+2+3+4 aktiviert
     break;
     
   case 1:
  ZAHL_BLINKEN = 3; //Lichtsensoren 1+2+3 aktiviert
     break;
     
   case 2:
  ZAHL_BLINKEN = 4;  //Lichtsensoren 1+2+4 aktiviert
     break;
     
   case 3:
  ZAHL_BLINKEN = 5;  //Lichtsensoren 1+2 aktiviert
     break;
     
   case 4:
  ZAHL_BLINKEN = 6;  //Lichtsensoren 1+3+4 aktiviert
     break;
     
   case 5:
  ZAHL_BLINKEN = 7;  //Lichtsensoren 1+3 aktiviert
     break;
     
   case 6:
  ZAHL_BLINKEN = 8;  //Lichtsensoren 1+4 aktiviert
     break;
     
   case 7:
  ZAHL_BLINKEN = 9;  //Lichtsensor_1 aktiviert
     break;
     
   case 8:
  ZAHL_BLINKEN = 10; //Lichtsensoren 2+3+4 aktiviert
     break;
     
   case 9:
  ZAHL_BLINKEN = 11;  //Lichtsensoren 2+3 aktiviert
     break;
     
   case 10:
  ZAHL_BLINKEN = 12;  //Lichtsensoren 2+4 aktiviert
     break;
     
   case 11:
  ZAHL_BLINKEN = 13; //Lichtsensor_2 aktiviert
     break;
     
   case 12:
  ZAHL_BLINKEN = 14;  //Lichtsensoren 3+4 aktiviert
     break;
     
   case 13:
  ZAHL_BLINKEN = 15;  //Lichtsensor_3 aktiviert
     break;
     
   case 14:
  ZAHL_BLINKEN = 16;  //Lichtsensor_4 aktiviert
     break;
     
   case 15:
  ZAHL_BLINKEN = 17;   //0 Sensoren aktiviert
     break;   
  }
  
  while (ZAHL_GEBLINKT < ZAHL_BLINKEN)
  {
    LED_BLINKEN();    
    ZAHL_GEBLINKT++;
  }
}



void LICHTSENSOREN()
{
LICHTSENSORWERT=0;
LICHTSENSORWERT = digitalRead(LICHTSENSOR_1);  // Pin 4 ins unterste Bit schreiben
LICHTSENSORWERT <<= 1;                         //  eines nach links schieben.,
LICHTSENSORWERT |= digitalRead(LICHTSENSOR_2);
LICHTSENSORWERT <<= 1;
LICHTSENSORWERT |= digitalRead(LICHTSENSOR_3);
LICHTSENSORWERT <<= 1;
LICHTSENSORWERT |= digitalRead(LICHTSENSOR_4);
}

void LED_BLINKEN()
{
 digitalWrite(LED, HIGH); 
 delay(500);             
 digitalWrite(LED, LOW);  
 delay(500);  
}

SamBOT:
Danke für deine Hilfsbereitschaft, aber das mit Boolean muss so sein, weil ich die Variable ja sowieso nur mit 1 & 0 (binär) füllen möchte.

In der Variable speichertst du aber nicht den Zustand des Sensors, sondern den Pin, an welchen er hängt. Deswegen kannst du hier nicht boolean verwenden.

boolean LICHTSENSOR_1 = 10; //Lichtsensor 1 wird Pin 10 zugeordnet

Hier willst du LICHTSENSOR_1 den Wert 10 zuweisen. 10 ist aber kein boolean.

Grüße,
J3RE

Außerdem ist der Kode etwas kompliziert.

die ganze Swich Case Konstruktion:

switch (LICHTSENSORWERT) 
  {
   case 0:
  ZAHL_BLINKEN = 2;  //Lichtsensoren 1+2+3+4 aktiviert
     break;
     
   case 1:
  ZAHL_BLINKEN = 3; //Lichtsensoren 1+2+3 aktiviert
     break;
...

kannst Du mit

ZAHL_BLINKEN = LICHTSENSORWERT +  2;

gleichwertig ersetzen.

Grüße Uwe

Danke für den Tipp Uwe, aber ich will ja später verschiedene Aktionen dabei starten, aus dem Grund die Case abfrage.

J3RE ich ordne der boolean doch den Pin zu und keinen Wert.

Und es läuft fehlerfrei.

Als nächstes möchte ich einen analogen Taster anschließen, welcher als Ein/Aus Schalter genutzt wird.
Wie werte ich denTaster Analog am besten aus (möchte Analogmachen, weil ich nicht genug Digitale Pins habe).

Würde mich über einen weiteren Tipp sehr freuen

Gruß Sam

SamBOT:
J3RE ich ordne der boolean doch den Pin zu und keinen Wert.

Mit dem Kode und in C/C++ aber nicht

SamBOT:
Als nächstes möchte ich einen analogen Taster anschließen, welcher als Ein/Aus Schalter genutzt wird.
Wie werte ich denTaster Analog am besten aus (möchte Analogmachen, weil ich nicht genug Digitale Pins habe).

Was ist ein analoger Taster?
Die analogen Eingänge des Arduino können auch als digitale Ein/Ausgänge verwendet werden. beim Arduino UNO: A0 wird D14 ... A6 wird D19.

Grüße Uwe

das mit den Digitalen Pins die aus den Analogen entstehen wusste ich noch gar nicht.

Aber das hilft mir sehr weiter.

Muss man dafür was konfigurieren, oder einfach die entsprechenden Pins zuordnen?

Einfach mit pinMode() als Eingang oder Ausgang definieren.
Grüße Uwe

ich ordne der boolean doch den Pin zu und keinen Wert.
Und es läuft fehlerfrei.

Hier ist ausnahmsweise mal ein Problem, dass es funktioniert obwohl es falsch ist.

Für boolean sind nur true undfalse als Zustände definiert.
Intern wird dafür aber ein Byte reserviert. So kann es passieren dass es trotzdem funktioniert.

Das zugrundeliegende Missverständnis (Unterschied zwischen PinNummer und Zustand ) sollte aber trotzdem geklärt sein:

const byte pinNummer = 10;  // pinNummer sollte nicht als boolean definert sein sondern als int oder byte.
                            // Ist ausserdem konstant und keine Variable ;)
boolean pinStatus = digitalRead(pinNummer);
if (pinStatus) { 
   // pinStatus hat den Wert 1 oder HIGH oder true
} else {
   // pinStatus hat den Wert 0 oder LOW oder false
}

edit: kleine Korr. im Kommentar

Danke für die Tipps, habe sie jetzt berücksichtigt.

Versuche jetzt langsam die Komponenten zu einem Programm zusammen zu bauen.

Habe noch einen Sensor mit geringer Wichtigkeit, aber frage trotzdem mal.
Wie baue ich einen Farbsensor ein??

Hatte damit schonmal jemand was zu tun?
Er soll die Funktion haben, dass er bei z.B. rotem Licht 2 Motoren ausschaltet und diesebei z.B. grünem Licht wieder einschaltet.

Freue mich über jeden Tipp.

Gruß Sam