Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added extra analogRead() to let ADC cool off #340

Closed
wants to merge 1 commit into from

Conversation

webondevices
Copy link

Proposed bug fix for: #334

Summary of bug
Reading multiple analog sensors the same time messes up all readings. For example: the LM35 works fine on its own reporting consistent values but as soon as another analog sensor is added it starts reporting random values between 12 - 50 C°. I tested this with multiple sensors with the same result.

The bug is most likely with the Arduino hardware as I managed to reproduce the issue with a simple two line Arduino sketch.

Test
I tested multiple analog sensors and combinations on a Genuine Arduino UNO and had the same issue all the time. I also tested on a Chinese Arduino NANO which had the same problem.

My proposed solution have fixed issues on both Arduinos

I only noticed at the end that apparently both Arduinos have an ATMEL MEGA 328P on board so it would be great to test the solution on other chips as well but I don't have access to any other boards at the moment.

@@ -805,6 +805,8 @@ void loop()
if (IS_PIN_ANALOG(pin) && Firmata.getPinMode(pin) == PIN_MODE_ANALOG) {
analogPin = PIN_TO_ANALOG(pin);
if (analogInputsToReport & (1 << analogPin)) {
// Extra analogRead() to cover ADC cooling-off period for higher accuracy
analogRead(analogPin);
Copy link
Member

Choose a reason for hiding this comment

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

This is a waste of cycles if a user only has one analog input. However you could add a counter that increments each time you enter this block and then only if that count > 0 perform the extra analogRead:

if (analogReadCounter++ > 0) {
  analogRead(analogPin);
}

and reset analogReadCounter to 0 before the for loop.

@webondevices
Copy link
Author

Closing this due to new developments in the issue.

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.

2 participants