Sistema apertura de puerta con servomotor

Buenas chicos!
Tengo en mente crear un proyecto que se basa en la apertura de una puerta que se activa mediante una aplicación IOT.
Cuenta con un sensor de proximidad, cámara esp32, un módulo ttl (para configurar la cámara esp32) un relé, un botón, una cerradura de 12v (esta habría que cambiarla por un servomotor, ya os contaré más tarde mi idea), un zumbador, una breadboard, baterías de 12v, leds, resistencias y cables.

El funcionamiento es el siguiente: El sensor de proximidad al detectar presencia toma una foto con la cámara esp 32, pita el zumbador y envía una notificación al teléfono, donde se abre la aplicación IOT (Blynk en este caso). Mediante la app puedes decidir si abrir o cerrar la cerradura de 12v (Aqui mi idea es cambiar esta cerradura por un servomotor SG90 que gire 360 grados).
Es decir, con un botón en la app puedes abrir o cerrar la cerradura o, en mi caso, quiero girar el servomotor 360 grados y que se repita 2 veces al pulsar el botón. También al pulsar el botón, se debería abrir la cerradura, pero quiero que el servomotor gire 360 grados 2 veces pero al lado conntrario al que giraba mediante la app. Es decir, por ejemplo que al pulsar el boton en la app gire hacia la derecha y con el boton fisico gire hacia la izquierda.

OS dejo el diagrama y todo lo demás, porque mi explicación es bastante pobre. Agradecería mucho vuestra ayuda, ya que estoy perdido y soy bastante nuevo en esto de programar. Gracias de antemano!

CÓMO CONFIGURO LA ESP32:

DIAGRAMA:

CÓDIGO EMPLEADO:

#include "esp_camera.h"
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>

// Select camera model
#define CAMERA_MODEL_AI_THINKER // Has PSRAM

#include "camera_pins.h"

#define PHOTO 14
#define LED 4
#define LOCK 12
#define IN_BUTTON 15
#define IRSensor 2
#define BELL 13


const char* ssid = "SSID";       //wifi name
const char* password = "PASSWORD";       //password
char auth[] = "AUTH TOKEN";          //sent by Blynk

String local_IP;
int count = 0;
void startCameraServer();

void takePhoto()
{
  digitalWrite(LED, HIGH);
  delay(200);
  uint32_t randomNum = random(50000);
  Serial.println("http://"+local_IP+"/capture?_cb="+ (String)randomNum);
  Blynk.setProperty(V1, "urls", "http://"+local_IP+"/capture?_cb="+(String)randomNum);
  digitalWrite(LED, LOW);
  delay(1000);
}

void setup() {
  Serial.begin(115200);
  pinMode(LED,OUTPUT);
  pinMode(BELL,OUTPUT);
  pinMode(LOCK,OUTPUT);
  pinMode(IRSensor,INPUT);
  pinMode(IN_BUTTON,INPUT);
  digitalWrite(BELL,LOW);
  digitalWrite(LOCK,LOW);
  Serial.setDebugOutput(true);
  Serial.println();
  
  camera_config_t config;
  config.ledc_channel = LEDC_CHANNEL_0;
  config.ledc_timer = LEDC_TIMER_0;
  config.pin_d0 = Y2_GPIO_NUM;
  config.pin_d1 = Y3_GPIO_NUM;
  config.pin_d2 = Y4_GPIO_NUM;
  config.pin_d3 = Y5_GPIO_NUM;
  config.pin_d4 = Y6_GPIO_NUM;
  config.pin_d5 = Y7_GPIO_NUM;
  config.pin_d6 = Y8_GPIO_NUM;
  config.pin_d7 = Y9_GPIO_NUM;
  config.pin_xclk = XCLK_GPIO_NUM;
  config.pin_pclk = PCLK_GPIO_NUM;
  config.pin_vsync = VSYNC_GPIO_NUM;
  config.pin_href = HREF_GPIO_NUM;
  config.pin_sscb_sda = SIOD_GPIO_NUM;
  config.pin_sscb_scl = SIOC_GPIO_NUM;
  config.pin_pwdn = PWDN_GPIO_NUM;
  config.pin_reset = RESET_GPIO_NUM;
  config.xclk_freq_hz = 20000000;
  config.pixel_format = PIXFORMAT_JPEG;
  
  // if PSRAM IC present, init with UXGA resolution and higher JPEG quality
  //                      for larger pre-allocated frame buffer.
  if(psramFound()){
    config.frame_size = FRAMESIZE_UXGA;
    config.jpeg_quality = 10;
    config.fb_count = 2;
  } else {
    config.frame_size = FRAMESIZE_SVGA;
    config.jpeg_quality = 12;
    config.fb_count = 1;
  }

  // camera init
  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) {
    Serial.printf("Camera init failed with error 0x%x", err);
    return;
  }

  sensor_t * s = esp_camera_sensor_get();
  // initial sensors are flipped vertically and colors are a bit saturated
  if (s->id.PID == OV3660_PID) {
    s->set_vflip(s, 1); // flip it back
    s->set_brightness(s, 1); // up the brightness just a bit
    s->set_saturation(s, -2); // lower the saturation
  }
  // drop down frame size for higher initial frame rate
  s->set_framesize(s, FRAMESIZE_QVGA);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

  startCameraServer();

  Serial.print("Camera Ready! Use 'http://");
  Serial.print(WiFi.localIP());
  local_IP = WiFi.localIP().toString();
  Serial.println("' to connect");
  Blynk.begin(auth, ssid, password);
}

void loop() {
  // put your main code here, to run repeatedly:
  Blynk.run();
  if(digitalRead(PHOTO) == HIGH){
    takePhoto();
    }
  if(digitalRead(IN_BUTTON) == LOW){
    digitalWrite(LOCK,HIGH);
    delay(3000);
    digitalWrite(LOCK,LOW);
    }  
  if(digitalRead(LOCK) == HIGH){
    digitalWrite(LOCK,HIGH);
    delay(3000);
    digitalWrite(LOCK,LOW);
    }
  if(digitalRead(IRSensor) == LOW && count == 0){
    count = 1;
    digitalWrite(BELL,HIGH);
    delay(1000);
    digitalWrite(BELL,LOW);
    Blynk.notify("Someone Arrived");
    takePhoto();
    delay(3000);
    count = 0;
  }
  
}

VÍDEO DE YOUTUBE, DONDE SE EXPLICAN TODOS LOS PASOS:

Mi idea simplemente es cambiar la cerradura de 12v por un servomotor sg90. Al pulsar el botón en la aplicación blynk, en vez de que abra la cerradura quiero que gire 360 grados hacia la derecha 2 veces. Al pulsar el botón físico en vez de abrirla otra vez la cerradura que gire 360 grados el servomotor dos veces hacia la izquierda.

AGRADECERÍA ENORMEMENTE VUESTRA AYUDA. MUCHÍSIMAS GRACIAS Y ESPERO QUE ME HAYA EXPLICADO BIEN. SALUDOS INTERNAUTAS!

No uses breadboard a menos que sea algo para ver si funciona o no funciona. No dejes algo armado en un breadboard como trabajo permanenete. Siempre tendras malos contacos o fallas porque para eso es el breadboard, solo para pruebas, no para equipos terminados.
Es preferible que uses una placa de desarrollo con todas las pistas o islas correspondiente a posibles pines y unas las conexiones con cables soldados. En este foro yo lo he recomendado muchas veces. Busca Wire-wrampping.

Perdona pero en serio vas a manejar todo eso!!! Cámara, captura de snapshot, envio de notificaciones y no sabes cambiar un accionamiento SI/NO por un servo?
Intenta no copiar y pegar porque te llevará a situaciones como esta.

Busca en google Arduino Servo y con los ejemplos sabras como cambiar un simple digitalWrite(pin, HIGH o LOW) por un servo.write(posicion)

Moderador: No hace falta escribir con mayúsculas porque nos estasa gritando asi que edita tu comentario final.

EDITO:
Solo debes cambiar estos

  if(digitalRead(IN_BUTTON) == LOW){
    digitalWrite(LOCK,HIGH);
    delay(3000);
    digitalWrite(LOCK,LOW);
    }  
  if(digitalRead(LOCK) == HIGH){
    digitalWrite(LOCK,HIGH);
    delay(3000);
    digitalWrite(LOCK,LOW);
    }

por los comandos del servo que verás en cualquier tutorial de servo

Como dije busca Arduino Servo y resuelves tu problema pero usa esta tecnica con toda duda.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.