2017-09-20 14 views
-1

greetins,Sonde de température ne fonctionne pas

J'ai récemment acheté un capteur d'humidité température & (aosong am2302). Je l'ai accroché à une râpe pi 3 et cela fonctionne comme le charme de la bibliothèque adafruit. Le problème vient quand j'essaie de le faire fonctionner sur une autre carte (décrit here). J'ai utilisé this library pour la lecture gpio. J'ai modifié le fichier de beaglebone pour le mapping gpio et c'est tout. Je cours les tests et ils fonctionnent, donc fondamentalement la lib ressemble à ça fonctionne. Donc après cela, je code le lecteur de capteur et ça ne marche pas et je ne sais pas pourquoi. Après avoir exécuté le lecteur de capteur, si je vérifie le système de fichiers, le fichier gpio est exporté.

Le capteur est installé comme ceci: -Alimentation à 5 V (aussi essayé avec 3.3v) -VCC à GPIO -Au à la masse.

et ici le code

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <stdint.h> 
#include <sys/wait.h> 
#include <sys/time.h> 

#include "libsoc_gpio.h" //library for gpio reading 

#define MAXTIMINGS 10 
#define SILENT 0 

int bits[MAXTIMINGS+1],data[5]; 
int readDHT(int pin,int allowRetry); 

int 
main(int argc, char **argv) 
{ int dhtpin; 
    if (argc>1)dhtpin=atoi(argv[1]); 
    else printf("Introduce pin"); 

    if(SILENT < 1) { 
     printf("Using pin #%d\n", dhtpin); 
    } 
    readDHT(dhtpin,5); 
    return 0; 
} 


int 
readDHT(int pin, int allowRetry) 
{ 
    int bitidx=0; 
    int counter = 0; 
    int i=0,j=0; 
    data[0] = data[1] = data[2] = data[3] = data[4] = 0; 

    gpio *gpio_output = libsoc_gpio_request(pin, LS_SHARED); //export GPIO 

    if (gpio_output == NULL) 
    { 
     fprintf(stderr, "Failed to open GPIO %d\n", pin); 
     return -1; 
    } 

    libsoc_gpio_set_direction(gpio_output, OUTPUT); 
    if (libsoc_gpio_get_direction(gpio_output) != OUTPUT) 
    { 
     fprintf(stderr, "Failed to set direction to OUTPUT\n"); 
     if (gpio_output) 
     { 
      libsoc_gpio_free(gpio_output); 
     } 
     return -1; 
    } 

    libsoc_gpio_set_level(gpio_output, LOW); 
    libsoc_gpio_set_level(gpio_output, HIGH); 

    libsoc_gpio_set_direction(gpio_output, INPUT); 

    /* Wait for pin to drop */ 
    while (libsoc_gpio_get_level(gpio_output) == HIGH) 
    { 
     if(counter++>10000){ 
      printf("ERROR: Pin never dropped\n"); 
      return 1; 
     } 
    } 
    if (i<= MAXTIMINGS) 
    { 
     counter =0; 
     while (libsoc_gpio_get_level(gpio_output) == LOW){ 
      if(counter++ == 1000) 
       break; 
     } 
     counter =0; 
     while(libsoc_gpio_get_level(gpio_output) == HIGH){ 
      if (counter++==1000) 
       break; 
     } 
     bits[bitidx++] = counter; 
     i++; 
    } 


    /* read data */ 
    for (i = 1; i < bitidx; i++) { 
     data[j/8] <<= 1; 
     if(bits[i]>200){ 
      data[j/8] |= 1; 
     } 
     j++; 
    } 
    if(SILENT < 1) { 
     printf("Data (%d): 0x%x 0x%x 0x%x 0x%x 0x%x\n", j, data[0], data[1], data[2], data[3], data[4]); 
    } 
    if ((j >= 39) && (data[4] == ((data[0] + data[1] + data[2] + data[3]) & 0xFF))) { 


      float f, h; 
      h = data[0] * 256 + data[1]; 
      h /= 10; 

      f = (data[2] & 0x7F)* 256 + data[3]; 
       f /= 10.0; 
       if (data[2] & 0x80) f *= -1; 
      printf("CTemp: %.1f\nFTemp: %.1f\nHum: %.1f%\n", f, ((f*9)/5)+32, h); 
     } else if(allowRetry > 0) { 
      sleep(1); 
      if(SILENT < 1) { 
      printf("Error getting information. Retrying\n"); 
      } 
      return readDHT(pin, --allowRetry); 
     } else { 
      if(SILENT < 1) { 
      printf("Error getting information. Retries exhausted.\n"); 
      } 
      return 1; 
     } 

     return 0; 

    if (gpio_output) 
    { 
     libsoc_gpio_free(gpio_output); 
    } 

    /* Check we got all the data and checksum matches */ 
} 

Avec ce code, je reçois "Pin jamais laissé tomber", si la broche ne va jamais à 0 il doesnt les données du rapport. J'ai donc décidé d'essayer avec bash et de voir si la broche tombe à 0. J'ai codé la même chose que sur le code précédent mais dans bash et voir la valeur de la broche (toujours 1, ne pas tomber). En ce qui concerne ce point, je n'ai plus d'options, le capteur fonctionne (ce n'est pas cassé), la librairie fonctionne mais le capteur sur cette machine ne fonctionne pas. Toute idée ou idée sur la façon d'approcher pour trouver une solution?

Merci :)

+5

La question peut être plus approprié pour https://raspberrypi.stackexchange.com/, surtout si elle est sur la différence entre les différents panneaux de framboise. – Lundin

+0

Ce n'est pas un panneau de framboise celui que j'utilise. J'ai utilisé Rasp seulement pour confirmer que le capteur n'était pas cassé. – Lomezno

+0

combien de temps ce signal reste-t-il faible? est-il assez long pour que votre matériel puisse le voir? –

Répondre

1

Certaines choses à essayer qui pourrait vous aider à aller ....

  1. première augmentation du compteur « contre ++> 10000 » à quelque chose de beaucoup plus grande, il se pourrait que la Le nouveau processeur que vous utilisez incrémente le compteur à un rythme beaucoup plus rapide et vous expire juste avant que la broche ne tombe. Si cela ne fonctionne pas, retirez le compteur de temps d'attente et bouclez pour toujours dans votre source, retirez également le capteur, puis tirez physiquement la ligne de données à la terre avec un fil et vérifiez si votre code/nouveau processeur attrape le changement de signal, au moins alors vous savez que votre source/matériel est configuré correctement afin que vous puissiez concentrer vos efforts ailleurs.

  2. Vérifiez à nouveau la compatibilité de la tension entre le niveau «élevé» de votre nouveau processeur et le seuil «élevé» des capteurs pour vous assurer qu'il capte un «un» sur la ligne de données.

  3. Laissez savoir comment vous allez!

Tony

+0

C'est un commentaire trop long. N'utilisez pas une réponse pour cela. Nous ne sommes pas un site de tutorat/débogage/conseil et ces questions ne doivent pas être répondues (voir méta) du tout. – Olaf

+0

Je vérifiais le code de test et quelque chose ne va pas, la carte envoie quelques signaux qui sont détectés par le test, donc je ne peux pas compter sur le test pour dire que la lib fonctionne.J'ai aussi vu sur la documentation que le port de données du capteur est SDA, donc je ne sais plus si je devrais le brancher sur gpio ou sur la broche i2c. – Lomezno