«Botón sin contacto» con célula fotoléctrica en tiempos de COVID-19

En los tiempos que nos ha tocado vivir con la crisis del COVID-19 previsiblemente vamos a tener que habituarnos a un nuevo escenario vital, en el que deberemos cambiar ciertos hábitos y formas de relacionarnos entre las personas y de interactuar con los objetos, al menos por un tiempo.

Entre otras cosas, es de esperar que cada vez más se evite en la medida de lo posible tocar cosas que tocan otras muchas personas, como interruptores, por lo que seguramente se tenderá a interruptores sin contacto.

Describo aquí uno de esos tipos de botones, que pretendo emplear en un próximo proyecto (un termómetro infrarrojo sin contacto, para que por ejemplo las personas de una oficina puedan tomarse la temperatura de forma inmediata y sin contacto, estando colocado el aparatito en una zona común, como puede ser el baño…)

La verdad es que es uno de los proyectos más simples que puede haber: tomar lecturas de una célula fotoeléctrica y si se cumple cierto criterio (que baja la intensidad en un breve tiempo para luego recuperarse, que es lo que ocurre al pasar la mano por delante «a lo Jedi») enciende un LED.

En el fondo, es el mismo tipo de interruptor de los grifos automáticos:

Grifo Automatico Con Sensor En Cuello Recto Valvula Ysg8007 ...

Lo he hecho con un Arduino Micro (Leonardo), conectando los componentes según el siguiente diagrama:

555 bc0rol83ox
Diagrama Fritzing de conexión (tomado de aquí)

El código que he creado es el siguiente:

<code>const int ledPin = 9;
const int fotoresistPin = 0;
const int sensibilidad = 5;
const int tiempoSens1 =200;
const int tiempoSens2 =50;

int valor;
int valorAnt;
int valorPrev;

void setup() {
Serial.begin(9600);
}

void loop() {
  valor = analogRead(fotoresistPin);
  Serial.print("Valor :");
  Serial.println(valor);
  valorPrev = valor;

  if (valor &lt; valorAnt - sensibilidad)
  {
    delay(tiempoSens1);
    valor = analogRead(fotoresistPin);
    if (valor >= valorPrev)
    {
    Serial.println("Enciendo");  
    digitalWrite(ledPin, HIGH);
    delay(50);
    Serial.println("Apago");  
    digitalWrite(ledPin, LOW); 
    }
  }

  valorAnt = valor;
  
  delay(tiempoSens2);

}</code>

Y en el siguiente vídeo se puede ver en funcionamiento:

https://youtu.be/mS1k-b3P_7Q

Referencias

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.