ELECTRONICA,CM2

 Diseño, Mantenimiento y Montaje  de equipos Electrónicos y Sistemas de Cómputo ______________________________________________________

Guapi - Cauca - Colombia

 

 

Inicio                                        

Amplificadores de de audio

   - Amp. de 50W con TDA7265

   - Amp. de 100W con TDA7294

 

Cargadores de Baterías

 - Cargador profesional de baterías

Inversores de Voltaje 

    - Inversor 12 Vdc @ 120 Vac

    - Inversor basado en SN7400

Fuentes de alimentacion

    - Regulador con LM317T

  - Fuente variable con transistor

 

Diseños varios

    - Balasto

   - Monitor luminoso para timbre telefónico

  - Barrera Invisible detector de  personas

- Control de intensidad o Regulador de velocidad para motores pequeños de AC

   - Control de Nivel de Líquidos

   - Monitor de Audio

 

   - Detector de Luz (Pendiente)

   - Temporizador RC (Pendiente)

   - Start / Stop con Amplificador Operacional. (Pendiente)

- Start / Stop para motor, con compuertas NAND (Pendiente)

- Control de Tonos - Audio     (Pendiente)

   - Generador de Onda senoidal con Operacional (Pendiente)

 

 

 

 

Proyectos Terminados

   - Monitoreo del hogar a través  del teléfono celular, con PIC

   - Letrero desplazable de LEDs

   - PROTECT, guardián del nivel de tensión

   - Medición de Nivel de embalse, visualización en pantalla con gráfica de tendencia.

 

Radiofrecuencia

   - Transmisor en FM

   - Transmisor en AM

 

 

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)

 

 

 

Educación

Descargas

 

 

 

Medición de Nivel de Río, visualización en pantalla con gráfica de tendencia.

                                                                                                                                                                                             

                                                                                                                            CM2 ELECTRÓNICA

                                                                                                                            Miller Cambindo Montaño.

Descripción general

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:

bullet

Medición de Nivel de agua en un río.

bullet

Visualización gráfica del nivel.

bullet

Visualización numérica del nivel.

bullet

Gráfico de la tendencia del Nivel.

bullet

Visualización del último valor registrado.

bullet

Selección del tiempo de registro de datos de nivel.

bullet

Visualización del valor de la temperatura del lugar donde se lee el nivel.

bullet

Visualización del valor de la Humedad Relativa del lugar donde se lee el nivel.

bullet

Generación de archivo en Excel con los datos de Nivel registrados.

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.

                                                                                                                                                        Ir Arriba

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.

 

Ir Arriba

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 

Ir Arriba

/*
  Sistema de medición de Nivel de Represa.
  Este programa lee un sensor de Nivel conectado a los pines A0 y A1, configurados como digitales
  los muestra en LCD 2x16 y vía Ethernet.
  
 El programa se acopla con un programa en Visual Studio para medir el Nivel de una Represa.
 El Hardware es implementado mediante Arduino UNO y Arduino Ethernet, los cuales leen el nivel a través
 del sensor de distancia HC-SR04, que tiene un rango de medida de 2 cm a 500 cm.
 
 El programa también lee un sensor de Nivel y Humedad DH11.
 
 Tabla de Bits:
 B0: NC             B7: LCD                                   A0(B14): Sensor de Nivel, TRIG1
 B1: NC             B8: LCD                                   A1(B15): Sensor de Nivel, ECHO1
 
B2: LCD            B9: LCD                                   A2(B16):
 B3: LCD            B10: Led Parpadeante.
No se utilizará     A3(B17):
 B4:                B11: Comunicación Arduino UNO+Ethernet    A4(B18): Sensor de Temperatura y Humedad
 B5: LCD            B12: Comunicación Arduino UNO+Ethernet    A5(B19):
 B6: LCD            B13: Comunicación Arduino UNO+Ethernet
 
 2017-05-27:  Se adiciona condición para que el programa no aborte cuando el sensor de nivel envíe un valor por fuera del rango.
              En su defecto deberá mostrar en el LCD la leyenda: Error del Sensor
 2017-07-04: Se cambia la dirección IP po 192.168.0.51
 2017-07-07: Se asigna una fórmula para definir la altura de la represa, ya que se manejan valores positivos (por encima del rebosadero)
             y negativos (por debajo del rebosadero). la fórmula es Nivel = 224-Distancia medida.
 
 CM2 ELECTRONICA - Miller Cambindo Montaño -2017-07-07

*/

  #include <LiquidCrystal.h>             // Libreria para el manejo del LCD
  #include <SPI.h>                       // Librería para comunicación serial (Serial Peripheral Interface)
  #include <Ethernet.h>                  // Librería para que la placa Ethernet Shield se conecte a Internet
  #include "DHT.h"                       // Libreria para Sensores DHT (Sensores de Temperatura y Humadad)
 
  #define PIN_TRIG1 14                   // Reserva el pin 14 (A0) de Arduino UNO para el pin TRIG del sensor de nivel1
  #define PIN_ECO1  15                   // Reserva el pin 15 (A1) de Arduino UNO para el pin ECO del sensor de nivel1
  #define DHTPIN 18                      // Pin del Arduino al cual está conectado el sensor DHT, pin 18 (A4)
  #define DHTTYPE DHT11                  // Declara el tipo de sensor a DHT a usar, en este caso el DHT 11
 
 
  long duracion1, distancia1,Nivel;
  long Temperatura, Humedad;
  LiquidCrystal lcd(2, 9, 3, 5, 6, 7, 8);    // inicializamos la librería con los numeros pins del interfaz. Cada LCD puede llevar sus propios numeros
 
  DHT dht(DHTPIN, DHTTYPE);              //Inicializa el sensor de Temperatura y Humedad
 
 

  //=== Para la Ethernet
  byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
  IPAddress ip(192,168,1,51);   // Esta dirección IP es la que se asigna a la placa Ethernet para conectarse a Internet.

  EthernetServer server(80);    // Puerto 80 por defecto para HTTP


  void setup() {
  /*Declaro como salidas digitales los pines analógicos para aprovechar todos los pines del Arduino UNO*/
    pinMode(14, OUTPUT);  //A0  Sensor de Nivel 1 - TRIG1
    pinMode(15, OUTPUT);  //A1  Sensor de Nivel 1 - ECHO1
    
    //pinMode(18, OUTPUT);    //A4 Para leer el LM35, sensor de temperatura.
   


// Mensaje a mostrar en el LCD cuando se energice:
  lcd.begin(16, 2);                    // Establecemos el numero de columnas y filas del display
  lcd.print("CM2 ELECTRONICA");        // enviamos el mensaje a mostrar en el display
  lcd.setCursor(0,1);                  // En la fila 2 se escribe, Inicializando...
  lcd.print("Inicializando...");
  delay(4000);                           // retardo para visualizar el letrero de inicio (CM2 ELECTRONICA. Inicializando...)
/* Fin mensaje*/
 
    Ethernet.begin(mac, ip);     //inicializa la conexión Ethernet y el servidor
    server.begin();
 
    Serial.begin (9600);                 // Inicialización de la comunicación serial
 
    pinMode(PIN_TRIG1, OUTPUT);           // Inicialización de pines digitales para la lectura del sensor de nivel1
    pinMode(PIN_ECO1, INPUT);
   
    }

  void loop() {                        // Bucle del programa

    nivel_Tanque1();                  // Llama la función Nivel Tanque 1, la cual se ha escrito por fuera del bucle (loop)
    visualizar_LCD();                 // Llama la función visualizar datos en el display (LCD)
    Medidor_Temp_Hum();               // llama la función que lee la Temperatura y la Humedad
    monitor_Web();                    // Llama la función monitor_Web para visualizar datos en la computadora vía LAN
                                      // Esta función debe ser la última en llamarse.
     
 }


/* ======== Función Monitor Web: Visualizar vía Web el valor del nivel:==========*/

void monitor_Web(){
 EthernetClient cliente = server.available(); // Inicializa cliente como servidor ethernet
 if (cliente) {
    boolean currentLineIsBlank = true;
    while (cliente.connected()) {
      if (cliente.available()) {
        char c = cliente.read();
       Serial.write(c);
        if (c == '\n' && currentLineIsBlank) {
         
cliente.println("HTTP/1.1 200 OK");
          cliente.println("Content-Type: text/html");   // Envía el encabezado en código HTML estándar
          cliente.println("Connection: close");
               cliente.println("Refresh: 3");                // refresca la pagina automáticamente cada 3 segundos
          cliente.println();
              
          cliente.println(Nivel);              //Imprime en la página web el valor del nivel1.
          cliente.println(Temperatura);            //Imprime en la página web el valor de la Temperatura.
          cliente.println(Humedad);            //Imprime en la página web el valor de la Humedad.
         
         
break;
        }
        if (c == '\n') {
           currentLineIsBlank = true;
        }
        else if (c !=
'\r') {
           currentLineIsBlank = false;
        }
      }
    }

   delay(15);           // Da tiempo al Servidor para que reciba los datos 15ms
   cliente.stop();      // cierra la conexión
  }
}

/* ======== Función Visualizar en LCD: Visualizar en el LCD el valor del nivel:==========*/

void visualizar_LCD(){

  lcd.begin(16, 2);                  // Establecemos el numero de columnas y filas del display
  lcd.print("Nivel de Embalse");     // Imprimir en el LCD la palabra Nivel del Embalse
  lcd.setCursor(5,1);                // Ubicar cursor en la posición 5 de la fila 2
  lcd.print(Nivel);              // Mostrar en el display el nivel.
  lcd.print(" cm");                  // Imprimir las letras cm, para denotar centímetros
//  delay(1000);                       // Retardo para ver las lecturas de nivel cada segundo
  delay(500);                       // Retardo para ver las lecturas de nivel cada segundo
}



/* ======== Función Nivel Muy Bajo: Visualizar en el LCD==========*/
//esta función se llamará cuando el sensor no realice una lectura en el rango definido

void Nivel_Muy_Bajo(){

  lcd.begin(16, 2);                  // Establecemos el numero de columnas y filas del display
  lcd.print("Nivel de Embalse");     // Imprimir en el LCD la palabra Nivel del Embalse
  lcd.setCursor(0,1);                // Ubicar cursor en la posición 0 de la fila 2
  lcd.print("Nivel Muy Bajo");     // Mostrar en el display el nivel.

  delay(500);                        // Retardo para ver las lecturas de nivel cada segundo
}



/* ======== Función Nivel Muy Alto: Visualizar en el LCD ==========*/
//Esta función se llamará cuando el nivel del agua alcance el sensor o cuando elementos obstruyan el sensor, ejemplo telarañas

void Nivel_Muy_Alto(){

  lcd.begin(16, 2);                  // Establecemos el numero de columnas y filas del display
  lcd.print("Nivel de Embalse");     // Imprimir en el LCD la palabra Nivel del Embalse
  lcd.setCursor(0,1);                // Ubicar cursor en la posición 0 de la fila 2
  lcd.print("Nivel Muy Alto");     // Mostrar en el display el nivel.

  delay(500);                        // Retardo para ver las lecturas de nivel cada segundo
}




/*======== Función Nivel Tanque 1: Rutina para la medición del nivel del Tanque 1.============*/

long nivel_Tanque1(){   
 
 
  /* Hacer el disparo */
  digitalWrite(PIN_TRIG1, LOW);       // Nivel bajo durante 2 uS
  delayMicroseconds(2);
  digitalWrite(PIN_TRIG1, HIGH);      // Flanco ascendente
  delayMicroseconds(10);              // Duración del pulso alto durante 10 uS
  digitalWrite(PIN_TRIG1, LOW);       // Flanco descendente
 
 
  duracion1 = pulseIn(PIN_ECO1, HIGH);  // Recepción del eco de respuesta. Lee el eco recibido durante el tiempo que permanece en alto.
 
  distancia1 = (duracion1/2) / 29;      // Cálculo de la distancia efectiva. Se divide entre 2 para obtener la distancia de 

/* Imprimir resultados a la terminal serial */
  if (distancia1 >= 450) {  //Si la distancia supera los 4,5 metros, escribe en el puerto serial "Fuera de rango".
    Serial.println("Fuera de rango");         // y asigna a distancia un valor de -227. al mismo tiempo muestra en el LCD "Error del Sensor"
    Nivel = -227;      //Equivale a 451cm de distancia entre el sensor y el agua.
    Nivel_Muy_Bajo();

 }
 
 
  else {                              // Si la distancia es inferior a 5 m, imprime la distancia
   
   
    if (distancia1 <= 10){ //Si la distancia es inferior a 2cm significa que el nivel del agua llegó hasta el sensor, escribe en el puerto serial "Nivel Muy Alto".
    Serial.println("Nivel Muy Alto");         // y asigna a distancia un valor de 0. al mismo tiempo muestra en el LCD "Error del Sensor"
    Nivel = 222;      //Equivale a 451cm de distancia entre el sensor y el agua.
    Nivel_Muy_Alto();

 }
     
    else{    //sino es menor que 2
   
    Nivel=224-distancia1;
    Serial.println("Nivel del Embalse");
    Serial.print(Nivel);        
    Serial.println(" cm");             // y le agrega cm.
   
  }
  }
 // Nivel=224-distancia1;
 Serial.println("La distancia es:");
     Serial.print(distancia1);        
return Nivel;
 
}


/* ======== Función Leer la temperatura y la Humedad:==========*/
long Medidor_Temp_Hum()
{
 
  Humedad = dht.readHumidity();      // Obtiene la Humedad
  Temperatura = dht.readTemperature();  // Obtiene la Temperatura en Celsius
 
  // Control de errores, valida que se obtuvieron valores para los datos medidos
  if (isnan(Humedad) || isnan(Temperatura)) {
    Serial.println("Falla al leer el sensor DHT!");
//    return;
  }
  Serial.print("Humedad: ");
  Serial.print(Humedad);
  Serial.print(" %\t");
  Serial.print("Temperatura: ");
 
Serial.print(Temperatura);
  Serial.println(" *C ");
return Temperatura, Humedad;
}
 

Ir Arriba

 

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.Net

Imports System.IO

 

Public Class Form1

 

Dim 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.Load

Timer1.Enabled = True

Tiempo.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-2016

Label1.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_Arduino

TextBox2.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 Nivel

Label8.Visible = True 'por tanto, se muestra el texto en color rojo "Error del Sensor"

Label8.ForeColor = Color.Red

Label8.Text = "Nivel Muy Alto o Error del Sensor"

Else

Label8.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 bajo

Label8.Visible = True 'por tanto, se muestra el texto en color rojo "Nivel Muy bajo"

Label8.ForeColor = Color.Red

Label8.Text = "Nivel Muy Bajo"

' Else

' Label8.Visible = False 'si el valor no es 222, no se muestra el mensaje.

End If

Nivel_Grafico = Punto_Medio + Nivel_Arduino ' = 222 + Nivel enviado por Arduino

TextBox1.Text = Nivel_Arduino 'Muestra el valor del Nivel1 en el cuadro de texto1

Nivel_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 Nivel

Varicacion_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 de

Humedad = TextBox4.Text ' El dato de la tercera línea del TexBox3 se lo asigna a la variable Humedad

 

End 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 TiempoRegistro

Timer2.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 mS

Label9.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ón

Chart1.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 If

 

End 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

Ir Arriba

 

 

Descargue del siguiente vínculo el proyecto completo: Descargar

                                                                                                                                                    Aprobado cm2

 

                                                                                                                            Miller Cambindo Montaño.

                                                                                                                            CM2 ELECTRÓNICA