Diferencia entre revisiones de «Medidor de parpadeo de luz»

Sin resumen de edición
Sin resumen de edición
 
(No se muestran 5 ediciones intermedias del mismo usuario)
Línea 1: Línea 1:
Este es un instrumento para medir el parpadeo de las fuentes de luz.
Algunas bombitas son mucho más estables que otras.
Esos datos no son disponibles.
Podemos medir y publicar datos sobre las bombitas que son comunes acá.
=Fotos=
<gallery>
Medidor de parpadeo de luz 1.jpg
Medidor de parpadeo de luz 2.jpg
</gallery>
=Sensor=
=Sensor=
* [[Media:Ti opt101.pdf | Texas Instruments OPT101 Hoja de Datos]]
* [[Media:Ti opt101.pdf | Texas Instruments OPT101 Hoja de Datos]]
Línea 5: Línea 16:
<pre>
<pre>


const int OVERLOAD_LED = 13;
#include "I2C_LCD.h"
const int COLLECTION_MS = 200;
 
const int DEAD_MS = 100;
const int COLLECTION_MS = 100;
const int SENSOR_MAX = 800;
const int SENSOR_LIMIT = 850;
const int SENSOR_BAJO = 200;
const int STOP_PIN = 3;
const int INTERRUPT_SETTLE_MS = 1000;
 
I2C_LCD lcd(39);
 
volatile bool run = true;
 
void stop() {
  if (millis() > INTERRUPT_SETTLE_MS) run = false;
}


void setup() {
void setup() {
   Serial.begin(9600);
   Wire.begin();
   pinMode(OVERLOAD_LED, OUTPUT);
  Wire.setClock(100000);
  lcd.begin(16, 2);
   pinMode(STOP_PIN, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(STOP_PIN), stop, LOW);
}
}


Línea 18: Línea 43:
   int x_max = 0, x_min = 10000;
   int x_max = 0, x_min = 10000;
   unsigned long stop_ms = millis() + COLLECTION_MS;
   unsigned long stop_ms = millis() + COLLECTION_MS;
  int sample_count = 0;
   while (millis() < stop_ms) {
   while (millis() < stop_ms) {
     int x = analogRead(A0);
     int x = analogRead(A0);
     if (x > x_max) x_max = x;
     if (x > x_max) x_max = x;
     if (x < x_min) x_min = x;
     if (x < x_min) x_min = x;
    sample_count++;
  }
  if (!run) return;
  lcd.clear();
  if (x_max > SENSOR_LIMIT) {
    lcd.center(1, "demasiada luz");
  } else if (x_max < SENSOR_BAJO) {
    lcd.center(1, "falta de luz");
  } else {
    float ratio = (float)x_min / x_max;
    lcd.center(0, ("ratio = " + String(ratio)).c_str());
    lcd.center(1, ("samples = " + String(sample_count)).c_str());
   }
   }
  digitalWrite(OVERLOAD_LED, x_max > SENSOR_MAX);
  float ratio = (float) x_min / x_max;
  Serial.println("0.0 1.0 " + String(ratio));
  delay(DEAD_MS);
}
}
</pre>
</pre>