#include <LiquidCrystal_PCF8574.h>

#include <DallasTemperature.h>

#include <ArduinoJson.h>

 

LiquidCrystal_PCF8574 lcd(0x27);

 

// DS18B20 data wire

#define ONE_WIRE_BUS 23

 

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)

OneWire oneWire(ONE_WIRE_BUS);

 

// Pass our oneWire reference to Dallas Temperature.

DallasTemperature sensors(&oneWire);

 

#define pin_A0 36

 

#define pin_I0 35

#define pin_I1 32

#define pin_I2 33

#define pin_I3 25

#define pin_I4 26

#define pin_I5 27

#define pin_I6 14

#define pin_I7 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 I7 digitalRead(pin_I7)

 

#define Q0 13

#define Q1 15

#define Q2 2

#define Q3 4

#define Q4 16

#define Q5 17

#define Q6 5

#define Q7 18

 

char texto[] = "COM TEST";

 

int ADC_0;

float tempC;

char grados = 223;

String Json_recibir = "";

boolean stringComplete;

byte salidas;

 

unsigned long currentTime = millis();

unsigned long previousTime = 0;

const long timeoutTime = 1000;

 

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.write(I7);

  lcd.setCursor(0,2);

  lcd.print("   01234567");

  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.write(digitalRead(Q7));

  lcd.setCursor(12,1);

  lcd.print("A0:    ");

  lcd.setCursor(15,1);

  lcd.print(ADC_0);

  lcd.setCursor(12,2);

  lcd.print("T");

  lcd.print((char) grados);

  lcd.print(":     ");

  lcd.setCursor(15,2);

  if (tempC == -127)

    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(pin_I7, INPUT);

  pinMode(Q0, OUTPUT);

  pinMode(Q1, OUTPUT);

  pinMode(Q2, OUTPUT);

  pinMode(Q3, OUTPUT);

  pinMode(Q4, OUTPUT);

  pinMode(Q5, OUTPUT);

  pinMode(Q6, OUTPUT);

  pinMode(Q7, OUTPUT);

 

  Serial.begin(9600);

  sensors.begin();

 

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

 

  currentTime = millis();

  if (currentTime - previousTime >= timeoutTime)

  {

    previousTime = currentTime;

    sensors.requestTemperatures(); // Send the command to get temperatures

    tempC = sensors.getTempCByIndex(0);

  }

 

  // 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  + I7 * 128;

  serializeJson(Json_enviar, Serial);

  Serial.println();

 

  if (stringComplete==true)

  {

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

      digitalWrite(Q7, salidas & 128);

    }

 

    // clear the string:

    Json_recibir = "";

    stringComplete = false;

  }

 

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

  stringComplete = true;

}