Go Down

Topic: termostato semplice... per iniziare (Read 2 times) previous topic - next topic

marinaio67

Salve a tutti... per cominciare a capire qualcosa di arduino vorrei realizzare un termostato... ho preso una DS18B20 e un display LCD e li ho collegati ad arduino seguendo alcuni schemi che ho trovato , infine ho collegato un led che simula l'attivazione del carico... poi ho trovato alcuni sketch e ne ho tratto uno semplice che fa la lettura della temperatura , me la invia al display e alla temparatura di 20° mi accende il led... tutto ok fin qui , adesso vorrei aggiungere due pulsanti che mi facciano variare la temperatura di accenzione del led... e qui comincio ad avere un pò di difficoltà... vi metto lo sketch che ho fatto , spero che qualcuno riesca ad indirizzarmi... ciao e grazie
Code: [Select]
/*
prova.ino
Misurazione della temperatura
invio a display LCD e accenzione led a 20° C

*/

#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>


int LED=7;                 //Pin7 = LED

// linea dati DS18B20 al pin 10 di Arduino
#define ONE_WIRE_BUS 10

// Imposta la comunicazione oneWire per comunicare
// con un dispositivo compatibile
OneWire oneWire(ONE_WIRE_BUS);

// Passaggio oneWire reference alla Dallas Temperature.
DallasTemperature sensors(&oneWire);

// RS RW EN D4 D5 D6 D7
LiquidCrystal lcd(12, 11, 6, 5, 4, 3, 2);



void setup()

{
  // Start up the library
  sensors.begin();
  // Imposta il valore di righe e colonne del display LCD
  lcd.begin(16, 2);
lcd.clear();
 
 
 
 
  pinMode(LED, OUTPUT);   //LED set to output
   
 
}



void loop(void)
{

 
 
if (sensors.getTempCByIndex(0) >= 20)                        //temperatura maggiore o uguale a 20 led acceso
  {
    digitalWrite (LED, HIGH);         //led acceso
  }
  else if (sensors.getTempCByIndex(0) <= 20)                //temperatura minore o uguale a 20 led spento
  {
    digitalWrite (LED, LOW);      //led spento
   
}

sensors.requestTemperatures(); // Invia il comando di lettura delle temperatura
  //lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("  Temperatura");
  lcd.setCursor(4, 1);
  lcd.print (sensors.getTempCByIndex(0));
  lcd.print (" C");
}

PaoloP

Al posto del valore 20, metti una variabile che chiamerai, ad esempio, soglia.
Aggiungi il codice necessario in modo che la variabile soglia premendo un pulsante incrementi mentre premendo il secondo decrementi.
Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

marinaio67

Qualche chiarimento... Posso dare un valore a questa soglia (ad esempio 20 gradi) in modo che se va via la corrente ritorni l'impostazione di base ? Com'è la sintassi per l'incremento e per il decremento ? Devo aggiungere delle librerie ? Scusa ma sono proprio in confusione...

PaoloP

Si.
Come tutte le variabili, durante l'inizializzazione gli può essere attribuito un valore.
Code: [Select]
int soglia = 20;

Devi leggere i pulsanti con il digitalRead come in questo tutorial --> http://www.arduino.cc/en/Tutorial/Pushbutton
e invece di accendere il led incrementi la variabile semplicemente con
Code: [Select]
soglia++;
o la decrementi con
Code: [Select]
soglia--;
Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

marinaio67

Aggiornamento... sono riuscito a fare ciò che mi ero proposto , però ci sono dei malfunzionamenti... intanto il led si accende e si spegne con un certo ritardo (non so se il delay che ho messo in fondo per LCD può interferire... ho detto una bischerata ? ) e poi anche i pulsanti UP e DOWN non rispondono subito , per fare alzare o abbassare la soglia di 1 grado devo premere i pulsanti ripetutamente... questo il codice... mi sfugge qualcosa ?
Code: [Select]
/*
prova.ino
Misurazione della temperatura
invio a display LCD e accenzione led a 23° C

*/

#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>


int LED=7;                 //Pin7 = LED
int SOGLIA=23;              // imposta la temperatura iniziale a 23°C
const int inPinU = 30;   // Pin30 = pulsante UP
int valU = 0;     
int valUltimoU = 0;   
const int inPinD = 31;   // Pin31 = pulsante DOWN
int valD = 0;   
int valUltimoD = 0;     


// linea dati DS18B20 al pin 10 di Arduino
#define ONE_WIRE_BUS 10

// Imposta la comunicazione oneWire per comunicare
// con un dispositivo compatibile
OneWire oneWire(ONE_WIRE_BUS);

// Passaggio oneWire reference alla Dallas Temperature.
DallasTemperature sensors(&oneWire);

// RS RW EN D4 D5 D6 D7
LiquidCrystal lcd(12, 11, 6, 5, 4, 3, 2);



void setup()

{
  // Start up the library
  sensors.begin();
  // Imposta il valore di righe e colonne del display LCD
  lcd.begin(16, 2);
lcd.clear();
 
 
 
 
  pinMode(LED, OUTPUT);   //LED set to output
  pinMode(inPinU, INPUT);    // dichiaro che il pulsante UP è un ingresso
  pinMode(inPinD, INPUT);    // dichiaro che il pulsante DOWN è un ingresso 
 
}



void loop(void)
{

 
 
if (sensors.getTempCByIndex(0) >= SOGLIA)                        //temperatura maggiore o uguale a SOGLIA led acceso
  {
    digitalWrite (LED, HIGH);         //led acceso
  }
  else if (sensors.getTempCByIndex(0) <= SOGLIA)                //temperatura minore o uguale a SOGLIA led spento
  {
    digitalWrite (LED, LOW);      //led spento
   
}

valUltimoU = valU;
valU = digitalRead(inPinU);  // legge lo stato del pulsante UP
  if(valUltimoU == HIGH && valU == LOW) 
  {
    SOGLIA++;
    Serial.println(SOGLIA);
  }
  valUltimoD = valD;
valD = digitalRead(inPinD);  // legge lo stato del pulsante DOWN
  if(valUltimoD == HIGH && valD == LOW) 
  {
    SOGLIA--;
    Serial.println(SOGLIA);
  }

sensors.requestTemperatures(); // Invia il comando di lettura delle temperatura
  //lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("  Temperatura");
  lcd.setCursor(4, 1);
  lcd.print (sensors.getTempCByIndex(0));
  lcd.print (" C");
  delay(3000); // wait 3000ms
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("  Soglia");
  lcd.setCursor(4, 1);
  lcd.print (SOGLIA);
  lcd.print (" C");
  delay(3000); // wait 3000ms
  lcd.clear();
}

Go Up