He implementado con éxito en el pasado, pero de repente dejó de funcionar, una integración entre Arduino con Ethernet Shield, que se comunica con cosm.com para poner en valor el valor de un sensor de temperatura. Estoy seguro de que mi código no cambió, pero después de volver a iniciar mi aplicación después de unas semanas, en lugar de ejecutar con éxito un comando "poner" en la API cosm, devolví -1. No estoy seguro de qué significa eso para intentar arreglarlo.
Confirmé que mi Arduino + Ethernet funciona, cargando el ejemplo de WebServer sketch, y obtuve los resultados deseados al acceder a la IP (en este caso, 192.168.0.178)
Cuando voy a la página de depuración de la API de cosm.com, no veo que mis comunicaciones lleguen a su sitio, así que estoy seguro de que en algún lugar entre mi Arduino y la API de cosm hay algo roto. Y sí, mi internet está funcionando y sí, la tarjeta Ethernet tiene acceso a él (lo hice llamar a uno de mis servidores y registró el éxito en apache)
Aquí está el código para mi boceto:
incluir
#include <Ethernet.h>
#include <HttpClient.h>
#include <Cosm.h>
#include <OneWire.h>
//===================================================
// COSM Setup:
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 0, 178 };
//IPAddress ip(192,168,0,177);
char cosmKey[] = "k8G6bvz0f_PCO_TOOK_PART_OF_THIS_AWAY_FOR_THE_USUAL_REASONS_FwQT0g";
char sensorId[] = "DS18B20";
CosmDatastream datastreams[] = {
CosmDatastream(sensorId, strlen(sensorId), DATASTREAM_FLOAT),
};
// Finally, wrap the datastreams into a feed
CosmFeed feed(95874, datastreams, 1 /* number of datastreams */);
EthernetClient client;
CosmClient cosmclient(client);
//===================================================
// 1-Wire Setup:
int DS18S20_Pin = 2; //DS18S20 Signal pin on digital 2
float mavg5readings = -1000;
float mavg10min = -1000;
float mavg60min = -1000;
float mavg12h = -1000;
float mavg24h = -1000;
#define REFRESHRATE = 1000;
//Temperature chip i/o
OneWire ds(DS18S20_Pin); // on digital pin 2
void setup(void) {
Serial.begin(9600);
Serial.println("Serial Port Reset!");
pinMode(3, OUTPUT);
Ethernet.begin(mac, ip);
// while (Ethernet.begin(mac) != 1)
// {
// Serial.println("Error getting IP address via DHCP, trying again...");
// delay(1000);
// }
Serial.println("Setup DONE");
// make sure we don't get bullshit from the device when we reboot it
for (int i = 0; i < 3; i++) {
digitalWrite(3, HIGH);
float temperature = getTemp();
digitalWrite(3, LOW);
Serial.print("Sync Setup Temperature: ");
Serial.println(temperature);
delay(1000);
}
}
IPAddress server(216,52,233,121); // api.cosm.com
void loop(void) {
delay(5000);
digitalWrite(3, HIGH);
delay(100);
digitalWrite(3, LOW);
float temperature = getTemp();
if (mavg10min <= -1000) { // i.e. we haven't set it yet
mavg10min = temperature;
mavg60min = temperature;
mavg12h = temperature;
mavg24h = temperature;
mavg5readings = temperature;
} else {
mavg10min = (mavg10min*600-mavg10min+temperature)/600;
mavg60min = (mavg60min*3600-mavg60min+temperature)/3600;
mavg12h = (mavg12h*43200-mavg12h+temperature)/43200;
mavg24h = (mavg24h*86400-mavg24h+temperature)/86400;
mavg5readings = (mavg5readings*5-mavg5readings+temperature)/5;
}
Serial.print(temperature);
Serial.print(" (10min: ");
Serial.print(mavg10min);
Serial.print(" | 60min: ");
Serial.print(mavg60min);
Serial.print(" | 12h: ");
Serial.print(mavg12h);
Serial.print(" | 24h: ");
Serial.print(mavg24h);
Serial.print(")");
Serial.print("\n\r");
if (temperature < 50) { // we had a post of 85 when we restarted it once
if (client.connect(server, 80)) {
datastreams[0].setFloat(mavg5readings);
Serial.print("Read sensor value ");
Serial.println(datastreams[0].getFloat());
Serial.println("Uploading it to Cosm");
digitalWrite(3, HIGH);
int ret = cosmclient.put(feed, cosmKey);
digitalWrite(3, LOW);
Serial.print("cosmclient.put returned ");
Serial.println(ret);
Serial.println();
} else {
for (int i = 0; i < 10; i++) {
digitalWrite(3, HIGH);
delay(100);
digitalWrite(3, LOW);
delay(50);
}
Serial.println("HUH?");
}
}
for (int i = 0; i < 5; i++) {
digitalWrite(3, HIGH);
delay(50);
digitalWrite(3, LOW);
delay(5000); //just here to slow down the output so it is easier to read
}
}
float getTemp(){
//returns the temperature from one DS18S20 in DEG Celsius
byte data[12];
byte addr[8];
if ( !ds.search(addr)) {
//no more sensors on chain, reset search
ds.reset_search();
return -1001;
}
if ( OneWire::crc8( addr, 7) != addr[7]) {
Serial.println("CRC is not valid!");
return -1002;
}
if ( addr[0] != 0x10 && addr[0] != 0x28) {
Serial.print("Device is not recognized");
return -1003;
}
ds.reset();
ds.select(addr);
ds.write(0x44,1); // start conversion, with parasite power on at the end
byte present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
for (int i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
}
ds.reset_search();
byte MSB = data[1];
byte LSB = data[0];
float tempRead = ((MSB << 8) | LSB); //using two's compliment
float TemperatureSum = tempRead / 16;
return TemperatureSum;
}
Por lo tanto, esta sección de código es el primer lugar en el que van las cosas: int ret = cosmclient.put (feed, cosmKey); Cuando llego a ese punto, se supone que debo recuperar un código 200 o incluso 404, pero en lugar de eso obtengo -1.
Luego, en mi bucle donde intento publicar el resultado de mi sensor de temperatura, trato de conectarme al servidor en el puerto 80, y si eso falla, solo hago un pequeño bucle para ver un efecto en un LED para poder ver qué hay. Cocinar sin tener que trollear el puerto serie:
if (client.connect(server, 80)) {