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

}