Week 12 : Input Devices
Summary
This week, I tested the addition of a sensor for my final project. I’m not sure exactly which sensors will be used, but it’s to anticipate the measuring and setup.
The result is shown below for the VMA320 sensor.
Assignments
Group Assignment
- Probe an input device’s analog levels and digital signals.
Individual Assignments
- Measure something: add a sensor to a microcontroller board that you have designed and read it.
Probe Input Device
This part was done in group and is accessible on the group page.
Adding Input Device to my Board
Contexte of the Week
This week I want to work on my project. It’s more about being able to control plasma generation. I’ll need to measure certain information, such as the temperature of the plasma reactor, or the amount of CO2 leaving the reactor (if the reactor is an open system).
So I’m going to try and retrieve temperature information using two different temperature sensors: VMA320, and VMA324.
These are two analog temperature sensors using a thermistor, a resistor that varies as a function of temperature.
Adding Temperature Sensor
Adding one of these sensors is very simple. You need to supply the sensor with a DC voltage (3.3V or 5V). Then recover the output voltage with a final Pin. A temperature sensor using a thermistor works like a resistive divider. A schematic of the divider is shown below, in which we supply the divider with DC voltage Vin, and recover the output voltage Va, the voltage across the thermistor.
The electronic diagram taken from the documentation is also shown below.
The setup, quite simple, is done separately from the board because it was a bit complicated to do due to a design problem (I wanted to display the temperature on an OLED screen but I didn’t have enough inputs available).
This setup can be seen below for the two sensors used.
From Analog Signal to Temperature
I’ll have to translate the sensor input signal into temperature in the code. To do this, I need to know how thermistors work. It turns out that by knowing the resistive value of the thermistor, we can know the temperature. You also need to know the manufacturer’s reference point, in this case 25°C.
The Steinhart-Hart relationship describes the relationship between resistance and temperature. It is given below.
This law integrates the parameters A, B and C, which are purely empirical and depend on each thermistor.
A simpler version is possible and can be used over a smaller temperature range, incorporating only parameter B and a reference temperature and resistance value. This is what I’m going to use here.
Programming Temp Sensor
So I program the sensor using an adc object to read the sensor’s analog value, which I transform directly into a voltage.
With this voltage I can find out the resistance of the thermistor using ohm law and the reference provided by the sensor datasheet. Then I use the Steinhart-Hart relationship to obtain the absolute temperature and transform it into °C.
import machine
import ssd1306
import time
import math
# Define the pins used
ANALOG_PIN = 26
# Define ref
vRef = 5
tRef = 25
rRef = 10000
# Define Steinhart-Hart parameters
B = 3950
# Initialize the OLED screen
i2c = machine.I2C(1, scl=machine.Pin(7), sda=machine.Pin(6))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
# Function to read temperature from analog input
def read_temperature(pin):
# Read analog value
adc = machine.ADC(pin)
value = adc.read_u16()
# Convert analog value to voltage
voltage = value / 65535 * vRef # Voltage in volts
# Use the Steinhart-Hart formula to convert voltage to temperature
resistance = (vRef / (vRef - voltage)) * rRef # Resistance in ohms
temperature_kelvin = tRef + 1 / (1 / (273.15 + tRef) + 1 / B * math.log(resistance / rRef) ) # Temperature in Kelvin
temperature_celsius = temperature_kelvin - 273.15 # Temperature in degrees Celsius
return temperature_celsius
while True:
# Read temperature
temperature = read_temperature(ANALOG_PIN)
# Clear the OLED screen
oled.fill(0)
# Display temperature on the OLED screen
oled.text("Temp: {:.2f} C".format(temperature), 0, 0)
oled.show()
# Wait for a few seconds before measuring again
time.sleep(0.1)
Testing with My PCB
I finally tested the sensors by touching the thermistor to provide heat. One of these tests can be seen in the video below.