Mise en mémoire EEPROM de plusieurs valeurs

Bonjour les arduiniss

Pourriez-vous m'aider pour terminer mon projet de gestion de ma serre avec une arduino

J'aimerai simplement mettre environ 5 valeurs en mémoires EEprom afin de les garder lors des arrêts, et ne pas devoir les réencoder lors des redémarrage

Les valeurs seraient par exemple

ConsigneTensionBatt

ConsigneTemp

ConsigneLuminosité

DuréeArrosage

IntervalleArrosage

Je parviens à en garder une mémoire , et à la relire, mais avec plusieurs, le m'embourbe

1.04 UNO R3
LCD 16X2
sonde temp
sonde humidité
diviseur tension

Merci de votre aide

met nous ton code

Bonjour

Voici le code en cours de rédaction et qui doit encore être nettoyé, et j'ai enlevé l’excédentaire pour pouvoir poster

#include <DFR_Key.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>
#include <EEPROM.h>
#include <Wire.h>


//programme qui fait l'affichage de la température sur l'écran LCD


// ajout du bouton de sélection d'affichage
// ajout de l'affichage de la temérature mini et maxi 
// ajout de la régulation charge de la batterie et de la mesure d'humidité avec moyenne sur 5 lectures et intervalles de 10 secondes
// modification avec l'afficheur DFROBOT et gestion avec les boutons le 1 avril
//+ mise en mémoir de la valeur de la consigne de duree d'arrosage  en EEprom




//---------------------------------
//Partie gestion touches sur LCD

//Displays the currently pressed key on the LCD screen.

//Key Codes (in left-to-right order):
/*
None   - 0
 Select - 1
 Left   - 2
 Up     - 3
 Down   - 4
 Right  - 5
 
 */



//Pin assignments for DFRobot LCD Keypad Shield
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); 
//---------------------------------------------

DFR_Key keypad;

int localKey = 0;
String keyString = "";



const int RelaisVentilation   = 13;
const int RelaisArrosage      = 11;
const int RelaisChargeBatt    = 12;
int MesureTension             = A3;
int MesureHum                 = A4;
int periodeDeMesure=1000;
int addressDuree = 0;// L'adresse dans la mémoire EEPROM (c.-à-octet qui On va écrire à côté)
int dureeArrosage;
int intervalArrosage = 15;
int DureeIntervEch ;

int photocellPin = 0;     
int photocellReading;    
float tempC;
float ConsigneC;
float EEpromdureeArrosage;
float hysteresis = 1;
float TempMaxi;
long TempMini=40;

float MesureVolts;
float VoltsBatt;
long ConsigneVolts    =12;
long hysteresisVolts  = 1;
float VoltsMax;
float V_Min=25;

float MesurePanneauSol;
float VoltsPanneauSol;
long ConsignePanneauSol =15;

long Humidite;
long H_Max;
long H_Min=1000;
long MoyHumidite;
long Humidite1;
long Humidite2;
long Humidite3;
long Humidite4;
long Humidite5;



long fin = 0;// pour void tempo affichage
long previousMillis = 0;
long start =  0;
long Tempo =  0;
long StartTempo = 0;
long DecompteAvAros=0;
long TempoIntervalArrosage=0;
long TempAros=0;
boolean Arrosage=0;
boolean ArrosageManu=0;
boolean Charge=0;
long ConsigneIntervalEch=10;
long DureeIntervEchSec;






long interval3 = 9000; //pour void tempo 
long interval4 = 30000; //pour void tempo 
int buttonPushCounter = 0;   // counter for the number of button presses
int countEchHum = 0;

unsigned long StartTempArrosage;
unsigned long FinTempArrosage;

unsigned long StartTempIntervalArrosage;
unsigned long FinTempIntervalArrosage;

unsigned long FinTempIntervEchc;
unsigned long StartTempIntervEchc;






// Data wire is plugged into port A2 on the Arduino
#define ONE_WIRE_BUS A2

// 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);

// arrays to hold device addresses
DeviceAddress insideThermometer, outsideThermometer;

// function that will be called when an alarm condition exists during DallasTemperatures::processAlarms();



//affichage sur LCD 
// mettre le  curseur colonne 0, ligne 1
// (note: ligne 1 est la seconde ligne , on commence à compter par 0):
//affichage température

void affichagemesures()
{
  lcd.print("Temp  Volts Humi ");
  lcd.setCursor(0, 1);
  lcd.print(tempC);
  lcd.setCursor(6, 1);
  lcd.print(VoltsBatt);
  lcd.setCursor(12, 1);
  lcd.print(Humidite);
  
}

void affichageDuree()
{  
  lcd.setCursor(0, 0);
  lcd.print("consArros");

  lcd.setCursor(10, 0);
  lcd.print(dureeArrosage);

  lcd.setCursor(13, 0);
  lcd.print(TempAros);

  lcd.setCursor(0, 1);
  lcd.print("IntervArr");

  lcd.setCursor(9, 1);
  lcd.print(intervalArrosage);

  lcd.setCursor(13, 1);
  lcd.print(TempoIntervalArrosage);

  //Partie modification des consignes
  if (localKey != SAMPLE_WAIT)
    if (localKey==3)// fleche HAUT
      dureeArrosage++;

  if (localKey != SAMPLE_WAIT)  
    if (localKey==4)// fleche Bas
      dureeArrosage--;

}

void affichageTemp()
{
  lcd.print("TempC Tmax Tmin");
  lcd.setCursor(0, 1);
  lcd.print(tempC);
  lcd.setCursor(6, 1);
  lcd.print(TempMaxi);
  lcd.setCursor(12, 1);
  lcd.print(TempMini);
}

void Affichage_Batterie()
{

  lcd.print("Volts VMax VMin ");

  lcd.setCursor(0, 1);
  lcd.print(VoltsBatt);
  lcd.setCursor(6, 1);
  lcd.print(VoltsMax);
  lcd.setCursor(12, 1);
  lcd.print(V_Min);
}
void Affichage_Humidite()
{
  lcd.print("Hum Max Min Moy");
  lcd.setCursor(0, 1);
  lcd.print(Humidite);
  lcd.setCursor(4, 1);
  lcd.print(H_Max);
  lcd.setCursor(8, 1);
  lcd.print(H_Min);
  lcd.setCursor(12, 1);
  lcd.print(MoyHumidite);
  
}
void Affichage_Relais()
{
 
  lcd.print("Charge");
  lcd.setCursor(9, 0);
  lcd.print(Charge);
  lcd.setCursor(0, 1);
  lcd.print("Arrosage");
  lcd.setCursor(9, 1);
  lcd.print(Arrosage);
  lcd.setCursor(11, 1);
  lcd.print("Man");
  lcd.setCursor(15, 1);
  lcd.print(ArrosageManu);
  
  
   if (localKey != SAMPLE_WAIT)
    if (localKey==5)// fleche Droite
    {
      digitalWrite(11,HIGH);   // relais arrosage
      ArrosageManu=1;
    }
      if (localKey==0)// fleche Droite
      {
      digitalWrite(11,LOW);   // relais arrosage
      ArrosageManu=0;
      }
  
}
void Ecriture_vers_port_serie()//Envoi données sur port série
{
  Serial.print("Temp C:\t ");
  Serial.print(tempC);




  Serial.print("\tTempoAvAros:\t");
  Serial.print(DecompteAvAros);

  Serial.print("\tTempAros:\t");
  Serial.print(TempAros);

  Serial.print("\tVoltsMin:\t");
  Serial.print(V_Min);


}

void newAlarmHandler(uint8_t* deviceAddress)
{
  printTemp(deviceAddress);
}

void printTemp(DeviceAddress deviceAddress)
{
  tempC = sensors.getTempC(deviceAddress);

}

void ecrireEEprom()
{

  if ( dureeArrosage!=EEpromdureeArrosage)
  {
    EEPROM.write(addressDuree,dureeArrosage); 
    EEpromdureeArrosage=dureeArrosage;
  }

}
void lireEEprom()
{
  // Lire un octet de l'adresse actuelle de la mémoire EEPROM
  dureeArrosage = EEPROM.read(addressDuree);


}
void effacerEEprom()
{
  // write a 0 to all 512 bytes of the EEPROM
  for (int i = 0; i < 512; i++)
    EEPROM.write(i, 0);
}  

void setup(void)
{

  Serial.begin(9600); 
  // keypad.setRate(1); 
  sensors.begin();
  lcd.begin(16, 2);// set up the LCD's number of columns and rows: 
  sensors.setAlarmHandler(&newAlarmHandler);

  pinMode(13,OUTPUT);  // sortie 13relais ventilation
  pinMode(11,OUTPUT);  // sortie 11 relais arrosage
  pinMode(12,OUTPUT);  // sortie 12 relais Charge
  pinMode(photocellPin, INPUT);
  pinMode(MesureHum, INPUT);
  pinMode(MesureTension, INPUT);

}
void loop(void)

{ 
  sensors.requestTemperatures();
  sensors.processAlarms();
  // Ecriture_vers_port_serie();
  //effacerEEprom();
  ecrireEEprom();


  /////////////////////////
  ///Partie sélection de l'écran
  //////////////////////

  localKey = keypad.getKey();

  if (localKey != SAMPLE_WAIT)
    if (localKey==1)

      buttonPushCounter++;

  if (buttonPushCounter > 5)

    buttonPushCounter = 0;

  if (buttonPushCounter==0)
  {
    lcd.clear(); 
    affichagemesures();
  }

  if (buttonPushCounter==1)
  {
    lcd.clear(); 
    affichageDuree();
  }

  if (buttonPushCounter==2)
  {
    lcd.clear(); 
    affichageTemp();
  }

  if (buttonPushCounter==3)
  {
    lcd.clear(); 
    Affichage_Batterie();
  }
  if (buttonPushCounter==4)
  {
    lcd.clear(); 
    Affichage_Humidite();
  }
    if (buttonPushCounter==5)
  {
    lcd.clear(); 
    Affichage_Relais();
  }


  unsigned long currentMillis = millis();

  if ((buttonPushCounter == 1)||(buttonPushCounter == 2)||(buttonPushCounter == 3)||(buttonPushCounter == 4))

    if(currentMillis - previousMillis > interval4) 

    {
      // buttonPushCounter = 0;
      previousMillis = currentMillis; 
    }
  }
  
  
  TempoIntervalArrosage=(StartTempIntervalArrosageSec-FinTempIntervalArrosageSec);

  if (Arrosage ==0)
    FinTempArrosage=StartTempArrosage;
  if((TempoIntervalArrosage)> (intervalArrosage))


  {  
    Arrosage=1 ;
    digitalWrite(11,HIGH);   // relais arrosage
    FinTempArrosage=StartTempArrosage;
  }


  // tempo Durée arrosage


    StartTempArrosage = millis();
  if (Arrosage==1)
    FinTempIntervalArrosage=StartTempIntervalArrosage;
    
  if(TempAros > dureeArrosage)
  {
    Arrosage=0 ;
    digitalWrite(11,LOW);   // relais arrosage
    FinTempIntervalArrosage=StartTempIntervalArrosage;
    
  }
  
 

}

Voici un exemple pour mettre une adresse MAC en EEPROM, à toi de l'adapter pour ton projet.

http://forum.arduino.cc/index.php?topic=141161.msg1066107#msg1066107

Bonjour
Utilise un tableau (array) de 5 éléments: long data [5]; et la librairie eepromAnything pour l'inscrire et lire dans l'eeprom.
A+

Plus simple utiliser directement les fonctions de l'avr-libc.
Arduino n'en utilise qu'une seule d'entre elles : le type octet mais il y en a d'autre toute prêtes.
http://www.nongnu.org/avr-libc/user-manual/group__avr__eeprom.html

Bonjour,

Il te faut :

voici un code simple:

#include "EEPROM.h"

void setup() {
  Serial.begin(9600);
  Serial.println("Start...");
}



void loop() {
  int a = 5;
  int b = 7;
  int c = 7890;
  Serial.print("a="); Serial.println(a);
  Serial.print("b="); Serial.println(b);
  Serial.print("c="); Serial.println(c);
  Serial.println("Ecriture EEprom...");
  EcritEEprom(0, a);
  EcritEEprom(2, b);
  EcritEEprom(4, c);
  a = 0;
  b = 0;
  c = 0;
  Serial.print("a="); Serial.println(a);
  Serial.print("b="); Serial.println(b);
  Serial.print("c="); Serial.println(c);
  Serial.println("Lecture EEprom...");
  a = LireEEprom(0);
  b = LireEEprom(2);
  c = LireEEprom(4);
  Serial.print("a="); Serial.println(a);
  Serial.print("b="); Serial.println(b);
  Serial.print("c="); Serial.println(c);
  while (1);
}



int LireEEprom(int num) {             //num= 0, 2 4, 6, 8, 10...
  int ret;
  unsigned char fort = EEPROM.read(num);
  unsigned char faible = EEPROM.read(num + 1);
  ret = fort ;
  ret = ret << 8 ;
  ret = ret | faible ;
  return ret;
}
void EcritEEprom(int num, int val) {       
  unsigned char faible = val & 0x00FF;
  unsigned char fort = (val >> 8) & 0x00FF;
  EEPROM.write(num, fort) ;
  EEPROM.write(num + 1, faible) ;
}