2 Replies Latest reply on Jan 16, 2017 1:17 PM by estebaan

    Problem with the example: Enabling DHT11 Humidity Sensor.

    estebaan

      Hi

       

      I want to make the example from the following page Intel® Quark™ MCU D2000 — Enable DHT11 Humidity Sensor: Application... ,but when I set the code, it does not compile and it shows errors.

       

      The code is:

       

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

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

      #define PIN_DHT11 0

       

       

      int main(void) {

        qm_gpio_port_config_t cfg;

        uint32_t cycles[80], i;

        uint8_t data[5];

       

       

        typedef struct {

        uint32_t direction; /* GPIO direction, 0b: input, 1b: output */

        uint32_t int_en; /* Interrupt enable */

        uint32_t int_type; /* Interrupt type, 0b: level; 1b: edge */

        uint32_t int_polarity; /* Interrupt polarity, 0b: low, 1b: high */

        uint32_t int_debounce; /* Debounce on/off */

        uint32_t int_bothedge; /* Interrupt on both rising and falling edges */

        void (*callback)(uint32_t int_status); /* Callback function */

        } qm_gpio_port_config_t;

       

       

        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);

        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);

        clk_sys_udelay(10); /* 10 us */

       

       

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

        {

        uint32_t count = 0;

      while (qm_gpio_read_pin(QM_GPIO_0, PIN_DHT11) == level) {   /*Error*/

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

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

        }

        }

        return count;

        }

       

       

        while (1) {

        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); /* LOW */

        cycles[i + 1] = expectPulse(1); /* HIGH */

        }

        /*

        // 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 error is as follows:

       

      Multiple markers at this line

        - 'level' undeclared (first use in this function)

        - each undeclared identifier is reported only once for each function it appears in

       

      Thanks

        • 1. Re: Problem with the example: Enabling DHT11 Humidity Sensor.
          MichelleC_Intel

          Hi ,

           

          Can you double check  that you copied in the code as described in the doc -- below compiled and ran ok for me....

           

          --Michelle.

           

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

          #define PIN_DHT11 0

           

          uint32_t expectPulse(bool level) /*function to read DHT11 pulse*/
          {
          uint32_t count = 0;
          while (qm_gpio_read_pin(QM_GPIO_0, PIN_DHT11) == 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;
          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");

           

           

          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;
          }