Salvare massima temperatura(esempio) in SD

Salve a tutti! Vi espongo brevemente il problema: vorrei avere un codice in grado di salvare in sd la temperatura massima che si visualizza su display e fare in modo che se stacchi la corrente non perdi il dato acquisito. Insomma se la massima quando faccio girare il programma arriva a 22 gradi se stacco la corrente e poi rimetto non deve segnare un altro valore ma 22

L'SD è quella dell'ethernet shield, qui il codice:

#include <DS3232RTC.h>   
#include <SD.h>
#include <EEPROM.h>
#include <Time.h>
#include <Wire.h>
#include <BMP180.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#define sclk 13
#define mosi 11
#define cs   A3
#define dc   A1
#define rst  A2 
#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library
#include <SPI.h>
Adafruit_ST7735 tft = Adafruit_ST7735(cs, dc, rst);
#include "DHT.h"
#include <OneWire.h>
#include <DallasTemperature.h>
 // Data wire is plugged into pin 2 on the Arduino
#define ONE_WIRE_BUS 8
 // Setup a oneWire instance to communicate with any OneWire devices 
// (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
 // Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
DHT dht(5,DHT22); //Definisco il pin al quale è collegato il sensore e il tipo
const int chipSelect = 4;
float maxeeprom=-100;
File myFile;
File tempmax;


void setup() {
  Serial.begin(9600);
    tft.initR(INITR_BLACKTAB);
  uint16_t time = millis();
  tft.fillScreen(ST7735_BLUE);
  time = millis() - time;
  tft.setCursor (0,20);
  tft.setTextSize(2);
  tft.setTextColor (ST7735_GREEN);
  tft.print (" STAZIONE");
 tft.setCursor (10,40);
  tft.print ("  METEO:");
  delay (2000);
  tft.setTextColor (ST7735_YELLOW);
  tft.setCursor (4,80);
  tft.print ("SITUAZIONE  ATTUALE");
  SD.begin(chipSelect);
 
 File logFile = SD.open ("Temperatura.csv",FILE_WRITE);
 if (logFile)
 {
  String header = "Data, Ora, Temperatura, Temperatura Max";
  logFile.println(header);
  logFile.close();
  Serial.println(header);
 }

tempmax = SD.open("max.txt", FILE_WRITE);
if (tempmax) {
tempmax.print(maxeeprom);
tempmax.close();
 }
 tempmax=SD.open("max.txt");
 if (tempmax) {
   while (tempmax.available()) {
 Serial.write(tempmax.read());
 
      }
         tempmax.close();
     }           
 
setSyncProvider(RTC.get);
 sensors.begin();
  Wire.begin();
  }

void loop() {
  sensors.requestTemperatures();
  sensors.getTempCByIndex(0);
  if (sensors.getTempCByIndex(0)>maxeeprom)
  {
    maxeeprom=sensors.getTempCByIndex(0);
 tempmax = SD.open("max.txt", FILE_WRITE);
  if (tempmax) {
   tempmax.print(maxeeprom);
    tempmax.close();
  }  

String dataString = String(year()) + "/" + String(month())+ "/" + String(day()) + "  " + String(hour()) + ":" + String(minute())+ ":" + String(second()) + "   " + String(sensors.getTempCByIndex(0));
   File dataFile = SD.open("datalog.txt", FILE_WRITE);
    if (dataFile) {
    dataFile.println(dataString);
    dataFile.close();
 Serial.println(dataString);
tft.fillScreen(ST7735_BLACK);
  tft.setTextColor (ST7735_GREEN);
   tft.setCursor(0, 0);
  tft.setTextSize(1);
  tft.println(maxeeprom);
  }

    }
}

... perché impazzire con la SD ? ... per queste piccole cose, è molto più pratico usare la EEPROM :wink:

Guglielmo

P.S.: Se proprio poi vuoi usare la SD ... usa un file dedicato in cui memorizzi solo Tmax ... e tutti gli altri dati in altri files ... oppure decidi che i primi X caratteri del file in cui memorizzi il tutto sono riservati per Tmax.

Lo so che è più semplice la eeprom, infatti nel mio progetto della stazione meteo ho usato quello :smiley: Però ho avuto questo problema che non so cosa sia e cosa sbaglio
http://forum.arduino.cc/index.php?topic=362222.0
a parte questo, visto che prendo la mega probabilmente non lo avrò questo problema e poi ha 4kb di eeprom quindi posso usare solo quella! Però devo trovare un modo, o risolvo la eeprom, oppure uso l'sd, però mi sa difficile con l sd, sono solo riuscito a fare il datalogger in file di testo per ora :wink:

Lo dico sempre ... studiatevi la AVR libc ... fondamentale libreria piena di preziose funzioni e sempre inclusa dall'IDE :wink:

Guardati tutte le funzioni che trovi per gestire la EEPROM in <avr/eeprom.h> ... se le userai correttamente NON avrai alcun problema.

Ah, studiati anche l'allegato :wink:

Guglielmo

EEPROM.pdf (181 KB)

Grazie mille daró un'occhiata a tutto :wink: Se risolvo con la eeprom uso l sd solo per il datalogger :wink: