Buonasera sono nuovo,
sto facendo un progetto per regolare la temperatura di un ambiente, ma voglio che la temperatura desiderata venga inserita aumentandola o diminuendola con due pulsanti up e down.
Il codice in questione è questo:
int sets=2;
int set=0;
int set1=0;
int ups=4;
int up=0;
int up1=0;
int downs=6;
int down=0;
int down1=0;
int setting=0;
void setup()
{
pinMode(sets, INPUT);
pinMode(ups, INPUT);
pinMode(downs, INPUT);
Serial.begin(9600);
}
void loop()
{
Serial.print("temp=");
Serial.println("set to set temp");
set=digitalRead(sets);
if(set!=set1){
if(set==HIGH){
setting=1;
}
set1=set;
}
while(setting=1){
Serial.print("set temp");
Serial.println(tempset);
if(set!=set1){
if(set==HIGH){
setting=0;
}
set1=set;
}
if(up!=up1){
if(up==HIGH){
tempset++;
}
up1=up;
}
if(down!=down1){
if(down==HIGH){
tempset--;
}
down1=down;
}
}
L'incremento di una variabile con il doppio if da solo mi funziona, non capisco perchè inserito in un progetto non mi funziona, mentre premo uno dei tre pulsanti, il programma smette di stampare valori a schermo e poi continua a stampare lo stesso valore (non incrementato o decrementato di 1).
Che problema potrebbe essere?
Buonasera,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentartiIN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO ... Grazie.
Guglielmo
P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto.
Buongiorno,
mi scuso per non essermi presentato e ci tengo a precisare che ho letto tutto il regolamento, solo che forse ho interpretato male alcune parti e mi dispiace, spero di imparare e assimilare bene le regole con il tempo per evitare ulteriori errori.
Detto questo, ho fatto la mia presentazione e spero vada bene , attendo risposte in mio aiuto relative al mio problema.
Grazie mille e scusate, buona giornata a tutti.
La condizione del while è scritta male, manca un uguale così assegni il valore 1 alla variabile e il risultato di quest'operazione è sempre vero.
Poi dentro la while non hai letto i pulsanti quindi è normale che non incrementi/decrementi e nanche potresti uscire dal settaggio visto che non leggi neanche il pulsante set.
A mio parere il while non ti serve in quando già il loop principale assolve a tale funzione, tu dovresti fare una cosa del tipo:
Leggo il pulsante set, se premuto inverto lo stato (settaggio avviato o no), se esco dal settaggio allora salvo il valore impostato.
Se sono in settaggio allora leggo gli altri pulsanti e incremento/decremento in base se li ho premuti o no.
Buonasera, grazie dei consigli e mi scuso per l'ignoranza.
Ho apportato le modifiche che mi ha suggerito e ora funziona, il codice è ora:
int sens;
float temp;
int tempset=25;
//pulsanti
int sets=2;
int set=0;
int set1=0;
int ups=4;
int up=0;
int up1=0;
int downs=6;
int down=0;
int down1=0;
int setting=0;
void setup()
{
pinMode(sets, INPUT);
pinMode(ups, INPUT);
pinMode(downs, INPUT);
Serial.begin(9600);
}
void loop()
{
sens=analogRead(A0);
temp=sens*0.488;
Serial.print("temp=");
Serial.println(temp);
Serial.println("set to set temp");
set=digitalRead(sets);
if(set!=set1){
if(set==HIGH){
setting=1;
}
set1=set;
}
while(setting==1){
set=digitalRead(sets);
up=digitalRead(ups);
down=digitalRead(downs);
Serial.print("set temp");
Serial.println(tempset);
if(set!=set1){
if(set==HIGH){
setting=0;
}
set1=set;
}
if(up!=up1){
if(up==HIGH){
tempset++;
}
up1=up;
}
if(down!=down1){
if(down==HIGH){
tempset--;
}
down1=down;
}
}
}
Ho anche inserito un potenziometro che mi simula il sensore di temperatura (LM35) e tutto va come dovrebbe. Non ho ben capito che cosa intende nelle ultime due righe, o meglio non ho capito come fare tale cosa se non con un while.
Grazie mille
La funzione loop viene richiamata continuamente quindi in questo caso in cui serve fare due cose:
Aspettare che il set sia premuto
Se il set è stato premuto leggere i pulsanti per cambiare la temperatura e il set per terminare
Si può trasformare in una cosa del tipo:
void loop()
{
if(settaggio!=1)
{
//Lettura set per sapere se sto entrando in modalità settaggio
}
else
{
//Sono in modalità settaggio qui in pratica ci va tutto quello che c'è nel while
}
}
In questo modo ottieni il medesimo risultato con un piccolo vantaggio, questa è una piccola "macchina a stati finiti". Quando hai tempo e voglia cerca sul forum e/o su internet la cosa perché è molto utile in molti progetti.
Visto che sei all'inizio mi permetto di darti qualche suggerimento per ottimizzare il codice, sulle piccole MCU l'ottimizzazione è una parte importante.
Hai definito una serie di variabili per definire a quali pin sono collegate le varie cose, è uno spreco di memoria per due motivi, il primo è che hai usato un int che occupa due byte anziché il tipo byte che ne occupa uno.
Cerca sempre di usare il tipo più corretto Es. numeri da o a 255 usa un byte, se cerchi sul sito troverai i vari limiti per ciascun tipo.
Il secondo motivo è che è inutile occupare memoria con delle variabili per cose che non variano come potrebbe essere a che pin è collegato un pulsante. In questo caso puoi usare una costante
const byte pinSetButton = 2;
o alternativamente una define
#define PIN_SET_BUTTON 2
Stessa cosa per la variabile settings, può diventare un byte o, se deve avere due soli stati, ancora meglio una booleana in modo che puoi valutarla anche:
if(settings)
Ultima cosa che mi viene a mente così su due piedi usa nomi parlanti per le variabili e per le varie funzioni, se ti ritrovi a prendere mano ad un codice vecchio di mesi aiuta molto
E visto che sei all'inizio e qui non ne hai ancora avuto bisogno ma in futuro n avrai sicuramente necessità... rifuggi dall'uso della funzione delay all'inizio ti ammalia con la sua semplicità d'uso ma poi ti accorgerai che ti ha fregato perché tanto avrai necessità di pare più cose "assieme" e con il delya non potrai e ti troverai a dover ribaltare tutta la logica del codice per usare la logica che gira attorno alla funzione millis().
Impara sin da subito come usare tale funzione e usa il delay solo quando è davvero necessario e utile, per capire le basi con cui si usa millis() consiglio prima la lettura di QUESTO post esplicativo, dopo di che lo studio di come si usa la funzione millis(), prima QUI, poi QUI e QUI e QUI e tutti gli articoli che sono in QUESTA pagina ... alla fine il tutto dovrebbe essere più chiaro
Grazie mille per i consigli sul tipo di variabili e sulla funzione millis (di cui conosco di nome e ne so più o meno il principio di funzionamento ma che non ho mai usato) che sicuramente approfondirò.