projet couveuse ventilée

Yep!

EEPROM + Float :

#include "EEPROM.h"

float value = 19.88;
int adress = 0;

// Utilities for writing and reading from the EEPROM
float readFloat(int address) {
  union floatStore {
    byte floatByte[4];
    float floatVal;
  } floatOut;
  
  for (int i = 0; i < 4; i++) 
    floatOut.floatByte[i] = EEPROM.read(address + i);
  return floatOut.floatVal;
}

void writeFloat(float value, int address) {
  union floatStore {
    byte floatByte[4];
    float floatVal;
  } floatIn;
  
  floatIn.floatVal = value;
  for (int i = 0; i < 4; i++) 
    EEPROM.write(address + i, floatIn.floatByte[i]);
}

void setup() {
  Serial.begin(9600);
  
  writeFloat(value, adress);
  
  float n = readFloat(adress);
  Serial.println(n);
  
}

void loop() { }

Pour insérer une seconde valeur, ne pas oublier de décaler l’adresse de 4 bytes.

@+

Zoroastre.

merci zoroastre,
après plusieurs tatonnements ca fonctionne, car ma variable n’est pas prédéfinie au départ, mais au moment ou je rentre les données via ma page web sur mon server.
maintenant, je vais essayer de piger comment décaler de 4 bits comme tu l’as suggéré.

Yep!

Oui tu peux appeler les fonctions n’importe où dans le programme. A considérer que les floats sont plus gourmands que les bytes ou int.

Si tes données peuvent être modifiées par l’exterieur, j’essairais de structurer légerement le programme pour inclure les données reçues dans un tableau.

float TABLEAU[2] = { a, b };

Ainsi chaque donnée à son emplacement propre dans le tableau et une position dans celui-ci.

Il suffirait ensuite de créer un flag : if (donnée modifié) { on sauvegarde; }

La position du tableau est déterminante car multipliée par 4 te donne l’adressage de l’EEPROM.

for (int data = 0; data < TABLEAULONG; data++) { writeFloat(TABLEAU[data], data*4); }

data4 = 0 => pour 0
data
4 = 4 => pour 1
data*4 = 8 => pour 2
etc…

Tu as bien ton décalage.

Ce n’est qu’un suggestion parmis tant d’autre. J’ai un peu cette structure. Mon programme python me permet de modifier des paramètres à la volée, j’ai pourtant pris soin de positionner chaque élement de la trame dans un tableau, pour la continuité du programme et pour faciliter la sauvegarde.

C’est la solution la plus simple. Tu peux aussi définir un tableau à deux dimensions avec des adressages pré-définies :

Exemple :

float TABLEAU [4][2] = {
  { TEMPMAX, 0},
  {HUMIDMAX, 12},
  {TEMPMIN, 4},
  {HUMIDMIN, 8}
};
for (int i = 0; i < TABLEAULONG; i++) { writeFloat(TABLEAU[i][0], TABLEAU[i][1]); }

A noter que ces solutions, t’oblige à écrire la totalité de l’EEPROM systématiquement. Il y a certainement moyen d’avoir quelquechose de plus dynamique.

@+

Zoroastre.

je suis carrément paumé là :frowning: , ca va se finir par un nouveau projet, l’arduino volant :grin:

ca me garde que la dernières variable, l’autre étant à -0.01
je mets le code, en résumant, je modifie via une page web les valeurs mini maxi ou l’une ou l’autre.
les sockets sont bien envoyés, mais au reboot, pouf

#include <EEPROM.h>
#include <SPI.h>       // needed for Arduino versions later than 0018
#include <Ethernet.h>
#include <Client.h>
#include <LiquidCrystal.h>
#include <Udp.h>         // UDP library from: bjoern@cs.stanford.edu 12/30/2008
#include "DHT.h"
#define DHTPIN A0 
int ventilo = 8; // led
int resistance = 9; // led

LiquidCrystal lcd1(7, 6, 5, 4, 3, 2);

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,2,200 };
unsigned char gateway[] = { 192,168,2,2 };			
unsigned char mask[] = {255,255,255,0}; 
Server server(80);

unsigned int localPort = 80;      // local port to listen on
float tempmini;
float  tempmaxi;

 
// the next two variables are set when a packet is received
byte remoteIp[4];        // holds received packet's originating IP
unsigned int remotePort; // holds received packet's originating port
 
// buffers for receiving and sending data
char  packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
char packetBuffer1[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
char  ReplyBuffer[] = "acknowledged";       // a string to send back
char  ReplyBuffer1[] = "acknowledged";       // a string to send back
 
#define DHTTYPE DHT21   // DHT 21 (AM2301)
DHT dht(DHTPIN, DHTTYPE);


int address = 0;
byte value;
float tempminimem;
float tempmaximem;


// Utilities for writing and reading from the EEPROM
float readFloat(int address) {
  union floatStore {
    byte floatByte[4];
    float floatVal;
  } floatOut;
  
  for (int i = 0; i < 4; i++) 
    floatOut.floatByte[i] = EEPROM.read(address + i);
  return floatOut.floatVal;
}

 void writeFloat(float value, int address) {
  union floatStore {
    byte floatByte[4];
    float floatVal;
  } floatIn;
  
  floatIn.floatVal = value;
  for (int i = 0; i < 4; i++) 
    EEPROM.write(address + i, floatIn.floatByte[i]);
     
}



void setup() {
  // start the Ethernet and UDP:
  Ethernet.begin(mac, ip, gateway, mask);
  Udp.begin(localPort);
   dht.begin();
  Serial.begin(9600);
   pinMode(ventilo, OUTPUT);
  pinMode(resistance, OUTPUT); 
     server.begin();
       lcd1.begin(16, 2);
       

  
  tempminimem = readFloat(address);
  Serial.print("tempminimem :");
  Serial.println(tempminimem);
   tempmini=tempminimem; 
  tempmaximem = readFloat(address+1);
  Serial.print("tempmaximem :");
  Serial.println(tempmaximem);
   tempmaxi=tempmaximem;       
}
 
void loop() {

  // if there's data available, read a packet
  int packetSize = Udp.available(); // note that this includes the UDP header
  if(packetSize)
  {

     
    packetSize = packetSize - 8;      // subtract the 8 byte header
    Serial.print("Received packet of size ");
    Serial.println(packetSize);
    
 
    memset(packetBuffer, 0, UDP_TX_PACKET_MAX_SIZE);
    memset(packetBuffer1, 0, UDP_TX_PACKET_MAX_SIZE);
 
    // read the packet into packetBufffer and get the senders IP addr and port number
    Udp.readPacket(packetBuffer,UDP_TX_PACKET_MAX_SIZE, remoteIp, remotePort);
    Serial.println("Contents:");
    Serial.println(packetBuffer);
     Udp.readPacket(packetBuffer1,UDP_TX_PACKET_MAX_SIZE, remoteIp, remotePort);
    Serial.println("Contents1:");
    Serial.println(packetBuffer1);   
    
      //tempmini =  float (atoi(packetBuffer));
      //tempmaxi =  float (atoi(packetBuffer1));
       tempmini =  atof(packetBuffer);
        tempmaxi =  atof(packetBuffer1); 
        
     writeFloat(tempmini,address);
     writeFloat(tempmaxi,address+1);     
      
     Serial.print("tempmini : ");
     Serial.println(tempmini);
          Serial.print("tempmaxi : ");
     Serial.println(tempmaxi);     

 
    analogWrite(11, atoi(packetBuffer)); //utiliser la valeur reçu pour allumer la led
        analogWrite(12, atoi(packetBuffer1)); //utiliser la valeur reçu pour allumer la led
        
  }
  delay(2);
    float h = dht.readHumidity();
  float t = dht.readTemperature();    

  t=t-1;
  if (t < tempmini){
    digitalWrite(ventilo,1);
    digitalWrite(resistance,1);
  }
  else if(t > tempmaxi){
    digitalWrite(ventilo,1);
    digitalWrite(resistance,0);
  }
  else{
    digitalWrite(ventilo,0);
    digitalWrite(resistance,0);    
  }
  if (isnan(t) || isnan(h)) {
    Serial.println("Failed to read from DHT");
  } 
  else {
    
    Serial.print("Humidity: "); 
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperature: "); 
    Serial.print(t);
    Serial.println(" *C");
    Serial.print("Tempmini: "); 
    Serial.print(tempmini);
    Serial.println(" *C");
    Serial.print("Tempmaxi: "); 
    Serial.print(tempmaxi);
    Serial.println(" *C");
  lcd1.setCursor(0, 0);
    lcd1.print("H:");lcd1.print(h); lcd1.print("%");
    lcd1.print("Mi:");lcd1.print(tempmini);;    
    lcd1.setCursor(0, 1);
    lcd1.print("T:");lcd1.print(t);lcd1.print("C"); 
    lcd1.print("Ma:");lcd1.print(tempmaxi);     
  } 


}

Je prend le train en route : si tu veux de la précision en température (<= 0.1°C), ya pas 36 solutions, sonde pt100. En plus il en existe un peu sous tous les formats, il y en a surement une plus adaptée pour des oeufs qu’un composant.

Si tu as des questions sur le sujets, je régule des températures et de l’humidité quasiment à longueur de journée xD

Yep!

Tu as déjà un problème ici :

tempmaximem = readFloat(address+1);

int address = 0;

Donc tu demandes à lire l'EEPROM à partir de la case 1.

Considères ton EEPROM comme des cases (byte). Pour écrire un seul float, tu as besoin de 4 cases (les cases de 0 à 3 pour le premier chiffre et 4 à 7 pour ton second chiffre).

Lorsque tu appeles readFloat(), tu vas réunir les informations contenues dans les bytes 0 à 3 pour reconstituer ton float. Pour le second chiffre, tu vas réunir les informations dans les bytes 4 à 7 pour reconstituer la valeur flottant. L'appel au programme te simplifie le travail dans le sens où il te demande seulement de donner le byte initial de la valeur (soit 0, soit 4).

Ici tu réécris au dessus de la première valeur :

writeFloat(tempmaxi,address+1);

Essayes plutôt avec :

...
tempmaximem = readFloat(address+4);
...
writeFloat(tempmaxi,address+4);
...

En gros la structure de l'EEPROM :

{ tempmini }{ tempmaxi } | 0 | 1 | 2 | 3 || 4 | 5 | 6 | 7 | 8 | etc |__ 1er adresse |__ 2sd adresse

@+

Zoroastre.

nickel, pourtant j'avais testé cette solution. ha je sais pourquoi, j'étais partit sur ton int adress = 0 dans ton premier exemple. vraiment élu le boulet du jour pour ma pomme :roll_eyes:

B@tto:
Je prend le train en route : si tu veux de la précision en température (<= 0.1°C), ya pas 36 solutions, sonde pt100. En plus il en existe un peu sous tous les formats, il y en a surement une plus adaptée pour des oeufs qu’un composant.

Si tu as des questions sur le sujets, je régule des températures et de l’humidité quasiment à longueur de journée xD

ce que je cherche surtout, c’est une sonde qui soit réactive dans la ou les 2 secondes maxi.
ce projet de couveuse va déboucher sur un autre projet que j’ai en cours pour mes bornes wifi solaires et des projecteurs laser pour facade.

quand cette couveuse sera terminée, je ferai un exposé photo :wink:

On se sert justement des pt100 dans les étuves ventilées, les formes divers permettent de répondre à tous les type de besoin, sachant que souvent c'est la transmission de la chaleur à l'intérieur du capteur qui pose plus problème que sa réelle réponse intrinsèque.

B@tto: On se sert justement des pt100 dans les étuves ventilées, les formes divers permettent de répondre à tous les type de besoin, sachant que souvent c'est la transmission de la chaleur à l'intérieur du capteur qui pose plus problème que sa réelle réponse intrinsèque.

bonjour B@tto d'accord avec toi les PT100 sont d'excellents capteurs de T° mais difficilement intégrable dans un projet amateur comme celui là si tu pars sur une classe A (même pas sur du 1/3) , rien que le cout d’acquisition d'une PT100 et d'un transmetteur fait s'envoler le budget.

Tout est relatif : j'ai le catalogue Conrad sous les yeux (bon après la qualité de leur produit est plus que discutable), ya des 1/3 DIN à 5€, Heraeus en plus.

B@tto: Tout est relatif : j'ai le catalogue Conrad sous les yeux (bon après la qualité de leur produit est plus que discutable), ya des 1/3 DIN à 5€, Heraeus en plus.

1/3 avec certificat ? :grin: peut être , mais une PT100 sans conditionneur "kivabien" ça n'est pas exploitable directement par un arduino.

Il faut raisonner là : coût capteur(PT100) + coût conditionneur du signal = coût de la precision avant même d’être acquis par l'arduino.

Si tu es un spécialiste de la thermométrie, tu sais qu'à l'exception de quelques applications "pointues" , le besoin est surtout de détecter rapidement les "écarts sur processus stabilisé"

je viens de jeter un oeil et aie aie aie.

sachant que lorsque la température est stabilisée, ca reste raisonnable avec le dht21. je vais commencer a dépouiller l'ancien frigo et utiliser la partie frigo au lieu de congélo car j'ai déjà une bonne 20ene d'oeufs qui attendent. j'ai encore la partie ventilo a penser et surtout voir à combien la lampe va faire monter la T°. la flemme de faire le cacul calo ces jours ci.

Artouste:

B@tto: Tout est relatif : j'ai le catalogue Conrad sous les yeux (bon après la qualité de leur produit est plus que discutable), ya des 1/3 DIN à 5€, Heraeus en plus.

1/3 avec certificat ? :grin: peut être , mais une PT100 sans conditionneur "kivabien" ça n'est pas exploitable directement par un arduino.

Il faut raisonner là : coût capteur(PT100) + coût conditionneur du signal = coût de la precision avant même d’être acquis par l'arduino.

Si tu es un spécialiste de la thermométrie, tu sais qu'à l'exception de quelques applications "pointues" , le besoin est surtout de détecter rapidement les "écarts sur processus stabilisé"

Bin franchement, après avoir testé plein de montages, j'ai pas vraiment vu de différences entre faire un simple pont diviseur avec un ADC qui va bien, et les autres beaucoup plus complexes (et c'est vérifié de -196°C à +500°C). Sinon je suis pas du tout spécialisé dans la thermométrie ^^ mais je suis chimiste et je conçois des appareils toujours blindé de four et autres joyeusetés du genre :)

Sinon je crois pas qu'Infobarquee soit soumis à la norme ISO, donc le certificat, à moins que les cannes ne le réclame, ne sera pas nécessaire xD

ha si si elles viennent de me la demander et font la grève tant que je l’ai pas fournis. :grin:
mais c’est toujours bon de savoir que quelqu’un bosse la dedans, ca peut servir, ne serait ce que pour les bonnes info fournies.

alors, le proto avance à grand pas.
par contre je bute sur une chose, je voudrais que lorsque j’envoie les données ou que je consulte la page sur mon server, l’arduino me renvoie automatiquement l’humidité et la t° de la couveuse.
j’ai bien le repeater lcd sur la couveuse, mais sortir pour aller dans mon atelier voir les données, ca me gonfle un peu, surtout le soir.
j’ai bien essayé de mettre

    if (client.connect()) {
      Serial.println("Connexion au server wit");
      Serial.println();
      delay(1000);
      Serial.println("connected données");
      client.print("GET /twit.php?ipcouveuse=");
      client.print(ip);
      client.print("&temp=");
      client.print(t);       
      client.print("&humidex=");
      client.println(h);  
      client.stop();
}
    }

ca me ressort une belle erreur

couveusememoire.cpp: In function ‘void loop()’:
couveusememoire.cpp:158: erreur: call of overloaded ‘print(byte [4])’ is ambiguous
/usr/share/arduino/hardware/arduino/cores/arduino/Print.h:44: note: candidats sont: void Print::print(const String&) <near match>
/usr/share/arduino/hardware/arduino/cores/arduino/Print.h:45: note:                 void Print::print(const char*) <near match>
/usr/share/arduino/hardware/arduino/cores/arduino/Print.h:46: note:                 void Print::print(char, int) <near match>
/usr/share/arduino/hardware/arduino/cores/arduino/Print.h:47: note:                 void Print::print(unsigned char, int) <near match>
/usr/share/arduino/hardware/arduino/cores/arduino/Print.h:48: note:                 void Print::print(int, int) <near match>
/usr/share/arduino/hardware/arduino/cores/arduino/Print.h:49: note:                 void Print::print(unsigned int, int) <near match>
/usr/share/arduino/hardware/arduino/cores/arduino/Print.h:50: note:                 void Print::print(long int, int) <near match>
/usr/share/arduino/hardware/arduino/cores/arduino/Print.h:51: note:                 void Print::print(long unsigned int, int) <near match>

j ai une couveuse à vendre si tu veux ;)

sinon :

le générateur de brume à ultra sons : les ultra sons ne poseront pas de problèmes sur les oeufs et futur caneton ? çà risque de se propager du caisson au frigo

une cellule peltier inversé en tension ne produit pas du chaud ? comme ca il y a le chauffage et le froid lol

merci pour la couveuse, mais ce petit projet va me servir pour le reste de mon boulot. tu veux leur faire un micro onde? :)

j'ai regardé la cellule peltier, qui peut faire du chaud ou froid. j'ai vu sur une boutique un ruban résistance chauffant pas trop cher qui pourrait me servir. http://www.ducatillon.com/produit_resistance-souple-50-watts-424-1164.html par contre aucun renseignement sur son alimentation.

EDIT : je n'avais pas vu le pdf, donc alim en 220V

Prend autrement la partie chauffante d'un rétroviseur de voiture... ou plusieurs, c'est en 12V

Jean-François: Prend autrement la partie chauffante d'un rétroviseur de voiture... ou plusieurs, c'est en 12V

j'y ais pensé aussi, mais pas assez de chaleur produite. vu le prix en neuf ou à la casse, autant passer sur autre chose. j'ai commandé la résistance de 50w, elle est vendu pour des couveuses justement.