Gazogéne automatisé avec arduino

|500x138

voici un projet de gazogéne automatisé a fonctionnement continu commencé il y a preque 1 an sa conception est simple pour être reproductible façilement et a moindres couts

le systéme est composé de deux arduino UNO:

le premiers contôle la température et le remplissage du foyer, le deuxiéme accouplé au pavé tft tactile adafruit gére l'interface de contrôle.

je cherche un programmeur qui pourrait m'aider a mettre le code au propre car je sais bien souder mais la programmation avec mes gros doigts c'est pas ça

merçi

https://www.youtube.com/watch?v=B5Ftc4PQCCc

Joli projet.

Je mets le lien vers ton site :

http://www.technopartage.net/

merci pour vos encouragements

j’ai bricolé un truc avec deux arduino mais je pense que de tout mettre sur une mega serait une meilleure option ( je pourrai enfin lire la température sur le TFT) :slight_smile: mais la je suis au bout de mes capacités avec les booléens
j’ai fait un brave code qui tourne, mais cela a finit avec des delays grossiers dans l’état nominal
pour faire tourner le convoyeur par séquences

    /*********************    FONCTIONNEMENT NOMINAL    ****************************************/
  case ETAT_NOMINAL :
    { 
      int sensorPhotoValue = map(analogRead(A2),0,1024, 0,100); // On met de 100 à 0 car c'est inversé sur le capteur : max lumiere / 1 pas de lumière

      Serial.println("");
      Serial.print("Valeur capteur photo:");
      Serial.print(sensorPhotoValue);
      Serial.println("");


      if(temperatureGaz >= THRESHOLD_TEMPERATURE_MAX)  {
        etatFonctionnement = ETAT_KO;
        digitalWrite(outPinBroyeur, LOW);
        digitalWrite(outPinConvoyeur, LOW);
        digitalWrite(outPinBougies, LOW);
        digitalWrite(outPinDecendreur, LOW);
        digitalWrite (outPinVentilo12v, LOW);
        digitalWrite (outPinVentilo5v, HIGH);
        digitalWrite (outPinLed_KO, HIGH); 
        Serial.print("Etat KO");
      }

     
      if ((sensorPhotoValue<=CAPTEUR_PHOTO_SEUIL1_LUMIERE_OK) &&(detectionCapteurPhotoSeuil_1 == CAPTEUR_SEUIL1_DETECTE_NO)) {
        Serial.print("LATENCE CHARGEMENT") ; 
        tempsLatenceChargement = millis () / 100 ;
        tempsLatenceChargement = tempsDepuisInitArduino ;  
        detectionCapteurPhotoSeuil_1 = CAPTEUR_SEUIL1_DETECTE_YES;
        initialisationPrechauffage = INITIALISATION_PRECHAUFFAGE_NON;

      }

      if ((sensorPhotoValue<=CAPTEUR_PHOTO_SEUIL1_LUMIERE_OK)&&(detectionCapteurPhotoSeuil_1 == CAPTEUR_SEUIL1_DETECTE_YES) && ((tempsDepuisInitArduino-tempsLatenceChargement) >= DUREE_LATENCE_CHARGEMENT)) {

        Serial.print("0-Detection lumiere2 OK ==> activation broyage (latence)");        
        digitalWrite (outPinBroyeur,HIGH);  
         tempsDetectionCapteurPhotoSeuil_1 = tempsDepuisInitArduino;
    

      }

      if (((tempsDepuisInitArduino - tempsLatenceChargement)>= DUREE_CYCLE_LATENCE1) && (detectionCapteurPhotoSeuil_1 == CAPTEUR_SEUIL1_DETECTE_YES))  {
        Serial.print("1-Detection lumiere OK ==> Activation convoyage ");
        digitalWrite (outPinConvoyeur,HIGH);
        delay(1500);
        digitalWrite (outPinConvoyeur,LOW);
        Serial.print("pause convoyage ");
        delay(3000);

      }
     
      // Detection de franchissement de seuil a l abaisse ==> photo < Seuil2
      if ((sensorPhotoValue >=CAPTEUR_PHOTO_SEUIL2_LUMIERE_KO) &&(detectionCapteurPhotoSeuil_1 == CAPTEUR_SEUIL1_DETECTE_YES)) {        
        digitalWrite(outPinConvoyeur, LOW);
        Serial.print("fin Convoyage");
        detectionCapteurPhotoSeuil_1 = CAPTEUR_SEUIL1_DETECTE_NO;
        tempsFinConvoyage = millis () /100 ;
        tempsFinConvoyage = tempsDepuisInitArduino; 
      }
      if (((tempsDepuisInitArduino -tempsFinConvoyage) >=  DUREE_CYCLE_LATENCE2)&&(detectionCapteurPhotoSeuil_1 == CAPTEUR_SEUIL1_DETECTE_NO)) {   
        Serial.print("3-Detection lumiere KO ==> Arret broyage ");         
        digitalWrite(outPinBroyeur,LOW);
        initialisationPrechauffage = INITIALISATION_PRECHAUFFAGE_OUI;
        
      } 
      
      
      if(((tempsDepuisInitArduino - tempsCycleDecendrage) >= DUREE_CYCLE_DECENDRAGE ) && (initialisationDecendrage == INITIALISATION_DECENDRAGE_OUI))  {
        digitalWrite (outPinDecendreur, HIGH) ;
        Serial.print ("decendrage");
        tempsDureeDecendrage = millis ()/100;
        tempsDureeDecendrage = tempsDepuisInitArduino ;
        initialisationDecendrage = INITIALISATION_DECENDRAGE_NON ;
      }

     if(((tempsDepuisInitArduino - tempsDureeDecendrage) >= DUREE_DECENDRAGE )&&(initialisationDecendrage == INITIALISATION_DECENDRAGE_NON )) {
        digitalWrite (outPinDecendreur, LOW) ; 
        Serial.print ("arret decendrage") ;
        tempsCycleDecendrage = millis () / 100 ;
        tempsCycleDecendrage = tempsDepuisInitArduino;
        initialisationDecendrage = INITIALISATION_DECENDRAGE_OUI ;
      }  
      if (val3 <= 500) {
        digitalWrite (outPinVentilo12v, HIGH );
         initialisationVentilo12 = INITIALISATION_VENTILO12_OUI;
      }
      if ((val3 >= 500) && (initialisationVentilo12 == INITIALISATION_VENTILO12_OUI)) {
        digitalWrite (outPinVentilo12v, LOW);
        initialisationVentilo12 = INITIALISATION_VENTILO12_NON;
      }

      if (val >= 500) {
        etatFonctionnement = ETAT_VEILLE ;
      }

      if ((val2 <= 500)&& (initialisationPrechauffage == INITIALISATION_PRECHAUFFAGE_OUI)) {   //  inter on/off   sortie TFT
        digitalWrite (outPinBougies, HIGH );
        Serial.print ("Allumage Bougies");
        initialisationDecendrage = INITIALISATION_DECENDRAGE_OUI ;
        tempsCycleDecendrage = millis () / 100 ;
        tempsCycleDecendrage = tempsDepuisInitArduino ;
        tempsDepartVentilation = millis () / 100 ;
        tempsDepartVentilation = tempsDepuisInitArduino ;
        etatFonctionnement = ETAT_PRECHAUFFAGE ;      
      }
    }
    break;


  }

}

Est ce que tu peux mettre le code complet avec les déclaration, le setup et la loop ?

Tu utilise déjà la fonction millis() ?

Le délai de 3 secondes, c'est pour que convoyage ne puisse pas tout de suite être à HIGH ?

désolé mais je suis limité par la limite max de charactéres, je vais le mettre en plusieurs fois
pour ce code mon frêre m’avait expliquer la fonction millis()/100 comme le moyen d’exprimer les valeures dans les #define de temps en secondes au lieu de milliémes,
je bute sur le convoyeur car celui-ci a trop de debit pour le broyeur est comme les variteurs de vitesses on tous cramés j’avais trouvé cette astuce de déclanchements cycliques

#include <max6675.h>
#define outPinConvoyeur                     6
#define outPinBroyeur                       8
#define outPinBougies                       5
#define outPinDecendreur                    3
#define outPinVentilo12v                   7

#define ETAT_VEILLE                             199
#define ETAT_PRECHAUFFAGE                       200
#define ETAT_NOMINAL                            201
#define ETAT_KO                                 198

#define THRESHOLD_TEMPERATURE_MAX              3000  
 
#define INITIALISATION_PRECHAUFFAGE_OUI           5
#define INITIALISATION_PRECHAUFFAGE_NON           9
#define INITIALISATION_DECENDRAGE_OUI             7
#define INITIALISATION_DECENDRAGE_NON             8
#define INITIALISATION_VENTILO12_OUI              11
#define INITIALISATION_VENTILO12_NON              12
#define INITIALISATION_CHARGEMENT_OUI             6

#define CAPTEUR_SEUIL1_DETECTE_YES                1  
#define CAPTEUR_SEUIL1_DETECTE_NO                 0  

#define CAPTEUR_PHOTO_SEUIL1_LUMIERE_OK                     20 // si < Lumière ==> OK  
#define CAPTEUR_PHOTO_SEUIL2_LUMIERE_KO                     50// si > Pas de Lumière ==> KO


#define  DUREE_CYCLE_DECENDRAGE             300
#define  DUREE_DECENDRAGE                   10
#define  DUREE_CYCLE_LATENCE1               120 
#define  DUREE_CYCLE_LATENCE2               200
#define  DUREE_LATENCE_DEPART_VENTILATION   600
#define  DUREE_LATENCE_CHARGEMENT           50

int analogPin  = A3; // inter allumage TFT
int analogPin2 = A4; // inter prechauffage TFT
int analogPin3 = A5; // inter ventilation TFT

// DECLARATION VARIABLES GLOBALES  ///////////////////////////////////////////////////////
int etatFonctionnement;
int dureeLatence1;
int dureeLatence2 ;
int tempsFinConvoyage ;
int tempsFinBroyage ;

int tempsLatenceChargement ;

int initialisationPrechauffage ;

int tempsDureeDecendrage ;
int tempsCycleDecendrage ;


int initialisationVentilo12 ;

int initialisationChargement ;
int initialisationDecendrage ;

int tempsDepartVentilation ;


int tempsDetectionCapteurPhotoSeuil_1;
int detectionCapteurPhotoSeuil_1;

int thermoDO = 11;  // Data Out Port SPI sur 4-5-6
int thermoCS = 10;  //Chip Select
int thermoCLK = 9;  //Clock

MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);

int val = 0;  // ecran TFT état préchauffage
int val2 = 0; // ecran TFT  état nominal
int val3 = 0;  // écran TFT ventilation

///////////////////////////////// SETUP()   //////////////////////////////////////////////////////////////////////
void setup() {


  Serial.begin(9600);

  pinMode(outPinConvoyeur,OUTPUT);
  pinMode(outPinBroyeur,OUTPUT);
  pinMode(outPinBougies,OUTPUT);
  pinMode(outPinDecendreur,OUTPUT);
  pinMode(outPinVentilo12v,OUTPUT); 
  pinMode(outPinVentilo5v,OUTPUT);
  pinMode(outPinLed_KO,OUTPUT);
  
   digitalWrite(outPinBroyeur, LOW);
   digitalWrite(outPinConvoyeur, LOW);
   digitalWrite(outPinBougies, LOW);
   digitalWrite(outPinDecendreur, LOW);
   digitalWrite (outPinVentilo12v, LOW);
    
  delay  (3000);

  etatFonctionnement = ETAT_VEILLE; 

}

///////////////////////////////    LOOP()  ////////////////////////////////////////////////////////////////////
void loop() {



  int tempsDepuisInitArduino = millis()/100;
  Serial.print (val);
  val = analogRead(analogPin);  
  Serial.print (val2);
  val2 = analogRead(analogPin2); 
 Serial.print (val3);
  val3 = analogRead(analogPin3);
  double temperatureGaz = thermocouple.readCelsius();
  Serial.print("C = "); 
  Serial.println(thermocouple.readCelsius());
  delay(500);


  switch (etatFonctionnement){

Je me marre.... yen a qui mettent pas de balises code et toi... t'en mets trop :grin:

C'est corrigé :D

Pour ton timing de convoyage tu peux t'inspirer de ce code avec millis() :

https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay

C'est pas trop compliqué... fais un essai et si jamais appel au secours :grin:

Ca ma l'air trés bien

je teste ça demain merci

ca marche nickel !!!

Cela fera quand même plus sérieux dans le dossier technique, en attendant qu'un programmeur veuille se faire un gazogène pour le refaire au propre :)

   if (((tempsDepuisInitArduino - tempsLatenceChargement)>= DUREE_CYCLE_LATENCE1) && (detectionCapteurPhotoSeuil_1 == CAPTEUR_SEUIL1_DETECTE_YES))  {
        Serial.print("1-Detection lumiere OK ==> Activation convoyage ");
         if (currentMillis - previousMillis >= interval) {
       
        previousMillis = currentMillis;

     
       if (ConvoyeurState == LOW) {
          ConvoyeurState = HIGH;
       } else {
        ConvoyeurState = LOW;
        }
  
      }
[code]

bonjour [HUM] en fait si j'ai bien vu la video, c'est juste un "machin" qui sert à recharger la batterie qui sert à démarrer le "machin" ? :grin:

retour sérieux 8) projet interessant comment tu gere "le combustible" utilisé (cendres ?

  • Anecdotiquement , on est pas loin de la procedure de demarrage d'un "Artouste" (phase gaz) :grin:

bon c'est sur c'est pas le même rendement qu'un chalumeau volant mais il y quand même quelques W excédentaires :)

pour le drainage des cendres il a fallu trouver le bon diamétre des trous de la grille et la faire tourner de 1/2 tour toutes les 30s avec un moteur de tourne broche, c'est une histoire de compromis entre le renouvellement du foyer et le debit de cendres.

monoxyde: pour le drainage des cendres il a fallu trouver le bon diamétre des trous de la grille et la faire tourner de 1/2 tour toutes les 30s avec un moteur de tourne broche, c'est une histoire de compromis entre le renouvellement du foyer et le debit de cendres.

"Compromis , chose due" comme disait un trop tôt disparu :grin: réflexion à chaud :D AMHA tu dois avoir sur cette partie "système" une(des) bonne piste d’amélioration du rendement final. là ton ejection/remplissage "carbu" n'est gérée il me semble qu'au "pifomètre de precision " 8)

Effectivement avec ce système, il doit y avoir pas mal de scories qui ne sont pas totalement consumées.

Comment rempli tu le foyer pour le premier allumage et comment "estimes" tu (quelles mesures ?) la quantité de remplissage.

As tu un détecteur de flammes ?

Je dois avouer ne pas avoir tout décortiqué... :grin:

Pour l'alimentation ce n'est pas vraiment du continu il y a une zone tampon qui rend le fonctionnement autodémerdant avec une remise a niveau tout les 2mns environ le problême du décendrage sur un gazo viens du fait qu'il n'y a pratiquement pas de drainage aérodynamique car l'apport en air plus faible que pour une combustion compléte alors le foyer a tendance a ce figer la reduction des cendres est pratiquement la même mais il lui faut un petit coup de pied pour bouger sur les vidéos on voit souvent les gazoneurs trainer autour du foyer avec un marteau !!!

monoxyde: ... pour une combustion compléte alors le foyer a tendance a ce figer la reduction des cendres est pratiquement la même mais il lui faut un petit coup de pied pour bouger sur les vidéos on voit souvent les gazoneurs trainer autour du foyer avec un marteau !!!

bonjour Y a pas trop de mystere , c'est aussi la methode pragmatique * :grin: utilisée dans des installations industrielles d'incineration : Le "marteau" est alors remplacé par des masses sur verins pneumatiques qui tapent sur les enveloppes. Dans ton cas , utiliser un "bon electro-aimant" est peut etre une idée ...

* C'est aussi une des causes principales des nuisances sonores induites pour les "riverains"

J'ai essayer pas mal de choses et le moteur de tourne broche a 19€ sur ebay est une option qui marche plutôt bien tout en étant trés simple a fabriquer. le nouveau projet maintenant va étre de tester un systéme multi foyers ( va vraiment falloir que j'achéte une mega) et de le tester sur une mazda qui traine dans le jardin.

Salut ,il en est ou le projet ?

pareil, c'est passionnant ton truc, ça en est où ?