Page 76 - เอกสารประกอบการสอนวิชาไมโครคอนโทรลเลอร์เบื้องต้น
P. 76
เอกสารประกอบการเรียนวิชาไมโครคอนโทรลเลอร์เบื้องต้น 43
pinMode( DATA_PIN, OUTPUT ); // change direction to output
digitalWrite( DATA_PIN, LOW ); // output low (send the start bit)
delayMicroseconds( 1000 );
digitalWrite( DATA_PIN, HIGH ); // output high
delayMicroseconds( 40 );
pinMode( DATA_PIN, INPUT ); // change direction to input
digitalWrite( DATA_PIN, HIGH ); // enable internal pull-up
attachInterrupt( 0, eint_isr, CHANGE ); } // enable EINT0 interrupt
boolean dht22_read_data( int16_t *humidity, int16_t *temperature ) {
if (!flag) { return false; } // data not available
flag = false; // clear flag
detachInterrupt( 0 ); // disable EINT on data pin
uint8_t check_sum = 0x00;
for ( int x=0; x < 4; x++) { // calculate checksum
check_sum += data[x];
}
if ( check_sum == data[4] ) {
*humidity = (data[0] << 8) | data[1];
*temperature = (data[2] << 8) | data[3];
return true; // checksum OK
}
return false; // checksum error
}
char buf[20]; // used for sprintf()
void loop() {
int16_t h, t;
dht22_send_start_bit();
while (!flag) { delay(10); }
if ( dht22_read_data( &h, &t ) ) {
sprintf( buf, "%d.%d%cRH, %d.%d C", h/10, h%10, '%', t/10, t%10 );
Serial.println( buf );
} else {
หน่วยที่ 10 การใช้งาน Arduino กับไอซีวัดอุณภูมิและโมดูลตรวจจับสัญญาณอินพุต เรียบเรียงโดยครูทันพงษ์ ภู่รักษ์