aide pour la gestion d'une application sur raspberryPi
-
salut as tous , je souhaite crée une application sur mon rasbperry pi4 qui gere un systeme climatisation (chaud et froid) avec mes gpios (pin) , avec un ecran tactile .
j'ai fais toute un programme "prototype" (https://github.com/ludoiphone/QtGainable) mais je bloque sur plusieurs chose .
j'aimerai avoir votre avis sur la maniere de proceder par rapport a :
au lancement du programme :
l'ecran affiche 5 temperatures qui se mettent a jours tous les 10 secondes (en lisent un fichier "temperature"), trois boutons (un bouton "consigne" , un bouton "arret" et un bouton " marche" qui s'affiche quand le bouton "arret" est cliker) et en meme temps j'ecrit dans le fichier "temperature" la temperature lue des 5 sondes toute les 15 secondes.
cela est ok et fonctionnel.puis en meme temps je lance mon programme "gainable" qui lui enclenche si ma pin thermostat est HIGH l'un de mes 4 modes (froid, chaud,canicule et filtre) en fonction de ma temperature ( en lisent dans le fichier "temperature") .
"gainable" ce m'est a jour toute les secondes pour verifier le filtre et la pin thermostat (si LOW ou HIGH) la aussi je pense que c'est bon !mais la ou je bloque est dans la class Froid du code github plus haut , je souhaite remplacer les tempos time(NULL) par des Qtimer singleShot mes je n'y arrive pas sans erreur dans le terminal
void Froid::tempos() { m_timerVoletsFr = new QTimer(this); m_timerVoletsFr ->setSingleShot(true); connect(m_timerVoletsFr, &QTimer::timeout, this, &Froid::tempoVoletsFr); m_timerVoletsFr ->start(timerVoletsFr); } void Froid::tempoVoletsFr() // tempo de 10 secondes { qDebug() << "tempoVoletFr()"; gifVentilationFroid = true; etatsGainableFroid = TEMPO_VENTILATION_FROID; } void Froid::tempoVentilationFr() // tempo de 2 minutes 30 secondes { qDebug() << "tempoVentilationFr()"; m_froidTemperatures ->lireTemperatureUniteInt(); m_froidConsignes ->lireConsignesGainable(); if (m_froidTemperatures ->temperatureUnitInt > m_froidConsignes ->consigneDepartFroidEnFroid) { // si la temperature unite interieur est supperieur (reglable) gifVentilationFroid = false; gifVentilationIntFroid = true; gifVentilationExtFroid = true; etatsGainableFroid = TEMPO_V4V_FROID; // passe en prodution de froid } else if (m_froidTemperatures ->temperatureUnitInt < m_froidConsignes ->consigneDepartChauffageEnFroid) { // si non si la temperature unite interieur est inferieur as 22°C m_froidRelais.activeRelaiEteHiver();//relai étéHiver (mode chauffage) //labelModeFroid = false; //m_froidChauffage.labelModeChauffage = true; //m_froidChauffage.froidChauffage(); // passe en mode chauffage } else { etatsGainableFroid = TEMPO_VENTILATION_FROID;//TEMPO_VOLETS_FROID; } }
je sais pas ci c'est la bonne maniere mais j'ai choisi un swith case
void Froid::modeFroid() { //m_timerVoletsFr = new QTimer(this); //m_timerVoletsFr ->setSingleShot(true); //connect(m_timerVoletsFr, &QTimer::timeout, this, &Froid::tempoVoletsFr); switch (etatsGainableFroid) { case TEMPO_VOLETS_FROID: qDebug() << "TEMPO_VOLETS_FROID"; //QTimer::singleShot(timerVoletsFr, this, &Froid::tempoVoletsFr); //m_timerVoletsFr = new QTimer(this); //m_timerVoletsFr ->setSingleShot(true); //connect(m_timerVoletsFr, &QTimer::timeout, this, &Froid::tempoVoletsFr); //m_timerVoletsFr ->start(timerVoletsFr); //m_timerVoletsFr = new QTimer(this); //m_timerVoletsFr ->setSingleShot(true); //connect(m_timerVoletsFr, &QTimer::timeout, this, &Froid::tempoVoletsFr); //m_timerVoletsFr ->start(timerVoletsFr); break; case TEMPO_VENTILATION_FROID: qDebug() << "TEMPO_VENTILATION_FROID"; m_froidRelais.activeRelaisVentilationInt(); QTimer::singleShot(timerVentilationFr, this, &Froid::tempoVentilationFr); break;
merci a vous tous , de m'orienté dans la bonne direction . cordialement
-
Bonsoir
Pour la partie timer, la ligne
m_timerVoletsFr ->start(timerVoletsFr);
est problématique car il faut passer la durée du timer (si ce n'est pas déjà fait par le setter correspondant) et non le pointeur vers l'objet lui même. Il n'y a pas besoin de repasser l'instance en argument puisque la méthode s'applique déjà sur cette instance.
la version correcte devrait donc êtrem_timerVoletsFr->start(10000) ;
-
Pour le switch, je suggérerais quelque chose du style
switch(condition) { case1: method1(args) ; break ; case2: method2(args) ; break ; case3: method3(args) ; break ; default: ??? }
pour avoir quelque chose d'un peu plus lisible et plus maintenable, en créant les nouvelles méthodes vraisemblablement en protected ou en private.
Si le besoin de faire évoluer et de rajouter d'autre cas se fait sentir, à un moment où à un autre il pourra être opportun d'évoluer vers un pattern strategy. -
j'avais oublier le .h
#ifndef FROID_H #define FROID_H #include <ctime> #include "consignes.h" #include "temperatures.h" #include "filtre.h" #include "relais.h" class Froid: public QObject { Q_OBJECT public: Froid(); bool gifFroid = false; bool gifVentilationFroid = false; bool gifVentilationIntFroid = false; bool gifVentilationExtFroid = false; bool gifVentilationDegFroid = false; bool gifDegivrageFroid = false; bool gifEgouttageFroid = false; bool degivrageFroid = false; unsigned long long departChronoFiltreFr; unsigned long long finChronoFiltreFr; unsigned long chronoNettoyageFiltreFr; void modeFroid(); void arretFroid(); void chauffageFroid(); public slots: void tempos(); private: Temperatures *m_froidTemperatures; Consignes *m_froidConsignes; Filtre *m_froidFiltre; Relais m_froidRelais; QTimer *m_timerVoletsFr; int timerVoletsFr = 10000; // 10 secondes int timerVentilationFr = 15000; // 2 min 30 secondes int timerV4VFr = 4500; // 45 secondes int timerCompresseurFr = 7800; // 1 minute 30 secondes //int timerLancementDegivrageFr = 120000; // 20 minutes int timerDegivrageFr = 120000; // 20 minutes int timerControleDegivrageFr = 12000; // 2 minutes int timerFinDegivrageFr = 10000; // 10 secondes int timerEgouttageFr = 30000; // 5 minutes int timerFinEgouttageFr = 18000; // 3 minutes enum { TEMPO_VOLETS_FROID, TEMPO_VENTILATION_FROID, TEMPO_V4V_FROID, TEMPO_COMPRESSEUR_FROID, TEMPO_DEGIVRAGE_FROID, TEMPO_CONTROLE_DEGIVRAGE_FROID, LANCEMENT_DEGIVRAGE_FROID, TEMPO_FIN_DEGIVRAGE_FROID, TEMPO_EGOUTTAGE_FROID, TEMPO_FIN_EGOUTTAGE_FROID, TEMPO_ARRET, //COMMANDE_CANICULE, //TEMPO_V4V_CANICULE, //TEMPO_COMPRESSEUR_CANICULE, //TEMPO_DEGIVRAGE_CANICULE, } etatsGainableFroid;// = TEMPO_VOLETS_FROID; void tempoVoletsFr(); void lancementDegivrageFr(); private slots: //void tempoVoletsFr(); void tempoVentilationFr(); void tempoV4VFr(); void tempoCompresseurFr(); void tempoDegivrageFr(); //void tempoLancementDegivrageFr(); void tempoControleDegivrageFr(); void tempoFinDegivrageFr(); void tempoEgouttageFr(); void tempoFinEgouttageFr(); }; #endif //FROID_H