Go Down

Topic: Arduino y thingSpeak (Read 2804 times) previous topic - next topic

NAYREEN

Mar 13, 2016, 04:30 pm Last Edit: Sep 22, 2017, 10:47 pm by surbyte
Buenos días amigos, necesito ayuda de como llevar los datos de un arduino a thingSpeak...
Soy nueva en esto de Arduino... pensaba trabajar con un sensor LM35 ACOPLADO aRDUINO y llevar estos datos  a ThingSpeak...
No entiendo mucho de programación, ya tengo una cuenta abierta en ThingSpeak y habilite un canal, pero no se que mas hacer,, espero me ayude...

juanreinadj

Hola buenas! estoy es tu misma situación...llegaste a enconencontrar algún código sencillo para subir datos a thingspeak con los sensores de temperatura??

surbyte

Thingspeak tiene todos los códigos de ayuda para arduino. No puedes decir

Quote
.llegaste a enconencontrar algún código sencillo para subir datos a thingspeak
Estan ahi.

juanreinadj

ok gracias!  indagare haber si lo puedo agregar, porque si yo tengo un código para leer datos de un dht22 y ds18b20...al introducir el código de thingspeak....no tengo que tocar nada del original??
gracias.

surbyte

#4
Sep 23, 2017, 05:18 am Last Edit: Sep 23, 2017, 05:28 am by surbyte
Los ejemplos son genéricos. Agregar algo es solo agregar algo si tienes el criterio para hacerlo.

Si solo estas copiando y pegando no va a funcionar. Entiendes la idea?
Si copias/pegas sin criterio dificilmente logres hacer que funcione.

Ve a Documentación y mira las sugerencias en youtube y otras con libros sugeridos.


ThinkSpeak library para Arduino

Hay un ejemplo que se llama Multiplesvoltages.ino que reescribiéndolo sirve

Sin embargo buscando solo un poco encontré este tutorial Arduino + Ethernet + Thingspeak El Simple IOT
Espero te sirva

juanreinadj

Gracias! llevo poco tiempo y lo que quisiera es aprender el porque hay que poner una línea u otra cosa...nonsolo copiar y pegar claro...mas o menos estos dos sensores los controlo un poco, ahora falta la conexión a la plataforma lot.
Lo de patagonianet ya lo había visto...ppr ejemplo donde pone dirección mac, se refiere a la de mi shield Ethernet  ( w5100)  no?. La Ip se supone que tiene que ser fija, que no debe cambiar no?
gracias por la pronta contestación!

juanreinadj

#6
Sep 23, 2017, 07:43 pm Last Edit: Sep 24, 2017, 01:00 am by juanreinadj
estado revisando el codigo del link que mandaste, le quitado lo referente a los sensores que han utilizado y dejado solo el mio (ds18b20). Por el monitor serie si me muestra la información del sensor pero en el canal de Thingspeak no muestra nada...me debe de faltar algo, pero no doy con lo que falla o falta....espero me echen una mano, muchas gracias



Code: [Select]
#include <ThingSpeak.h>
#include <SPI.h>
#include <Ethernet.h>
#include <OneWire.h>
#include <DallasTemperature.h>



const int oneWirePin = 5;

OneWire oneWireBus(oneWirePin);
DallasTemperature sensor(&oneWireBus);

byte mac[] = { 0xFE, 0xB6, 0xDC, 0xD3, 0xDD, 0xC4 }; // Mac address, tiene que ser única en la red local
IPAddress ip(192,168,100,7); // Dirección de ip, Al principio vamos a tratar de obtener una dirección por DHCP pero si no funciona usamos esta configuración.
IPAddress gateway(192,168,100,1); // Gateway - Puerta de enlace
IPAddress subnet(255, 255, 255, 0); //  Mascara de red

char thingSpeakAddress[] = "api.thingspeak.com"; // Esta es la dirección del servidor al cual vamos a postear los datos.
String writeAPIKey = "RZ7XNAFAFLAPT2UD"; // Una vez creado un canal necesitamos saber la Key de ese canal y copiarla aquí.
const int updateThingSpeakInterval = 16 * 1000; // Intervalo de tiempo, cada cuanto posteamos en el servidor.

// Variables
long lastConnectionTime = 0;
boolean lastConnected = false;
int failedCounter = 0;
char Status;





// Iniciamos el Ethernet Shield
EthernetClient client;








void setup() {
Serial.begin(9600);
sensor.begin();
startEthernet();

Serial.println("Prueba  ds18b");


}

void loop() {

Serial.print("Temperatura en sensor 0: ");
Serial.print(sensor.getTempCByIndex(0));
Serial.println(" *C ");
sensor.requestTemperatures();




 // Imprimimos por serial lo que nos haya devuelto el servidor.
if (client.available())
{
char c = client.read();
Serial.print(c);
}
// Nos desconectamos de Thingspeak
if (!client.connected() && lastConnected)
{
Serial.println("…disconnected");
Serial.println();
client.stop();
}
// Si estamos desconectados del servidor y paso suficiente tiempo, tenemos que volver a subir los nuevos datos.
if (!client.connected() && (millis() - lastConnectionTime > updateThingSpeakInterval))
{
Leersensores();
}
if (failedCounter > 3 ) {startEthernet();}
lastConnected = client.connected();
}
// Función para enviar los datos a el servidor.
void updateThingSpeak(String tsData)
{
if (client.connect(thingSpeakAddress, 80))
{
client.print("POST /update HTTP/1.1\n");
client.print("Host: api.thingspeak.com\n");
client.print("Connection: close\n");
client.print("X-THINGSPEAKAPIKEY: "+writeAPIKey+"\n");
client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("Content-Length: ");
client.print(tsData.length());
client.print("\n\n");
client.print(tsData);
lastConnectionTime = millis();
if (client.connected())
{
Serial.println("Connecting to ThingSpeak…");
Serial.println();
failedCounter = 0;
}
else
{
failedCounter++;
Serial.println("Connection to ThingSpeak failed ("+String(failedCounter, DEC)+")");
Serial.println();
}
}
else
{
failedCounter++;
Serial.println("Connection to ThingSpeak Failed ("+String(failedCounter, DEC)+")");
Serial.println();
lastConnectionTime = millis();
}
}
// Función para iniciar la conexión con el servidor.
void startEthernet()
{
client.stop();
Serial.println("Connecting Arduino to network…");
Serial.println();
delay(1000);
// Intenta conectarse por DHCP y si no funciona usa la configuración por default.
if (Ethernet.begin(mac) == 0)
{
Serial.println("DHCP Failed, Using default config");
Serial.println();
Ethernet.begin(mac, ip, gateway, subnet);
}
else
{
Serial.println("Arduino connected to network using DHCP");
Serial.println();
}
delay(1000);
}
// Función para leer los sensores y almacenarlos en las variables globales.
void Leersensores() {

if (Status != 0)
delay(Status);


if (Status != 0)
{
delay(Status);

}

}



surbyte

Por favor, lee las normas y edita tu post. El código debe ir con etiquetas.

juanreinadj

Disculpa las molestias, no me había leído las normas....creo que ya esta corregido, un saludo.

surbyte

Esta linea la reemplazaste con tu API?

Code: [Select]
String writeAPIKey = "RZ7XNAFAFLAPT2UD";

juanreinadj

Si, esa es mi apykey que me proporciona el canal. La dirección mac y la ip la saque de un ejemplo de la libreria ethernet por monitor serial.
No se si el fallo esté en la función "leersensores".....
Como no tengo conectados los sensores del codigo original me daba error al cargarlo, entonces como le comenté, eliminé todo lo relacionado con estos sensores y añadiendo el mio. Todo lo relacionado con la conexión sigue igual.

juanreinadj

#11
Sep 25, 2017, 12:10 am Last Edit: Sep 25, 2017, 05:39 am by juanreinadj
E seguido buscando algún código más sencillo para mi proyecto. Encontré el siguiente en el propio foro de thingspeak.  
Code: [Select]



#include <SPI.h>
#include <Ethernet.h>
#include "ThingSpeak.h"
// W5100
Byte de configuración de red W5100_MacAddress [] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
// Configuración de Thingspeak
unsigned long Channel_Number = 302633; // ID de canal
const char * Write_API_Key = "VAMPTX0YTHJ17WJ5"; // Escribir clave de API
int Channel_Field = 1; // Campo donde se cargan los datos de temperatura
// Entrada de sensor LM35 a analógico
#define LM35_Temp_Sensor A0
Cliente EthernetClient;
float LM35_Temp_Value = 0; // Valor de temperatura inicial
int Intervalo = 300; // Intervalo lea la temperatura cada 5 minutos
void setup ()
{
// Conexión en serie
Serial.begin (9600);
// Desactivar la tarjeta SD SPI
pinMode (4, OUTPUT);
digitalWrite (4, ALTO);
// Conectarse a la red local e Internet
Ethernet.begin (W5100_MacAddress);
Serial.println ();
Serial.print ("W5100 Dirección IP:");
Serial.println (Ethernet.localIP ());
Serial.print ("Máscara de subred W5100:");
Serial.println (Ethernet.subnetMask ());
Serial.print ("Puerta de enlace W5100:");
Serial.println (Ethernet.gatewayIP ());
Serial.println ();
// Conecta con el servidor Thingspeak
si (ThingSpeak.begin (cliente))
{
Serial.println ();
Serial.println ("Conectarse al servidor de Thingspeak ...");
Serial.println ();
}
else
{
Serial.println ();
Serial.println ("No se pudo conectar con el servidor de Thingspeak !!!");
Serial.println ();
}
}
void loop ()
{
LM35_Temp_Value = analógicaRead (LM35_Temp_Sensor) * 0.0048828125 * 100;
Serial.print ("Temperatura actual:");
Serial.print (LM35_Temp_Value);
Serial.println ("° C");
retardo (100);
// Escribe la temperatura en el servidor Thingspeak
si (ThingSpeak.writeField (Channel_Number, Channel_Field, LM35_Temp_Value, Write_API_Key))
{
Serial.println ();
Serial.println ("Carga de datos en el servidor de Thingspeak ...");
Serial.println ();
}
else
{
Serial.println ();
Serial.println ("Error al cargar datos en el servidor de Thingspeak !!!");
Serial.println ();
}
// La temperatura se leerá cada 5 min
para (int i = 0; i <= Interval; i ++)
{
delay (1000); // 1 segundo de retraso
}
}



lo he probado y si me muestra temperatura, pero al cambiar el sensor por el mío  (ds18b20) ya no me muestra nada en la página de thingspeak. En monitor serial si...que dato recoge thingspeak de mi sensor??? para que pueda leerlo y mostrarlo???

Gracias

surbyte

No quiero crees que pones un DS18B20 como si fuera un Lm35?
Como haces, solo reemplazas  uno por otro?

juanreinadj

Perdona pero no te entiendo a que te refieres. Mi idea es sustituir en ese mismo código el lm por el ds18b20 pero tengo que cambiar de pin ya que uno es analógico y el otro digital y ya me cambian varios factores...

juanreinadj

Bueno ya e dado con el código correcto por lo menos para funcionar con el ds18b20. A ver si le pudieran echar un vistazo por si se puede hacer mejor o cambiarian algo...


Code: [Select]
#include <ThingSpeak.h>
#include <SPI.h>
#include <Ethernet.h>
#include <OneWire.h>
#include <DallasTemperature.h>


#define ONE_WIRE_BUS 2
 int oneWirePin = 2;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensor(&oneWire);




// W5100 Network Setup
byte W5100_MacAddress[] = {0xFE, 0xB6, 0xDC, 0xD3, 0xDD, 0xC4};
IPAddress ip(192,168,100,7);
IPAddress gateway(192,168,100,1); // Gateway - Puerta de enlace
IPAddress subnet(255, 255, 255, 0); //  Mascara de red


//Thingspeak Setup
unsigned long Channel_Number = 336582; // Channel ID
const char * Write_API_Key = "GTNYOEY6IQR0ZVDJ"; // Write API Key
int Channel_Field = 1; // Field where Temperature data upload to




EthernetClient client;

void setup()
{
// Serial connection
Serial.begin(9600);
 sensor.begin();
 
 Serial.println("Prueba  ds18b");

// Connect to local network and internet
Ethernet.begin(W5100_MacAddress);
Serial.println();
Serial.print("W5100 IP Address: ");
Serial.println(Ethernet.localIP());
Serial.print("W5100 Subnet Mask: ");
Serial.println(Ethernet.subnetMask());
Serial.print("W5100 Gateway: ");
Serial.println(Ethernet.gatewayIP());
Serial.println();
// Connect to Thingspeak server
if (ThingSpeak.begin(client))
{
Serial.println();
Serial.println("Connect to Thingspeak Server...");
Serial.println();
}
else
{
Serial.println();
Serial.println("Failed to connect to Thingspeak Server!!!");
Serial.println();
}
}
void loop()
{
  int lectura = digitalRead(oneWirePin);
  float temp = sensor.getTempCByIndex(0);
Serial.print("Temperatura en sensor 0: ");
  Serial.print(sensor.getTempCByIndex(0));
  Serial.println(" *C ");
  sensor.requestTemperatures();







// Write the temperature to Thingspeak Server
if(ThingSpeak.writeField(Channel_Number, Channel_Field, temp, Write_API_Key))
{
Serial.println();
Serial.println("Uploading data to Thingspeak Server...");
Serial.println();
}
else
{
Serial.println();
Serial.println("Failed to upload data to Thingspeak Server!!!");
Serial.println();
}

{
delay(1000); // 1 second delay
}
}

Go Up