Buenos días, este es mi primer post. Leí las normas y espero no estar infringiendo ninguna al escribir esto. Llegado el caso ruego la/s señalen.
Decidí abrir un hilo después de buscar largo y tendido en Google, foros, etc., y probar posibles soluciones sin llegar a buen puerto. Estoy teniendo un problema de ruido al accionar un modulo de 2 relays con un Arduino Mega.
Contexto:
El proyecto en cuestión consiste en el automatismo de un proceso de llenado y calentamiento de agua dentro de un tanque de acero inoxidable, durante un tiempo dado. Los elementos principales de este proyecto son:
- Arduino Mega 2560
- Encoder rotativo KY-040
- Display OLED 1.3" 128x64 SH1106
- Modulo de 2 Relay
- Sensor de temperatura ds18b20 sumergible
- Sensor de nivel digital de acero inoxidable(básicamente un flotante como el de la mochila del inodoro)
- Resistencia calentadora de mesa(se consigue en cualquier ferretería) de 700W
- Bomba de acuario
El funcionamiento es sencillo. Se usa el encoder con interrupciones externas(LOW para la rotación y RISING para el pulsador) para navegar e interactuar con un menú mostrado en el display(ver este video). En una de las opciones de ese menú se define la temperatura que se precisa alcanzar, en otra se define durante cuanto tiempo el proceso va a estar corriendo, y finalmente con otra opción se da comienzo al proceso. Durante el tiempo definido el sistema mide la temperatura y el nivel de agua. Si la temperatura baja del valor seteado, se enciende la resistencia por medio de uno de los 2 relays del módulo, y se apaga cuando se alcanza el valor deseado. Si el tanque esta vacío o baja el nivel de agua, se acciona la bomba mediante el otro relay del módulo para llenarlo hasta que el sensor de nivel cambia de estado y la apaga.
Problema:
Todo anda perfecto con el sistema en vacío. El problema es cuando lo pruebo en carga. Al accionar un relay, el otro, o ambos con la resistencia y la bomba conectadas, aparentemente se filtra ruido al Arduino y el síntoma que se ve es que se "pulsa solo" el encoder. En realidad se dispara la interrupción asociada a él y me doy cuenta porque, por ejemplo, si estoy parado en una opción del menú, se mete en el submenú asociado sin que yo toque nada. O también si el display esta apagado(se apaga solo cada un minuto de inactividad), se prende automáticamente, cosa que debería ocurrir únicamente con una rotación o una pulsación. Pasa lo mismo también si conecto un ventilador en otro toma de la casa, al prenderlo o apagarlo el Arduino detecta un pulso del encoder. Digo síntoma porque no se en profundidad el alcance del problema.
Cuestiones técnicas que probé y/o tuve en cuenta:
El módulo de 2 relay incluye para cada relay su respectivo transistor con resistencia, un optoacoplador y un diodo flyback(ambos están probados y funcionan). Al módulo lo alimento con una fuente de 5V externa, distinta de la que alimenta al Arduino, y el conexionado esta hecho de forma que los optos trabajan. Adjunto imágenes con el datasheet y el conexionado.
Probé colocando capacitores cerámicos entre Vcc y las entradas IN1 e IN2 del módulo, de 11, 22, 33 y 100nf, así como entre GND y las entradas IN1 e IN2, y el problema persiste.
Incluí debounce tanto para la rotación como para la pulsación del encoder.
El encoder NO utiliza resistencias de pull-up(interna ni externa) ni de pull-down.
Para las conexiones entre el Arduino y el módulo NO estoy utilizando cables mallados ni trenzados.
La instalación eléctrica NO tiene descarga a tierra.
Ideas sobre como resolver este tema, o si a alguien ya le pasó y quiere compartir su experiencia, será bienvenido.
Desde ya, muchas gracias!