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!