thermostat via arduino

salut a tous
voila je suis un reprapeur ( RepRap pour ceux qui connaissent )
et j'ai besoin de faire un plateau chauffant
je me suis dit pourquoi ne pas utilisé un arduino pour faire ca vu que j'en est en standalone
seulement je ne sais pas si c'est possible
je vous explique le principe
un plateau en acier avec des trou et des résistances de chauffe vissé dessus ( genre ça http://t0.gstatic.com/images?q=tbn:ANd9GcTR4FyutEupaaGky92gfdSmDTJRXALIYrR9Hwo_TQ-TXzCLGXov )
donc pour amélioré un peu le système de base qui est de juste brancher et espérer que ça monte a la bonne température
je pensais amélioré un petit peu tout ça en ajoutant une sonde de température ainsi qu'un écran LCD et 2 boutons
la sonde pour savoir la température et l’afficher sur l’écran LCD
un bouton + pour monté en température
un bouton - pour descendre ( logique )
et derrière je pense a un gros transistor ( je sais pas si c'est ça qu'il faut que j'utilise ) pour alimenté ou non les résistances de chauffe
sur l’écran ya pas grand chose a afficher
juste la température demandé et la température réelle avec un + si ça augmente et un - si ça diminue
je pense que c'est faisable mais faut me confirme le matériel utilisé
peut être une led ou deux pour indiquer l'état de la plaque
rouge si ça chauffe vers si c'est a la bonne température et bleu si c'est froid
a vous de me dire ce que je peux utilisé pour arrivé a ça et si c'est possible de le faire sans que ça coute plus cher que un système tout fait ( que je n'est pas trouvé )
merci a vous

Tu peux utiliser ça :

https://forum.arduino.cc/index.php?topic=100190.0

En remplaçant le capteur de pression par un capteur de température, ensuite tu ajuste le code et ça roule chauffe XD

Je vais utiliser ce circuit pour faire également une étuve pilotée.

ouep pas bêtes ^^
ji avais pas pensé
merci a toi
je modifie ça et je voit si j'ai des problèmes

Après tout dépend aussi de la gamme de température :wink:

anthology:
ouep pas bêtes ^^
ji avais pas pensé
merci a toi
je modifie ça et je voit si j'ai des problèmes

bonjour
sympa le concept reprap , c'est un truc que j'aimerais bien essayer si j'avais un peu plus de place !
mais là ma femme ne veut pas ! :grin:
a noter que la température nominale dans la chambre de chauffe dépasse surement les 200° .
Les capteurs "silicium" type LM35 ou DS18B20 qui sont facilement interfaçable avec l'arduino ne sont pas là utilisable.
il faut se tourner vers de la CTN,PT100 ou si c'est vraiment chaud vers du thermocouple

  • les CTN n'ont pas une courbe de reponse lineaire, mais sont assez simple à interfacer sur une entrée ana.
    -Les PT100 sont "plus" linéaire
  • les thermocouples (type K les plus courant) nécessitent un circuit d'interface et d'amplification et opérant la compensation "froide", mais peuvent opérer dans une gamme de température plus large.

après voir pour la regul de T° à faire peut etre une regul en pseudo PID et gérer les résistances en PWM, ça l'arduino sait faire/driver sans trop de soucis

Attention PT100 c'est pas forcement facile, thermocouple avec un AD595AQ ça se fait aisément.

houla doucement ^^
comme j'ai précisé ce n'est pas pour la chambre de chauffe mais pour le plateau chauffant
donc en gros 0°C a 120°C grand maximum

anthology:
houla doucement ^^
comme j'ai précisé ce n'est pas pour la chambre de chauffe mais pour le plateau chauffant
donc en gros 0°C a 120°C grand maximum

ok
j'ai lu un peu vite :grin:
alors un LM35 est surement une bonne solution : facile à interfacer , un peu de marge en T° max

ouep ^^
je trouve un lm35
sinon mosfet pour piloter ?

C'est alimenté comment ce que tu dois piloter (220V ? )

en 12V
voir moins pour avoir la bonne température

anthology:
ouep ^^
je trouve un lm35
sinon mosfet pour piloter ?

oui un canal N basique un peu costaud , c'est ce qu'il y a de plus simple
j'aime bien le projet :grin:
je peux te donner un LM35 et un 05N03 (25V 80A)
---> MP

mp envoyé
par contre suis pas sur que mes résistances chauffe assez a 12V donc 24V max je pense ^^

anthology:
mp envoyé
par contre suis pas sur que mes résistances chauffe assez a 12V donc 24V max je pense ^^

ok
repondu
question : l'alim des resistances c'est bien en CC , pas en CA
quelle valeur les résistances, quelle puissance ?
combien de resistances , montage serie,//, mix ?
24V pour un 05N03 ça risque d'etre short !
je vais regarder ce que j'ai un peu plus haut en V.

l'alim sera bien en CC oui
résistance j'ai le choix entre 1 ohm X4 ( 4 résistances )
ou 1.5 ohm ou 2.2 ohm
la c'est a moi de choisir vu que c'est le meme prix
je pensez utilisé la même alim pour la carte et pour les résistance donc logiquement si je prends les 2.2ohm ca devrais chauffé plus avec moins de courant ( si je me rappel bien de mes cours d'elec )
ensuite puissance 25W par résistance me semble
le montage ça me change rien donc au choix

bon histoire d’être chiants je peux pas utilisé ton code pour la pompe a vide vu que les écran LCD que j'ai actuellement ce pilote en liaison série
j'ai le choix entre TTL/CMOS et RS232
ensuite j'attends d'avoir mon LM35 pour attaquer

Jean Francois j'ai pas mal d'erreur en compilant ton sketch ^^

sketch_sep11b:62: error: stray '\' in program
sketch_sep11b:62: error: stray '\' in program
sketch_sep11b:64: error: stray '\' in program
sketch_sep11b:64: error: stray '\' in program
sketch_sep11b:70: error: stray '\' in program
sketch_sep11b:70: error: stray '\' in program
sketch_sep11b:72: error: stray '\' in program
sketch_sep11b:72: error: stray '\' in program
sketch_sep11b:72: error: stray '\' in program
sketch_sep11b:95: error: stray '\' in program
sketch_sep11b:101: error: stray '\' in program
sketch_sep11b:108: error: stray '\' in program
sketch_sep11b:108: error: stray '\' in program
sketch_sep11b:110: error: stray '\' in program
sketch_sep11b:110: error: stray '\' in program
sketch_sep11b:118: error: stray '\' in program
sketch_sep11b:118: error: stray '\' in program
sketch_sep11b:121: error: stray '\' in program
sketch_sep11b:121: error: stray '\' in program
sketch_sep11b:125: error: stray '\' in program
sketch_sep11b:125: error: stray '\' in program
sketch_sep11b:128: error: stray '\' in program
sketch_sep11b:128: error: stray '\' in program
sketch_sep11b:219: error: stray '\' in program
sketch_sep11b.cpp: In function 'void setup()':
sketch_sep11b:52: error: 'PRESSUREPIN' was not declared in this scope
sketch_sep11b:62: error: 'u201c' was not declared in this scope
sketch_sep11b:64: error: expected `)' before 'J'
sketch_sep11b:70: error: expected `)' before 'Etalonnage'
sketch_sep11b:72: error: expected `)' before 'de'
sketch_sep11b.cpp: In function 'void loop()':
sketch_sep11b:87: error: 'PRESSUREPIN' was not declared in this scope
sketch_sep11b:95: error: expected `;' before 'u2013'
sketch_sep11b:101: error: expected `;' before 'u2013'
sketch_sep11b:108: error: 'u201c' was not declared in this scope
sketch_sep11b:110: error: expected `)' before 'u201d'
sketch_sep11b:118: error: 'u201cmBar' was not declared in this scope
sketch_sep11b:121: error: 'u201c' was not declared in this scope
sketch_sep11b:121: error: 'u201d' was not declared in this scope
sketch_sep11b:125: error: 'u201cStart' was not declared in this scope
sketch_sep11b:128: error: 'u201cStop' was not declared in this scope
sketch_sep11b:156: error: expected `)' before 'else'
sketch_sep11b:159: error: expected `)' before 'else'
sketch_sep11b:161: error: expected primary-expression before '}' token
sketch_sep11b:161: error: expected `;' before '}' token
sketch_sep11b.cpp: In function 'void Minus()':
sketch_sep11b:219: error: expected `;' before 'u2013'

une idée ??

Essaye ça :

#include <LiquidCrystal.h> // Inclusion de la librairie pour afficheur LCD 

const int RS=2; //2//declaration constante de broche 
const int E=19;//3 //declaration constante de broche 

const int D4=18;//4 //declaration constante de broche 
const int D5=17;//5 //declaration constante de broche 
const int D6=16;//6 //declaration constante de broche 
const int D7=15;//7 //declaration constante de broche 

LiquidCrystal lcd(RS, E, D4, D5, D6, D7);// initialisation LCD en mode 4 bits 

const int PRESSUREPIN = 0; // déclaration de la constante de broche // capteur de pression

const int CurrentPin=7;//4 //declaration constante de broche 
const int PlusPin=8;//5 //declaration constante de broche // inter +
const int MinusPin=6;//6 //declaration constante de broche // inter -
const int StartPin=5;//7 //declaration constante de broche // inter start/stop

int plusVal=0; // variable du bouton + 
int minusVal=0;// variable du bouton -
int buttonPlus=300; // variable de l'état du bouton +
int buttonMinus=300; // variable de l'état du bouton -
int startVal=0;// variable du bouton start
int  etatStart=0;// variable d'état de la commande de démarrage du compresseur

long Time=0;
long oldTime=0;
long motorOldTime=0;
long oldLcdTime=0;

float pressure=0;
float RTPressure=0;
float atmoPressure=0;
int pressureVal=0;

const int motorPinDem=9;
const int motorPin=10;
int motorState=0;

float filterVal=0.9;


void setup(){

  pinMode(CurrentPin,OUTPUT); // 5 volts pour interrupteurs de sélection
  pinMode(PlusPin,INPUT); // interrupteur +
  pinMode(MinusPin,INPUT); // interrupteur -
  pinMode(StartPin,INPUT); // interrupteur start/stop

  pinMode(motorPinDem,OUTPUT);
  pinMode(motorPin,OUTPUT);

  pinMode (PRESSUREPIN,INPUT);
  pressure=analogRead(PRESSUREPIN);
  atmoPressure=(((pressure/(1023/5))/5)+.04)/.004*10;  // calcul de la pression avec un capteur MPX4250A

  lcd.begin(16,2); // Initialise le LCD avec 20 colonnes x 4 lignes 

  delay(10); // pause rapide pour laisser temps initialisation

  // Test du LCD
  //lcd.blink() ;
  
   lcd.print("   Conception   ") ; // affiche la chaîne texte - message de test
  lcd.setCursor(0,1);
  lcd.print("   J-F Schmid   ") ;
  delay(3000); // pause de 3 secondes

  lcd.clear(); // // efface écran et met le curseur en haut à gauche
  delay(10); // pour laisser le temps d'effacer écran
  
  lcd.print("   Etalonnage   ") ; // affiche la chaîne texte - message de test
  lcd.setCursor(0,1);
  lcd.print(" de la pression ") ;
  delay(3000); // pause de 3 secondes

  lcd.clear(); // // efface écran et met le curseur en haut à gauche
  delay(10); // pour laisser le temps d'effacer écran

}

void loop(){

  digitalWrite(CurrentPin,HIGH);
  plusVal=digitalRead(PlusPin);
  minusVal=digitalRead(MinusPin);
  startVal=digitalRead(StartPin);

  pressure=analogRead(PRESSUREPIN);
 
  RTPressure= lpfilter(float((((pressure/(1023/5))/5)+.04)/.004*10)*.9+(RTPressure*.1), filterVal , RTPressure); // filtrage et conversion en pression atmo
  
  if (plusVal==0) {
    buttonPlus=300;
  }
  else {
    buttonPlus--;
  }
  if (minusVal==0) {
    buttonMinus=300;
  }
  else{
    buttonMinus--;
  }

  //lcd.setCursor(0, 0) ; // positionne le curseur à l'endroit voulu (colonne, ligne) (1ère=0 !) 
  Time=millis();
  if (Time-oldLcdTime>100){
    lcd.setCursor(0,0);
    lcd.print("     ") ; // affiche la valeur de la variable
    lcd.setCursor(6,0);
    lcd.print("     ") ;
    oldLcdTime=Time;
  }
  lcd.setCursor(0,0);
  lcd.print(pressureVal) ; // affiche la valeur de la variable
  lcd.setCursor(6,0);
  lcd.print(int(RTPressure-atmoPressure)) ; // affiche la valeur de la variable
  lcd.setCursor(12,0);
  lcd.print("mBar");

  lcd.setCursor(0,1);
  lcd.print(" +  -");

  lcd.setCursor(10,1);
  if (etatStart==0){
    lcd.print("Start");
  }
  else {
    lcd.print("Stop ");
  }

  Time=millis();
  if (minusVal==1){
    Minus();
  }
  else{
  }
  if (plusVal==1){
    Plus();
  }
  else{
  }
  if (startVal==1){
    if (Time-oldTime>500){
      etatStart=!etatStart;
      Time=millis();
      oldTime=Time;
    }
    else{
    }
  }

  else{
  }


  if ((etatStart==0)||((RTPressure-atmoPressure)<pressureVal)){
    Stop();
  }
  else if ((RTPressure-atmoPressure)>pressureVal+20){
    Start();
  }
  else{
  }
}


// ----- memo LCD --- 
// LiquidCrystal(rs, enable, d4, d5, d6, d7) ; // initialisation 4 bits
// lcd.begin(cols, rows); // initialisation nombre colonne/ligne
// 
// lcd.clear(); // efface écran et met le curseur en haut à gauche
// lcd.home(); // repositionne le curseur en haut et à gauche SANS effacer écran
// 
// lcd.setCursor(col, row) ; // positionne le curseur à l'endroit voulu (colonne, ligne) (1ère=0 !) 
// lcd.print("texte") ; // affiche la chaîne texte
// 
// lcd.cursor() ; // affiche la ligne de base du curseur 
// lcd.noCursor() ; // cache le curseur 
// lcd.blink() ; // fait clignoter le curseur
// lcd.noBlink() ;// stoppe le clignotement du curseur
// lcd.noDisplay() ; // éteint le LCD sans modifier affichage
// lcd.display() ; // rallume le LCD sans modif affichage
// 
// lcd.scrollDisplayLeft(); // décale l'affichage d'une colonne vers la gauche
// lcd.scrollDisplayRight(); // décale l'affichage d'une colonne vers la droite 
// lcd.autoscroll() ; // les nouveaux caractères poussent les caractères déjà affichés
// noAutoscroll(); // stoppe le mode autoscroll





void Start(){
  digitalWrite(motorPin,1);
  digitalWrite(motorPinDem,0);
  if (motorState==0){
    motorState=1;
    Time=millis();
    motorOldTime=Time;
  }
  else{
  }
  Time=millis();
  if (motorState==1 && Time-motorOldTime<800 ){  
    digitalWrite(motorPinDem,1);
  }
  else{
  }
}


void Stop(){
  digitalWrite(motorPinDem,0);
  digitalWrite(motorPin,0);
  motorState=0;
}


void Plus(){
  if (Time-oldTime>buttonPlus){
    pressureVal++;
    Time=millis();
    oldTime=Time;
  }
}

void Minus(){
  if (Time-oldTime>buttonMinus){
    pressureVal--;
    Time=millis();
    oldTime=Time;
  }
}




float lpfilter(float data, float filterVal, float filteredVal){

  if (filterVal > 1){
    filterVal = .99;
  }
  else if (filterVal <= 0){
    filterVal = 0;
  }

  filteredVal = (data * (1 - filterVal)) + (filteredVal * filterVal);

  return filteredVal;
}

merci a toi ca passe
une idée de pourquoi ca fait autant d'erreur sur l'ancien ?
sinon je dois avoir une temp de référence ou pas ?

si tu l'avais copié sur mon site, c'est probablement l'encodage qui diffère.

Qu'entends tu par temp de référence ?