Falsare lettura temperatura dht11

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 :wink:

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 ... ::slight_smile:

Guglielmo

gpb01:
SI ... credevo che la spiegazione al link che ti ho messo fosse esauriente ... ::slight_smile:

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