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.

SetupVMA320

Assignments

Group Assignment

Individual Assignments


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.

Oscillo1
Oscillo2

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.

SetupVMA320
SetupVMA324

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.

SHrelation

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.

SHrelationSimple

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.