Cargando...

IoT y Google Cloud Parte 1

Diseñar una arquitectura serverless es cada vez más importante para pensar en que nuestra solución tenga mayor estabilidad y adaptabilidad.

El concepto serverless es un modelo de ejecución en el que el proveedor en la nube (AWS, Azure o Google Cloud) es responsable de ejecutar un fragmento de código mediante la asignación dinámica de los recursos y cobrando solo por la cantidad de recursos utilizados para ejecutar el código. Este código, generalmente, se ejecuta dentro de contenedores sin estado que pueden ser activados por una variedad de eventos que incluyen solicitudes HTTP, eventos de base de datos, servicios de colas, trabajos cron, etc.

En los siguientes post, levantaré una aplicación que utilice esta arquitectura en Google Cloud. Mi objetivo es recopilar datos serializados por tiempo, que se almacenen en una base de datos, para que, al conseguir una gran cantidad pueda explotarlos y predecir el comportamiento de los mismos.

Para la recopilación de datos voy a crear un componente que lea la temperatura del lugar y cada 30 segundos lo reporte a una API.

El componente IoT

Voy a utilizar una placa ESP32 para poder aprovechar su integración WiFi nativa, y como mi intención es leer la temperatura, necesitaré un sensor, en este caso un LM35.

El LM35 tiene tres pines: voltaje, tierra y datos. Por lo que la conexión de los componentes será la siguiente:

Google Cloud IoT

Para codificar el componente, lo primero es conectarlo con mi red, así que incluiré las librerias necesarias determinaré la red y el password que quiero utilizar.

const char* ssid = "mired";
const char* password = "mi password"; void setup() { WiFi.disconnect(); WiFi.begin(ssid, password); Serial.println(); Serial.println("=============================="); Serial.println("-------- INICIANDO -----------"); Serial.print("Conectando wifi "); Serial.print(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("conectado!"); }

El sensor de temperatura regresa un valor que en sí no es una temperatura, sino un 'voltaje' que la representa, después de varias pruebas encuentro una constante que me permite convertir ese dato a la representación en Farenheits, y por ello debo convertirlo a Centígrados.

temperatura = (analogRead(34)/2.48)-32;

Ahora, como esa lectura depende de la alimentación que el sensor recibe, necesito asegurarme que la lectura sea correcta, ya que si hay una variación en la alimentación del componente obtendré una lectura muy baja o demasiado alta, así que lo mejor es obtener un promedio de muchas lecturas.

Como mi obetivo es reportar la temperatura cada 30 segundos, puedo hacer 60 repeticiones de lectura cada medio segundo y así obtener el promedio que quiero reportar.

int suma = 0;
int temperatura = 0;
for (int i = 0; i <= repeticiones; i++) {
	temperatura = (analogRead(34)/2.48)-32;
	suma += temperatura;
	Serial.print(".");
	delay(intervalo);
}
temperatura = suma/ repeticiones;
String salida = "Temperatura " + String(temperatura);
Serial.println(salida);
Google Cloud IoT

Así cada 30 segundos ya tengo la temperatura que puedo reportar, pero primero debo crear la API que me permita guardar el dato, lo que haré en una publicación posterior.