/************************************************************************/
/************************************************************************/
/***** PONTIFICIA UNIVERSIDAD CATÓLICA DEL PERÚ *****/
/***** FACULTAD DE CIENCIAS E INGENIERÍA *****/
/***** SISTEMAS DIGITALES B *****/
/************************************************************************/
/***** Tema: Comunicación I2C *****/
/***** Proyecto: I2C_LCDyDipSwitch *****/
/************************************************************************/
/***** EvalBoard: ESP32 S3 DevKitC 1 *****/
/***** Autor: Rolando Sánchez Ponce *****/
/***** Fecha: Octubre 2024 *****/
/************************************************************************/
/***** Enunciado: *****/
/***** Tenemos conectado al módulo ESP32-S3 una pantalla LCD y dip
/***** switch conformado por ocho interruptores. El programa muestra
/***** en la pantalla, *****/
/***** cada vez que haya un cambio en alguno de los interruptores, *****/
/***** el estado de los interruptores y el número de ocho bits *****/
/***** formado por ellos en formato hexadecimal. Para el usuario *****/
/***** el cabezal arriba de los interruptores indica un uno lógico *****/
/***** y el cabezal abajo representa el cero lógico. *****/
/************************************************************************/
/************************************************************************/
// Incluimos las bibliotecas Wire y LiquidCrystal_I2C
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Definimos etiquetas para los pines
const uint8_t I2C_SDA = 41;
const uint8_t I2C_SCL = 40;
// Declaramos variables
int pinDipSwitch[] = {3, 8, 18, 17, 16, 15, 7, 6};
int numDipSwitch, antDipSwitch, Comp1DipSwitch;
int i;
// Creamos el objeto miLCD
LiquidCrystal_I2C miLCD(0x27, 16, 2);
void setup() {
// Reconfiguramos pines para I2C
Wire.begin(I2C_SDA, I2C_SCL);
// Configuramos pines para dipSwitch
for(i=0; i<8; i++){
pinMode(pinDipSwitch[i], INPUT_PULLUP);
}
// Inicializamos pantalla LCD
miLCD.init();
miLCD.backlight();
miLCD.home();
miLCD.print("DipSWs:");
miLCD.setCursor(0, 1);
miLCD.print("NumeroHEX: ");
// Inicializamos variables
antDipSwitch = 0x100;
}
void loop() {
// Leemos estado de interruptores
numDipSwitch = LeeDipSwitch();
// Si hubo algún cambio con la lectura anterior:
if(numDipSwitch != antDipSwitch){
Comp1DipSwitch = (~numDipSwitch)&0xFF; // Complemento a 1
miLCD.setCursor(8, 0);
EscribeBinLCD(Comp1DipSwitch); // Escribimos bit a bit
miLCD.setCursor(11, 1);
EscribeHexLCD(Comp1DipSwitch); // Número en hexadecimal
}
// Actualizamos variable
antDipSwitch = numDipSwitch;
delay(10);
}
/**********************************************************************/
/**********************************************************************/
/***** Función: LeeDipSwitch() *****/
/**********************************************************************/
/***** Descripción: Lee los estados de los ocho interruptores y *****/
/***** forma un número de ocho bits *****/
/***** Entrada: Ninguna *****/
/***** Salida: Número formado por los ocho interruptores. *****/
/**********************************************************************/
/**********************************************************************/
int LeeDipSwitch(void){
int i;
int num8bits;
num8bits = 0;
for(i=0;i<8;i++){
num8bits = num8bits | (digitalRead(pinDipSwitch[i])<<i);
}
return num8bits;
}
/***********************************************************************/
/***********************************************************************/
/***** Función: EscribeBinLCD() *****/
/***********************************************************************/
/***** Descripción: Escribe en la pantalla LCD un número de ocho *****/
/***** Entrada: Número a descomponer en bits y mostrar en LCD *****/
/***** Salida: Ninguna. *****/
/***********************************************************************/
/***********************************************************************/
void EscribeBinLCD(int num){
int i;
for(i=7; i>=0; i--){
if((num & (1<<i))==0){
miLCD.print("0");
}
else{
miLCD.print("1");
}
}
}
/***********************************************************************/
/***********************************************************************/
/***** Función: EscribeHexLCD() *****/
/***********************************************************************/
/***** Descripción: Escribe en la pantalla LCD un número de ocho
/***** bits en formato hexadecimal. *****/
/***** Entrada: Número a mostrar en LCD en hexadecimal *****/
/***** Salida: Ninguna. *****/
/***********************************************************************/
/***********************************************************************/
void EscribeHexLCD(int num){
int hexHI, hexLO;
miLCD.print("0x");
hexLO = num%16;
hexHI = num/16;
if(hexHI<10){
miLCD.print(hexHI);
}
else{
hexHI = 'A'+ hexHI - 10;
miLCD.print(char(hexHI));
}
if(hexLO<10){
miLCD.print(hexLO);
}
else{
hexLO = 'A'+ hexLO - 10;
miLCD.print(char(hexLO));
}
}