Bir Kutu Denemesi - Temassız Ateş Ölçer Procesi

fide

Meraklı ve "nasıl" sorusunu seven biri
Katılım
8 Eylül 2021
Mesajlar
2,360
MLX90614 + XIAO ESP32-C3 ve SS1306 ekran ile temassız ateş ölçer yapmaya çalışıyorum.

1751105037727.png
1751105072469.png
1751105098637.png


Xiao ESP32-C3 kartın güzel tarafı içinde lipo charger ve 3V3 çıkış bulundurması. Bu sayede hem pili şarj etmek için ekstra malzeme hem de LDO ihtiyacı ortadan kalkıyor. Batarya olarak 14300 yada 18250 batarya kullanıcam. Henüz karar vermedim. Bataryaları "PUF" diye tabir edilen elektronik sigaralardan çıkarıyorum. Rezistans ısıtmakla görevli bataryalar tam bir canavar.

Bu defa önce projeyi çalıştırmak yerine önce kutuyu tasarlamaya başladım.

1751105292770.png


1751105406499.png




1751105419081.png

1751105434329.png

1751105456405.png


Batarya kapağın baskısı bitmek üzere.
1751105545645.png

1751105705509.png
 
17511160861017457268974828972250.jpg
1751116103870942792225233987437.jpg
17511161214823689438825115207528.jpg

Mlx90614 hariç bağlantılar tamam. Batarya biraz şekilsiz oldu ama şeklinden dolayı yapacak bişey yok.
17511162340247860515558342842230.jpg
 

Python:
import machine
from machine import Pin, ADC, SoftI2C
from time import sleep
import ssd1306
import network
import binascii

def notify(text, x = 0, y = 0, wait = 0, clear = False):
    if clear:
        oled.fill(0)
        oled.show()
    oled.text(text, x, y)
    oled.show()
    sleep(wait)
       
def beep(duration = 100, pieces = 1, long = False):
    for i in range(pieces):
        buzzer.on()
        sleep(duration/2000)
        buzzer.off()
        sleep(duration/2000)
def read_temp(register):
    data = i2c.readfrom_mem(MLX90614_I2C_ADDR, register, 3)
    temp = (data[1] << 8) | data[0]
    temp = (temp * 0.02) - 273.15  # Convert from Kelvin to Celsius
    return temp

def convert(x, in_min, in_max, out_min, out_max):
    return (x - in_min) * (out_max - out_min) // (in_max - in_min) + out_min

def readBattLevel():
    meas = []
    summ = 0
    for i in range(20):
        meas.append( batt.read_uv() / 500000)
    for i in meas:
        summ += i
    average = summ / 20
    print("Batt Voltage: {:.2f}V".format(average))
    battPercent = convert( average, 3.3, 4.25, 0, 100)
    return [average, battPercent]

def configNetwork(ssid = "", key = ""):
    # create station interface
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)       # activate the interface
    sleep(2)
    wifiMevcut = False
    while(not wifiMevcut):
        networks = wlan.scan()             # scan for access points
        for i in networks:
            wifiAdi = i[0].decode("utf-8")
            if wifiAdi == ssid:
                wifiMevcut = True
        sleep(2)
        if wifiMevcut:
            print("Baðlanýlýyor")
            state = wlan.isconnected()      # check if the station is connected to an AP
            if state == False:
                print("{} agina baglaniliyor.".format(ssid))
                wlan.connect(ssid, key) # connect to an AP
                sleep(3)
        else:
            print("Wifi Bekleniyor.")
       
    mac = binascii.hexlify(wlan.config('mac'))      # get the interface's MAC address
    conf = wlan.ifconfig()         # get the interface's IP/netmask/gw/DNS addresses
    ip, x, gateway, y = conf
    return [mac, ip, gateway]

buzzer = Pin(3, Pin.OUT)
key1 = Pin(5, Pin.IN)
key2 = Pin(10, Pin.IN)
key3 = Pin(9, Pin.IN)
key4 = Pin(8, Pin.IN)

MLX90614_I2C_ADDR = 0x5A
MLX90614_TA = 0x06  # Ambient temperature register
MLX90614_TOBJ1 = 0x07  # Object temperature register
 
i2c = SoftI2C(sda=Pin(6), scl=Pin(7), freq=100000)

oled_width = 128
oled_height = 64
oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)

ssid = "******" # Wifi ağ adı ile değiştirin
key = "******"  # Wifi şifresi ile değiştirin
print("Wifi Bağlantısı deneniyor.")
notify("Wifi Connect", clear = True)
mac, ip, gateway = configNetwork(ssid, key)
print("Wifi Bağlantısı yapıldı.")
print("MAC:{}, ip:{}, Gateway: {}".format(mac, ip, gateway))
notify("Wifi Cnnctd to:", clear= True)
notify("SSID:{}".format(ssid), x= 0, y= 15)
notify("Ip:{}".format(ip), x= 0, y= 30)
notify("GW:{}".format(gateway), x= 0, y= 45, wait = 4)
beep(duration = 500)

batt = ADC(Pin(2))
batt.atten(ADC.ATTN_11DB)
print("batt analog:{}".format(batt.read_u16()))
print("batt uV:{}".format(batt.read_uv()/500000))
buzzer.on()
sleep(1)
buzzer.off()
try:
    print("* MLX90614 Temperature Readings *")
 
    while(True):
        key1Val = key1.value()
        key2Val = key2.value()
        key3Val = key3.value()
        key4Val = key4.value()
        #print("key1:{}, key2:{}, key3:{}, key4:{}".format(key1Val, key2Val, key3Val, key4Val))
        if (key4Val == 0):
            object_temp = read_temp(MLX90614_TOBJ1)
            ambient_temp = read_temp(MLX90614_TA)
            notify("Amb Temp:{}".format(ambient_temp), clear= True)
            notify("Obj Temp:{}".format(object_temp), x= 0, y= 15)
            print("obj:{:>5.3f}°C, amb:{:>5.3f}°C ".format( object_temp, ambient_temp))
            sleep(1)
        if (key1Val == 0):
            battV, battPerc = readBattLevel()
            print("batt V:{}".format(battV))
            print("batt %:{}".format(battPerc))
            notify("Batt V: {}".format(battV), clear= True)
            notify("batt %: {}".format(battPerc), x= 0, y= 15)
            sleep(1)
           
        sleep(1/20)
       
except KeyboardInterrupt:
    # Gracefully handle script termination by the user
    print('\nScript stopped by user')
 
finally:
    # Any cleanup can be done here
    print('Goodbye!')
 
Python:
def configNetwork(netWNames):
    # create station interface
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)       # activate the interface
    sleep(2)
    wifiMevcut = False
    vSsid = ""
    while(not wifiMevcut):
        networks = wlan.scan()             # scan for access points
      
        for ssid, key in netWNames:
            for i in networks:
                wifiAdi = i[0].decode("utf-8")
                if wifiAdi == ssid:
                    wifiMevcut = True
            sleep(2)
            if wifiMevcut:
                print("Baglaniliyor")
                state = wlan.isconnected()      # check if the station is connected to an AP
                if state == False:
                    print("{} agina baglaniliyor.".format(ssid))
                    wlan.connect(ssid, key) # connect to an AP
                    vSsid = ssid
                    sleep(3)
            else:
                print("Wifi Bekleniyor.")
          
    mac = binascii.hexlify(wlan.config('mac'))      # get the interface's MAC address
    conf = wlan.ifconfig()         # get the interface's IP/netmask/gw/DNS addresses
    ip, x, gateway, y = conf
    return [mac, ip, gateway, vSsid]
Python:
netWNames = [["Wifi1", "Wifi1 Şifre"], ["Wifi2", "Wifi2 Şifre"]]
print("Wifi Bağlantısı deneniyor.")
mac, ip, gateway, validSsid = configNetwork(netWNames)
print("Wifi Bağlantısı yapıldı.")
print("MAC:{}, ip:{}, Gateway: {}".format(mac, ip, gateway))

Wifi bağlantı kısmı yukardaki kod ile değiştirilebilir. Bu sayede bağlantı yapılabilecek birden fazla ağ var ise bunlar içinde wifi sinyali yakaladığı ağa bağlanma şansı olur.
 

Ekler

Son düzenleme:
Videoda ekran net okunmuyor. 7 segment benzeri bir kalıp oluşturup bunu daha okunaklı hale getirmeye çalışılabilir ama uğraşmak lazım.
 
Uğraşmak isteyenlere çizimler burada.
 

Ekler

Wifi var. Bluetooth donanım olarak var fakat kodda aktif edilmedi. Ölçüm sonuçları mqtt/Google sheets gibi bir yere gönderilebilir yada Bluetooth aktif edilip telefona gönderilebilir.
Mqtt daha kolay ve mantıklı görünüyor.
 
Isı ölçümünde bir döngü olsa daha iyi olur gibi geldi bana. Bunu belirli bir amaç için mi tuşa basınca ölçecek şekilde kurguladın?
 
Harikaymis eline saglik, ben pan tilt kullanarak termal kamera yapmistim mlx ile ( sicak su borusu kacagi bulmak icin tarama bayagi bir zaman aliyordu :) O zamanlar ne kadar inanilmaz gelmisti. Simdi OLED'lerle vs neler olur kimbilir.
 
Kodu bir an önce sensörü denemek için yazdım.
Aslında mqtt ile uzaktan aktif ederek ölçüm alınabilir. Periyodik ölüm alınıp min, Max ve avg gösterilebilir. Bir buton ile tekil, ikinci buton ile seri/sürekli ölçüm alınabilir.
Kutu çizimi ve yerleşim haddinden uzun sürdüğü için alelacele sensör okumayı butona bağlayıp kutuyu ve konuyu kapattım.
 
Bugün Mısır konservesi kutusuna kaynamış su koyup termal kamera, temassız termometre ve yaptığım devre ile sıcaklık ölçtüm.
TFA temassız termometre 84°C, Unit i712 89°C, MLX90614 ise 79°C ölçtü. Konserve teneke kutu dışı boyalı olduğu için mlx sensör farklı ölçtü diye düşünüyorum ama emin değilim.
 
Bu temassız ölçüm yapan sensörün karşısında bir nesne olması gerekiyor mu? Örneğin ince uzun bir borunun içine uzatıyoruz. Acaba hangi noktanın sıcaklığı ölçülür? 10cm ötesi mi 50cm ötesi mi?
 
Bugün Mısır konservesi kutusuna kaynamış su koyup termal kamera, temassız termometre ve yaptığım devre ile sıcaklık ölçtüm.
TFA temassız termometre 84°C, Unit i712 89°C, MLX90614 ise 79°C ölçtü. Konserve teneke kutu dışı boyalı olduğu için mlx sensör farklı ölçtü diye düşünüyorum ama emin değilim.
Mlx güzel bir sensör hocam. Sensörde emissivity diye bir değer var onu değiştirerek daha doğru ölçümler alabilirsiniz. İçerisinde FIR IIR filtre de bulunmakta bunlarla da oynayabilirsiniz. Belki bu değerleri ayarlamak için bir menü de ekleyebilirsiniz.
 

Çevrimiçi personel

Forum istatistikleri

Konular
7,906
Mesajlar
130,749
Üyeler
3,168
Son üye
zolotoy

Son kaynaklar

Son profil mesajları

Mutluluğun resmi illa güzel çizilmiş tablo olmak zorunda değil.Bazen basit bir çizgi,doğru bir renk,yada küçük bir detay
Python Geliştirmeye eklediğim yapay zeka sunucusu, yeni başlayanlar için roket etkisi
Bir insanın zeka seviyesinin en kolay tesbiti, sorduğu sorulardır.
yapay zeka interneti yedi bitirdi, arama motoru kullanan, forumlara yazan kaldı mı ?
az bilgili çok meraklı
Back
Top