Sakernas Internet (6 / 6 steg)
Steg 6: VB netto och xively
Efter att ha testat här ute i flera månader har jag stött på några problem med ethernet shield tillförlitlighet. Detta är främst om det finns flera router/repeater humle och kanske på grund av timeout förseningar. Det finns problem med att hantera semi pålitliga anslutningar vilket naturligtvis inkluderar radiolänkar som kan störas. Det kan också finnas buggar i standard Arduino ethernet shield kod - det verkar finnas ett antal korrigeringar på internet men jag är inte säker på vilka som fungerar. Det är inte det enklaste att felsöka eftersom hela systemet kommer att köras i flera dagar och sedan hänga.
En hårdvara hacka är att ha en Arduino styra ett relä och slå på strömmen till en andra Arduino som har en Ethernet-shield. Sedan kan hela systemet stängs av och sedan drivs tillbaka upp igen.
Ett annat alternativ kan vara att titta på wifi moduler - år (2014) de har kommit ner till som lågt som $5, och dessa kan så småningom komma med kod som förhoppningsvis inte mer graciöst, eller kanske kan återställas med programvara.
En annan lösning är att använda en dator som i internet-gränssnittet. En liten netbook kommer att göra. Följande kod är vb.net och lyssnar till arduino på en com-port och därefter inlagda data till xively.
Import System
Import System.IO
Import System.Net
Import System.Text
' skapa ett formulär. I verktygslådan lägga Knapp1 textbox1, textbox2, timer1, serialport1
"ändra timer1 fästingar till 4000. Ändra timer1 aktiverat True
"i rutinen opencomport ändrar com-portens nummer
"Lägg till checkbox1, namnge det ladda upp kontinuerligt
"Arduino Provningsmetod
' / / skickar allt fler varje 5 sek
"int n;
"void setup()
'{
' Serial.begin(9600); också tala på en långsam 1200 baud - enklare felsökning om alla baud klassar samma
"tag (! Serial) {}; vänta med att ansluta
'}
"void loop() / / kör om och om igen
'{
' Serial.println(n);
"n + = 1;
' delay(5000);
'}
Public Class Form1
Offentliga InPacket (0 till 2000) som Byte
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) hanterar MyBase.Load
OpenComPort()
End sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) hanterar Button1.Click
xivelyFeedUpdate ("shsCNFtxuGELLZx8ehqglXAgDo9lkyBam5Zj22p3g3urH2FM", "970253233", "sensor1", "14")
End Sub
Sub xivelyFeedUpdate (ByVal ApiKey As String, ByVal feedId As String, ByVal kanal som sträng, ByVal värde som sträng)
Dim begäran som WebRequest = WebRequest.Create ("http://api.xively.com/v2/feeds/" + feedId + "CSV")
Dim postData As String
postData = kanal + "," + värde 't.ex sensor1, 5' bygga sträng för att skicka
Dim byteArray som Byte() = Encoding.UTF8.GetBytes(postData)
begäran. Metoden = "Sätta" "PUT eller GET
begäran. ContentLength = byteArray.Length ' längd kanal och värde
begäran. ContentType = "text/csv" "text och semikolon avgränsade data
begäran. Headers.Add ("X-ApiKey", ApiKey) ' sända huvud
begäran. Timeout = 5000
Försök
Dim dataStream som ström = begäran. GetRequestStream() ' få Begäranströmmen.
dataStream.Write (byteArray, 0, byteArray.Length) ' skriva data till Begäranströmmen.
dataStream.Close() ' stänger Stream objektet.
Dim svar som WebResponse = begäran. GetResponse() ' få svaret - oftast bara Ok
"måste lägga till ett try/catch fel rutin här om internet-anslutningen går
TextBox1.Text += bförebild (svar, HttpWebResponse). StatusDescription "Visa status.
dataStream = svar. GetResponseStream() ' få den ström som innehåller innehåll som returneras av servern.
Dim läsare som nya StreamReader(dataStream) "öppna dataström med en StreamReader för enkel åtkomst.
Dim responseFromServer As String = läsare. ReadToEnd() ' läsa innehållet.
TextBox1.Text += responseFromServer ' uppvisning belåtenhet.
läsaren. Close() ' Stäng strömmar
dataStream.Close()
svar. Close()
Fånga som undantag
TextBox1.Text = "Ingen anslutning"
Slutet försök
End Sub
Sub OpenComPort()
Försök
SerialPort1.PortName = "COM9" ' Fönstren nyckel "Kontrollpanelen", Enhetshanteraren, seriella portar att hitta nummer
SerialPort1.BaudRate = "9600"
SerialPort1.Parity = IO. Ports.Parity.None ' ingen paritet
SerialPort1.DataBits = 8 ' 8 bitar
SerialPort1.StopBits = IO. Ports.StopBits.One "en stoppbit
' SerialPort1.ReadTimeout = 1000' millisekunder så gånger i 1 sekund om inget svar
SerialPort1.Open() ' öppna porten
SerialPort1.DiscardInBuffer() ' Rensa indatabufferten
' SerialPort1.Handshake = System.IO.Ports.Handshake.RequestToSend ' handskakning på (eller. Ingen att stänga av)
Fånga som undantag
MsgBox ("fel öppning seriell port - är ett annat program använder den valda COM-porten?")
Slutet försök
End Sub
Private Sub Timer1_Tick_1(ByVal sender As System.Object, ByVal e As System.EventArgs) hanterar Timer1.Tick
Dim BytesToRead som heltal
Dim jag som heltal
Dim karaktär som sträng
"samla in byte från den seriella porten
Timer1.Enabled = False
TextBox2.Clear() ' Rensa textrutan
Om SerialPort1.IsOpen = True Then
Göra
Om SerialPort1.BytesToRead = 0 då Exit gör "inga fler byte
BytesToRead = SerialPort1.BytesToRead
Om BytesToRead > 2000 då BytesToRead = 2000
SerialPort1.Read (InPacket, 0, BytesToRead) ' läsa i ett paket
För i = 1 till BytesToRead
Tecken = Strings.Chr (InPacket (i - 1))
TextBox2.Text += karaktär ' lägga till textrutan
Nästa
Loop
Om CheckBox1.Checked = True Then
TextBox1.Clear()
xivelyFeedUpdate ("shsCNFtxuGELLZx8ehqglXAgDo9lkyBam5Zj22p3g3urH2FM", "970253233", "sensor1", Str(Val(TextBox2.Text)))
Slut om
Slut om
Timer1.Enabled = sant
End Sub
Avsluta klass