#include <Wire.h> // Para poder establecer la comunicación entre LCD y Micro
#include <LiquidCrystal_I2C.h> // Para comunicarnos con el protocolo I^2C
#include <DHT.h> // Librería del sensor para que la lectura de su información sea automáticamente transformada a decimal y para poderla usar de mejor manera.
#include <RTClib.h> // Librería para el módulo DS1307, el módulo de fecha y hora
#include <WiFi.h>
#include <PubSubClient.h>
#define movment 19 // Sensor de proximidad
#define DHTPIN 4 // Pin donde está conectado el DHT22
#define bit1 25 // definir los bits del switch
#define bit2 26
DHT dht(DHTPIN, DHT22); // Tenemos que poner el pin que vamos a usar y el modelo, en este caso el DHT22 pero también podría se el DHT11 que es un poco peor, tiene menor rango de tempreatura
LiquidCrystal_I2C lcd(0x27,16,2); // Asume dirección 0x27 para el módulo I2C del LCD
RTC_DS1307 rtc; // el objeto del módulo de fecha y hora
//NODEMMCU PUBLISHER
//SUSCRIPTOR.http://www.hivemq.com/demos/websocket-client/
void setup_wifi();
void procesar_mensajes(char *topic, byte *mensaje, unsigned int longitud);
void publicar();
WiFiClient BoardESP32;
PubSubClient client_mqtt(BoardESP32);
// WiFi network
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// MQTT Broker // IP Raspberry Pi// COMPUTADORA
const char *broker = "broker.mqtt-dashboard.com";
int puerto = 1883;
const char *id_cliente = "control_led_TuNombre";//Escribe tu nombre
//variables
const char *topico1 = "p1";
const char *topico2 = "p2";
long now = millis();
int currentState = 0; // Initial state is "00"
void nombreymatr(){
// Mandar señal en LCD
lcd.setCursor(2,0);
lcd.print("Marcos Dayan");
lcd.setCursor(3,1);
lcd.print("A01782876");
}
void setup() {
Serial.begin(115200);
lcd.init(); // INicializar la lcd
dht.begin(); // inicializar el sensor dht con su objeto
pinMode(movment, INPUT); // Declarar el pinmode del pin del sensor de movimiento
pinMode(bit1, INPUT);
pinMode(bit2, INPUT);
// inicializar el módulo de fecha y hora
if (!rtc.begin()) {
Serial.println("RTC no encontrado");
while (1);
}
if (!rtc.isrunning()) {
Serial.println("RTC no funciona!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
lcd.backlight();
lcd.setCursor(0,0);
lcd.clear();
setup_wifi();
nombreymatr();
delay(1000);
lcd.clear();
//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);
}
}
void ismoving(){
bool val = digitalRead(movment); // Lee el estado del sensor
if (val){
lcd.setCursor(0,0);
lcd.print("Hay Movimiento");
}
else{
lcd.setCursor(0,0);
lcd.print("Nada se mueve");
}
}
void tempyhum(){
float h = dht.readHumidity(); // se lee la humedad con el objeto en un float
float tc = dht.readTemperature(); // se lee la temperatura con el objeto en un float
float tf = dht.readTemperature(true); // se lee la humedad con el objeto en un float
// Mandar señal en LCD
lcd.setCursor(0,0);
lcd.print("Temp: ");
lcd.print(tc);
lcd.print(" C");
lcd.setCursor(0,1);
lcd.print("Hum: ");
lcd.print(h);
lcd.print(" %");
}
void fechahora() {
DateTime now = rtc.now();
// Mostrar la fecha
lcd.setCursor(0, 0);
lcd.print("Date: ");
if (now.day() < 10) lcd.print("0");
lcd.print(now.day(), DEC);
lcd.print('/');
if (now.month() < 10) lcd.print("0");
lcd.print(now.month(), DEC);
lcd.print('/');
lcd.print(now.year(), DEC);
// Mostrar la hora
lcd.setCursor(0, 1);
lcd.print("Time: ");
if (now.hour() < 10) lcd.print("0");
lcd.print(now.hour(), DEC);
lcd.print(':');
if (now.minute() < 10) lcd.print("0");
lcd.print(now.minute(), DEC);
lcd.print(':');
if (now.second() < 10) lcd.print("0");
lcd.print(now.second(), DEC);
}
void publicar()
{
const char* message = "hello world"; // Declare a constant string containing "hello world".
client_mqtt.publish(topico2, message);
}
void setup_wifi() {
delay(50);
// Connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected - ESP IP address: ");
Serial.println(WiFi.localIP());
}
void procesar_mensajes(char *topic, byte *mensaje, unsigned int longitud) {
char mensaje_local[3] = {0}; // Assuming messages are two characters long
if (longitud >= 2) {
mensaje_local[0] = mensaje[0];
mensaje_local[1] = mensaje[1];
}
Serial.print("Topic: ");
Serial.println(topic);
Serial.print("Mensaje recibido: ");
Serial.println(mensaje_local);
// Process the received message
currentState = atoi(mensaje_local);
Serial.print("Mensaje en código: ");
Serial.println(currentState);
}
void loop() {
publicar();
now = millis();
//Esta funcion se debe llamar para mantener activa la conexion con el broker
client_mqtt.loop();
lcd.setCursor(0, 0);
lcd.print("0.Name 1.Mov");
lcd.setCursor(0, 1);
lcd.print("2.Temp 3.Time");
delay(2000);
lcd.clear();
if (client_mqtt.connected()) {
client_mqtt.loop();
}
switch (currentState) {
case 0:
nombreymatr();
break;
case 1:
ismoving();
break;
case 10:
tempyhum();
// You can set a different message for this case if needed
break;
case 11:
fechahora();
// You can set a different message for this case if needed
break;
default:
// Handle unknown option
break;
}
delay(2000);
lcd.clear();
}