Projet: Couveuse

Bonjour à tous.

J'ai dans l'idée de créer une couveuse pour des œufs de caille. J'ai quelques questions concernant le montage.

Pour commencé, j'ai bien lu le sujet de infobarquee: Couveuse pilotée par pc.
Cela dit, j'ai quelques interrogation en suspend:

  1. Est ce que la température peut être réglé précisément? J'entends par là, au dixième de degrés.

Dans la couveuse de infobarquee il y a une résistance de chauffage. Pour ma part j'ai une lampe
2. Comment faire varier l'intensité de la résistance de chauffage? Ou de ma lampe?
3. Quelle version de l'arduino me conseillez-vous? Arduino Uno Rev3 (cms?)? Arduino Mega2560 Rev3?
4. Est-ce que ces 3 cartes sont compatibles avec les shield Ethernet Rev3 POE et GSM avec SM5100B?

Voilà pour le début des questions. Selon vos réponses on verra pour la suite. Merci

bonjour et bienvenue au club des piqueurs de micro ondes de madame :grin:

Alors je vais répondre au mieux
1- oui avec un dht21-22 pas de problème
2- pas besoin de faire varier puisque la résistance ou lampe se coupe automatiquement à la température max donnée et se rallume à la temp mini donnée
de plus, des ventilos sont couplés afin d'avoir une température homogène dans la couveuse et un autre pour évacuer au plus vite la température en trop.
3- un r3 suffit
4- l'ethernet, aucun soucis dessus, mais pas besoin de gsm en plus.
pour la simple raison que via le server apache, tu peux piloter la couveuse, il suffit d'ouvrir un port pour la piloter de l'extérieur, même via 3g.

pour le server, un vieux pc suffit largement, un linux dessus et hop
l'avantage, est que tu peux piloter de cette facon plusieurs couveuses et leur donner des températures différentes en mini/maxi

Cette année ce sera cailles farcies au foie gras.... XD

Jean-François:
Cette année ce sera cailles farcies au foie gras.... XD

nope, oeufs d'oie :slight_smile:
d'ailleurs, il va falloir que je dépoussière ce projet, car ca va commencer dans peu de temps :wink:

Re,

Merci infobarquee pour tes réponses!

Concernant la sonde de température, sur le site de snootlab il est indiqué pour la dht22:
"Température mesurée de -40 à 80°C précision ±0.5°C"
-> La précision n'est elle pas trop peu précise?

Pour la variation, j'aurais aimé une sorte de dimmer pour faire varier l'intensité et allumer ma lampe en douceur afin d'éviter les On/Off à répétition.
Il me semble avoir vu un kit velleman compatible pour faire ce genre de chose?

Ok pour le Arduino Uno Rev3! Ok aussi pour la partie Ethernet. Concernant la partie GSM c'est plus pour le fun et pouvoir évoluer ou utiliser le montage pour autre chose dans le futur on va dire. D'où la demande de compatibilité de ces 3 composants. Il me semble que les 3 sont empilable non?

Pour ce qui est de la partie serveur, je maitrise parfaitement le sujet et me débrouille bien en PHP etc.. Je pense que mon Nas Synology fera parfaitement l'affaire!

@Jean-François

Va falloir attendre encore un peu hein! :grin: :grin:

iNouNours:
@Jean-François

Va falloir attendre encore un peu hein! :grin: :grin:

Oui, le temps qu'elles fassent cui-cui.... couic :grin:

pratiquement toutes les sondes temp ont une précision de 0.5C, sauf si on tape dans les trucs de précision, et là, le prix n'est plus le même.
pour ma part, avec le dht21, aucun soucis, j'ai testé avec un thermomètre mercure et impec.

infobarquee:
pratiquement toutes les sondes temp ont une précision de 0.5C, sauf si on tape dans les trucs de précision, et là, le prix n'est plus le même.
pour ma part, avec le dht21, aucun soucis, j'ai testé avec un thermomètre mercure et impec.

[HUM]
Et voilà la recette du canard au mercure ! :grin:
c'est pas un peu lourd à digérer ça ? 8)

retour sérieux maintenant (déjà ? :slight_smile: )

Comme je l'expose régulièrement, en thermométrie "générale" ce n'est pas tant la précision/résolution du capteur qui compte, mais bien sa stabilité en évolution.

Pour rappel
les 18B20 (souvent exposé comme capteur T°) sont donnés pour 0.0625 °C en résolution , la précision au mieux est donnée pour +/- 0.5 °C sur une portion de la gamme.

tu fais bien de le rappeler :wink:

J'ai déjà cherché pour des capteurs de température plus précis mais sans forcément trouver. Après comme dit Artouste, si la stabilité est au rendez-vous avec un bon étalonnage ça devrait le faire.

Si on récapitule, il me faut (chez snootlab):

Arduino Uno Rev 3                           = 19.95€
Ethernet shield Rev 3 POE Ready             = 33.00€
Capteur de température et d'humidité AM2302 = 15.00€
Deux ventilateurs de PC                     = 0
Lampe ou résistance                         = 0
                                     Total  = 67.95€

C'est juste ou il manque quelque chose?

Maintenant, je n'arrive pas à saisir comment brancher ma lampe par exemple! Sur un automate, millenium3 de chez Crouzet par exemple (sur lequel je me suis pas mal amusé dernièrement), sur les sorties on peu faire passer de la puissance (jusque 8A). Mais sur l'Arduino comment ça marche?

tu oublies
les relais pour piloter la lampe/résistance, ventilos
l'alim pc

pourquoi un ethernet POE? un simple suffit, vu que tu as le 220v pour l'alim pc

Pour le shield Ethernet POE, c'est parce que je n'ai trouvé que celui la.. Et je ne sait pas ce qu'est la différence avec un autre..

Voila ce que je voulais savoir! Il faut donc des relais! Quel est le voltage de sortie d'une broche sur l'arduino? Il faut des relais spécifiques?

[Edit]
Ce genre de relais?
![](http://i.ebayimg.com/00/s/NzY4WDEwMjQ=/$(KGrHqR,!lgE8iceHDsgBPL(IKlwng~~60_12.JPG)

iNouNours:
Pour le shield Ethernet POE, c'est parce que je n'ai trouvé que celui la.. Et je ne sait pas ce qu'est la différence avec un autre..

Voila ce que je voulais savoir! Il faut donc des relais! Quel est le voltage de sortie d'une broche sur l'arduino? Il faut des relais spécifiques?

j'avais mal lu, c'est POE ready donc pas de POE sur la carte.
pour les relais, tu peux prendre ca For Sale Domain: kibuck.com
pas trouvé chez snootlab.

Pour les relais ok!
Je n'ai pas cherché mais POE je crois que c'est Power Over Ethernet. Pour allumer la carte a distance je crois non? Un truc de ce style. Enfin bref c'est inutile pour ce montage.

Concrètement, pour l'alim PC Elle sert à quoi?
Récupérer le 12V pour les ventilos?
Récupérer le 05V pour l'arduino? Il me semble avoir lu que le mieux est de l'alimenter en 9V faux?

Car dans ce cas, un transfo 9V pour l'arduino et je pourrais aussi récupérer le 9V pour les ventilos PC..

[Edit]
Pour l'écran, un Module Ecran LCD Bleu 2*16 2x16 Screen HD44780 - Arduino - Raspberry Pi 5V c'est bon?

le POE sert a alimenter la carte réseau ou le routeur à distance via le rj45.

l'avantage de l'alim pc est que tu as tous les voltages de dispo et quelle fournit assez de puissance en ampères.
en plus pour la résistance ou la lampe en 220v, tu peux récupérer ca sur son cable d'alim.
bouton marche/arrêt et ventilo qui permet de savoir si ca fonctionne ou non.

un transfo développe peux d'ampères voir mA et s'il crame, a part voir les leds sur les cartes tu ne sais pas.

enfin après chacun fait comme il veut.

pour le lcd, tu prends ce que tu veux ainsi que ta couleur préférée :slight_smile: moi j'aime bien le jaune canard riz :grin:

Bonjour,

Voici quelques nouvelles. Ayant regardé un peu partout pour trouver les matériels les moins chères j'ai enfin fait mes achats!
Au final:

Arduino Uno Rev 3                           = Acheté
Ethernet shield Rev 3 POE Ready             = Acheté
Capteur de température et d'humidité AM2302 = Acheté
4 relais pour Arduin0                       = Acheté
Ecran LCD Bleu 2*16 2x16 Screen HD44780     = Acheté
Breadboard + fils                           = Acheté

Pour les ventilateurs et l'alim de PC j'ai ce qu'il me faut!

Il me reste plus qu'a patienter en attendant de recevoir tout ça.

@infobarquee
Est ce que je peux reprendre ton code dans ton topic pour ta couveuse? Si oui, est-il complet? J'ai quelques paramètres à changer notamment pour le Shield Ethernet..

Après essais, il y a pleins d'erreurs lors de la compilation. il me semble que certaines librairies ont changé depuis. Et très franchement, j'ai essayé de faire quelque chose mais ça dépasse un peu mes compétences :~

sans aucun soucis pour reprendre le code, il est là pour ca.
oui, il est complet
il a été fait avec l'ide 0.22 donc les libs peuvent changer :wink:
vérifie bien que toutes les libs sont présentes dans ton rep librairies

Bon, j'ai changé quelques trucs, mais ca ne se compile pas et ça dépasse mes compétences!
Pas facile ce langage quand même!

Voici le code avec les modifs:

#include <SPI.h>
#include <EEPROM.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
#include <LiquidCrystal.h>
#include "DHT.h"
#define DHTPIN A0
//#define DHTTYPE DHT11   // DHT 11 
#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

int ventilo = 8; // led
int resistance = 9; // led

const int buttonPin = A1;                              // the number of the pushbutton pin
const int ledPin =  12;                                // the number of the LED pin
long previousMillis = 0;                               // will store last time LED was updated
long interval = 10000;                                 // interval at which to blink (milliseconds)
int i=0;
int buttonState = 0;                                   // variable for reading the pushbutton status

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

EthernetUDP Udp;

// 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 };   //Adresse MAC de l'arduino
byte ip[] = { 192, 168, 0, 150 };                      //Adresse ip de l'arduino
unsigned char gateway[] = { 192, 168, 0, 1 };          //Passerelle (Box FAI)
unsigned char mask[] = { 255, 255, 255, 0 };           //Masque de sous-réseau
byte serverdist[] = { 192, 168, 2, 17 };
EthernetServer server(80);                             //Port
EthernetClient client(serverdist, 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
const char toto[]="123";
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 = 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);

}



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+4);
  Serial.print("tempmaximem :");
  Serial.println(tempmaximem);
  tempmaxi=tempmaximem;  
 
  pinMode(ledPin, OUTPUT);      
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT); 

}

void loop() {
   // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);

  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  if (buttonState == HIGH) {   
      unsigned long currentMillis = millis();  
    // turn LED on:    
    digitalWrite(ledPin, HIGH); 
    Serial.println("intrusion"); 
  i++;
  Serial.println(i);
  if(i>500){
    digitalWrite(ledPin, HIGH); 
  }
  } 
  else {
    // turn LED off:
    digitalWrite(ledPin, LOW); 
  }
  if (i>520){i=0;}
  
  float h = dht.readHumidity();
  float t = dht.readTemperature();    

  t=t-1;
  // if there's data available, read a packet
  int packetSize = Udp.available(); // note that this includes the UDP header
  if(packetSize)
  {
      if (lient.connect()) {
        delay(2000);
    Serial.println("connected");
    Serial.print(t);
    client.print("GET /recup.php?temp=");
    client.print(t);
    client.print("&humid=");
    client.print(h);
    client.print("\n");
    
    client.stop();
   
    }  

    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+4);     

    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
    //Udp.sendPacket(ReplyBuffer1, IP, localPort);

    //Udp.sendPacket(toto, remoteIp, localPort );
    

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


}

Et voici les erreurs:

couveuse:36: error: no matching function for call to 'EthernetClient::EthernetClient(byte [4], int)'
C:\Users\NouNours\Documents\arduino-1.0.3-windows\arduino-1.0.3\libraries\Ethernet/EthernetClient.h:12: note: candidates are: EthernetClient::EthernetClient(uint8_t)
C:\Users\NouNours\Documents\arduino-1.0.3-windows\arduino-1.0.3\libraries\Ethernet/EthernetClient.h:11: note:                 EthernetClient::EthernetClient()
C:\Users\NouNours\Documents\arduino-1.0.3-windows\arduino-1.0.3\libraries\Ethernet/EthernetClient.h:8: note:                 EthernetClient::EthernetClient(const EthernetClient&)
couveuse.ino: In function 'float readFloat(int)':
couveuse:70: error: incompatible types in assignment of 'uint8_t' to 'byte [4]'
couveuse.ino: In function 'void writeFloat(float, int)':
couveuse:83: error: invalid conversion from 'byte*' to 'uint8_t'
couveuse:83: error: initializing argument 2 of 'void EEPROMClass::write(int, uint8_t)'
couveuse.ino: In function 'void loop()':
couveuse:148: error: 'lient' was not declared in this scope
couveuse:171: error: 'class EthernetUDP' has no member named 'readPacket'
couveuse:174: error: 'class EthernetUDP' has no member named 'readPacket'

Voila où j'en suis, et même en cherchant sur internet, je ne trouve pas! J'ai modifié pas mal de truc et c'est le minimum d'erreur que j'arrive à avoir.

iNouNours:
Bon, j'ai changé quelques trucs, mais ca ne se compile pas et ça dépasse mes compétences!
Pas facile ce langage quand même!

Et voici les erreurs:

couveuse:36: error: no matching function for call to 'EthernetClient::EthernetClient(byte [4], int)'

C:\Users\NouNours\Documents\arduino-1.0.3-windows\arduino-1.0.3\libraries\Ethernet/EthernetClient.h:12: note: candidates are: EthernetClient::EthernetClient(uint8_t)

bonjour
rapidement
à priori
le code d'infobarquee est prevu pour l'IDE et les libs sous IDE 0.22 pas 1.0.3
l'include DHT11 n'est pas entre <>

Bonjour,
Je ne peux pas t'aider pour la programmation Arduino, car je viens de découvrir ce système et j'espère l'utiliser pour gérer un chauffage solaire. J'en suis seulement à essayer de définir une structure générale du soft et pour l'instant je patauge ..
En revanche j'ai une bonne expérience des couveuses car j'élève des canards d'ornement depuis assez longtemps.
Voici les problèmes à gérer :

  • Température : En incubateur ventilé choisir une consigne de 37.4°c. La précision est importante, idéalement il faudrait étalonner ton capteur en le comparant à un thermomètre de référence. Il faut aussi surveiller les écarts de température à l'intérieur de la couveuse, ce n'est pas parce qu'il y a un ventilateur que la température est uniforme. Cela implique donc plusieurs capteurs, heureusement les DS18B20 sont bon marché.
    Tu envisages d'utiliser une lampe comme résistance chauffante. Ce n'est pas très fiable. Si ta lampe crame pendant l'incubation, tout est mort. Essaie de trouver une résistance bobinée de puissance équivalente, ou alors une lampe de type "Elstein". C'est tout simplement une résistance bobinée montée sur un culot de lampe. Autre point, pour éviter les surchauffes l'idéal serait une commande proportionnelle. Si la résistance est un poil surpuissante, une régul. TOR peut générer des overshot de température que les œufs n'apprécient pas.
    Il y a sans doute su ce forum de l'aide pour une régul. PID avec Arduino.

  • Humidité relative : C'est plus compliqué car les capteurs sont moins courants. En fait, l'œuf doit perdre 15% de son poids pendant l'incubation. Cette perte de poids est d'autant plus importante que l'hum. rel. de la couveuse est faible. L'hum. rel. de la couveuse devra donc se régler en fonction de la perte de poids de l'œuf. On peut considérer que la perte de poids est linéaire à Hr constante.

  • Mouvement : L'œuf devra être retourné plusieurs fois par jour (3 ou 4 fois minimum). Cela peut se faire manuellement, mais si tu deviens un as d'Arduino tu pourras envisager un retournement automatique.

J'ai bricolé plusieurs couveuses, qui fonctionnent parfaitement. Toutes les régulations sont en hard, cela a pris du temps.
L'arrivée d'Arduino devrait faire gagner du temps aux nouveaux éleveurs.