Skip to content

Fix DHT11 sensor read reliability and prevent infinite loop freezes - #22

Open
dhrubasaha08 wants to merge 1 commit into
expfrom
fix-dht11-reliability-and-timeout-14054205654851675454
Open

dhrubasaha08 wants to merge 1 commit into
expfrom
fix-dht11-reliability-and-timeout-14054205654851675454

Conversation

@dhrubasaha08

Copy link
Copy Markdown
Owner

This PR contains the agreed-upon fixes for the DHT11 library:

  1. Timeout logic: Replaces the infinite while loop when waiting for sensor signals with an iteration-based timeout in readByte(), preventing the Arduino from freezing if the sensor disconnects or stops responding.
  2. Error Code Collision: Changes the return type of readByte() to int and returns -1 on timeout. This fixes a bug where a valid byte reading of 253 would have incorrectly been treated as DHT11::ERROR_TIMEOUT.
  3. Interrupt Reliability: Surrounds the timing-critical data reading loop in readRawData() with noInterrupts() and interrupts() to prevent background tasks (like millis) from distorting the bit-timing logic.

PR created automatically by Jules for task 14054205654851675454 started by @dhrubasaha08

…ion bugs in DHT11 read loop

- Add microsecond timeout to readByte to prevent freezing Arduino on sensor disconnect.
- Update readByte to return int to prevent 253 collision with ERROR_TIMEOUT.
- Wrap read loop in noInterrupts/interrupts for precise timing and reliability.

Co-authored-by: dhrubasaha08 <78276433+dhrubasaha08@users.noreply.github.com>
@google-labs-jules

Copy link
Copy Markdown

👋 Jules, reporting for duty! I'm here to lend a hand with this pull request.

When you start a review, I'll add a 👀 emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down.

I'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job!

For more direct control, you can switch me to Reactive Mode. When this mode is on, I will only act on comments where you specifically mention me with @jules. You can find this option in the Pull Request section of your global Jules UI settings. You can always switch back!

New to Jules? Learn more at jules.google/docs.


For security, I will only act on instructions from the user who triggered this task.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 67a0cb82fb

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/DHT11.cpp
}
data[i] = byteRead;
}
interrupts(); // Re-enable interrupts after reading

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve the caller's interrupt state

When readRawData() is entered while interrupts are already disabled—for example, with setDelay(0) inside a caller-managed critical section—this unconditional call enables them on return, and the timeout path does the same. That prematurely ends the caller's critical section and can expose otherwise protected state to interrupt handlers; save and restore the prior interrupt state rather than always calling interrupts().

Useful? React with 👍 / 👎.

Comment thread src/DHT11.cpp
while (digitalRead(_pin) == LOW)
;
{
if (loopCnt++ > 10000) return -1;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Bound pulse timeouts by elapsed time

If the sensor disconnects or holds the line during the 40-bit transfer, this timeout runs while interrupts are disabled, but 10000 iterations have no portable time bound because digitalRead() speed varies by architecture. On the supported 16 MHz Arduino Uno this can keep interrupts off for tens of milliseconds—far beyond a DHT11 pulse—dropping UART input and delaying timers; use a microsecond- or architecture-calibrated timeout near the protocol's maximum pulse duration.

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant