Diseño,
Mantenimiento y Montaje de equipos
Electrónicos y Sistemas de Cómputo Guapi - Cauca - Colombia
|
Amplificadores de de audio
Cargadores de Baterías - Cargador profesional de baterías Inversores de Voltaje Fuentes de alimentacion - Fuente variable con transistor
Diseños varios - Monitor luminoso para timbre telefónico - Barrera Invisible detector de personas
Proyectos Terminados - Monitoreo del hogar a través del teléfono celular, con PIC - PROTECT, guardián del nivel de tensión - Medición de Nivel de embalse, visualización en pantalla con gráfica de tendencia.
Radiofrecuencia
Arduino - Encender y apagar LED vía Ethernet con Visual Studio (Pendiente) - Medición de Temperatura y Humedad vía Ethernet con Visual Studio (Pendiente)
|
Medición de Nivel de Río, visualización en pantalla con gráfica de tendencia.
CM2 ELECTRÓNICA Miller Cambindo Montaño. Conocer en todo momento el nivel de agua de una represa, río, quebrada, riachuelo, bien sea para definir el potencial energético, crecientes, momentos para la emisión de alertas por crecientes; es una necesidad que en muchos ámbitos se ha tenido. Se suelen instalar sistemas de monitoreo y alertas tempranas, para detectar aumentos o disminuciones de los niveles de las aguas, en ríos o quebradas, los cuales se encuentran en sitios alejados de los centros poblados, de las localidades, o de las casas donde habitan las personas. Estos sistemas envían información precisa sobre las variaciones de nivel, de tal manera que quienes tienen a cargo la interpretación de las mismas tomen las acciones respectivas con la debida antelación, minimizando pérdidas de producción por paradas (en caso de plantas de generación de energía) o catástrofes por avalanchas o inundaciones, en caso de crecientes. El proyecto que se desarrollará en esta página tiene, entre otras, las siguientes características:
Además de las anteriores características, se elaborará un diseño que permita llevar la señal desde el sitio donde se lee el valor del nivel, hasta el centro de monitoreo, el cual puede estar a cientos o miles de metros; para lo cual se creará una red inalámbrica. El proyecto se desarrollará con sistema Arduino complementado con Visual Studio para la interfaz gráfica.
La siguiente imagen muestra cómo se verá en la computadora el sistema funcionando.
Desarrollo en Arduino Para la medición del nivel se utilizará un sensor de ultrasonido, sensor de distancia, como se llama en muchos casos al HC-SR04 (en Internet se encuentra suficiente literatura al respecto de este sensor), cuyo rango de alcance varía desde 2cm hasta 5m; en este proyecto se definió un rango confiable de 2cm a 4m.
Sensor HC-SR04 Para el procesamiento de la información y transmisión a la WEB, se utilizarán las pacas de Arduino UNO y Arduino Ethernet.
Arduino UNO Arduino Ethernet La placa de Arduino Ethernet se instala sobre la placa de Arduino UNO, la tensión de alimentación utilizada en este proyecto es de 8V (1 voltio por encima de lo recomendado por el fabricante como valor mínimo para operación normal (7 Voltios)), los cuales se regulan (desde una fuente de 24V a 3A) con una de las fuentes comerciales del tipo variable con módulo LM2596 (esta fuente permite entregar al Arduino más de 1 amperio si así lo requiere).
Fuente Variable con LM2596 El valor del nivel actual, además de visualizarse en una pantalla de computador a través de un ejecutable construido con Visual Studio, también puede verse en una pantalla de cristal líquido - LCD ubicada en el sitio de la medición y conectada a las tarjetas electrónicas descritas anteriormente. La pantalla LCD utilizada para el proyecto es del tipo 2x16 retroiluminada.
El diagrama esquemático de la conexión del Arduino con el sensor se muestra en la siguiente figura:
Esquemático Medición de Nivel Software: A continuación se expone el programa en Arduino
/*
Programa en Visual Studio
'Programa para monitorear el Nivel de una represa. 'Los datos se guardan de acuerdo con el tiempo que seleccione el usuario. 'El Usuario deberá previamente crear una carpeta en la Unidad C con el Nombre "Datos Guardados" (C:\Datos Guardados\). 'Los datos se guardarán inicialmente en la carpeta del ejecutable del programa y la copia se guardará en la carpeta "Datos Guardados" 'Timer1: Usado para capturar los datos de la IP donde Arduino aloja los valores. Maneja la Hora que se muestra en la pantalla. 'Timer2: Se carga con la selección del "Tiempo de Guardado" de datos 'Timer3: Cada Segundo. Tiempo de visualización de la gráfica 'El registro de datos y la gráfica de tendencia se ejecutan con periodo de tiempo correspondiente al Timer2. 'Se adicionan las instrucciones (en Rutina para crear el archivo) para que grabe en el archivo la fecha de registro de datos. 'Se adicionan las instrucciones para crear los encabezados de los datos almacenados. 'Se adicionan las instrucciones para leer datos de Humedad 'Se adiciona condición para que el programa muestre texto "Error del Sensor" cuando el valor de la distancia (Nivel) sea 0. 'ese valor es enviado por Arduino (Condición en Arduino) cuando el sensor envía dato fuera de rango. 'Se adicionan dos líneas de código (con If === Gráfica de Nivel ====) para hacer que la gráfica de tendencia se mueva hacia la izquierda. 'Se modifica la fórmula de medición de Nivel, el punto cero en el rebosadero equivale a 224 en la lectura del sensor. ' La fórmula es Nivel = 224-Distancia. Este valor se ajusta en Arduino y se grafica como tal en VS
' CM2 ELECTRONICA - Miller Cambindo Montaño -2017-06-08
Imports System.NetImports System.IO
Public Class Form1Dim TiempoRegistro As String Dim Temperatura As Integer 'Es el valor de la Temperatura Dim Humedad As Integer 'Es el valor de la Humedad Relativa Dim Nivel_Arduino As Integer 'Es el valor del nivel de la Represa Dim Nivel_Grafico As Integer 'Es el valor del nivel que se grafica en el ProgressVar Dim Valor_Actual As Integer 'Valor actula del Nivel Dim Valor_Anterior As Integer 'Último valor guardado del Nivel Dim Variacion As Integer 'Diferencia entre el Valor Actual y el último valor de nivel guardado Public Property DataGridView1 As Object 'Función para leer el contenido de la página Web donde el Arduino Ethernet alojará los datos Private Function getHTML(ByVal Address As String) As String Dim rt As String = "" Dim wRequest As WebRequest Dim wResponse As WebResponse Dim SR As StreamReader wRequest = WebRequest.Create(Address)wResponse = wRequest.GetResponse SR = New StreamReader(wResponse.GetResponseStream)rt = SR.ReadToEnd SR.Close() Return rt End Function 'Esta función se utiliza para que el programa arranque tan pronto cuando se abra; es decir, se de doble clic 'al ejecutable y comienza a mostrar valores. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.LoadTimer1.Enabled = TrueTiempo.SelectedIndex = 0 'Selecciona la posición 0 de la lista del combobox (llamado Tiempo) el cual 'corresponde a 1 Minuto. Este es el valor por defecto del intervalo de tiempo con el que se grabarán 'los datos en el archivo. Cabe aclarar que este valor se debe configurar en el Interval del Timer2 'Esta instrucción no tiene nada que ver con este Arduino, sino con el Arduino de lectura de datos.Label9.Text = "1 Minuto"
'Creación del archivo donde se almacenarán los datos. Se Escriben los encabezados de los datos En prueba Dim rutaNivel = My.Computer.FileSystem.CurrentDirectory & "\Nivel.xls" 'Crea el archivo en Excel llamado Nivel. My.Computer.FileSystem.WriteAllText(rutaNivel, "FECHA", True) 'Escribe el encabezado FECHA en la primera celda (A1). My.Computer.FileSystem.WriteAllText(rutaNivel, ";", True) 'Pasa el cursor a la celda siguiente (B1) funciona como un tabulador. My.Computer.FileSystem.WriteAllText(rutaNivel, "HORA", True) 'Escribe el encabezado HORA en la siguiente celda. My.Computer.FileSystem.WriteAllText(rutaNivel, ";", True) My.Computer.FileSystem.WriteAllText(rutaNivel, "NIVEL", True) My.Computer.FileSystem.WriteAllText(rutaNivel, ";", True) My.Computer.FileSystem.WriteAllText(rutaNivel, "TEMPERATURA", True) My.Computer.FileSystem.WriteAllText(rutaNivel, ";", True) My.Computer.FileSystem.WriteAllText(rutaNivel, "HUMEDAD RELATIVA" & vbLf, True) End Sub 'Esta función (Timer1) se utiliza para leer el dato contenido en la página donde Arduino escribe los valores de 'las variables analógicas leídas. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick Label2.Text = Format(Now, "dd-MMMM-yyyy") 'Escribe la fecha actual en formato 20-octubre-2016Label1.Text = Date.Now.ToLongTimeString 'Escribe la hora actual 'Dim Distancia As Integer 'Es la distancia desde el sensor1 hasta el nivel del agua del TK1 Dim Punto_Medio As Integer 'Punto medio (0) del tanque gráfico, ya que mide entre 0 y 444.Punto_Medio = 222 'Punto medio (0) del tanque gráfico, ya que mide entre 0 y 444. En el sitio será 224
TextBox3.Text = getHTML( "http://192.168.1.51/") ' Lee lo que se encuentra en la página Web con dirección 'IP 192.168.1.51 (Nivel, Temperatura, Humedad) lo carga en el TextBox 3.Nivel_Arduino = TextBox3.Lines(0).ToString ' El dato de la primera línea del TexBox3 se lo asigna a la variable Nivel_ArduinoTextBox2.Text = TextBox3.Lines(1).ToString ' El dato de la segunda línea del TexBox3 lo pasa a TextBox2 (Temperatura)TextBox4.Text = TextBox3.Lines(2).ToString ' El dato de la tercera línea del TexBox3 lo pasa a TextBox4 (Humedad) If Nivel_Arduino = 222 Then ' Si el valor del nivel es 222, significa que hay un error en el sensor de NivelLabel8.Visible = True 'por tanto, se muestra el texto en color rojo "Error del Sensor"Label8.ForeColor = Color.RedLabel8.Text = "Nivel Muy Alto o Error del Sensor" ElseLabel8.Visible = False 'si el valor no es 222, no se muestra el mensaje. End If If Nivel_Arduino = -222 Then ' Si el valor del nivel es -227, significa que el nivel del agua es muy bajoLabel8.Visible = True 'por tanto, se muestra el texto en color rojo "Nivel Muy bajo"Label8.ForeColor = Color.RedLabel8.Text = "Nivel Muy Bajo" ' Else ' Label8.Visible = False 'si el valor no es 222, no se muestra el mensaje. End IfNivel_Grafico = Punto_Medio + Nivel_Arduino ' = 222 + Nivel enviado por ArduinoTextBox1.Text = Nivel_Arduino 'Muestra el valor del Nivel1 en el cuadro de texto1Nivel_Actual.Text = Nivel_Arduino MyVerticalProgessBar1.Value = Nivel_Grafico 'A su vez, el nivel es cargado al control que grafica el Nivel1'=========Diferencia entre el valor actual del Nivel y el último valor almacenado 'En estas instrucciones se convierte en Entero el dato del nivel que se encuentra en los TextBox llamados 'Nivel_Actual, Nivel_Anterior, para realizar la operación de resta. Para ello se utilizan variables llamadas 'Valor_Actual y Valor_Anterior, respectivamente. Int32.TryParse(Nivel_Anterior.Text, Valor_Anterior) 'Convierte el dato del Nivel_Anterior a entero Valor_Anterior Int32.TryParse(Nivel_Actual.Text, Valor_Actual) 'Convierte el dato del Nivel_Actual a entero Valor_Actual Variacion = Valor_Actual - Valor_Anterior 'Resta entre los valores de NivelVaricacion_Nivel.Text = Variacion 'Muestra el valor de la variación de Nivel'=========== Rutina para la medición de TEMPERATURA y HUMEDAD ================================ Temperatura = TextBox2.Text 'El dato deHumedad = TextBox4.Text ' El dato de la tercera línea del TexBox3 se lo asigna a la variable HumedadEnd Sub '======= Rutina para seleccionar el tiempo de almacenamiento de los datos. ======== Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click TiempoRegistro = Tiempo.Text 'El valor seleccionado en la lista de selección, asignárselo a la variable TiempoRegistroTimer2.Interval = 1000 'Intervalo de tiempo para cambio de valor en la lista de opciones; tiempo que transcurre entre 'el cambio de intervalo End Sub'Rutina para definir el tiempo de guardado de datos y Rutina para guardar los datos en un archivo Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick If Timer2.Interval = 1000 Then 'Si no se cambia el tiempo al ejecutar el programa, por defecto tendrá 1 Minuto Label9.Text = "1 Segundo" 'es decir 60000 ms que se configuró en las propiedades del Timer2 End If 'Rutina para escoger en el Combobox (Lista desplegable) el tiempo de registro de datos. Select Case TiempoRegistro Case 0 : Timer2.Interval = 1000 'Si al ejecutar el programa no se selecciona el tiempo,Label9.Text = "1 Segundo" 'entonces el TiempoRegistro por defecto es 1 Minuto, es decir 60000 mS Case "5 Minutos" : Timer2.Interval = 300000 ' TiempoRegistro = (5*1000*60). 1 Minuto = 60 Seg y 1 Seg = 1000 mSLabel9.Text = "5 Minutos" Case "15 Minutos" : Timer2.Interval = 900000 'TiempoRegistro = (15*1000*60)Label9.Text = "15 Minutos" Case "30 Minutos" : Timer2.Interval = 1800000 'TiempoRegistro = (30*1000*60)Label9.Text = "30 Minutos" Case "1 Hora" : Timer2.Interval = 3600000 'TiempoRegistro = (30*1000*60)Label9.Text = "1 Hora" Case "2 Horas" : Timer2.Interval = 7200000 'TiempoRegistro = (60*1000*60)Label9.Text = "2 Horas" Case "5 Horas" : Timer2.Interval = 18000000 'TiempoRegistro = (5*60*1000*60)Label9.Text = "5 Horas" Case "12 Horas" : Timer2.Interval = 43200000 'TiempoRegistro = (12*60*1000*60)Label9.Text = "12 Horas" End Select' Creación y escritura del archivo que contendrá los datos. '=========== Rutina para Grabar archivo de Nivel =================== Dim rutaNivel = My.Computer.FileSystem.CurrentDirectory & "\Nivel.xls" 'Crea el archivo en Excel llamado Nivel.
My.Computer.FileSystem.WriteAllText(rutaNivel, Label2.Text, True) 'Escribe la fecha (que está contenida en Label2) en la celda (A2). My.Computer.FileSystem.WriteAllText(rutaNivel, ";", True) 'Pasa el cursor a la celda siguiente (B2) funciona como un tabulador. My.Computer.FileSystem.WriteAllText(rutaNivel, Label1.Text, True) 'Escribe la hora (que está contenida en Label1) en la segunda celda (B2). My.Computer.FileSystem.WriteAllText(rutaNivel, ";", True) 'Pasa el cursor a la celda siguiente (C2) funciona como un tabulador. My.Computer.FileSystem.WriteAllText(rutaNivel, Nivel_Actual.Text, True) 'Escribe en el archivo los datos leídos de Nivel, Tercera celda (C2). My.Computer.FileSystem.WriteAllText(rutaNivel, ";", True) 'Pasa el cursor a la celda siguiente (D2) funciona como un tabulador. My.Computer.FileSystem.WriteAllText(rutaNivel, TextBox2.Text, True) 'Escribe en el archivo los datos leídos de Temperatura, Cuarta celda (D2). My.Computer.FileSystem.WriteAllText(rutaNivel, ";", True) 'Pasa el cursor a la celda siguiente (E2) funciona como un tabulador. My.Computer.FileSystem.WriteAllText(rutaNivel, TextBox4.Text & vbLf, True) 'Escribe en el archivo los datos leídos de Temperatura, Cuarta celda (E2). '=========== Fin de la rutina para Grabar datos de Nivel ============ Nivel_Anterior.Text = Nivel_Actual.Text ' Nivel_Anterior muestra el último valor de nivel almacenado; este dato es para hacer la diferencia con el valor actual.'=========== Gráfica de Nivel ============= Chart1.Series( "Nivel").Points.AddXY(Date.Now.ToShortTimeString, Nivel_Arduino.ToString) 'Indicamos que puntos van a ser los de la gráfica If (Chart1.Series("Nivel").Points.Count > 50) Then 'esta condición se usa para borrar los datos antiguos de la gráfica, es decir, para dar la sensaciónChart1.Series( "Nivel").Points.RemoveAt(0) ' que la gráfica se mueve hacia la izquierda. La función solo deja en pantalla los 50 valores más recientes. End IfEnd Sub '========== Crear copias de los archivos donde se guardan los datos ================= 'Crear una copia del archivo de Nivel en otra carpeta, para que sea manipulado por el usuario. Private Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles PictureBox1.Click My.Computer.FileSystem.CopyFile("D:\Store 1\Arduino\Programas\Proyecto\Nivel Represa 2017\Nivel Represa con VS\bin\Debug\Nivel.xls", "C:\Datos Guardados\Nivel.xls", Microsoft.VisualBasic.FileIO.UIOption.OnlyErrorDialogs, FileIO.UICancelOption.DoNothing) End Sub End Class
Descargue del siguiente vínculo el proyecto completo:
Aprobado cm2
Miller Cambindo Montaño. CM2 ELECTRÓNICA
|