brassage biere maintenir des paliers de température.

Bonjour

Je viens de débuter sous arduino et pour apprendre je me suis lancé dans un projet de pico brasserie.

En gros j'ai 2 cuves, 2 sondes DS18B20, 2 relais qui contrôlent 2 thermoplongeurs.

Le but de mon programme est de contrôler la température dans les 2 cuves, allumer et d'éteindre le thermoplongeur pour garder une température de 80°C dans la cuve 1 et d'allumer et d'éteindre le thermoplongeur de la cuve 2 pour maintenir de pallier de température pendant un certain temps.

Je résume :

  • Maintenir 80°C cuve 1 (allumer thermoplongeur ou éteindre)

  • Maintenir température cuve 2 : - 61-63°C pendant 30 min

puis : - 65-68°C pendant 30 min

puis : - 70-75°C pendant 10 min

  • Éteindre

J'ai commencé par remplacer les relais par des LED pour m’entraîner, ce qui me pose souci c'est comment maintenir pendant 30 min une température faut-t-il que j'utilise la fonction millis ou existe-t-il une autre fonction?

Merci d'avance

Voici mon code :

#include <stdio.h>
#include <string.h>
#include <OneWire.h>

#define NBRE_CAPTEUR 2 // nombre de capteur sur l'arduino

// *********** declararation des variables gestion des capteurs de temperature  *******************
typedef struct Temperature Temperature;
struct Temperature
{
  float valeur;         // temperature en Celsius, 1 chiffre apres la virgule
  byte addr[8];         // identifiant capteur
  int pin;          // numero de pin a utiliser
  char mnemo[32];         // mnemonique de la variable
};

Temperature temperature[NBRE_CAPTEUR];    //creation des instances

// *********** fin declararation des variables gestion des capteurs de temperature  *******************


void setup(){
  
        Serial.begin(9600);       // initialisation de la liaison serie


// *********** initialisation des variables gestion des capteurs de temperature  *******************


  temperature[0].addr[0]= 0x28; // capteur rouge
  temperature[0].addr[1]= 0xFF;
  temperature[0].addr[2]= 0x46;
  temperature[0].addr[3]= 0xE5;
  temperature[0].addr[4]= 0x91;
  temperature[0].addr[5]= 0x15;
  temperature[0].addr[6]= 0x04;
  temperature[0].addr[7]= 0x04;
  temperature[0].pin=7;
  temperature[0].valeur=0;      // temperature en °C, 1 chiffre apres la virgule
        strcpy(temperature[0].mnemo,"temperature chauffage");  // ex: salon

  temperature[1].addr[0]= 0x28; // capteur vert
  temperature[1].addr[1]= 0xFF;
  temperature[1].addr[2]= 0xF5;
  temperature[1].addr[3]= 0xD4;
  temperature[1].addr[4]= 0x61;
  temperature[1].addr[5]= 0x15;
  temperature[1].addr[6]= 0x01;
  temperature[1].addr[7]= 0x70;
  temperature[1].pin=8;
  temperature[1].valeur=1;      // temperature en °C, 1 chiffre apres la virgule
        strcpy(temperature[1].mnemo,"temperature moult");  // ex: salon

pinMode (9,OUTPUT);// broche 10 configurée en sortie
pinMode (10,OUTPUT);// broche 10 configurée en sortie


}

/********************************************************************************
  Cette fonction permet d'allumer et d'éteindre une diode en focntion d'une
  température choisi.
********************************************************************************/

void loop(){
  
  
gestion_temperature();

delay(5000);

if (  temperature[0].valeur > 80)
{digitalWrite(9,HIGH); // alluler la led du capteur rouge
}
else {digitalWrite(9,LOW);}

if (  temperature[1].valeur > 20)
{digitalWrite(10,HIGH); // alluler la led capteur vert                       
}
else {digitalWrite(10,LOW);}
}



/********************************************************************************
  Cette fonction permet d'interroger tous les capteurs de temperature OneWire
  qui ont ete declare dans "temperature[i]"
********************************************************************************/



void gestion_temperature()
{
  byte i=0;

  for(i=0; i<NBRE_CAPTEUR; i++){

    Serial.print(temperature[i].mnemo);
    Serial.print(" => ");
    temperature[i].valeur =getStuff(temperature[i].addr,temperature[i].pin);
    Serial.print(temperature[i].valeur);
    Serial.println(" C ");
    delay(100);
  }

}

/********************************************************************************
  Cette fonction permet d'interroger le capteur de temperature OneWire
  qui a ?t? d?clar? dans "temperature[i]"
********************************************************************************/
float getStuff(byte addr[8], int pin) // indiquer le n? de pin ? utiliser
{

  OneWire  ds(pin);  // creation d'un objet OneWire avec le bon n? de pin

  byte i;
  byte present = 0;
  byte data[12];

  float real_temp;
  float temp_count;
  float read_temp;


  ds.reset();
  ds.select(addr);
  ds.write(0x44,1); // start conversion, with parasite power off at the end (1=parasite mode)
  
  delay(5000);     // delay de 1s si mode parasite. 100ms en mode normal
  // we might do a ds.depower() here, but the reset will take care of it.
  
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Read Scratchpad


    for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
  }

  read_temp=((data[1]<<8) | data[0]) >> 1 ;            // Divide the temperature by 2
  temp_count=float(data[7] - data[6])/(float)data[7];  // Convert to real temperature
  real_temp = ((float)read_temp-0.25)+temp_count;

  // arrondi 1 chiffre apres la virgule
  int temp = real_temp*10;
  real_temp = (float)temp/100;

  // Serial.println();
  
  return real_temp;
}

Salut hoturi;

Ton "process" est sympa et j'aime la bière !!

Il y a une bibliothèque qui ce nome "Time" tu peut la trouver sur le site Arduino.
Vois si ça te conviens. Arduino Playground - HomePage

Perso je ne l'ai jamais exploité je suis juste tombé dessus un jour (mais trop tard pour moi j'ai utilisé un module RTC) c'est proche de ce que tu recherche.

Télécharge le Zip de la "lib" GitHub - PaulStoffregen/Time: Time library for Arduino
L'exemple "TimeSerial" devrais t’intéresser +> pas besoins d'équipements a branchrer pour le faire fonctionner. j'ai juste pas compris comment le mettre à l'heure mais ça peut faire un bon chrono.
je vais essayé pour voire !!

Tu régule la température en tout ou rien. A tu pensé une régulation par la modulation de tensions.
une fois à température tu maintiendrais une température plus linéaire avec un PI(D) bien-sur.

A plus !!

C'est marrant j'ai le même projet que toi! Par contre je n'ai pas encore débuter, je pense que j'attaquerai le mois prochain.

Pour les temporisation Bricoleau a fait un librairie plutot sympa:
http://forum.arduino.cc/index.php?topic=375533.0

J'ai prévu un afficheur LCD qui permettra de renseigner le nombre de palier avec les T° et temps de chacun.

Bon courage pour ton projet :wink:

Merci pour vos réponses. Je vais regarder "times" et la librairie ([partage] Librairie Minuteur (gestion de délais) - Tutoriels et cours - Arduino Forum).
Pour l'instant, je n'ai pas prévu d'écran mais je pense le faire. Il me faudra aussi une alarme pour signifier la fin du programme.

Je publierais l'avancement de mon projet et bien sur mes problèmes n'étant pas programmeur je risque d'avoir besoin d'aide.

Cordialement.

Pourquoi tu ne veux pas utiliser millis() ? Allergie ?

Salut;

Pour les temporisation Bricoleau a fait un librairie plutot sympa:
[partage] Librairie Minuteur (gestion de délais) - Tutoriels et cours - Arduino Forum

Tu devrais regarder ça vaux le coup.

A plus!!

bonsoir

J'ai regardé vos solution mais je ne comprend pas tous, je me demande si il n'existe pas une fonction plus simple par exemple que je pourrais utiliser comme cela :

T1 = 61°C
T2 = 67°C

if ( temperature[0].valeur > T1)
{STAR TIMER; //démarrer le prise du temps}
{STOP Tehermoplongeur; //éteint le chauffage}

if ( timer > 30 minutes)
{T1 = T2}

Par contre cela va me demander de faire des pallier identiques il faut que je réfléchisse autre chose comme une boucle.

B83s:
Pourquoi tu ne veux pas utiliser millis() ? Allergie ?

En faite j'ai pas vraiment comprit comment l'utiliser, mais si tu peux me faire un bout de code avec millis je suis preneur.

hoturi:
En faite j'ai pas vraiment comprit comment l'utiliser

Pour l'utilisation et l'exemple:

  • tu telecharges la librairie simpleMinuteur sur le post de Bricoleau.
  • Pour l'installer dans arduino IDE, tu vas dans Croquis/Inclure librairie/Add .zip librairie. Et tu selectionnes la librairie telechargée.
  • Ainsi avec ta librairie installé, tu vas voir dans Fichier/Exemple/simpleMinuteur/exemple3_plusieurs_actions pour avoir un exemple similaire au tiens.

Tiens nous au courant de ton avancement :wink:

voir l'exemple arduino de blinkwithoutdelay

Bonsoir mon code marche merci pour votre aide, j'ai maintenant une autre question sur le matériel comment choisir un relais SSR en sachant que l'un va commander un thermoplongeur de 3000W (minimum) et l'autre une pompe de 300w. Pas en continu bien sur.

1: http://dsindustrie.com/electronique/actionneurs/relais/module-2-relais-5v-arduino-maroc
ou
2: http://dsindustrie.com/electronique/actionneurs/relais/relais-statique-24v-380v-ac-40a-250v-ssr-40-da-3-32v-cc-a-ca

Je ne vois pas la différence entre les 2, et je cherche si possible le plus simple à utiliser.

merci d'avance

hoturi:
comment choisir un relais SSR en sachant que l'un va commander un thermoplongeur de 3000W (minimum) et l'autre une pompe de 300w.
1: http://dsindustrie.com/electronique/actionneurs/relais/module-2-relais-5v-arduino-maroc
ou
2: http://dsindustrie.com/electronique/actionneurs/relais/relais-statique-24v-380v-ac-40a-250v-ssr-40-da-3-32v-cc-a-ca

le 1 pour la pompe et le 2 pour le thermoplongeur (surtout pas le 1 pour 3000w)

Salut hoturi;

Pour de la puissance on parle de contacteur, car il sont spécifiquement construit pour couper de forte intensités. Un relais a une construction différente (faible puissance et manœuvres multiples & répétés).

Tu dois avoir une tension compatible de pilotage à la bobine du contacteur. Mais ça tu doit déjà le savoir !!

Ton contacteur doit être capable de supporter l'intensité absorbé par la puissance de tes appareils.(ainsi que les court-circuit probable qui' ils vont subir).
Pour sélectionner le calibre de ton relais il te faut connaitre cette intensité et prendre un peu de marge en règle général 1/3 de plus.

Ton thermos plongeur a une puissance 3000W (monophasé le thermos?). la formule est la suivante P = U*I.
Si tu alimente en 230v ca te donne 3000/230 = 13.04 soit 13Ampère. Avec 1/3 de plus çà fait 17 Ampère.

Ton contacteur devras donc avoir une capacité de plus de 17Ampère. Les fabricants ont des dimensionnement standard donc tu choisis en fonction de leurs grille de proposition au dessus ou égale à 17A. tu trouvera surement en 20A.
Si tu prends trop bas il risque de se dégrader (chauffer) au niveau des contacts.

A plus !!

Re moi !!

pour ta sécurité
Pense également a bien protéger ton installation contre les courts-circuits et les courants de fuite.
Avec les plongeurs vaut mieux pour ta sécurité !!.

A plus!

Bonjour

Merci pour ta réponse, mon thermoplongeur sera monophasé et 230volt.
Ce que je ne comprend pas c'est comment brancher le contacteur sur l'arduino, je branche d'un coté sur l'arduino et de l'autre sur mon thermoplongeur ou faut il faire une montage avec d'autre composant.

Je tiens a préciser que je n'ai jamais fais d'électronique cela fait juste 1 mois que j'ai une carte arduino et que j'apprends au travers de ce projet les bases.

Cordialement.

Salut;

Tu vas devoir interfacer ton contacteur. C'est a dire que le pilotage se feras via un relais ou un gros MOFSET cette fois.
Il vas te falloir connaitre la tension (et l'intensité) de pilotage de ton contacteur pour adapter ton relais d'interface pilote.

En gros en fonction de la puissance et la configuration de ton installation. Je dirais qu'un relais avec une tension de pilotage de 5V avec une capacité contact de 230V est plus approprié.

Il existe des module relais très performant pour ton usage. Sainsmart a une gamme étendu de relais pilote tu devrais trouver ce qu'il te faut.

Pour exemple => 2-Channel 5V Relay Module | SainSmart – SainSmart.com

Voici un petit "schéma synoptique".

Arduino Sortie 5V o-----------o||Relais interface pilote||o------------o Masse.
|
|(liaison mécanique)
|
Alim Phase 230v o-----------------o// Contact pilote //o----o|| Bobine Contacteur || o---- Neutre Alim
|
|
|
Alim phase 230V o------------------------------------------o//Contact contacteur //o -----------o thermoplongeur o----o Neutre Alim.

Ça te fait une interface a un seul niveau !!

Surtout n'oublie pas de commander le matériel nécessaire pour la protection de ton installation en cas de court circuit.!! Protection fusible (ou disjoncteur) de la commande contacteur et du relais d'interface. Un fusible c'est moins chers et prend moins de place. Mais il faut le calibré en fonction du choix de chaque appareils commandé.

Pour la protection général met y un différentielle => ça coute chers mais moins que la vie !! (même si elle n'a pas de prix)

A plus !!

perso j'utiliserais un relais statique pour les raisons suivantes :

  • pas besoin d'interface l'arduino peu commander directement le relais
  • moins de parasites à la mise en sevice du thermoplongeur (coupure et mise en service au zero)
  • tes paliers de température ont l'air d'être précis tu vas peut être avoir besoin de moduler ta puissance de chauffe lorsque tu arrives dans la plage dans ce cas tu pourras faire du PWM sur la commande du relais
    en résumé que des avantages
    PS : les relais statiques existent même en format rail DIN donc peuvent être intégrés dans un tableau avec l'interupteur diff et le disjoncteur de protection

Re salut ; rjnc38
et hotury

Je suis également pour.

Tu régule la température en tout ou rien. A tu pensé une régulation par la modulation de tensions.
une fois à température tu maintiendrais une température plus linéaire avec un PI(D) bien-sur.

J'ai évoqué cette possibilité en début de poste. Libre choix de hotury pour le mode de régule.
C'est vrais c'est simple a mettre en place. Mais l’équipement vas êtres très sollicité donc usure prématuré.

De plus il vas gagner en consommation d'énergie. donc ça vaut le coup $$$$.
Si on réfléchie "process" ils est **déconseillé d'avoir des écarts de températures et fluctuation dans un traitement thermique ** Ce mode de chauffe te permettra de les éviter.

hotury on est deux a te faire cette proposition tu devrais l'étudier.

Quant tu as fini tu nous invite a boire une bieres ?? :wink:

A plus !!

Merci pour les conseil il existe des cartes avec des relais static 40A que je peux utiliser directement sans trop de montage?

Pour les paliers je ne me fais pas trop de souci sur la gestion de la température car je ne chauffe pas directement mon moult celui-ci circule grace à la pompe dans une boucle de chauffe en inox qui est plongé dans la cuve ou se trouve le thermoplongeur, la régulation de la température est donc bien plus précise.

Merci d'avance.

En faite je me demande si je peux piloter directement un relais statique depuis l'arduino ou s'il me faut faire un montage avec un contacteur (étant débutant j'aimerais autant me simplifier la vie).

merci d'avance pour vos réponses.