AIUTO, PROGETTO MATURITA'

Buongiorno a tutti, spero di star scrivendo nel posto giusto (sono nuovo del forum, mi sono presentato ma non conosco bene il sito).
Sto costruendo un mini-frigo per la maturità, una cella di Peltier connessa a delle ventole, tutto controllato da arduino. collegando però l'LCD ad arduino e facendo partire il programma mi viene fuori la scritta che ho impostato io (offline) e in ogni altro spazio disponibile dell'LCD mi inizia un contatore infinito (simile a quello di Hello world. Chiedendo ad un mio amico mi ha risposto che non ho usato lcd.clear() ma anche usandolo non cambia niente, posto di seguito il programma.

#include <LiquidCrystal.h>
#define pin_temp A0

int bt1_pin = 13;
boolean bt1_st = true;
boolean bt1_flag;

int bt2_pin = 6;
boolean bt2_st = true;
boolean bt2_flag;

int bt3_pin = 10;
boolean bt3_st = true;
boolean bt3_flag;


int schermata = -1;
int fps = 10;
int periodo;
unsigned long timer;
boolean aggiorna;

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
float temp = 0;
float TempMax = 20;
float TempMin = 10;


void setup() {
  Serial.begin(9600);

  periodo = 1000 / fps;
  lcd.begin(16, 2);
  analogReference(INTERNAL);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);

  pinMode(bt1_pin, INPUT_PULLUP);
  pinMode(bt2_pin, INPUT_PULLUP);
  pinMode(bt3_pin, INPUT_PULLUP);
  
   lcd.print(millis() / 500);
   

}

void loop() {

    temp = 0;
    for (int i = 0; i < 5; i++) {
    temp = (4.4 * analogRead(pin_temp) * 100.0) / 1024.0;
    }
    temp = temp/ 5;

  /*************************PULSANTI*******************************
     questa sezione legge se sono stati premuti dei pulsanti
     e nel caso da in uscita delle variabili vere per un solo ciclo
     -bt1_flag    -bt2_st    -bt3_st
   ****************************************************************/
  boolean bt1 = digitalRead(bt1_pin);
  bt1_flag = false;
  if ((bt1 != bt1_st) && (bt1 == 1)) {
    schermata++;
    schermata = (schermata) % 3;
    Serial.print(schermata);
  }
  bt1_st = bt1;

  boolean bt2 = digitalRead(bt2_pin);
  bt2_flag = false;
  if ((bt2 != bt2_st) && (bt2 == 1)) {
    bt2_flag = true;
  }
  bt2_st = bt2;

  boolean bt3 = digitalRead(bt3_pin);
  bt3_flag = false;
  if ((bt3 != bt3_st) && (bt3 == 1)) {
    bt3_flag = true;
  }
  bt3_st = bt3;
  /*****************************FINE PULSANTI********************/



  /*************************SCHERMATA LCD**************************
     questa sezione scrive sull'LCD le informazioni
      sulle temperature in base alla variabile
     -schermata
   ****************************************************************/
  if (millis() - timer > periodo) {
    timer = millis ();
    aggiorna = true;
  }
  if (aggiorna) {
    aggiorna = false;
    lcd.clear();  //funzione per cancellare tutto lo schermo che non so perchè non hai usato LOL
    switch (schermata) {
      case -1:
        lcd.setCursor(0, 1);
        lcd.print("offline ");
        /*TODO  funzione per spegnere schermo*/
        break;
      case 0:
      
        lcd.setCursor(0, 0);
        lcd.print("temperatura:");
        lcd.setCursor(0, 1);
        lcd.print(temp);
        lcd.print(" C ");
        delay(500);
        break;
      case 1:
        lcd.setCursor(0, 0);
        lcd.print("Hai scelto");
        lcd.setCursor(0, 1);
        lcd.print("TempMax ");
        lcd.print(TempMax);
        lcd.print(" C ");
        if (bt2_flag) {
          TempMax += 0.5;
        } else {
          if (bt3_flag) {
            TempMax - 1;
          }
        }
        break;
      case 2:
        lcd.setCursor(0, 0);
        lcd.print("Hai scelto");
        lcd.setCursor(0, 1);
        lcd.print("TempMin ");
        lcd.print(TempMin);
        lcd.print(" C ");
        if (bt2_flag) {
          TempMax += 0.5;
        } else {
          if (bt3_flag) {
            TempMax - 1;
            lcd.setCursor(12, 1);
          }
        }
        break;
    }
  } 
}

... vedo che NON hai letto bene il REGOLAMENTO !

In conformità al suddetto regolamento, punto 13, il cross-posting è proibito (anche tra lingue diverse) e tu hai posto la stessa domanda, per di più scrivendo in Italiano (cosa che NON è permessa) in una sezione Inglese del forum !
Tale tuo thread duplicato è stato quindi cancellato, per cui ... prosegui qui la discussione. Grazie.

Guglielmo

... detto questo ... guarda la prima riga che si trova subito all'inizio del loop() ... capirai il perché del problema che lamenti.

Ti ricordo che il loop() viene eseguito in continuazione e quindi ...

Guglielmo

Altro problema, il sensore di temperatura non mi mostra sull'lcd il cambio di temperatura, cosa può essere? cambio il codice sopra elencato con quello attuale

gpb01:
... detto questo ... guarda la prima riga che si trova subito all'inizio del loop() ... capirai il perché del problema che lamenti.

Ma veramente non ho capito quale sia esattamente il problema che lui lamenta, lui ha messo un controllo con millis() ed in base a questo scrive sull'LCD le informazioni ad intervalli regolari.
Il problema è che ha messo una variabile "fps" che indica il numero di aggiornamenti al secondo e che vale 10 ma il tempo di attesa lo imposta con:

periodo = 1000 / fps;

per cui aggiorna ben 10 volte al secondo il che è troppo per la latenza dei cristalli liquidi di questi display.

Quantomeno dovrebbe mettere 1 o 2 al massimo.

Seconda cosa, il clear() dovrebbe farlo solo al cambio di tipologia di schermata, mentre l'aggiornamento va fatto solo per i valori posizionando direttamente il cursore nei punti specifici.

Ma uno il progetto per la MATURITA' lo deve per forza realizzare il giorno (o qualche giorno prima) della maturità? Pensarci un pochino prima no, eh? (si, vabbè, anche noi eravamo così, ma credevo che l'essere umano nel frattempo si fosse evoluto...)

steve-cr:
... ma credevo che l'essere umano nel frattempo si fosse evoluto...)

Io, fra asocial-networks, zombies dello smartphone e lavaggio del cervello telecalcistico, ho invece l'impressione che si sia DE-evoluto, guardandomi in giro ... :smiley:

(scusate, non ho resistito ;))

se ce n'è una che non ho capito a che serve è questa:

 lcd.print(millis() / 500);

che fa? ti stampa i mezzi secondi trascorsi dall'accensione?

docdoc:
Ma veramente non ho capito quale sia esattamente il problema che lui lamenta, lui ha messo un controllo con millis() ed in base a questo scrive sull'LCD le informazioni ad intervalli regolari.
Il problema è che ha messo una variabile "fps" che indica il numero di aggiornamenti al secondo e che vale 10 ma il tempo di attesa lo imposta con:

periodo = 1000 / fps;

per cui aggiorna ben 10 volte al secondo il che è troppo per la latenza dei cristalli liquidi di questi display.

Quantomeno dovrebbe mettere 1 o 2 al massimo.

Seconda cosa, il clear() dovrebbe farlo solo al cambio di tipologia di schermata, mentre l'aggiornamento va fatto solo per i valori posizionando direttamente il cursore nei punti specifici.

il problema è che il sensore di temperatura rileva solo la temperatura iniziale, appena attacco l'usb, non varia. ho cambiato come suggerisci tu e ho messo fps=2. riguardo al lcd.clear non ho capito molto bene cosa hai scritto

DoubleM:
il problema è che il sensore di temperatura rileva solo la temperatura iniziale, appena attacco l'usb, non varia.

Questo è un altro problema, allora, sembra più qualcosa legato all'hardware.
Posta esattamente lo schema dei tuoi collegamenti e vediamo.

riguardo al lcd.clear non ho capito molto bene cosa hai scritto

Se tu fai sempre lcd.clear() cancelli tutto lo schermo e poi devi ridisegnarlo. Questo induce uno "sfarfallio" che in casi normali può essere solo fastidioso, per aggiornamenti relativamente rapidi dello schermo diventa estremamente fastidioso, fino a rendere quasi impossibile leggere ciò che scrivi se lo fai molto velocemente.
Quindi usi il clear() solo quando devi cambiare tipologia di schermata, poi gli aggiornamenti li fai andando a scrivere solo i nuovi valori, direttamente alla posizione dove li devi mostrare.

>DoubleM: Stiamo calmi ed evitiamo post che possono innescare "flames" ... e che tanto vengono da me cancellati. Grazie.

>steve-cr: evitiamo commenti NON pertinenti e limitiamoci a questioni tecniche. Se devi rispondere rispondi, altrimenti ignora il thread. Grazie.

Guglielmo

docdoc:
Questo è un altro problema, allora, sembra più qualcosa legato all'hardware.
Posta esattamente lo schema dei tuoi collegamenti e vediamo.

Se tu fai sempre lcd.clear() cancelli tutto lo schermo e poi devi ridisegnarlo. Questo induce uno "sfarfallio" che in casi normali può essere solo fastidioso, per aggiornamenti relativamente rapidi dello schermo diventa estremamente fastidioso, fino a rendere quasi impossibile leggere ciò che scrivi se lo fai molto velocemente.
Quindi usi il clear() solo quando devi cambiare tipologia di schermata, poi gli aggiornamenti li fai andando a scrivere solo i nuovi valori, direttamente alla posizione dove li devi mostrare.

Vi rimando al link del mio tinkercad, ho copiato essattamente ciò che c'è simulato:

ma il controllo della temperatura sul pin a0 come lo fai? cioè che sensore usi?
hai usato il riferimento interno quindi lavori tra 0V e 1,1V
ma la formula che usi è questa

temp = (4.4 * analogRead(pin_temp) * 100.0) / 1024.0;

Patrick_M:
ma il controllo della temperatura sul pin a0 come lo fai? cioè che sensore usi?
hai usato il riferimento interno quindi lavori tra 0V e 1,1V
ma la formula che usi è questa

temp = (4.4 * analogRead(pin_temp) * 100.0) / 1024.0;

No è sbagliato lo sketch, come snesore di temperatura uso LM35 e la formila che uso è

temp= analogRead(pin_temp)/9.31;

ricominciamo da capo allora :smiley:

qual'è il problema che hai, su quale programma, e con che circuito?

DoubleM:
... come snesore di temperatura uso LM35 e la formila che uso è

temp= analogRead(pin_temp)/9.31;

... che è giusta se si usa, come mi sembra tu faccia, il riferimento interno (1.1V) :slight_smile:

Guglielmo

DoubleM:
Vi rimando al link del mio tinkercad, ho copiato essattamente ciò che c'è simulato:

Eh, ok, quello scrive i secondi sulla riga 1 del display, non usi clear() e va bene, scrivi solo il valore nella posizione prefissata, e anche questo è ok, quindi qual è la domanda?
Se non riguarda la gestione dell'LCD (ma hai quotato questo, quindi pensavo al clear) ma è relativa alla lettura della temperatura, dovresti simulare anche quella ed implementare il relativo codice.

PS su tinkercad ricorda che millis() è in centesimi non millesimi, quindi per avere i secondi devi fare millis()/100 e non millis()/1000.