salvare in eeprom

buona sera a tt
dopo 2 giorni il mio termostato funziona abbastanza bene pero servono alcuni ritocchi
quando la temperatura sta per salire o scendere il rele attacca e stacca come faccio ad eliminare questo problema
e poi come faccio per salvare nell eeprom la temperatura impostata in modo che se si ha una mancata alimentazione ricordi la variabile ???
secondo voi il codice è fatto bene o potrebbe essere migliorato o ottimizzato??

ecco il codice

#include <dht11.h>
dht11 DHT;
#define DHT11_PIN 31
#include <LiquidCrystal.h>


LiquidCrystal lcd(8,9,4,5,6,7);
const int buttonPin = 22;
const int buttonPin2 = 33;// the number of the pushbutton pin
int buttonState;  
int buttonState2;// the current reading from the input pin
int lastButtonState = LOW;
int lastButtonState2 = LOW;// the previous reading from the input pin
int olo = 25;
long lastDebounceTime = 0;
long lastDebounceTime2 = 0;// the last time the output pin was toggled
long debounceDelay = 50;
long debounceDelay2 = 50 ;// the debounce time; increase if the output flickers

void setup() {
  lcd.begin(16, 2);
pinMode(buttonPin, INPUT);
pinMode(buttonPin2,INPUT);
pinMode(49,OUTPUT);
Serial.begin(9600);
}
void loop() { 
  int reading = digitalRead(buttonPin);
  if (reading != lastButtonState) {
    lastDebounceTime = millis(); } 
  if ((millis() - lastDebounceTime) > debounceDelay) {
    if (reading != buttonState) {
      buttonState = reading;
      if (buttonState == HIGH) { (olo++);}}}
  lastButtonState = reading;


  int reading2 = digitalRead(buttonPin2);
  if (reading2 != lastButtonState2) {
    lastDebounceTime2 = millis(); } 
  if ((millis() - lastDebounceTime2) > debounceDelay2) {
    if (reading2 != buttonState2) {
      buttonState2 = reading2;
      if (buttonState2 == HIGH) { (olo--);  
  
       
      }
    }
  } int chk = DHT.read(DHT11_PIN);
  delay(18);
  lcd.setCursor(0, 1);
int temp =  DHT.temperature;delay(18);
  lcd.print( DHT.temperature);
  lcd.print("C' ");
  lcd.print(DHT.humidity);delay(18);lcd.print("%   ");lcd.print(olo);
  if(temp>=olo){digitalWrite(49,LOW);}
  else{digitalWrite(49,HIGH);}delay(20);
  
  
lastButtonState2 = reading2;



}
#include <dht11.h>
#include <LiquidCrystal.h>

#define DHT11_PIN 31

dht11 DHT;
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

const int buttonPin = 22;
const int buttonPin2 = 33;// the number of the pushbutton pin
const int rele = 49;
int buttonState;
int buttonState2;// the current reading from the input pin
int lastButtonState = LOW;
int lastButtonState2 = LOW;// the previous reading from the input pin
int olo = 25;
long lastDebounceTime = 0;
long lastDebounceTime2 = 0;// the last time the output pin was toggled
long debounceDelay = 50;
long debounceDelay2 = 50 ;// the debounce time; increase if the output flickers

void setup() {
  lcd.begin(16, 2);
  pinMode(buttonPin, INPUT);
  pinMode(buttonPin2, INPUT);
  pinMode(rele, OUTPUT);
  Serial.begin(9600);
  CheckEeprom();
} // End Setup

void loop() {
  int reading = digitalRead(buttonPin);
  int reading2 = digitalRead(buttonPin2);
  int chk = DHT.read(DHT11_PIN);
  int T =  DHT.temperature;
  int H =  DHT.humidity;
  delay(18);

  if (reading != lastButtonState) lastDebounceTime = millis();
  if ((millis() - lastDebounceTime) > debounceDelay) {
    if (reading != buttonState) {
      buttonState = reading;
      if (buttonState == HIGH) {
        olo++;
        UpdateEeprom();
      }
    }
  }
  lastButtonState = reading;

  if (reading2 != lastButtonState2) lastDebounceTime2 = millis();
  if ((millis() - lastDebounceTime2) > debounceDelay2) {
    if (reading2 != buttonState2) {
      buttonState2 = reading2;
      if (buttonState2 == HIGH) {
        olo--;
        UpdateEeprom();
      }
    }
  }
  lastButtonState2 = reading2;

  lcd.setCursor(0, 1);
  lcd.print(T); lcd.print("C' "); lcd.print(H); lcd.print("%   "); lcd.print(olo);

  if (T >= olo)
    digitalWrite(rele, LOW);
  else
    digitalWrite(rele, HIGH);
} // End Loop


void CheckEeprom()
{
  //
}


void UpdateEeprom()
{
  //
}

Naturalmente è da terminare la parte relativa alla memorizzazione su EEprom. :grin:
CheckEeeprom deve controllare se è presente in eeprom un valore, altrimenti lo scrive.
UpdateEeprom aggiorna il valore solo quando viene aggiornato anche la variabile olo.
Cosi dovresti risparmiare cicli utili di scritture dalla EEprom.
Le funzioni da implementare le trovi qui --> http://arduino.cc/en/Reference/EEPROM

Cerca di ordinare il codice anche visivamente. Usa la funzione di formattazione automatica dell'IDE (menu strumenti).

e per il problema del rele ??
inutile dirti che con l eeprom ho capito niente
l indirizzo che cos è e perche ogni volta deve essere aumentato

michaelferrara:
quando la temperatura sta per salire o scendere il rele attacca e stacca come faccio ad eliminare questo problema

Non riesco a capire cosa intendi. Il codice di controllo è un IF quindi quanto la temperatura è uguale o maggiore il relè è disattivato altrimenti viene attivato.
Più che altro come ha collegato il relè? e' un modulo già pronto o l'hai fatto tu?

Riguardo la Eeprom, l'indirizzo è la locazione di memoria in cui puoi memorizzare i dati. Sulla UNO ne hai 512.
Non c'è bisogno di incrementarle ogni volta. Basta che scegli un indirizzo dove memorizzare il dato.
Ricorda che puoi leggere infinite volte dalla Eeeprom ma scriverla solo 100'000 volte circa.

Dovresti per prima cosa inizializzare una variabile address

int address = 0;

poi controllare se ade esempio c'è un valore predefinito, se presente leggi olo dall'indirizzo sucessivo, se non c'è allore scrivi il valore di controllo e anche olo.
Ad esempio

 byte value = EEPROM.read(address);
  if (value == 33)
  {
    olo = EEPROM.read(address+1);
  }
  else
  {
    EEPROM.write(address, (byte)33);
    EEPROM.write(address+1, (byte)olo);
  }

Devi però inserire un codice di controllo perché il valore scritto nella Eeprom deve essere compreso tra 0 e 255, quindi ti conviene trasformare olo in byte e verificare che non superi 255 o diventi negativo.

Metti un pò di isteresi, altrimenti è normale che quando i valori sono vicini a "olo" il relè stacca e attacca di continuo... Per esempio puoi mettere che il relè è on quando la temperatura è uguale o minore di "olo" e diventa off quando la temperatura è uguale o maggiore a "olo+1".