Hola tengo un Arduino nano ESP32, despuÉs de hacer un deEp sleep no se inicializa el sensor infrarrojo,sabéis porque.
void setup() {
Serial.begin(9600);
// inicialización infrarrojo
//selecciona sensor de distancia
tcaselect(0);
Serial.println("VL53L0X test 1");
if (!sensor2.init()) {
Serial.println(("Error al iniciar VL53L0X"));
ESP.restart();
}
sensor2.setDistanceMode(VL53L1X::Short); // Preciso para cerca
sensor2.setMeasurementTimingBudget(20000); // Lecturas rápidas (cada ~20ms)
Serial.println("VL53L0X test 2");
tcaselect(1);
if (!sensor1.init()) {
Serial.println(("Error al iniciar VL53L0X"));
ESP.restart();
}
sensor1.setDistanceMode(VL53L1X::Short); // Preciso para cerca
sensor1.setMeasurementTimingBudget(20000); // Lecturas rápidas (cada ~20ms)
delay(500);
pinMode(interruptPin, INPUT_PULLUP); //RESISTENCIA INTERNA
pinMode(PinInterrupcion, INPUT_PULLUP);
esp_sleep_enable_ext0_wakeup(interruptPin, 1);
}
void MagneticReed(void) {
bool estadoPuertaActual = digitalRead(PinInterrupcion);
unsigned long tiempoActual = millis();
//Serial.println(estadoPuerta);
// Serial.println(estadoAnterior);
// Serial.println("finpuerta");
if (estadoPuertaActual != estadoAnterior) {
tiempoAnterior = millis();
estadoAnterior = estadoPuertaActual;
}
if (tiempoActual - tiempoAnterior > 200) { // rebotes
estadoPuerta = estadoPuertaActual;
if (estadoPuerta == 1 || (estadoPuerta == 0 && counter > 0)) {
//CODIGO
}
else {
esp_deep_sleep_start();
delay(1000);
}
}
Debo reconocer que jamás trabaje con ese sensor pero... ¿Te esta compilando ese ese código? No cargas ninguna librería, ni inicializas el sensor
la libreria esta cagada e inicializado el sensor
El código que adjuntaste no está completo.
Completa el código porque como te señalan los compañeros el código esta incompleto.
Yo tengo el sensor y no puedo probar tu código justamente por eso.
Algo más, estas usando un multiplexor I2C, si es así, agrega un esquema de como esta todo conectado.
Para mi te falta
#include <VL53L1X.h>
#include <esp_sleep.h>
y mucho mas código.
después del deepSleep no se inicializa el sensor
#include <esp_sleep.h>
#include <VL53L1X.h>
#define interruptPin GPIO_NUM_12
#define TCAADDR 0x70
const int PinInterrupcion = 2;
VL53L1X sensor1;
VL53L1X sensor2;
void tcaselect(uint8_t i) {
if (i > 7) return;
Wire.beginTransmission(TCAADDR);
Wire.write(1 << i);
Wire.endTransmission();
delay(10);
}
void todasTareas(void *parameter);
void MagneticReed(void);
RTC_DATA_ATTR int counter = 0;
int estadoPuerta = 0;
int estadoAnterior = 0; // Estado del pin en la lectura anterior
unsigned long tiempoAnterior = 0; // Tiempo de la última lectura
void setup() {
Serial.begin(9600);
// inicialización I2C
Wire.begin();
delay(500);
// inicialización infrarrojo
//selecciona sensor de distancia
tcaselect(0);
Serial.println("VL53L0X test 1");
if (!sensor2.init()) {
Serial.println(("Error al iniciar VL53L0X"));
ESP.restart();
}
sensor2.setDistanceMode(VL53L1X::Short); // Preciso para cerca
sensor2.setMeasurementTimingBudget(20000); // Lecturas rápidas (cada ~20ms)
Serial.println("VL53L0X test 2");
tcaselect(1);
if (!sensor1.init()) {
Serial.println(("Error al iniciar VL53L0X"));
ESP.restart();
}
sensor1.setDistanceMode(VL53L1X::Short); // Preciso para cerca
sensor1.setMeasurementTimingBudget(20000); // Lecturas rápidas (cada ~20ms)
delay(500);
//mode sleep
pinMode(interruptPin, INPUT_PULLUP); //RESISTENCIA INTERNA
pinMode(PinInterrupcion, INPUT_PULLUP);
esp_sleep_enable_ext0_wakeup(interruptPin, 1); // Habilitar interrupciones externas
// Crear tareas
xTaskCreatePinnedToCore(todasTareas, "TareasSecuenciales", 8192, NULL, 1, NULL, 1);
}
void loop() {}
void todasTareas(void *parameter) {
for (;;) {
MagneticReed(); // Siempre activo
if (estadoPuerta == 0 && counter > 0) {
// lee unos sensores
}
vTaskDelay(50 / portTICK_PERIOD_MS); // Delay de cada ciclo del loop
}
}
void MagneticReed(void) {
bool estadoPuertaActual = digitalRead(PinInterrupcion);
unsigned long tiempoActual = millis();
if (estadoPuertaActual != estadoAnterior) {
tiempoAnterior = millis();
estadoAnterior = estadoPuertaActual;
}
if (tiempoActual - tiempoAnterior > 200) { // rebotes
estadoPuerta = estadoPuertaActual;
if (estadoPuerta == 1 || (estadoPuerta == 0 && counter > 0)) {
// codigo
}
else {
esp_deep_sleep_start();
}
}
}
Yo probaría cerrar la comunicación con wire.end() y reinicializarla con Wire.begin()
he probado con wire.end y wire.begin y sigue sin funcionar. después del deep hago un escaneo del bus i2c y no encuentra nada. Y si cargo otra vez el programa o otro similar tampoco reconoce, solo lo hace si quito la alimentación. Sabéis porque o como hacer para quitar la alimentación y volvérsela a poner.
Consulta con la documentación del sensor y del arduino que corriente consume cada uno y cuanta corriente puede suministrar un pin y si están dentro del rango, conecta la alimentación del sensor a un pin.
Y si le haces un reset?
Debes usar el pin xshut (consulta la documentación).
laguma
June 14, 2025, 10:53am
12
la solución ha sido poner un mosfet para que quite la alimentación