|
|
|
![]() |
|
|||||||
|
||||||||
![]() |
|
|
Thread Tools | Rate Thread | Display Modes |
|
|
|
#1
|
||||
|
||||
|
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 ![]() |
|
#2
|
||||
|
||||
|
Re: Timing an LDR in C++
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: Code:
void main() {
if (sensor<black){
startTimer();
}
if (sensor == white && timerStarted == true){
if (timerValue<12600){
doSomething();
}
if (timerValue>12600){
doSomethingElse();
}
}
}
|
|
#3
|
||||
|
||||
|
Re: Timing an LDR in C++
Quote:
Code:
if(somethinghappens){
dosomething;
}else if(Somethingelsehappens){
dosomeotherthing;
}
![]() Last edited by jgrindle : 23-11-2015 at 21:00. Reason: clarification |
|
#4
|
|||
|
|||
|
Re: Timing an LDR in C++
You'll probably want to use a a state machine and grab samples from your LDR every 20ms or so.
Something like this: Code:
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));
}
}
|
|
#5
|
||||
|
||||
|
Re: Timing an LDR in C++
In FRC programming, I've noticed that nine times out of ten, state machines are the way to go
|
![]() |
| Thread Tools | |
| Display Modes | Rate This Thread |
|
|