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;
}
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.
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.
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.
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.
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é !!.
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.
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.
Surtout n'oublie pas de commander le matériel nécessaire pour la protection de ton installationen 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)
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
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 ??
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.
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).