1 Reply Latest reply on Oct 22, 2017 9:46 PM by ctan94x_intel

    C1000 WITH DHT11 (Serial monitor do not show temperature value)

    Amie_coolman93

      #include "qm_gpio.h" /*Calling QMSI GPIO API. See section 3.1 for more details. */

      #include "clk.h"

      #include "qm_pinmux.h"

      #include "qm_pin_functions.h"

      //#include "qm_scss.h" /*Calling QMSI SCSS API*/

      //#include "qm_ss_gpio.h"

       

       

      #define PIN_DHT11 21

      #define LED_PIN_ID (QM_PIN_ID_55)

      #define PIN_MUX_FN (QM_PIN_55_FN_GPIO_21)

       

       

      //static qm_ss_gpio_state_t state_ss;

      static qm_gpio_state_t state_ss;

       

       

      static void pin_mux_setup(void)

      {

      qm_pmux_select(LED_PIN_ID, PIN_MUX_FN);

      }

       

       

      uint32_t expectPulse(bool level) /*function to read DHT11 pulse*/

      {

      uint32_t count = 0;

      while (qm_gpio_read_pin(QM_GPIO_0, PIN_DHT11, &state_ss) == level) {

      if (count++ >= 100000) { /* 1 millisecond to read DHT11 pulse */

      return 0; /* Exceeded timeout, fail. */

      }

      }

      return count;

      }

       

       

       

       

       

       

      int main()

      {

      qm_gpio_port_config_t cfg;

      pin_mux_setup();

      uint32_t cycles[80], i; /* same cycle number as in the DHT11 library */

      uint8_t data[5]; /* same data number as in the DHT11 library */

      /* Reset 40 bits of received data to zero. */

      data[0] = data[1] = data[2] = data[3] = data[4] = 0;

      QM_PUTS("DHT11 example");

       

       

      cfg.direction = BIT(PIN_DHT11);

      qm_gpio_set_config(QM_GPIO_0, &cfg); /* Act like Arduino’s pinMode. Setting

      * DHT11 pin on D2000 dev board as input.

      * See section 3.3 for more details. */

       

       

      while(1){

        //cfg.direction = BIT(PIN_DHT11);

        //qm_gpio_set_config(QM_GPIO_0, &cfg);

        /* Act like Arduino’s pinMode. Setting

        * DHT11 pin on D2000 dev board as input.

        * See section 3.3 for more details.

        */

        qm_gpio_set_pin(QM_GPIO_0, PIN_DHT11); /* set HIGH to DHT11 pin */

        clk_sys_udelay(250000); /* 250 ms */

        /* The three line above written in QMSI and are similar to Arduino’s

        *‘digitalWrite(PIN_DHT11,HIGH);’ which is to let pull-up raise data line level

        * And start reading the DHT11. After that proceed with 250 ms delay.

        * See section 3.4 for more details.

        */

        /* Send DHT11 start signal */

        qm_gpio_clear_pin(QM_GPIO_0, PIN_DHT11); /* set DHT11 pin LOW */

        clk_sys_udelay(20000); /* 20 ms */

       

        qm_gpio_set_pin(QM_GPIO_0, PIN_DHT11); /* set DHT11 pin HIGH */

        clk_sys_udelay(40); /* 40 us */

       

       

        cfg.direction = 0;

        qm_gpio_set_config(QM_GPIO_0, &cfg); /* Setting the DHT11 pin as output to

        * start listening from the DHT11

        */

        clk_sys_udelay(10); /* 10 us */

        if(!expectPulse(false))

        {

        QM_PUTS("Timeout waiting for start signal low pulse.");

        continue;

        }

        if(!expectPulse(true))

        {

        QM_PUTS("Timeout waiting for start signal high pulse.");

        continue;

        }

        for (i=0; i<80; i+=2) {

        cycles[i] = expectPulse(0);

        cycles[i+1] = expectPulse(1);

        }

        /*

        // Inspect pulses and determine which ones are 0 (high state cycle count < low

        // state cycle count), or 1 (high state cycle count > low state cycle count).

        */

        for (i=0; i<40; ++i) {

        uint32_t lowCycles = cycles[2*i];

        uint32_t highCycles = cycles[(2*i)+1];

        if ((lowCycles == 0) || (highCycles == 0)) {

        QM_PUTS("Timeout waiting for pulse.");

        continue ;

        }

        data[i/8] <<= 1;

        /*Now compare the low and high cycle times to see if the bit is a 0 or 1. */

        if (highCycles > lowCycles) {

        /* // High cycles are greater than 50us low cycle count, must be a 1. */

        data[i/8] |= 1;

        }

        /*

        // Else high cycles are less than (or equal to, a weird case) the 50us low

        // cycle count so this must be a zero. Nothing needs to be changed in the

        // stored data.

        */

        }

        QM_PRINTF("Receive %d %d %d %d %d\n",data[0],data[1],data[2],data[3],data[4]);

        uint8_t TempF = (data[2]*1.8) +32;

        QM_PRINTF("h : %d, t : %d, f ; %d r\n", data[0],data[2],TempF);

        /* Check we read 40 bits and that the checksum matches. */

        if (data[4] == ((data[0] + data[1] + data[2] + data[3]) & 0xFF)) {

        }

        else

        {

        QM_PUTS("Checksum failure!");

        }

        }

        return 0;

      }

       

      The result from serial monitor:

      -The code do not read the temperature value : uint8_t TempF = (data[2]*1.8) +32;

      2.JPG