Ciao a tutti,
Io utilizzo un sensore temperatura dht11 tramite il quale il software fà delle azioni sopra o sotto una temperatura impostata da me.
Io vorrei poter variare quella temperatura "al volo" senza andare a programmare da pc.
Una bella cosa sarebbe usare tasti e un display per impostare e visualizzare la temperatura, ma avendo solo 1pin digitale e tutti gli analogici liberi non so come fare.
Ho pensato, ma non so se è possibile, usare un potenziometro per "sballare" il segnale del sensore. È fattibile o c'è un modo migliore?
A me interessa poterla variare di +3 -3 senza precisione assoluta.
Grazie
Usa un diplay LCD collegalo in I2C ... sono solo due pin ... sulla UNO A4 ed A5.
Guglielmo
P.S. In ogni caso, ogni pin, prima di essere un pin analogico è un pin digitale (salvo alcune accezioni che NON riguardano la UNO). Maggiori dettagli QUI
ci sono modi migliori
per cominciare non falsare la lettura, quella tienila buona, cambia la soglia del tuo termometro
i pin analogici li puoi usare come digitali, semplicemente fai la pinmode, ed acco che da 1 sei passato a 7 pin liberi
comunque puoi anche, usando una rete di resistenze "interpretare" un ingresso analogico come alcuni (tipicamente 4) pulsanti digitali,
ci sono esempi, dopo te ne cerco uno
oppure puoi collegare un potenziometro ad un ingresso analogico e "leggerne" la posizione, e usare quella, tipicamente con la funzione map() per impostare la soglia
posta il codice, che si vede....
Io la vedo semplice, senza particolari modifiche hardware. Vuoi cambiare una temperatura (non ho capito se quella di sensore o quella di soglia)? Forzala.
É sufficiente aggiungere un pulsante sull'ultimo pin digitale, scrivere una funzione che conti le pressioni del pulsante entro un range (se vuoi precisione 1 grado allora il range é da di 7 elementi).
Alla temperatura usata viene aggiunto il risulato di tale funzione, he é questa:
char Forzatura()
{
return (((contatorepressioni+Premuto (pulsante))%8)-3);
}
Dove Premuto é una funzione che restituisce 1 se il pulsante é premuto (utile per sstemare debounce sw o pullup) e contatorepressioni é una byte globale.
Può essere soluzione?
ah, quindi va interpretato che non ha ancora il display....
comunque se guardi qui, sai come collegare N pulsanti a un solo ingresso analogico
http://www.pighixxx.net/portfolio-items/multiple-button-using-1-analog-input/?portfolioID=610
Grazie a tutti per le risposte, effettivamente mi avete illuminato! Quindi io potrei usare un display con i2c in cui vado ad esempio a visualizzare:
Stato sistema
Temperatura rilevata
Temperatura di soglia
E poi sempre sui pin analogici metto due tasti, +1 e -1 che mi vanno a cambiare il valore della variabile, giusto?
Il codice non riesco a metterlo adesso perché sono da cellulare, lo metto domani
Grazie
giusto, occhio solo ai rimbalzi (bounce) sui tasti
metti un buon sistema di debounce
sto dando un occhio ai display, sono indeciso se prendere il classico lcd 16x2 o oled da 0.96 pollici.
non avendo mai usato un display quale mi consigliate? in facilità di programmazione.
io devo mettere tre info:
stato sistema "acceso" "manuale" "spento"
temperatura ambiente (che la leggerà dal sensore"
tmperatura impostata (che sarà la variabile che vado a modificare con i tasti)
usando il 16x2 posso mettere due info nella stessa riga?
tipo:
automatico
temp:23° lim:25°
quando io andrò a variare una scritta, tipo passare da automatico a manuale, o il 25 farlo diventare 26, devo riscrivere tutto o posso dirgli il punto esatto dello schermo in cui deve andare a scrivere senza ridire tutto quanto?
vale anche per lo schermo oled?
grazie
vi metto qui lo sckech visto che me lo avevate chiesto
#include <DHT.h> //libreria sensore temperatura
#include <StepperMotor.h>//libreria motore passopassp
#define DHTPIN 13 // pin di arduino a cui connetto il sensore
#define DHTTYPE DHT11 //definizione modello sensore
DHT dht(DHTPIN, DHTTYPE); // associazione parametri sensore temperatura
int stato; //per funzione relè
int val=27; // temperatura da mantenere (MODIFICABILE A PIACIMENTO)
int intervallo=5000; //tempo tra 2 letture in millisecondi (MODIFICABILE A PIACIMENTO)
int tempomanuale=15000; //tempo durata riscaldamento manuale (MODIFICABILE A PIACIMENTO)
int temp; //variabile temperatura
int ledstato = 3; //led giallo di notifica (spento=sitema a riposo) (acceso=sistema attivo) (fadein fadeout statomanuale a tempo) (lampeggiante= anomalia posizione motore)
int ledmovimento = 2; //modulo lampeggiante su relè (led rosso)
int rele = 4; //relè riscaldamento
int startcentrale = 5; //comando da antifurto per avvio sistema
int finecorsa = 6; //finecorsa per motore passopasso
int riarmo = 7; //pulsante per spegnere il sistema
int _PIN1 = 8; //pin motore
int _PIN2 = 9; //pin motore
int _PIN3 = 10; //pin motore
int _PIN4 = 11; //pin motore
int punto0 = 0; //variabile per reset motore
int statoprec = 0; //variabile stato precedente
unsigned long timeout; //tempo di accensione riscaldamento manuale
unsigned long iniziomanuale; //variabile per temporizzatore manuale
int brightness = 0; // luminosità led a 0 alla partenza fadein
int fadeAmount = 5; // velocità fadein
bool fadein =false; //definizione stato fade-in
StepperMotor stepper(_PIN1, _PIN2, _PIN3, _PIN4); //assegnazione pin motore
unsigned long tempinterval; //intervallo tra 2 letture di temperatura
bool blinking = false; //definizione stato per lampeggio
unsigned long blinkInterval = 110; // millisecondi di lampeggio
unsigned long currentMillis; // variabile per lampeggio
unsigned long previousMillis; //variabile per lampeggio
void setup()
{
pinMode(startcentrale, INPUT_PULLUP); //pulsante avvio sistema
pinMode(finecorsa, INPUT_PULLUP); //pulsante lampeggio movimento/reset motore
pinMode(riarmo, INPUT); //pulsante touch riarmo
pinMode(ledstato, OUTPUT); // led stato sistema prenotato
pinMode(rele, OUTPUT); //relè riscaldamento
pinMode(ledmovimento, OUTPUT); //relè led lampeggio movimento
stato=0; //per funzione relè
pinMode(DHTPIN, INPUT); // sensore temperatura
stepper.setPeriod(1); //velocità motore passopasso in millisecondi (1 massimo)
digitalWrite (rele, HIGH); //stato relè spento ad accensione
digitalWrite (ledmovimento, LOW); //stato relè lampeggio led rosso spento
pinMode(_PIN1, OUTPUT); //pin motore
pinMode(_PIN2, OUTPUT); //pin motore
pinMode(_PIN3, OUTPUT); //pin motore
pinMode(_PIN4, OUTPUT); //pin motore
tempinterval=millis(); //variabile per i timer
Serial.begin(9600); // inizializzo la comunicazione seriale
dht.begin(); // inizializzo la comunicazione del sensore temperatura
digitalRead (finecorsa); //lettura pulsante finecorsa
punto0 = digitalRead(finecorsa); //variabile per reset iniziale
digitalWrite (ledmovimento, HIGH); //accensione led lampeggio rosso
stepper.move (1700); //leggero allontanamento da finecorsa
while (punto0 ==HIGH) //riposizionamento a punto 0 se il finecorsa non è premuto
{
Serial.println(" azzeramento in corso ");
stepper.move (-200);
delay (1);
punto0 = digitalRead(finecorsa); //controllo stato finecorsa
}
stepper.stop ();
digitalWrite (ledmovimento, LOW); //spegnimento led movimento
Serial.println(" azzeramento eseguito ");
}
void loop()
{
currentMillis = millis();
if ((unsigned long)(currentMillis) > tempinterval+intervallo) { //lettura temperatura ogni 5000 millisecondi
//float h = dht.readHumidity(); //lettura umidita
temp = dht.readTemperature(); //lettura temperatura
Serial.print("Temperatura: ");
Serial.print(temp);
Serial.println(" *C");
tempinterval=millis();
}
{
// codice per fade in su stato MANUALE
if (fadein) {
analogWrite(ledstato, brightness); //imposto uscita con funzione analogica
brightness = brightness + fadeAmount; //aumento luminosità
if (brightness == 0 || brightness == 255) { //diminuzione luminosità
fadeAmount = -fadeAmount ;
}
delay(30);
}
}
if (stato==2) // condizione funzione manuale attivo
fadein=true; // start lampeggio
else
fadein=false; // stop lampeggio
//fine codice fade in
// codice per lampeggio
if (blinking) {
if ((unsigned long)(currentMillis - previousMillis) >= blinkInterval) { //calcolo tempo per lampeggio anomalia motore
digitalWrite((ledstato), !digitalRead((ledstato))); // led giallo
previousMillis = currentMillis; // sets the time we wait "from"
}
}
int reading = digitalRead(finecorsa); //lettura stato finecorsa
if (reading==HIGH) // condizione a finecorsa non premuto
blinking=true; // start lampeggio
else
blinking=false; // stop lampeggio
//fine codice lampeggio
if (digitalRead(startcentrale)==0 and stato==0) //funzione per effetto relè
{
Serial.println("stato=1"); //stato automatico attivo
stato=1;
}
else if (digitalRead(riarmo)==1 and stato!=0)
{
Serial.println("stato=0"); //stato spento attivo
stato=0;
delay(800);
}
else if (digitalRead(riarmo)==1 and statoprec==0) //funzione relè manuale a tempo
{
Serial.println ("stato=2"); //stato manuale temporizzato attivo
stato=2;
delay (1000);
}
if (stato==1) //accensione
{
if ((digitalRead(finecorsa) ==LOW) && (stato == 1) &&(ledmovimento==LOW))
{
digitalWrite(ledstato, HIGH); //accensione led notifica
}
if (temp<val) //temperatura di mantenimento
{
digitalWrite (rele, LOW); //accensione relè
}
else
{
digitalWrite (rele, HIGH); //spegnimento relè
}
if ((stato != statoprec) && stato == 1 && statoprec != 2) //funzione per avviamento motore chiudiporta
{
Serial.print("avviamento motore");
digitalWrite (ledmovimento, HIGH); //accensione led lampeggiante)
stepper.move (20480);
delay (10);
stepper.move (20480);
delay (10);
// stepper.move (20480);
//delay (10);
//stepper.move (10480);
//delay (10);
punto0 = digitalRead(finecorsa); //variabile per battuta finecorsa
while (punto0 ==HIGH) // ritorno fino a pressione finecorsa
{
Serial.println(" ritorno in posizione di riposo ");
stepper.move (-200);
delay (1);
punto0 = digitalRead(finecorsa);
}
stepper.stop ();
digitalWrite (ledmovimento, LOW); //spegnimento led movimento
digitalWrite (ledstato, HIGH); //accensione led stato prenotato
Serial.println(" riposizionamento eseguito ");
statoprec = 1;
}
}
if (stato==0) //riarmo sistema
{
if ((digitalRead(finecorsa) == LOW) && (stato == 0))
{
digitalWrite(ledstato, LOW); //spegnimento led notifica
}
digitalWrite(rele, HIGH); //spegnimento relè riscaldamento
statoprec = 0;
timeout=millis();
}
if (stato==2) //funzione riscaldamento mezza stagione a tempo
{
iniziomanuale=millis();
if (temp<val) //temperatura di mantenimento
{
digitalWrite (rele, LOW); //accensione relè
}
else
{
digitalWrite (rele, HIGH); //spegnimento relè
}
if ((unsigned long)(iniziomanuale) > timeout+tempomanuale) //tempo massimo riscaldamento
{
Serial.println(" tempo scaduto ");
stato=0;
timeout=millis();
}
}
if ((stato==2) and digitalRead(startcentrale)==0) //passaggio da manuale ad automatico in caso di "chiamata da remoto"
{
Serial.println ("prenotato");
statoprec= 2;
stato=1;
}
delay (10);// attesa per migliorare la fluidità del programma
}
Usa un normale LCD ... i display grafici sono più pesanti sotto il profilo risorse , librerie e richiedono più memoria. Per quello che devi visulalizzare tu, un LCD va più che bene
Guglielmo
perfetto grazie
sto guardando un po di tutorial,non sebra difficile usarlo, ma tutti danno come punto di scrittura 0,0 o 0,1
posso anche dargli 5,1 o 11,1 per scrivere in un punto che non è l'inizio dello schermo?
Puoi dare le coordinate che vuoi, il cursore li si posiziona ed inizia a scrivere.
Guglielmo
Ciao, se hai problemi di spazio usa un LCD 20x04 tipo questo puoi scrivere su quattro righe. Y 0,1,2,3 , X da 0 a 20...
prima di fare danni chiedo:
per utilizzare i pin analogici come ingressi (per i due pulsanti) mi comporto come per i pin digitali?
ovvero,
pinMode (A0, INPUT_PULLUP)
digitalRead (A0)
e così via?
e il collegamento elettrico identico?
grazie
p.s.come da voi suggerito ho optato per l'lcd 16x2, il 20x4 è troppo grande per lo spazio che ho.
SI ... credevo che la spiegazione al link che ti ho messo fosse esauriente ... :
Guglielmo
gpb01:
SI ... credevo che la spiegazione al link che ti ho messo fosse esauriente ... :Guglielmo
Grazie!
Avevo letto si, ma lì parla di più pulsanti sullo stesso ingresso, io ne metterò 1 per ingresso così il progetto è più "pulito" se devo riprenderlo in mano in un futuro.
acuplush:
... lì parla di più pulsanti sullo stesso ingresso ...
Ehhhhh :o :o :o ? ? ? ... io parlo di QUESTO mio post, NON d'altro !!!
Guglielmo
gpb01:
Ehhhhh :o :o :o ? ? ? ... io parlo di QUESTO mio post, NON d'altro !!!Guglielmo
Scusa quel link mi era sfuggito, avevo visto quello dell'utente standardoil