#include <LiquidCrystal_I2C.h>
#include "DHTesp.h"
#include <WiFi.h>
#include <PubSubClient.h>

// Sensor pins
int pinu = 5;
int pind = 19;
int pint = 18;
int pinc = 17;
int proximidad = 35;
int dhtpp = 23;
const float GAMMA = 0.7;
const float RL10 = 50;
void publicar();
void luminosidad();
void humedadytemp();
void proxi();
void nombre();

// Sensor objects
DHTesp dht;
LiquidCrystal_I2C lcd(0x27, 16, 2);
int s0,s1;

void setup_wifi();
void procesar_mensajes(char *topic, byte *mensaje, unsigned int
longitud);


// WiFi and MQTT settings
const char* ssid = "Wokwi-GUEST";
const char* password = ""; // contraseña
const char* broker = "broker.mqtt-dashboard.com"; // MQTT direccion broker 
int puerto = 1883; // MQTT broker port
const char* id_cliente = "maxolivares"; // idclient del mqtt
const char* topico1 = "hola"; // topico al que me estoy suscribiendo
const char* topico2 = "adios"; // topico al que publico

WiFiClient BoardESP32;
PubSubClient client_mqtt(BoardESP32);

//se conecta con el broker y a wifi
void setup_wifi() {
  delay(50);
  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 setup() {
  Serial.begin(115200);
  //inicializa sensor
  dht.setup(dhtpp, DHTesp::DHT22);
  setup_wifi();

  // 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...");
  }

  // 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);
  }

  // inicializa sensor de movimiento
  pinMode(proximidad, INPUT);


  // inicializa the LCD
  lcd.init();
  lcd.backlight();
}

void loop() {
  client_mqtt.loop();
  // mensajes del mqtt y llamadas a funciones
  if (s0 == 0 && s1 == 0) {
nombre();
} else if (s0 == 0 && s1 == 1) {
humedadytemp();
}  else if (s0 == 1 && s1 == 0) {
proxi();
}else if (s0 == 1 && s1 == 1) {
luminosidad();
}
}
void humedadytemp() {
TempAndHumidity data = dht.getTempAndHumidity();
  float humedad = data.humidity;
  float temperatura = data.temperature;
  Serial.println("Humedad: " + String(humedad) + "%");
  Serial.println("Temp: " + String(temperatura) + "°C");
  Serial.println("---");
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Humedad:"+ String(humedad));
  lcd.setCursor(0, 1);
  lcd.print("Temperatura: " +String(temperatura));
  

  delay(1000);
}
  void proxi() {
  int movimiento = digitalRead(proximidad);
  Serial.println("Presencia: " + String(movimiento, 1) + "!!!");
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Presencia: ");
  lcd.setCursor(0, 1);
  lcd.print(String(movimiento == 0 ? "Sin movimiento" : "Movimiento"));
  delay(1000);
  }

  void nombre() {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Nombre: Max");
  lcd.setCursor(0, 1);
  lcd.print("Mat: A01285066");
  delay(1000);
  }

void luminosidad() {
  float luxValue = sendSensor();
  Serial.println("Luminosidad: " + String(luxValue, 2));
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Luminosidad: "+String(luxValue));
  
  delay(3000);
  }


float sendSensor() {
  int analogValue = analogRead(36);
  float voltage = analogValue * 5 / 4095.0;
  float resistance = 2000 * voltage / (1 - voltage / 5);
  float lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
  return lux;
}

void publicar() {
  int EdoSensor = 23;
  char EdoSensorString[5];
  itoa(EdoSensor, EdoSensorString, 10);
  client_mqtt.publish(topico2, EdoSensorString);
}

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];
  }
  s0 = int(mensaje_local[0]) - 48;
  s1 = int(mensaje_local[1]) - 48;
  Serial.print("SW0=");
  Serial.print(s0);
  Serial.print(" SW1=");
  Serial.print(s1);
  Serial.println();

  Serial.println();
  int DatoRecibido = strtol(mensaje_local, 0, 10);
  Serial.print("Dato recibido tipo long: ");
  Serial.println(DatoRecibido);
}

$abcdeabcde151015202530354045505560fghijfghij
Loading
esp32-devkit-c-v4
lcd1:GND
lcd1:VCC
lcd1:SDA
lcd1:SCL
ldr1:VCC
ldr1:GND
ldr1:DO
ldr1:AO
pir1:VCC
pir1:OUT
pir1:GND
dht1:VCC
dht1:SDA
dht1:NC
dht1:GND
vcc1:VCC
r1:1
r1:2
r2:1
r2:2
r3:1
r3:2
r4:1
r4:2