import machine
from machine import Pin, I2C
import ssd1306
import math
# ESP32 Pin assignment
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
oled_width = 128
oled_height = 64
oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)
class TemperatureSensor:
"""This class takes in an an adc_pin for ESP32,
a reference voltage, and a resolution in bits.
It returns the temperature in Celsius
using NTC temperature sensor.
Commented out is the version for LM35 temperature sensor.
"""
def __init__(self, adc_pin, v_ref, resolution):
"""This function initializes adc,
reference voltage, and max level."""
self.__v_ref=v_ref
self.__adc=machine.ADC(machine.Pin(adc_pin))
self.__adc.atten(machine.ADC.ATTN_11DB) # full range of levels?
self.__adc.width(eval(f"machine.ADC.WIDTH_{resolution}BIT"))
self.__max_level=2**resolution-1
def read_temperature(self, oled, LM35ADC=False):
"""This function reads the temperature
and returns it using 10mV per degree Celsius conversion
or conversion factor for NTC using Steinhart constants."""
A = 0.001129148
B = 0.000234125
C = 0.0000000876741
while True:
reading=self.__adc.read()
voltage=(reading/self.__max_level)*self.__v_ref
R0=10000
if LM35ADC:
temperature=voltage/(10/1000) # for LM35
else:
rt = (voltage*R0)/(self.__v_ref - voltage)
temperature = 1/(A + (B * math.log(rt)) + C*math.pow(math.log(rt), 3))-273.15
# clear the screen
oled.fill(0)
oled.text(str(f"T:{temperature:.1f}-deg C."), 10, 10)
print(f"{reading} {temperature}")
oled.show()
sensor=TemperatureSensor(adc_pin=2, v_ref=5, resolution=10)
sensor.read_temperature(oled)