Hola buenas tardes de antemano muchas gracias por su atención (Advertencia de texto largo). Estoy realizando un prototipo de un guante para personas no videntes. Que en resumen tiene 2 modos de uso. El primero es la típica función del sensor ultrasónico y una bocina, si un objeto está dentro del rango del sensor (en este caso es de 70cm) se enciende la bocina generando ruido, y si el objeto sale del rango se apaga la bocina de forma inmediata. El segundo modo es similar con la diferencia que este indica de manera exacta la distancia en la que se encuentra el objeto del sensor mediante audios específicos almacenados en una memoria micro sd, este modo se activa mediante la pulsación de un pulsador. Mi problema radica en el momento que conecto mi circuito a mi pc, esta falla reproduciendo de manera desordenada todos los audios que indicaran la distancia (aun cuando no hay nada en el rango del sensor y no se está pulsado el pulsador) Y también el primer modo deja de funcionar. Me gustaría saber cuál es mi error y la manera de corregirlo.
Adjunto fotos del circuito y su diagrama de conexión y mi código
Componentes:
Arduino nano genérico (no original)
Módulo micro SD
Sensor ultra sónico
Bocina genérica de 3 w a 4 ohms
Capacitor electrolítico de 10uf a 200v
Una resistencia de 10k
Una resistencia de 100 ohm
Transistor NPN BC547 Bipolar
Pulsador de 4 pines PCB NA
Cables de jummper hechos con un cable ethernet utp
Nota: Decidí agregarle el transistor como amplificador, también adjunto diagrama el cual me base para hacerlo. Y mi versión de Arduino IDE es la 1.8.19
CODGIO:
#include <SD.h>
#include <SPI.h>
#include <SimpleSDAudio.h>
// Definición de pines
#define ECO_PIN 8 // Pin Eco del sensor ultrasónico
#define TRIGGER_PIN 7 // Pin Trigger del sensor ultrasónico
#define BOTON_PIN 2 // Pin para el botón
// Declaración de variables
const int DISTANCIA_MAXIMA = 300; // Distancia máxima para la reproducción de audio
int estadoBoton = 0; // Estado del botón
long duracion, distancia; // Variables para medir la distancia
void setup() {
Serial.begin(115200); // Inicialización del puerto serial
SdPlay.init(SSDA_MODE_HALFRATE | SSDA_MODE_MONO | SSDA_MODE_AUTOWORKER); // Inicialización de la librería SimpleSDAudio
pinMode(9, OUTPUT); // Pin 9 como salida para control de audio
pinMode(BOTON_PIN, INPUT); // Pin para el botón como entrada
pinMode(TRIGGER_PIN, OUTPUT); // Pin Trigger como salida para el sensor ultrasónico
pinMode(ECO_PIN, INPUT); // Pin Eco como entrada para el sensor ultrasónico
delay(500); // Retardo inicial
}
void loop() {
estadoBoton = digitalRead(BOTON_PIN); // Lectura del estado del botón
if (estadoBoton == LOW) {
calcularDistancia(); // Llama a la función para calcular la distancia
} else {
tonoContinuo(); // Llama a la función para reproducir tono continuo
}
}
void calcularDistancia() {
digitalWrite(TRIGGER_PIN, LOW); // Envía un pulso LOW al pin Trigger
delayMicroseconds(4); // Pequeño retardo
digitalWrite(TRIGGER_PIN, HIGH); // Envía un pulso HIGH al pin Trigger
delayMicroseconds(10); // Pulso de 10 microsegundos
digitalWrite(TRIGGER_PIN, LOW); // Apaga el pulso del pin Trigger
duracion = pulseIn(ECO_PIN, HIGH); // Mide la duración del eco en HIGH
distancia = (duracion * 0.0343) / 2; // Calcula la distancia en centímetros
Serial.println(distancia); // Imprime la distancia en el puerto serial
// Reproducción de audio basada en la distancia medida
if (distancia == 300) {
trescientos(); // Reproduce "300.wav"
cms(); // Reproduce "cms.wav"
} else if (distancia > 300) {
rango(); // Reproduce "rango.wav"
} else if (distancia >= 200) {
doscientos(); // Reproduce "200.wav"
if (distancia > 200) {
distancia -= 200;
reproducirDecenas(distancia); // Reproduce las decenas y unidades correspondientes
}
} else if (distancia >= 100) {
ciento(); // Reproduce "100.wav"
if (distancia == 100) {
cien(); // Reproduce "cien.wav"
} else {
distancia -= 100;
reproducirDecenas(distancia); // Reproduce las decenas y unidades correspondientes
}
} else {
reproducirDecenas(distancia); // Reproduce las decenas y unidades correspondientes
}
}
void reproducirDecenas(int distancia) {
if (distancia >= 90) { noventa(); y(); if (distancia == 90) { cms(); } else { distancia -= 90; reproducirUnidades(distancia); } }
else if (distancia >= 80) { ochenta(); y(); if (distancia == 80) { cms(); } else { distancia -= 80; reproducirUnidades(distancia); } }
else if (distancia >= 70) { setenta(); y(); if (distancia == 70) { cms(); } else { distancia -= 70; reproducirUnidades(distancia); } }
else if (distancia >= 60) { sesenta(); y(); if (distancia == 60) { cms(); } else { distancia -= 60; reproducirUnidades(distancia); } }
else if (distancia >= 50) { cincuenta(); y(); if (distancia == 50) { cms(); } else { distancia -= 50; reproducirUnidades(distancia); } }
else if (distancia >= 40) { cuarenta(); y(); if (distancia == 40) { cms(); } else { distancia -= 40; reproducirUnidades(distancia); } }
else if (distancia >= 30) { treinta(); y(); if (distancia == 30) { cms(); } else { distancia -= 30; reproducirUnidades(distancia); } }
else if (distancia >= 20) { distancia -= 20; veinti(); reproducirUnidades(distancia); }
else { reproducirUnidades(distancia); }
}
void reproducirUnidades(int distancia) {
switch (distancia) {
case 1: uno(); cms(); break;
case 2: dos(); cms(); break;
case 3: tres(); cms(); break;
case 4: cuatro(); cms(); break;
case 5: cinco(); cms(); break;
case 6: seis(); cms(); break;
case 7: siete(); cms(); break;
case 8: ocho(); cms(); break;
case 9: nueve(); cms(); break;
case 10: diez(); cms(); break;
case 11: once(); cms(); break;
case 12: doce(); cms(); break;
case 13: trece(); cms(); break;
case 14: catorce(); cms(); break;
case 15: quince(); cms(); break;
case 16: dieciseis(); cms(); break;
case 17: diecisiete(); cms(); break;
case 18: dieciocho(); cms(); break;
case 19: diecinueve(); cms(); break;
case 20: veinte(); cms(); break;
}
}
// Funciones de reproducción de audio
void reproducirAudio(const char* archivo) {
SdPlay.setFile(archivo); // Establece el archivo a reproducir
SdPlay.play(); // Reproduce el archivo
delay(500); // Pequeño retardo para evitar solapamientos de reproducción
}
// Funciones individuales para reproducir cada archivo de audio
void uno() { reproducirAudio("1.wav"); }
void dos() { reproducirAudio("2.wav"); }
void tres() { reproducirAudio("3.wav"); }
void cuatro() { reproducirAudio("4.wav"); }
void cinco() { reproducirAudio("5.wav"); }
void seis() { reproducirAudio("6.wav"); }
void siete() { reproducirAudio("7.wav"); }
void ocho() { reproducirAudio("8.wav"); }
void nueve() { reproducirAudio("9.wav"); }
void diez() { reproducirAudio("10.wav"); }
void once() { reproducirAudio("11.wav"); }
void doce() { reproducirAudio("12.wav"); }
void trece() { reproducirAudio("13.wav"); }
void catorce() { reproducirAudio("14.wav"); }
void quince() { reproducirAudio("15.wav"); }
void dieciseis() { reproducirAudio("16.wav"); }
void diecisiete() { reproducirAudio("17.wav"); }
void dieciocho() { reproducirAudio("18.wav"); }
void diecinueve() { reproducirAudio("19.wav"); }
void veinte() { reproducirAudio("20.wav"); }
void treinta() { reproducirAudio("30.wav"); }
void cuarenta() { reproducirAudio("40.wav"); }
void cincuenta() { reproducirAudio("50.wav"); }
void sesenta() { reproducirAudio("60.wav"); }
void setenta() { reproducirAudio("70.wav"); }
void ochenta() { reproducirAudio("80.wav"); }
void noventa() { reproducirAudio("90.wav"); }
void cien() { reproducirAudio("cien.wav"); }
void ciento() { reproducirAudio("cien.wav"); }
void doscientos() { reproducirAudio("200.wav"); }
void trescientos() { reproducirAudio("300.wav"); }
void cms() { reproducirAudio("cms.wav"); }
void veinti() { reproducirAudio("veinti.wav"); }
void y() { reproducirAudio("y.wav"); }
void rango() { reproducirAudio("rango.wav"); }
void tonoContinuo() {
long duration, distance; //Establecemos duration y distance como variables numéricas extensas
digitalWrite(TRIGGER_PIN, LOW); //Para tener un pulso limpio empezamos con 2 microsegundos en apagado
delay(2);
digitalWrite(TRIGGER_PIN, HIGH); //Mandamos un pulso de 5 microsegundos
delay(5);
digitalWrite(TRIGGER_PIN, LOW); //Apagamos
duration = pulseIn(ECO_PIN, HIGH); //Medimos el tiempo que la señal tarda en volver al sensor en microsegundos
distance = (duration/2)*0.0343; //La distancia es el tiempo por la velocidad del sonido (343 m/s = 0.0343 cm/microseg)
if (distance < 70) //Si la distancia es menor de un metro y medio
{ tone(9,500); //Suena el zumbador con una frecuencia de 1000Hz
delay(0.5); //durante 5 segundos
}
else //De lo contrario
{
noTone(9);//no suena
}
}
Título editado por moderador