#include <LiquidCrystal_PCF8574.h>
#include <DallasTemperature.h>
#include <NonBlockingDallas.h>
#include <ArduinoJson.h>
LiquidCrystal_PCF8574 lcd(0x27);
#define TIME_INTERVAL 1500
// DS18B20 data wire
#define ONE_WIRE_BUS 3
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
NonBlockingDallas temperatureSensors(&sensors);
#define pin_A0 A0
#define pin_I0 6
#define pin_I1 7
#define pin_I2 8
#define pin_I3 9
#define pin_I4 10
#define pin_I5 11
#define pin_I6 12
#define I0 digitalRead(pin_I0)
#define I1 digitalRead(pin_I1)
#define I2 digitalRead(pin_I2)
#define I3 digitalRead(pin_I3)
#define I4 digitalRead(pin_I4)
#define I5 digitalRead(pin_I5)
#define I6 digitalRead(pin_I6)
#define Q0 13
#define Q1 A1
#define Q2 A2
#define Q3 A3
#define Q4 A6
#define Q5 A7
#define Q6 4
char texto[] = "COM TEST";
int ADC_0;
float tempC;
char grados = 223;
String Json_recibir = "";
byte salidas;
byte pin_state_high[] = {0x00,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x00};
byte pin_state_low[] = {0x00,0x1F,0x11,0x11,0x11,0x11,0x1F,0x00};
void display_update() {
lcd.setCursor(0, 0);
lcd.print(texto);
lcd.setCursor(0, 1);
lcd.print("I: ");
lcd.write(I0);
lcd.write(I1);
lcd.write(I2);
lcd.write(I3);
lcd.write(I4);
lcd.write(I5);
lcd.write(I6);
lcd.setCursor(0, 2);
lcd.print(" 0123456");
lcd.setCursor(0, 3);
lcd.print("Q: ");
lcd.write(digitalRead(Q0));
lcd.write(digitalRead(Q1));
lcd.write(digitalRead(Q2));
lcd.write(digitalRead(Q3));
lcd.write(digitalRead(Q4));
lcd.write(digitalRead(Q5));
lcd.write(digitalRead(Q6));
lcd.setCursor(12, 1);
lcd.print("A0: ");
lcd.setCursor(15, 1);
lcd.print(ADC_0);
lcd.setCursor(12, 2);
lcd.print("T");
lcd.print(grados);
lcd.print(": ");
lcd.setCursor(15, 2);
if (tempC == DEVICE_DISCONNECTED_C)
lcd.print("Error");
else
lcd.print(tempC, 1);
}
void setup() {
// put your setup code here, to run once:
pinMode(pin_I0, INPUT);
pinMode(pin_I1, INPUT);
pinMode(pin_I2, INPUT);
pinMode(pin_I3, INPUT);
pinMode(pin_I4, INPUT);
pinMode(pin_I5, INPUT);
pinMode(pin_I6, INPUT);
pinMode(Q0, OUTPUT);
pinMode(Q1, OUTPUT);
pinMode(Q2, OUTPUT);
pinMode(Q3, OUTPUT);
pinMode(Q4, OUTPUT);
pinMode(Q5, OUTPUT);
pinMode(Q6, OUTPUT);
Serial.begin(9600);
Serial.setTimeout(500);
temperatureSensors.begin(NonBlockingDallas::resolution_12, TIME_INTERVAL);
temperatureSensors.onTemperatureChange(handleTemperatureChange);
temperatureSensors.onDeviceDisconnected(handleDeviceDisconnected);
lcd.begin(20, 4); // initialize the lcd
lcd.createChar(0, pin_state_low);
lcd.createChar(1, pin_state_high);
delay(200);
lcd.setBacklight(255);
}
void loop() {
// put your main code here, to run repeatedly:
ADC_0 = analogRead(pin_A0);
temperatureSensors.update();
// Create the JSON document
StaticJsonDocument<200> Json_enviar;
Json_enviar["sensor"] = ADC_0;
Json_enviar["temperatura"] = tempC;
Json_enviar["entradas"] = I0 * 1 + I1 * 2 + I2 * 4 + I3 * 8 + I4 * 16 + I5 * 32 + I6 * 64;
serializeJson(Json_enviar, Serial);
Serial.println();
if (Serial.available())
{
Json_recibir = Serial.readStringUntil(10);
StaticJsonDocument<20> Datos_recibir;
DeserializationError err = deserializeJson(Datos_recibir, Json_recibir);
if (err == DeserializationError::Ok)
{
salidas = Datos_recibir["salidas"].as<byte>();
digitalWrite(Q0, salidas & 1);
digitalWrite(Q1, salidas & 2);
digitalWrite(Q2, salidas & 4);
digitalWrite(Q3, salidas & 8);
digitalWrite(Q4, salidas & 16);
digitalWrite(Q5, salidas & 32);
digitalWrite(Q6, salidas & 64);
}
// clear the string:
Json_recibir = "";
}
display_update();
}
void handleTemperatureChange(int deviceIndex, int32_t temperatureRAW)
{
tempC = temperatureSensors.rawToCelsius(temperatureRAW);
}
void handleDeviceDisconnected(int deviceIndex)
{
tempC = DEVICE_DISCONNECTED_C;
}