Community
cancel
Showing results for 
Search instead for 
Did you mean: 
Highlighted
Beginner
907 Views

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

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

0 Kudos
0 Replies