/********************************************************************************************
Este codigo realiza una lectura análogica de un sensor de temperatura
Muestra el valor obtenido en una pantalla LCD usando 4 bits
Se puede cambiar el valor de °C a °F con unos botones
May 8
Emilio Fernando D. R.
********************************************************************************************/
#define RS 5
#define EN 6
// Pines de LCD RS, EN, D4, D5, D6, D7
byte pines[] = {RS, EN, 8, 10, 11, 12};
byte botonesPin = 15;
bool botonPresionado, botonEstadoAnterior;
int lecturaBotones;
unsigned long reboteTiempoPrevio;
byte reboteDelay = 200;
bool centigrados = false;
byte sensorPin = 4;
int lecturaAnalogica;
float temperaturaC, temperaturaF;
int periodoLectura = 500;
unsigned long lecturaTiempoPrevio;
void setup() {
pinMode(sensorPin, INPUT);
for(byte i = 0; i < 6; i++){
pinMode(pines[i], OUTPUT);
}
// Inicialización de la pantalla LCD en modo de 4 bits
EscribeComando(0x02); // Inicializar en modo de 4 bits
EscribeComando(0x28); // Configurar el modo de 2 líneas y 5x8
EscribeComando(0x0C); // Limpiar pantalla
}
void loop() {
// Detecta cuando un botón ha sido presionado y realiza una lectura analógica para guardarla.
if(analogRead(botonesPin) > 500){
lecturaBotones = analogRead(botonesPin);
botonPresionado = true;
}
else{
botonPresionado = false;
}
// Establece un valor para la variable centigrados
// tomando en cuenta el robote físico del botón.
if(botonPresionado != botonEstadoAnterior && millis() - reboteTiempoPrevio > reboteDelay){
botonEstadoAnterior = botonPresionado;
if(botonPresionado){
if(lecturaBotones > 1400){
centigrados = true;
ActualizaLecturaEnLCD();
}
else{
centigrados = false;
ActualizaLecturaEnLCD();
}
}
reboteTiempoPrevio = millis();
}
// Actualiza la pantalla LCD cada cierto tiempo
if(millis() - lecturaTiempoPrevio > periodoLectura){
lecturaTiempoPrevio = millis();
ActualizaLecturaEnLCD();
}
}
void ActualizaLecturaEnLCD(){
EscribeComando(0x0C); // Limpiar pantalla
lecturaAnalogica = analogRead(sensorPin);
temperaturaC = mapf(lecturaAnalogica, 0, 4095, 2, 150);
temperaturaF = temperaturaC*(9.0/5.0) + 32;
ImprimirEnLCD("Temperatura:", 0, 0);
if(centigrados){
ImprimirEnLCD(temperaturaC, 1, 0);
ImprimirEnLCD(" C", 1, 5);
}
else{
ImprimirEnLCD(temperaturaF, 1, 0);
ImprimirEnLCD(" F", 1, 5);
}
}
// Hace exactamente lo mismo que la función map() pero usa y retorna valores decimales.
float mapf(float x, float in_min, float in_max, float out_min, float out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
// Función para escribir comandos para la pantalla LCD
void EscribeComando(byte command) {
digitalWrite(RS, LOW);
EnviarDatos(command);
}
// Función para escribir datos para la pantalla LCD
void EscribeDatos(byte data) {
digitalWrite(RS, HIGH);
EnviarDatos(data);
}
// Función para enviar datos en la pantalla
void EnviarDatos(byte data) {
// Se manda la primera mitad del byte del dato.
for(byte i = 2; i < 6; i++){
digitalWrite(pines[i], (data >> (i+2)) & 0x01);
}
PulsoEnable();
// Se manda la segunda mitad del byte del dato.
for(byte i = 2; i < 6; i++){
digitalWrite(pines[i], (data >> (i-2)) & 0x01);
}
PulsoEnable();
}
// Función para imprimir texto en la pantalla LCD
void ImprimirEnLCD(char mensaje[], int linea, int columna) {
ColocarCursor(linea, columna);
byte i = 0;
while (mensaje[i] != '\0') {
EscribeDatos(mensaje[i]);
i++;
}
}
// Función para imprimir texto en la pantalla LCD
void ImprimirEnLCD(byte data, int linea, int columna) {
ColocarCursor(linea, columna);
EscribeDatos(data);
}
// Función para imprimir un número en la pantalla LCD
void ImprimirEnLCD(float numero, int linea, int columna) {
ColocarCursor(linea, columna);
String mensaje = String(numero);
digitalWrite(RS, HIGH);
byte i = 0;
while (mensaje[i] != '\0') {
EnviarDatos(mensaje[i]);
i++;
}
}
// Función para establecer la posición del cursor
void ColocarCursor(int linea, int columna) {
byte LineasOffset[] = {0, 0x40};
byte posicionCursor = 0x80 + LineasOffset[linea] + columna;
EscribeComando(posicionCursor);
}
// Envía pulsos al pin Enable
void PulsoEnable() {
digitalWrite(EN, LOW);
delayMicroseconds(10);
digitalWrite(EN, HIGH);
delayMicroseconds(10);
digitalWrite(EN, LOW);
delayMicroseconds(20);
}Loading
esp32-s3-devkitc-1
esp32-s3-devkitc-1