/******************************************************************************* * * Hub 14: Controlando led RGB com potenciômetros * Autor: Angelo Luis Ferreira * Data: 21/07/2022 * * http://squids.com.br/arduino * *******************************************************************************/ #include // inclui a biblioteca LCD com I2C // define os pinos digitais de entrada e saída do Arduino const byte R = 9, G = 10, B = 11; // pinos digitais usados para o led RGB (Red, Green, Blue) const byte pinBut = 2; // pino digital usado para o push button // define os pinos analógicos do Arduino const byte potRed = A2; //potenciômetro controle vermelho const byte potGreen = A1; //potenciômetro controle verde const byte potBlue = A0; //potenciômetro controle azul // define se o led RGB é catodo comum(GND) = 0 ou anodo comum(Vcc) = 1 boolean ledType = 1; // ATENÇÃO: se o led for anodo comum, mude para 1 // variável que define decimal (0) ou hexadecimal (1) boolean hex = 0; // inicial com valor decimal // instancia objeto da biblioteca LCD LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE); // cria o objeto lcd void setup() { // inicializa a comunicação Serial Serial.begin(9600); // inicializa o lcd 16X2 com I2C lcd.begin(16,2); // pin mode - definie entradas e saídas digitais do Arduino pinMode(pinBut, INPUT_PULLUP); // modo entrada - pull up interno arduino pinMode(R, OUTPUT); // define modo saída pino vermelho led RGB pinMode(G, OUTPUT); // define modo saída pino verde led RGB pinMode(B, OUTPUT); // define modo saída pino azul led RGB } void loop() { // verifica se o botão foi acionado e altera a base (decimal ou hexadecimal) readPushButton(); // pega os valores dos potenciômetros e define cores getPotValues(); delay(150); } void readPushButton() { if (!digitalRead(pinBut)) { // verifica se o botão foi acionado hex = !hex; // muda o status de hex while (!digitalRead(pinBut)) {} // aguarda soltar o botão delay(150); // delay para reduzir o efeito bouncing lcd.clear(); } } void getPotValues() { // pega valores dos potenciômetros (de 0 a 255) byte r = map(analogRead(potRed), 0, 1023, 0, 255); byte g = map(analogRead(potGreen), 0, 1023, 0, 255); byte b = map(analogRead(potBlue), 0, 1023, 0, 255); //Serial.println(analogRead(potRed)); // use para calibrar o potenciômetro setColor(r,g,b); // chama a função setColor() para exibir cor no led RGB showDisplay(r,g,b); // chama a função showDisplay para exibir no display } // exibe cor no led RGB void setColor(byte red, byte green, byte blue) { if (ledType == 1) { // se led RGB for anodo (conectado no Vcc) red = 255 - red, green = 255 - green, blue = 255 - blue; } // ativando led RGB com as cores setadas analogWrite(R, red); analogWrite(G, green); analogWrite(B, blue); } // exibe valores no display void showDisplay(byte red, byte green, byte blue) { if (!hex) { // se base decimal (hex = 0) //menu lcd.setCursor(3,0); lcd.print("R"); lcd.setCursor(8,0); lcd.print("G"); lcd.setCursor(13,0); lcd.print("B"); // valores lcd.setCursor(2,1); lcd.print(red); lcd.print(" "); lcd.setCursor(7,1); lcd.print(green); lcd.print(" "); lcd.setCursor(12,1); lcd.print(blue); lcd.print(" "); } else { // se base hexadecimal (hex = 1) // titulo lcd.setCursor(3,0); lcd.print("Hexadecimal"); // lcd.setCursor(5,1); lcd.write(B00100011); // exibe o símbolo # (red<16) ? lcd.print(0) : red; // exibe 0 se menor 16 (0 até F) lcd.print(red, HEX); // em hexadecimal (green<16) ? lcd.print(0) : green; lcd.print(green, HEX); (blue<16) ? lcd.print(0) : blue; lcd.print(blue, HEX); } }