Tanque de agua de nivel de visualización con Arduino
Tanque de agua de
nivel de visualización con Arduino
Se presenta la candidatura del Sr. Danilo Abbasciano que se propone para la realización del firmware para el proyecto TiDiGino y que nos presenta una aplicación con Arduino: Muestra el nivel de un tanque.
El proyecto de lectura y visualización de la altura
del nivel del agua en un pozo o una cisterna.
Vamos a utilizar el Arduino de código abierto de dispositivos de hardware, un sensor ultrasónico 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.
Vamos a utilizar el Arduino de código abierto de dispositivos de hardware, un sensor ultrasónico 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 colocación (en nuestro caso,
el punto más alto del pozo) y la superficie del agua . Tomando una simple
diferencia entre cantidades conocidas: la distancia entre el fondo y la medición
de leer desde el sensor, se obtiene la altura de la superficie del agua.
Conociendo la superficie del pozo también es fácil 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 fácil 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 través de un botón.
Arduino controla la lógica de funcionamiento,
utilizando los dibujos siguientes:
/ * -*- Mode: c -*- * /
/ **
* Pozzo.pde
* Versión: 1.2
* /
# Include
# Define
PING_PIN 13
# Define
BUZZER_PIN 8
# Define
SWITCH_INT 0 / * 0 => el pin 2 * /
# Define PI
3.1415926535898
# Define
SUPERFICE_BASE (R_POZZO R_POZZO * * PI)
# Define
SIZE_BAR (16 * 5)
# Define
ALARM_ICON 0 / * código * /
# Define
SOUND_ICON 6 / * código * /
# Define
SOUND_ICON_ON 7 / * código * /
# Define R_POZZO 0,5 / * Raggio
Pozzo (m) * /
# Define H_POZZO 146,0 / cm * * /
# Define SOGLIA_ALLARME_1 100 / *
* cm /
# Define SOGLIA_ALLARME_2 120 / *
* cm /
# Define DELAY_0 60000 / * m,
1000 * 60 * 1 = 1 min * /
# Define DELAY_1 600 / * ms * /
# Define DELAY_2 200 / * ms * /
/ * Inicializar la biblioteca con
los números 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;
código byte [5]
= {
B10000,
B11000,
B11100,
B11110,
B11111};
for (i = 0; i
<8; i + +)
newChar [i] =
código [n - 1];
volver newChar;
}
void setup () {
int i;
float h;
newChar byte
[8];
/ * Establecer el número 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 caída de cuando el pasador
va de mayor a menor.
* /
attachInterrupt (SWITCH_INT, un
botón, en aumento);
/ * Inicializar la comunicación
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);
más
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
duración de la mesa de ping,
* Y el resultado distancia en
centímetros:
* /
larga duración, hWatherCm;
/ **
* El PING))) es provocada por un
pulso de alta de 2 o más 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 señal del PING))): un alto
* Pulso cuya duración es el
tiempo (en microsegundos) a partir del envío
* De la mesa de ping a la
recepción de su eco fuera de un objeto.
* /
pinMode
(PING_PIN, INPUT);
= duración
PulseIn (PING_PIN, HIGH);
/ * Convertir el tiempo en una
distancia * /
hWatherCm =
H_POZZO - microseconds_to_centimeters (duración);
if (hWatherCm
<0)
return 0;
if
(hWatherCm> H_POZZO)
volver H_POZZO;
volver
hWatherCm;
}
vacío 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
return 1;
más
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 centímetro.
* 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;
}
botón vacío () {
/ / Serial.println
("Pulsante premuto");
mute = silencio!;
lcd.setCursor (15, 1);
if (! silencio)
lcd.write
(SOUND_ICON_ON);
más
lcd.write ('X');
}