#include <LiquidCrystal_PCF8574.h>
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
LiquidCrystal_PCF8574 lcd(0x27);
//SENSOR
#define ONE_WIRE_BUS 4
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
float tempC;
// Usamos el código hexadecimal del símbolo de grado (0xDF) que es más estándar en LCDs
const char GRADOS_SYM = 0xDF;
#define PIN_I0 18
#define PIN_I1 19
#define PIN_I2 23
#define I0 !digitalRead(PIN_I0)
#define I1 !digitalRead(PIN_I1)
#define I2 !digitalRead(PIN_I2)
#define Q0 15
#define Q1 2
#define Q2 5
char texto[] = "I/O digitales";
byte alto [] = {
0b0000,
0b1111,
0b1111,
0b1111,
0b1111,
0b1111,
0b1111,
0b0000
};
byte bajo [] = {
0b0000,
0b1111,
0b1001,
0b1001,
0b1001,
0b1001,
0b1111,
0b0000
};
void setup() {
sensors.begin();
// Es recomendable bajar la resolución si necesitas lecturas más rápidas (9 a 12 bits)
sensors.setResolution(10);
pinMode(PIN_I0, INPUT_PULLUP);
pinMode(PIN_I1, INPUT_PULLUP);
pinMode(PIN_I2, INPUT_PULLUP);
pinMode(Q0, OUTPUT);
pinMode(Q1, OUTPUT);
pinMode(Q2, OUTPUT);
lcd.begin(20, 4);
lcd.createChar(0, bajo);
lcd.createChar(1, alto);
delay(200);
lcd.setBacklight(255);
}
void loop() {
estados();
digitalWrite(Q0, I0);
digitalWrite(Q1, I1);
digitalWrite(Q2, I2);
sensors.requestTemperatures();
tempC = sensors.getTempCByIndex(0);
// Validamos que la temperatura sea mayor a -120 para evitar el error de desconexión (-127)
// y que esté dentro del rango lógico del sensor
if (tempC > -120.0 && tempC < 150.0) {
lcd.setCursor(8, 3);
lcd.print(tempC, 1); // Imprime con 1 decimal
lcd.write(GRADOS_SYM);
lcd.print("C ");
}
else {
// Si la lectura es -127 o fuera de rango
lcd.setCursor(8, 3);
lcd.print("Error! ");
}
// Pequeña pausa para no saturar el LCD, pero permitiendo que el sensor procese
delay(500);
}
void estados() {
lcd.setCursor(0,0);
lcd.print(texto);
lcd.setCursor(0,1);
lcd.print("I: ");
lcd.write(I0);
lcd.write(I1);
lcd.write(I2);
lcd.setCursor(0,2);
lcd.print(" 012 Temperatura:");
lcd.setCursor(0,3);
lcd.print("Q: ");
lcd.write(digitalRead(Q0));
lcd.write(digitalRead(Q1));
lcd.write(digitalRead(Q2));
}