#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <RTClib.h>
#include <WiFi.h>
#include <PubSubClient.h>
//variables
#define DHTPIN 15 // Pin de datos del sensor DHT22
#define DHTTYPE DHT22 // Tipo de sensor DHT
//const int switch1 = 18;
//const int switch2 = 19;
const int pirPin = 2; // Pin de salida del sensor PIR
float temperatura;
float humedad;
DateTime now;
long now1 = millis();
int DatoRecibido;
//variables para el servidor MQTT
const char *topico1 = "Multiplexor"; //topico al que me suscribo
//coneccion a la red
const char* ssid = "Wokwi-GUEST";
const char* password = "";
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2); // Dirección I2C 0x27, Pantalla 16x2
RTC_DS1307 rtc;
// MQTT Broker // IP Raspberry Pi// COMPUTADORA
const char *broker = "broker.mqtt-dashboard.com";
int puerto = 1883;
const char *id_cliente = "Cliente_DoKyu";//Escribe tu nombre. #el identificador tiene que ser único
void setup_wifi();
void procesar_mensajes(char *topic, byte *mensaje, unsigned int longitud);
//void publicar();
//conexion a internet
WiFiClient BoardESP32;
PubSubClient client_mqtt(BoardESP32);
void setup() {
lcd.init();
lcd.backlight();
lcd.clear();
Serial.begin(115200);
setupWifi();
//Conexion al broker
client_mqtt.setServer(broker, puerto);
if (client_mqtt.connect(id_cliente)) {
Serial.println("Connected to MQTT Broker!");
}
else {
Serial.println("Connected to MQTT failed...");
}
if (client_mqtt.connect(id_cliente)) {
Serial.print("Conectado con broker ");
Serial.println(broker);
}
else {
Serial.print("No se pudo conectar con broker");
}
//Activar la rutina para recibir mensajes
client_mqtt.setCallback(procesar_mensajes);
//Suscribirse a un tópico
if (client_mqtt.subscribe(topico1)) {
Serial.printf("Suscrito a topico %s\n", topico1);
}
dht.begin();
pinMode(pirPin, INPUT);
//pinMode(switch1, INPUT);
//pinMode(switch2, INPUT);
if (!rtc.begin()) {
Serial.println("No se pudo encontrar el RTC");
while (1);
}
if (!rtc.isrunning()) {
Serial.println("El RTC no está funcionando, se establecerá la hora!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
}
void mostrarMensaje(String linea1, String linea2) {
lcd.clear();
lcd.setCursor(3, 0);
lcd.print(linea1);
lcd.setCursor(3, 1);
lcd.print(linea2);
}
bool detectarPresencia() {
return digitalRead(pirPin) == HIGH;
}
/*
void publicar()
{
int EdoSensor=23;
char EdoSensorString [5];
itoa(EdoSensor,EdoSensorString,10);
client_mqtt.publish(topico2, EdoSensorString);
}
*/
void setupWifi(){
Serial.begin(115200);
Serial.print("Connecting to WiFi");
//funcion wifi que se conecta a la red (inicializa la red)
WiFi.begin(ssid, password);
//condicion cuando se esta conectando
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.print(" Connected: ");
//extrae su ip
Serial.println(WiFi.localIP());
}
void loop() {
//int entradaA = digitalRead(switch1);
//int entradaB = digitalRead(switch2);
//Serial.print("Switch 1: "); Serial.println(switch1); Serial.print("Switch 2: "); Serial.println(switch2);
Serial.print("Canal Seleccionado: ");
Serial.printf("%02d\n", DatoRecibido);
if (DatoRecibido == 00){
//Mostrar matrícula y nombre centrado en la pantalla
mostrarMensaje("A01025119", "Do Kyu");
delay(1000);
}
else if (DatoRecibido == 01){
//Mostrar humedad y temperatura en la pantalla
humedad = dht.readHumidity();
temperatura = dht.readTemperature();
mostrarMensaje("H:" + String(humedad) + "%", "T:" + String(temperatura) + "C");
delay(1000);
}
else if (DatoRecibido == 10){
//Mostrar presencia en la pantalla
if (detectarPresencia()) {
mostrarMensaje("Presencia", "Detectada");
} else {
mostrarMensaje("Sin", "Presencia");
}
delay(1000);
}
else if (DatoRecibido == 11){
//Mostrar datos del sensor RTC
now = rtc.now();
mostrarMensaje("Fecha:", String(now.month()) + "/" + String(now.day()) + "/" + String(now.year()));
Serial.print("Fecha y hora: ");
Serial.print(now.day());
Serial.print('/');
Serial.print(now.month());
Serial.print('/');
Serial.print(now.year());
Serial.print(' ');
Serial.print(now.hour());
Serial.print(':');
Serial.print(now.minute());
Serial.print(':');
Serial.println(now.second());
delay(1000);
}
delay(3000);
//publicar();
now1 = millis();
//Esta funcion se debe llamar para mantener activa la conexion con el broker
client_mqtt.loop();
}
void procesar_mensajes(char *topic, byte *mensaje, unsigned int longitud) {
char mensaje_local[100] = {0};
Serial.print("Topic: ");
Serial.println(topic);
Serial.print("Mensaje recibido: ");
for (int i = 0; i < longitud; i++) {
Serial.write(mensaje[i]);
mensaje_local[i] = mensaje[i];
}
Serial.println();
DatoRecibido = strtol(mensaje_local,0 ,10);
}