// INCUDES DE LIBRERIAS
#include <TimeLib.h>
#include <Wire.h>
#include <WiFi.h>
#include <Adafruit_MQTT.h>
#include <Adafruit_MQTT_Client.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
// Configuracion Pantalla
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET 4
// Acceso API de Adafruit IO
#define AIO_SERVER "io.adafruit.com"
#define AIO_PORT 1883
#define AIO_USERNAME "felimuzi"
#define AIO_KEY "aio_fpKy52EFYl9l7DesoFjqdsh72ztm"
// Configuración de Wifi
const char* WIFI_SSID = "Wokwi-GUEST";
const char* WIFI_PASS = "";
//Configuración LDR
const float GAMMA = 0.7;
const float RL10 = 33;
float luxmed=0;
// Configuracion LED
const int pinLed=2;
// Crear un cliente WiFi para la conexión a Internet
WiFiClient client;
// Crear cliente MQTT por WiFi para la comunicación con cloud de Adafruit
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_PORT, AIO_USERNAME, AIO_KEY);
// Feeds de Adafruit IO
Adafruit_MQTT_Publish Lux = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME"/feeds/TP-WIFI: Iluminacion");
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire);
void setup() {
Serial.begin(9600);
Serial.println("TP 2 - Medición de iluminación");
// Pin del LED
pinMode(pinLed, OUTPUT);
// Inicialización pantalla
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("Error inicializacion pantalla SSD1306"));
for(;;);
}
// Inicia conexion a WiFi
Serial.println("Informacion - Conectando a WiFi...");
WiFi.begin("Wokwi-GUEST", "", 6);
while(WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println("");
Serial.println("Informacion - Conectado Wifi");
}
void loop() {
// LECTURAS DEL SENSOR
int analogValue = analogRead(34);
float voltage = analogValue / 4095. * 3.3;
float resistance = 2000 * voltage / (1 - voltage / 3.3);
float luxmed = round(pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA)));
digitalWrite(pinLed,HIGH);
// Mostrar datos en la pantalla
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE, 0);
display.setCursor(0, 0);
display.println("Iluminacion: ");
display.print(String(luxmed) +"Lux");
display.display();
delay(10);
// Conexion al servidor MQTT empleando una funcion
MQTT_connect();
// Publicacion de los valores
delay(1000);
if (Lux.publish(luxmed)){
Serial.println("Publicacion Lux: " + String(luxmed));
} else {
Serial.println("Fallo pubicacion de Lux.");
}
delay(3000);
}
// Funcion para conectar y reconectar al servidor MQTT
// Debe ser invocada en la funcion loop principal para realizar la conexion
void MQTT_connect() {
int8_t ret;
// Detener la función si ya estamos conectados.
if (mqtt.connected()) {
return;
}
Serial.print("Conectando MQTT... ");
uint8_t retries = 3;
while ((ret = mqtt.connect()) != 0) { // llamada devuelve 0 si conecta
Serial.println(mqtt.connectErrorString(ret));
Serial.println("Reintentar conexion MQTT en 10segs ...");
mqtt.disconnect();
delay(10000); // esperar 10 segundos
retries--;
if (retries == 0) {
// se pone fin y esperamos el reset
Serial.println("Advertencia - No se pudo conectar MQTT");
while (1);
}
}
Serial.println("Informacion - MQTT Conectado");
}