I have an IR pyroelectic flame sensor which detects flames within the 8-10hz of flame flicker. I am new to the ADC world so any help is very appreciated.
Documentation: https://pyreos.com/wp-content/uploads/2020/11/Pyreos-Analog-TO-Flame-Sensor-One-Channel.pdf
I have the py0573 which has a bandpass filter for CO2 spectrum. According to the company's algorithm recommendation, I basically need to plot/detect FFT (Fast Fourier transform) bins from the 5-15hz frequency to determine a "flame" exists on the FOV of the sensor.
In order for me to read the signal from the half-rail, I installed a MCP3008 to my RPi model 4 and set the signal to CH0 of the ADC. I also included a .1uf decoupling capacitor.
Using the below code, I am able to get some readings from the sensor, but I am unsure if this sampling rate is setup correctly or not.
Questions:
- How do I setup the read from the ADC within the 8-10hz range?
- Is there a way to plot this with FFT? Do I need FFT or can I determine the total sum values from ADC to indicate a "flame"?
- Is the frequency setup basically the loop speed of Python or the spi.max_speed_hz option?
- Am I converting the raw ADC values correctly using numpy interp?
- If the sensor has a max 10hz frequency then I need to double that for my sample rate?
- Should I be using Adafruit's adafruit-circuitpython-mcp3xxx package instead?
With the below code, I am able to see the values change when I light a flicker match but its a bit inconsistent and only changes when the flame is flickering and not when its still.
import spidev
from numpy import interp
import time
import datetime
from datetime import timedelta
# Start SPI connection
spi = spidev.SpiDev() # Created an object
spi.open(0,0)
# Read MCP3008 data
def analogInput(channel, hz):
spi.max_speed_hz = hz
adc = spi.xfer2([1,(8+channel)<<4,0])
data = ((adc[1]&3) << 8) + adc[2]
return data
data_list=list()
init_time = datetime.datetime.now()
while True:
output1 = analogInput(0, 1000000)
output1 = interp(output1, [0, 1023], [0, 100])
data_list.append(output1)
if init_time < datetime.datetime.now() - timedelta(seconds=2):
print("min" + str(min(data_list)))
print("max" + str(max(data_list)))
print("avg" + str(sum(data_list)/len(data_list)))
data_list=list()
init_time = datetime.datetime.now()
time.sleep(.001)