Pages: [1]   Go Down
Author Topic: Mise en mémoire EEPROM de plusieurs valeurs  (Read 1024 times)
0 Members and 1 Guest are viewing this topic.
Belgique
Offline Offline
Newbie
*
Karma: 0
Posts: 30
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 348
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

met nous ton code
Logged

Belgique
Offline Offline
Newbie
*
Karma: 0
Posts: 30
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

}
Logged

France
Offline Offline
Full Member
***
Karma: 0
Posts: 154
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Belgium
Offline Offline
Full Member
***
Karma: 1
Posts: 147
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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+
Logged

IDF/SO
Offline Offline
Edison Member
*
Karma: 41
Posts: 2282
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5354
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Pages: [1]   Go Up
Jump to: