Problema con la stampa delle temperature

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


Sono le varie lcd.clear(); che hai nel codice che cancellano tutto lo schermo, quindi ovviamente addio stampa temperature

Potresti provare a richiamate temp() nei blocchi dove hai quei clear(), dopo di loro ovviamente

Non devi cancellare sempre tutto! Fai una maschera con ciò che deve essere visualizzato costantemente (o più maschere da richiamare se serve visualizzare parametri diversi) e la esegui solo una volta all'inizio o quando cambi visualizzazione. Quando devi aggiornare i valori, ci riscrivi sopra facendo attenzione a cancellare eventuali caratteri rimanenti se il nuovo valore ha meno cifre del precedente.

Perdona l'ignoranza ma non sapevo dell'esistenza di queste maschere. Sono come delle funzioni da richiamare? Adesso provo ad informarmi bene a riguardo, se conosci una guida potresti gentilmente linkarmela?

Sono piccole funzioni che devi fare tu, che scrivono solo le parti fisse, per esempio:

void maschera_temp_umid()
  {
  lcd.setCursor(0,0); lcd.print("Temperatura: ");
  lcd.setCursor(0,1); lcd.print("Umidita: ");
  }

Grazie mille per la dritta! Ho implementato le maschere come mi hai suggerito e ora è tutto ok! Devo chiudere io il topic o ci pensano gli admin?

Prego! :slight_smile:

Le discussioni vengono chiuse automaticamente 6 mesi dopo l'ultima risposta. Nel frattempo è possibile inserire ulteriori commenti.

Ciao
Gianluca

1 Like

Puoi, però, segnalare la soluzione con l'apposito pulsante nella risposta risolutiva.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.