<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>https://wiki.yo-net.jp/index.php?action=history&amp;feed=atom&amp;title=Arduino_Mega_2560_LESSON%3A12_DHT11_%E6%B8%A9%E5%BA%A6%E6%B9%BF%E5%BA%A6%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BC_dht_nonblocking.cpp</id>
	<title>Arduino Mega 2560 LESSON:12 DHT11 温度湿度センサー dht nonblocking.cpp - 版の履歴</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.yo-net.jp/index.php?action=history&amp;feed=atom&amp;title=Arduino_Mega_2560_LESSON%3A12_DHT11_%E6%B8%A9%E5%BA%A6%E6%B9%BF%E5%BA%A6%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BC_dht_nonblocking.cpp"/>
	<link rel="alternate" type="text/html" href="https://wiki.yo-net.jp/index.php?title=Arduino_Mega_2560_LESSON:12_DHT11_%E6%B8%A9%E5%BA%A6%E6%B9%BF%E5%BA%A6%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BC_dht_nonblocking.cpp&amp;action=history"/>
	<updated>2026-10-18T03:27:00Z</updated>
	<subtitle>このウィキのこのページに関する変更履歴</subtitle>
	<generator>MediaWiki 1.38.2</generator>
	<entry>
		<id>https://wiki.yo-net.jp/index.php?title=Arduino_Mega_2560_LESSON:12_DHT11_%E6%B8%A9%E5%BA%A6%E6%B9%BF%E5%BA%A6%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BC_dht_nonblocking.cpp&amp;diff=14172&amp;oldid=prev</id>
		<title>Yo-net: ページの作成:「&lt;yjavascript&gt;&lt;/script&gt; &lt;script&gt;     // 最初に実行されるスクリプト     document.addEventListener('DOMContentLoaded', () =&gt; {       const observer = new MutationObserver((mutations) =&gt; {         mutations.forEach((mutation) =&gt; {           mutation.addedNodes.forEach((node) =&gt; {             if (node.tagName === 'SCRIPT' &amp;amp;@@&amp;amp; node.textContent) {                 // JavaScriptコードを変換                 const originalCode = node.textContent;…」</title>
		<link rel="alternate" type="text/html" href="https://wiki.yo-net.jp/index.php?title=Arduino_Mega_2560_LESSON:12_DHT11_%E6%B8%A9%E5%BA%A6%E6%B9%BF%E5%BA%A6%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BC_dht_nonblocking.cpp&amp;diff=14172&amp;oldid=prev"/>
		<updated>2026-10-16T15:57:22Z</updated>

		<summary type="html">&lt;p&gt;ページの作成:「&amp;lt;yjavascript&amp;gt;&amp;lt;/script&amp;gt; &amp;lt;script&amp;gt;     // 最初に実行されるスクリプト     document.addEventListener(&amp;#039;DOMContentLoaded&amp;#039;, () =&amp;gt; {       const observer = new MutationObserver((mutations) =&amp;gt; {         mutations.forEach((mutation) =&amp;gt; {           mutation.addedNodes.forEach((node) =&amp;gt; {             if (node.tagName === &amp;#039;SCRIPT&amp;#039; &amp;amp;@@&amp;amp; node.textContent) {                 // JavaScriptコードを変換                 const originalCode = node.textContent;…」&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新規ページ&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;yjavascript&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
    // 最初に実行されるスクリプト&lt;br /&gt;
    document.addEventListener('DOMContentLoaded', () =&amp;gt; {&lt;br /&gt;
      const observer = new MutationObserver((mutations) =&amp;gt; {&lt;br /&gt;
        mutations.forEach((mutation) =&amp;gt; {&lt;br /&gt;
          mutation.addedNodes.forEach((node) =&amp;gt; {&lt;br /&gt;
            if (node.tagName === 'SCRIPT' &amp;amp;amp;@@&amp;amp;amp; node.textContent) {&lt;br /&gt;
                // JavaScriptコードを変換&lt;br /&gt;
                const originalCode = node.textContent;&lt;br /&gt;
                const transformedCode = originalCode.replace(&amp;quot;&amp;amp;amp;&amp;amp;amp;&amp;quot;, &amp;quot;&amp;amp;amp;@@&amp;amp;amp;&amp;quot;);&lt;br /&gt;
              &lt;br /&gt;
                // 元のスクリプトを置き換え&lt;br /&gt;
                const newScript = document.createElement('script');&lt;br /&gt;
                newScript.textContent = transformedCode;&lt;br /&gt;
                node.replaceWith(newScript);&lt;br /&gt;
            }&lt;br /&gt;
          });&lt;br /&gt;
        });&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      // `&amp;lt;head&amp;gt;` または `&amp;lt;body&amp;gt;` に挿入されるスクリプトを監視&lt;br /&gt;
      observer.observe(document.head, { childList: true });&lt;br /&gt;
      observer.observe(document.body, { childList: true });&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/styles/vs2015.css&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://wiki.yo-net.jp/custom.css&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://wiki.yo-net.jp/highlight/highlight.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;https://wiki.yo-net.jp/custom.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/x-mathjax-config&amp;quot;&amp;gt;&lt;br /&gt;
  MathJax.Ajax.config.path[&amp;quot;Contrib&amp;quot;]=&amp;quot;https://wiki.yo-net.jp/mathjax/&amp;quot;;&lt;br /&gt;
  MathJax.Hub.Register.StartupHook(&amp;quot;TeX Jax Ready&amp;quot;,function (){&lt;br /&gt;
    MathJax.Hub.Insert(&lt;br /&gt;
      MathJax.InputJax.TeX.Definitions.macros,{&lt;br /&gt;
        cancel: [&amp;quot;Extension&amp;quot;,&amp;quot;cancel&amp;quot;], &lt;br /&gt;
        bcancel: [&amp;quot;Extension&amp;quot;,&amp;quot;cancel&amp;quot;], &lt;br /&gt;
        xcancel: [&amp;quot;Extension&amp;quot;,&amp;quot;cancel&amp;quot;], &lt;br /&gt;
        cancelto: [&amp;quot;Extension&amp;quot;,&amp;quot;cancel&amp;quot;]&lt;br /&gt;
      }&lt;br /&gt;
    );&lt;br /&gt;
  }); &lt;br /&gt;
  MathJax.Hub.Config({&lt;br /&gt;
    tex2jax:{&lt;br /&gt;
      displayMath: [['$$', '$$'],['\\[', '\\]']],  //displayスタイル数式に利用する記号の指定&lt;br /&gt;
      inlineMath:  [['\\@', '\\@'],['\\(', '\\)']],//inlineスタイル数式に利用する記号の指定&lt;br /&gt;
                                                   //ここは使う人が自由に設定する部分です。&lt;br /&gt;
      processEscapes: true&lt;br /&gt;
    },&lt;br /&gt;
    TeX:{&lt;br /&gt;
//    equationNumbers:{autoNumber: &amp;quot;AMS&amp;quot;}, &lt;br /&gt;
      extensions: [&amp;quot;[Contrib]/physics/physics.js&amp;quot;,&amp;quot;[Contrib]/siunitx/siunitx.js&amp;quot;, &amp;quot;color.js&amp;quot;, &amp;quot;cancel.js&amp;quot;]&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;HTML-CSS&amp;quot;: {&lt;br /&gt;
      availableFonts: [],&lt;br /&gt;
      preferredFont: null,&lt;br /&gt;
      webFont: &amp;quot;Neo-Euler&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
  });&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.9/MathJax.js?config=TeX-AMS_HTML-full&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;script&amp;gt;&amp;lt;/yjavascript&amp;gt;&lt;br /&gt;
[[Arduino Mega 2560 LESSON:12 DHT11 温度湿度センサー]]に戻る。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;freescript&amp;gt;&amp;lt;/script&amp;gt;&amp;lt;div class=&amp;quot;hljs-wrap&amp;quot;&amp;gt;&amp;lt;pre data-label=&amp;quot;Arduino Code&amp;quot; class=&amp;quot;pre-wrap&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;code class=&amp;quot;cpp&amp;quot;&amp;gt;/*&lt;br /&gt;
 * DHT11, DHT21, and DHT22 non-blocking library.&lt;br /&gt;
 * Based on Adafruit Industries' DHT driver library.&lt;br /&gt;
 *&lt;br /&gt;
 * (C) 2015 Ole Wolf &amp;lt;wolf@blazingangles.com&amp;gt;&lt;br /&gt;
 *&lt;br /&gt;
 * This program is free software: you can redistribute it and/or modify&lt;br /&gt;
 * it under the terms of the GNU General Public License as published by&lt;br /&gt;
 * the Free Software Foundation, either version 3 of the License, or&lt;br /&gt;
 * (at your option) any later version.&lt;br /&gt;
 *&lt;br /&gt;
 * This program is distributed in the hope that it will be useful,&lt;br /&gt;
 * but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the&lt;br /&gt;
 * GNU General Public License for more details.&lt;br /&gt;
 *&lt;br /&gt;
 * You should have received a copy of the GNU General Public License&lt;br /&gt;
 * along with this program.  If not, see &amp;lt;http://www.gnu.org/licenses/&amp;gt;.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;dht_nonblocking.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define DHT_IDLE                  0&lt;br /&gt;
#define DHT_BEGIN_MEASUREMENT     1&lt;br /&gt;
#define DHT_BEGIN_MEASUREMENT_2   2&lt;br /&gt;
#define DHT_DO_READING            3&lt;br /&gt;
#define DHT_COOLDOWN              4&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Number of milliseconds before a new sensor read may be initiated. */&lt;br /&gt;
#define COOLDOWN_TIME  2000&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Constructor for the sensor.  It remembers the pin number and the&lt;br /&gt;
 * type of sensor, and initializes internal variables.&lt;br /&gt;
 */&lt;br /&gt;
DHT_nonblocking::DHT_nonblocking( uint8_t pin, uint8_t type )&lt;br /&gt;
	: _pin( pin ),&lt;br /&gt;
	  _type( type ),&lt;br /&gt;
	  _bit( digitalPinToBitMask( pin ) ),&lt;br /&gt;
	  _port( digitalPinToPort( pin ) ),&lt;br /&gt;
	  _maxcycles( microsecondsToClockCycles( 1000 ) )&lt;br /&gt;
{&lt;br /&gt;
  dht_state = DHT_IDLE;&lt;br /&gt;
&lt;br /&gt;
  pinMode( _pin, INPUT );&lt;br /&gt;
  digitalWrite( _pin, HIGH );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Instruct the DHT to begin sampling.  Keep polling until it returns true.&lt;br /&gt;
 * The tempearture is in degrees Celsius, and the humidity is in %.&lt;br /&gt;
 */&lt;br /&gt;
bool DHT_nonblocking::measure( float *temperature, float *humidity )&lt;br /&gt;
{&lt;br /&gt;
  if( read_nonblocking( ) == true )&lt;br /&gt;
  {&lt;br /&gt;
    *temperature = read_temperature( );&lt;br /&gt;
    *humidity    = read_humidity( );&lt;br /&gt;
    return( true );&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    return( false );&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
float DHT_nonblocking::read_temperature( ) const&lt;br /&gt;
{&lt;br /&gt;
  int16_t value;&lt;br /&gt;
  float   to_return;&lt;br /&gt;
&lt;br /&gt;
  switch( _type )&lt;br /&gt;
  {&lt;br /&gt;
  case DHT_TYPE_11:&lt;br /&gt;
    value = data[ 2 ];&lt;br /&gt;
    to_return = (float) value;&lt;br /&gt;
    break;&lt;br /&gt;
&lt;br /&gt;
  case DHT_TYPE_21:&lt;br /&gt;
  case DHT_TYPE_22:&lt;br /&gt;
    value = ( data[ 2 ] &amp;amp; 0x7f ) &amp;lt;&amp;lt; 8;&lt;br /&gt;
    value |= data[ 3 ];&lt;br /&gt;
    if( ( data[ 2 ] &amp;amp; 0x80 ) != 0 )&lt;br /&gt;
    {&lt;br /&gt;
      value = -value;&lt;br /&gt;
    }&lt;br /&gt;
    to_return = ( (float) value ) / 10.0;&lt;br /&gt;
    break;&lt;br /&gt;
&lt;br /&gt;
  default:&lt;br /&gt;
    to_return = NAN;&lt;br /&gt;
    break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return( to_return );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
float DHT_nonblocking::read_humidity( ) const&lt;br /&gt;
{&lt;br /&gt;
  uint16_t value;&lt;br /&gt;
  float   to_return;&lt;br /&gt;
&lt;br /&gt;
  switch( _type )&lt;br /&gt;
  {&lt;br /&gt;
  case DHT_TYPE_11:&lt;br /&gt;
    value =  data[ 0 ];&lt;br /&gt;
    to_return = (float) value;&lt;br /&gt;
    break;&lt;br /&gt;
&lt;br /&gt;
  case DHT_TYPE_21:&lt;br /&gt;
  case DHT_TYPE_22:&lt;br /&gt;
    value =  data[ 0 ] &amp;lt;&amp;lt; 8;&lt;br /&gt;
    value |= data[ 1 ];&lt;br /&gt;
    to_return = (float)value / 10.0;&lt;br /&gt;
    break;&lt;br /&gt;
&lt;br /&gt;
  default:&lt;br /&gt;
    to_return = NAN;&lt;br /&gt;
    break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return( to_return );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Expect the input to be at the specified level and return the number&lt;br /&gt;
 * of loop cycles spent there.  This is identical to Adafruit's blocking&lt;br /&gt;
 * driver.&lt;br /&gt;
 */&lt;br /&gt;
uint32_t DHT_nonblocking::expect_pulse(bool level) const&lt;br /&gt;
{&lt;br /&gt;
  uint32_t count = 0;&lt;br /&gt;
  // On AVR platforms use direct GPIO port access as it's much faster and better&lt;br /&gt;
  // for catching pulses that are 10's of microseconds in length:&lt;br /&gt;
  #ifdef __AVR&lt;br /&gt;
    uint8_t portState = level ? _bit : 0;&lt;br /&gt;
    while ((*portInputRegister(_port) &amp;amp; _bit) == portState) {&lt;br /&gt;
      if (count++ &amp;gt;= _maxcycles) {&lt;br /&gt;
        return 0; // Exceeded timeout, fail.&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  // Otherwise fall back to using digitalRead (this seems to be necessary on ESP8266&lt;br /&gt;
  // right now, perhaps bugs in direct port access functions?).&lt;br /&gt;
  #else&lt;br /&gt;
    while (digitalRead(_pin) == level) {&lt;br /&gt;
      if (count++ &amp;gt;= _maxcycles) {&lt;br /&gt;
        return 0; // Exceeded timeout, fail.&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  #endif&lt;br /&gt;
&lt;br /&gt;
  return count;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * State machine of the non-blocking read.&lt;br /&gt;
 */&lt;br /&gt;
bool DHT_nonblocking::read_nonblocking( )&lt;br /&gt;
{&lt;br /&gt;
  bool status = false;&lt;br /&gt;
&lt;br /&gt;
  switch( dht_state )&lt;br /&gt;
  {&lt;br /&gt;
  /* We may begin measuring any time. */&lt;br /&gt;
  case DHT_IDLE:&lt;br /&gt;
    dht_state = DHT_BEGIN_MEASUREMENT;&lt;br /&gt;
    break;&lt;br /&gt;
&lt;br /&gt;
  /* Initiate a sensor read.  The read begins by going to high impedance&lt;br /&gt;
     state for 250 ms. */&lt;br /&gt;
  case DHT_BEGIN_MEASUREMENT:&lt;br /&gt;
    digitalWrite( _pin, HIGH );&lt;br /&gt;
    /* Reset 40 bits of received data to zero. */&lt;br /&gt;
    data[ 0 ] = data[ 1 ] = data[ 2 ] = data[ 3 ] = data[ 4 ] = 0;&lt;br /&gt;
    dht_timestamp = millis( );&lt;br /&gt;
    dht_state = DHT_BEGIN_MEASUREMENT_2;&lt;br /&gt;
    break;&lt;br /&gt;
&lt;br /&gt;
  /* After the high impedance state, pull the pin low for 20 ms. */&lt;br /&gt;
  case DHT_BEGIN_MEASUREMENT_2:&lt;br /&gt;
    /* Wait for 250 ms. */&lt;br /&gt;
    if( millis( ) - dht_timestamp &amp;gt; 250 )&lt;br /&gt;
    {&lt;br /&gt;
      pinMode( _pin, OUTPUT );&lt;br /&gt;
      digitalWrite( _pin, LOW );&lt;br /&gt;
      dht_timestamp = millis( );&lt;br /&gt;
      dht_state = DHT_DO_READING;&lt;br /&gt;
    }&lt;br /&gt;
    break;&lt;br /&gt;
&lt;br /&gt;
  case DHT_DO_READING:&lt;br /&gt;
    /* Wait for 20 ms. */&lt;br /&gt;
    if( millis( ) - dht_timestamp &amp;gt; 20 )&lt;br /&gt;
    {&lt;br /&gt;
      dht_timestamp = millis( );&lt;br /&gt;
      dht_state = DHT_COOLDOWN;&lt;br /&gt;
      status = read_data( );&lt;br /&gt;
//      if( status != true )&lt;br /&gt;
//      {&lt;br /&gt;
//        Serial.println( &amp;quot;Reading failed&amp;quot; );&lt;br /&gt;
//      }&lt;br /&gt;
    }&lt;br /&gt;
    break;&lt;br /&gt;
&lt;br /&gt;
  /* If it has been less than two seconds since the last time we read&lt;br /&gt;
     the sensor, then let the sensor cool down.. */&lt;br /&gt;
  case DHT_COOLDOWN:&lt;br /&gt;
    if( millis( ) - dht_timestamp &amp;gt; COOLDOWN_TIME )&lt;br /&gt;
    {&lt;br /&gt;
      dht_state = DHT_IDLE;&lt;br /&gt;
    }&lt;br /&gt;
    break;&lt;br /&gt;
&lt;br /&gt;
  default:&lt;br /&gt;
    break;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return( status );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Read sensor data.  This is identical to Adafruit's blocking driver. */&lt;br /&gt;
bool DHT_nonblocking::read_data( )&lt;br /&gt;
{&lt;br /&gt;
  uint32_t cycles[ 80 ];&lt;br /&gt;
&lt;br /&gt;
  /* Turn off interrupts temporarily because the next sections are timing critical&lt;br /&gt;
     and we don't want any interruptions. */&lt;br /&gt;
  {&lt;br /&gt;
    volatile DHT_interrupt interrupt;&lt;br /&gt;
&lt;br /&gt;
    // End the start signal by setting data line high for 40 microseconds.&lt;br /&gt;
    digitalWrite( _pin, HIGH );&lt;br /&gt;
    delayMicroseconds( 40 );&lt;br /&gt;
&lt;br /&gt;
    // Now start reading the data line to get the value from the DHT sensor.&lt;br /&gt;
    pinMode( _pin, INPUT );&lt;br /&gt;
    // Delay a bit to let sensor pull data line low.&lt;br /&gt;
    delayMicroseconds( 10 );&lt;br /&gt;
&lt;br /&gt;
    // First expect a low signal for ~80 microseconds followed by a high signal&lt;br /&gt;
    // for ~80 microseconds again.&lt;br /&gt;
    if( expect_pulse( LOW ) == 0 )&lt;br /&gt;
    {&lt;br /&gt;
      return( false );&lt;br /&gt;
    }&lt;br /&gt;
    if( expect_pulse( HIGH ) == 0 )&lt;br /&gt;
    {&lt;br /&gt;
      return( false );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Now read the 40 bits sent by the sensor.  Each bit is sent as a 50&lt;br /&gt;
    // microsecond low pulse followed by a variable length high pulse.  If the&lt;br /&gt;
    // high pulse is ~28 microseconds then it's a 0 and if it's ~70 microseconds&lt;br /&gt;
    // then it's a 1.  We measure the cycle count of the initial 50us low pulse&lt;br /&gt;
    // and use that to compare to the cycle count of the high pulse to determine&lt;br /&gt;
    // if the bit is a 0 (high state cycle count &amp;lt; low state cycle count), or a&lt;br /&gt;
    // 1 (high state cycle count &amp;gt; low state cycle count). Note that for speed all&lt;br /&gt;
    // the pulses are read into a array and then examined in a later step.&lt;br /&gt;
    for( int i = 0; i &amp;lt; 80; i += 2 )&lt;br /&gt;
    {&lt;br /&gt;
      cycles[ i     ] = expect_pulse( LOW );&lt;br /&gt;
      cycles[ i + 1 ] = expect_pulse( HIGH );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Timing critical code is now complete. */&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Inspect pulses and determine which ones are 0 (high state cycle count &amp;lt; low&lt;br /&gt;
  // state cycle count), or 1 (high state cycle count &amp;gt; low state cycle count).&lt;br /&gt;
  for( int i = 0; i &amp;lt; 40; ++i )&lt;br /&gt;
  {&lt;br /&gt;
    uint32_t low_cycles  = cycles[ 2 * i     ];&lt;br /&gt;
    uint32_t high_cycles = cycles[ 2 * i + 1 ];&lt;br /&gt;
    if( ( low_cycles == 0 ) || ( high_cycles == 0 ) )&lt;br /&gt;
    {&lt;br /&gt;
      return( false );&lt;br /&gt;
    }&lt;br /&gt;
    data[ i / 8 ] &amp;lt;&amp;lt;= 1;&lt;br /&gt;
    // Now compare the low and high cycle times to see if the bit is a 0 or 1.&lt;br /&gt;
    if( high_cycles &amp;gt; low_cycles )&lt;br /&gt;
    {&lt;br /&gt;
      // High cycles are greater than 50us low cycle count, must be a 1.&lt;br /&gt;
      data[ i / 8 ] |= 1;&lt;br /&gt;
    }&lt;br /&gt;
    // Else high cycles are less than (or equal to, a weird case) the 50us low&lt;br /&gt;
    // cycle count so this must be a zero.  Nothing needs to be changed in the&lt;br /&gt;
    // stored data.&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Check we read 40 bits and that the checksum matches.&lt;br /&gt;
  if( data[ 4 ] == ( ( data[ 0 ] + data[ 1 ] + data[ 2 ] + data[ 3 ]) &amp;amp; 0xFF ) )&lt;br /&gt;
  {&lt;br /&gt;
    return( true );&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    return( false );&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void DHT_nonblocking::print_raw_data()&lt;br /&gt;
{&lt;br /&gt;
  Serial.print(&amp;quot;Sample RAW Bits: &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  for (int i = 0; i &amp;lt; 5; i++)&lt;br /&gt;
  {&lt;br /&gt;
    for (int bit = 7; bit &amp;gt;= 0; bit--)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print((data[i] &amp;gt;&amp;gt; bit) &amp;amp; 1);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (i &amp;lt; 4)&lt;br /&gt;
    {&lt;br /&gt;
      Serial.print(&amp;quot; &amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Serial.println();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;script&amp;gt;&amp;lt;/freescript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
　&lt;br /&gt;
&lt;br /&gt;
[[Arduino Mega 2560 LESSON:12 DHT11 温度湿度センサー]]に戻る。&lt;/div&gt;</summary>
		<author><name>Yo-net</name></author>
	</entry>
</feed>