getHumidity(&sensors_data); #define DHT_MAXTIMINGS10000 #define DHT_BREAKTIME20 #define DHT_MAXCOUNT32000 void getHumidity (sensors* output){ uint16_t counter = 0; uint8_t laststate = 1; uint16_t i=0,k = 0; uint8_t j = 0; uint8_t checksum = 0; uint8_t data[100]; data[0] = data[1] = data[2] = data[3] = data[4] = 0; uint8_t temperature; uint8_t humidity; LPC_IOCON->PIO1_4 = 0xD0;// PIO1.4, PULL UP LPC_GPIO1->DIR |= (1<<4);//output LPC_GPIO1->DATA |= (0x1<<4);//high delayms(250); // Wake up device, 250ms of high LPC_GPIO1->DATA &= ~(0x1<<4);//low delayms(20); // Hold low for 20ms //LPC_GPIO1->DIR |= (1<<4);//output LPC_GPIO1->DATA |= (0x1<<4);//high delayus(1); // High for 40ns LPC_GPIO1->DIR &= ~(1<<4);//input while (((LPC_GPIO1->DATA & (0x1<<4))==1) && (i < DHT_MAXCOUNT)) { for (k = 0; k<6; k++) {} i++; } for (i = 0; i < DHT_MAXTIMINGS; i++) { // Count high time (in approx us) counter = 0; while ((LPC_GPIO1->DATA & (0x1<<4)) == laststate) { counter++; for (k = 0; k<6; k++) {} if (counter == 1000) break; } laststate = (LPC_GPIO1->DATA & (0x1<<4)); if (counter == 1000) break; // store data after 3 reads // ignore first 3 transitions if ((i>3) && (i%2 == 0)) { // shove each bit into the storage bytes //data[j/8] will point to the same byte for 8 consecutive values of j //in each loop, this byte will be shifted left by one bit data[j/8] <<= 1; if (counter > DHT_BREAKTIME) data[j/8] |= 1; j++; } } if (j >= 39) { checksum = (data[0] + data[1] + data[2] + data[3]) & 0xFF; //if (data[4] == checksum) { // checksum is valid humidity = data[0]; temperature = data[2]; //citoa ((uint8_t)humidity, 10, output->humidityC); //citoa (temperature, 10, output->temperatureC); } else { // output->humidityC[0]='\0'; } LPC_IOCON->PIO1_4 = 0xC0;// PIO1.4, PULL UP LPC_GPIO1->DIR &= ~(1<<4); LPC_GPIO3->MASKED_ACCESS[1<<4] = 0xFFFFFFFF; } void delayus (uint16_t ms){ SysTick->LOAD = 479; SysTick->VAL = 0; SysTick->CTRL = 7; Wait(ms); } void delayms (uint16_t ms){ SysTick->LOAD = 11999;//(12000-1); SysTick->VAL = 0; SysTick->CTRL = 7; Wait(ms); } |