Stap 6: VB net en xively
Na het testen van deze uit maandenlang hebben kom ik sommige problemen met de betrouwbaarheid van de ethernet-shield. Dit is vooral als er meerdere router/repeater hop en mogelijk als gevolg van de time-out voor vertragingen. Er zijn problemen met het omgaan met semi-betrouwbare verbindingen waarin natuurlijk radio links die gestoord worden kunnen. Kunnen ook er bugs in de standaardcode voor het Arduino ethernet-schild - er lijken te zijn een aantal correcties op het internet maar ik ben niet zeker welke werken. Het is niet de makkelijkste om te zuiveren terwijl het hele systeem zal voor meerdere dagen uitvoeren en dan hangen.
Een hardware-hack is dat een Arduino, controle van een relais en draaien op de macht aan een tweede Arduino met een ethernet-shield. Vervolgens kan het hele systeem worden uitgeschakeld en vervolgens aangedreven back-up weer.
Een andere optie zou kunnen zijn te kijken naar wifi modules - dit jaar (2014) zij zijn gekomen tot zo laag als $5, en dit misschien uiteindelijk komen met code die hopelijk niet meer sierlijk, of misschien kan opnieuw worden ingesteld met software.
Een andere oplossing is het gebruik van een computer als de internet-interface. Een kleine netbook zal doen. De volgende code is vb.net en luistert naar de arduino op een com-poort en vervolgens uploaden van de gegevens naar xively.
Imports SystemImports System.IO Imports System.Net Imports System.Text ' create a form. From the toolbox add button1, textbox1, textbox2, timer1, serialport1 ' change the timer1 ticks to 4000. Change timer1 enabled to True ' in the opencomport routine, change the com port number ' add checkbox1, name it upload continuously
' Arduino test code '// sends an increasing number every 5 secs 'int n; 'void setup() '{ ' Serial.begin(9600); // also talk at a slow 1200 baud - easier debugging if all baud rates the same ' while (!Serial) {} ; //wait to connect '} 'void loop() // run over and over '{ ' Serial.println(n); ' n += 1; ' delay(5000); '}
Public Class Form1 Public InPacket(0 To 2000) As Byte
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load OpenComPort() end sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click xivelyFeedUpdate("shsCNFtxuGELLZx8ehqglXAgDo9lkyBam5Zj22p3g3urH2FM", "970253233", "sensor1", "14") End Sub
Sub xivelyFeedUpdate(ByVal ApiKey As String, ByVal feedId As String, ByVal channel As String, ByVal value As String) Dim request As WebRequest = WebRequest.Create("http://api.xively.com/v2/feeds/" + feedId + ".csv") Dim postData As String postData = channel + "," + value ' eg sensor1,5 ' build string to send Dim byteArray As Byte() = Encoding.UTF8.GetBytes(postData) request.Method = "PUT" ' PUT or GET request.ContentLength = byteArray.Length ' the length of channel and value request.ContentType = "text/csv" ' text and comma separated data request.Headers.Add("X-ApiKey", ApiKey) ' send the header request.Timeout = 5000 Try Dim dataStream As Stream = request.GetRequestStream() ' Get the request stream. dataStream.Write(byteArray, 0, byteArray.Length) ' Write the data to the request stream. dataStream.Close() ' Close the Stream object. Dim response As WebResponse = request.GetResponse() ' Get the response - usually just Ok ' need to add a try/catch error routine here in case the internet connection goes down TextBox1.Text += CType(response, HttpWebResponse).StatusDescription ' Display the status. dataStream = response.GetResponseStream() ' Get the stream containing content returned by the server. Dim reader As New StreamReader(dataStream) ' Open the stream using a StreamReader for easy access. Dim responseFromServer As String = reader.ReadToEnd() ' Read the content. TextBox1.Text += responseFromServer ' Display the content. reader.Close() ' close the streams dataStream.Close() response.Close() Catch ex As Exception TextBox1.Text = "No connection" End Try End Sub Sub OpenComPort() Try SerialPort1.PortName = "COM9" ' windows key, "control panel", device manager, serial ports to find the number SerialPort1.BaudRate = "9600" SerialPort1.Parity = IO.Ports.Parity.None ' no parity SerialPort1.DataBits = 8 ' 8 bits SerialPort1.StopBits = IO.Ports.StopBits.One ' one stop bit 'SerialPort1.ReadTimeout = 1000 ' milliseconds so times out in 1 second if no response SerialPort1.Open() ' open the port SerialPort1.DiscardInBuffer() ' clear the input buffer 'SerialPort1.Handshake = System.IO.Ports.Handshake.RequestToSend 'handshaking on (or .None to turn off) Catch ex As Exception MsgBox("Error opening serial port - is another program using the selected COM port?") End Try End Sub Private Sub Timer1_Tick_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Dim BytesToRead As Integer Dim i As Integer Dim Character As String ' collect bytes from the serial port Timer1.Enabled = False TextBox2.Clear() ' clear the text box If SerialPort1.IsOpen = True Then Do If SerialPort1.BytesToRead = 0 Then Exit Do ' no more bytes BytesToRead = SerialPort1.BytesToRead If BytesToRead > 2000 Then BytesToRead = 2000 SerialPort1.Read(InPacket, 0, BytesToRead) ' read in a packet For i = 1 To BytesToRead Character = Strings.Chr(InPacket(i - 1)) TextBox2.Text += Character ' add to the text box Next Loop If CheckBox1.Checked = True Then TextBox1.Clear() xivelyFeedUpdate("shsCNFtxuGELLZx8ehqglXAgDo9lkyBam5Zj22p3g3urH2FM", "970253233", "sensor1", Str(Val(TextBox2.Text))) End If End If Timer1.Enabled = True End Sub End Class