IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Raspberry Pi Discussion :

Aide pour lire fichier DS18B20 sur rpi4 en c++


Sujet :

Raspberry Pi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    dépanneur grande cuisine frigoriste
    Inscrit en
    Juin 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : dépanneur grande cuisine frigoriste

    Informations forums :
    Inscription : Juin 2020
    Messages : 11
    Par défaut Aide pour lire fichier DS18B20 sur rpi4 en c++
    Salut à tous.
    J'aimerai une variable pour chacune de mes sondes qui sont extraites du fichier txt du dossier device (W1) des sondes DS18B20
    j'ai commencé à &crire un bout de code en c++ pour obtenir ces variables pour chaque sonds, j'obtiens bien chaque id .
    je n'arrive pas à donner un petit nom pour chacune d'entre elles et d'afficher leur température .
    en sachant que le dossier se compose comme tel : /sys/bus/w1/devices/28-3ce1e3805e9f/temperature ,/sys/bus/w1/devices/28-3ce1e38060ec/temperature ect.

    et mon code :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    #include <stdio.h>
    #include <dirent.h>
    #include <string.h>
    #include <fcntl.h>
    #include <stdlib.h>
    #include <unistd.h>
     
    int main (void) {
        DIR *dir;
        struct dirent *dirent;
        char dev[16];      // Dev ID
        char devPath[128]; // Path to device
        char buf[256];     // Data from device
        char tmpData[6];   // TempA * 1000 reported by device
        char path[] = "/sys/bus/w1/devices";
     
        //ssize_t numRead;
     
        dir = opendir (path);
     
        if (dir != NULL) {
    	while ((dirent = readdir (dir)))
     
    	if (dirent->d_type == DT_LNK && strstr(dirent->d_name, "28-") != NULL) {
    	    strcpy(dev, dirent->d_name);
    	    printf("\nDevice: %s\n", dev); // affiche tous les ID des sondes
    	    sprintf(devPath, "%s/%s/w1_slave\n", path, dev);
    	    printf(devPath);
    	    //strncpy(tmpData, strstr(buf, "t=") + 2, 5);
    	    float tempC = strtof(tmpData, NULL);
    	    printf("%.3f C\n", tempC / 1000);
    	}
    	(void) closedir (dir);
    	printf("\nfichier fermer\n");
        } else {
    	perror ("Impossible d'ouvrire le fichier W1\n");
    	return 1;
        }
    }

    merci pour votre aide, car je bloque !

  2. #2
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 072
    Billets dans le blog
    47
    Par défaut
    Bonjour,

    Citation Envoyé par ludoiphone Voir le message
    j'ai commencer as ecrire un bout de code en c++
    Ce n'est pas du C++, mais du C.

    Citation Envoyé par ludoiphone Voir le message
    en sachant que le dossier ce compose comme tel : /sys/bus/w1/devices/28-3ce1e3805e9f/temperature ,/sys/bus/w1/devices/28-3ce1e38060ec/temperature ect.
    Ce serait plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    /sys/bus/w1/devices/28-3ce1e3805e9f/w1_slave 
    /sys/bus/w1/devices/28-3ce1e38060ec/w1_slave
    ...
    avec un fichier texte w1_slave, non ?


    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ...
    	    sprintf(devPath, "%s/%s/w1_slave\n", path, dev);
    	    printf(devPath);
     
    	    //strncpy(tmpData, strstr(buf, "t=") + 2, 5);
    	    float tempC = strtof(tmpData, NULL);
    	    ...

    devpath contient le chemin vers le fichier texte, par exemple : /sys/bus/w1/devices/28-3ce1e3805e9f/w1_slave.

    Pour récupérer la température, il te manque l'étape d'ouverture du fichier (FILE *fp = fopen(devPath, "r"), puis il faut rechercher la sous-chaîne de caractères qui contient l'information de température.

    Il y a déjà plein de codes sur Internet qui font ça...

  3. #3
    Membre habitué
    Homme Profil pro
    dépanneur grande cuisine frigoriste
    Inscrit en
    Juin 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : dépanneur grande cuisine frigoriste

    Informations forums :
    Inscription : Juin 2020
    Messages : 11
    Par défaut
    merci à toi oui, j'ai vu pas mal de choses, mais pas avec plusieurs sondes, je ne vois pas comment faire pour lire tous mes capteurs en même temps avec chacun un petit nom !
    je pensais à une classe, mais je suis débutant dans la manière d'écrire une classe et aussi pour lire un fichier .
    Si tu avais un exemple de code avec des petites explications, je serais ravi.

  4. #4
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 072
    Billets dans le blog
    47
    Par défaut
    Tu te fais une fonction pour lire la température pour un capteur donné :

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    void read_temperature(const char *devPath, const char *dev) {
        char buf[256];              /* Data from device */
        char tmpData[6];            /* Temp is C * 1000 reported by device */
        ssize_t numRead;
     
        int fd = open(devPath, O_RDONLY);
        if (fd == -1) {
            perror("Couldn't open the w1 device!");
            return;
        }
     
        while ((numRead = read(fd, buf, sizeof(buf))) > 0) {
            strncpy(tmpData, strstr(buf, "t=") + 2, 5);
            float tempC = strtof(tmpData, NULL);
            printf("Device: %s - ", dev);
            printf("Temp: %.3f C", tempC / 1000);
        }
     
        close(fd);
    }


    Puis, dans la boucle qui parcourt les répertoires, quand tu as l'identifiant dev et le chemin devpath du capteur :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ...
    	    printf("\nDevice: %s\n", dev); // affiche tous les ID des sondes
    	    sprintf(devPath, "%s/%s/w1_slave\n", path, dev);
    	    printf(devPath);
     
    	    read_temperature(devPath, dev); // lecture de la température du capteur en cours
    ...

    À tester... Et si ça ne fonctionne pas, c'est de la faute à chatGPT

  5. #5
    Membre habitué
    Homme Profil pro
    dépanneur grande cuisine frigoriste
    Inscrit en
    Juin 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : dépanneur grande cuisine frigoriste

    Informations forums :
    Inscription : Juin 2020
    Messages : 11
    Par défaut
    oui j'ai dejà essayé ce code, mais il affiche la température d'une sonde et pour numread ?
    Comment puis-je n'avoir la lecture que d'une seule sonde avec une variable par sondes, merci, j'ai 5 sondes !

  6. #6
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 072
    Billets dans le blog
    47
    Par défaut
    Tu peux définir une structure pour les capteurs :

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct { 
        char dev[16];         // ex. : "28-3ce1e3805e9f"
        char devPath[128];    // ex. : "/sys/bus/w1/devices/28-3ce1e3805e9f/w1_slave"
    } Device

    et remplir un tableau de capteurs :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    Device myDevices[5]; // 5 capteurs ds18b20

    Tu pourras accéder au capteur i (i entre 0 et 4) avec :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    read_temperature(myDevices[i].devPath, myDevices[i].dev)

Discussions similaires

  1. [XL-2013] Besoin d'aide pour créer un report sur un fichier excel
    Par wjulien57 dans le forum Conception
    Réponses: 5
    Dernier message: 15/12/2015, 21h09
  2. aide pour touver un tuto sur les fichiers
    Par shadowless dans le forum Débuter
    Réponses: 2
    Dernier message: 22/04/2011, 11h22
  3. Besoin d'aide pour lire un fichier Excel
    Par Sekigawa dans le forum C#
    Réponses: 7
    Dernier message: 04/03/2010, 13h46
  4. Réponses: 1
    Dernier message: 26/02/2010, 11h02
  5. aide pour lire le contenu d'un fichier de base de donnée
    Par hichamo dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 11/05/2006, 10h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo