Paso 5: Programa de la Junta
Hay cosas importantes seveal para cambiar en el código siguiente. La primera es la dirección IP. Cada junta debe tener una dirección IP única si no que el router obtendrá muy confundido. Empecé en el ip(192,168,1,178) de la dirección IP; y luego agregó uno al último número. Algunos routers tienen diferentes números, por ejemplo 192.168.2.x y una verificación rápida en un PC ejecutando IPCONFIG en un shell de DOS le dará los 3 primeros números correctos.
El otro número para cambiar es el intervalo de direcciones MAC. La gama bytes mac [] = {}
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEE}; es un número por defecto, tal vez cambio uno a un número hexadecimal diferente en cada tabla, por ejemplo, la última de ellas, cuenta hacia atrás en 0xED hexagonal, 0xEC.
La última cosa a cambiar es si la Junta es un uploader o downloader. Este código hace tanto y a medio camino hacia abajo es
if(!Client.Connected() & & (millis() - lastConnectionTime > postingInterval)) {}
sendData(Analog0,Analog1,Analog2,Analog3,Analog4);
comentar o enviar o recibir datos
getData();
que está configurado para enviar datos. Para obtener nuevamente los datos, comentar senddata y descomentar getdata.
Hay algún código sobra comentada para cosas como dumping hacia fuera de la cadena de texto de Xively que es útil para la depuración para encontrar la manera cortar la cadena y extraer las lecturas del sensor individual.
Xively puede hacer otras cosas como enviar un SMS u otro mensaje cuando se cumplen ciertas condiciones.
¡Que te diviertas!
http://Arduino.CC/en/Tutorial/PachubeClient Este código es de dominio público. * / #include < SPI.h > #include < Ethernet.h > #include < LiquidCrystal.h > #define APIKEY "shsCNFtxuGELLZx8ehqglXAgDo9lkyBam5Zj22p3g3urH2FM" / / reemplazar su clave de api de pachube aquí #define 970253233 FEEDID / / reemplazar feed ID #define USERAGENT "Arduino1" / / agente de usuario es el nombre del proyecto / / asignar una dirección MAC de los ethernet controller.// Ethernet nuevos escudos tienen una dirección MAC impresa en una etiqueta en el escudo / / rellene su dirección aquí : byte [mac] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEE}; / / Rellene una dirección IP disponible en la red, / para ip(192,168,1,178) manual configuración: dirección IP; / / inicializar el cliente de ejemplo: EthernetClient biblioteca; / / inicializar la biblioteca lcd con los números de la interfaz pinsLiquidCrystal lcd(8,9,4,5,6,7); / / si no quieres utilizar DNS (y reducir el tamaño de su dibujo) / Utilice la IP numérica en lugar del nombre para el server(216,52,233,122) de server://IPAddress; / / numérico IP para api.pachube.comchar servidor [] = "api.xively.com"; / nombre dirección para xively APIunsigned lastConnectionTime largo = 0; última vez conectado al servidor, en millisecondsboolean lastConnected = false; Estado de la conexión del tiempo pasado a través de la loopconst principal sin firmar largo postingInterval = 10 * 1000; retraso entre las actualizaciones Pachube.comint contador; Cadena stringOne, stringTwo; construido cadena datos hora stringData backboolean = false; restablecer la hora de un nuevo bloque de datos backvoid setup() {/ / delay(1000); / / en caso de que el puerto serie provoca un latchup / esperar para que el puerto a abrir y abrir comunicaciones en serie: Serial.begin(9600); mientras (! Serie) {; / / espera para que el puerto serie conectar. Necesario sólo para Leonardo} Serial.println("api.xively.com"); Si ir más? calc 32s luego entero no funciona lcd.begin (16, 2); CLS(); claro la pantalla delay(1000); lcd.setCursor(0,1); x, y esquina superior izquierda es lcd.print("api.xively.com") 0,0; lcd.setCursor(0,0); LCD.Print ("Start Ethernet"); Serial.println ("Start Ethernet"); Delay(1000); iniciar la conexión Ethernet: Si (Ethernet.begin(mac) == 0) {//Serial.println ("no se pudo configurar Ethernet usando DHCP"); / / DHCP no se pudo, así que utilice una dirección IP fija: / / lcd.setCursor(0,1); //lcd.print ("fallo al configurar"); Ethernet.Begin (mac, ip); } Serial.println("Wait 10s"); lcd.setCursor(0,1); LCD.Print ("esperar 10s");} void loop() {/ / leer el sensor análogo: int Analog0 = analogRead(A0); / con una pantalla LCD analog0 es el int botones Analog1 = analogRead(A1); int Analog2 = analogRead(A2); int Analog3 = analogRead(A3); int Analog4 = analogRead(A4); / / int sensorReading = analogRead(A2); / / si hay datos entrantes de la conexión de red. / / enviar por el puerto serie. Esto es para depurar / / propósitos solamente: Si (client.available()) {char c = client.read(); Serial.Print(c); Si (stringData == false) {stringData = true; / / algunos datos ha llegado} si (stringData == true) {stringOne += c; / / generar la cadena} si ((c>32) y (c < 127)) {lcd.print(c); contador += 1;} si (contador == 16) {lcd.setCursor(0,1); / / lcd.print(""); lcd.setCursor(0,1); Contador = 0; Delay(100); }} / / Si no hay ninguna conexión de red, pero había una última vez / / a través del lazo, entonces deje el cliente: Si ()! client.connected() & & lastConnected) {/ / Serial.println(); / / Serial.println("Disconnect"); client.stop(); lcd.setCursor(0,0); lcd.print ("desconectado"); lcd.setCursor(0,1); Contador = 0; Si (stringData == true) {PrintResults(); / / extraer los valores e imprima stringData = false; / / reset la bandera stringOne = ""; claro la cadena}} / / si no estás conectado, y han transcurrido 10 segundos/su última conexión, luego vuelve a conectar y enviar datos: if(!client.connected() & & (millis() - lastConnectionTime > postingInterval)) {/ / sendData(Analog0,Analog1,Analog2,Analog3,Analog4); / / comentario o enviar o recibir datos getData();} / / almacenar el estado de la conexión para la próxima vez a través de / / el bucle: lastConnected = client.connected();} void PrintResults() / / imprimir los resultados de la GET de xively {int n = 292; / / desde el sensor datos int i; char lf = 10; int v; CLS(); lcd.setCursor(0,0); stringOne += lf; Añadir un final del carácter de la línea de (me = 0; i < 5; i ++) {mientras que (stringOne.charAt(n)! = 44) / encontrar primera coma {n += 1;} n += 1 mientras que (stringOne.charAt(n)! = 44) / y segundo coma {n += 1;} n += 1; stringTwo = ""; mientras (stringOne.charAt(n) ! = 10) / / encuentra el final de la línea que es una línea de alimentación ascii 10 {/ / lcd.print(stringOne.charAt(n)); stringTwo += stringOne.charAt(n); n += 1;} v=stringTwo.toInt(); LCD.Print(v); LCD.Print(""); espacio final si (i == 1) {lcd.setCursor(0,1);}} } void Cls() / / borrar la pantalla de LCD {lcd.setCursor(0,0); lcd.print(""); claro lcd.setCursor(0,1) de la pantalla del lcd; LCD.Print("");} void PrintValues (int n0 int n1, int n2, int n3, n4 int) {/ / 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);} Este método hace una conexión HTTP con el servidor: void sendData (data0 int int data1, data2 int, int data3, data4 int) {PrintValues(data0,data1,data2,data3,data4); / / Serial.println("Connecting..."); lcd.setCursor(0,0); LCD.Print ("conectando... "); lcd.setCursor(0,1); LCD.Print ("No reply"); Si hay una respuesta muy pronto conseguirá lcd.setCursor(0,1) sobrescrito; Contador = 0; Si hay una conexión exitosa: Si (client.connect (servidor, 80)) {client.print ("PUT /v2/feeds /"); client.print(FEEDID); client.println (".csv HTTP/1.1"); client.println ("Host: api.pachube.com"); client.print ("X-PachubeApiKey:"); Client.println(APIKEY); Client.Print ("User-Agent:"); Client.println(USERAGENT); Client.Print ("Content-Length:"); calcular la longitud del sensor de lectura de bytes: / / 8 bytes para "imagen1" + número de dígitos de los datos: thisLength //int = 8 + getLength(thisData); Client.println(thisLength); 8 es la longitud de la imagen1 y 2 más para crlf int stringLength = 8 + getLength(data0) + 10 + getLength(data1) + 10 + getLength(data2) + 10 + getLength(data3) + 10 + getLength(data4); Client.println(stringLength); últimas piezas de la solicitud HTTP PUT: client.println ("tipo de contenido: texto/csv"); Client.println ("conexión: cerrar"); Client.println(); Aquí es el contenido de la solicitud de puesto: 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 ("esperando respuesta"); xively responde con algo de texto, si nada entonces hay un error lcd.setCursor(0,1); LCD.Print ("esperando respuesta");} otro {/ / si no pudo realizar una conexión: //Serial.println ("fallada la conexión"); / / Serial.println(); //Serial.println ("para desconectar."); client.stop(); / / lcd.setCursor(0,1); //lcd.print ("Connect Fail");} / / Nota el momento en que la conexión fue realizada o intentada: lastConnectionTime = millis();} Este método hace una conexión HTTP con el getData() de servidor: void {/ / si hay una conexión exitosa: Si (client.connect (servidor, 80)) {//Serial.println ("conexión a petición de datos..."); lcd.setCursor(0,0); LCD.Print ("conectar"); Client.Print ("GET /v2 alimentaciones /"); Client.Print(FEEDID); Client.println (".csv HTTP/1.1"); Client.println ("Host: api.pachube.com"); Client.Print ("X-PachubeApiKey:"); Client.println(APIKEY); Client.Print ("User-Agent:"); Client.println(USERAGENT); Client.println ("tipo de contenido: texto/csv"); Client.println ("conexión: cerrar"); Client.println(); Serial.println ("terminado solicitud, esperar respuesta."); lcd.setCursor(0,1); LCD.Print ("solicitud de acabado"); } else {/ / si no pudo realizar una conexión: //Serial.println ("fallada la conexión"); / / Serial.println(); //Serial.println ("para desconectar."); client.stop();} / / Nota el momento en que la conexión fue realizada o intentada: lastConnectionTime = millis();} Este método calcula el número de dígitos en el / / sensor de lectura. Desde cada dígito del decimal ASCII / representación es un byte, el número de dígitos es igual a / / el número de bytes: int getLength (int someValue) {/ hay al menos un byte: int cifras = 1; / / dividir continuamente el valor diez, / / sumar uno a la cuenta del dígito para cada uno / tiempo se divide, hasta que esté a 0: int dividendo = someValue 10; mientras que (dividendo > 0) {dividendo = dividendo 10 dígitos ++;} / / devuelve el número de dígitos : volver dígitos;}