Tutorial del Internet de las Cosas y Bluetooth con el ESP32
Juan Antonio Villalpando
Volver al índice del tutorial
____________________________
117.- Cliente de ThingSpeak.

- MQTT (Message Queue Telemetry Transport)
- MQTT Broker es un servidor en donde podemos enviar valores, para que otros clientes puedan leerlos.
- Enviar un valor se realiza mediante Publish. Subscribe consiste en subscribirse a un valor para obtener su dato cuando cambie.
-
Los clientes envían periódicamente un paquete (PINGREQ) y esperan la respuesta del Broker (PINGRESP).
- Broker MQTT son: ThingSpeak, iot.eclipse, adafruit,... mosquito es un Broker MQTT que podemos instalar en nuestro sistema.
- En nuestros ejemplos el ESP8266 enviará valores al servidor ThingSpeak y esos valores se pueden consultar en la misma página de ThingSpeak mediantes gráficos.
- También el ESP8266 podrá recibir valores enviados desde una aplicación o página web.
- Este protocopo lo utiliza Facebook,
------------------------------------------------------------
- ThingSpeak.
- Características: con la versión gratuita, solo podemos actualizar cada 15 segundos. Podemos utilizar hasta 4 canales. No podemos subir distintos datos de un mismo canal en menos de 15 segundos. Podemos enviar hasta 3 millones de informaciones al año.
- Vamos a conectar nuestra tarjeta con un servidor web de Internet llamado ThingSpeak y le enviaremos datos para que cualquiera pueda consultarlo a través de Internet.
- Se podrá consultar los datos en un diagrama de barras, circular,... que se mostrará en la página web.

- Vamos a registrarnos y luego realizaremos tres códigos:
____________________________________________________________
- Registro en ThingSpeak.
- Nos damos de alta en ThingSpeak. Pulsamos en Sign Up.



- Nos enviará un correo, debemos pulsar sobre "Verify your email"
(Si no lo vemos en la bandeja de entrada, consultamos la carpeta de SPAM del correo)


- Volvemos a la web de ThingSpeak y establecemos un usuario y una contraseña.


- Creamos un nuevo Canal:
- En el Field1 escribimos: aleatorio, lo marcamos. Al final de la página, pulsamos el botón de "Save channel".

- Pulsamos en API Keys.

- Más adelante necesitaremos esas Keys. Dependiendo de la aplicación, también podríamos necesitar el Channel ID.


- Public View: para que lo pueda ver cualquiera que se conecte a nuestra web de ThingSpeak.
- Channel Settings: modificación del canal. Abajo de esta página hay un botón "Clear" para borrar los datos.
- Sharing: compartir, establecer los visualizadores públicos. (Share channel view with everyone)
- Aquí podemos curiosear canales públicos: https://thingspeak.com/channels/public
- Más información: https://community.thingspeak.com/documentation%20.../api/
___________________________________________
___________________________________________
- Delay.
- Con la versión gratuita de ThingSpeak, podemos subir valores con un intervalo de más de 15 segundos, ese intervalo lo podemos programar mediante:
delay(15000);
Esto lo que hace es parar el programa 15 segundos, una mejor opción para crear ese intervalo de subida y que el programa no pare, es utilizar este código:
periodo_15.ino |
unsigned long tiempo_actual=0;
void setup() {
Serial.begin(115200);
}
void loop() {
if((millis()-tiempo_actual)>=15000){
tiempo_actual=millis();
Serial.println("Hola");
}
}
|
- Ver ejemplo: http://www.arduinoblocks.com/web/project/3506#
___________________________________________
___________________________________________
___________________________________________
- Enviar un número aleatorio desde ESP8266 a la web de ThingSpeak.
juanantoniocuarto@gmail.com
Laarboleda2019
----------------------------
Author: juanantonio4
Channel ID: 746330
-----------------------------
Write API Key: SVRKZNDDNS9TVSIB
Read API Key:
LKN1MV3BG2SJ2HJS
https://thingspeak.com/channels/746330
1.- Código sin librería de ThingSpeak.
NOTA: este código no funciona con el ESP32
- Este código creará números aleatorios desde el 0 al 90. Los enviará a ThingSpeak, por el puerto 80, esto es en
websockets, este método requiere algo más de recursos que al enviarlo por el puerto 1883.
- Debemos poner la Write API Key
- Subimos el código. Según utilicemos el ESP8266 o el ESP32 cambiaremos la librería.
#include <ESP8266WiFi.h> // Para ESP8266
#include <WiFi.h> // Para ESP32
ESP8266.ino |
#include <ESP8266WiFi.h> // Para ESP8266
// #include <WiFi.h> // Para ESP32
const char* ssid = "Nombre_de_tu_red_WiFi";
const char* password = "Contraseña_WiFi";
const char* host = "api.thingspeak.com";
String apiKey = "ABCDEFÑÑÑÑÑÑÑ";
void setup() {
Serial.begin(115200);
delay(10);
// Conecta a la red wifi.
Serial.println();
Serial.print("Conectando con ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" Conectado con WiFi.");
}
void loop() {
delay(16000); // Debes poner un tiempo de más de 15 segundos.
int aleatorio = random(0,90);
Serial.print("Conectando con ");
Serial.println(host);
// Clase cliente
WiFiClient client;
if (!client.connect(host, 80)) {
Serial.println("Fallo en la conexión.");
return;
}
String postStr = apiKey;
postStr += "&field1=";
postStr += String(aleatorio);
postStr += "\r\n\r\n";
client.print("POST /update HTTP/1.1\n");
client.print("Host: api.thingspeak.com\n");
client.print("X-THINGSPEAKAPIKEY: " + apiKey + "\n");
client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("Content-Length: ");
client.print(postStr.length());
client.print("\n\n");
client.print(postStr);
client.print("Connection: close\n");
client.stop();
}
|
- Consultamos la página de nuestro canal de ThingSpeak y obtendremos estos gráficos.
- Para añadir el elemento circular pulsamos en "Add Widgets".
- De una subida a otra debe pasar un tiempo de más de 15 segundos.

___________________________________________
___________________________________________
___________________________________________
___________________________________________
2.- Otro código sin librería de ThingSpeak.
- Debemos espaciar las subidas más de 15 segundos.
- Subimos el código. Según utilicemos el ESP8266 o el ESP32 cambiaremos la librería.
#include <ESP8266WiFi.h> // Para ESP8266
#include <WiFi.h> // Para ESP32
ESP8266_2.ino |
// Juan Antonio Villalpando.
// kio4.com
// Subir sin librería.
#include <ESP8266WiFi.h> // Para ESP8266
// #include <WiFi.h> // Para ESP32
const char* ssid = "Nombre_de_tu_red_WiFi";
const char* password = "Contraseña_WiFi";
const char* host = "api.thingspeak.com";
void setup(){
Serial.begin(115200);
delay(10);
// Conecta a la red wifi.
Serial.println();
Serial.print("Conectando con ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" Conectado con WiFi.");
}
void loop(){
delay(16000); // Debe ser más de 15 segundos.
int aleatorio = random(0,90);
Serial.print("Conectando con ");
Serial.println(host);
// Clase cliente
WiFiClient client;
if (!client.connect(host,80)) {
Serial.println("Fallo en la conexión.");
return;
}
// Linea de petición
String url = "/update?api_key=ABCDEFGÑÑÑÑÑ&field1=";
url += aleatorio;
// Esto es lo que se enviará al servidor.
client.print(String("POST") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
Serial.println();
Serial.println("Conexión cerrada.");
}
|
___________________________________________
___________________________________________
___________________________________________
___________________________________________
3.- Con librería.
- También se puede hacer instalando una librería de ThingSpeak en el IDE del Arduino.
- Librería: thingspeak-arduino.zip
- La copiamos en la carpeta ../Arduino/libraries
-----------------------------------------------------------
- Otra forma de instalar la librería: Vamos a Programa / Incluir Librería / Gestionar Librerías

- Escribimos: thingspeak y la instalamos.

___________________________
- Código con librería.
- Debemos espaciar las subidas más de 15 segundos.
- Se enviará el valor al field1.
ESP8266_lib.ino |
// Juan Antonio Villalpando
// kio4.com
// Sube un número aleatorio mediante librería.
#include <ThingSpeak.h>
#include <ESP8266WiFi.h> // Para ESP8266
// #include <WiFi.h> // Para ESP32
const char* ssid = "Nombre_de_tu_red_WiFi";
const char* password = "Contraseña_WiFi";
WiFiClient client;
unsigned long Channel_ID = 703644;
const char * WriteAPIKey = "ABCDEFÑÑÑÑÑÑÑ";
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
ThingSpeak.begin(client);
// Conecta a la red wifi.
Serial.println();
Serial.print("Conectando con ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" Conectado con WiFi.");
}
void loop() {
delay(15000); // Deber ser 15 segundos o más.
int aleatorio = random(0,90);
// Enviamos aleatorio al field1.
int x = ThingSpeak.writeField(Channel_ID, 1, aleatorio, WriteAPIKey);
if(x == 200){
Serial.println("Valor subido correctamente: " + String(aleatorio));
}
else{
Serial.println("Este valor no ha subido: " + String(aleatorio));
}
}
|
___________________________________________
___________________________________________
___________________________________________
___________________________________________
4.- Obtener valores.
- Obtener el último valor subido:
https://api.thingspeak.com/channels/703644/fields/field1/last
- Obtener un archivo json con los valores:
https://api.thingspeak.com/channels/703644/feeds.json
- Obtener los 6 últimos resultados.
https://api.thingspeak.com/channels/703644/feeds.json?results=6
- Obtener un archivo json con los valores del field1:
https://api.thingspeak.com/channels/703644/fields/1.json
- También podemos bajarnos un archivo con los datos obtenidos pulsando en...

- Más información:
https://community.thingspeak.com/documentation%20.../api/
https://community.thinger.io/t/esp8266-analog-read/37
- Librería: https://github.com/mathworks/thingspeak-arduino/releases/tag/1.3.3
- En ThingSpeak. Subida cada 15 segundos.
https://blog.arduinoblocks.com/2019/02/publicar-y-almacenar-datos-en-internet.html
- Listado de recursos MQTT:
https://github.com/hobbyquaker/awesome-mqtt
_______________________________
|