Timing an LDR in C++

I’m so confused on this topic. I’m doing this for a arduino mega (pretty sure arduino is C++) What I’m trying to do is this: Read the value back from the LDR (Light Dependent Resistor) and start a timer for when the value is in a certain range and perform a function if the time recorded is a certain amount of time.

For example: I will have the LDR taped to a screen. SO when the screen is black (LDR value is about 120-150), it starts timing how long it was black for and keeps timing until the screen displays light (LDR 600 - 620). Hypothetically, lets say the screen was black for about 12000-12600ms, if the time recored falls between that, it does something but if its above 12600ms it does something else. (If, else statement)

However, all I know how to do is get the value of the LDR, I don’t know anything else.

Can someone help me with the code for the timing function, I’m lost.

If someone can pleaseeeeeeee help that would be the best thing ever :smiley:

Hmm…
I don’t know much about C++, but I would start by triggering a timer function when the sensor reads black, then when the sensor reads white, write the timer function’s time to a variable then use that in an elif statement (excuse my python)

something like:


void main() {
      if (sensor<black){
            startTimer();
      }
      if (sensor == white && timerStarted == true){
                if (timerValue<12600){
                        doSomething();
                }
                if (timerValue>12600){
                         doSomethingElse();
                }
         }
 }

PM me if you need anything else

Dubios you pretty much got it in terms for C++, just in a not very psuedoy pseudo code. For C++'s elif it’s just

if(somethinghappens){
	dosomething;
}else if(Somethingelsehappens){
	dosomeotherthing;
}

Does the same thing as your elif, but just not as fancy or short :frowning:

You’ll probably want to use a a state machine and grab samples from your LDR every 20ms or so.

Something like this:


const int BLACK = 0;
const int WHITE = 0;

int main()
{
	Timer t;
	LDR ldr;
	t.start();

	int state = WHITE;

	while (true)
	{
		int value = ldr.getValue();
		double blackStart = 0.0;
		
		switch (state)
		{
			case WHITE:
				if (value >= 120 && value <= 150)
				{
					blackStart = t.Get();
					state = BLACK;
				}
				break;
				
			case BLACK:
			{
				if (value >= 600 && value <= 620)
				{
					double timeDiff = t.Get() - blackStart;
					if (timeDiff >= 12.0 && timeDiff <= 12.6)
					{
						// do something
					}
					else if (timeDiff > 12.6)
					{
						// do something else
					}
					
					state = WHITE;
				}
			}
		}
		
		// sleep 20ms
		// This is C++11, not sure what the wpilib sleep API is.
		std::this_thread::sleep_for(std::chrono::milliseconds(20));
	}
}

Only problem is if your screen flashes white in < 20ms, you might not detect the change. You can try to offset that by reducing the thread’s sleep time, or by getting rid of it completely, but then your program will peg the CPU.

In FRC programming, I’ve noticed that nine times out of ten, state machines are the way to go