Go Down

Topic: Mise en mémoire EEPROM de plusieurs valeurs (Read 1 time) previous topic - next topic

casper22

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



casper22

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

Code: [Select]

#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;
   
 }
 


}

Pac2Kro

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

lve123

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+

68tjs

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

skywodd

Bonjour,

Il te faut :
- une structure avec tes variables
- ces deux fonctions de la avr-libc :
http://www.nongnu.org/avr-libc/user-manual/group__avr__eeprom.html#ga0ebd0e867b6f4a03d053801d3508f8de
http://www.nongnu.org/avr-libc/user-manual/group__avr__eeprom.html#gac5c2be42eb170be7a26fe8b7cce4bc4d
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Go Up