Accesso a menu personalizzato


buongiorno tutti.
non essendo un guru della programmazione, ed essendomi avvicinato di recente alla piattaforma arduino, stò cercando di realizzare con qualche sforzo, un piccolo software per il controllo di alcuni termoriscaldatori da utilizzarsi per fermentazione della birra artiggianale. (mi sono dato all'alcool :d)
ho cominciato ad approndare il software, ma mi sono reso conto (dopo un breve test sul campo) che alcune delle funzioni da me ipotizzate in fase di programmazione non vengono correttamente eseguite, e purtroppo dato la mia scarsa capacità di programmazione non riesco capire dove si nascondono gli errori. potreste cortesemente darmi una mano capire dove sbaglio?
in particolar modo avevo ipotizzato di poter effettuare setpoint delle temperature entrando in un sottomenù e con dei tasti ingrementare e decrementare valori.
tale funzione non l'ho ancora scritta, perchè non riesco far funzionare la parte di accesso al menù.
avevo ipotizzato di portare ad "uno" la variabile "onstup" seguito della pressione di un pulsante, per bloccare la visualizzazione ciclica dei valori di temperatura sull'lcd   e di far apparire valori da impostare. però alla pressione del tasto, il codice in esso viene eseguito, (ho provato sostituirlo con un testo da visualizzare sull'lcd e viene regolarmente visualizzato) ma la variabile onsetup resta sempre "zero".
non riesco capirne il motivo.
il codice l'ho inserto nel post successivo in quanto superavo il limite massimo di caratteri inseribili in un singolo post.
grazie per l'aiuto.

qui di seguito il listato del programma.
code: [select]

#include <onewire.h>
#include <dallastemperature.h>
#define one_wire_bus 2
#include <liquidcrystal.h>
liquidcrystal lcd(8, 9, 4, 5, 6, 7);
onewire onewire(one_wire_bus);
// -------------------variabili per la gestione mutitasking----------------------------
unsigned long int time;
unsigned long int time_temperature;
unsigned long int time_lcd_fer;
unsigned long int time_lcd_forno;
unsigned long int time_lcd_varie;
unsigned long int time_reset_count;
// -------------------variabili bool per l'attivazione della procedura di setup----------------------------
int onsetup =0;
// -------------------variabili per la gestione dei valori di setup della temperatura-------------------------
int setup_fer = 22;
int setup_forno = 22;
int lcd_key     = 0;
int cont=0;
// -------------------associazione dei relè alle uscite---------------------
int rele1 = a2;
int rele2 = a3;
int rele3 = a4;
int rele4 = a5;
// -------------------variabili per la lettura dei sensori di temperatura------------------
float temp_fer;
float temp_forno;
float temp_telo1;
float temp_telo2;
float temp_amb;
dallastemperature sensors(&onewire);//inizzializzo la libreria dallas
// -------------------seriali dei sensori dallas---------------------
deviceaddress fermentatore = { 0x28, 0x2f, 0x3c, 0x7e, 0x02, 0x00, 0x00, 0xdb };
deviceaddress forno =        { 0x28, 0xac, 0x96, 0x38, 0x02, 0x00, 0x00, 0x0f };
deviceaddress ambiente =     { 0x28, 0xb8, 0x4d, 0x7e, 0x02, 0x00, 0x00, 0x4f };
deviceaddress telo1 =        { 0x28, 0x1c, 0x71, 0x38, 0x02, 0x00, 0x00, 0x83 };
deviceaddress telo2 =        { 0x28, 0xe9, 0x9f, 0x38, 0x02, 0x00, 0x00, 0x62 };
void setup(void)
{
lcd.begin(20,4);//inizzializzo la libreria del'lcd
sensors.begin();
  // -------------sincronizzazione delle variabili per il multitasking--------------------
time_temperature=millis();
time_lcd_fer=millis();
time_lcd_forno=millis();
time_lcd_varie=millis();
time_reset_count=millis();
// -------------------definisco pin di input ed output---------------------
pinmode (a1, input); // pin analogico configurato come out digitale
pinmode (rele1, output); // pin analogico configurato come out digitale
pinmode (rele2, output); // pin analogico configurato come out digitale
pinmode (rele3, output); // pin analogico configurato come out digitale
pinmode (rele4, output); // pin analogico configurato come out digitale
// -------------------associo ad ogni sensore un nome univoco---------------------
sensors.setresolution(fermentatore, 10);
sensors.setresolution(forno, 10);
sensors.setresolution(ambiente, 10);
sensors.setresolution(telo1, 10);
sensors.setresolution(telo2, 10);
// -------------------messaggio di benvenuto---------------------
lcd.clear();
lcd.setcursor(0, 0);
lcd.print("birrificazione");
lcd.setcursor(0, 1);
lcd.print("by peppino");
lcd.setcursor(0, 2);
lcd.print("inizzializzazione");
lcd.setcursor(0, 3);
lcd.print("attendere prego");
delay(2000);
}
//------gestione stampa simbolo °c------------------------------------------------------------------
void st_char(){
lcd.print(" ");
lcd.print( (char) 223 );   // stampa '°'
lcd.print("c");
}
//------gestione ed associazione della lettura delle temperatura e dei relè---------------------------------
void temperature()
{
sensors.requesttemperatures();
temp_fer = sensors.gettempc(fermentatore);   
temp_forno = sensors.gettempc(forno);
temp_telo1 = sensors.gettempc(telo1);
temp_telo2 = sensors.gettempc(telo2);
temp_amb = sensors.gettempc(ambiente);
//------gestione relè fermentatore-----------------------------------
delay (30);
if (temp_fer > setup_fer || temp_fer == -127.00){
digitalwrite(rele4,low);
} else {
digitalwrite(rele4,high);
}
//------gestione relè forno-----------------------------------------
delay (30);
if (temp_forno > setup_forno  || temp_fer == -127.00)  {
digitalwrite(rele3,low);
} else {
digitalwrite(rele3,high);
}
}
void loop(void)
{
//-------eseguo la procedura di lettura delle temperature e gestione relè ogni secondo---------------------------------------------- 
time=millis();
if(time>time_temperature+1000){
temperature();
time_temperature=millis();
}
lcd_key=analogread(0);
//--eseguo l'aggiornamento dei valori lcd ogni 2 secondi ma solo se sono fuori della procedura di setup----
if (onsetup==0){//verifica se sono fuori della procedura di setup
if (time>time_lcd_fer+2000 && cont==0){ //eseguo l'aggiornamento dei valori del fermentatore sull'lcd ogni 2 secondi
lcd.clear();
lcd.setcursor(0, 0);
lcd.print("temp. fermentatore: ");
if (temp_fer == -127.00) {
lcd.setcursor(0, 1);
lcd.print("non rilevata");
lcd.setcursor(0, 2);
lcd.print("verificare sensore");
lcd.setcursor(0, 3);
lcd.print("e connes. elettriche");
} else {
lcd.setcursor(0, 1);
lcd.print("rilevata:  ");
lcd.print(temp_fer);
st_char();
lcd.setcursor(0, 2);
lcd.print("preset:    ");
lcd.print(setup_fer);
st_char();
lcd.setcursor(0, 3);
if (temp_fer > setup_fer) {
lcd.print("stato rele off");
} else {
lcd.print("stato rele on ");
}
}
delay(2000);
time_lcd_fer=millis();
cont=1;
}
//-------forno-------------------------------------------------------------- 
if(time>time_lcd_forno+4000 && cont==1){ //eseguo l'aggiornamento dei valori del forno sull'lcd ogni 2 secondi
lcd.clear();
lcd.setcursor(0, 0);
lcd.print("temp. forno: ");
lcd.setcursor(0, 1);
if (temp_forno == -127.00) {
lcd.setcursor(0, 1);
lcd.print("non rilevata");
lcd.setcursor(0, 2);
lcd.print("verificare sensore");
lcd.setcursor(0, 3);
lcd.print("e connes. elettriche");
} else {
lcd.setcursor(0, 1);
lcd.print("rilevata:  ");
lcd.print(temp_forno);
st_char();
lcd.setcursor(0, 2);
lcd.print("preset:    ");
lcd.print(setup_forno);
lcd.print(" ");
lcd.print( (char) 223 );   // stampa '°'
lcd.print("c");
lcd.setcursor(0, 3);
if (temp_forno > setup_forno) {
lcd.print("stato rele off");
} else {
lcd.print("stato rele on ");
}
}
time_lcd_forno=millis();
cont=2;
}
//-------telo1 & telo2 ed ambiente-------------------------------------------------------------- 
if(time>time_lcd_varie+6000 && cont==2){ //eseguo l'aggiornamento dei valori dei teli sull'lcd ogni 2 secondi
lcd.clear();
lcd.setcursor(0, 0);
lcd.print("teli riscaldanti : ");
lcd.setcursor(0, 1);
if (temp_telo1 == -127.00) {
lcd.print("telo 1 non rilevata.");
} else {
lcd.print("telo 1:   ");
lcd.print(temp_telo1);
st_char();
}
lcd.setcursor(0, 2);
if (temp_telo2 == -127.00) {
lcd.print("telo 2 non rilevata.");
} else {
lcd.print("telo 2:   ");
lcd.print(temp_telo2);
st_char();
}
//-------ambiente-------------------------------------------------------------- 
lcd.setcursor(0, 3);
lcd.print("ambiente");
lcd.setcursor(10, 3);
if (temp_amb == -127.00) {
lcd.print("non rilev.");
} else {
lcd.print(temp_amb);
st_char();
}
time_lcd_varie=millis();
}
if (time>time_reset_count+8000){
cont=0;
time_reset_count=millis();
}
}
//---------------tasto select---------------------------------------
  if (lcd_key<50){
     onsetup==1; 
     lcd.clear();
} 
//---------------programmazione valori---------------------------------------
  if (onsetup==1){
     lcd.setcursor(0, 0);
     lcd.print("prog. parametri");
     lcd.setcursor(0, 1);
     lcd.print("fermentatore: ");
     lcd.print(setup_fer);
     st_char();
     lcd.setcursor(0, 2);
     lcd.print("forno:        ");
     lcd.print(setup_forno);
     st_char();
//---------------tasto + fermentatore---------------------------------------
}
//------------------------------------------------------------------------
}



Arduino Forum > International > Italiano > Generale (Moderator: leo72) > Accesso a menu personalizzato


arduino

Comments

Popular posts from this blog

Qualcuno mi sa dire perchè non va questo protocollo seriale ?

Prezzemolo!

play video