5V
. The ESP32-CAM has onboard power regulation to manage power distribution between its components.IO0
, IO1/U0T
, IO3/U0R
, which are used for various control and communication functions. Pins IO0
is often used for boot mode selection during firmware upload, IO1/U0T
and IO3/U0R
are used for serial communication (UART).Image
U2
), we can outline its main components and interconnections. Here’s the diagram representation with text-based Mermaid syntax:Table
IC | Power Net | Net Voltage | Decoupling Capacitor | Cap Voltage Rating | Cap Value | Status |
---|---|---|---|---|---|---|
[ESP32-CAM1]( ESP32-CAM WiFi BT BLE) | +5V, +3V3 | 5V, 3.3V | None | None | None | [WARNING] No decoupling capacitors attached, [WARNING] No voltage or value stated |
U2: HC-SR501 | +5V | 5V | None | None | None | [WARNING] No decoupling capacitors attached, [WARNING] No voltage or value stated |
WiFi Camera with Motion Detection Reference Design
Controls
Properties
Availability & Pricing
Distributor | Qty 1 | |
---|---|---|
Digi-Key | $0.04–$36.00 | |
LCSC | $0.00–$0.03 |
Assets
id=WiFi Camera with Motion Detection-removebg-preview
Simulation
BluetoothSerial
para la comunicación.Explicación del CódigoCpp
#include // Crear una instancia para el puerto serie Bluetooth BluetoothSerial SerialBT; // Pines del ESP32 const int pinSensorLlama = 14; const int pinMotorA1 = 32; const int pinMotorA2 = 33; const int pinMotorB1 = 25; const int pinMotorB2 = 26; const int pinBombaAgua = 27; // Variables bool robotIniciado = false; bool fuegoDetectado = false; void setup() { // Iniciar comunicación serie para depuración Serial.begin(115200); // Iniciar comunicación Bluetooth SerialBT.begin("Robot_Bluetooth"); Serial.println("El Bluetooth se ha iniciado correctamente"); // Configurar pines de entrada y salida pinMode(pinSensorLlama, INPUT); pinMode(pinMotorA1, OUTPUT); pinMode(pinMotorA2, OUTPUT); pinMode(pinMotorB1, OUTPUT); pinMode(pinMotorB2, OUTPUT); pinMode(pinBombaAgua, OUTPUT); // Apagar motores y bomba inicialmente detenerMotores(); digitalWrite(pinBombaAgua, LOW); } void loop() { // Revisar si hay datos recibidos a través de Bluetooth if (SerialBT.available()) { char datoRecibido = SerialBT.read(); // Comandos de control para el robot if (datoRecibido == 'I') { robotIniciado = !robotIniciado; // Alternar el estado del robot SerialBT.println("Estado del robot: " + String(robotIniciado ? "Iniciado" : "Detenido")); } else if (robotIniciado) { controlarMotores(datoRecibido); } } // Detectar fuego fuegoDetectado = digitalRead(pinSensorLlama) == HIGH; // Accionar bomba de agua si se detecta fuego if (fuegoDetectado) { activarBombaAgua(); } else { detenerBombaAgua(); } } void controlarMotores(char comando) { switch (comando) { case 'A': // Adelante moverAdelante(); break; case 'R': // Retroceder moverAtras(); break; case 'I': // Izquierda girarIzquierda(); break; case 'D': // Derecha girarDerecha(); break; case 'S': // Stop detenerMotores(); break; } } void moverAdelante() { digitalWrite(pinMotorA1, HIGH); digitalWrite(pinMotorA2, LOW); digitalWrite(pinMotorB1, HIGH); digitalWrite(pinMotorB2, LOW); } void moverAtras() { digitalWrite(pinMotorA1, LOW); digitalWrite(pinMotorA2, HIGH); digitalWrite(pinMotorB1, LOW); digitalWrite(pinMotorB2, HIGH); } void girarIzquierda() { digitalWrite(pinMotorA1, LOW); digitalWrite(pinMotorA2, HIGH); digitalWrite(pinMotorB1, HIGH); digitalWrite(pinMotorB2, LOW); } void girarDerecha() { digitalWrite(pinMotorA1, HIGH); digitalWrite(pinMotorA2, LOW); digitalWrite(pinMotorB1, LOW); digitalWrite(pinMotorB2, HIGH); } void detenerMotores() { digitalWrite(pinMotorA1, LOW); digitalWrite(pinMotorA2, LOW); digitalWrite(pinMotorB1, LOW); digitalWrite(pinMotorB2, LOW); } void activarBombaAgua() { digitalWrite(pinBombaAgua, HIGH); } void detenerBombaAgua() { digitalWrite(pinBombaAgua, LOW); }
Serial Bluetooth Terminal
).Explicación del códigoCpp
#include #include #include #include #define TRIG_PIN 5 #define ECHO_PIN 18 #define MAX_DISTANCE 200 // Distancia máxima a medir (en cm) #define MOTOR1_PIN1 12 #define MOTOR1_PIN2 14 #define MOTOR2_PIN1 27 #define MOTOR2_PIN2 26 #define ENABLE_PIN 13 #define SERVO_PIN 23 #define RAIN_SENSOR_PIN 4 #define DHT_PIN 19 #define DHT_TYPE DHT11 BluetoothSerial SerialBT; Servo myservo; NewPing sonar(TRIG_PIN, ECHO_PIN, MAX_DISTANCE); DHT dht(DHT_PIN, DHT_TYPE); bool isRobotActive = false; int servoPos = 0; float rainThreshold = 300.0; // Ajusta el valor según el sensor void setup() { Serial.begin(115200); SerialBT.begin("ESP32_FoodRobot"); // Configura el nombre Bluetooth pinMode(MOTOR1_PIN1, OUTPUT); pinMode(MOTOR1_PIN2, OUTPUT); pinMode(MOTOR2_PIN1, OUTPUT); pinMode(MOTOR2_PIN2, OUTPUT); pinMode(ENABLE_PIN, OUTPUT); pinMode(RAIN_SENSOR_PIN, INPUT); myservo.attach(SERVO_PIN); dht.begin(); } void loop() { if (SerialBT.available()) { char command = SerialBT.read(); if (command == 'S') { // 'S' para Start isRobotActive = true; SerialBT.println("Robot iniciado"); } else if (command == 'P') { // 'P' para Parar isRobotActive = false; SerialBT.println("Robot detenido"); stopRobot(); } } if (isRobotActive) { checkForRain(); detectAndFeed(); avoidObstacles(); } } void checkForRain() { float rainValue = analogRead(RAIN_SENSOR_PIN); if (rainValue > rainThreshold) { SerialBT.println("Lluvia detectada. Moviendo el robot a cubierta."); moveToShelter(); } } void detectAndFeed() { float distance = sonar.ping_cm(); if (distance > 0 && distance < 50) { // Ajusta según preferencia SerialBT.println("Mascota detectada. Dispensando comida."); dispenseFood(); } } void avoidObstacles() { float distance = sonar.ping_cm(); if (distance > 0 && distance < 30) { // Ajusta según preferencia SerialBT.println("Obstáculo detectado. Esquivando."); maneuverAroundObstacle(); } } void moveToShelter() { digitalWrite(MOTOR1_PIN1, HIGH); digitalWrite(MOTOR1_PIN2, LOW); digitalWrite(MOTOR2_PIN1, HIGH); digitalWrite(MOTOR2_PIN2, LOW); delay(2000); // Ajusta el tiempo según la distancia a la cubierta stopRobot(); } void dispenseFood() { myservo.write(90); // Abrir paso de comida delay(2000); // Tiempo suficiente para dispensar comida myservo.write(0); // Cerrar paso de comida } void maneuverAroundObstacle() { // Ejemplo sencillo de maniobra de evasión digitalWrite(MOTOR1_PIN1, LOW); digitalWrite(MOTOR1_PIN2, HIGH); digitalWrite(MOTOR2_PIN1, HIGH); digitalWrite(MOTOR2_PIN2, LOW); delay(500); // Ajusta según sea necesario digitalWrite(MOTOR1_PIN1, HIGH); digitalWrite(MOTOR1_PIN2, LOW); digitalWrite(MOTOR2_PIN1, HIGH); digitalWrite(MOTOR2_PIN2, LOW); delay(1000); } void stopRobot() { digitalWrite(MOTOR1_PIN1, LOW); digitalWrite(MOTOR1_PIN2, LOW); digitalWrite(MOTOR2_PIN1, LOW); digitalWrite(MOTOR2_PIN2, LOW); }
setup()
.Explicación del código con variables en españolCpp
#include #include #include #include #define PIN_TRIG 5 #define PIN_ECHO 18 #define DISTANCIA_MAXIMA 200 // Distancia máxima a medir (en cm) #define MOTOR1_PIN1 12 #define MOTOR1_PIN2 14 #define MOTOR2_PIN1 27 #define MOTOR2_PIN2 26 #define PIN_HABILITAR 13 #define PIN_SERVO 23 #define PIN_SENSOR_LLUVIA 4 #define PIN_DHT 19 #define TIPO_DHT DHT11 BluetoothSerial SerialBT; Servo miServo; NewPing sonar(PIN_TRIG, PIN_ECHO, DISTANCIA_MAXIMA); DHT dht(PIN_DHT, TIPO_DHT); bool robotActivo = false; int posicionServo = 0; float umbralLluvia = 300.0; // Ajusta el valor según el sensor void setup() { Serial.begin(115200); SerialBT.begin("ESP32_RobotAlimentaMascotas"); // Configura el nombre Bluetooth pinMode(MOTOR1_PIN1, OUTPUT); pinMode(MOTOR1_PIN2, OUTPUT); pinMode(MOTOR2_PIN1, OUTPUT); pinMode(MOTOR2_PIN2, OUTPUT); pinMode(PIN_HABILITAR, OUTPUT); pinMode(PIN_SENSOR_LLUVIA, INPUT); miServo.attach(PIN_SERVO); dht.begin(); } void loop() { if (SerialBT.available()) { char comando = SerialBT.read(); if (comando == 'I') { // 'I' para Iniciar robotActivo = true; SerialBT.println("Robot iniciado"); } else if (comando == 'P') { // 'P' para Parar robotActivo = false; SerialBT.println("Robot detenido"); detenerRobot(); } } if (robotActivo) { verificarLluvia(); detectarYAlimentar(); evitarObstaculos(); } } void verificarLluvia() { float valorLluvia = analogRead(PIN_SENSOR_LLUVIA); if (valorLluvia > umbralLluvia) { SerialBT.println("Lluvia detectada. Moviendo el robot a cubierta."); moverAlRefugio(); } } void detectarYAlimentar() { float distancia = sonar.ping_cm(); if (distancia > 0 && distancia < 50) { // Ajusta según preferencia SerialBT.println("Mascota detectada. Dispensando comida."); dispensarComida(); } } void evitarObstaculos() { float distancia = sonar.ping_cm(); if (distancia > 0 && distancia < 30) { // Ajusta según preferencia SerialBT.println("Obstáculo detectado. Esquivando."); maniobrarAlrededorDelObstaculo(); } } void moverAlRefugio() { digitalWrite(MOTOR1_PIN1, HIGH); digitalWrite(MOTOR1_PIN2, LOW); digitalWrite(MOTOR2_PIN1, HIGH); digitalWrite(MOTOR2_PIN2, LOW); delay(2000); // Ajusta el tiempo según la distancia a la cubierta detenerRobot(); } void dispensarComida() { miServo.write(90); // Abrir paso de comida delay(2000); // Tiempo suficiente para dispensar comida miServo.write(0); // Cerrar paso de comida } void maniobrarAlrededorDelObstaculo() { // Ejemplo sencillo de maniobra de evasión digitalWrite(MOTOR1_PIN1, LOW); digitalWrite(MOTOR1_PIN2, HIGH); digitalWrite(MOTOR2_PIN1, HIGH); digitalWrite(MOTOR2_PIN2, LOW); delay(500); // Ajusta según sea necesario digitalWrite(MOTOR1_PIN1, HIGH); digitalWrite(MOTOR1_PIN2, LOW); digitalWrite(MOTOR2_PIN1, HIGH); digitalWrite(MOTOR2_PIN2, LOW); delay(1000); } void detenerRobot() { digitalWrite(MOTOR1_PIN1, LOW); digitalWrite(MOTOR1_PIN2, LOW); digitalWrite(MOTOR2_PIN1, LOW); digitalWrite(MOTOR2_PIN2, LOW); }
setup()
.Image
Conexiones 1. Conexiones del Sensor Ultrasónico (HC-SR04)Cpp
#include #include #include #include #define PIN_TRIG 5 #define PIN_ECHO 18 #define DISTANCIA_MAXIMA 200 // Distancia máxima a medir (en cm) #define MOTOR1_PIN1 12 #define MOTOR1_PIN2 14 #define MOTOR2_PIN1 27 #define MOTOR2_PIN2 26 #define PIN_HABILITAR 13 #define PIN_SERVO 23 #define PIN_DHT 19 #define TIPO_DHT DHT11 BluetoothSerial SerialBT; Servo miServo; NewPing sonar(PIN_TRIG, PIN_ECHO, DISTANCIA_MAXIMA); DHT dht(PIN_DHT, TIPO_DHT); bool robotActivo = false; float umbralHumedad = 80.0; // Ajusta el valor de umbral de humedad según el ambiente void setup() { Serial.begin(115200); SerialBT.begin("ESP32_RobotAlimentaMascotas"); // Configura el nombre Bluetooth pinMode(MOTOR1_PIN1, OUTPUT); pinMode(MOTOR1_PIN2, OUTPUT); pinMode(MOTOR2_PIN1, OUTPUT); pinMode(MOTOR2_PIN2, OUTPUT); pinMode(PIN_HABILITAR, OUTPUT); miServo.attach(PIN_SERVO); dht.begin(); } void loop() { if (SerialBT.available()) { char comando = SerialBT.read(); if (comando == 'I') { // 'I' para Iniciar robotActivo = true; SerialBT.println("Robot iniciado"); } else if (comando == 'P') { // 'P' para Parar robotActivo = false; SerialBT.println("Robot detenido"); detenerRobot(); } } if (robotActivo) { verificarLluvia(); detectarYAlimentar(); evitarObstaculos(); } } void verificarLluvia() { float humedad = dht.readHumidity(); if (isnan(humedad)) { Serial.println("Error leyendo del DHT11!"); return; } if (humedad > umbralHumedad) { SerialBT.println("Lluvia detectada. Moviendo el robot a cubierta."); moverAlRefugio(); } } void detectarYAlimentar() { float distancia = sonar.ping_cm(); if (distancia > 0 && distancia < 50) { // Ajusta según preferencia SerialBT.println("Mascota detectada. Dispensando comida."); dispensarComida(); } } void evitarObstaculos() { float distancia = sonar.ping_cm(); if (distancia > 0 && distancia < 30) { // Ajusta según preferencia SerialBT.println("Obstáculo detectado. Esquivando."); maniobrarAlrededorDelObstaculo(); } } void moverAlRefugio() { digitalWrite(MOTOR1_PIN1, HIGH); digitalWrite(MOTOR1_PIN2, LOW); digitalWrite(MOTOR2_PIN1, HIGH); digitalWrite(MOTOR2_PIN2, LOW); delay(2000); // Ajusta el tiempo según la distancia a la cubierta detenerRobot(); } void dispensarComida() { miServo.write(90); // Abrir paso de comida delay(2000); // Tiempo suficiente para dispensar comida miServo.write(0); // Cerrar paso de comida } void maniobrarAlrededorDelObstaculo() { // Ejemplo sencillo de maniobra de evasión digitalWrite(MOTOR1_PIN1, LOW); digitalWrite(MOTOR1_PIN2, HIGH); digitalWrite(MOTOR2_PIN1, HIGH); digitalWrite(MOTOR2_PIN2, LOW); delay(500); // Ajusta según sea necesario digitalWrite(MOTOR1_PIN1, HIGH); digitalWrite(MOTOR1_PIN2, LOW); digitalWrite(MOTOR2_PIN1, HIGH); digitalWrite(MOTOR2_PIN2, LOW); delay(1000); } void detenerRobot() { digitalWrite(MOTOR1_PIN1, LOW); digitalWrite(MOTOR1_PIN2, LOW); digitalWrite(MOTOR2_PIN1, LOW); digitalWrite(MOTOR2_PIN2, LOW); }
Image
Explicación del Código:Cpp
#include #include #include #include #define DHTPIN 4 // Pin del sensor DHT11 #define DHTTYPE DHT11 // Tipo de sensor DHT #define ECHO_PIN 19 // Pin de echo del sensor ultrasónico #define TRIG_PIN 18 // Pin de trigger del sensor ultrasónico #define MOTOR_A1 25 // Pin 1 del motor A #define MOTOR_A2 26 // Pin 2 del motor A #define MOTOR_B1 27 // Pin 1 del motor B #define MOTOR_B2 14 // Pin 2 del motor B #define SERVO_PIN 13 // Pin del servomotor DHT dht(DHTPIN, DHTTYPE); BluetoothSerial SerialBT; Servo servoMotor; bool robotIniciado = false; float distanciaAnterior = 0; void setup() { Serial.begin(115200); SerialBT.begin("RobotMascota"); // Nombre Bluetooth Serial.println("El dispositivo BT está listo para emparejamiento"); pinMode(TRIG_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); pinMode(MOTOR_A1, OUTPUT); pinMode(MOTOR_A2, OUTPUT); pinMode(MOTOR_B1, OUTPUT); pinMode(MOTOR_B2, OUTPUT); servoMotor.attach(SERVO_PIN); dht.begin(); } void loop() { if (SerialBT.available()) { char comando = SerialBT.read(); if (comando == 'I') { // Inicializar robot robotIniciado = true; Serial.println("Robot Inicializado"); } } if (robotIniciado) { float humedad = dht.readHumidity(); float temperatura = dht.readTemperature(); if (humedad < 20) { // Activar servomotor para dispensar comida servoMotor.write(90); // Posición de apertura delay(2000); // Esperar 2 segundos servoMotor.write(0); // Posición de cierre } if (humedad > 70) { // Detecta lluvia y moverse a un lugar seco moverRobot(false, true); // Mover adelante hasta encontrar un lugar seco } // Evitar obstáculos float distancia = medirDistancia(); if ($$distancia < 30 $$ && $$distancia > 0$$ || distanciasCambiada(distancia)) { moverRobot(true, false); // Moverse hacia atrás delay(1000); moverRobot(false, false); // Girar a la derecha delay(1000); } else { moverRobot(false, true); // Moverse hacia adelante } } } bool distanciasCambiada(float nuevaDistancia) { bool cambiado = $$(abs(nuevaDistancia - distanciaAnterior) > 10$$); // Distancia ha cambiado significativamente distanciaAnterior = nuevaDistancia; return cambiado; } float medirDistancia() { digitalWrite(TRIG_PIN, LOW); delayMicroseconds(2); digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW); long duracion = pulseIn(ECHO_PIN, HIGH); float distancia = duracion * 0.034 / 2; return distancia; } void moverRobot(bool retroceder, bool avanzar) { if (retroceder) { digitalWrite(MOTOR_A1, LOW); digitalWrite(MOTOR_A2, HIGH); digitalWrite(MOTOR_B1, LOW); digitalWrite(MOTOR_B2, HIGH); } else if (avanzar) { digitalWrite(MOTOR_A1, HIGH); digitalWrite(MOTOR_A2, LOW); digitalWrite(MOTOR_B1, HIGH); digitalWrite(MOTOR_B2, LOW); } else { // Girar digitalWrite(MOTOR_A1, HIGH); digitalWrite(MOTOR_A2, LOW); digitalWrite(MOTOR_B1, LOW); digitalWrite(MOTOR_B2, HIGH); } }
moverRobot
: Controla los motores para moverse hacia adelante, atrás o girar.Descripción de Funcionalidades:Cpp
#include #include #include #include // Configuración del módulo Bluetooth BluetoothSerial SerialBT; // Pines del ESP32 const int pinUltrasonicoTrig = 32; const int pinUltrasonicoEcho = 33; const int pinDHT11 = 25; const int pinServo = 27; const int pinMotorIn1 = 26; const int pinMotorIn2 = 14; const int pinMotorEn = 12; // Configuración del sensor DHT11 DHT dht(pinDHT11, DHT11); // Configuración del servomotor y el sensor ultrasónico Servo servomotor; UltraSonicDistanceSensor sensorUltrasonico(pinUltrasonicoTrig, pinUltrasonicoEcho); // Variables de estado bool robotEncendido = false; int distanciaMascota; int distanciaObstaculo; float temperatura; float humedad; void setup() { Serial.begin(115200); SerialBT.begin("RobotAlimentador"); // Nombre del dispositivo Bluetooth Serial.println("El Bluetooth ha sido inicializado."); // Configuración de pines pinMode(pinMotorIn1, OUTPUT); pinMode(pinMotorIn2, OUTPUT); pinMode(pinMotorEn, OUTPUT); // Inicialización de componentes dht.begin(); servomotor.attach(pinServo); servomotor.write(0); // Posición cerrada del paso de comida } void loop() { if (SerialBT.available()) { char data = SerialBT.read(); if (data == '1') { robotEncendido = true; Serial.println("Robot Encendido."); } } if (robotEncendido) { // Leer sensores distanciaMascota = sensorUltrasonico.measureDistanceCm(); delay(50); // Pequeña pausa para evitar lecturas erróneas temperatura = dht.readTemperature(); humedad = dht.readHumidity(); // Detectar presencia de la mascota if (distanciaMascota < 50) { // Ajustar la distancia según sea necesario abrirComida(); } // Evitar obstáculos else if (distanciaMascota < 20) { // Ajustar la distancia según sea necesario detenerMotor(); // Lógica para esquivar obstáculos (girar o retroceder) } // Detectar lluvia if (humedad > 80) { // Ajustar el umbral de humedad según sea necesario moverRobotLugarSeguro(); } } } void abrirComida() { servomotor.write(90); // Abrir el paso de comida delay(5000); // Duración de la apertura (ajustar según sea necesario) servomotor.write(0); // Cerrar el paso de comida } void detenerMotor() { digitalWrite(pinMotorIn1, LOW); digitalWrite(pinMotorIn2, LOW); analogWrite(pinMotorEn, 0); } void moverRobotLugarSeguro() { // Lógica para mover el robot a un lugar seguro digitalWrite(pinMotorIn1, HIGH); digitalWrite(pinMotorIn2, LOW); analogWrite(pinMotorEn, 255); delay(2000); // Ajustar la duración del movimiento detenerMotor(); }
BluetoothSerial
para comunicarse con el ESP32 desde un dispositivo móvil. El botón virtual envía un '1' para inicializar el robot.pinMotorIn1
y pinMotorIn2
controlan la dirección del motor.pinMotorEn
controla la velocidad del motor.pinUltrasonicoTrig
y pinUltrasonicoEcho
.pinDHT11
.pinServo
.
vikasbind681
marcokozlova
copilot