domingo, 8 de julho de 2012

Escrevedo no Cartão SD - Parte 3

Como Rubens mencionou no comentário , não publiquei nenhum código para transformar o arquivo de texto em uma planilha do excel ou em gráfico. Então, nesse final de semana tratei de fazer algo que nos fosse próximo ao que ele solicitou e que pudesse exportar os gráficos para Excel e também construir um gráfico.


De maneira conveniente, o gráfico seria simples com dois step's apenas (Verdadeiro ou Falso), por isso, mudei o código um pouco tratando de conectar o LDR na porta analógica. O LDR é analógico por natureza e pouco linear por isso pode-se estimar o nível de iluminamento utilizando o simples LDR conectado na porta analógica. Atendo-se ao objetivo do software não me preocupei muito em realizar a interpolação matemática dos pontos pelo software - que deixo para outro post mais oportuno - e sim  conversão dos dados para excel.

Para apresentar os dados usei uma estrutura muito conhecida dos programadores em .NET, o DataSet. Proveniente do ADO.NET o DataSet é uma estrutura de conexão com banco de dado, através do DataSet você pode "importar" um banco de dados para local e manipulá-lo sem necessitar de grandes códigos. Além disso, o que me agrada bastante, é a possibilidade de salvar o arquivo em um *.xml através de um único comando e depois carregá-lo em outro software na mesma estrutura de tabelas. Realmente o que eu uso  código não o DataSet em si, mas sim o DataTable - uma tabela do DataSet - com essa tabela basta associar como fonte da estrutura DataGridView que já se organiza na tela permitindo a visualização dos dados, como foi feito no software.

Além da tabela, fiz no programa uma maneira de implementar de forma gráfica, o que trata de algo bem interessante visto que um gráfico torna o resultado mais palpável e evidente. Para implementação usei a maneira mais simples que encontrei na internet - através do Chart do.NET - que funciona de maneira bem similar a forma utilizada para apresentar os dados na tela do programa. Cria-se uma área gráfica (ChartAreas) atribui a ela uma série de dados (uma série porque só salvamos um dado) e associa a área gráfica delimitada no programa.

Este é o código para apresentar a tabela de valores e o gráfico na tela. Para baixar projeto do Visual Studio clique aqui.


'Abre o arquivo
Dim objReader As StreamReader = New StreamReader(openFileDialog.FileName)
Dim strContents As String = objReader.ReadToEnd()
objReader.Close()


'Cria o gráfico e o eixo onde será colocado os dados
Chart1.ChartAreas(0).Name = "Gráfico"
Chart1.Series.Add("Lux")
Chart1.Series("Lux").ChartType = SeriesChartType.Line
Chart1.Series("Lux").ChartArea = "Gráfico"

'Cria uma tabela de dados para apresentar no DataGridView
myTable = New Data.DataTable
myTable.TableName = "Data"

'Associa a tabela "Data" a coluna de tempo
Dim timeColum As New DataColumn()
timeColum.ColumnName = "Tempo"
timeColum.Namespace = "Tempo"
If Not myTable.Columns.Contains(timeColum.Namespace) Then
    myTable.Columns.Add(timeColum)
End If

'Associa também a tabela "Data" a coluna de dados
Dim valueColum As New DataColumn()
valueColum.Namespace = "Valor"
valueColum.ColumnName = "Valor"
If Not myTable.Columns.Contains(valueColum.Namespace) Then
    myTable.Columns.Add(valueColum)
End If

'Desmonata o arquivo de texto em linhas
Dim arrayContents As String() = strContents.Split(vbLf)

'Para cada Linha processa os dados
For i As Integer = 0 To arrayContents.Length - 2

    'Se a linha é valida, ou seja, tem pelo menos os caracteres da data correta
    ' os 18 primeiros caracteres ex.: 06/17/2012 14:08:10
    If arrayContents(i).Length = 23 Then

        'Cria uma nova linha tipada da tabela
        Dim newRow As DataRow = myTable.NewRow

        'Separa a data de um lado e o dado na outra coluna
        newRow.Item(0) = arrayContents(i).Substring(1, 18)
        newRow.Item(1) = arrayContents(i).Split(vbTab)(1)

        'Adiciona a tabela
        myTable.Rows.Add(newRow)

        'Adiciona o dado ao gráfico convertendo-o para double
        Chart1.Series("Lux").Points.AddXY(arrayContents(i).Substring(1, 18), _
CType(arrayContents(i).Split(vbTab)(1), Double))

    End If
Next

DataGridView1.DataSource = myTable

 Como o Rubens pediu eu construí também uma parte para converter o arquivo para excel usando uma dll do excel mesmo - isso implica que terá que ter o excel instalado para que o programa funcione (presumo eu, não fiz nenhum teste)  no mesmo projeto (Projeto).


  ' various variables
Dim row As Integer
Dim col As Integer
Dim rowCount As Integer
Dim colCount As Integer
Dim cell As String
Dim rowcell As Integer

' Excel Variables
Dim excelApp As New Excel.Application
Dim excelBook As Excel.Workbook = excelApp.Workbooks.Add
Dim excelWorksheet As Excel.Worksheet = _
    CType(excelBook.Worksheets(1), Excel.Worksheet)

' get count of rows and count of columns
rowCount = myTable.Rows.Count()
colCount = myTable.Columns.Count()

' add the column headings
For col = 0 To colCount - 1
    row = 1
    cell = GetExcelColumn(col) & row.ToString
    excelWorksheet.Range(cell).Value = "Data"
    'excelWorksheet.Range(cell).ColumnWidth = "Valor"
Next

' now add the data elements
For row = 0 To rowCount - 1
    rowcell = row + 2
    For col = 0 To colCount - 1
cell = GetExcelColumn(col) & rowcell.ToString
excelWorksheet.Range(cell).Value = myTable.Rows(row).Item(col).ToString
    Next
Next
' turn off wait cursor
Me.Cursor = Cursors.Default

' view the spread sheet
excelApp.Visible = True

excelBook.SaveAs(myStream.ToString(), _
 Excel.XlFileFormat.xlXMLSpreadsheet, _
 AccessMode:=Excel.XlSaveAsAccessMode.xlNoChange)

Para o código funcionar deve-se adicionar o Microsoft.Office.Interop.Excel do .NET. Oc comentários estão em inglês porque encontrei esse código na internet e fiz alguns pequenos ajuste, se desejar encontrar a origem coloque no google algum trecho, realmente esqueci de onde veio o código...

Para salvar pela interface digite o nome do arquivo com extensão xls, por exemplo: teste.xls.

Acredito que o post tenha sido bem útil e tenha ajudado bastante, para finalizar, deixo os link para fazer download dos dois projetos do VS2010, do programa do Netduino Plus e do Código para interpretar os dados do cartão.




Um comentário: