{"id":203,"date":"2025-10-31T20:00:13","date_gmt":"2025-10-31T23:00:13","guid":{"rendered":"https:\/\/bandmateproject.com\/?page_id=203"},"modified":"2025-11-07T23:01:32","modified_gmt":"2025-11-08T02:01:32","slug":"documentacion-tecnica","status":"publish","type":"page","link":"https:\/\/bandmateproject.com\/?page_id=203","title":{"rendered":"Documentaci\u00f3n T\u00e9cnica"},"content":{"rendered":"\n<p><em>Fecha: 14 de noviembre de 2025<\/em><\/p>\n\n\n\n<p>Este documento contiene la documentaci\u00f3n t\u00e9cnica para el proyecto STEAM del curso&nbsp;<strong>Laboratorio STEAM+<\/strong>&nbsp;de la tecnicatura&nbsp;<strong>Redes y Software<\/strong>&nbsp;del Instituto Tecnol\u00f3gico de Inform\u00e1tica de&nbsp;<strong>UTU<\/strong>&nbsp;a\u00f1o 2025.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Proyecto: Bandmate<\/h2>\n\n\n\n<p><strong>1.Integrantes <\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Hern\u00e1n Sierra<\/li>\n\n\n\n<li>Ra\u00fal Vidal<\/li>\n\n\n\n<li>Ezequiel Valiunas<\/li>\n\n\n\n<li>Tabar\u00e9 Maciel<\/li>\n<\/ul>\n\n\n\n<p><strong>2. Descripci\u00f3n<\/strong><\/p>\n\n\n\n<p>El Bandmate Project surge como una iniciativa interdisciplinaria que combina electr\u00f3nica, programaci\u00f3n y teor\u00eda musical con un objetivo claro: dise\u00f1ar un dispositivo inteligente de afinaci\u00f3n autom\u00e1tica para instrumentos musicales. El proyecto fue concebido por un equipo integrado por Ezequiel Valiunas, Hern\u00e1n Dar\u00edo Sierra, Tabar\u00e9 Maciel y Ra\u00fal Vidal, quienes aportan su conocimiento t\u00e9cnico y su pasi\u00f3n por la m\u00fasica al desarrollo de una herramienta innovadora.<\/p>\n\n\n\n<p><strong>3. Materiales<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"600\" height=\"600\" data-id=\"209\" src=\"https:\/\/bandmateproject.com\/wp-content\/uploads\/2025\/10\/Arduino_Uno_-_R3.jpg\" alt=\"\" class=\"wp-image-209\" style=\"width:416px;height:auto\" srcset=\"https:\/\/bandmateproject.com\/wp-content\/uploads\/2025\/10\/Arduino_Uno_-_R3.jpg 600w, https:\/\/bandmateproject.com\/wp-content\/uploads\/2025\/10\/Arduino_Uno_-_R3-300x300.jpg 300w, https:\/\/bandmateproject.com\/wp-content\/uploads\/2025\/10\/Arduino_Uno_-_R3-150x150.jpg 150w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"900\" height=\"900\" data-id=\"65\" src=\"https:\/\/bandmateproject.com\/wp-content\/uploads\/2025\/09\/s-l1200.jpg\" alt=\"\" class=\"wp-image-65\" style=\"width:331px;height:auto\" srcset=\"https:\/\/bandmateproject.com\/wp-content\/uploads\/2025\/09\/s-l1200.jpg 900w, https:\/\/bandmateproject.com\/wp-content\/uploads\/2025\/09\/s-l1200-300x300.jpg 300w, https:\/\/bandmateproject.com\/wp-content\/uploads\/2025\/09\/s-l1200-150x150.jpg 150w, https:\/\/bandmateproject.com\/wp-content\/uploads\/2025\/09\/s-l1200-768x768.jpg 768w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/figure>\n<\/figure>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"360\" height=\"207\" data-id=\"212\" src=\"https:\/\/bandmateproject.com\/wp-content\/uploads\/2025\/10\/img-0095.jpg\" alt=\"\" class=\"wp-image-212\" style=\"width:423px;height:auto\" srcset=\"https:\/\/bandmateproject.com\/wp-content\/uploads\/2025\/10\/img-0095.jpg 360w, https:\/\/bandmateproject.com\/wp-content\/uploads\/2025\/10\/img-0095-300x173.jpg 300w\" sizes=\"auto, (max-width: 360px) 100vw, 360px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"907\" height=\"907\" data-id=\"210\" src=\"https:\/\/bandmateproject.com\/wp-content\/uploads\/2025\/10\/CABLE-JUMPER-40-PINES.jpg\" alt=\"\" class=\"wp-image-210\" style=\"width:287px;height:auto\" srcset=\"https:\/\/bandmateproject.com\/wp-content\/uploads\/2025\/10\/CABLE-JUMPER-40-PINES.jpg 907w, https:\/\/bandmateproject.com\/wp-content\/uploads\/2025\/10\/CABLE-JUMPER-40-PINES-300x300.jpg 300w, https:\/\/bandmateproject.com\/wp-content\/uploads\/2025\/10\/CABLE-JUMPER-40-PINES-150x150.jpg 150w, https:\/\/bandmateproject.com\/wp-content\/uploads\/2025\/10\/CABLE-JUMPER-40-PINES-768x768.jpg 768w\" sizes=\"auto, (max-width: 907px) 100vw, 907px\" \/><\/figure>\n<\/figure>\n\n\n\n<p style=\"font-size:clamp(22.041px, 1.378rem + ((1vw - 3.2px) * 1.586), 36px);\"><\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"775\" height=\"578\" src=\"https:\/\/bandmateproject.com\/wp-content\/uploads\/2025\/09\/Screenshot-2025-09-29-194319.png\" alt=\"\" class=\"wp-image-110\" style=\"width:279px;height:auto\" srcset=\"https:\/\/bandmateproject.com\/wp-content\/uploads\/2025\/09\/Screenshot-2025-09-29-194319.png 775w, https:\/\/bandmateproject.com\/wp-content\/uploads\/2025\/09\/Screenshot-2025-09-29-194319-300x224.png 300w, https:\/\/bandmateproject.com\/wp-content\/uploads\/2025\/09\/Screenshot-2025-09-29-194319-768x573.png 768w\" sizes=\"auto, (max-width: 775px) 100vw, 775px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"225\" height=\"225\" src=\"https:\/\/bandmateproject.com\/wp-content\/uploads\/2025\/11\/descarga.jpeg\" alt=\"\" class=\"wp-image-227\" style=\"width:252px;height:auto\" srcset=\"https:\/\/bandmateproject.com\/wp-content\/uploads\/2025\/11\/descarga.jpeg 225w, https:\/\/bandmateproject.com\/wp-content\/uploads\/2025\/11\/descarga-150x150.jpeg 150w\" sizes=\"auto, (max-width: 225px) 100vw, 225px\" \/><\/figure>\n\n\n\n<p><strong>4 . Dise\u00f1o Mec\u00e1nico <\/strong><\/p>\n\n\n\n<p>Para lo que se refiere al dise\u00f1o mec\u00e1nico precisaremos una guitarra , tocar la nota seleccionada a trav\u00e9s de la botonera , para su mejor funcionamiento se recomienda no estar a mas de 30 cmm del m\u00f3dulo MAX9814 para su correcto funcionamiento. Aunque la mejor manera seria insertarlo dentro de la caja de resonancia de la guitarra para que no se obstruya con el sonido ambiente (aunque es susceptible al estar demasiado cerca de la fuente de sonido) <\/p>\n\n\n\n<p><strong>5. Dise\u00f1o Electr\u00f3nico<\/strong><\/p>\n\n\n\n<p>En lo que respecta al Dise\u00f1o Electr\u00f3nico utilizaremos un protoboard donde se interconectaran los diferentes m\u00f3dulos .<\/p>\n\n\n\n<p>Luego se conectan tanto el micr\u00f3fono MAX9814 y el m\u00f3dulo display el I2C al Arduino<\/p>\n\n\n\n<p><strong>Conexi\u00f3n de los pines tanto al arduino como al protoboard <\/strong><\/p>\n\n\n\n<p> El  m\u00f3dulo display el I2C al arduino  va conectado de la siguiente manera<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>LCD I2C<\/strong><\/td><td><strong>Arduino UNO<\/strong><\/td><\/tr><tr><td>VCC<\/td><td>5V Alimentaci\u00f3n <\/td><\/tr><tr><td>GND<\/td><td>GND Tierra com\u00fan <\/td><\/tr><tr><td>SDA<\/td><td>A4 Datos I2C<\/td><\/tr><tr><td>SLC<\/td><td>A5 Reloj I2C<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Para el Micr\u00f3fono debe quedar de la siguiente manera  <\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>M\u00f3dulo MAX9814<\/strong><\/td><td><strong>Arduino UNO<\/strong><\/td><\/tr><tr><td>OUT <\/td><td>A0 (entrada anal\u00f3gica)<\/td><\/tr><tr><td>VCC<\/td><td>5V<\/td><\/tr><tr><td>GND<\/td><td>GND<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Los Botones quedan conectados de la siguiente manera <\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Bot\u00f3n <\/strong><\/td><td><strong>Arduino UNO<\/strong><\/td><\/tr><tr><td>6\u00b0 Cuerda <\/td><td>PIN DIGITAL 1 <\/td><\/tr><tr><td>5\u00b0 Cuerda <\/td><td>PIN DIGITAL 2 <\/td><\/tr><tr><td>4\u00b0 Cuerda <\/td><td>PIN DIGITAL 3 <\/td><\/tr><tr><td>3\u00b0 Cuerda <\/td><td>PIN DIGITAL 4 <\/td><\/tr><tr><td>2\u00b0 Cuerda <\/td><td>PIN DIGITAL 5 <\/td><\/tr><tr><td>1\u00b0 Cuerda <\/td><td>PIN DIGITAL 6 <\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"801\" height=\"479\" src=\"https:\/\/bandmateproject.com\/wp-content\/uploads\/2025\/10\/Captura-de-pantalla-2025-10-17-201201.png\" alt=\"\" class=\"wp-image-177\" srcset=\"https:\/\/bandmateproject.com\/wp-content\/uploads\/2025\/10\/Captura-de-pantalla-2025-10-17-201201.png 801w, https:\/\/bandmateproject.com\/wp-content\/uploads\/2025\/10\/Captura-de-pantalla-2025-10-17-201201-300x179.png 300w, https:\/\/bandmateproject.com\/wp-content\/uploads\/2025\/10\/Captura-de-pantalla-2025-10-17-201201-768x459.png 768w\" sizes=\"auto, (max-width: 801px) 100vw, 801px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"472\" height=\"1024\" src=\"https:\/\/bandmateproject.com\/wp-content\/uploads\/2025\/10\/84e1683d-ab7b-47e6-90b6-abe9c24e655f-472x1024.jpg\" alt=\"\" class=\"wp-image-188\" srcset=\"https:\/\/bandmateproject.com\/wp-content\/uploads\/2025\/10\/84e1683d-ab7b-47e6-90b6-abe9c24e655f-472x1024.jpg 472w, https:\/\/bandmateproject.com\/wp-content\/uploads\/2025\/10\/84e1683d-ab7b-47e6-90b6-abe9c24e655f-138x300.jpg 138w, https:\/\/bandmateproject.com\/wp-content\/uploads\/2025\/10\/84e1683d-ab7b-47e6-90b6-abe9c24e655f-768x1666.jpg 768w, https:\/\/bandmateproject.com\/wp-content\/uploads\/2025\/10\/84e1683d-ab7b-47e6-90b6-abe9c24e655f-708x1536.jpg 708w, https:\/\/bandmateproject.com\/wp-content\/uploads\/2025\/10\/84e1683d-ab7b-47e6-90b6-abe9c24e655f.jpg 922w\" sizes=\"auto, (max-width: 472px) 100vw, 472px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"803\" height=\"492\" src=\"https:\/\/bandmateproject.com\/wp-content\/uploads\/2025\/11\/Captura-de-pantalla-2025-11-07-223033.png\" alt=\"\" class=\"wp-image-231\" srcset=\"https:\/\/bandmateproject.com\/wp-content\/uploads\/2025\/11\/Captura-de-pantalla-2025-11-07-223033.png 803w, https:\/\/bandmateproject.com\/wp-content\/uploads\/2025\/11\/Captura-de-pantalla-2025-11-07-223033-300x184.png 300w, https:\/\/bandmateproject.com\/wp-content\/uploads\/2025\/11\/Captura-de-pantalla-2025-11-07-223033-768x471.png 768w\" sizes=\"auto, (max-width: 803px) 100vw, 803px\" \/><\/figure>\n\n\n\n<p>En este caso del diagrama en Tinkercad en vez del sensor de movimiento infrarrojo seria el micr\u00f3fono MAX 9814<\/p>\n\n\n\n<p><strong>6. Software de Dise\u00f1o <\/strong><\/p>\n\n\n\n<p><strong>Medici\u00f3n de Frecuencia <\/strong><\/p>\n\n\n\n<p>para medir la frecuencia con el m\u00f3dulo MAX9814 se activa con mayor intensidad dependiendo de los hz que emite cada cuerda al ser golpeada generando as\u00ed el sonido. Calculando con FFT, que es un algoritmo eficiente que calcula la Transformada Discreta de Fourier<\/p>\n\n\n\n<p>A continuaci\u00f3n presentaremos el c\u00f3digo para el Arduino UNO para la programaci\u00f3n del prototipo.<\/p>\n\n\n\n<p>Con el fin de tener un c\u00f3digo mas limpio y organizado , decidimos tener el programa separado por funciones. Dividi\u00e9ndose as\u00ed en  8 capas :<\/p>\n\n\n\n<p><strong><em>Bandmate.ino <\/em><\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;Arduino.h>\n#include &lt;LiquidCrystal_I2C.h>\n#include \"config.h\"\n#include \"audio.h\"\n#include \"display.h\"\n\nLiquidCrystal_I2C lcd(0x27, 16, 2);\n\n\/\/ Pines de botones\n#define BUTTON_E6 2\n#define BUTTON_A5 3\n#define BUTTON_D4 4\n#define BUTTON_G3 5\n#define BUTTON_B2 6\n#define BUTTON_E1 7\n\nint selectedString = -1;\n\nvoid setup() {\n  Serial.begin(9600);\n\n  lcd.init();\n  lcd.backlight();\n  lcd.clear();\n  lcd.setCursor(0,0);\n  lcd.print(\"BandMate listo!\");\n  delay(1000);\n\n  audioSetup();\n\n  pinMode(BUTTON_E6, INPUT_PULLUP);\n  pinMode(BUTTON_A5, INPUT_PULLUP);\n  pinMode(BUTTON_D4, INPUT_PULLUP);\n  pinMode(BUTTON_G3, INPUT_PULLUP);\n  pinMode(BUTTON_B2, INPUT_PULLUP);\n  pinMode(BUTTON_E1, INPUT_PULLUP);\n}\n\nvoid loop() {\n  checkButtons();\n  processAudio();\n  displayUpdate(selectedString);\n  delay(50);\n}\n\n\/\/ Funci\u00f3n para leer botones y actualizar cuerda seleccionada\nvoid checkButtons() {\n  int previous = selectedString;\n\n  if (digitalRead(BUTTON_E6) == LOW) selectedString = 0;\n  else if (digitalRead(BUTTON_A5) == LOW) selectedString = 1;\n  else if (digitalRead(BUTTON_D4) == LOW) selectedString = 2;\n  else if (digitalRead(BUTTON_G3) == LOW) selectedString = 3;\n  else if (digitalRead(BUTTON_B2) == LOW) selectedString = 4;\n  else if (digitalRead(BUTTON_E1) == LOW) selectedString = 5;\n  else selectedString = -1;\n\n  \/\/ Mostrar mensaje temporal si cambi\u00f3 la selecci\u00f3n\n  if (selectedString != previous &amp;&amp; selectedString != -1) {\n    lcd.clear();\n    lcd.setCursor(0,0);\n    lcd.print(\"Afinar \");\n    lcd.print(getStringInfoByIndex(selectedString));\n    delay(1000); \/\/ 1 segundo de feedback\n  }\n}\n\n\/\/ Funci\u00f3n auxiliar para convertir \u00edndice a texto\nconst char* getStringInfoByIndex(int index) {\n  switch(index) {\n    case 0: return \"6ta cuerda\";\n    case 1: return \"5ta cuerda\";\n    case 2: return \"4ta cuerda\";\n    case 3: return \"3ra cuerda\";\n    case 4: return \"2da cuerda\";\n    case 5: return \"1ra cuerda\";\n    default: return \"Desconocida\";\n  }\n}\n<\/code><\/pre>\n\n\n\n<p><strong><em>audio.cpp<\/em><\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include \"audio.h\"\n#include &lt;arduinoFFT.h>\n#include &lt;LiquidCrystal_I2C.h>\n\nextern LiquidCrystal_I2C lcd;\n\ndouble vReal&#91;SAMPLES];\ndouble vImag&#91;SAMPLES];\n\nArduinoFFT&lt;double> FFT(vReal, vImag, SAMPLES, SAMPLING_FREQUENCY);\n\nvoid audioInit() {\n  pinMode(MIC_PIN, INPUT);\n  Serial.println(\"Micr\u00f3fono inicializado en pin A0\");\n}\n\nvoid audioSetup() {\n  audioInit();\n  Serial.println(\"Sistema de audio listo\");\n}\n\nvoid processAudio() {\n  captureFrequency(); \/\/ Solo captura frecuencia\n}\n\ndouble captureFrequency() {\n  for (int i = 0; i &lt; SAMPLES; i++) {\n    vReal&#91;i] = analogRead(MIC_PIN) - 512; \/\/ Centrar se\u00f1al\n    vImag&#91;i] = 0;\n  }\n\n  FFT.windowing(FFTWindow::Hamming, FFTDirection::Forward);\n  FFT.compute(FFTDirection::Forward);\n  FFT.complexToMagnitude();\n\n  double peak = 0;\n  int index = 0;\n  for (int i = 1; i &lt; SAMPLES \/ 2; i++) {\n    if (vReal&#91;i] > peak) {\n      peak = vReal&#91;i];\n      index = i;\n    }\n  }\n\n  double freq = (index * ((double)SAMPLING_FREQUENCY \/ SAMPLES));\n\n  if (peak &lt; 5 || freq &lt; 60 || freq > 400) return 0;\n\n  return freq;\n}\n\nvoid testMicrophone() {\n  int reading = analogRead(MIC_PIN);\n  Serial.print(\"Current ADC: \");\n  Serial.print(reading);\n\n  lcd.clear();\n  lcd.setCursor(0, 0);\n  lcd.print(\"ADC Test:\");\n  lcd.setCursor(0, 1);\n  lcd.print(reading);\n\n  if (reading > 100) Serial.println(\" - Signal detected!\");\n  else Serial.println(\" - Low signal\");\n}\n\ndouble getAverageFrequency() {\n  \/\/ Promediar varias lecturas para estabilidad\n  double sum = 0;\n  int count = 5;\n  for(int i = 0; i &lt; count; i++) sum += captureFrequency();\n  return sum \/ count;\n}\n\n<\/code><\/pre>\n\n\n\n<p><strong><em>audio.h<\/em><\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#ifndef AUDIO_H\n#define AUDIO_H\n\n#include &lt;arduinoFFT.h>\n#include \"config.h\"\n\nextern double vReal&#91;SAMPLES];\nextern double vImag&#91;SAMPLES];\n\nvoid audioSetup();\nvoid processAudio();\ndouble captureFrequency();\nvoid testMicrophone();\ndouble getAverageFrequency();\n\n#endif\n\n<\/code><\/pre>\n\n\n\n<p><strong><em>config.h<\/em><\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#ifndef CONFIG_H\n#define CONFIG_H\n\n#include &lt;Arduino.h>\n\n\/\/ Pines y configuraci\u00f3n general\n#define MIC_PIN A0\n#define SAMPLES 128\n#define SAMPLING_FREQUENCY 6000  \/\/ Hz\n\n#endif\n\n<\/code><\/pre>\n\n\n\n<p><strong><em>display.cpp<\/em><\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include \"display.h\"\n#include \"audio.h\"\n#include \"notes.h\"\n#include &lt;Wire.h>\n#include &lt;LiquidCrystal_I2C.h>\n\nextern LiquidCrystal_I2C lcd;\n\nvoid displayNoteInfo(const char* note, double diff, double freq) {\n  lcd.clear();\n  lcd.setCursor(0, 0);\n\n  const char* stringInfo = getStringInfo(note);\n  lcd.print(stringInfo);\n  lcd.print(\"-\");\n  char noteName&#91;4];\n  strncpy(noteName, note, 2);\n  noteName&#91;2] = '\\0';\n  lcd.print(noteName);\n\n  lcd.setCursor(0, 1);\n  if (diff > 15) lcd.print(\">> MUY AGUDO\");\n  else if (diff &lt; -15) lcd.print(\">> MUY GRAVE\");\n  else if (diff > 5) lcd.print(\"> AGUDO\");\n  else if (diff &lt; -5) lcd.print(\"> GRAVE\");\n  else lcd.print(\"** AFINADO **\");\n}\n\nvoid displayWaiting() {\n  lcd.clear();\n  lcd.setCursor(0, 0);\n  lcd.print(\"Esperando nota...\");\n}\n\nconst char* getStringInfo(const char* note) {\n  if (strstr(note, \"E2\")) return \"6ta cuerda\";\n  if (strstr(note, \"A2\")) return \"5ta cuerda\";\n  if (strstr(note, \"D3\")) return \"4ta cuerda\";\n  if (strstr(note, \"G3\")) return \"3ra cuerda\";\n  if (strstr(note, \"B3\")) return \"2da cuerda\";\n  if (strstr(note, \"E4\")) return \"1ra cuerda\";\n  return \"Desconocida\";\n}\n\nint getStringIndex(const char* note) {\n  if (strstr(note, \"E2\")) return 0;\n  if (strstr(note, \"A2\")) return 1;\n  if (strstr(note, \"D3\")) return 2;\n  if (strstr(note, \"G3\")) return 3;\n  if (strstr(note, \"B3\")) return 4;\n  if (strstr(note, \"E4\")) return 5;\n  return -1;\n}\n\nvoid displayUpdate(int selectedString) {\n  double frequency = getAverageFrequency();\n\n  if (frequency > 0) {\n    NoteRef note = nearestNote(frequency);\n    double diff = centsDiff(frequency, note.freq);\n\n    if (selectedString != -1 &amp;&amp; getStringIndex(note.name) != selectedString) {\n      displayWaiting();\n      return;\n    }\n\n    displayNoteInfo(note.name, diff, frequency);\n  } else {\n    displayWaiting();\n  }\n}\n\n<\/code><\/pre>\n\n\n\n<p><strong><em>display.h <\/em><\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#ifndef DISPLAY_H\n#define DISPLAY_H\n\n#include &lt;LiquidCrystal_I2C.h>\n\nextern LiquidCrystal_I2C lcd;\n\nvoid displayUpdate(int selectedString);\nvoid displayNoteInfo(const char* note, double diff, double freq);\nvoid displayWaiting();\nconst char* getStringInfo(const char* note);\nint getStringIndex(const char* note);\n\n#endif\n\n<\/code><\/pre>\n\n\n\n<p><strong><em>notes.cpp<\/em><\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include \"notes.h\"\n#include &lt;math.h>\n\nNoteRef notes&#91;] = {\n  {\"E2-6ta\", 82.41}, {\"A2-5ta\", 110.00}, {\"D3-4ta\", 146.83},\n  {\"G3-3ra\", 196.00}, {\"B3-2da\", 246.94}, {\"E4-1ra\", 329.63}\n};\n\ndouble centsDiff(double f, double ref) {\n  if (f &lt;= 0 || ref &lt;= 0) return 0;\n  return 1200.0 * log(f \/ ref) \/ log(2.0);\n}\n\nNoteRef nearestNote(double f) {\n  NoteRef best = notes&#91;0];\n  double bestDiff = 1e9;\n  for (int i = 0; i &lt; 6; i++) {\n    double d = fabs(centsDiff(f, notes&#91;i].freq));\n    if (d &lt; bestDiff) { bestDiff = d; best = notes&#91;i]; }\n  }\n  return best;\n}\n\n<\/code><\/pre>\n\n\n\n<p><strong><em>notes.h <\/em><\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#ifndef NOTES_H\n#define NOTES_H\n\nstruct NoteRef {\n  const char* name;\n  double freq;\n};\n\nextern NoteRef notes&#91;6];\n\ndouble centsDiff(double f, double ref);\nNoteRef nearestNote(double f);\n\n#endif\n\n<\/code><\/pre>\n\n\n\n<p><strong>7. Referencias y recursos  <\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Herramienta para dise\u00f1o de circuitos Tinkercad <a href=\"https:\/\/www.tinkercad.com\/\">https:\/\/www.tinkercad.com\/<\/a><\/li>\n\n\n\n<li>Herramienta para generar el c\u00f3digo y librer\u00edas <a href=\"https:\/\/www.arduino.cc\/en\/software\/\">https:\/\/www.arduino.cc\/en\/software\/<\/a><\/li>\n\n\n\n<li>Para consulta de dudas y optimizaci\u00f3n del c\u00f3digo <a href=\"https:\/\/chatgpt.com\/\">https:\/\/chatgpt.com\/<\/a><\/li>\n<\/ul>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Fecha: 14 de noviembre de 2025 Este documento contiene la documentaci\u00f3n t\u00e9cnica para el proyecto STEAM del curso&nbsp;Laboratorio STEAM+&nbsp;de la tecnicatura&nbsp;Redes y Software&nbsp;del Instituto Tecnol\u00f3gico de Inform\u00e1tica de&nbsp;UTU&nbsp;a\u00f1o 2025. Proyecto: Bandmate 1.Integrantes 2. Descripci\u00f3n El Bandmate Project surge como una iniciativa interdisciplinaria que combina electr\u00f3nica, programaci\u00f3n y teor\u00eda musical con un objetivo claro: dise\u00f1ar un [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-container-style":"default","site-container-layout":"default","site-sidebar-layout":"default","disable-article-header":"default","disable-site-header":"default","disable-site-footer":"default","disable-content-area-spacing":"default","footnotes":""},"class_list":["post-203","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/bandmateproject.com\/index.php?rest_route=\/wp\/v2\/pages\/203","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bandmateproject.com\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/bandmateproject.com\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/bandmateproject.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bandmateproject.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=203"}],"version-history":[{"count":16,"href":"https:\/\/bandmateproject.com\/index.php?rest_route=\/wp\/v2\/pages\/203\/revisions"}],"predecessor-version":[{"id":232,"href":"https:\/\/bandmateproject.com\/index.php?rest_route=\/wp\/v2\/pages\/203\/revisions\/232"}],"wp:attachment":[{"href":"https:\/\/bandmateproject.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=203"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}