Erriez LM35 library for Arduino  1.1.0
This is a LM35 analog temperature sensor library for Arduino.
ErriezLM35.cpp
Go to the documentation of this file.
1 /*
2  * MIT License
3  *
4  * Copyright (c) 2020 Erriez
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to deal
8  * in the Software without restriction, including without limitation the rights
9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10  * copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in all
14  * copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22  * SOFTWARE.
23  */
24 
33 #include "ErriezLM35.h"
34 
42 LM35::LM35(uint8_t pin) : _pin(pin)
43 {
44 #if defined(ARDUINO_ARCH_AVR)
45 // Configures internal ADC reference voltage to 1.1V of the ANALOG pins
46 #if defined(INTERNAL)
47  analogReference(INTERNAL);
48 #elif defined(INTERNAL1V1)
49  analogReference(INTERNAL1V1);
50 #else
51 #error "analogReference() not supported for this MCU"
52 #endif
53 #endif
54 
55  // Dummy read to clear previous ADC conversion
56  (void)analogRead(_pin);
57 }
58 
76 {
77  uint16_t temperatureLast = 0;
78  uint16_t temperature = 0;
79 
80  // Take multiple temperature samples with a maximum of LM35_MAX_SAMPLES
81  for (uint8_t i = 0; i < LM35_MAX_SAMPLES; i++) {
82  // Analog range: 0 .. 1.1V = 0 .. 1023 ADC value
83  // For example, LM35 analog signal of 0.182 V equals to 18.2 degree celsius
84  // 1024 / 1.1V = 931 ratio between analog sample and output temperature
85  // This calculation is multiplied by 1000 first to avoid expensive floating
86  // point instructions.
87  temperature = ((uint32_t)analogRead(_pin) * 1000) / 931;
88 
89  if (temperatureLast == temperature) {
90  // Two identical temperatures read, return
91  return temperature;
92  }
93 
94  // Different temperatures, take another sample
95  temperatureLast = temperature;
96  }
97 
98  // Return the last measured temperature
99  return temperatureLast;
100 }
#define LM35_MAX_SAMPLES
Check tested platform.
Definition: ErriezLM35.h:45
uint16_t readTemperature()
Read unsigned analog temperature.
Definition: ErriezLM35.cpp:75
LM35(uint8_t pin)
LM35 constructor.
Definition: ErriezLM35.cpp:42
Analog LM35 temperature sensor library for Arduino.