Paso 3: Escribir el código
El código es muy similar a la aquí: http://playground.arduino.cc/Learning/Tachometer, de hecho escribí basado en ese código. Sólo que en lugar de contar cuantas veces los sensores están diciendo Hola mutuamente cada cierto periodo, contar cuánto tiempo hasta que el otro pueden ver otra vez después de la última reunión. Además, me parece que usando micros(), que devuelve el microcontrolador tiempo en microsegundos, da un resultado significativamente más preciso que si usé millis() en el mismo lugar.
Aquí está el código:
int sensorvalue; int state1 = HIGH; int state2; float rps; float rpm; long prevMillis = 0; long interval = 200; long currentTime; long prevTime = 1; long diffTime; int sensorthreshold = 30; // this value indicates the limit reading between dark and light, // it has to be tested as it may change acording to the // distance the leds are placed. // to see what number is good, check the sensorvalue variable value // as printed out in the serial monitor void setup() { Serial.begin(9600); pinMode(13,OUTPUT); // assign pin 13 led as indicator because we cannot se the IR light } void loop() { sensorvalue = analogRead(0); // read from pin 0 if(sensorvalue < sensorthreshold) state1 = HIGH; else state1 = LOW; digitalWrite(13,state1); // as iR light is invisible for us, the led on pin 13 // indicate the state of the circuit. if(state2!=state1){ //counts when the state change, thats from (dark to light) or //from (light to dark), remember that IR light is invisible to us. if (state2>state1){ currentTime = micros(); // Get the arduino time in microseconds diffTime = currentTime - prevTime; // calculate the time diff from the last meet-up rps = 1000000/diffTime; // calculate how many rev per second, good to know rpm = 60000000/diffTime; // calculate how many rev per minute unsigned long currentMillis = millis(); // print to serial at every interval - defined at the variables declaration if(currentMillis - prevMillis > interval){ // see if now already an interval long prevMillis = currentMillis; Serial.print(rps); Serial.print(" rps "); Serial.print(rpm); Serial.println(" rpm"); } prevTime = currentTime; } state2 = state1; } /* //only for testing to determine the sensorthreshold value delay(500); Serial.println(sensorvalue); */ }
Lo difícil fue en definir el valor de sensorthreshold. Hice esto: comentar la rutina principal y quite el comentario de la sección de prueba como se ve en los siguientes códigos. Arduino de manera escribir a monitor serial y actualizar el valor del sensor en la pantalla cada 500 ms. compilar y subir tu código a la placa, luego abra al monitor serie. Girar y parar la rueda para que los sensores están bloqueados y mirar qué número aparece en el monitor serial (en mi caso alrededor de 37-40), girar y parar donde los sensores pueden vernos a través de la ventana y mirar qué número en la pantalla (en mi caso 14-19). Entonces se fija un número como valor de la variable sensorthreshold que ahora sabes lo que es un buen número para distinguir entre "ver" o "no ver" (puse 30 en mi caso, porque mi "no ven" es de 37-40 y "ve" es de 14-19, entre 20-36 puede hacer la misma función también, pero no realmente seguro porque el valor puede a veces ser 35 o 21 debido a la interferencia de las luces de ambiente en las conexiones eléctricas, u otras cosas que sinceramente no entiendo sobre). Por lo tanto, para el corto, cheque el número cuando los sensores de IR a ver y comprobarlo cuando los sensores están bloqueados, entonces encuentran a un buen número en el medio que está seguro distinguirá entre "ver" y "no ver".
A continuación, la modificación del código para comprobar el buen número de variable sensorthreshold:
... void loop() { sensorvalue = analogRead(0); // read from pin 0 /* if(sensorvalue < sensorthreshold) ... state2 = state1; } */ // only for testing to determine the sensorthreshold value delay(500); Serial.println(sensorvalue); }