Sie sind auf Seite 1von 6

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 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 * / 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'); }