Vivo en un edificio antiguo con un garage al nivel del mar. ¿Y que es lo que pasa? Típico. Se nos inunda el foso del ascensor. Llevamos años aplicando diferentes soluciones. Pero el ambiente de humedad, grasa y salitre las deja fuera de juego en pocas semanas. He fracasado con soluciones de un interruptor-boya flotante para bomba de achique o un microcontrolador con sensores de nivel por resistividad. Ahora creo que la clave está en probar con sensores que no estén en contacto con un agua salada, aceitosa y con más de una incívica colilla blotando.
En 2018 tenemos una tecnología open hardware y unos precios AliExpress que nos permiten montar un detector por ultrasonidos y un controlador de motor por menos de 50€.
La pieza clave de este montaje es el sensor ultrasonidos HC-SR04:
Este sensor de ultrasonidos tiene el mismo principio de funcionamiento que el sonar de un submarino y consiste en enviar ultrasónicos. Que son sonidos por encima del rango autidivo. Estas ondas enviadas por un emisor revotan en los objetos y son recibidos por un receptor. Con esto tendríamos a cuánto tiempo esta el objeto, sí, habéis leído bien, estamos calculando el tiempo. Gracias a este tiempo y a la velocidad a la que viaja el sonido, 340 m/s, podemos calcular a que distancia se encuentra el objeto detectado gracias a la fórmula más que conocida por todos nosotros V = S / T. Si despejamos el espacio, S = V x T, es muy sencillo calcular la distancia a la que se encuentra el objeto y, precisamente, el sensor HC-SR04 nos proporciona las herramientas necesarias para hacer estos cálculos.
Este sensor tiene como dos ojos por donde emite y recibe los ultrasonidos, uno es el Trigger (emisor), que se conectará a un pin digital en modo OUTPUT y por donde emitiremos el ultrasonido, y el otro es el Echo (receptor), que se conecta a un pin digital en modo INPUT y se encargará de detectar o recoger la onda ultrasónica.
Elegí esta placa porque es un estándar en el mundo Maker y hay infinidad de informarción y recursos para utilizarla. Además se entiende muy bien con mi MacBook.
La lista completa de materiales que he utilizado:
- HC-SR04 Sensor de ultrasonidos
- ASoporte para HC-SR04 Soporte para el Sensor Ultrasonidos
- Arduino Uno Microcontrolador
- RY-1 Módulo de relé de 2 canales de 5V
- Dupont wires Cables Dupont
- Carcasa Carcasa fluorescente para Arduino Uno
El circuito es simple. Necesitaremos 8 entradas y salidas digitales. Además utilizaremos el pin de 5V y el GND (toma de tierra). El circuito sería el siguiente:
Todos los componentes menos el sensor, los he colocado dentro de una caja de conexiones junto con un disyuntores guardamotor 0,16 de 32A. Para la alimentación he desmontado un adaptador 220v AC a 12v DC que tambiénhe colocado dentro:
Para el sensor he utilizado un soporte de plástico azul. Pero he querido encapsularlo en gel dieléctrico a fin de proteger su circuitería de las condiciones ambientales del foso del ascensor.
El código:
// Configuramos los pines del sensor Trigger y Echo
const int PinTrig = 7;
const int PinEcho = 6;
// Configuramos el pin del rele
const int PinRele = 8;
// Constante velocidad sonido en cm/s
const float VelSon = 34000.0;
// Constantes de operacion
const int NivelMax = 40;
const int NivelMin = 60;
const int TiempoArranque = 6000;
float distancia;
void setup()
{
// Iniciamos el monitor serie para mostrar el resultado
Serial.begin(9600);
// Ponemos el pin Trig en modo salida
pinMode(PinTrig, OUTPUT);
// Ponemos el pin Echo en modo entrada
pinMode(PinEcho, INPUT);
// Ponemos el pin Rele en modo salida y iniciado
pinMode(PinRele, OUTPUT);
digitalWrite(PinRele, LOW);
}
void loop()
{
iniciarTrigger();
// La función pulseIn obtiene el tiempo que tarda en cambiar entre estados, en este caso a HIGH
unsigned long tiempo = pulseIn(PinEcho, HIGH);
// Obtenemos la distancia en cm, hay que convertir el tiempo en segudos ya que está en microsegundos
// por eso se multiplica por 0.000001
distancia = tiempo * 0.000001 * VelSon / 2.0;
Serial.print(distancia);
Serial.print("cm");
Serial.println();
// Comparamos la medida con las distancias de referencia y activamos o apagamos el rele
if (distancia < NivelMax)
{
digitalWrite(PinRele, HIGH);
Serial.println("on");
}
if (distancia > NivelMin)
{
digitalWrite(PinRele, LOW);
Serial.println("off");
}
delay(500);
}
// Método que inicia la secuencia del Trigger para comenzar a medir
void iniciarTrigger()
{
// Ponemos el Triger en estado bajo y esperamos 2 ms
digitalWrite(PinTrig, LOW);
delayMicroseconds(2);
// Ponemos el pin Trigger a estado alto y esperamos 10 ms
digitalWrite(PinTrig, HIGH);
delayMicroseconds(10);
// Comenzamos poniendo el pin Trigger en estado bajo
digitalWrite(PinTrig, LOW);
}
Gracias a Luis del Valle de ProgramarFacil por inspirarme una vez más en un proyecto maker.




