Et voila une version simple qui lit l'identification des capteurs d'un fichier de configuration et ensuite lit à répétition , au 5 secondes environ , les capteurs qui sont envoyés dans une matrice vector "ds_temperature".
J'ai aussi formaté l'affichage pour une précision de 0.5 degrée celsius.
Cela ne devrait pas être trop dur à comprendre. Il restera à modifier le fichier de configuration en json ou xml, je préfère xml, de cette façon tu pourras ajouter tes autres paramètres.
P.S. ne pas oublier de lire le fichier de configuration sur le même répertoire ou simplement modifier "loadDSConfig()" avec le bon chemin du fichier.
voici mon nouveau main.cpp
J'ai aussi formaté l'affichage pour une précision de 0.5 degrée celsius.
Cela ne devrait pas être trop dur à comprendre. Il restera à modifier le fichier de configuration en json ou xml, je préfère xml, de cette façon tu pourras ajouter tes autres paramètres.
P.S. ne pas oublier de lire le fichier de configuration sur le même répertoire ou simplement modifier "loadDSConfig()" avec le bon chemin du fichier.
voici mon nouveau main.cpp
Code:
#include <string>#include <algorithm>#include <iostream>#include <fstream>#include <iomanip>#include "gpioPin.hpp"#include <unistd.h>#include <signal.h>#include <math.h>#include <array>#include "BB_DS18B20.hpp"#include <vector>using namespace std;BB_DS18B20 * ds18b20;std::vector<unsigned long long > ds_ID; //vector contenant l'ID des ds18b20std::vector<double> ds_temperature; //vector qui va contenir les températures des ds18b20void loadDSConfig(string filename, std::vector<unsigned long long> &array){ unsigned long long ds_ID; stringstream ss; ifstream file(filename); if (file.is_open()) { string line; while (getline(file, line)) { // enleve espace line.erase(remove(line.begin(), line.end(), ' '), line.end()); // avons-nous au moins 17 caracteres if(line.size() ==17) { // ok avons-nous 28- if(line.substr(0,3) == "28-") { stringstream ss(line.substr(3,-1)); ss >> hex >> ds_ID; ds_ID = (ds_ID << 8) | 0x28; array.push_back(ds_ID); // valide donc insère ce capteur dans la matrice vector ds_ID } } } file.close(); }}void lireDS18B20(){ // partir une conversion ds18b20->GlobalStartConversion(); // lire les capteurs // l'indetification des DS18B20 sont dans ds_ID for(uint loop=0;loop < ds_ID.size();loop++) { if(ds18b20->ReadSensor(ds_ID[loop])) { // valeur valide ds_temperature[loop]=ds18b20->temperature; } else ds_temperature[loop]=-9999.9; }}void afficherDS18B20(){ // afficher les valeurs de températures // les valeurs sont dans la matrice en vecteur ds_temperature for(uint loop=0;loop < ds_ID.size();loop++) { cout << ds18b20->IdToString(ds_ID[loop]) << " : "; if(ds_temperature[loop]==(-9999.9)) cout << "-----" << endl; else cout << setw(6) << fixed << setprecision(1) << (int(ds_temperature[loop]*2))/2.0 << "°C" << endl; }}int main(void){ /****** ceci est le setup ******/ int DS_PIN=4; pinMode(DS_PIN,OPENDRAIN_PULLUP); ds18b20 = new BB_DS18B20(gpioline[DS_PIN]); // charge info sur les ds18b20 loadDSConfig("DS18B20.conf", ds_ID); // créer le vecteur contenant la température des DS18b20 for(uint loop=0;loop< ds_ID.size() ;loop++) ds_temperature.push_back(-9999.9); // enregistre une information invalide pour commencer /****** ceci est la loop *****/ while(1) { lireDS18B20(); afficherDS18B20(); // insérer deux lignes cout << endl << endl; // Délai de 4.25 secondes environ usleep(4250000); } delete ds18b20; return 0;}
Code:
daniel@Pi5:~/gpiod_cpp $ ./test28-270217C1129CFF : 16.0°C28-C40217C1283EFF : 16.0°C28-050117C1747EFF : 17.0°C28-270217C14203FF : 16.5°C28-EC0217C0FCEBFF : 16.5°C28-060117C190E7FF : 17.0°C28-270217C1129CFF : 16.0°C28-C40217C1283EFF : 16.0°C28-050117C1747EFF : 17.0°C28-270217C14203FF : 16.5°C28-EC0217C0FCEBFF : 16.5°C28-060117C190E7FF : 17.0°C
Statistics: Posted by danjperron — Sat Feb 03, 2024 2:35 am