salut,
j'ai terminé mon code, tout marche nickel donc je partage !
Idée : gérer la température à l’intérieur de ma caravane.
j'utilise un poêle à bois avec échangeur de chaleur.
je régule la température intérieure via la vitesse du ventilo.
//automate pour poele à bois avec échangeur de chaleur pour chauffage caravane.
// 2 sondes de température un ventilo 12v un potentiometre et une carte nano
#include <OneWire.h> // librairie pour capteur OneWire sonde
#include <LiquidCrystal.h>
OneWire ds(6); // sondes sur le pin 6
byte addr1[8] = {
0x28, 0xD8, 0x68, 0x3E, 0x3A, 0x19, 0x01, 0xBD};//capteur température int
byte addr2[8] = {
0x28, 0x8F, 0x1C, 0x5D, 0x3A, 0x19, 0x01, 0x7C};//capteur température sortie hot
int SignBit = 0;
int StartCol = 8;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int in1 = 8; //entrées pour Ln298N
int in2 = 9; //entrées pour Ln298N
int ConA = 10; //entrée en PWM pour L298N
int speed1; //vitesse definie via potensiometre
int BOUTON1 = 7; //bouton manu/auto
int BOUTON2 = 13; //bouton consigne
int valtempin; //variable de la température interieur
int valtemphot; //variable température de sortie d'air chaud
int cons ; //variable de température de consigne
void setup() {
pinMode(BOUTON2,INPUT); //bouton consignes
pinMode(BOUTON1, INPUT); //BOUTON auto/manu
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
Serial.begin(9600);
// colones et lignes lcd
lcd.begin(16, 2);
// Print le message sur le LCD.
lcd.print("Tint:");
lcd.setCursor(0, 1);
lcd.print("Thot:");
}
int tc_100(byte* addr) {
int HighByte, LowByte, TReading;
byte data[12];
byte i;
ds.reset();
ds.select(addr);
ds.write(0x44, 1);
delay(1000); // defini le nombre de mesrures par seconde
ds.reset();
ds.select(addr);
ds.write(0xBE);
for ( i = 0; i < 9; i++) {
data[i] = ds.read();
}
LowByte = data[0];
HighByte = data[1];
TReading = (HighByte << 8) + LowByte;
SignBit = TReading & 0x8000; // test most sig bit
if (SignBit) // si negatif
{
TReading = (TReading ^ 0xffff) + 1; // 2's comp
}
return (6 * TReading) + TReading / 4; // multipli par (100 * 0.0625) or 6.25
}
//////////////////Void pour écriture de la température des sondes//////////////////////////////
void mypr(int Tc_100, int line) {
int Whole, Fract;
Whole = Tc_100 / 100;
Fract = Tc_100 % 100;
if (SignBit) // si temp negative
{
lcd.setCursor(StartCol, line);
lcd.print("-");
}
lcd.setCursor(StartCol + 1, line);
lcd.print(Whole);
lcd.print(".");
if (Fract < 10)
{
lcd.print("0");
}
lcd.print(Fract);
lcd.print("C");
}
///////////////////////////////////////////////////boucle du programme//////////////////////////////////////////////////////
void loop() {
byte i;
byte data[12];
int Tc_100;
Tc_100 = tc_100(addr1);
mypr(Tc_100, 0);
Tc_100 = tc_100(addr2);
mypr(Tc_100, 1);
///////////lectre Temperature de consigne////////////////////
if ( digitalRead(BOUTON2) == HIGH){ //////bouton 2 defini le mode jour (20deg et nuit 17deg)
cons = 1700 ;
}
else {
cons = 2000 ;
}
///////////////mode manuel//////////////////////
if (digitalRead(BOUTON1) == HIGH)
{
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
speed1 = analogRead(A0);
speed1 = speed1 * 0.2492668622;
analogWrite(ConA, speed1);
}
////////////////mode auto/////////////////////////
else {
byte i;
byte data[12];
int Tc_100;
Tc_100 = tc_100(addr1);
mypr(Tc_100, 0);
valtempin = tc_100(addr1);
Tc_100 = tc_100(addr2);
mypr(Tc_100, 1);
valtemphot = tc_100(addr2);
if ( valtempin > valtemphot) { //sécurité si le poele vient à s'éteindre
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
analogWrite(ConA, 0);
}
if ( valtempin < cons && valtempin < valtemphot) { //vetilletion à fond si consigne non atteinte
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
analogWrite(ConA, 255);
}
if ( valtempin > cons && valtempin < valtemphot) { //régulation de la vitesse du ventilo si consigne atteinte
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
analogWrite(ConA, 140);
}
}
}
//////////////////////////// --- Fin programme ---////////////////////////////////////