Piano en ESP32
Ahora que ya sabemos usar el zumbador y el teclado matricial 4×4, ahora vamos a crear un piano en ESP32, seguiremos estos pasos:
- Al presionar una tecla numérica la vamos a almacenar.
- Al presionar una tecla letra vamos a convertir el string de los números almacenados en número y lo guardamos en un array.
- Al presionar la tecla * hacemos un ciclo con el total de números almacenados y emitimos un sonido desde el zumbador.
Requerimientos:
- ESP32.
- Zumbador.
- Teclado matricial de 4x4.
- Cables
Conexiones:
Teclado | ESP32 |
C4 | D15 |
C3 | D2 |
C2 | D4 |
C1 | D16 |
R4 | D17 |
R3 | D5 |
R2 | D18 |
R1 | D19 |
- Conectamos la tierra (GND) del ESP32 al cable negro del zumbador.
- Conectamos el pin D21 del ESP32 al cable rojo del zumbador.
Código de un Piano en ESP32
/* Piano en ESP32 */ // importa libreria Keypad #include <Keypad.h> // define numero de filas const uint8_t ROWS = 4; // define numero de columnas const uint8_t COLS = 4; // define la distribucion de teclas char keys[ROWS][COLS] = { { '1', '2', '3', 'A' }, { '4', '5', '6', 'B' }, { '7', '8', '9', 'C' }, { '*', '0', '#', 'D' } }; // pines correspondientes a las filas uint8_t colPins[COLS] = { 16, 4, 2, 15 }; // pines correspondientes a las columnas uint8_t rowPins[ROWS] = { 19, 18, 5, 17 }; // crea objeto con los prametros creados previamente Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS); //Declaramos el pin del zumbador int pinZumbador=21; //Inicializamos las variables de la salida pwm int canal=0, frec=2000, resolucion=8; //String que almacenara los numero ingresados y que despues seran convertidos a numero String numeroString=""; //Variable que almacena hasta 50 notas int notas[50]; //Contamos la cantidad de notas que se van ingresando int contNotas=0; void setup() { Serial.begin(115200); //Inicializamos la salida del pwm ledcSetup(canal,frec,resolucion); //Declaramos pin donde se conecta el zumbador ledcAttachPin(pinZumbador, 0); } void loop() { // obtiene tecla presionada y asigna a variable char key = keypad.getKey(); // comprueba que se haya presionado una tecla if (key) { //Si se preciona un numero if(key>='0' && key<='9'){ //Concatenamos el numero cada nuevo numero que se va ingresando numeroString=numeroString+key; //Emitimos un bip ledcWriteTone(canal, 1000); Serial.println(key); } //Si se preciona A B C D o # else if( key=='A' || key=='B' || key=='C' || key=='D' || key=='#' ){ //Convertimos el numero ingresado a un numero notas[contNotas]=numeroString.toInt(); //Borramos el contenido del numero string numeroString=""; //Emitimos el sonido de la nota almacenada ledcWriteTone(canal, notas[contNotas]); Serial.println(notas[contNotas]); //Incrementamos el contador de las notas contNotas++; } //Si se preciona el * else if(key=='*'){ //Creamos un ciclo de 0 hasta la cantidad de notas creadas for(int i=0;i<contNotas;i++){ //Emitimos el sonido de la nota del arreglo ledcWriteTone(canal, notas[i]); Serial.println(notas[i]); delay(1000); } } // envia a monitor serial la tecla presionada Serial.println(key); } else{ //Si no se preciona ningun tecla no emitimos ningun sonido ledcWriteTone(canal, 0); } delay(10); }
Código y diagrama: https://wokwi.com/projects/344586386216583764
🎦 Este curso: https://www.youtube.com/watch?v=VuJkqL2Ys3Y&list=PLCTD_CpMeEKTvjzabAvLGHakg-ql6t0q6&ab_channel=ProgramadorNovato
🎦 Curso de Arduino: https://www.youtube.com/watch?v=oGinJt9aALc&list=PLCTD_CpMeEKSqw3Nh7rA9aXUAzbPIPkdv&ab_channel=ProgramadorNovato
🎦 [CURSO] C++ DE 0 A HEROE: https://www.youtube.com/watch?v=APN8aCyPvww&list=PLCTD_CpMeEKTofxs7iottRxJ5YPM7BOc
Ave que vuela, a la cazuela.