Вы находитесь на странице: 1из 7

arduino

Robotica para todos


Control de nivel de agua con ultrasonido
Tanque de agua de nivel de visualizacin con Arduino

Tanque de agua de nivel de visualizacin con Arduino


Se presenta la candidatura del Sr. Danilo Abbasciano que se propone para la
realizacin del firmware para el proyecto TiDiGino y que nos presenta una
aplicacin con Arduino: Muestra el nivel de un tanque.

El proyecto de lectura y visualizacin de la altura del nivel del agua en un pozo


o una cisterna.
Vamos a utilizar el Arduino de cdigo abierto de dispositivos de hardware, un
sensor ultrasnico para medir la paralaje de la altura del agua, un 16 x 2 con
pantalla LCD Hitachi HD44780 conductor y un zumbador que se activar
cuando el nivel supera el umbral.

El proyecto, como ya hemos mencionado, se compone de varias partes. Un


sensor de sonar para ser colocado en la parte superior del pozo (a una
distancia segura desde el nivel del agua) que apunta hacia abajo con el fin de
medir la distancia entre el punto de colocacin (en nuestro caso, el punto ms
alto del pozo) y la superficie del agua . Tomando una simple diferencia entre
cantidades conocidas: la distancia entre el fondo y la medicin de leer desde el
sensor, se obtiene la altura de la superficie del agua. Conociendo la superficie
del pozo tambin es fcil calcular el volumen de agua presente. A intervalos
predeterminados Arduino lee las distancias y muestra la altura y el volumen de
agua en el pozo.

Hay una barra horizontal que muestra la tendencia en el nivel relativo de agua
dentro del pozo para una fcil e inmediata lectura.

Si el nivel excede un umbral de advertencia primero provoc el timbre de alarma


para que suene poco a poco si el nivel excede el umbral del segundo, que
aumenta la frecuencia de llamada hasta que el nivel se reducir por debajo del
umbral o cuando manualmente desactivar el timbre a travs de un botn.

Arduino controla la lgica de funcionamiento, utilizando los dibujos siguientes:


/
/
*
*
*

* -*- Mode: c -*- * /


**
Pozzo.pde
Versin: 1.2
/

# Include

#
#
#
#
#
#
#
#
#

Define
Define
Define
Define
Define
Define
Define
Define
Define

PING_PIN 13
BUZZER_PIN 8
SWITCH_INT 0 / * 0 => el pin 2 * /
PI 3.1415926535898
SUPERFICE_BASE (R_POZZO R_POZZO * * PI)
SIZE_BAR (16 * 5)
ALARM_ICON 0 / * cdigo * /
SOUND_ICON 6 / * cdigo * /
SOUND_ICON_ON 7 / * cdigo * /

#
#
#
#
#
#
#

Define
Define
Define
Define
Define
Define
Define

R_POZZO 0,5 / * Raggio Pozzo (m) * /


H_POZZO 146,0 / cm * * /
SOGLIA_ALLARME_1 100 / * * cm /
SOGLIA_ALLARME_2 120 / * * cm /
DELAY_0 60000 / * m, 1000 * 60 * 1 = 1 min * /
DELAY_1 600 / * ms * /
DELAY_2 200 / * ms * /

/ * Inicializar la biblioteca con los nmeros de los pines de la interfaz * /


LiquidCrystal LCD (12, 11, 5, 4, 3, 6);
int mute = 0;
byte * getChar (int n, byte newChar []) {
int i;
cdigo byte [5] = {
B10000,
B11000,
B11100,
B11110,
B11111};
for (i = 0; i <8; i + +)
newChar [i] = cdigo [n - 1];
volver newChar;
}
void setup () {
int i;
float h;
newChar byte [8];
/ * Establecer el nmero de la pantalla LCD de filas y columnas: * /
lcd.begin (16, 2);
for (i = 1; i <6; i + +)
lcd.createChar (i, getchar (i, newChar));
newChar = {
B00000,
B00100,
B01010,
B01010,
B11111,
B00100,
B00000,
};
lcd.createChar (ALARM_ICON, newChar);
newChar = {
B00011,
B00101,
B11001,
B11001,
B11001,
B00101,

B00011,
};
lcd.createChar (SOUND_ICON, newChar);
newChar = {
B00100,
B10010,
B01001,
B01001,
B01001,
B10010,
B00100,
};
lcd.createChar (SOUND_ICON_ON, newChar);
pinMode (BUZZER_PIN, OUTPUT);
/ **
* BAJA para activar la alarma cada vez que el pin es baja,
* CHANGE para activar la alarma cada vez que cambia el valor pin
* Llegando a desencadenar cuando el pasador va de bajo a alto,
* La cada de cuando el pasador va de mayor a menor.
* /
attachInterrupt (SWITCH_INT, un botn, en aumento);
/ * Inicializar la comunicacin serial * /
Serial.begin (9600);
}
void loop () {
hWatherCm largo plazo;
int litros;
hWatherCm read_height = ();
if (check_alarm (hWatherCm)! = 0) / * lee la altura de nuevo wather * /
hWatherCm read_height = ();
lcd.clear ();
print_histogram (hWatherCm);
lcd.setCursor (0, 1);
lcd.print (hWatherCm);
lcd.print ("cm -");
/ / Litros = SUPERFICE_BASE * (hWather / 100,0) * 1000
l = piso (SUPERFICE_BASE * hWatherCm * 10);
lcd.print (litros);
lcd.print ("l");
lcd.setCursor (14, 1);
lcd.write (SOUND_ICON);
lcd.setCursor (15, 1);
if (! silencio)
lcd.write (SOUND_ICON_ON);
ms
lcd.write ('X');
/ *
Serial.print ("cm =");
Serial.println (hWatherCm);
* /
switch (check_alarm (hWatherCm)) {

Caso 1:
lcd.setCursor (0, 0);
lcd.write (ALARM_ICON);
zumbido (200);
delay (DELAY_1);
break;
Caso 2:
lcd.setCursor (0, 0);
lcd.write (ALARM_ICON);
zumbido (200);
retraso (200);
zumbido (200);
delay (DELAY_2);
break;
case 0: / / no hay ninguna alarma
delay (DELAY_0);
}
}
print_histogram void (int hWatherCm) {
int i;
bloks int;
flotan histograma;
/ / HWatherCm: HPOZZO histograma =: SIZE_BAR
histograma = (* SIZE_BAR hWatherCm) / H_POZZO;
histograma histograma + = 0.5;
bloks = (int) histograma / 5;
for (i = 0; i
lcd.write (5);
if ((int) (histograma)% 5> 0)
lcd.write ((int) (histograma) del 5%);
}
read_height tiempo () {
/ **
* Establecer las variables de duracin de la mesa de ping,
* Y el resultado distancia en centmetros:
* /
larga duracin, hWatherCm;
/ **
* El PING))) es provocada por un pulso de alta de 2 o ms microsegundos.
* Dar un pulso BAJO corto de antemano para asegurar un pulso de alta limpia:
* /
pinMode (PING_PIN, OUTPUT);
digitalWrite (PING_PIN, LOW);
delayMicroseconds (2);
digitalWrite (PING_PIN, HIGH);
delayMicroseconds (5);
digitalWrite (PING_PIN, LOW);
/ **
* El mismo pin se utiliza para leer la seal del PING))): un alto
* Pulso cuya duracin es el tiempo (en microsegundos) a partir del envo
* De la mesa de ping a la recepcin de su eco fuera de un objeto.
* /
pinMode (PING_PIN, INPUT);
= duracin PulseIn (PING_PIN, HIGH);
/ * Convertir el tiempo en una distancia * /

hWatherCm = H_POZZO - microseconds_to_centimeters (duracin);


if (hWatherCm <0)
return 0;
if (hWatherCm> H_POZZO)
volver H_POZZO;
volver hWatherCm;
}
vaco buzz (int ms) {
if (! silencio)
digitalWrite (BUZZER_PIN, HIGH);
delay (ms);
digitalWrite (BUZZER_PIN, LOW);
}
int check_alarm (int hWatherCm) {
if (hWatherCm> SOGLIA_ALLARME_1) {
if (hWatherCm<soglia_allarme_2)</soglia_allarme_2)
return 1;
ms
retorno de 2;
}
return 0;
}
microseconds_to_centimeters tiempo (microsegundos tiempo) {
/ **
* La velocidad del sonido es 340,29 m / s, o 29,4 microsegundos por centmetro.
* El ping viaja de ida y vuelta, as que para encontrar la distancia de la
* Objeto que tomar la mitad de la distancia recorrida.
* /
volver microsegundos / 29.387 / 2;
}
botn vaco () {
/ / Serial.println ("Pulsante premuto");
mute = silencio!;
lcd.setCursor (15, 1);
if (! silencio)
lcd.write (SOUND_ICON_ON);
ms
lcd.write ('X');
}

Вам также может понравиться