Introducción
Este proyecto tiene como objetivo crear una base de datos de temperaturas en Google Sheets, para esto se va utilizar la placa de desarrollo ESP32 junto con el sensor LM35 para poder enviar las lecturas del sensor a la web y guardarlas en una hoja de cálculo.
Consideraciones teóricas
Sensor LM35
El LM35 es un sensor de temperatura, tiene un rango de medición que abarca desde -55 °C hasta 150 °C. La salida es lineal y cada grado Celsius equivale a 10 mV, por lo tanto: 1°C = 10 mV 2°C = 20 mV … 150°C = 1500 mV
Es decir, la salida del sensor es Vout =10mV/°C.
La siguiente imagen muestra los pines de conexión de este sensor.
Otra forma de ver la explicación anterior es: se está dividiendo el rango de 0 a 3.3V del ESP32 en 4096 partes (del 0 al 4095).
Otro aspecto relevante es que ESP32 divide el convertidor en 2 partes, ADC1_X y ADC2_X, cabe resaltar que ADC2 es usado por el controlador Wi-Fi de la placa, por tanto, solo se puede hacer uso de ADC2 cuando el controlador de Wi-Fi no se ha iniciado.
Arquitectura cliente-servidor
La arquitectura cliente-servidor es un modelo de diseño de software en el que las aplicaciones se dividen en dos componentes principales: clientes y servidores. Esta separación facilita la gestión de recursos y permite que ambos interactúen de manera eficiente. El cliente realiza solicitudes de servicios o datos, mientras que el servidor proporciona esos recursos. Este sistema se basa en una comunicación constante mediante protocolos de red, lo que permite un flujo de información bidireccional entre ambos.
El cliente es una aplicación informática o un ordenador que consume un servicio remoto en otro ordenador conocido como servidor, normalmente a través de una red de telecomunicaciones.
Un servidor es un conjunto de computadoras capaces de atender las peticiones de un cliente y devolverle una respuesta en concordancia, además, un servidor almacena y gestiona diversos recursos, que pueden incluir bases de datos, archivos y aplicaciones. La capacidad de procesamiento del servidor es crucial, ya que debe manejar múltiples peticiones simultáneamente y devolver respuestas de manera eficiente.
Una placa ESP32 se puede configurar en modo cliente para realizar solicitudes a un servidor que esté en la web, para esto se puede utilizar la biblioteca HttpClient del IDE de Arduino.
Protocolo HTTP
El Protocolo de Transferencia de Hipertexto (HTTP) es un protocolo de capa de aplicación para la transmisión de documentos, como HTML. Fue diseñado para la comunicación entre navegadores web y servidores web, pero también puede utilizarse para otros fines, como la comunicación máquina a máquina, el acceso a APIs, etc.
HTTP sigue un modelo clásico cliente-servidor: el cliente abre una conexión para realizar una solicitud y espera hasta recibir una respuesta del servidor. HTTP es un protocolo sin estado, lo que significa que el servidor no conserva datos de sesión entre dos solicitudes, aunque la posterior incorporación de cookies añade estado a algunas interacciones cliente-servidor.
Métodos de solicitud HTTP
HTTP define un conjunto de métodos de solicitud para indicar el propósito de la solicitud y qué se espera si esta se realiza correctamente. Aunque también pueden ser sustantivos, estos métodos de solicitud a veces se denominan verbos HTTP.
A continuación se describen los diferentes métodos HTTP.
- GET: El método GET solicita una representación de un recurso específico. Las peticiones que usan el método GET sólo deben recuperar datos.
- POST: El método POST se utiliza para enviar una entidad a un recurso en específico, causando a menudo un cambio en el estado o efectos secundarios en el servidor.
- PUT: El modo PUT reemplaza todas las representaciones actuales del recurso de destino de acuerdo con la petición enviada.
- DELETE: El método DELETE borra un recurso en específico.
La biblioteca Wi-Fi de Arduino
Esta biblioteca permite la conexión de red (local e Internet) mediante una placa de Arduino. Con esta biblioteca, se pueden instanciar servidores y clientes, y enviar y recibir paquetes UDP a través de WiFi. La placa de desarrollo puede conectarse a redes abiertas o cifradas (WEP, WPA). La dirección IP se puede asignar estáticamente o mediante DHCP.
La biblioteca HTTPClient de Arduino
Esta biblioteca permite realizar fácilmente solicitudes HTTP GET, POST y PUT desde Arduino a un servidor web.
JSON
JSON (JavaScript Object Notation) es un formato basado en texto para almacenar e intercambiar datos de una manera que es legible por humanos y analizable por máquina.
Ventajas:
- JSON es utilizado a menudo por los desarrolladores web para transferir datos entre un servidor y una aplicación web.
- La naturaleza independiente del lenguaje de JSON lo convierte en un formato ideal para intercambiar datos a través de diferentes lenguajes de programación y plataformas.
Apps Script
Google Apps Script es un lenguaje de programación basado en JavaScript que permite ampliar las funcionalidades de las aplicaciones de Google, entre ellas, Google Sheets.
Desarrollo del proyecto
Diagrama de conexiones
La siguiente imagen muestra el diagrama de conexiones necesario para la implementación de este proyecto.
La placa de desarrollo utilizada ESP tiene 38 pines en este caso.
Código de programación para la placa
El código de programación necesario para la placa ESP32 se puede observar a continuación.
#include <HTTPClient.h>
#include <WiFi.h>
#define adcVrefmV 3300.0
#define resolucionADC 4096.0 // entrada analógica = 12 bits = rango de lectura 0-4095.
#define LM35 36 // El pin GPIO36 (ADC1_0) del ESP32 está conectado al LM35
int lecturaAnalogica = 0;
const char* ssid = "SSID";
const char* password = "Contrasenia_SSID";
const char* serverName = "URL_Google_Sheets";
float milliVolts;
float tempC;
float tempF;
unsigned long timeRead = 0;
void setup() {
// put your setup code here, to run once:
initWifi(); // Inicialización de Wi-fi
Serial.begin(9600);
analogSetAttenuation(ADC_11db);// Se establece la atenuación del ADC a 11 dB (hasta una entrada de ~3,3 V)
}
void loop() {
// put your main code here, to run repeatedly:
if (millis() - timeRead > 2000) { // millis devuelve el número de milisegundos transcurridos desde que la placa Arduino comenzó a ejecutar el programa actual
lecturaAnalogica = analogRead(LM35);
milliVolts = lecturaAnalogica * (adcVrefmV / resolucionADC);
tempC = milliVolts / 10;
tempF = tempC * 9 / 5 + 32;
Serial.print("Temperatura - ");
Serial.print(tempC);
Serial.write("\xC2\xB0"); // Simbolo de grado
Serial.println("C");
Serial.print(" - ");
Serial.print(tempF);
Serial.println("\xC2\xB0"); // Simbolo de grado
Serial.println("F");
enviarAGoogleSheets();
timeRead = millis();
}
}
void initWifi() {
Serial.print("Conectando a: ");
Serial.print(ssid);
WiFi.begin(ssid, password); // Inicializa la configuración de red
int timeout = 10 * 4; // Se configura un tiempo de 10 segundos de conexión
while (WiFi.status() != WL_CONNECTED && (timeout-- > 0)) {
delay(250); // 250 milisegundos; 1 segundo = 1000 ms // se necesita un total de 40 iteraciones de este ciclo while para esperar la conexión Wi-Fi
Serial.print(".");
}
Serial.println("");
if (WiFi.status() != WL_CONNECTED) { // Si después de los 10 segundos no se realiza la conexión
Serial.println("Ha fallado la conexión al Wi-Fi"); // entonces se muestra un mensaje de fallo
}
Serial.print("WiFi conectado a la siguiente dirección IP: ");
Serial.println(WiFi.localIP()); // se muestra la IP que tiene la placa ESP32
}
void enviarAGoogleSheets() {
if (WiFi.status() == WL_CONNECTED) { // Si la conexión Wi-Fi se realizó correctamente
HTTPClient http;
http.begin(serverName); // Analiza una url a la cual se debe conectar
http.addHeader("Content-Type", "application/json"); // Se agrega una cabecera para compartir información adicional entre el cliente y el servidor, en este caso se indica que se va enviar información en formato JSON
String jsonData = "{\"tempC\":\"" + String(tempC) + "\", \"tempF\":\"" + String(tempF) + "\"}"; // Cadena JSON a enviar al servidor
int httpResponseCode = http.POST(jsonData); // Envía una solicitud de tipo POST (realiza modificaciones en un recurso) al servidor (Proyecto de Google Sheets)
if (httpResponseCode > 0) {
String response = http.getString(); // Se obtiene el conjunto de los datos transmitidos útiles (excluyendo otros datos o metadatos que son enviados para facilitar la entrega del mensaje) em forma de cadena
Serial.println(httpResponseCode);
Serial.println(response); // Se imprime el conjunto de los datos transmitidos útiles (respuesta del servidor)
} else {
Serial.print("Wrong request POST: ");
Serial.println(httpResponseCode);
}
http.end(); // Cuando el conjunto de los datos transmitidos útiles (carga útil) se ha obtenido, entonces esta función se debe llamar.
}
}

0 comments:
Publicar un comentario