Auto Kamera Switch

Hallo zusammen,

ich arbeite gerade an meinem ersten Projekt und scheitere am letzten Punkt für den Code.
Ich wäre begeistert wenn mir jemand helfen könnte.
Nach zig Googlestunden und erlernen der Anwendung einer Menge Codes wie Interrupt , millis usw. brachte
mich dennoch nichts zum Ziel. Ich stelle mal ein Bild mit der Erklärung zum Aufbau und den Code rein den
ich bisher geschrieben habe . Alles funktioniert, nur der letzte Punkt nach entfernen des Rückwärtsgang das
der Monitor noch an bleiben soll für eine Zeit sowie die Vordere Kamera und sich danach alles wieder
ausschaltet . Zum testen hab ich natürlich nur 3 Sek wartezeiten drin in der Praxis wollte ich 30 Sek
anpeilen.

Ist es eig. normal das Relais anderum bezeichnet werden also LOW für an und HIGH für aus ?
So schalten meine Relais irgendwie...

Vielen Dank im Voraus.

Gruß

int Rgang;                                  // Variable
int Rlichtinput = 2;                       // Signal vom Rückwärtsgang
int Relais1MONITOR = 8;                // MONITOR im Innenraum
int Relais2CAMFRONT = 7;               // KAMERA an Fahrzeugfront
int Relais3CAMBACK = 12;                // KAMERA am Heck
        
void setup()
 {
    pinMode(Rlichtinput, INPUT);  
    pinMode(Relais1MONITOR, OUTPUT);
    pinMode(Relais2CAMFRONT, OUTPUT);
    pinMode(Relais3CAMBACK, OUTPUT);   

Serial.begin(9600);
  
    digitalWrite(Relais1MONITOR, LOW);           // Fahrzeug Start -> Arduino bekommt Strom
    digitalWrite(Relais2CAMFRONT, LOW);             und schaltet MONITOR und CAMFRONT an.
    digitalWrite(Relais3CAMBACK, HIGH);

delay(3000);                                                // wartet 3 sek. ( später sollen es mal 30 sek sein. )
 
    digitalWrite(Relais1MONITOR, HIGH);       // Dann soll er wenn man ohne Rückwärtsgang fährt
    digitalWrite(Relais2CAMFRONT, HIGH);           alles ausschalten.
    digitalWrite(Relais3CAMBACK, HIGH);
  }

void loop()
{

Rgang = digitalRead(Rlichtinput);

if (Rgang==HIGH)

{
    digitalWrite(Relais1MONITOR, LOW);             // Rückwärtsgang eingelegt MONITOR und 
    digitalWrite(Relais2CAMFRONT, HIGH);             CAMBACK gehen an. 
    digitalWrite(Relais3CAMBACK, LOW);
}
                                                            
else
{ 
    digitalWrite(Relais1MONITOR, HIGH);           // !!! Jetzt wenn der Rückwärtsgang wieder raus 
    digitalWrite(Relais2CAMFRONT, HIGH);             ist soll eigentlich MONITOR an bleiben 
    digitalWrite(Relais3CAMBACK, HIGH);                  und CAMFRONT an gehen und CAMBACK aus,
  }                                                                           das für 3 sek ( 30 sek. ) danach alles aus.
                                                                                  Das ganze soll auch bei jedem mal wenn 
}                                                                                  der Rückwärtsgang eingelegt wird
                                                                                     wieder unterbrochen werden können.
                                                                                      Hierfür habe ich schon alles an 
                                                                                      Möglichkeiten aus dem Netz probiert 
                                                                                      aber ohne Erfolg...

Setup wir 1 mal abgearbeitet. danach immer wieder Loop.

Wo ist im loop eine Wartezeit?
komentiere bitte den Sketch.
Grüße Uwe

Quick und dirty könntest im if zweig nach deinen Relais-Schaltungen ein delay(3000) ergänzen.

Ist es eig. normal das Relais anderum bezeichnet werden also LOW für an und HIGH für aus ?

jein.
Aber diese Relais-MODULE sind low-aktiv also ist es "normal". Liegt am Aufbau des Relais-Module - nicht am Relais selber.

Damit deine Schaltung so funktioniert, wie du es möchtest, musst du alles in der Loop laufen lassen.

Und vermeide lange delays. Die 30 Sek. blockieren anschließend weitere Funktionen.

uwefed:
Setup wir 1 mal abgearbeitet. danach immer wieder Loop.
komentiere bitte den Sketch.

Danke fürs drüber schauen , habe den Sketch überarbeitet und kommentiert.

noiasca:
Quick und dirty könntest im if zweig nach deinen Relais-Schaltungen ein delay(3000) ergänzen.

Quick und dirty wäre super. Wenn ich nach den If schaltungen ein delay(3000) einfüge verzögert sich nur das einschalten um 3 sek wenn der RückGang eingelegt wird.

noiasca:
jein.
Aber diese Relais-MODULE sind low-aktiv also ist es "normal". Liegt am Aufbau des Relais-Module - nicht am Relais selber.

Ok Danke für die Info :slight_smile:

HotSystems:
Damit deine Schaltung so funktioniert, wie du es möchtest, musst du alles in der Loop laufen lassen.
Und vermeide lange delays. Die 30 Sek. blockieren anschließend weitere Funktionen.

genau das habe bereits mitbekommen das delay blockiert , wäre nicht passend oder man nehme vllt 10 sek oder so . Aber lieber hätte ich es das wenn das Rückwärtsgang Signal alles unterbricht und wieder sein ding macht.


Allgemein scheint es mir evtl. ohne ein Arduino einfacher zu sein mit einem zusätzlichen Schalter.

Ding ist halt, es ist 1 Monitor und 2 Videosignale kommen vor dem Monitor zusammen auf ein Signal, somit wollt ich durch Stromregelung das Problem beseitigen.

Schade ist das man einen Vorgang nicht unterbrechen kann, also wenn er ein Befehl ausführt diesen durch ein High Signal zu unterbrechen.

Ich hab mal ein Video hochgeladen wie es zZt. ist :

Hier sieht man, er macht am Anfang die gewünschte Schaltung , reagiert auch jedes mal wenn man das Rückwärts-Signal gibt. aber nach lösen des Signals einfach nur wieder auf das Signal wartet anstatt nach beenden des Signal für 3 sek CAMFRONT und MONITOR Schaltet und dann auf die Warteposition geht. Code davon ist oben im ersten Post.

CAM SWITCH VERSION 1

Hier hatte ich mit time=millis gearbeitet -> damit klappt es fast am besten , problem ist nur das er zwar reagiert wenn das Rückwärtsgang-Signal kommt aber er hält es nicht solange es da ist sondern nur die angegebene zeit und arbeitet den Rest erst ab . Kann man das Problem nicht eher einfach lösen ? :slight_smile: Diesen Sketch pack ich auch mal unter das Video

CAM SWITCH VERSION 2

int Rgang;
int Rlichtinput = 2; 
int Relais1MONITOR = 8;
int Relais2CAMFRONT = 7;
int Relais3CAMBACK = 12;
unsigned long time;
           
void setup()

    {

    pinMode(Rlichtinput, INPUT);
    pinMode(Relais1MONITOR, OUTPUT);
    pinMode(Relais2CAMFRONT, OUTPUT);
    pinMode(Relais3CAMBACK, OUTPUT);   
    Serial.begin(9600);
    
   
    digitalWrite(Relais1MONITOR, LOW);
    digitalWrite(Relais2CAMFRONT, LOW);
    digitalWrite(Relais3CAMBACK, HIGH);

time = millis();
delay(3000);

if (time > 3000)
    digitalWrite(Relais1MONITOR, HIGH);
    digitalWrite(Relais2CAMFRONT, HIGH);
    digitalWrite(Relais3CAMBACK, HIGH);

   }

void loop()
{
       Rgang=digitalRead(Rlichtinput);
    Serial.println(Rgang,DEC);

if (Rgang == LOW)

{
    digitalWrite(Relais1MONITOR, HIGH);
    digitalWrite(Relais2CAMFRONT, HIGH);
    digitalWrite(Relais3CAMBACK, HIGH);
}
else
{
    digitalWrite(Relais1MONITOR, LOW);
    digitalWrite(Relais2CAMFRONT, HIGH);
    digitalWrite(Relais3CAMBACK, LOW);
    
    delay(3000),
    
    digitalWrite(Relais1MONITOR, LOW);
    digitalWrite(Relais2CAMFRONT, LOW);
    digitalWrite(Relais3CAMBACK, HIGH);
    
    delay(3000);
}
}

Gruß

Du solltest dir das Beispiel "BlinkWithoutDelay" ansehen.
Da wird millis richtig eingesetzt.
Nur millis verwenden, hilft da nichts.

Deine Rgang-Abfragen müssen ja zwischendurch immer wieder gelesen werden.
Das wird bei richtiger Anwendung von millis gewährleistet.

soko87:
Quick und dirty wäre super. Wenn ich nach den If schaltungen ein delay(3000) einfüge verzögert sich nur das einschalten um 3 sek wenn der RückGang eingelegt wird.

jetzt überleg mal ganz genau woran das liegt...

genau, du hättest erst die Relais schalten sollen und dann das delay nach den Relais-Befehlen einfügen sollen.

in deinem Millis Ansatz haben delays dann nichts mehr verloren.

HotSystems:
Du solltest dir das Beispiel "BlinkWithoutDelay" ansehen.
Da wird millis richtig eingesetzt.
Nur millis verwenden, hilft da nichts.

Deine Rgang-Abfragen müssen ja zwischendurch immer wieder gelesen werden.
Das wird bei richtiger Anwendung von millis gewährleistet.

Ich schaue nochmal nach "BlinkWithoutDelay" , Danke

Wäre boolean noch ne möglichkeit ? Bin da auf ne Erklärung gestoßen
Ca. bei 18:33 min. ist ne Übersicht
dem Beispiel zu entnehmen das man sagt ->
Am Anfang selber Ablauf :

NUR EIN MAL!
->
MONITOR AN - 10 sek
CAM VORNE AN -10 sek

DANN ALLES AUS

IN LAUERSTELLUNG BLEIBEN
<-

Dann im Loop ne Abfrage erstellen ob Rückwärtsgang Signal rein kommt oder nicht

Sollte ein Signal kommen:

MONITOR AN - solange Rückwärtsgang drin ist
CAM HINTEN AN - solange der Rückwärtsgang drin ist

Sollte der Gang entfernt werden also das Signal erlöschen dann einfach wieder an den Anfang
springen wo ich NUR EIN MAL ! geschrieben hab.

Eigentlich ganz einfach oder ? Ist das überhaupt Programmierbar ?

noiasca:
jetzt überleg mal ganz genau woran das liegt...

genau, du hättest erst die Relais schalten sollen und dann das delay nach den Relais-Befehlen einfügen sollen.

in deinem Millis Ansatz haben delays dann nichts mehr verloren.

Könnte ein möglicher Fehler sein das ich delays mit millis kombiniert hab... ich werde das noch mal Probieren. Danke für den Tipp

Hallo zusammen,

ich glaube ich habe es geschafft es zu verwirklichen aber ich glaube eher dirty.....

Es macht was es soll

ich habe es mit interrupt gelöst . Habe Ihm gesagt wenn Input von HIGH auf LOW geht soll er diese schaltung machen .

aber ich lese überall man solle keine delays dort einbauen aber so funktioniert es ,

Schadet es ein delay darin zu haben ?

das einzige was mir noch fehlen würde wäre das wenn er in diesem Interrupt ist was ja schon ne unterbrechung ist man diesen auch noch unterbrechen kann falls es wieder spontan auf HIGH wechselt.

aber das könnte man bestimmt als zweites noch hinterlegen .

hier mal der code :

int Rgang;
int Rlichtinput = 2; 
int Relais1MONITOR = 8;
int Relais2CAMFRONT = 7;
int Relais3CAMBACK = 12;
           
void setup()

    {
    pinMode(Rlichtinput, INPUT);
    pinMode(Relais1MONITOR, OUTPUT);
    pinMode(Relais2CAMFRONT, OUTPUT);
    pinMode(Relais3CAMBACK, OUTPUT);   
   Serial.begin(9600);


    digitalWrite(Relais1MONITOR, LOW);
    digitalWrite(Relais2CAMFRONT, LOW);
    digitalWrite(Relais3CAMBACK, HIGH);
    delay(2000);
    digitalWrite(Relais1MONITOR, HIGH);
    digitalWrite(Relais2CAMFRONT, HIGH);
    digitalWrite(Relais3CAMBACK, HIGH);

       attachInterrupt(Rgang, sf, FALLING);    // hier habe ich den interrupt erstellt und eine zusätzliche 
}                                                                   Anweisung ganz unten. 
   
void loop()
{




  Rgang=digitalRead(Rlichtinput);
      Serial.println(Rgang,DEC);




      
if(digitalRead(Rgang) == LOW) {
    digitalWrite(Relais1MONITOR, LOW);
    digitalWrite(Relais2CAMFRONT, HIGH);
    digitalWrite(Relais3CAMBACK, LOW);
}
else
{
    digitalWrite(Relais1MONITOR, HIGH);
    digitalWrite(Relais2CAMFRONT, HIGH);
    digitalWrite(Relais3CAMBACK, HIGH);
}}

void sf()
{
    digitalWrite(Relais1MONITOR, LOW);          
    digitalWrite(Relais2CAMFRONT, LOW);
    digitalWrite(Relais3CAMBACK, HIGH);
    delay(300000);

Auch wenn es bei dir jetzt funktioniert, hast du es noch nicht geschafft.

Das mit dem Interrupt ist so keine Lösung.
Und du kannst den Interrupt nicht durch einen weiteren Interrupt unterbrechen.
Der tut erst mal seine Arbeit.
Erst danach kannst du die nächste Funktion starten.

Und dein Projekt braucht def. kein Interrupt, das kannst du alles in der Loop abhandeln.

HotSystems:
Auch wenn es bei dir jetzt funktioniert, hast du es noch nicht geschafft.

Das mit dem Interrupt ist so keine Lösung.
Und du kannst den Interrupt nicht durch einen weiteren Interrupt unterbrechen.
Der tut erst mal seine Arbeit.
Erst danach kannst du die nächste Funktion starten.

Und dein Projekt braucht def. kein Interrupt, das kannst du alles in der Loop abhandeln.

Sauber ist es definitiv nicht, eher gemurkst, das stimmt . Ich denke ich werde noch vieles lernen und es dann abwandeln können, hoffe ich.

Hi

//Pseudocode
if (Rgang || millis()-lastRGANGtime<=Nachlaufzeit){  //das Auto wird alle 49 Tage wohl Mal tanken müssen, Überlauf entschärft
  if (Rgang?){
    lastRGANGtime=millis();
  }
  if (Kamera noch aus?){
     schalte RückfahrtKamera AN
     merke 'Kamera an'
  }
}else{
  if ('Kamera an'?){
    schalte RückfahrKamera AUS
    merke 'Kamera aus'
  }
}

Deine 5 Minuten Zwangspause IN der ISR ... etwas 'eigen' nennen wir Es Mal.

MfG

es kompiliert, und macht im Serial eigentlich alles richtig soweit ich das feststellen kann:

// http://forum.arduino.cc/index.php?topic=573654.0

const int Rlichtinput = 2;                   // Signal vom Rückwärtsgang
const int Relais1MONITOR = 8;                // MONITOR im Innenraum
const int Relais2CAMFRONT = 7;               // KAMERA an Fahrzeugfront
const int Relais3CAMBACK = 12;               // KAMERA am Heck

const byte EIN = LOW;                        // damit man bei den inversen Relais nicht immer umdenken muss ;-)
const byte AUS = HIGH;

uint32_t previousMillis = 0;
const uint16_t intervall = 3000;             // wenn >60000 umstellen auf uint32_t !!!

enum status {VORWAERTS,
             RUECKWAERTS,
             NACHLAUFZEIT};

status myStatus = VORWAERTS;

void doNonblocking()
{
  if (myStatus == VORWAERTS && !digitalRead(Rlichtinput))           // Retourgang ist eingelegt... wenn ich das richtig interpretiere, zieht dein Schalter auf LOW
  {
    Serial.print(F("Retourgang wurde eingelegt"));                  
    digitalWrite(Relais1MONITOR, EIN);
    digitalWrite(Relais2CAMFRONT, AUS);
    digitalWrite(Relais3CAMBACK, EIN);
    previousMillis = millis();   
    myStatus = RUECKWAERTS;       
  }

  if (!digitalRead(Rlichtinput))                                    // Solange wir rückwarts fahren reseten wir die previousMillis - Retriggerbar
  {
    previousMillis = millis(); 
  }

  if (myStatus == RUECKWAERTS && digitalRead(Rlichtinput))          // Wenn der Retourgang entfernt wird beginnt die Nachlaufzeit
  {
    Serial.println(F("\nNachlaufzeit beginnt"));
    myStatus = NACHLAUFZEIT;
  }

  if (millis() - previousMillis >= intervall && myStatus == NACHLAUFZEIT)  // Zeit ist abgelaufen und der Retourgang ist wieder draußen (daher wieder high)
  {
    Serial.println(F("\nAblauf Nachlaufzeit"));
    digitalWrite(Relais1MONITOR, AUS);
    digitalWrite(Relais2CAMFRONT, AUS);
    digitalWrite(Relais3CAMBACK, AUS);
    myStatus = VORWAERTS;
  }
}


void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start"));
  pinMode(Rlichtinput, INPUT_PULLUP);         // wenn ich das richtig interpretiere, zieht dein Schalter auf LOW, daher würde ich den internen Pullup aktivieren.
  pinMode(Relais1MONITOR, OUTPUT);
  pinMode(Relais2CAMFRONT, OUTPUT);
  pinMode(Relais3CAMBACK, OUTPUT);

  digitalWrite(Relais1MONITOR, EIN);           // Fahrzeug Start -> Arduino bekommt Strom und schaltet MONITOR und CAMFRONT an.
  digitalWrite(Relais2CAMFRONT, EIN);
  digitalWrite(Relais3CAMBACK, AUS);

  delay(intervall);                                                // wartet 3 sek. ( später sollen es mal 30 sek sein. )

  digitalWrite(Relais1MONITOR, AUS);       // Dann soll er wenn man ohne Rückwärtsgang fährt alles ausschalten.
  digitalWrite(Relais2CAMFRONT, AUS);
  digitalWrite(Relais3CAMBACK, AUS);
}


void loop()
{
  doNonblocking();

  // here is where you'd put code that needs to be running all the time.



}

noiasca:
es kompiliert, und macht im Serial eigentlich alles richtig soweit ich das feststellen kann:

// http://forum.arduino.cc/index.php?topic=573654.0

const int Rlichtinput = 2;                  // Signal vom Rückwärtsgang
const int Relais1MONITOR = 8;                // MONITOR im Innenraum
const int Relais2CAMFRONT = 7;              // KAMERA an Fahrzeugfront
const int Relais3CAMBACK = 12;              // KAMERA am Heck

const byte EIN = LOW;                        // damit man bei den inversen Relais nicht immer umdenken muss :wink:
const byte AUS = HIGH;

uint32_t previousMillis = 0;
const uint16_t intervall = 3000;            // wenn >60000 umstellen auf uint32_t !!!

enum status {VORWAERTS,
            RUECKWAERTS,
            NACHLAUFZEIT};

status myStatus = VORWAERTS;

void doNonblocking()
{
  if (myStatus == VORWAERTS && !digitalRead(Rlichtinput))          // Retourgang ist eingelegt... wenn ich das richtig interpretiere, zieht dein Schalter auf LOW
  {
    Serial.print(F("Retourgang wurde eingelegt"));                 
    digitalWrite(Relais1MONITOR, EIN);
    digitalWrite(Relais2CAMFRONT, AUS);
    digitalWrite(Relais3CAMBACK, EIN);
    previousMillis = millis(); 
    myStatus = RUECKWAERTS;     
  }

if (!digitalRead(Rlichtinput))                                    // Solange wir rückwarts fahren reseten wir die previousMillis - Retriggerbar
  {
    previousMillis = millis();
  }

if (myStatus == RUECKWAERTS && digitalRead(Rlichtinput))          // Wenn der Retourgang entfernt wird beginnt die Nachlaufzeit
  {
    Serial.println(F("\nNachlaufzeit beginnt"));
    myStatus = NACHLAUFZEIT;
  }

if (millis() - previousMillis >= intervall && myStatus == NACHLAUFZEIT)  // Zeit ist abgelaufen und der Retourgang ist wieder draußen (daher wieder high)
  {
    Serial.println(F("\nAblauf Nachlaufzeit"));
    digitalWrite(Relais1MONITOR, AUS);
    digitalWrite(Relais2CAMFRONT, AUS);
    digitalWrite(Relais3CAMBACK, AUS);
    myStatus = VORWAERTS;
  }
}

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start"));
  pinMode(Rlichtinput, INPUT_PULLUP);        // wenn ich das richtig interpretiere, zieht dein Schalter auf LOW, daher würde ich den internen Pullup aktivieren.
  pinMode(Relais1MONITOR, OUTPUT);
  pinMode(Relais2CAMFRONT, OUTPUT);
  pinMode(Relais3CAMBACK, OUTPUT);

digitalWrite(Relais1MONITOR, EIN);          // Fahrzeug Start -> Arduino bekommt Strom und schaltet MONITOR und CAMFRONT an.
  digitalWrite(Relais2CAMFRONT, EIN);
  digitalWrite(Relais3CAMBACK, AUS);

delay(intervall);                                                // wartet 3 sek. ( später sollen es mal 30 sek sein. )

digitalWrite(Relais1MONITOR, AUS);      // Dann soll er wenn man ohne Rückwärtsgang fährt alles ausschalten.
  digitalWrite(Relais2CAMFRONT, AUS);
  digitalWrite(Relais3CAMBACK, AUS);
}

void loop()
{
  doNonblocking();

// here is where you'd put code that needs to be running all the time.

}

Wow das sieht ja gut aus :slight_smile: Ich werde das morgen mal testen. Da ist so vieles neues dabei das mir sehr sinnvol erscheint :slight_smile:

Dieses Pullup hab ich immer flüchtig mitbekommen, bedeutet das das ich dann zwischen eingangssignal und arduino kein wiederstand mehr brauche sondern lediglich nur den wandler von 12v auf 5v ?

Gruß

Hi

Widerstand (ohne e in der Mitte, kommt von wider = gegen)

ALLE KFZ-Signale solltest Du tunlichst vom Arduino fern halten.
Das PULLUP schaltet den internen PullUp-Widerstand ein und zieht den INPUT-Pin auf Vdd.
Du liest also HIGH ein, wenn Du den unbetätigten Pin einliest.
Diesen Pin kannst Du nun nach GND ziehen - und liest LOW.

Dein KFZ-Signal vom Rückwärtsgang hat 12V?
Das könntest Du mit einer Diode, Anode zum Arduino, Kathode zum Signal, entkoppeln.
Wenn das Signal GND hat, fließen die 5V des Arduino nach GND ab - Du misst GND.
Wenn das Signal 12V sperrt die Diode, die 12V bleiben 'draußen', der PullUp zieht den Pin auf HIGH, Du liest HIGH ein.
Wichtig ist hierfür, daß die Signalleitung aktiv GND bzw. +12V liefert - bei einer offene Leitung funktioniert Das so nicht.

Ob die Diode auch die Spannungsschwankungen abhält, ist fraglich.
Eine Beschaltung für den KFZ-Betrieb sieht umfangreicher aus:
KFZ-Bordnetz, dse-faq

MfG

postmaster-ino:
Hi

Deine 5 Minuten Zwangspause IN der ISR ... etwas 'eigen' nennen wir Es Mal.

MfG

Diesen Code hab ich definitiv verwurschtelt ...
Da es mein erstes Projekt überhaupt ist kann man mir das bestimmt verzeihen... Aber der Code ist weg und nicht mehr in benutzung :slight_smile:

Wenn man das so übersetzt ist es echt kurios..

delay() in einer ISR ist nicht nur schlechtes Design. Es geht einfach nicht. delay() fragt intern micros() ab, welches auf einem Timer-Interrupt passiert. Allerdings sind in einer ISR alle anderen ISRs gesperrt. Dadurch inkrementiert micros() nicht richtig weil die Überläufe des Timers nicht gezählt werden

noiasca:
wie schaltet heute dein Retourgang? hast du da 12+ oder GND wenn der Retourgang eingelegt ist?

Zur Zeit ist es nur ein gestecktes Modell auf meinem Tisch, wo ich mir in Port 2 das Input-Signal über den Arduino 5v ziehe als interpretiertes +12v Rückfahrlicht. Siehe bild im ersten Post.

Im Code-Aufbau macht das doch keinen Unterschied aus oder ?

Das war für mich am Bild nicht erkennbar. Das System ist sehr ähnlich aber die negationen mit dem ! Sind falsch bzw fehlen beim digitalread. Und den Input_PULLUP darfst halt nicht aktivieren. Egal, du sollst den Ablauf ohnehin verstehen und selber anpassen können.