Boa noite!
Estou a fazer uma montagem para brincar com uma caldeira de vapor. Nesse contexto, tenho uma sonda que leio com o arduino, converto para uma gama de 0 a 5V para controlar a entrada de água. Para os niveis de segurança e resistencia de aquecimento, uso entradas e saídas digitais.
O código que fiz inicialmente, funciona e faz o esperado. No entanto, suponho que deve ter uma falha qualquer que não consigo identificar, uma vez que o arduino está a reiniciar ou bloquear (já o fez com o aquecimento ligado e fez abrir a valvula de segurana) com o visor a ficar maluco ou "freeze".
O código está em anexo. Se alguém me puder dar umas dicas, agradeço.
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display
int nivel;
int valor;
float voltage;
void setup()
{
lcd.init();
lcd.backlight();
pinMode(2, INPUT_PULLUP); // nivel baixo ok
pinMode(3, INPUT_PULLUP); //pressostato
pinMode(7, OUTPUT); // Rele Bomba Agua
pinMode(8, OUTPUT); // Rele Bomba Agua
pinMode(9, OUTPUT); // Rele Bomba Agua
pinMode(10, OUTPUT); // Aquecimento
pinMode(11, OUTPUT); // Aquecimento
pinMode(12, OUTPUT); // Aquecimento
pinMode(6, OUTPUT); // Verde
digitalWrite(7, HIGH); // Rele Bomba Agua
digitalWrite(8, HIGH); // Rele Bomba Agua
digitalWrite(9, HIGH); // Rele Bomba Agua
digitalWrite(10, HIGH);// Aquecimento
digitalWrite(11, HIGH); // Aquecimento
digitalWrite(12, HIGH); // Aquecimento
digitalWrite(6, HIGH); //LED Verde
lcd.setCursor(0, 0);
lcd.print("Caldeira II");
lcd.setCursor(0, 1);
lcd.print("Software-Jan2019");
delay(1000);
}
void loop()
{
int nivel = digitalRead(3);
int pressao = digitalRead(2);
int valor = analogRead(A0);
float voltage = valor * (5.0 / 1020.0);
if (nivel == LOW)
{
operacao();
}
else
{
stopseguranca();
// digitalWrite(7, LOW); // Rele Bomba Agua
// digitalWrite(8, LOW); // Rele Bomba Agua
// digitalWrite(9, LOW); // Rele Bomba Agua
// digitalWrite(10, HIGH);// Aquecimento
// digitalWrite(11, HIGH); // Aquecimento OFF
// digitalWrite(12, HIGH); // Aquecimento OFF
// digitalWrite(6, HIGH); //LED Verde OFF
// lcd.clear();
// lcd.setCursor(0, 0);
// lcd.print("Nivel inseguro");
// lcd.setCursor(0, 1);
// String datastring = "Disabled " + String(voltage) + " V";
// lcd.print(datastring);
// delay(1000);
}
}
//////////////////////////////////////////////////////////////////////////////
///////////////////Funções auxiliares/////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
void operacao ()
{
int nivel = digitalRead(3);
int pressao = digitalRead(2);
int valor = analogRead(A0);
float voltage = valor * (5.0 / 1020.0);
if (voltage < 3.1)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Entrada de agua");
meteagua();
if (pressao == LOW)
{
lcd.setCursor(0, 1);
String datastring = "A aquecer " + String(voltage) + " V";
lcd.print(datastring);
aquece ();
}
else
{
lcd.setCursor(0, 1);
String datastring = "Aqueci/off " + String(voltage) + "V";
lcd.print(datastring);
stopaquece();
}
meteagua();
}
else
{
lcd.clear();
lcd.print("Nivel alto oK");
stopagua();
if (pressao == LOW)
{
lcd.setCursor(0, 1);
String datastring = "A aquecer " + String(voltage) + " V";
lcd.print(datastring);
aquece();
}
else
{
lcd.setCursor(0, 1);
String datastring = "Aqueci/off " + String(voltage) + "V";
lcd.print(datastring);
stopaquece();
}
stopagua();
}
}
void aquece () {
digitalWrite(10, LOW); // Aquecimento On
digitalWrite(11, LOW); // Aquecimento On
digitalWrite(12, LOW); //LED Verde On
delay (1000);
}
void meteagua()
{
digitalWrite(7, LOW); // Rele Bomba Agua
digitalWrite(8, LOW); // Rele Bomba Agua
digitalWrite(9, LOW); // Rele Bomba Agua
digitalWrite(6, HIGH); //LED Verde OFF
delay (1000);
}
void stopaquece () {
digitalWrite(10, HIGH); // Aquecimento On
digitalWrite(11, HIGH); // Aquecimento On
digitalWrite(12, HIGH); //LED Verde On
delay (1000);
}
void stopagua()
{
digitalWrite(7, HIGH); // Rele Bomba Agua
digitalWrite(8, HIGH); // Rele Bomba Agua
digitalWrite(9, HIGH); // Rele Bomba Agua
digitalWrite(6, LOW); //LED Verde OFF
delay (1000);
}
void stopseguranca () {
digitalWrite(10, HIGH); // Aquecimento Off
digitalWrite(11, HIGH); // Aquecimento off
digitalWrite(12, HIGH); //LED Verde off
lcd.clear();
lcd.print("Nivel inseguro");
lcd.setCursor(0, 1);
lcd.print("falha de nivel");
digitalWrite(7, LOW); // Rele Bomba Agua
digitalWrite(8, LOW); // Rele Bomba Agua
digitalWrite(9, LOW); // Rele Bomba Agua
digitalWrite(6, HIGH); //LED Verde OFF
delay (1000);
}