Problema entre funciones tone y pwm con display 16x2.

Hola como están?

Les cuento q estoy con un proyecto de un reloj digital con alarmas programables y algunos sensores, esta basado en el rtc dallas_3231.

-Acá les dejo un video para que lo vean funcionando:

-Tengo un display de 16x2 con una placa I2C, le saque el jumper que trae para habilitar el backlight y uno de los pines lo conecte al pin 11 del Arduino UNO R3 para poder usar pwm con la luz del backlight. Hasta aca todo funciona perfecto, como se ve en el video.

-En el pin 13 tengo un parlante de 8 Ohms 5w.

El problema que tengo es que cuando uso la función tone para reproducir un sonido me apaga el backlight.
Por lo que testie si el pin 11 esta por debajo de los 255 (pwm) es cuando falla, si lo dejo en 255 puede sonar sin problemas y no se apaga el display. También les cuento que debido a que tengo muchas cosas conectadas al Arduino UNO R3 agregue un transformador externo de 12v a la entrada del Arduino para ayudar a alimentar el sensor de ultrasonido, display, rtc, encoder, leds, etc debido a que tengo muchas cosas conectadas a la placa pero el problema persistió.

Les dejo el sketch limpio donde quite todo el código del reloj digital y deje solo includes, variables y función setup para que no tengan que leer las 990 lineas de código.

Ojala puedan ayudarme!

#include "Switch.h"
#include <Wire.h>
#include <RTC.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
#include "pitches.h" // incluimos el archivo pitches.h con las definiciones de las notas

int PIN_TONE       = 13;     //Defino el pin de salida para el parlante/buzzer
int pwmVar         = 255;   //PWM backlight
int BACKLIGHT_EPP  = 0;     //EEPROM address PWM BACKLIGHT
int BACKLIGHT_PIN  = 11;    //Pin LCD display
int tiempoDeSonado = 400;   //Esta variable sirve para calcular el tiempo que sonara la alarma hasta desactivarla automaticamente. 400=60 sec. / 200=20 sec. / 100=10 sec.
int tiempoOutMenu  = 150;   //Variable contador para q salga del menu cuando esta inactivo.
int CLOCK_ON_SOUND[] = {NOTE_B7,NOTE_CS8,NOTE_DS8}; // Sonido enciende reloj
int duracionNotas2[] = {12,12,12};

void setup(){
    Serial.begin(9600);
    while(!Serial);    
    lcd.init();
    // iniciamos el fondo retroiluninado para que me active el GND del led del backlight.
    lcd.backlight(); 
    pinMode(BACKLIGHT_PIN, OUTPUT); 
    //Si ya guarde en la eeprom el seteo de la luz de backlight lo cargo
    if(EEPROM.read(BACKLIGHT_EPP)>0){
       analogWrite(BACKLIGHT_PIN, EEPROM.read(BACKLIGHT_EPP));
       pwmVar = EEPROM.read(BACKLIGHT_EPP);
    }else{//sino
       analogWrite(BACKLIGHT_PIN, pwmVar);
    };  
    // CLOCK INIT SOUND
    for (int i = 0; i < 8; i++) {
        int duracionNota = 1000/duracionNotas2[i];
        tone(PIN_TONE, CLOCK_ON_SOUND[i], duracionNota);
        int pausaNota = duracionNota * 1.30;
        delay(pausaNota);
        noTone(PIN_TONE);
    }    
}

Hola, bienvenido al foro. Lee la documentación de tome(), aclara que interfiere con las señales PWM en los pines 3 y 11.

Después de buscar mas info encontré que lamentablemente para mi en la pagina de Arduino Reference/Tone dice lo siguiente:

https://www.arduino.cc/en/Reference/Tone
Use of the tone() function will interfere with PWM output on pins 3 and 11 (on boards other than the Mega).

Comprendo que esto sea un problema que Arduino no pudo solucionar, así que voy a modificar el cableado en mi protoboard para poder cambiar algún pin que no necesite pwm por alguno que no sea 3 y 11 ya que libres queda un solo pin digital.

Bueno quedara como data este post.

Saludos!

PeterKantTropus:
Hola, bienvenido al foro. Lee la documentación de tome(), aclara que interfiere con las señales PWM en los pines 3 y 11.

Hola gracias!!!

Si ahí justo estaba escribiendo un post refiriéndome a eso.

Saludos!

luquio2008:
https://www.arduino.cc/en/Reference/Tone
Use of the tone() function will interfere with PWM output on pins 3 and 11 (on boards other than the Mega).

Siempre que publiques un enlace o código usa tags. Asi debiste hacerlo
https://www.arduino.cc/en/Reference/Tone

también será apropiado que nos indiques que cosas tienes conectados a cada pin. Tal vez un esquema ayude. Y si tu código es largo, adjuntalo

surbyte:
Siempre que publiques un enlace o código usa tags. Asi debiste hacerlo
https://www.arduino.cc/en/Reference/Tone

también será apropiado que nos indiques que cosas tienes conectados a cada pin. Tal vez un esquema ayude. Y si tu código es largo, adjuntalo

Hola Surbyte.

Mala costumbre, soy programador web desde hace muchos años y generalmente existe una expresión regular en los foros que al postear un link reconoce automáticamente lo que comience como "http://" o "https://" o "www." y lo transforma a tag de enlace, es por eso que te pido disculpas si lo hice mal, así y todo si lees el primer post te podrás dar cuenta que hice uso del tag link. Igual ya se sabia de que estaba hablando ya que estaba respondiendo al post anterior pero lo tendré en cuenta para futuros posteos!

Respecto al diagrama, esta explicado en el primer post! El usuario PeterKantTropus respondió sin problemas a mi consulta ya que también me tome el tiempo de subir un link de un video donde mostraba que el funcionamiento del backlight del display lcd era correcto.

Te voy a ser sincero, como buena costumbre que tenemos los que programamos webs leí las reglas del foro pero no de punta a punta, no sabia que arduino.cc era tan estricto con esto de los tags, nuevamente disculpas por mi error.

Saludos!

luquio2008:
Hola Surbyte.

Mala costumbre, soy programador web desde hace muchos años y generalmente existe una expresión regular en los foros que al postear un link reconoce automáticamente lo que comience como "http://" o "https://" o "www." y lo transforma a tag de enlace, ...

Se entiende tu motivo, pero este soft parece que es más viejito. Jeje

Saludos!

Tienes 3 timers en el arduino de modo que hay 6 salidas PWM en un UNO/NANO/Micro PRO que son similares.
Como bien te han dicho TFT (yo lo llamo asi) si tuviste la mala elección de usar un pin comprometido con la función que usas. Asi que mejor cambia esto

int PIN_TONE       = 11;     //Defino el pin de salida para el parlante/buzzer
int pwmVar         = 255;   //PWM backlight
int BACKLIGHT_EPP  = 0;     //EEPROM address PWM BACKLIGHT
int BACKLIGHT_PIN  = 13;    //Pin LCD display

Ahora el PIN_TONE esta acorde con tu TIMER y el pin 13 no tendrá interferencias. Seguramente ya lo has hecho. Pero para el lector no tan atento, la aclaración sirve.

Hector_A:
Se entiende tu motivo, pero este soft parece que es más viejito. Jeje

Saludos!

No te creas, según como lo copies lo hace bien.