#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 A3

 

OneWire oneWire(ONE_WIRE_BUS);

DallasTemperature sensors(&oneWire);

NonBlockingDallas temperatureSensors(&sensors);

 

#define pin_A0 A0

 

#define pin_I0 2

#define pin_I1 3

#define pin_I2 4

#define pin_I3 5

#define pin_I4 6

#define pin_I5 7

 

#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 Q0 13

#define Q1 12

#define Q2 11

#define Q3 10

#define Q4 9

#define Q5 8

 

const char linea_1[] = "COM TEST";

const char sensor[] = "sensor";

const char temperatura[] = "temperatura";

const char entradas[] = "entradas";

 

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(linea_1);

  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.setCursor(0, 2);

  lcd.print("   012345");

  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.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(Q0, OUTPUT);

  pinMode(Q1, OUTPUT);

  pinMode(Q2, OUTPUT);

  pinMode(Q3, OUTPUT);

  pinMode(Q4, OUTPUT);

  pinMode(Q5, 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;

  serializeJson(Json_enviar, Serial);

  Serial.println();

 

  display_update();

}

 

/*

  SerialEvent occurs whenever a new data comes in the hardware serial RX. This

  routine is run between each time loop() runs, so using delay inside loop can

  delay response. Multiple bytes of data may be available.

*/

void serialEvent() {

  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);

  }

}

 

void handleTemperatureChange(int deviceIndex, int32_t temperatureRAW)

{

  tempC = temperatureSensors.rawToCelsius(temperatureRAW);

}

 

void handleDeviceDisconnected(int deviceIndex)

{

  tempC = DEVICE_DISCONNECTED_C;

}