ObjetivoControlar um modulo rele 16 canais com arduino atraves de interface em display de cristal liquido 16x2 via modulo I2C PCA9685Cada canal do rele pode ser usado para controlar carga em ate 240V / 10A. Como lampadas, pequenos motores e outros eletro-eletronicos.O que foi utilizadoModulo rele 16 canaisArduino UNO R3LCD shieldModulo I2C PCA9685 (nativamente um modulo para controle de servomotores)Fonte 12VJumpers O Modulo rele 16 canais >> Tensao de alimentacao: 12V; >> Possui regulador de tensao integrado 5V o que permite alimentar o arduino e demais dispositivos atraves dos pinos de saida 5V e GND;>> Sinal de acionamento, logico: Nivel baixo GND. O ideal para uso com o PCA9685 seria o com acionamento em nivel alto ja que o modulo parece inicializar com todos os pinos em nivel baixo.O LCD shield>> Display LCD16x2 (pinos D4 a D10 do arduino) >> 5 botoes, ligados a apenas um pino analogico do arduino, o pino A0, via divisor de tensao.quando um botao e pressionado seu valor correspondente (entre 0 e 1023) pode ser lido com a funcao analogRead(A0); . Dessa forma e possivel identificar qual botao foi pressionado.O Modulo I2C PCA9685A postagem: Controlador PWM 16 CH PCA9685 com servos e Ledtras mais detalhes sobre esse modulo.MontagemComo funcionaO canal desejado e selecionado via botoes UP e DOWN.O display mostrara o estado do canal selecionado: ON ou OFFPara alterar o estado do canal pressionar o botao SELECT e em seguida LEFT ou RIGHT para alternar entre ON e OFF. Apos selecionar o estado desejado pressionar novamente SELECT para validar a alteracao.ProgramaO PCA9685 e um modulo PWM, saida analogica entao para usa-lo com o modulo rele trabalhamos nos extremos da saida PWM: 0V para nivel baixo (aciona rele) e 4095 para nivel alto (desliga rele). Se estiver usando um modulo rele com acionamento por nivel alto sera necessario inverter no programa onde tem 4095 para 0 e vice versa no local indicado.E necessario adicionar a biblioteca: Adafruit_PWMServoDriver #include <Wire.h>#include <Adafruit_PWMServoDriver.h>#include <LiquidCrystal.h>LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7); //LiquidCrystal lcd(RS,E, D4, D5, D6, D7);// called this way, it uses the default address 0x40Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40);int canal_state[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};// BOTOESint DLY_BT = 300;boolean Right;boolean Up; boolean Down;boolean Left;boolean Select;int cnt_canal = 0;void setup() { //delay(1000); lcd.begin(16, 2); pwm.begin(); pwm.setPWMFreq(1600); // This is the maximum PWM frequencyfor(int a= 0; a<16; a++)pwm.setPin(a,4095); // pino, valor, inverte delay(1000);lcd.print("Modulo rele 16CH"); lcd.setCursor(0, 1); lcd.print(" "); lcd.setCursor(0, 1); lcd.print("Canal "); lcd.print(cnt_canal + 1); if(canal_state[cnt_canal] == 0) lcd.print(": OFF"); else lcd.print(": ON");}void loop() { Zera_bts(); Le_bts(); // ler botoes if( Up == true && cnt_canal > 0) { cnt_canal --; lcd.setCursor(0, 1); lcd.print(" "); lcd.setCursor(0, 1); lcd.print("Canal "); lcd.print(cnt_canal + 1); if(canal_state[cnt_canal] == 0) lcd.print(": OFF"); else lcd.print(": ON"); } else if( Down == true && cnt_canal < 15) { cnt_canal ++; lcd.setCursor(0, 1); lcd.print(" "); lcd.setCursor(0, 1); lcd.print("Canal "); lcd.print(cnt_canal + 1); if(canal_state[cnt_canal] == 0) lcd.print(": OFF"); else lcd.print(": ON"); } // if(Down == true && cnt_canal == 16} // Zera_bts();// Le_bts(); // ler botoes if(Select == true) { lcd.setCursor(0, 1); lcd.print(" "); lcd.setCursor(0, 1); lcd.print("SetCanal "); lcd.print(cnt_canal + 1); if(canal_state[cnt_canal] == 0)