Встроенный DHT11, температура становится первой после первой печати - PullRequest
0 голосов
/ 08 октября 2019

Итак, я пытаюсь настроить DHT11 в среде C, чтобы попытаться узнать больше о программировании встроенного программного обеспечения.

Я получил помощь от других источников и документация , чтобы создать это, и температура показывает только один раз, а затем по умолчанию 0. 0. 1007 *

Я использую Arduino в качестве микроконтроллера (потому что он единственный) и использую среду Linux Ubuntuзагрузить программу в микроконтроллер.

В конце код выглядит так:

#include <avr/io.h>
#include <stdio.h>
#include <stdlib.h>
#include <util/delay.h>

#include "dht.h"

// Trying to set up the DHT11 so it can be used in this project
void read() {

  // The bits are for to get the temperature values in.
  // reqCounter is for the request later on.
  uint8_t bits[5];

  // Setting up the DDRD as OUTPUT and PORTD as HIGH
  DDRD |= (1 << DDD5);
  PORTD |= (1 << PORTD5);
  _delay_ms(100);

  /*
   * Makes an request to get the data from the DHT11
   * Set the the PORTD5 as LOW
  */
  PORTD &= ~(1 << PORTD5);
  _delay_ms(18);
  // Setting it back to high and DDRD as an input
  PORTD |= (1 << PORTD5);
  _delay_us(1);
  DDRD &= ~(1 << DDD5);

  /*
   * Checking to see if the ACK is happening
  */
  _delay_us(39);
  if ((PIND & (1 << PIND5))) {
    return;
  }
  _delay_us(80);
  if (!(PIND & (1 << PIND5))) {
    return;
  }
  _delay_us(80);

  // Holds the temperature 
  uint8_t temp;

  // Reading the data
  for (uint8_t i = 0; i < 5; i++) {
    // Create a for loop that looks in to every 8 bits
    for (uint8_t j = 0; j < 8; j++) {
      // While it isn`t high, loop this while loop
      while (!(PIND & (1 << PIND5)))
              ;
        _delay_us(30);
        // Looking if the input is still high after 30us
        if (PIND & (1 << PIND5)) {
          temp |= (1 << (7-i));
        }
        // Wait until the input is low.
        while (PIND & (1 << PIND5))
          ;
    }
      // Put the temperature in the bit array
      bits[i] = temp;
  }

  // Resets the pins
  DDRD |= (1 << DDD5);
  PORTD |= (1 << PORTD5);
  _delay_ms(100);

  uint8_t temperature ;
  //checks the sum and gets the temperature 
  if (bits[0] + bits[1] + bits[2] + bits[3] == bits[4]) {
    temperature = bits[2];
  }

  printf("temperature : %d\n", temperature );
  /*printf("%d", bits[0]);
  printf("%d", bits[1]);
  printf("%d", bits[2]);
  printf("%d", bits[3]);
  printf("%d\n", bits[4]);*/
}

В результате получается всего 15 раз, а затем отмечается больше. Я пытался поднять его, чтобы повысить температуру, но ничего не произошло.

В чем здесь проблема?

Заранее спасибо

Ответы [ 3 ]

1 голос
/ 08 октября 2019

Здесь:

  uint8_t temperature ;
  //checks the sum and gets the temperature 
  if (bits[0] + bits[1] + bits[2] + bits[3] == bits[4]) {
    temperature = bits[2];
  }

  printf("temperature : %d\n", temperature );

Если bits[0] + bits[1] + bits[2] + bits[3] == bits[4] равно false, то температура инициализируется (и может иметь любое значение - включая ноль или 15, одно из этих значений является нежелательным).

Возможно:

static uint8_t temperature = 0 ;

Так что, когда bits[0] + bits[1] + bits[2] + bits[3] != bits[4], будет использоваться последняя действительная температура.

Или, проще, если temperature не будет использоваться в другом месте:

  //checks the sum and gets the temperature 
  if (bits[0] + bits[1] + bits[2] + bits[3] == bits[4]) 
  {
      printf( "temperature : %d\n", bits[2] ) ;
  }

То, что я представляю себе, происходит здесь, однако неинициализированное значение temperature получилось равным 15, и вы печатаете его, после чего bits[0] + bits[1] + bits[2] + bits[3] == bits[4] становится true, а биты [2] всегда равны нулю,В этом случае ошибка находится на входе, а значения помещаются в bits[], и это решение приведет к тому, что значение всегда будет равно нулю.

0 голосов
/ 12 октября 2019

Непонятно, почему вы решили переписать (и разорвать) код в « другие источники », а не просто использовали его как есть:

void read( void )
{
    printf("temperature : %d\n", (int)DHT11_GetData(DHT11_DATA_TEMPERATURE)) ;
}
0 голосов
/ 10 октября 2019

Итак, спасибо всем за помощь, но мне удалось найти способ заставить его работать. Если вы хотите узнать как, я поместил его в pastebin , чтобы вы все могли его увидеть.

Но, короче говоря, я внес изменение, чтобы оно выглядело примерно такв циклах for:

    // Reading the data and starts with bits 0 up to 4
  for (j = 0; j < 5; j++) {
        uint8_t result = 0;
    // I read every bit in the system to be able to get it in to the bits.
        for (i = 0; i < 8; i++) {
            while (!(PIND & (1 << PIND5)))
                ; //wait for an HIGH input
        // delay for 30us
            _delay_us(30);
      //if the input is HIGH then I will put the data in result
            if (PIND & (1 << PIND5))
                result |= (1 << (7 - i));
            while (PIND & (1 << PIND5))
                ; //wait until input get LOW
        }
    //Put the result in the bit
        bits[j] = result;
    }

Приносим извинения за доставленные неудобства и благодарим всех вас.

...