Gestion Chaufferie


#21

J’évoquais justement ce soir à l’acolab les problèmes de stabilité et de sécurité des Arduino et autres cartes raspberry et Cie…
Cqfd


#22

Je pense à un problème de fiabilité des cartes chinoise et peut être un problème de commande de la carte 8 relais par optocoupleur: sur-consommation sur les sorties.


#23

Si tu passes par des optocoupleurs, je ne vois pas ce qui pourrait “griller” les sorties!
Mais je pense que tu as largement les connaissances nécessaires pour faire un diagnostic, je me trompe ? non ? :smiley:


#24

Petites nouvelle du montage :
J’avais fait en faite une mise à jours de mes seuils de déclenchement avec le programme de prototype.
J’avais mal définis mes broches d’entrées et de sorties.
J’ai crue donc à tord que l’arduino avais grillé.
Je retente un allumage du poêle aujourd’hui.
Ha les mélanges de versions.
Je cherche un vrai programmeur avec qui je pourrais acquérir la rigueur professionnel .
Ca ne m’empêchera pas de faire quand même le système de surveillance.
La sonde DS18B20 a l’aire de remarcher
a+


#25

Est ce quelqu’un pourrait m aide a faire un programme sur raspbian qui récupère des donnés du port série les horodate et les envois dans une base mysql qui sera lue par un mini site web?
C est pour surveiller et analyser les variation de temperature
Merci d avance


#26

J4espère que ça t’aidera:
https://www.definit.co.uk/2018/07/monitoring-temperature-and-humidity-with-a-raspberry-pi-3-dht22-sensor-influxdb-and-grafana/
et sinon
http://raspberrywebserver.com/cgiscripting/rpi-temperature-logger/
ou
https://blog.bandinelli.net/index.php?post/2014/11/23/Température-suivie-avec-un-Raspberry-Pi-B%2C-une-sonde-DS18B20-et-Munin en Français :wink:


#27

bonjour,
j’aurai besoin de vos compétence en anglais :
je doit configurer ma carte et la je sèche
image

For 3-wire usage. Solder closed the jumper labeled 2/3 Wire and cut the wire connecting the left side of the 2-way
jumper right above Rref. Then solder closed the right side labeled 3

merci d’avance


#28

Pour un usage en 3 fils :

  • relie les pavés du label 2/3 avec un pont de soudure.

  • coupe la piste entre le pavé 24 et le pavé central, la petite piste très fine.

  • relie les pavés central et 3 par un pont de soudure

Le mar. 18 déc. 2018 à 08:59, gaeldu63 noreply-forum@acolab.fr a écrit :


#29

Super merci ça marche.
Il me reste a trouver 5m de câbles 3x0.25mm2 et un taraud pas americain.


#30

Bonsoir,
mon installation à évolue j’ai rajouté un sheild ethernet 28j60
28j60 .
avec une modification du programme.
Le problème est que la lecture des sonde prends 800ms/ sonde soit 2.4s donc le mini serveur web embarqué met trop de temps à répondre.
Sur les conseils de ratman au lieu d’utiliser l’instruction delais (800) j’ai utilisé l’instruction millis qui permet de faire une tempo sans bloquer le µP.
je vous met le programme complet:

//Programme d'essai d'algorithme de gestion du chauffage
// Vers 0.82
//Par Gael HEMET

// !!!!!  FONCTIONNELLE   !!!!!!!!!!!

//Montage avec carte 8 relais
//Montage avec afficheur 20x4 I2C 
//Montage avec sheild ethernet en28j60
//Montage définitif avec ARDUINO NANO
//Programme d'essai d'algorithme de gestion du chauffage avec lecture i2C
// 
//
/*changement depuis V0.72
 lecture plus rapide des sondes DS18b20 suite à une incompatibilité de timming avec serveur web
 */



/* Adresses des capteurs de température */
/*
 SENSOR_ADDRESS_1[] = { 0x28, 0xFF, 0x24, 0x5E, 0x3D, 0x04, 0x00, 0x97};
 SENSOR_ADDRESS_2[] = { 0x28, 0xC7, 0x19, 0x77, 0x1A, 0x13, 0x01, 0x62};
 SENSOR_ADDRESS_3[] = { 0x28, 0x5B, 0xF4, 0x5A, 0x1A, 0x13, 0x01, 0x75};
 SENSOR_ADDRESS_4[] = { 0x28, 0x92, 0xF7, 0x55, 0x1A, 0x13, 0x01, 0xA8};
 SENSOR_ADDRESS_5[] = { 0x28, 0xD3, 0x56, 0x4C, 0x1A, 0x13, 0x01, 0xBF};
 SENSOR_ADDRESS_6[] = { 0x28, 0xFF, 0x8F, 0x5C, 0x1A, 0x13, 0x01, 0xE1};
*/


/* Dépendance pour le bus 1-Wire */
#include <OneWire.h>
/*Dépendence pour afficheur LDC I2C*/
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,20,4);  // paramètre de l'affiche i2c (adresse,nb colonnes, nb de lignes)
/*Dépendence pour le module ethernet*/
#include <EtherCard.h>


/*Féfinition des variables*/
float TempPoele=0; //variable de temperature du Poele traduite . On l’initialise à 0.
float TempBallon=0; //variable de temperature du Ballon Tempon . On l’initialise à 0.
float TempSolaire=0; //variable de temperature du Ballon Solaire . On l’initialise à 0.
float TempPoeleP=0; //variable de temperature du Poele Provisoire traduite . On l’initialise à 0.
float TempBallonP=0; //variable de temperature du Ballon Provisoire Tempon . On l’initialise à 0.
float TempSolaireP=0; //variable de temperature du Ballon Provisoire Solaire . On l’initialise à 0.

boolean TempCheminee = false;//variable donnant l'état de la temperature de la cheminée (capteur tout ou rien réglable)
boolean EtatHeuresCreuse = false;//variable indiquant si on est en heure creuse(contact sec depuis le compteur EDF) non utilisé encore
int AffPoele=0; //variable pour afficher la temperature du poele.On l’initialise à 0.
int AffBallon=0; //variable pour afficher la temperature du ballon. On l’initialise à 0.
int AffSolaire=0; //variable pour afficher la temperature du ballon solaire. On l’initialise à 0.

unsigned long previousMillis=0 ; //variable du compteur tempo de mesure 1wire
int etatlecture=1; //variable de selection du capteur en cour de mesure
boolean startmesure=1; //variable indiquant si une mesure du capteur est en cour ou non

/* definition des broches*/

const int Cheminee= 5; // numero broche où est connecté le contacteur de temperature de la cheminé
const int HeuresCreuse= 4; // numero broche où est connecté le contacteur heure creuse
const int CircPoele = 6; // numero broche où est connecté le Circulateur du Poele et c'est la LED bleu
const int CircRadiateur = 7; // numero broche où est connecté le Circulateur des Radiateurs et c'est la LED verte
const int CircSolaire = 8; // numero broche où est connecté le Circulateur du Ballon Solaire et c'est la LED jaune

/* constante du bus 1-Wire */
const byte BROCHE_i2C = 3;
unsigned long interval1wire = 800; //tempo lecture de sonde 

/* Adresses des capteurs de température */
const byte Poele[] = { 0x28, 0xFF, 0x24, 0x5E, 0x3D, 0x04, 0x00, 0x97};
const byte Ballon[] = { 0x28, 0xC7, 0x19, 0x77, 0x1A, 0x13, 0x01, 0x62};
const byte Solaire[] = { 0x28, 0x5B, 0xF4, 0x5A, 0x1A, 0x13, 0x01, 0x75};
/* calibrage sonde*/
const float CalPoele = -1.02;
const float CalBallon = -1.41;
const float CalSolaire = -.95;

/* définition des valeurs de seuils*/

const int seuilpoele = 40;
const int seuilpoelehysteresis = 10;
const int seuilPoelesecu = 75;
const int seuilsolaire = 45;
const int seuilsolairehysteresis = 2;
const int seuilchauffage = 40;
const int seuilchauffagehysteresis = 5;

/* définition des constant pour le module ethernet */
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
static byte myip[] = { 192,168,0,203 };

/* Création de l'objet OneWire pour manipuler le bus 1-Wire */
OneWire ds(BROCHE_i2C);

/* parametrage du module ethernet*/
byte Ethernet::buffer[500];
BufferFiller bfill;

/*
 * Fonction de démarrage de la prise de mesure de la température via un capteur DS18B20.
 */
void startTemperatureMeasure(const byte addr[]) {
  // addr[] : Adresse du module 1-Wire détecté
  
  /* Reset le bus 1-Wire et sélectionne le capteur */
  ds.reset();
  ds.select(addr);
  
  /* Lance une prise de mesure de température  */
  ds.write(0x44, 1);
}

/**
 * Fonction de récupération de la prise de mesure de la température via un capteur DS18B20.
 */
float readTemperatureMeasure(const byte addr[]) {
  byte data[9];
  // data[] : Données lues depuis le scratchpad
  // addr[] : Adresse du module 1-Wire détecté
 
  /* Reset le bus 1-Wire, sélectionne le capteur et envoie une demande de lecture du scratchpad */
  ds.reset();
  ds.select(addr);
  ds.write(0xBE);
 
 /* Lecture du scratchpad */
  for (byte i = 0; i < 9; i++) {
    data[i] = ds.read();
  }
   
  /* Calcul de la température en degré Celsius */
  return (int16_t) ((data[1] << 8) | data[0]) * 0.0625; 
}
 
void setup() 
{
  /*initialisation du module ethenet*/
  // Change 'SS' to your Slave Select pin, if you arn't using the default pin
  if (ether.begin(sizeof Ethernet::buffer, mymac, SS) == 0)
  Serial.println(F("Failed to access Ethernet controller"));
  ether.staticSetup(myip);
  
  lcd.init(); // Initialisation de l'afficheur i2C
  lcd.backlight();// alumage retro éclairage
  lcd.setCursor(3,0);
  lcd.print("Initialisation");
  Serial.begin(9600); //Initialisation de la communication avec la console
  pinMode(CircPoele, OUTPUT); //CircPoele est une broche de sortie
  pinMode(CircRadiateur, OUTPUT); //CircRadiateur est une broche de sortie
  pinMode(CircSolaire, OUTPUT); //CircSolaire est une broche de sortie
  pinMode(Cheminee, INPUT); //CircSolaire est une broche d'entrée
  digitalWrite( Cheminee, HIGH);// active la résistance de tirage interne
  pinMode(HeuresCreuse, INPUT); //HeuresCreuse est une broche d'entrée
  digitalWrite( HeuresCreuse, HIGH);// active la résistance de tirage interne

/* initialisation des temperatures à la mise sous tension*/ 
  /* Lit les températures des trois capteurs */
  startTemperatureMeasure(Poele);
  delay(800);
  TempPoele = readTemperatureMeasure(Poele)+ CalPoele;
  startTemperatureMeasure(Ballon);
  delay(800);
  TempBallon = readTemperatureMeasure(Ballon)+CalBallon;
  startTemperatureMeasure(Solaire);
  delay(800);
  TempSolaire = readTemperatureMeasure(Solaire)+CalSolaire;
/* fin initialisation*/
  lcd.setCursor(8,2);
  lcd.print("Ok!");
  delay(1000);
  lcd.clear();
  lcd.print("Poele Ballon Solaire");
  lcd.setCursor(0,3);
  lcd.print("Cheminee froide");
  
}

/* pages web stoquée dans la flash*/
static word homePage() {

  bfill = ether.tcpOffset();
  bfill.emit_p(PSTR(
    
    "HTTP/1.0 200 OK\r\n"
    "Content-Type: text/html\r\n"
    "Pragma: no-cache\r\n"
    "\r\n"
    "<meta http-equiv='refresh' content='2'/>"
    "<title>Gestion Chauffage</title>"
    "<font size=""+9"">Poele=$D <br>Ballon=$D<br> Solaire=$D</font>"
    ),AffPoele,AffBallon,AffSolaire);
  return bfill.position();
}

void loop() {
  

  TempCheminee=digitalRead(Cheminee);
  EtatHeuresCreuse=digitalRead(HeuresCreuse);

  
  /* Lit les températures des trois capteurs */

  
 switch (etatlecture)
   { 
    case 1: //lecture temperature poele
      if (startmesure) //test si mesure commencée
        {
          startTemperatureMeasure(Poele); //demande la lecture
          startmesure=0; //indique que la lecture à commencée
        }
      if( millis() - previousMillis >= interval1wire) // test si la tempo de mesure est écoulée
        {
          previousMillis = millis();//réinitialise la tempo
          TempPoeleP = readTemperatureMeasure(Poele)+ CalPoele; // lit la temperature
          etatlecture=2;// demande de lecture du capteur suivant
          startmesure=1;// indique que la mesure est finie
        }
      break;
    case 2: //lecture temperature ballon
      if (startmesure) //test si mesure debutée
        {
          startTemperatureMeasure(Ballon);//demande la lecture
          startmesure=0;//indique que la lecture à commencée
        }
      if( millis() - previousMillis >= interval1wire)// test si la tempo de mesure est écoulée
        {
          previousMillis = millis();   //réinitialise la tempo
          TempBallonP = readTemperatureMeasure(Ballon)+CalBallon;// lit la temperature
          etatlecture=3;// demande de lecture du capteur suivant
          startmesure=1;// indique que la mesure est finie
        }
      break;
      case 3: //lecture temperature Solaire
      if (startmesure) //test si mesure debutée
        {
          startTemperatureMeasure(Solaire);//demande la lecture
          startmesure=0;//indique que la lecture à commencée
        }
      if( millis() - previousMillis >= interval1wire)// test si la tempo de mesure est écoulée
        {
          previousMillis = millis();//réinitialise la tempo
          TempSolaireP = readTemperatureMeasure(Solaire)+CalSolaire;// lit la temperature
          etatlecture=1;// demande de lecture du 1er capteur
          startmesure=1;// indique que la mesure est finie
        }
      break;
   }
  

  /* Test le valeur mesure*/
  /* si un ecard de 3 °C est constatée on regette la mesure et garde la précédente*/
  
  if (abs(abs(TempPoeleP)-abs(TempPoele))<3)
    {
      TempPoele=TempPoeleP;
    }
  if (abs(abs(TempBallon)-abs(TempBallon))<3)
    {
      TempBallon=TempBallonP;
    }
  if (abs(abs(TempSolaireP)-abs(TempSolaire))<3)
    {
      TempSolaire=TempSolaireP;
    }
 
    
  /* mise en forme des données pour affichage*/
  AffPoele = TempPoele;
  AffBallon = TempBallon;
  AffSolaire = TempSolaire;
  /* Affichage des temperature*/
  lcd.setCursor(1,1);
  lcd.print("                   ");//effacement ligne (suite bug affichage i2c)
  lcd.setCursor(1,1);
  lcd.print(AffPoele);
  lcd.setCursor(8,1);
  lcd.print(AffBallon);
  lcd.setCursor(16,1);
  lcd.print(AffSolaire);
  /*Affichage des valeurs sur moniteur Serie*/
//  Serial.print(" Temp Poele : ");
//  Serial.print(TempPoele);
//  Serial.print(" Temp Ballon : ");
//  Serial.print(TempBallon);
//  Serial.print(" Temp Solaire : ");
//  Serial.print(TempSolaire);
//  Serial.print("cheminee");
//  Serial.println(TempCheminee);
//  Serial.print(" Etat Heures Creuse : ");
//  Serial.println(EtatHeuresCreuse);

  /* affichage sur serveur web*/
  word len = ether.packetReceive();
  word pos = ether.packetLoop(len);
  if (pos)  // check if valid tcp data is received
    ether.httpServerReply(homePage()); // send web page data
  
/*algo gestion circulateur ballon tempon*/ 
  
  if (TempCheminee == 0)
    {  lcd.setCursor(9,3);
       lcd.print("chaude");
      
    if (TempPoele > seuilpoele)
      {
        digitalWrite(CircPoele, LOW); //met en marche le circulateur du poele 
      }
    
    else
      {
         if (TempPoele < seuilpoele-seuilpoelehysteresis) 
        {
          digitalWrite(CircPoele, HIGH); // arrete le circulateur du poele
        }
      }
    }
    else {
      digitalWrite(CircPoele, HIGH);// arrete le circulateur du poele
    
    lcd.setCursor(9,3);
    lcd.print("froide");
    }
   if (TempPoele >seuilPoelesecu)
    { digitalWrite(CircPoele, LOW); //met en marche le circulateur du poele 
    }

/* algo gestion circulateur chauffage*/
    if (TempBallon > seuilchauffage)
      {
        digitalWrite(CircRadiateur, LOW); //met en marche le circulateur des radiateurs 
      }
    
    else
      {
         if (TempBallon < seuilchauffage-seuilchauffagehysteresis) 
        {
          digitalWrite(CircRadiateur, HIGH); // arrete le circulateur des radiateurs
        }
      }
/* algo gestion circulateur ballon solaire*/

if (TempSolaire < TempBallon)
      {
        if (TempBallon > seuilsolaire )
            {
              digitalWrite(CircSolaire, LOW); //met en marche le circulateur du ballon solaire 
            }
        else
            {
              if (TempBallon < seuilsolaire - seuilchauffagehysteresis)
              {
                digitalWrite(CircSolaire, HIGH); // arrete le circulateur du ballon solaire
              }
            }
      }
    
else
      {
         if (TempSolaire > TempBallon+seuilsolairehysteresis) 
        {         
           digitalWrite(CircSolaire, HIGH); // arrete le circulateur du ballon solaire
        }
      }



}

#31

Désolé pour la mise en page mais le copié collé ne prend toute ma double identation.
Ma prochaine évolution sera l’envoi des temperatures sur un base de donnée SQL pour une étude de variation et donc une meilleur optimisation.
Je ferais évoluer mon montage en phase 2 avec un circuit en veroboard


comprenant un circuit support pour le nano et son sheild , des connecteurs pour mes 4 sondes de temperature 1Wire, un connecteur pour 2 module max 31865 (sonde de cheminée et sonde pour le four un petit bonnus):
image .
Pour la phase 3 je ferrai un vrai circuit imprimé avec un 2eme arduino qui surveille le premier.
bonne soirée


#32

Est ce qu il y aurai a l acolab une imprimante série (rs232 ou bus serie 5v)?
Je vais réaliser un montage identifiant et qualibrant mes 16 sondes 1wire .
Merci d avance


#33

Bin mon ami … ça commence à faire une belle usine à gaz !
Chapeau ! Belle programmation !
Je t’en parlerai, mais je suis en train d’étudier une régulation de température pour mon plancher chauffant pour ma chambre : actuellement in-réglable ! Ensuite, à étendre aux autre pièces si ça marche !
Actuellement, on règle le débit par un système de robinets à vis pointeau…

Je pense à faire un truc “style” MLI (PWM) sur une sortie Arduino qui irait piloter une EV 0/100% du circuit chambre, mais sur une base de temps relativement longue (créneaux de 1à5mn toutes les 10à60mn - temps estimé nécessaire à un tour de circuit de boucle dans la chambre - à contrôler bien sûr) ce qui représente 2 à 8 % de puissance, ce qui semble être le cas du réglage aujourd’hui (au pifomètre) et bien évidemment hyper sensible … ça joue sur du 1/4 de 1/8e de poil !!! D’où “un coup trop” … “un coup pas assez”… ce qui se traduit en langage simple par l’avis de Madame : << j’ai trop chaud !>> …ou … << Il fait froid, là, non ?>> Après cette analyse “scientifique et poussée” du système , Nous sommes donc bien en présence une régulation … T.O.R… :wink::laughing:
Pour la sonde, j’ai une Météo Oregon avec un “satellite mesure extérieure” en 433MHz qui doit pouvoir être “exploré” par une carte réception “433”, non ?
Après, si on veut maîtriser toute la chaîne des composantes du système, on peut aussi prendre en compte la T°ext, T°eau,T°plancherChauffant, tendances T°ext et chaudière et j’en oublie sans doute… Mais après, il faut plutôt un Rpi pour calculer tout ça et surtout la tronche pour programmer tout le tintouin :grin::grin::grin:
On en reparle…
À plus et je te souhaite une bonne année pleine de projets sympas…
Et bonne année à tous :wink:


#34

J’ai modifié ton post pour le mettre en page. Pour mettre du code sur plusieurs lignes il faut simplement commencer et terminer par une ligne avec juste trois back-quotes (```). Tu peux en plus ajouter le nom du language sur la 1ère ligne pour qu’il colorise. Par exemple :

```cpp
int foo = 42;
```
int foo = 42;

#35

La vaaaaaache ! ça a de la gueule maintenant… trop fort le site :clap: et Mike aussi :wink:


#36

Oui! Si tu utilises un RPi tu peux même essayer avec une clé USB SDR. C’est la grosse artillerie mais ta sonde semble faire partie du matériel reconnu par RTL_433:
[12] Oregon Scientific Weather Sensor
https://github.com/merbanan/rtl_433
On peut essayer si tu l’apportes à l’Acolab :wink:


#37

super !
merci Etienne, je vais regarder, ne serait-ce que par curiosité pour faire une appli avec le RPi, car je ne suis pas très à l’aise avec lui… Ça me ferait un bon exercice :wink:
Pour mon appli, je pensais travailler directement avec l’Arduino, mais j’aime bien ta proposition.
à +