#include <Wire.h> // biblioteca para conexión I2C
#include <Adafruit_GFX.h> // biblioteca para gráficos
#include <Adafruit_SSD1306.h> // biblioteca para el controlador del OLED
#include <Keypad.h>
#include <ESP32Servo.h>
#define SCREEN_WIDTH 128 // OLED ancho, en pixeles
#define SCREEN_HEIGHT 64 // OLED alto, en pixeles
#define pinServo 27
#define pinRed 26
#define pinGreen 33
#define pinBlue 25
// crea el objeto OLED con conexión I2C
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// importa libreria Keypad
// define numero de filas
const uint8_t ROWS = 4;
// define numero de columnas
const uint8_t COLS = 4;
// define la distribucion de teclas
char keys[ROWS][COLS] = {
{ '1', '2', '3', 'A' },
{ '4', '5', '6', 'B' },
{ '7', '8', '9', 'C' },
{ '*', '0', '#', 'D' }
};
// pines correspondientes a las filas
uint8_t colPins[COLS] = { 16, 4, 2, 15 };
// pines correspondientes a las columnas
uint8_t rowPins[ROWS] = { 19, 18, 5, 17 };
// crea objeto con los prametros creados previamente
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
Servo servo;
void escribirPantalla(String comando){
oled.clearDisplay(); // borra la pantalla
oled.setTextSize(2); // selecciona tamaño de texto
oled.setTextColor(WHITE); // selecciona color de texto
oled.setCursor(20, 25); // posiciona el cursor
oled.println(comando); // selecciona texto a imprimir
oled.display(); // imprime en el OLED
}
void setup() {
Serial.begin(9600); // inicializa puerto serie
servo.attach(pinServo);
// initialize OLED display with I2C address 0x3C
if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Si la conexion I2C con el OLED falla
Serial.println(F("Falla conexión con SSD1306 OLED")); // imprime en monitor serie
while (1);
}
delay(500); // espera 500 milisegundo para la inicialización
servo.write(0);
pinMode(pinRed, OUTPUT);
pinMode(pinGreen, OUTPUT);
pinMode(pinBlue, OUTPUT);
ledcAttachChannel(pinRed, 5000,8,5);
ledcAttachChannel(pinGreen, 5000,8,6);
ledcAttachChannel(pinBlue, 5000,8,7);
}
int grados=0;
int iluminacion=0;
String Grados= Grados;
void loop() {
// obtiene tecla presionada y asigna a variable
char key = keypad.getKey();
// comprueba que se haya presionado una tecla
if (key && key!='A') {
Grados= String(Grados + key);
escribirPantalla(String("Grados: \n ")+ Grados);
}
if(key=='A'){
grados= Grados.toInt();
Serial.println(grados);
if(grados>=0 && grados <=180){
servo.write(grados);
delay(100);
Serial.println("Usted ha movido el servo a "+String(grados)+" grados");
//Aumentar el mapeado de los colores
// Asignación de colores según el rango de grados
int red = 0, green = 0, blue = 0;
if (grados <= 60) {
red = map(grados, 0, 60, 0, 255);
green = 0;
blue = 0;
}
else if (grados <= 120) {
red = map(grados, 60, 120, 255, 0);
green = map(grados, 60, 120, 0, 255);
blue = 0;
}
else if (grados <= 180) {
red = map(grados, 120, 180, 0, 255);
green = map(grados, 120, 180, 255, 0);
blue = map(grados, 120, 180, 0, 255);
}
// Aplicar colores a los LEDs
ledcWriteChannel(5, red);
ledcWriteChannel(6, green);
ledcWriteChannel(7, blue);
Grados="";
escribirPantalla(String("Grados: \n ")+ Grados);
}
}
}