Mqtt kontrollü Ultrasonik Nemlendirici

  • Konuyu başlatan Konuyu başlatan fide
  • Başlama tarihi Başlama tarihi

fide

Meraklı ve "nasıl" sorusunu seven biri
Katılım
8 Eylül 2021
Mesajlar
2,160
Ultrasonik nemlendiriciler ortamı ısıtmadan nemlendirmek için kullanılıyor. Genel olarak 115khz de çalışan bir piezo üzerine kuruluyor. Bu piezo 20V civarında bir besleme gerilimi ile çalışıyor. İrfz44, 330uH bobin ve 100nF kondansatör ile tank devresi oluşturuluyor. Pwm duty %30 ile %50 arasında verimli çalışıyor. Bu dutynin üzerine çıkılır yada altına düşülürse buhar çıkışı zayıflıyor.

1742753045568.jpeg

Esp32 hem 115khz pwm sinyali elde etmek hem de wifi mqtt iletişimi için kullanılıyor.
Xl6009 step uP ise 5V USB ile 20V elde etmek için kullanılıyor. %45duty ile 5V üzerinden 450mAcivarında akım çekiyor.
Kullandığım piezo sünger borulu versiyon. Bu sayede suya doğrudan temas etmesine gerek kalmıyor.

IMG-20250321-WA0017.jpeg
IMG-20250321-WA0024.jpeg

IMG-20250321-WA0034.jpeg


Kodları ve İot mqtt uygulama ekranını müsait zamanda paylaşırım inşallah
 
1742755639209.jpeg

Şema bunun aynısı. Sadece 555 yerine esp32, 10R yerine 470R var. Bir de gate discharge için 47k direnç var.
Ultrasonik devreden bağımsız olarak AHT10 nem + sıcaklık sensörü ile ortam nemi ve sıcaklık bilgisini telefon mqtt uygulamaya gönderiyor. Bu sayede ortam sıcaklığı ve nemi online takip edilebiliyor.
 
Stl olarak çizim dosyaları. base su kabı, diğeri piezo ve devre taşıyıcı
 

Ekler

Su nerden geliyor? Sensör suya temas etmezse bozuluyor diye biliyorum.
 
Su nerden geliyor? Sensör suya temas etmezse bozuluyor diye biliyorum.
1742766091675.png

Base isimli çizim su kabı. Ultrasonic nemlendirici altında sünger bir aparat var. Bu aparat kap içindeki suya temas edip atomizere suyu besliyor. Bu sayede piezo atomizerin suyun içinde olmasına gerek kalmıyor.
 
Screenshot_2025-03-24-01-54-33-047_snr.lab.iotmqttpanel.prod.jpg
 
Uygulama hangi framework kullanıyor?
 
Uygulama hangi framework kullanıyor?
Google Play Store üzerindeki İot Mqtt Panel uygulaması. Yani Android tabanlı.
Buton, text input, text log, grafik, slider gibi bir çok araç barındırıyor.
Yukarıdaki uygulama için 1 text input, 2 switch, 1 text log ve 1 graphic kullandım. Sesli uyarı yok. Olsa sütkaynatma asistanı yaklaşan bildirimi sesli olarak telefondan da yapabilirdi. Belki güncelleme yaparlarsa eklerler.
 
Python:
import machine
from machine import Pin, PWM, SoftI2C
from time import sleep
import network
import binascii
from umqttsimple import MQTTClient
import gc
import time
import ntptime
import utime
import machine, neopixel
import ahtx0

gc.collect()
def piezo(state):
    pwm = PWM(Pin(16), freq=108000, duty=512)
    if state == True:
        pwm.init(freq=108000, duty=500)
    else:
        pwm.init(freq=108000, duty=0)
 
def configNetwork(netWNames):
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    sleep(2)
    wifiMevcut = False
    vSsid = ""
    while(not wifiMevcut):
        networks = wlan.scan()                 
        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()     
                if state == False:
                    print("{} agina baglaniliyor.".format(ssid))
                    wlan.connect(ssid, key)
                    vSsid = ssid
                    sleep(3)
            else:
                print("Wifi Bekleniyor.")
            
    mac = binascii.hexlify(wlan.config('mac'))     
    conf = wlan.ifconfig()         
    ip, x, gateway, y = conf
    return [mac, ip, gateway, vSsid]

def sub_cb(topic, msg):
    global auto
    global aktif
    global limitNem
    
    key = topic.decode("utf-8")
    value = msg.decode("utf-8")
    print(("topic:{}, msg:{}".format(key, value)))
    if key == "armed" and value == "armed=on":
        piezo(True)
        aktif = True
        text = "Nemlendirici Aktif"
        client.publish(b'status', text)
        ledAktif.on()
        
    if key == "armed" and value == "armed=off":
        piezo(False)
        aktif = False
        text = "Nemlendirici Pasif"
        client.publish(b'status', text)
        ledAktif.off()
        
    if key == "auto" and value == "auto=on":
        auto = True
        ledAuto.on()
        if limitNem <= 5:
            text = "Lutfen Nem Degeri Girin!!!"
            client.publish(b'status', text)
            text = "auto=off"
            client.publish(b'auto', text)
            
            
    if key == "auto" and value == "auto=off":
        auto = False
        ledAuto.off()
        
    if key == "limit":
        try:
            limitNem = int(value)
        except:
            text = "Nem Hatali"
            client.publish(b'status', text)
        
def connect_and_subscribe():
    global client_id, mqtt_server, topic_sub
    client = MQTTClient(clientId, mqtt_server, user=mqtt_user, password=mqtt_pass)
    client.set_callback(sub_cb)
    client.connect()
    for i in topic_sub:
      client.subscribe(i)
      sleep(1/3)
    print('Connected to %s MQTT broker, subscribed to %s topic' % (mqtt_server, topic_sub))
    return client

def mqttCheck():
    while(True):
        try:
            client.check_msg()
            if (time.time() - last_message) > message_interval:
                last_message = time.time()
                #client.publish(b"status", "x")
        except:
            pass
        
def restart_and_reconnect():
    print('Failed to connect to MQTT broker. Reconnecting...')
    time.sleep(10)
    machine.reset()

ledAktif = Pin(3, Pin.OUT) 
ledAuto = Pin(5, Pin.OUT) 
i2c = SoftI2C(scl=Pin(9), sda=Pin(8))
sensor = ahtx0.AHT10(i2c)
temp = sensor.temperature
humid = sensor.relative_humidity
print("temp: {}, humid: {}".format(temp, humid))

netWNames = [["Fi*****", "****"], ["Fi****", "********"]]
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))
sleep(3)

limitNem = 0
auto = False
aktif = False

ntpDeneme = True
while(ntpDeneme):
    try:
        ntptime.settime()
        ntpDeneme = False
        print("clock sync")
    except:
        print("clock sync failed")
    sleep(1/2) 
tm = utime.localtime(utime.mktime(utime.localtime()) + 3*3600)  # GMT+3 saat dilimi için düzenleme
yil, ay, gun, sa, dk, sn, x, y = tm
print("Tarih: {}/{}/{}".format(gun, ay, yil))
print("Saat: {}:{}:{}".format(sa, dk, sn))

mqtt_server = 'test.mosquitto.org'
mqtt_user = ''
mqtt_pass = ''

clientId = binascii.hexlify(machine.unique_id())
print(clientId)
topic_sub = [b'humid', b'armed',  b'auto',  b'status', b'limit']

last_message = 0
last_check = 0
message_interval = 8

try:
  client = connect_and_subscribe()
except OSError as e:
  restart_and_reconnect()

text = "Cihaz Hazir"
client.publish(b'status', text)
text = "armed=off"
client.publish(b'armed', text)
text = "auto=off"
client.publish(b'auto', text)


oneShot = False
while(True):
    
    sleep(1)
    humid = sensor.relative_humidity
    print("Act Humidity: {:.2f}, oneSh:{}".format(humid, oneShot))
    if auto == True and humid < limitNem:
        piezo(True)
        if oneShot == False:
            text = "Nemlendirici Aktif"
            client.publish(b'status', text)
            oneShot = True
        
    if auto == True and humid >= limitNem:
        piezo(False)
        if oneShot == True:
            text = "Nem, Limite Ulasti"
            client.publish(b'status', text)
            oneShot = False
    
    if auto == False and aktif == False:
        piezo(False)
        if  oneShot == True:
            text = "Auto Off"
            client.publish(b'status', text)
            oneShot = False
        
    try:
        client.check_msg()
        if (time.time() - last_message) > message_interval:
            last_message = time.time()
            #client.publish(b"status", "x")

            text = "{:.1f}".format(sensor.temperature)
            client.publish(b'temp', text)
            text = "{:.0f}".format(sensor.relative_humidity)
            client.publish(b'humid', text)
            
    except OSError as e:
        restart_and_reconnect()

Micropython kodları yukarda.
Wifi bağlantı kütüphanesi, ve Mqtt birbirinden bağımsız olarak kullanılabilir.
 

Ekler

İlk posttaki videodan faklı olarak set edilen nem değerine kadar çalışıp sonra bekleme durumuna geçen ve nem seviyesi limitin altına düşünce tekrar çalışan kod eklendi. Auto butonu bu işi yaparken, aktif butonu sadece aç kapa işlemi yapıyor.
 

Çevrimiçi üyeler

Forum istatistikleri

Konular
7,523
Mesajlar
126,159
Üyeler
3,049
Son üye
MelihEfe

Son kaynaklar

Son profil mesajları

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ı ?
Freemont2.0 herbokolog Freemont2.0 wrote on herbokolog's profile.
nick iniz yakıyor
:D
Freemont2.0 posta Freemont2.0 wrote on posta's profile.
Merhabalar :)
Back
Top