Sencillo detector de líquidos


En este post, vamos a ver como realizar la detección de niveles de líquidos con Arduino. En primer lugar, verá información sobre el sensor de nivel de agua y, a continuación, aprenderá a usar este módulo con algunos ejemplos prácticos.

Estos son los componentes hw y sw que necesitaremos:

Componentes de hardware
Arduino UNO R3 ×1
Sensor de nivel de agua ElectroPeak ×1
ElectroPeak Jumpers×1
ElectroPeak Buzzer×1
Aplicaciones de software y servicios en línea
ElectroPeak Arduino IDE

¿Qué es la detección de nivel de agua?

La detección del nivel de líquido o, en otras palabras, la medición del nivel de líquido en tanques profundos o agua en los embalses se realiza con el fin de controlar la profundidad del agua y evitar que se desborde en la industria. En aplicaciones domésticas también se puede utilizar, por ejemplo, para detectar el nivel de agua dentro de los acuarios. El propósito de la medición del nivel es determinar el nivel de líquido en cualquier momento y hacer el funcionamiento requerido en consecuencia.

Hay diferentes maneras de medir el nivel de líquido. Algunos sensores calculan la profundidad del líquido de acuerdo con la presión causada por la gravedad específica del líquido y la distancia vertical a la superficie. Algunos otros emiten ondas ultrasónicas desde un transductor que también detecta y mide las ondas reflejadas para calcular la profundidad del líquido.

El sensor que utilizamos en este tutorial es compatible con Arduino y funciona sobre la base de mediciones de resistencia, pronto descubrirá cómo funciona.

Cómo funciona el sensor de nivel de agua

Este módulo, que es uno de los módulos más utilizados para detectar el nivel de líquido, funciona sobre la base del cambio de resistencia. En este módulo, hay líneas paralelas de conductividad que están conectadas al suelo y son de hecho el camino de la corriente eléctrica. El agua es un buen conductor por lo que cuando estas líneas están en el agua, serán de cortocircuito, y la resistencia del módulo disminuye.

Al fijar el módulo en el recipiente líquido, la resistencia variable se establece en un valor específico basado en el nivel del agua. El módulo mide esta resistencia analógica y la envía a Arduino. Arduino utiliza este valor directamente o convirtiendo este valor en una cantidad digital.

Este sensor de nivel de agua tiene 3 pines. 2 de ellos son para potencia (+), que se conectan a la +5V, y tierra (-), que se conectan al terminal de tierra del Arduino. El otro pin (S), es el pin de salida analógica.

Sensor de nivel de agua de interconexión con Arduino

No necesita ninguna biblioteca específica para usar este sensor. Sólo tiene que leer el valor analógico del pin de salida y calcular el nivel de líquido en consecuencia.

Circuito

Código

Cargue el siguiente código en la placa Arduino y abra la ventana del monitor serie. Coloque el sensor en agua y podrá ver los resultados en la ventana del monitor serie.

/* Water level sensor
*  by Hanie Kiani
*  https://electropeak.com/learn/   
*/
const int analogInPin = A0; 
int sensorValue = 0;
void setup() {
Serial.begin(9600); 
}
void loop() {
sensorValue = analogRead(analogInPin); 
Serial.print("Sensor = " ); 
Serial.print(sensorValue*100/1024); 
Serial.println("%");
delay(1000); 
} 

Utilice el sensor de nivel de líquido como detector de lluvia

También puede utilizar el sensor de nivel de agua para detectar la lluvia con un zumbador. Para detectar si está lloviendo, coloque el sensor horizontalmente para que las gotas de lluvia puedan caer sobre el sensor y aumentar el valor del pin S.

Cuando el sensor empiece a mojarse, el zumbador comenzará a pitarse cada pocos segundos. Y cuando el módulo se moja por completo, el zumbador advierte con un sonido más fuerte y seguirá pitando sin parar.

Circuito

Código

/* 
  * Rain Detector with Water level sensor
*  by Hanie kiani
*  https://electropeak.com/learn/   
*/
const int sensorMin = 0;     // sensor minimum
const int sensorMax = 1024;  // sensor maximum
const int buzzer = 9;
void setup() {
 Serial.begin(9600);  
 pinMode(buzzer, OUTPUT);
}
void loop() {
int sensorReading = analogRead(A0);
int range = map(sensorReading, sensorMin, sensorMax, 0, 3);
 // range value:
 switch (range) {
case 0:    // Sensor is wet
   Serial.println("ٌWet!");
   tone(buzzer, 5000); 
   break;
case 1:    // Sensor getting wet
   Serial.println(" Warning");
    tone(buzzer, 1000 , 5); 
   break;
case 2:    // Sensor dry 
   Serial.println("Dry");
   noTone(buzzer);  
   break;
 }
 delay(10);  // delay between reads
}  

La función map()divide el rango delsensor 0 a 1024 en 3 secciones.

tone(buzzer, 5000);

La función tone() envía una señal PWM en el pasador del zumbador para que el zumbador haga un sonido.

El primer argumento especifica el pin de salida y el segundo determina la frecuencia PWM. También puede tener un tercer argumento de pie para la duración de la señal.

Integración con Arduino IoT Cloud Amazon Alexa


En la página principal de IoT Cloud,crearemos una nueva cosa y le asignaremos un nombre significativo. A continuación, seleccionaremos el tablero que vamos a usar. Si no puede ver su tablero, es posible que se haya saltado el procedimiento de introducción (consulte la sección anterior).

Una vez hecho esto, agregaremos tres propiedades a nuestra cosa. Los dos primeros representarán las lámparas,la última de la temperatura.

Aquí es lo que la vista de panel de su cosa debe verse como en este punto:

Al agregar propiedades, asegúrese de que solo utiliza los tipos enumerados en la sección Inicio inteligente, de lo contrario no funcionarán con Alexa.

The Smart Home section

La sección Smart Home

Ahora ve al Editor Web haciendo clic en el botón Editar boceto en la vista de edición de tu cosa.

 

En el Editor Web necesitamos añadir algo de código al Sketch generado automáticamente para nosotros.

Debido a que queremos leer algunos datos ambientales (a saber, la temperatura, pero no dude en agregar luz, humedad y presión si lo desea), vamos a importar la biblioteca de Arduino_MKRENV en la parte superior de nuestro boceto

#include <Arduino_MKRENV.h>

A continuación, definimos algunas constantes para los pines de placa que se utilizarán para R,G,Bandwhitelight, deesta manera el código es más legible:

#define PIN_MEETING_ROOM 5
#define PIN_LOUNGE_AREA_R 2
#define PIN_LOUNGE_AREA_B 3
#define PIN_LOUNGE_AREA_G 4

Ahora en la función de configuración podemos inicializar el Arduino MKR ENV Shield con:

if (!ENV.begin()) {  
 Serial.println("Failed to initialize MKR ENV shield!");  
 while (1);
}

De esta manera, si el escudo no está instalado, se bloqueará la ejecución de Sketch.

No es necesario especificar que tiene que ser porque vamos a utilizar para establecer la intensidad de nuestro LED blanco o los colores individuales del RGB.pinModeOUTPUTanalogWrite()

En la función loopfunction vamos a leer la temperatura cada segundo:

temperature = ENV.readTemperature();delay(1000);

Por último, es el momento de implementar nuestras funciones de devolución de llamada: las que se ejecutarán cada vez que se extraiga un cambio en el valor de una propiedadde IoT Cloud.

Tenemos que implementar y :onMeetingRoomChangeonLoungeAreaChange

void onMeetingRoomChange()
 { uint8_t brightness = map(meetingRoom.getBrightness(), 0, 100, 0, 255); 
if (meetingRoom.getSwitch())
 {   Serial.println(brightness); 
  analogWrite(PIN_MEETING_ROOM, brightness);   
  } else{ 
  analogWrite(PIN_MEETING_ROOM, LOW); 
}}

con el código anterior primero leemos el valor de brillo de la nube y lo mapeamos a un valor utilizable, luego verificamos si el interruptor de luz está encendido, si es que podemos encender la luz, usando el rojo antes. De lo contrario, apagamos la luzbrightness

El principio de trabajo es el mismo para la otra devolución de llamada:

void onLoungeAreaChange() 
{ uint8_t r, g, b;
 loungeArea.getValue().getRGB(r, g, b);
 if (loungeArea.getSwitch()) { 
  Serial.println("R:"+String(r)+" G:"+String(g)+ " B:"+String(b));   analogWrite(PIN_LOUNGE_AREA_R, r);  
 analogWrite(PIN_LOUNGE_AREA_B, b);  
 analogWrite(PIN_LOUNGE_AREA_G, g); }
 else{    
Serial.println("Lamp Off");   
 analogWrite(PIN_LOUNGE_AREA_R, 0);   
 analogWrite(PIN_LOUNGE_AREA_B, 0);    
analogWrite(PIN_LOUNGE_AREA_G, 0);
 }}

La única diferencia notable es el hecho de que en lugar del brillo justo, tenemos tres componentes diferentes: son la representación del color RGB de la luz. Por supuesto, podemos definir colores personalizados por nombre en la aplicación Alexa para que no tengamos que decir manualmente qué cantidades de rojo, verde o azul queremos establecer.

Amazon Alexa

Ahora necesitaremos la aplicación Amazon Alexa que se puede descargar desde apple App Store o Google Play Store. Una vez instalado, inicie sesión con su cuenta existente o cree una nueva.

Importante:Cuando se le pida que inicie sesión, asegúrese de utilizar las mismas credenciales utilizadas para crear su Arduino IoT Cloud Thing, de lo contrario no funcionará.

Además, tenemos que instalar la habilidad de hogar inteligente necesaria para interactuar con nuestro MKR1010. Para ello, vaya a Dispositivos (icono inferior derecho) y haga clic en YourSmartHomeSkillsy, a continuación, en EnableYourSmartHomeSkill.

Devices view

Vista de dispositivos

Ahora busca la habilidad llamada Arduino y agréguela. En el mismo momento de esta escritura, esa habilidad no está disponible en todo el mundo, pero estamos trabajando en ello y la aprobación para otros países está en curso.

Arduino Smart Home skill

Habilidad Arduino Smart Home

La pantalla debería tener este aspecto:

Devices with Arduino skill installed

Dispositivos con habilidad Arduino instalada

Ahora que la habilidad está configurada, finalmente podemos añadir nuestros dispositivos. Para hacerlo, vuelva a la pantalla Dispositivos y toque el signo + en la parte superior.

Add a new device

Añadir un nuevo dispositivo

Pulse en AddDevice, luego En otros y DiscoverDevices. El proceso de búsqueda puede tomar un poco, pero al final se le debe presentar esta pantalla:

Después de pulsar en Elegir dispositivo se le presentará la página de configuración que enumera todos los dispositivos disponibles (Se nombrarán de acuerdo con cómo nombramos nuestras propiedades en Arduino IoT Cloud).

Vamos a elegir un dispositivo y puntee SetUpDevice. Si te gusta también puedes añadirlo a un grupo (De esta manera puedes controlar y organizar tus dispositivos más fácilmente), de lo contrario omite esta parte.

Repita el proceso de configuración para cada dispositivo que desee controlar.

Por último, la vista del dispositivo debe tener este aspecto:

Finalmente podemos empezar a preguntar cosas como «Alexa, ¿cuál es la temperatura en la oficina?» o «Alexa enciende la luz en la sala de reuniones».

!Diviértase jugando con Alexa y IoT Cloud.!

 

 

Como usar un zumbador con un ESP8266,ESP32 o un Arduino


Vamos a hablar de la librería Easybuzeer que nos va a ayudar a gestionar cualquier zumbador pasivo con casi todas las variantes de Arduino ,pues de hecho esta biblioteca se ha probado en los siguientes dispositivos: Arduino UNO,Arduino MEGA 2560 ,ESP32 y ESP8266

Como mejoras a esperar en las próximas actualizaciones su creador promete soporte para múltiples instancias de EasyBuzzerClass, lo que hace posible tener más de un Buzzer asi como funciones de acceso directo a sonidos predefinidos como; éxito, error y advertencia.

Para empezar a usar esta librería, necesitaremos incluir la biblioteca en el boceto mediante la opción Herramientas->Administrar Bibliotecas->Buscar «EasyBuzzer»


Empezando

Incluir la biblioteca en el skectch

#include <EasyBuzzer.h>

Establecer el pin donde está conectado el zumbador

De forma predeterminada, la biblioteca está configurada para utilizar el número de pin 4. Puede cambiar el número de pin predeterminado, modificando el valor de DEFAULT_PIN en el archivo Config.h . Para establecer el número de pin en el boceto, llame a la función EasyBuzzer.setPin(pin)en la configuración.

int pin = 2 ;
configuración vacía  () {
  EasyBuzzer. setPin (pin);
};  

Ejecutar la biblioteca

void  loop () {
   / * Llame siempre a esta función en el ciclo para que EasyBuzzer funcione. * / 
  EasyBuzzer. actualizar ();
};

Usos

Bip regular

Bip continuamente a una frecuencia determinada.

/ * Bip continuamente a una frecuencia determinada. * /
EasyBuzzer.beep (
  frecuencia	 // Frecuencia en Hertz (HZ). 
);

Emite un pitido a una frecuencia determinada un número específico de veces.

/ * 
 	Emite un pitido a una frecuencia determinada un número específico de veces. 
	Los valores predeterminados onDuration y offDuration se establecen en el archivo Config.h. 
* /
EasyBuzzer.beep (
  frecuencia,	 // Frecuencia en Hertz (HZ). 
  pitidos		 // El número de pitidos. 
);

Emite un pitido a una frecuencia determinada un número específico de veces, con función de devolución de llamada.

/ * 
 	Emite un pitido a una frecuencia determinada un número específico de veces, con funcionalidad de devolución de llamada. 
	Los valores predeterminados onDuration y offDuration se establecen en el archivo Config.h. 
* /
EasyBuzzer.beep (
  frecuencia,	 // Frecuencia en Hertz (HZ). 
  pitidos,	 // El número de pitidos. 
  callback	 // [Opcional] Función para llamar cuando termine. 
);

Secuencia de pitidos

Cree una secuencia de pitidos con una frecuencia determinada.

/ * Crea una secuencia de pitidos con una frecuencia determinada. * /
EasyBuzzer.beep (
  frecuencia,		 // Frecuencia en hercios (HZ). 
  onDuration, 		 // On Duración en milisegundos (ms). 
  offDuration, 		 // Off Duración en milisegundos (ms). 
  pitidos, 		 // El número de pitidos por ciclo. 
  pauseDuration, 	 // Duración de la pausa. 
  ciclos, 		 // El número de ciclo. 
  callback		 // [Opcional] Función para llamar cuando termine. 
);	

Bip único para una duración

Bip único a una frecuencia determinada, durante un período específico.

/ * Un solo pitido. * /
EasyBuzzer.singleBeep (
  frecuencia,	 // Frecuencia en hercios (HZ). 
  duración	 // Duración del pitido en milisegundos (ms). 
);

Bip único a una frecuencia determinada, durante un período específico, con función de devolución de llamada.

/ * Un solo pitido a una frecuencia determinada, durante un período específico, con funcionalidad de devolución de llamada. * /
EasyBuzzer.singleBeep (
  frecuencia, 	 // Frecuencia en hercios (HZ). 
  duración, 	 // Duración del pitido en milisegundos (ms). 
  callback	 // [Opcional] Función para llamar cuando termine. 
);

Dejar de pitar

Utilice esta función para detener el pitido. Puede llamar a esta función en todo momento, en cualquier lugar del código.

EasyBuzzer.stopBeep ();

Modificar los valores de duración predeterminados

Los valores de duración predeterminados se definen en el archivo Config.h . Puede cambiar esos valores en el archivo Config.h o usar la función provista para cambiarlos.

EasyBuzzer.setOnDuration (duración);	// Establecer en duración. 
EasyBuzzer.setOffDuration (duración);	// Establecer la duración de Off. 
EasyBuzzer.setPauseDuration (duración);	// Establecer la duración de la pausa.

Ejemplo

A continuación vamos a usar un sensor de sonido para Arduino mediante su salida digital D0 que conectaremos al pin D6 del ESP8266 que correspondel al GPIO16

El circuito se alimentara con 5V DC desde Vin y GND del ESP8266

Finalmente conectaremos un zumbador piezoelectrico pasivo entre D1(GPIO 5) y GND

Este es el código de ejemplo para probar el circuito comentado anteriormente del sensor de sonido para Arduino mediante su salida digital D0 que conectaremos al pin D6(GPIO16) del ESP8266 ,alimentado con 5V DC desde Vin y GND del ESP8266 y conectando un zumbador piezoeléctrico pasivo entre D1(GPIO 5) y GND .

#include <EasyBuzzer.h>


int sensor = 16 ;
bool estado = false ;


void sonidoTerminado(){
  Serial.println("Sonido terminado");
}


// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
  
  pinMode(5, OUTPUT);
   // Configuración del pin
  EasyBuzzer.setPin(5);
  
  Serial.begin(2000000);    // Iniciamos la puerta serie
 

  pinMode( sensor , INPUT_PULLUP) ;
 // digitalWrite(LED_BUILTIN , LOW) ; // Apagamos el LED al empezar
 
  // Configuración del beep
 // EasyBuzzer.beep(
 //   2000,          // Frecuencia en herzios
 //   100,           // Duración beep en ms
//    100,           // Duración silencio en ms
//    2,             // Números de beeps por ciclos
//    300,           // Duración de la pausa
//    1,             // Número de ciclos
 //   sonidoTerminado// Función callback que es llamada cuando termina
//  );
  
  
  int init=0;
  Serial.println("Empezamos");
//pausa
for (int n=0 ;n<200 ; n++)
        {     
        delay (100);
        }
}


void loop() {
//EasyBuzzer.update();

 bool  valor ;
for (int n=0 ;n<10 ; n++)
{ valor=  digitalRead(sensor) *digitalRead(sensor ); //leemos el estado del sensor
 }

 if ( valor == true ) //Si está activada la salida D0
 

  {    estado = ! estado ;                       // cambiamos el estado del LED
    digitalWrite(LED_BUILTIN, false) ;            // escribimos el nuevo valor
    digitalWrite(5, 1) ;            // escribimos el nuevo valor
    Serial.println("TRUE");
    for (int n=0 ;n<10 ; n++)
        {   EasyBuzzer.beep(3000, 100,100, 2, 300, 3, sonidoTerminado);   
        delay (100);
        }
  }
  else
  {
   // Serial.println( "FALSE");
      delay (10);
      digitalWrite(LED_BUILTIN, true) ;
      digitalWrite(5, 0) ;            // escribimos el nuevo valor
  ;
  }

  
}

Como fácilmente se puede ver estamos leyendo el puerto al que esta conectado el sensor de sonido, circunstancia que se detectara con la condición valor=true , lo que provocara que se active el zumbador

Para minimizar los rebotes, por cierto, ejecutamos un pequeño ciclo de 10 lecturas

Además, para evitar disparos involuntarios al inicio también un bucle de 200x100ms