Sakernas Internet (5 / 6 steg)
Steg 5: Program styrelsen
Det finns seveal viktiga saker att ändra i koden nedan. Först är IP-adressen. Varje styrelse måste ha en unik IP-adress annars routern kommer att bli mycket förvirrad. Jag började på IP-adress ip(192,168,1,178); och sedan La man till det sista numret. Vissa routrar har olika nummer t.ex 192.168.2.x och en snabb kontroll på en PC som kör IPCONFIG i en DOS skal ger rätt 3 första nummer.
Andra numret för att ändra är MAC-adressintervall. Rad byte mac [] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEE}; är ett standardnummer – kanske förändring man att ett annat hex nummer på varje bräda, t.ex den sista en, räkna bakåt i hex 0xED, 0xEC.
Den sista sak att ändra är om styrelsen är en uploader eller downloader. Denna kod gör både och ungefär halvvägs ner är detta
IF(!client.Connected() & & (millis() - lastConnectionTime > postingInterval)) {
sendData(Analog0,Analog1,Analog2,Analog3,Analog4);
kommentera ut antingen skicka eller hämta data
getData();
som är konfigurerad för att skicka data. För att hämta tillbaka informationen, kommentera ut senddata och avkommentera getdata.
Det finns några överblivna kod kommenteras ut för saker som dumpning ut hela textsträngen från Xively vilket är praktiskt för felsökning för att räkna ut hur man skär upp strängen och extrahera de enskilda sensormätningar.
Xively kan göra andra saker som att skicka ett SMS eller annat meddelande när vissa villkor är uppfyllda.
Ha det så kul!
/*
Pachube sensor klient
Denna skiss ansluter en analog sensor
till Pachube (http://www.pachube.com)
med hjälp av en Wiznet Ethernet shield. Du
kan använda Arduino Ethernet shield, eller
Ethernet-Adafruit sköld, antingen
en kommer att fungera, så länge som det har fått
en Wiznet Ethernet modul ombord.
Detta exempel har uppdaterats för att använda
version 2.0 av Pachube.com API.
Att göra det arbete, skapa en feed med en
Datastream, och ge den ID
sensor1. Eller ändra koden nedan för att
matcha din feed.
Krets:
* Analog sensor kopplad till analog i
0 för tryckknappar
* Ethernet shield bifogas stift 10,
11, 12, 13
LCD kretsen: standard är
12,11,5,4,3,2 förändring av 8,9,4,5,6,7
* LCD RS stift till digital stift 12
* LCD aktivera stift till digital stift 11
* LCD D4 stift till digital stift 5
* LCD D5 stift till digital stift 4
* LCD D6 stift till digital stift 3
* LCD D7 stift till digital stift 2
och skär huvudet stift till D10 kommer att
LCD-displayen (ethernet styrelsen behov här, och på LCD-skärmen
endast användas för att inaktivera bakgrundsljus
Serial debug kommenteras ut nu och
Skicka till LCD istället
Ändra IP-adress till en annan
nummer för varje bräda
skapad 15 mars 2010
modifierade 9 Apr 2012
av Tom Igoe med ingång från Usman
Haque och Joe Saavedra
http://Arduino.cc/en/tutorial/PachubeClient
Denna kod är i public domain.
*/
#include < SPI.h >
#include < Ethernet.h >
#include < LiquidCrystal.h >
#define APIKEY
"shsCNFtxuGELLZx8ehqglXAgDo9lkyBam5Zj22p3g3urH2FM" / /
Byt ut din pachube api-nyckel här
#define FEEDID 970253233 / /
ersätta din feed ID
#define USERAGENT "Arduino1"
förbrukaren agent är projektnamnet
tilldela en MAC-adress för den
Ethernet-styrenhet.
Nyare Ethernet sköldar har en MAC
Adress tryckt på ett klistermärke på skölden
Fyll i din adress här:
byte [mac] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEE};
Fyll i en tillgänglig IP-adress på
ditt nätverk här,
för manuell konfiguration:
IP-adress ip(192,168,1,178);
initiera bibliotek instans:
EthernetClient klient;
initiera LCD-biblioteket med den
nummer av gränssnittet stiften
LiquidCrystal lcd(8,9,4,5,6,7);
Om du inte vill använda DNS (och
minska din skiss storlek)
använda de numeriska IP i stället för den
namn för servern:
IP-adress server(216,52,233,122);
numeriska IP för api.pachube.com
char server [] = "api.xively.com";
namn adress för xively API
osignerade långa lastConnectionTime = 0;
förra gången du ansluten till servern, i millisekunder
booleska lastConnected = false;
tillstånd för anslutningen förra gången genom huvudloop
CONST osignerade långa postingInterval =
10 * 1000; fördröjning mellan uppdateringar av Pachube.com
int counter;
Sträng stringOne, stringTwo; byggt
sträng när data kommer tillbaka
booleska stringData = false; återställa
När ett nytt block av data kommer tillbaka
void setup() {
Delay(1000); i fall seriella
Port orsakar en latchup
Öppna seriell kommunikation och vänta
för port att öppna:
Serial.BEGIN(9600);
tag (!. Serial) {
; vänta på serieporten till
Anslut. Behövs för Leonardo endast
}
Serial.println("API.xively.com");
om gå mer än? 32s då heltal calc fungerar inte
LCD.BEGIN (16, 2);
CLS(); Rensa skärmen
Delay(1000);
lcd.setCursor(0,1); x, y överst till vänster
hörnet är 0,0
LCD.Print("API.xively.com");
lcd.setCursor(0,0);
LCD.Print ("Start Ethernet");
Serial.println ("Start
Ethernet");
Delay(1000);
Starta Ethernet-anslutningen:
om (Ethernet.begin(mac) == 0) {
Serial.println ("misslyckades med att
att konfigurera Ethernet via DHCP");
DHCP misslyckades, så använd en fast IP
Adress:
lcd.setCursor(0,1);
LCD.Print ("kunde inte
Konfigurera");
Ethernet.BEGIN (mac, ip);
}
Serial.println ("vänta 10s");
lcd.setCursor(0,1);
LCD.Print ("vänta 10s");
}
void loop() {
Läs den analog sensorn:
int Analog0 = analogRead(A0); med
en LCD display analog0 är alla knappar
int Analog1 = analogRead(A1);
int Analog2 = analogRead(A2);
int Analog3 = analogRead(A3);
int Analog4 = analogRead(A4);
int sensorReading =
analogRead(A2);
om det inkommande data från den
netto-anslutning.
Skicka den seriella porten. Detta
är för felsökning
syfte:
om (client.available()) {
char c = client.read();
Serial.Print(c);
om (stringData == false)
{
stringData = sant; vissa data
har kommit i
}
om (stringData == true)
{
stringOne += c; bygga den
sträng
}
om ((c>32) och (c < 127))
{
LCD.Print(c);
räknaren + = 1;
}
om (counter == 16)
{
lcd.setCursor(0,1);
LCD.Print("
");
lcd.setCursor(0,1);
räknare = 0;
Delay(100);
}
}
om det finns ingen netto-anslutning, men
Det var en sista gång
genom öglan, sedan sluta den
klient:
om (! client.connected() & &
lastConnected) {
Serial.println();
Serial.println("Disconnect");
client.stop();
lcd.setCursor(0,0);
LCD.Print ("koppla");
lcd.setCursor(0,1);
räknare = 0;
om (stringData == true)
{
PrintResults(); extrahera den
värden och skriva ut
stringData = false; återställa den
flagga
stringOne = ""; //
Rensa strängen
}
}
Om du inte är ansluten, och tio
sekunder har gått sedan
din senaste anslutning och Anslut sedan
igen och skicka data:
IF(!client.Connected() & &
(millis() - lastConnectionTime > postingInterval)) {
sendData(Analog0,Analog1,Analog2,Analog3,Analog4);
kommentera ut antingen skicka eller hämta data
getData();
}
lagra tillståndet för anslutningen
för nästa gång genom
loopen:
lastConnected = client.connected();
}
void PrintResults() / / skriva ut resultaten av
Hämta från xively
{
int n = 292; börja på sensorn
data
int i;
char lf = 10;
int v.
CLS();
lcd.setCursor(0,0);
stringOne += lf; lägga till en avsluta av
tecknet för
för (jag = 0; jag < 5; i ++)
{
medan (stringOne.charAt(n)! = 44)
hitta första kommatecken
{
+ n = 1.
}
+ n = 1.
medan (stringOne.charAt(n)! = 44)
Hitta andra kommatecken
{
+ n = 1.
}
+ n = 1.
stringTwo = "";
medan (stringOne.charAt(n)! = 10)
hitta i slutet av den linje som är en linje foder ascii 10
{
LCD.Print(stringOne.charAt(n));
stringTwo += stringOne.charAt(n);
+ n = 1.
}
v=stringTwo.toInt();
LCD.Print(v);
LCD.Print(""); utrymme
på slutet
om (jag == 1)
{
lcd.setCursor(0,1);
}
}
}
void Cls() / / clear LCD-skärm
{
lcd.setCursor(0,0);
LCD.Print("");
tydlig LCD-skärm
lcd.setCursor(0,1);
LCD.Print("");
}
void PrintValues (int n0, int n1, n2 int,
int n3, int n4)
{
Serial.Print(N0);
Serial.Print("");
Serial.Print(N1);
Serial.Print("");
Serial.Print(N2);
Serial.Print("");
Serial.Print(N3);
Serial.Print("");
Serial.println(N4);
CLS();
lcd.setCursor(0,0);
LCD.Print(N0);
LCD.Print("");
LCD.Print(N1);
lcd.setCursor(0,1);
LCD.Print(N2);
LCD.Print("");
LCD.Print(N3);
LCD.Print("");
LCD.Print(N4);
Delay(2000);
}
med denna metod är en HTTP-anslutning
till servern:
void sendData (int data0 int data1, int
data2, int uppgifter3, int data4) {
PrintValues(data0,data1,data2,data3,data4);
Serial.println("Connecting...");
lcd.setCursor(0,0);
LCD.Print ("ansluta... ");
lcd.setCursor(0,1);
LCD.Print ("inget svar");
om det finns ett svar detta kommer mycket snabbt få över
lcd.setCursor(0,1);
räknare = 0;
om det finns en framgångsrik
anslutning:
om (client.connect (server, 80)) {
client.Print ("PUT
/v2/feeds / ");
client.Print(FEEDID);
client.println (".csv
HTTP/1.1 ");
client.println ("värd:
API.pachube.com");
client.Print ("X-PachubeApiKey:
");
client.println(APIKEY);
client.Print ("User-Agent:");
client.println(useragent);
client.Print ("Content-Length:
");
beräkna längden av den
sensor läsa i byte:
8 byte för "sensor1"
+ antal siffror av data:
int thisLength = 8 +
getLength(thisData);
client.println(thisLength);
8 är längd sensor1 och 2
mer för crlf
int stringLength = 8 +
getLength(data0) + 10 + getLength(data1) + 10 + getLength(data2) + 10
+ getLength(data3) + 10 + getLength(data4);
client.println(stringLength);
senaste bitar av HTTP sätta
begäran:
client.println ("Content-Type:
text/csv");
client.println ("anslutning:
Stäng");
client.println();
här är det faktiska innehållet i de
Placera begäran:
client.Print("sensor1,");
client.println(Data0);
client.Print("sensor2,");
client.println(Data1);
client.Print("sensor3,");
client.println(data2);
client.Print("sensor4,");
client.println(Data3);
client.Print("sensor5,");
client.println(Data4);
Serial.println ("vänta
svara"); xively svarar med text, om ingenting sedan
Det finns ett fel
lcd.setCursor(0,1);
LCD.Print ("vänta på svar
");
}
annat {
Om du inte kunde göra en
anslutning:
Serial.println ("anslutning
kunde inte");
Serial.println();
Serial.println ("så
Koppla loss.");
client.stop();
lcd.setCursor(0,1);
LCD.Print ("Anslut misslyckas");
}
Notera tid som anslutningen
var gjort eller försökt:
lastConnectionTime = millis();
}
med denna metod är en HTTP-anslutning
till servern:
void getData() {
om det finns en framgångsrik
anslutning:
om (client.connect (server, 80)) {
Serial.println ("ansluta
att begära data...");
lcd.setCursor(0,0);
LCD.Print ("Connect");
client.Print ("få
/v2/feeds / ");
client.Print(FEEDID);
client.println (".csv
HTTP/1.1 ");
client.println ("värd:
API.pachube.com");
client.Print ("X-PachubeApiKey:
");
client.println(APIKEY);
client.Print ("User-Agent:");
client.println(useragent);
client.println ("Content-Type:
text/csv");
client.println ("anslutning:
Stäng");
client.println();
Serial.println ("färdig
begär, vänta på svar. ");
lcd.setCursor(0,1);
LCD.Print ("Finish begäran");
}
annat {
Om du inte kunde göra en
anslutning:
Serial.println ("anslutning
kunde inte");
Serial.println();
Serial.println ("så
Koppla loss.");
client.stop();
}
Notera tid som anslutningen
var gjort eller försökt:
lastConnectionTime = millis();
}
Denna metod beräknar antalet
siffror i den
sensor läsning. Sedan varje siffra för
ASCII decimal
representation är en byte, antalet
av siffror lika med
antalet byte:
int getLength (int someValue) {
Det finns minst en byte:
int siffror = 1;
ständigt dividera värdet av
tio,
lägga till en till antalet siffror för
varje
tid du dela upp, tills du är på
0:
int utdelning = someValue /10;
medan (utdelning > 0) {
utdelning = utdelning /10;
siffror ++;
}
returnera antalet siffror:
siffrorna;
}