Conexión de Componentes en ESP32


Aquí tienes un ejemplo de código unificado para un ESP32 que integra las tres funcionalidades que mencionas: control de ventiladores mediante sensores BH1750 (simulando lectura de temperatura), control de una bomba (a través de un sensor de humedad del suelo) y movimiento de dos servomotores basado en un sensor de luz (BH1750).
Nota importante:
  • El sensor BH1750 sólo opera en dos direcciones (normalmente 0x23 y 0x5C). En este ejemplo se asume que dispones de tres sensores BH1750 (uno para cada función), asignando la dirección adicional 0x5D para el sensor de luz usado en los servos. En la práctica, para usar tres sensores necesitarás un multiplexor I²C o un sensor alternativo.
  • La conversión de lectura de luz a temperatura es simplemente simulada mediante la función readSimulatedTemperature(); para un diseño real deberás usar un sensor de temperatura adecuado.
Puedes copiar y ajustar este código según tus requerimientos:

Cpp


#include <BH1750.h>
#include <Wire.h>
#include <ESP32Servo.h>

// =========================
// PARTE 1: CONTROL DE VENTILADORES
// =========================
const int fan1Pin = 5;             // Pin para el ventilador 1
const int fan2Pin = 12;            // Pin para el ventilador 2
const float tempThreshold = 35.0;  // Umbral de "temperatura" (en °C, simulado)

// Direcciones I2C para sensores BH1750 de temperatura simulada
#define CRITICO_ADDR 0x23
#define AMBIENTE_ADDR 0x5C

BH1750 sensorCritico;    // Sensor para temperatura crítica
BH1750 sensorAmbiente;   // Sensor para temperatura ambiente

// Función para simular la conversión de lux a temperatura  
float readSimulatedTemperature(BH1750 &sensor) {
  float lux = sensor.readLightLevel();
  // Simulación: se mapea el rango de lux (0 a 1000) a un rango de temperatura (20 °C a 40 °C)
  long mappedValue = map((long)lux, 0, 1000, 20, 40);
  return (float)mappedValue;
}

// =========================
// PARTE 2: SENSOR DE HUMEDAD Y CONTROL DE BOMBA
// =========================
const int sensorHumedadPin = 36;  // Pin ADC para el sensor FC-28 (humedad del suelo)
const int relePin = 15;           // Pin para controlar el relé (bomba de agua)

// Umbrales para la humedad del suelo (ajusta según tus pruebas)
const int humedadSeco = 2000;     
const int humedadHumedo = 1000;    

// =========================
// PARTE 3: CONTROL DE SERVOMOTORES CON SENSOR DE LUZ
// =========================
// Nota: Se asume un tercer BH1750 con dirección 0x5D. En la práctica se requiere un multiplexor I2C o sensor alternativo.
#define LIGHT_ADDR 0x5D
BH1750 sensorLight;  // Sensor de luz para control de servos

Servo servo1;
Servo servo2;
const int servo1Pin = 13;  // Pin para Servo 1
const int servo2Pin = 26;  // Pin para Servo 2

// Posiciones de los servos y tiempos
const int posStop = 90;         // Posición de reposo
const int pos1Forward = 0;      // Servo1: posición "adelante"
const int pos1Backward = 180;   // Servo1: posición "atrás"
const int pos2Forward = 180;    // Servo2: posición "adelante" (invertido)
const int pos2Backward = 0;     // Servo2: posición "atrás" (invertido)
const int moveTime = 3000;      // Duración del movimiento (en ms)
const float lightThreshold = 50.0; // Umbral de luz (en lux) para cambiar de modo

// =========================
// SETUP
// =========================
void setup() {
  Serial.begin(115200);
  Wire.begin();

  // Inicializar sensores BH1750 para el control de ventiladores
  if (!sensorCritico.begin(CRITICO_ADDR)) {
    Serial.println("Error iniciando sensorCritico BH1750");
  }
  if (!sensorAmbiente.begin(AMBIENTE_ADDR)) {
    Serial.println("Error iniciando sensorAmbiente BH1750");
  }
  
  // Inicializar el sensor de luz para servos
  if (!sensorLight.begin(LIGHT_ADDR)) {
    Serial.println("Error iniciando sensorLight BH1750");
  }
  
  // Configurar pines de salida para ventiladores
  pinMode(fan1Pin, OUTPUT);
  pinMode(fan2Pin, OUTPUT);
  digitalWrite(fan1Pin, LOW);
  digitalWrite(fan2Pin, LOW);
  
  // Configurar pines para el sensor de humedad y el relé (bomba)
  pinMode(sensorHumedadPin, INPUT);
  pinMode(relePin, OUTPUT);
  digitalWrite(relePin, LOW);
  
  // Inicializar servos
  ESP32PWM::allocateTimer(0);
  ESP32PWM::allocateTimer(1);
  ESP32PWM::allocateTimer(2);
  ESP32PWM::allocateTimer(3);
  
  servo1.setPeriodHertz(50);
  servo1.attach(servo1Pin, 500, 2400);
  
  servo2.setPeriodHertz(50);
  servo2.attach(servo2Pin, 500, 2400);
  
  // Poner servos en posición de reposo
  servo1.write(posStop);
  servo2.write(posStop);
  
  Serial.println("Sistema unificado de control iniciado");
}

// =========================
// LOOP PRINCIPAL
// =========================
void loop() {
  // ----- Bloque 1: Control de Ventiladores (simulación de temperatura con BH1750) -----
  float tempCritica = readSimulatedTemperature(sensorCritico);
  float tempAmbiente = readSimulatedTemperature(sensorAmbiente);
  Serial.print("Temp Critica: ");
  Serial.print(tempCritica);
  Serial.print(" °C | Temp Ambiente: ");
  Serial.print(tempAmbiente);
  Serial.println(" °C");
  
  if (tempCritica > tempThreshold) {
    digitalWrite(fan1Pin, HIGH);
    digitalWrite(fan2Pin, HIGH);
    Serial.println("Temp critica alta - Ventiladores ENCENDIDOS");
  } else {
    digitalWrite(fan1Pin, LOW);
    digitalWrite(fan2Pin, LOW);
    Serial.println("Temp critica normal - Ventiladores APAGADOS");
  }
  
  delay(2000);
  
  // ----- Bloque 2: Control de Humedad y Bomba -----
  int lecturaHumedad = analogRead(sensorHumedadPin);
  Serial.print("Lectura de humedad: ");
  Serial.println(lecturaHumedad);
  
  if (lecturaHumedad > humedadSeco) {
    digitalWrite(relePin, HIGH);
    Serial.println("Suelo seco - Relé ACTIVADO (bomba encendida)");
  } 
  else if (lecturaHumedad < humedadHumedo) {
    digitalWrite(relePin, LOW);
    Serial.println("Suelo húmedo - Relé DESACTIVADO (bomba apagada)");
  }
  
  delay(2000);
  
  // ----- Bloque 3: Control de Servomotores basado en Sensor de Luz -----
  float lux = sensorLight.readLightLevel();
  Serial.print("Nivel de luz (servo): ");
  Serial.print(lux);
  Serial.println(" lx");
  
  if(lux > lightThreshold) {
    Serial.println("Modo con luz - Movimiento en Sentido A");
    servo1.write(pos1Forward);
    servo2.write(pos2Forward);
    delay(moveTime);
    stopServos();
  } 
  else {
    Serial.println("Modo sin luz - Movimiento en Sentido B");
    servo1.write(pos1Backward);
    servo2.write(pos2Backward);
    delay(moveTime);
    stopServos();
  }
  
  delay(1000); // Pausa breve antes de iniciar la siguiente iteración
}

// Función para detener los servos (posición de reposo)
void stopServos() {
  servo1.write(posStop);
  servo2.write(posStop);
  delay(100);
}

Este código integra en un solo sketch las tres tareas principales:
  • Control de ventiladores: Se leen dos sensores BH1750 para simular la temperatura. Si la “temperatura crítica” supera el umbral definido, se encienden dos ventiladores.
  • Control de bomba por humedad: Se realiza una lectura analógica del sensor de humedad del suelo y se activa o desactiva un relé (que puede accionar la bomba) según los umbrales definidos.
  • Control de servos mediante sensor de luz: Se emplea un tercer BH1750 para leer el nivel de luz y mover dos servos en función de esa lectura.
Si necesitas ajustar algún detalle, como los umbrales, pines o la conversión de luminosidad a temperatura, házmelo saber. ¿Te ayudo a integrar o modificar alguna parte en particular?
I2C address management
Modularize functionality
Clarify simulation function
Link code to schematic

U1
U4
U2
U3

Confident Blush Time Machine

Confident Blush Time Machine thumbnail