Buongiorno a tutti. Sto lavorando ad un progetto da qualche mese e ho finalmente concluso la realizzazione dello sketch per quanto riguarda l'automazione di un'elettropompa. Lo sketch permette di visualizzare a schermo un timer impostabile tramite 5 pulsanti.
Funziona tutto alla perfezione, tuttavia avrei la necessità di visualizzare sullo schermo anche la temperatura registrata da due sonde dalla Ds18b20. Ho creato quindi la funzione void temp (); e successivamente ho provato a richiamarla ma il refresh del monitor i2C 20x4 dovuto all'aggiornamento del counter, mostra solo per pochi istanti la temperatura per poi, appunto, refresharsi.
Nello specifico vorrei che le due temperature (T.Int e T.Ext) venissero mostrate sempre a schermo dal primo avvio ( quindi da quanto viene mostrata la scritta "Torre Idroponica V.1.0) e rimanessero sempre fisse a schermo.
Copio e incollo di seguito lo sketch e ringrazio preventivamente tutti per l'aiuto.
P.S.: Devo ancora sistemare per bene la posizione dei caratteri su schermo, in quanto ho effettuato il passaggio da display 16x2 a display 20x4
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
#include <SimpleTimer.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 11
#define TEMPERATURE_PRECISION 12
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
LiquidCrystal_I2C lcd(0x27, 20, 4);
SimpleTimer timer;
const int start_counter = 13;
const int stop_counter = 12;
const int set = 11;
const int increment = 10;
const int decrement = 9;
const int relay = 8;
int seconds = 0;
int minutes = 0;
int hours = 0;
int set_hours = 0;
int set_minutes = 0;
int count_hours = 0;
int count_minutes = 0;
int count_seconds = 0;
unsigned int check_val = 50;
int add_check = 0;
int add_seconds = 1;
int add_minutes = 2;
int add_hours = 3;
bool RUN = false;
bool set_flag = false;
bool relay_toggle = true;
int i = 0;
void count() {
while (RUN) {
if (timer.isReady())
{
lcd.clear();
digitalWrite(relay, relay_toggle);
seconds == ++seconds;
if (seconds == 60)
{
minutes = ++ minutes;
seconds = 0;
}
if (minutes == 60)
{
hours = ++ hours;
hours = 0;
}
if (hours >= set_hours && minutes >= set_minutes)
{
digitalWrite(relay, relay_toggle);
lcd.setCursor(4, 0);
relay_toggle = !relay_toggle;
seconds = 0;
minutes = 0;
hours = 0;
}
lcd.setCursor(4, 0);
if (hours <= 9)
{
lcd.print('0');
}
lcd.print(hours);
lcd.print(':');
if (minutes <= 9)
{
lcd.print('0');
}
lcd.print(minutes);
lcd.print(':');
if (seconds <= 9)
{
lcd.print('0');
}
lcd.print(seconds);
timer.reset();
lcd.setCursor(2, 1);
if (relay_toggle == 1)
{
lcd.print("POMPA ON");
}
else if (relay_toggle == 0)
{
lcd.print("POMPA OFF");
}
if (digitalRead(stop_counter) == LOW)
{
set_flag = false;
RUN = false;
stop_count();
}
}
}
}
void stop_count()
{
while (!RUN) {
set_flag = false;
timer.reset();
seconds = 0;
minutes = 0;
hours = 0;
digitalWrite(relay, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" TIMER");
lcd.setCursor(0, 1);
lcd.print(" FERMA");
delay(1000);
return;
}
}
void set_time()
{
lcd.clear();
set_minutes = 0;
set_hours = 0;
while (set_flag == true)
{
if (digitalRead(increment) == LOW)
{
delay(100);
if (digitalRead(increment) == LOW)
{
set_minutes = ++set_minutes;
if (set_minutes >= 59)
{
set_minutes = 0;
set_hours = ++set_hours;
if (set_hours >= 24)
{
set_hours = 0;
set_minutes = 0;
}
}
}
}
if (digitalRead(decrement) == LOW)
{
delay(100);
if (digitalRead(decrement) == LOW)
{
set_minutes = --set_minutes;
if (set_minutes <= 0)
{
set_minutes = 59;
set_hours = --set_hours;
if (set_hours <= -1 || set_minutes <= -1)
{
set_hours = 23;
set_minutes = 59;
}
}
}
}
lcd.setCursor(0, 0);
lcd.print(" PREMI INC/DEC");
lcd.setCursor(5, 1);
if (set_hours <= 9)
{
lcd.print('0');
}
lcd.print(set_hours);
lcd.print(':');
if (set_minutes <= 9)
{
lcd.print('0');
}
lcd.print(set_minutes);
if (digitalRead(stop_counter) == LOW)
{
delay(500);
if (digitalRead(stop_counter) == LOW)
{
set_flag = false;
RUN = false;
stop_count();
}
}
if (digitalRead(set) == LOW)
{
delay(500);
if (digitalRead(set) == LOW)
{
EEPROM.update(add_minutes, set_minutes);
EEPROM.update(add_hours, set_hours);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" TIMER SET");
lcd.setCursor(0, 1);
lcd.print(" PREMI START");
delay (1000);
break;
}
}
}
}
void setup()
{
lcd.begin();
lcd.backlight();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" TORRE");
lcd.setCursor(0, 1);
lcd.print("IDROPONICA V 1.0");
delay(1000);
timer.setInterval(1000);
Serial.begin(9600);
pinMode(start_counter, INPUT_PULLUP);
pinMode(stop_counter, INPUT_PULLUP);
pinMode(set, INPUT_PULLUP);
pinMode(increment, INPUT_PULLUP);
pinMode(decrement, INPUT_PULLUP);
pinMode(relay, OUTPUT);
seconds = 0;
minutes = 0;
hours = 0;
set_hours = EEPROM.read(add_hours);
set_minutes = EEPROM.read(add_minutes);
delay(1000);
lcd.clear();
}
void loop()
{
lcd.setCursor(0, 0);
lcd.print(" TIMER PRONTO");
lcd.setCursor(0, 1);
lcd.print("PREMI START/SET");
if (digitalRead(start_counter) == LOW)
{
relay_toggle = true;
RUN = true;
count();
}
if (digitalRead(set) == LOW)
{
delay(100);
if (digitalRead(set) == LOW)
{
set_flag = true;
set_time();
}
}
}
void temp() {
sensors.begin();
sensors.requestTemperatures();
float tempInterna = sensors.getTempCByIndex(0);
float tempEsterna = sensors.getTempCByIndex(1);
// Mostra le temperature
lcd.setCursor(2, 1);
lcd.print("T.Int:");
lcd.setCursor(2, 2);
lcd.print(tempInterna);
lcd.print((char)223);
lcd.print("C");
lcd.setCursor(3, 2);
lcd.print("T.Ext:");
lcd.setCursor(3, 3);
lcd.print(tempEsterna);
lcd.print((char)223);
}