TODOPIC

Lenguajes de programación para PC => Visual Basic => Mensaje iniciado por: bitpic en 08 de Junio de 2013, 13:10:09

Título: DataLogger Visual Basic 2010
Publicado por: bitpic en 08 de Junio de 2013, 13:10:09
Hola foreros,

Llevo unos días probando el Visual Basic 2010 y he decidido hacer un datalogger que sea configurable para poder adaptarlo a distintos datos de distintas aplicaciones y el resultado os lo muestro aquí, para que la gente que quiera aprender como registrar sus datos con Visual Basic tenga una base y la gente que necesita una aplicación como esta pueda utilizarla para registrar sus datos.

Aviso: Es una versión que he probado durante poco tiempo por lo que podría no ser robusta del todo. A demás a medida que haga mejoras o añada funciones intentaré publicarlas aquí si tengo tiempo.

Os adjunto el Instalador para poder usar el programa y el código fuente.

Bueno vamos a explicar un poco como funciona:

- Pantalla principal

(http://imageshack.us/a/img849/7449/principalp.png)

En esta pantalla podemos ver (empezando por arriba a la izquierda):

FILE: De momento solo nos da la opción de salir (Exit)
SERIAL: Configuraciones del puerto serie - BaudRate y numero de puerto al que vamos a conectar.
CHART: Configuraciones del gráfico - Configuración de las series y tipo de gráfico que queremos ver.
SAMPLE TIME: En este desplegable podemos configurar el tiempo de adquisición del puerto serie.
CONNECT: Presionando este botón conectamos y desconectamos del puerto serie.

-Configuración Series:

En la parte derecha de la pantalla vemos 10 Series. Estas series son configurables desde el menu Chart --> Series. Al hacer click en Series nos aparece la siguiente ventana de configuración:

(http://imageshack.us/a/img707/6486/configserie.png)

En esta pantalla de configuración podemos elegir el color de la serie (haciendo click sobre el color correspondiente), el nombre de la serie y si queremos habilitar esta serie o deshabilitarla.

- En la parte inferior tenemos información del puerto seleccionado y el baudRate.

- En la parte central es donde nos aparecerá la gráfica

(http://imageshack.us/a/img842/3646/sinttulohbyg.png)

- ZOOM: Si pulsamos sobre la gráfica y arrastramos el ratón sin soltar podemos hacer zoom en la parte de la gráfica que deseemos.

(http://imageshack.us/a/img94/3493/sinttulo1wgj.png)

(http://imageshack.us/a/img703/6342/sinttulo2cf.png)

Al hacer zoom nos aparecerán barras de desplazamiento en la parte izquierda e inferior de la gráfica para poder navegar por ella.

En las mismas barras de desplazamiento nos aparece un botón con un circulo y un punto en el centro que nos permiten volver al zoom anterior.

TRAMA DE COMUNICACIONES

El DataLogger puede leer hasta 10 datos (10 series). Para que el DataLogger reconozca los datos que le enviamos desde nuestro microcontrolador PIC, ARM, ATMEL, ARDUINO o cualquier sistema que pueda comunicar con el PC por el puerto serie (también puede ser un USB con puerto virtual), tenemos que generar una trama de comunicaciones como la que sigue:

Dato1;Dato2;Dato3;Dato4;Dato5;Dato6;Dato7;Dato8;Dato9;Dato10;\r\n

Sencillo: Enviamos cada dato separado por un ";" y un salto de linea al final de la trama.

No hace falta enviar los 10 datos, podemos enviar menos siempre y cuando sigan las reglas de la trama. El Datalogger reconoce y muestra cada dato y los representa en la gráfica.


EJEMPLO

Os pongo un ejemplo de la versatilidad que le he querido dar.

He hecho una pequeña aplicación con un Arduino Mega y un sensor DHT22 (Temperatura y Humedad) con una trama de solo dos datos.

(http://imageshack.us/a/img543/3852/sam1353y.jpg)

He deshabilitado todas las series menos dos y estas dos las he renombrado a Temperatura y Humedad

(http://imageshack.us/a/img850/1562/21101144.png)

Y ya tengo una gráfica para representar los datos de mi aplicación.

(http://imageshack.us/a/img407/2017/36827155.png)


FUTURO

En un futuro tengo previsto poder imprimir las gráficas en una impresora y poder guardar los datos en un archivo CSV para más tarde poder cargar este archivo en el programa y ver gráficas guardadas anteriormente (modo Offline podríamos llamarlo)

--------------------------------------------------------------------------------------------------

Bueno hasta aquí a llegado todo. Espero que os guste y si alguien le puede servir que pueda utilizarlo.

Cualquier idea o critica constructiva sera bien recibida.

Un saludo a todos!  ;-)

EDITO: No puedo adjuntar el programa ni el código fuente por el tamaño que ocupan, si alguien esta interesado lo puedo colgar en algún sitio que me digáis. Lo siento, no había contado con el tamaño...
Título: Re: DataLogger Visual Basic 2010
Publicado por: bitpic en 08 de Junio de 2013, 13:15:09
Os dejo aquí el instalador:

Instalador (http://www35.zippyshare.com/v/49892623/file.html)

Y aquí el código fuente:

Codigo (http://www35.zippyshare.com/v/3248690/file.html)

 :-/
Título: Re: DataLogger Visual Basic 2010
Publicado por: KALLITOS en 09 de Junio de 2013, 11:13:11
Muchas gracias bitpic por tu aporte  ((:-)) ((:-)).
saludos.
Título: Re: DataLogger Visual Basic 2010
Publicado por: Nocturno en 07 de Enero de 2014, 07:45:31
No había visto este proyecto. Es una chulería.
Enhorabuena bitpic
Título: Re: DataLogger Visual Basic 2010
Publicado por: rivale en 07 de Enero de 2014, 11:35:25
 ((:-)) ((:-))
Felicidades bitpic, me gusto mucho el proyecto, en particular la parte del zoom

 :-/
Título: Re: DataLogger Visual Basic 2010
Publicado por: nibblesys en 18 de Febrero de 2014, 08:25:02
Os dejo aquí el instalador:

Instalador (http://www35.zippyshare.com/v/49892623/file.html)

Y aquí el código fuente:

Codigo (http://www35.zippyshare.com/v/3248690/file.html)

 :-/

Excelente trabajo !!!!
quisiera descargar el fuente pero no funciona el link.
Título: Re: DataLogger Visual Basic 2010
Publicado por: bitpic en 22 de Febrero de 2014, 15:31:07

Excelente trabajo !!!!
quisiera descargar el fuente pero no funciona el link.

Perdon, llevo un tiempo desconectado del foro y no habia visto las respuestas. Gracias si os ha gustado, la verdad es que esta versión gratuita de visual studio va muy bien para nuestras pruebas.
En cuanto a lo del codigo nibblesys si lo necesitas dame unos días que tengo el pc en mal estado, en cuanto lo tenga operativo busco el código (si consigo recuperarlo) y miramos a ver como te lo puedo pasar.

Mientras tanto, si tienes alguna duda dimelo y intentamos solventarla.

Saludo.
Título: Re: DataLogger Visual Basic 2010
Publicado por: bitpic en 27 de Febrero de 2014, 17:09:42
Siento deciros que ya no tengo el programa :cry:  Si es que soy un desastre... cada vez que formateo pierdo algo   :? pero vamos a hacer una cosa que creo que puede ser mejor o al menos más instructivo.

Como he recibido algunos mails pidiendo info sobre como adquirir datos y mostrarlos en gráficas vamos a hacer una cosa, ponedme aquí vuestras dudas he intentaré hacer un manual paso a paso de como adquirir datos en el PC a través del puerto serie con Visual Basic y como mostrarlos numéricamente y en gráfica.

Haré solo lo básico para hacer estas dos cosas y a partir de hay el aspecto final y funciones adicionales es cuestión de dedicarle unas horas más.

En cuanto tenga un rato y me ponga con ello os dejo aquí el link para que podáis seguirlo.

Salud!
Título: Re: DataLogger Visual Basic 2010
Publicado por: elgarbe en 27 de Febrero de 2014, 17:34:51
Yo tengo la primer duda! jeje

He leído que en .net la comunicacion serie se realiza en un thread distinto al de la ejecucion del programa (o algo así) y que por lo tanto, en el evento del componente serie debemos usar delegados para poder modificar controles del thread principal. Entendí bien?
Mi otra duda es, si armo una estructura de datos en el uC y la envío por el puerto serie, como la vuelvo a construir en el PC?
Otra consulta podría ser, si yo tengo una cadena de datos separados por "," y como final de cadena un CR (ASCII 13), como haría en VB o C# para leer una línea completa de datos y luego separarlos?

En esos temas es que estoy un poco parado en este momento...

Saludos y gracias de ante mano!
Título: Re: DataLogger Visual Basic 2010
Publicado por: rivale en 27 de Febrero de 2014, 17:46:09
Yo tengo la primer duda! jeje

He leído que en .net la comunicacion serie se realiza en un thread distinto al de la ejecucion del programa (o algo así) y que por lo tanto, en el evento del componente serie debemos usar delegados para poder modificar controles del thread principal. Entendí bien?
Mi otra duda es, si armo una estructura de datos en el uC y la envío por el puerto serie, como la vuelvo a construir en el PC?
Otra consulta podría ser, si yo tengo una cadena de datos separados por "," y como final de cadena un CR (ASCII 13), como haría en VB o C# para leer una línea completa de datos y luego separarlos?

En esos temas es que estoy un poco parado en este momento...

Saludos y gracias de ante mano!


te respondo una:
en c# lees una cadena con SerialPort.ReadLine()

para separar los componentes de tu vector, tendrías que hacer un parseo buscando ',' y creando subcadenas para recuperar tus datos

Título: Re: DataLogger Visual Basic 2010
Publicado por: BrunoF en 27 de Febrero de 2014, 18:01:42
Yo tengo la primer duda! jeje

He leído que en .net la comunicacion serie se realiza en un thread distinto al de la ejecucion del programa (o algo así) y que por lo tanto, en el evento del componente serie debemos usar delegados para poder modificar controles del thread principal. Entendí bien?

Sí. Es correcto. Necesitás hacer uso de "delegados" que son una especie de lo que en C/C++ serían callbacks.


Mi otra duda es, si armo una estructura de datos en el uC y la envío por el puerto serie, como la vuelvo a construir en el PC?
Otra consulta podría ser, si yo tengo una cadena de datos separados por "," y como final de cadena un CR (ASCII 13), como haría en VB o C# para leer una línea completa de datos y luego separarlos?

En VB .NET se leen mediante el mísmo método: SerialPort.ReadLine(). Lo ideal es enviar los datos en la menor cantidad de bytes. Si estás holgado de ancho de banda del puerto serie, podés recurrir a enviarlos en líneas de String y separados por comas los datos por ejemplo.
Para separarlos podés usar: http://msdn.microsoft.com/es-es/library/b873y76a%28v=vs.110%29.aspx?cs-save-lang=1&cs-lang=vb#code-snippet-2

Sino hay que ensuciarse las manos y empaquetar los datos binarios. Del lado de la PC desempaquetarlos y recuperar la info.

Saludos.
Título: Re: DataLogger Visual Basic 2010
Publicado por: elgarbe en 27 de Febrero de 2014, 19:16:53
Y otra duda, supongamos que voy por la simple y mando lineas enteras, entonces en la PC uso ReadLine. Que pasa si envío los datos más rápido de lo que los leo? se llena algún buffer?
y que pasa si envio los datos muy lento, tengo algún evento que indique "linea completa recivida"? para no quedarme haciendo polling...

saludos y gracias!
Título: Re: DataLogger Visual Basic 2010
Publicado por: rivale en 27 de Febrero de 2014, 19:42:43
el ReadLine lee hasta que encuentra un salto de linea, entonces se quedaría esperando ahí

si utilizas el ReadExisting , lees lo que hay en el buffer en ese momento, si envías tus datos muy lento, con esta recibirías tramos de tu cadena, y tu tendrías que unirlos.

yo hice un tipo "osciloscopio" para ir graficando unos datos en tiempo real, como tenia que parsear y dibujar entre cada recepción, lo que me pasó al enviar muy rápido fue que en la gráfica veía un retraso en la señal, pero creo que esto era por el tiempo del dibujo, no creo que los datos se leyeran con retraso
Título: Re: DataLogger Visual Basic 2010
Publicado por: BrunoF en 27 de Febrero de 2014, 19:56:00
Se va llenando el ReadBuffer a medida que ingresan los datos. Con la propiedad ReadBufferSize elegís el tamaño del buffer de entrada que te parece que vas a necesitar.

Hasta donde sé, no tenés ningún evento asociado a nueva línea. Lo que dispara el evento DataReceived() es que hay disponibles para leer al menos ReceivedBytesThreshold bytes en el ReadBuffer. Ese es el trigger. En cuanto alcanza ese valor de Threshold, se dispara el evento DataReceived().

Acá tenés un ejemplo:

http://code.msdn.microsoft.com/windowsdesktop/SerialPort-Sample-in-VBNET-fb040fb2
Título: Re: DataLogger Visual Basic 2010
Publicado por: elgarbe en 27 de Febrero de 2014, 20:25:50
Bueno, ya va quedando todo mas claro...

Faltaría ver un poco los delegados y estaríamos para avanzar...

Saludos y gracias!
Título: Re: DataLogger Visual Basic 2010
Publicado por: bitpic en 27 de Febrero de 2014, 20:33:29

Os presento aquí una guía rápida de como capturar datos desde el puerto serie el PC y representarlos en dato numérico y en una gráfica. Tened en cuenta que este programa lo he hecho en el tiempo que puesto el ultimo post hasta ahora, parando 15 min para cenar y que aquí ya son horas de irse a la cama que mañana hay que trabajar....  :D

Herramientas necesarias:
-   Visual Basic
-   Tarjeta electrónica que nos envíe datos al PC.

Para comenzar vamos a la página de Visual  Studio y nos bajamos la versión express de Visual Basic:
Visual Basic (http://www.visualstudio.com/downloads/download-visual-studio-vs)

Es posible que podáis bajar alguna versión más reciente, en mi caso lo he intentado pero por mi versión de Windows no puedo instalarlo.
Yo he descargado Visual Basic 2010 Express. Lo descargamos e instalamos.
Una vez instalado Visual Basic pasamos a la tarjeta electrónica. En mi caso, por sencillez y rapidez para hacer el ejemplo, voy a usar una tarjeta Arduino Mega que tengo por casa.

(http://arduino.cc/es/uploads/Main/ArduinoMega.jpg)

La programaré para que el dato enviado varíe simulando una sinusoide con la función sin(), así el ejemplo será más vistoso cuando veamos el dato reflejado en la gráfica.

Código: [Seleccionar]
void setup()
{
  Serial.begin(9600);
}

void loop()
{
  float something = millis()/1000.0;
  int value = 128.0 + 128 * sin( something * 2.0 * PI  );
  Serial.println(value);
}

Una vez programada la tarjeta, comprobamos que la comunicación funciona, para esto abrimos una aplicación como el Hyperterminal de Windows u otro programa similar.
Por ejemplo HERCULES (http://www.hw-group.com/products/hercules/index_es.html)
En mi caso usaré el mismo IDE de Arduino que ya incorpora un terminal serie para comprobar que la comunicación funciona correctamente.

(http://imageshack.com/a/img43/1227/kea0.png)

 Una vez comprobado que nuestra tarjeta y el programa funcionan correctamente pasamos a hacer el programa de Visual Basic.

MANOS A LA OBRA:
Abrimos Visual Basic y le damos a “Nuevo proyecto”

(http://imageshack.com/a/img836/2621/1geb.png)
 
Seleccionamos “Aplicación de Windows Form” y le damos un nombre al proyecto en la parte inferior de la ventana.

(http://imageshack.com/a/img838/1499/2u2q.png)

Le damos al botón “Aceptar” y nos aparecerá nuestro primer Form para moldearlo y poner los controles que necesitemos.

(http://imageshack.com/a/img854/7950/1bhn.png)

Lo primero que vamos a hacer con este form es estirarlo para tener más sitio para nuestro grafico y cambiarle el nombre. Para cambiar el nombre seleccionamos el Form y en el panel derecho de “Propiedades” cambiamos la casilla “Text” por el nombre que queremos que aparezca en el form.

(http://imageshack.com/a/img401/2411/phjt.png)

Escondido en el lado izquierdo tenemos el cuadro de herramientas. Lo abrimos y añadimos a nuestro form los siguientes controles: Button, 2 Labels, ComboBox, TextBox, Chart, Timer y SerialPort.
Nos quedará algo así:

(http://imageshack.com/a/img28/9146/30fj.png)
 
El resumen de lo que vamos a hacer con cada componente es el siguiente:
ComboBox: lo usaremos para listar todos los puertos serie del PC
TextBox: Representaremos en este TextBox el dato que recibimos por el puerto serie
Labels: La usaremos como texto, para indicar que el combobox es la lista de puertos serie y el TextBox es el Dato que recibimos.
Button: Lo usaremos para conectarnos al puerto serie una vez seleccionado el puerto al que queremos conectar.
Chart: Como su nombre indica es el componente que representará el dato en una gráfica.
Timer: Nos permitirá hacer un refresco del dato y la gráfica cada X tiempo
SerialPort: Aunque no lo veremos en el form en tiempo de ejecución este control es que el controlará el puerto serie del PC.

(http://imageshack.com/a/img33/5241/7zhl.png)

Selección del tipo de grafico: Seleccionamos el Chart y en la ventana de propiedades del lado derecho hacemos clic en “Series” y dentro de la ventana de configuración de la serie buscamos “ChartType” y seleccionamos el tipo de grafico que queremos representar, en mi caso voy a poner Line.
 
Aceptamos y salimos.
Timer: Lo seleccionamos y en la ventana de propiedades ponemos un intervalo de 50ms y lo avilitamos poniendo “Enabled” a “True”.
Como código del programa ponemos lo siguiente:

Código: [Seleccionar]
Public Class Form1

    Dim dato

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' Muestra los puertos serie disponibles en el PC.
        For Each sp As String In My.Computer.Ports.SerialPortNames
            ComboBox1.Items.Add(sp)
        Next
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        If SerialPort1.IsOpen Then
            SerialPort1.Close()
            Button1.Text = "Conectar"
        Else
            If ComboBox1.SelectedItem <> "" Then
                SerialPort1.BaudRate = 9600
                SerialPort1.PortName = ComboBox1.SelectedItem
                SerialPort1.Open()
                Button1.Text = "Desconectar"
            End If
        End If

    End Sub

    Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
        On Error GoTo Salir

        dato = CStr(SerialPort1.ReadLine)


Salir:
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

        If SerialPort1.IsOpen Then
            If dato = vbEmpty Then
                dato = 0
            End If

            TextBox1.Text = dato
            Chart1.Series("Series1").Points.AddY(dato)
        End If

    End Sub
End Class

Ejecutamos, seleccionamos el puerto correspondiente y le damos al botón “Conectar”. EL resultado es el siguiente:

(http://imageshack.com/a/img41/3718/tb89.png)

Bueno, hasta aquí de momento que me muero de sueño. Ya veo que han surgido algunas dudas y algunas respuestas. Yo he intentado hacer algo sencillo y muy básico para que todos puedan entenderlo, pero veo que hay algunas preguntas con un poco más de nivel que el ejemplo. En cualquier caso ya iremos solucionando entre todos las dudas que surjan.

Espero que os sea útil. Otro día más.

 :ni)
 
Título: Re: DataLogger Visual Basic 2010
Publicado por: compu_chips en 15 de Agosto de 2014, 12:25:00
Amigo, yo estoy obteniendo datos de un plc ya los tengo en visual, pero los quiero graficar en tiempo real pero tambien quiero que se guarde un historial en un archivo .dat o algo asi para poderlos consultar, tienes alguna idea????

Saludos
Título: Re: DataLogger Visual Basic 2010
Publicado por: bitpic en 15 de Agosto de 2014, 13:31:45
Amigo, yo estoy obteniendo datos de un plc ya los tengo en visual, pero los quiero graficar en tiempo real pero tambien quiero que se guarde un historial en un archivo .dat o algo asi para poderlos consultar, tienes alguna idea????

Saludos

Hola, mira en este link, a ver si los métodos save te pueden servir para tu aplicación:
MSDN  (http://msdn.microsoft.com/es-es/library/system.web.helpers.chart(v=vs.111).aspx)

Si lo que necesitas es registrar los datos y no te sirven estos métodos puedes hacerlo tu guardando los datos que recibes por el puerto serie en una base de datos o en un archivo antes o después de mostrarlos en la gráfica.

Saludos
Título: Re: DataLogger Visual Basic 2010
Publicado por: jl33 en 23 de Marzo de 2015, 22:20:22
Hola a todos, muy buen tutorial de la aldquisicion de datos en visual basic.
Quisiera saber como adquirir la señal de dos sensores?
No se como recibir los datos por el puerto serie en visual basic. Por favor ayuda


Título: Re:DataLogger Visual Basic 2010
Publicado por: pipete01 en 12 de Septiembre de 2016, 13:31:15
Hola bitpic, me encuentro realizando un proyecto similar en visual studio, en el foro no me permite ver las fotografías que publicaste y el link del código ya esta des-habilitado para la descarga, me puedes ayudar con esto por favor, la verdad ya no se como graficar las señales que llegan por el puerto serial en el MS CHart de visual, por favor ayúdame.