#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 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
NonBlockingDallas temperatureSensors(&sensors);
#define pin_A0 1
#define pin_I0 17
#define pin_I1 14
#define pin_I2 16
#define pin_I3 15
#define pin_I4 7
#define pin_I5 6
#define pin_I6 5
#define pin_I7 4
#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 35
#define Q1 33
#define Q2 34
#define Q3 36
#define Q4 37
#define Q5 38
#define Q6 39
#define Q7 40
char texto[] = "COM TEST";
int ADC_0;
float tempC;
char grados = 223;
String Json_recibir = "";
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(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(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);
Serial.setTimeout(500);
temperatureSensors.begin(NonBlockingDallas::resolution_12, TIME_INTERVAL);
temperatureSensors.onTemperatureChange(handleTemperatureChange);
temperatureSensors.onDeviceDisconnected(handleDeviceDisconnected);
Wire.begin(41, 42);
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();
sensors.requestTemperatures(); // Send the command to get temperatures
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();
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);
digitalWrite(Q6, salidas & 64);
digitalWrite(Q7, salidas & 128);
}
}
void handleTemperatureChange(int deviceIndex, int32_t temperatureRAW)
{
tempC = temperatureSensors.rawToCelsius(temperatureRAW);
}
void handleDeviceDisconnected(int deviceIndex)
{
tempC = DEVICE_DISCONNECTED_C;
}