#include <Wire.h>
          
          //variabelen aanmaken.
          #define latchPin 5 //pin  5 van de latchpin
          #define dataPin  4 //pin 4 van de datapin
          #define clockPin 2 //pin 2 van de clockpin
          #define LedKnopBoven 11   //pin 11 wordt verbonden met LedKnopBoven 
          #define LedKnopBeneden 12     //pin 12 wordt verbonden met LedKnopBeneden 
          #define KnopBoven 9   //pin 9 wordt verbonden met KnopBoven 
          #define KnopBeneden 8  //pin 8 wordt verbonden met KnopBeneden 
          #define DeurLed 13    //pin 13 wordt verbonden met deurled 
          #define IR_Sensor 3 //pin aangesloten voor IR sensor
          
          int datArray[10] = {3, 159, 37, 13, 153, 73, 65, 31, 1, 9}; // array without the decimal {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
          int num;// ruimte vrijmaken voor nummer van digit
          
          void setup() {
            
            pinMode(latchPin,OUTPUT);// latchpin als output
            pinMode(dataPin,OUTPUT);// datapin als output
            pinMode(clockPin,OUTPUT);//clockpin als output
            pinMode(IR_Sensor,INPUT);//ir sensor als input
            pinMode(LedKnopBoven,OUTPUT);//led knop beneden als output
            pinMode(LedKnopBeneden,OUTPUT);//led knop beneden als output
            pinMode(DeurLed,OUTPUT);//deur led als output
            pinMode(KnopBoven,INPUT);// knop boven als input
            pinMode(KnopBeneden,INPUT);// knop beneden als input
            Serial.begin(9600);
            Wire.begin(1);// adres van slave op 1 zetten
            Wire.onRequest(sendDataToMaster);// voor dingen te sturen
            Wire.onReceive(getLiftRelatedData);// voor dingen te ontvangen
          }
          
          void loop() {
            if(digitalRead(KnopBoven) == HIGH){// als knopbove wordt ingedrukt
              digitalWrite(LedKnopBoven, HIGH);         //knopboven aanzetten
                       
            }
          
              if(digitalRead(KnopBeneden) == HIGH){//als knopbeneden wordt ingedrukt
              digitalWrite(LedKnopBeneden, HIGH);// knopbeneden aanzetten
              Serial.println("aan2");
            }
           
            if(digitalRead(IR_Sensor) == 0 && (digitalRead(LedKnopBoven) == HIGH || digitalRead(LedKnopBeneden) == HIGH)){           //als hij sensor detecteerd en een van de twee of allebie de knoppen zijn ingedrukt
              while(digitalRead(IR_Sensor) == 0){//wanneer sensor gedetecteerd is
               
                digitalWrite(LedKnopBoven, LOW);                                     //led knop boven wordt uit gezet
                digitalWrite(LedKnopBeneden, LOW);                                    //led knop beneden wordt uitgezet
                delay(100);
                digitalWrite(DeurLed, HIGH);                                   //deur led aanzetten 
              }
            }
              
            else{                                                         //anders
             digitalWrite(DeurLed, LOW);                                  // deur led uitzetten
             }
          
          }
            void getLiftRelatedData(){
              int dataMaster = Wire.read();// lees data van de master voor digitnummer
              if (dataMaster == 0){//als digit 0 moet zijn
                num = 0;//nummer van de 7segment display op 0 zetten
                digitalWrite(latchPin,LOW);//7segment display leeg maken
                shiftOut(dataPin,clockPin,MSBFIRST,datArray[num]);// de nummer die wordt gegeven in de shift out zetten
                digitalWrite(latchPin,HIGH);// de 7segment display aan zetten en het nummer daadwerkelijk laten zien
                }
                
               else if (dataMaster == 1){//als digit 1 moet zijn
                num = 1;//nummer van de 7segment display op 1 zetten
                digitalWrite(latchPin,LOW);//7segment display leeg maken
                shiftOut(dataPin,clockPin,MSBFIRST,datArray[num]);// de nummer die wordt gegeven in de shift out zetten
                digitalWrite(latchPin,HIGH);// de 7segment display aan zetten en het nummer daadwerkelijk laten zien;
                }
                
               else if (dataMaster == 2){//als digit 2 moet zijn
                num = 2;//nummer van de 7segment display op 2 zetten
                digitalWrite(latchPin,LOW);//7segment display leeg maken
                shiftOut(dataPin,clockPin,MSBFIRST,datArray[num]);// de nummer die wordt gegeven in de shift out zetten
                digitalWrite(latchPin,HIGH);// de 7segment display aan zetten en het nummer daadwerkelijk laten zien
                }
          
               else if (dataMaster == 3){//als digit 3 moet zijn
                num = 3;//nummer van de 7segment display op 3 zetten
                digitalWrite(latchPin,LOW);//7segment display leeg maken
                shiftOut(dataPin,clockPin,MSBFIRST,datArray[num]);// de nummer die wordt gegeven in de shift out zetten
                digitalWrite(latchPin,HIGH);// de 7segment display aan zetten en het nummer daadwerkelijk laten zien
                }
              }
          
            void sendDataToMaster(){
                bool statusKnopBoven = 0, statusKnopBeneden = 0, statusSensor = 0;// defineer de status van de knoppen en sensor
              if(digitalRead(KnopBoven) == HIGH || digitalRead(LedKnopBoven) == HIGH){             //als de knop boven ingedrukt is of is geweest
                statusKnopBoven = 1;// zeg dat de status van de knop 1 is
                statusKnopBeneden = 0;// zeg dat de status van de knop 0 is
                statusSensor = 0;// zeg dat de status van de sensor 0 is
                Wire.write(statusKnopBoven);// stuur de status van knop boven
                Wire.write(statusKnopBeneden);// stuur de status van knop beneden
                Wire.write(statusSensor);// stuur de status van de sensor
                }
          
               if(digitalRead(KnopBeneden) == HIGH || digitalRead(LedKnopBeneden) == HIGH){// als knop beneden ingedrukt is of is geweest
                 statusKnopBoven = 0;//zeg dat de status van de knop 0 is
                 statusKnopBeneden = 1;// zeg dat de status van de knop 1 is
                 statusSensor = 0;//zeg dat de status van de sensor 0 is
                 Wire.write(statusKnopBoven);//stuur de status van knop boven
                 Wire.write(statusKnopBeneden);// stuur de status van de knop beneden
                 Wire.write(statusSensor);// stuur de status van de sensor
                }
          
                if(digitalRead(IR_Sensor) == 0){//als de sensor iets detecteerd
                   statusKnopBoven = 0;// zeg dat de status van de knop 0 is
                   statusKnopBeneden = 0;//zeg dat de status van de knop 0 is
                   statusSensor = 1;// zeg dat de status van de sensor 1 is
                   Wire.write(statusKnopBoven);//stuur de status van de knop boven
                   Wire.write(statusKnopBeneden);// stuur de status van de knop beneden
                   Wire.write(statusSensor);// stuur de status van de sensor
                  }
          
                  if (digitalRead(IR_Sensor) == 1 && (digitalRead(KnopBeneden) == LOW || digitalRead(LedKnopBeneden) == LOW)&&(digitalRead(KnopBoven) == LOW || digitalRead(LedKnopBoven) == LOW) ){//als sensor niks detecteerd en beide knoppen niks detecteerd
                   statusKnopBoven = 0;//zeg dat de status van de knop 0 is
                   statusKnopBeneden = 0;//zeg dat de status van de knop 0 is
                   statusSensor = 0;// zeg dat de status van de sensor 0 is
                   Wire.write(statusKnopBoven);// stuurt de status van de knop boven
                   Wire.write(statusKnopBeneden);//stuurt de status van de knop beneden
                   Wire.write(statusSensor);// stuur de status van de sensor
                  }
                          
          
              }