LDR calibration with push buttons for min & max value

I got a school project for which I need to use 2 given sensors and 2 given actuators. I’ve made a system in which an ultrasonic sensor activates one of 2 LED groups. Both LED groups have a LDR sensor next to them, if no LDR gets light from the LEDS a RGB shines blue. When LED group 1 shines on LDR 1 the RGB turns red. When LED group 2 shines on LDR 2 the RGB turns green. The system works fine but the teacher wants me to ad a calibration function on the LDRs. I have 2 pushbuttons for this, one pushbotton will set the min value for the 2 LDRs and the other pushbutton will set the max value. I’ve connected everything but I’m stuck at writing the coding for the calibration function. If someone could help me by explaining to me how to write the code or by giving me an example code I would be really grateful.
This is my code at the moment

#include <Adafruit_SSD1306.h> //gebruik de library
#include <Adafruit_GFX.h> //gebruik de library
#define OLED_RESET 4 //
#define RED 0xF800 //
Adafruit_SSD1306 display(OLED_RESET); //
const int trigPin = 9; //geeft aan in welke port de triggerpin is
const int echoPin = 10; //geeft aan in welke port de echo
long tijd; //variabele voor de tijd die het geluid nodig heeft
int afstandCM; //definieert de integer
int redPin= 14; //geeft aan in welke port de pin zit
int greenPin = 15; //geeft aan in welke port de pin zit
int bluePin = 16; //geeft aan in welke port de pin zit
int ledPin5 = 5; //geeft aan in welke port de pin zit
int ledPin6 = 6; //geeft aan in welke port de pin zit
int ledPin7 = 7;//geeft aan in welke port de pin zit
int ledPin11 = 11; //geeft aan in welke port de pin zit
int ledPin12 = 12; //geeft aan in welke port de pin zit
int ledPin13 = 13; //geeft aan in welke port de pin zit
const int ldrPin1 = A0; //geeft aan in welke port de pin zit
const int ldrPin2 = A1; //geeft aan in welke port de pin zit
const int buttonLPin = 40;
const int buttonHPin = 41;
int buttonLState = 0;
int buttonHState = 0;

void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //start het schermpje
display.display(); // display de commando
display.clearDisplay(); // maak het scherm leeg

pinMode(trigPin, OUTPUT); //definieert de triggerpin als output
pinMode(echoPin, INPUT); //definieert de echopin als input
Serial.begin(9600); //zorgt voor de communicatie tussen de Arduino en de pc

pinMode(ledPin5, OUTPUT); //definieert de pin als een output
pinMode(ledPin6, OUTPUT); //definieert de pin als een output
pinMode(ledPin7, OUTPUT); //definieert de pin als een output
pinMode(ledPin11, OUTPUT); //definieert de pin als een output
pinMode(ledPin12, OUTPUT); //definieert de pin als een output
pinMode(ledPin13, OUTPUT); //definieert de pin als een output

pinMode(ldrPin1, INPUT); //definieert de pin als een input
pinMode(ldrPin2, INPUT); //definieert de pin als een input

pinMode(redPin, OUTPUT); //definieert de pin als een output
pinMode(greenPin, OUTPUT); //definieert de pin als een output
pinMode(bluePin, OUTPUT); //definieert de pin als een output

pinMode(buttonLPin, INPUT);
pinMode(buttonHPin, INPUT);
}

void loop() {

//begin code ultrasoonsensor

digitalWrite(trigPin, LOW); //zorgt er voor dat de triggerpin leeg is
delayMicroseconds(2); //wacht met het beginnen
digitalWrite(trigPin, HIGH); //start het versturen van geluid
delayMicroseconds(10); //wacht met het stoppen
digitalWrite(trigPin, LOW); //stop het versturen van geluid

tijd = pulseIn(echoPin, HIGH); //lees de tijd voor het terugkaatsen van het geluid en noem het tijd
afstandCM= tijd*0.034/2; //reken de variabele tijd om tot de afstand in centimeter en noem het afstand cm

display.setTextSize(1); // grootte text
display.setTextColor(WHITE); // kleur text

Serial.println(buttonLState);
if (( afstandCM<55 ) && ( afstandCM>15 )){ // begin loop als afstand kleiner dan 55 en groter dan 15
display.display(); //laat het commando op het scherm zien
display.print(“TARGET IN SIGHT”); //wat voor text wil je hebben
display.setCursor(1, 20); //locatie text
}

else if (( afstandCM<=15 ) && ( afstandCM>0 )){ // begin loop als afstand kleiner dan 15 of gelijk aan 15
display.display(); //laat het commando op het scherm zien
display.print(“TARGET IN RANGE”); //wat voor text wil je hebben
display.setCursor(1, 20); //locatie text
}

display.display(); //laat het commando op je scherm zien
display.clearDisplay(); //wis de oude text
display.print(afstandCM); //text die op het scherm komt
display.setCursor(1, 1); //locatie text

//einde code ultrasoonsensor

//begin kalibratie code

buttonLState = digitalRead(buttonLPin);
buttonHState = digitalRead(buttonHPin);

if ((buttonLState == HIGH)&& (afstandCM>55)) {
digitalWrite(ledPin5, LOW);
digitalWrite(ledPin11, LOW);
} else if ((buttonLState == LOW)&& (afstandCM>55)){
digitalWrite(ledPin5, HIGH);
digitalWrite(ledPin11, HIGH);
}
if ((buttonHState == HIGH) && ( afstandCM>55 )) {
// turn LED on:
digitalWrite(ledPin6, HIGH);
digitalWrite(ledPin7, HIGH);
digitalWrite(ledPin12, HIGH);
digitalWrite(ledPin13, HIGH);
} else if ((buttonHState == LOW)&& (afstandCM>55)) {
// turn LED off:
digitalWrite(ledPin6, LOW);
digitalWrite(ledPin7, LOW);
digitalWrite(ledPin12, LOW);
digitalWrite(ledPin13, LOW);
}
//einde kalibratie code

//begin code LED’s
if (( afstandCM<55 )&& ( afstandCM>15 )) { //voorwaarde voor de loop, wanneer het object zichtbaar is gaat LEDgroep A aan
digitalWrite(ledPin5, HIGH); //geef een hoog voltage
digitalWrite(ledPin6, HIGH); //geef een hoog voltage
digitalWrite(ledPin7, HIGH); //geef een hoog voltage
digitalWrite(ledPin11, LOW); //geef geen voltage
digitalWrite(ledPin12, LOW); //geef geen voltage
digitalWrite(ledPin13, LOW); //geef geen voltage
}
// else if (afstandCM>=55) { //voorwaarde voor de loop, bij een grote afstand alle LEDS uit
// digitalWrite(ledPin5, LOW); //geef geen voltage
// digitalWrite(ledPin6, LOW); //geef geen voltage
// digitalWrite(ledPin7, LOW); //geef geen voltage
// digitalWrite(ledPin11, LOW); //geef geen voltage
// digitalWrite(ledPin12, LOW); //geef geen voltage
// digitalWrite(ledPin13, LOW); //geef geen voltage
// }
else if ((afstandCM<=15) && (afstandCM>0)) { //voorwaarde voor de loop,wanneer het object dichtbij is gaat LEDgroep B aan en gaat LEDgroep A uit
digitalWrite(ledPin5, LOW); //geef geen voltage
digitalWrite(ledPin6, LOW); //geef geen voltage
digitalWrite(ledPin7, LOW); //geef geen voltage
digitalWrite(ledPin11, HIGH); //geef een hoog voltage
digitalWrite(ledPin12, HIGH); //geef een hoog voltage
digitalWrite(ledPin13, HIGH); //geef een hoog voltage
}
//einde code LED’s

//begin code LDR’s

int ldr1Status = analogRead(ldrPin1); //geeft aan dat de LDRpin analoog gelezen moet worden
int ldr2Status = analogRead(ldrPin2); //geeft aan dat de LDRpin analoog gelezen moet worden

if ((ldr1Status <= 500) && (ldr2Status <= 500)){ // voorwaarde voor de loop om de RGB blauw te maken wanneer beide LDR’s donker zijn
display.print(“AREA CLEAR”); //wat voor text wil je hebben
display.setCursor(1, 30); //locatie text
digitalWrite(redPin, LOW); //geef geen voltage
digitalWrite(greenPin, LOW); //geef geen voltage
digitalWrite(bluePin, HIGH); //geef een hoog voltage
}

else if (ldr1Status > 500) { // voorwaarde voor de loop om de RGB rood te maken waneer LDR 1 in het licht staat
display.display(); //laat het commando op het scherm zien
display.print(“LOCKING TARGET”); //wat voor text wil je hebben
display.setCursor(1, 30); //locatie text
digitalWrite(redPin, HIGH); //geef een hoog voltage
digitalWrite(greenPin, LOW); //geef geen voltage
digitalWrite(bluePin, LOW); //geef geen voltage
}

else if (ldr2Status > 500) { // voorwaarde voor de loop om de RGB groen te maken waneer LDR 2 in het licht staat
display.display(); //laat het commando op het scherm zien
display.print(“TARGET LOCKED”); //wat voor text wil je hebben
display.setCursor(1, 30); //locatie text
digitalWrite(greenPin, HIGH); //geef een hoog voltage
digitalWrite(redPin, LOW); //geef geen voltage
digitalWrite(bluePin, LOW); //geef geen voltage
}
}

.

the teacher wants me

Get back to us when you have your attempt to show.
Pin numbers should normally be constants.
Please remember to use code tags when posting code

This is my attempt to put in the calibration put it’s not working.
I’ve tried having the calibration code in the void setup instead of the loop but the pushbuttons would only work after the calibration ended

#include <Adafruit_SSD1306.h> //gebruik de library
#include <Adafruit_GFX.h> //gebruik de library
#define OLED_RESET 4 //
#define RED 0xF800 //
Adafruit_SSD1306 display(OLED_RESET); //
const int trigPin = 9; //geeft aan in welke port de triggerpin is
const int echoPin = 10; //geeft aan in welke port de echo
long tijd; //variabele voor de tijd die het geluid nodig heeft
int afstandCM; //definieert de integer 
const int redPin= 14; 
const int greenPin = 15; 
const int bluePin = 16; 
const int ledPin5 = 5; 
const int ledPin6 = 6;
const int ledPin7 = 7; 
const int ledPin11 = 11; 
const int ledPin12 = 12; 
const int ledPin13 = 13; 
const int ldrPin1 = A0; 
const int ldrPin2 = A1;  
const int buttonLPin = 40; 
const int buttonHPin = 41; 
int buttonLState = 0; //geeft de standaart knop status
int buttonHState = 0; //geeft de standaart knop status
int LDR1Value = 0;         // beginwaarde sensor - the sensor value
int LDR1Min = 1023;        // minimum sensor waarde - minimum sensor value
int LDR1Max = 0;           // maximum sensor waarde- maximum sensor value
int LDR2Value = 0;         // beginwaarde sensor - the sensor value
int LDR2Min = 1023;        // minimum sensor waarde - minimum sensor value
int LDR2Max = 0;           // maximum sensor waarde- maximum sensor value
const int ledPin30 = 30;  
const int ledPin31 = 31;  


void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  
display.display();  
display.clearDisplay();  

pinMode(trigPin, OUTPUT); //definieert de triggerpin als output
pinMode(echoPin, INPUT); //definieert de echopin als input
Serial.begin(9600); //zorgt voor de communicatie tussen de Arduino en de pc

pinMode(ledPin5, OUTPUT);  
pinMode(ledPin6, OUTPUT);  
pinMode(ledPin7, OUTPUT);  
pinMode(ledPin11, OUTPUT); 
pinMode(ledPin12, OUTPUT);  
pinMode(ledPin13, OUTPUT);  

pinMode(ldrPin1, INPUT);  
pinMode(ldrPin2, INPUT); 

pinMode(redPin, OUTPUT); 
pinMode(greenPin, OUTPUT); 
pinMode(bluePin, OUTPUT); 

pinMode(buttonLPin, INPUT);  
pinMode(buttonHPin, INPUT); 

pinMode(ledPin30, OUTPUT);  
pinMode(ledPin31, OUTPUT);  
 


}

void loop() {

  //begin pushbutton code
buttonLState = digitalRead(buttonLPin); //read the L button
buttonHState = digitalRead(buttonHPin); //read the H button

  if (buttonHState == HIGH) { //condition for the loop
    digitalWrite(ledPin5, HIGH); //turn led on
    digitalWrite(ledPin6, HIGH); //turn led on
    digitalWrite(ledPin7, HIGH); //turn led on
    digitalWrite(ledPin11, HIGH); //turn led on
    digitalWrite(ledPin12, HIGH); //turn led on
    digitalWrite(ledPin13, HIGH); //turn led on
  } else if (buttonHState == LOW) { //condition for the loop
    digitalWrite(ledPin5, LOW); //turn led off
    digitalWrite(ledPin6, LOW); //turn led off
    digitalWrite(ledPin7, LOW); //turn led off
    digitalWrite(ledPin11, LOW); //turn led off
    digitalWrite(ledPin12, LOW); //turn led off
    digitalWrite(ledPin13, LOW); //turn led off
  }

//einde pushbutton code



//begin code ultrasoonsensor  

digitalWrite(trigPin, LOW); //zorgt er voor dat de triggerpin leeg is
delayMicroseconds(2); //wacht met het beginnen
digitalWrite(trigPin, HIGH); //start het versturen van geluid
delayMicroseconds(10); //wacht met het stoppen
digitalWrite(trigPin, LOW); //stop het versturen van geluid

tijd = pulseIn(echoPin, HIGH); //lees de tijd voor het terugkaatsen van het geluid en noem het tijd
afstandCM= tijd*0.034/2; //reken de variabele tijd om tot de afstand in centimeter en noem het afstand cm

display.setTextSize(1); // grootte text
display.setTextColor(WHITE); // kleur text


 Serial.println(buttonLState);
if (( afstandCM<55 ) && ( afstandCM>15 )){  // begin loop als afstand kleiner dan 55 en groter dan 15
display.display(); //laat het commando op het scherm zien
display.print("TARGET IN SIGHT"); //wat voor text wil je hebben
display.setCursor(1, 20); //locatie text
}

else if (( afstandCM<=15 ) && ( afstandCM>0 )){  // begin loop als afstand kleiner dan 15 of gelijk aan 15
display.display(); //laat het commando op het scherm zien
display.print("TARGET IN RANGE"); //wat voor text wil je hebben
display.setCursor(1, 20); //locatie text
}

display.display(); //laat het commando op je scherm zien
display.clearDisplay(); //wis de oude text
display.print(afstandCM); //text die op het scherm komt
display.setCursor(1, 1); //locatie text

  
//einde code ultrasoonsensor

//begin kalibratie code
 if (Serial.available() > 0) {
    // geeft de voorwaarde om de loop te starten
    char letter = Serial.read(); //laat Arduino de serial monitor lezen
    Serial.println(letter); //laat Arduino de input in de serial monitor schrijven
    if (letter == 'x') { //wanneer de letter op de serial monitor gelijk is aan x
      while (millis() < 5000) { //how long the calibration will last
   digitalWrite(ledPin30, HIGH); //turn on the led during the calibration
   digitalWrite(ledPin31, LOW); //turn off the led during the calibration
    LDR1Value = analogRead(ldrPin1); //read LDR1 value
    LDR2Value = analogRead(ldrPin2); //read LDR2 value

    // record the maximum sensor value
    if (buttonHState == HIGH) { //condition for setting the max value
      LDR1Max = LDR1Value; //current value is the max value
      LDR2Max = LDR2Value; //current value is the max value
    }

    // record the minimum sensor value
    if (buttonHState == LOW) { //condition for setting the min value
      LDR1Min = LDR1Value; //current value is the min value
      LDR2Min = LDR2Value; //current value is the min value
   }
  }
 }
 
digitalWrite(ledPin30, LOW); //turn led off
digitalWrite(ledPin31, HIGH); //turn led on
 }


  LDR1Value = analogRead(ldrPin1);//read the LDR 1 
  LDR2Value = analogRead(ldrPin2);//read the LDR 2

  LDR1Value = map(LDR1Value, LDR1Min, LDR1Max, 0, 255); //apply the min and max for LDR1
  LDR2Value = map(LDR2Value, LDR2Min, LDR2Max, 0, 255); //apply the min and max for LDR2

  LDR1Value = constrain(LDR1Value, 0, 255); //constrain the LDR1 to the min and max value
  LDR2Value = constrain(LDR2Value, 0, 255);  //constrain the LDR2 to the min and max value
//einde kabratie code






//begin code LED's
if (( afstandCM<55 )&& ( afstandCM>15 )) { //voorwaarde voor de loop, wanneer het object zichtbaar is gaat LEDgroep A aan
      digitalWrite(ledPin5, HIGH);  
      digitalWrite(ledPin6, HIGH); 
      digitalWrite(ledPin7, HIGH);  
      digitalWrite(ledPin11, LOW);  
     digitalWrite(ledPin12, LOW);  
     digitalWrite(ledPin13, LOW); 
    }
   else if (afstandCM>=55) { //voorwaarde voor de loop, bij een grote afstand alle LEDS uit
   digitalWrite(ledPin5, LOW);  
   digitalWrite(ledPin6, LOW); 
   digitalWrite(ledPin7, LOW);  
   digitalWrite(ledPin11, LOW);  
   digitalWrite(ledPin12, LOW); 
   digitalWrite(ledPin13, LOW);  
    }
     else if ((afstandCM<=15) && (afstandCM>0)) { //voorwaarde voor de loop,wanneer het object dichtbij is gaat LEDgroep B aan en gaat LEDgroep A uit
     digitalWrite(ledPin5, LOW); 
     digitalWrite(ledPin6, LOW);  
     digitalWrite(ledPin7, LOW); 
     digitalWrite(ledPin11, HIGH);  
     digitalWrite(ledPin12, HIGH); 
     digitalWrite(ledPin13, HIGH);  
    }
//einde code LED's

//begin code LDR's

int ldr1Status = LDR1Value;  
int ldr2Status = LDR2Value;  
 Serial.println(LDR1Value);
 Serial.println(LDR2Value);

if ((LDR1Value >= 200) && (LDR2Value >= 200)){ // voorwaarde voor de loop om de RGB blauw te maken wanneer beide LDR's donker zijn
display.print("AREA CLEAR"); 
display.setCursor(1, 30);  
digitalWrite(redPin, LOW);  
digitalWrite(greenPin, LOW);  
digitalWrite(bluePin, HIGH);  
}

else if (LDR1Value < 200) { // voorwaarde voor de loop om de RGB rood te maken waneer LDR 1 in het licht staat
display.display(); 
display.print("LOCKING TARGET"); 
display.setCursor(1, 30);  
digitalWrite(redPin, HIGH); 
digitalWrite(greenPin, LOW); 
digitalWrite(bluePin, LOW); 
}


else if (LDR2Value < 200) { // voorwaarde voor de loop om de RGB groen te maken waneer LDR 2 in het licht staat
display.display(); 
display.print("TARGET LOCKED"); 
display.setCursor(1, 30); 
digitalWrite(greenPin, HIGH); 
digitalWrite(redPin, LOW); 
digitalWrite(bluePin, LOW); 
}
}

TheMemberFormerlyKnownAsAWOL:
Get back to us when you have your attempt to show.
Pin numbers should normally be constants.
Please remember to use code tags when posting code

Sorry I couldn't find the code tag at first.
The reason I came here for help is because my attempts are way of and I hoped someone could guide me in the right direction or preferably help me, and yes I've looked for tutorials etc.. But still I've posted my most recent attempt.

But still I’ve posted my most recent attempt.

That code does an awful lot of stuff that has nothing to do with reading an LDR, and recording the highest and lowest reading in some period of time.

When writing code to develop a new capability, do NOT add it to an existing sketch. Create a new sketch that focuses entirely on the new capability.

  if (buttonHState == HIGH) { //condition for the loop

Does that useless comment add ANY value?

  } else if (buttonHState == LOW) { //condition for the loop

Are you planning for the switch state to be something other than HIGH or LOW? I’ve got new for you. If the pin isn’t HIGH, it can’t be in any other state than LOW.

      while (millis() < 5000) { //how long the calibration will last

You should almost never use millis() by itself, in while loops.

If you want to do something for 5 seconds, it is for 5 seconds after the trigger event, NOT 5 seconds after the Arduino resets.

I started the script from scratch and made it part by part to keep it easy to troubleshoot. I know it’s less than optimal to add the calibration function at the end. It was only after I thought I was finished I found out I need the calibration part.
I wrote comments behind every line because my teacher demands it. The buttonHstate == high was added because I wanted the calibration to record the max value while the button is pressed.
If I delete the 5 seconds, how will the calibration part end? Can I finish it with a command in the serial monitor?
Basically what I need to know is how to make the LDR calibrate it’s max value when button 1 is pressed and min value when button 2 is pressed. That’s why I opened this topic,while I fixed all the other parts I’m totally lost for as how to do the calibration with the buttons

PaulS:
That code does an awful lot of stuff that has nothing to do with reading an LDR, and recording the highest and lowest reading in some period of time.

When writing code to develop a new capability, do NOT add it to an existing sketch. Create a new sketch that focuses entirely on the new capability.

  if (buttonHState == HIGH) { //condition for the loop

Does that useless comment add ANY value?

  } else if (buttonHState == LOW) { //condition for the loop

Are you planning for the switch state to be something other than HIGH or LOW? I’ve got new for you. If the pin isn’t HIGH, it can’t be in any other state than LOW.

      while (millis() < 5000) { //how long the calibration will last

You should almost never use millis() by itself, in while loops.

If you want to do something for 5 seconds, it is for 5 seconds after the trigger event, NOT 5 seconds after the Arduino resets.

It was only after I thought I was finished I found out I need the calibration part.

Fine. So write a separate script to develop and test that functionality. When that script works, a little cut-and-paste work should be all that is needed to add the functionality to the original sketch.

because my teacher demands it.

I’m sure your teacher is more interested in why you wrote the code the way you did. I’m sure that your teacher KNOWS that delay(1) causes a 1 millisecond delay. The question you should be anticipating/answering is why you are delaying.

The buttonHstate == high was added because I wanted the calibration to record the max value while the button is pressed.

I understand that. What I don’t understand is why the else has another if clause, when, should the if part not be true (the state is not HIGH), the clause following the else statement will ALWAYS be true.

When an if statement (or an else if statement) ALWAYS evaluates to true, the statement is not needed.

If I delete the 5 seconds, how will the calibration part end?

You don’t delete the call to millis() or the conditional part of the statement. What you need to do is understand that the end time is NOT 5 seconds after the Arduino resets. It is 5 seconds after the trigger event occurs. You need to record when the trigger event (the button BECOMES (not IS) pressed), and see if millis() - the trigger event time is less than 5 seconds.