from machine import Pin, PWM
import dht
import time
import neopixel
# ----- Pin Tanımlamaları -----
# HX711 için pinler
dout = Pin(14, Pin.IN) # HX711 DT
sck = Pin(15, Pin.OUT) # HX711 SCK
# DHT22 sensör (sadece sıcaklık okuması için)
sensor = dht.DHT22(Pin(27)) # DHT22 DATA pin
# Buton: aktif düşük, dahili pull-up kullanılıyor.
button = Pin(12, Pin.IN, Pin.PULL_UP)
# Sabit LED (durum göstergesi için, örneğin Pin 2)
led = Pin(2, Pin.OUT)
# NeoPixel: Örnek olarak Pin(22) üzerinden 1 adet NeoPixel
np = neopixel.NeoPixel(Pin(22, Pin.OUT), 1)
# Servo Motor: Servo, Pin 26’ya PWM ile bağlı, 50Hz frekans
servo = PWM(Pin(26))
servo.freq(50)
# Global çalışma durumu: Başlangıçta sensör okumaları kapalı.
running = False
last_button_state = button.value()
led.value(0) # Başlangıçta LED kapalı
# ----- Fonksiyonlar -----
def read_weight():
sck.value(0)
# HX711'den veri gelene kadar bekliyoruz (dout LOW olmalı)
while dout.value() == 1:
pass
count = 0
for i in range(24):
sck.value(1)
count = count << 1
sck.value(0)
if dout.value():
count += 1
# Ek pulse (faz çıkarımı)
sck.value(1)
sck.value(0)
# Negatif değerlerin kontrolü (2'nin tümleyeni)
if count & 0x800000:
count = count - 0x1000000
return count / 420.0 # Kalibrasyon faktörü
def read_temp():
try:
sensor.measure()
return sensor.temperature()
except Exception as e:
print(f"Sıcaklık okuma hatası: {e}")
return None
def move_servo(angle):
"""
Servo motoru istenen açıya hareket ettirir.
0° için yaklaşık 1000 µs, 180° için 2000 µs pulse genişliği kullanılır.
PWM frekansı 50Hz (periyot 20000 µs) olduğundan, duty_u16 değeri:
duty = (pulse_us / 20000) * 65535
"""
pulse_us = 1000 + (angle / 180.0) * 1000 # 0° -> 1000 µs, 180° -> 2000 µs
duty = int((pulse_us / 20000) * 65535)
servo.duty_u16(duty)
print("Servo hareket: {}° | Pulse: {} µs | Duty: {}".format(angle, pulse_us, duty))
# ----- Ana Döngü -----
print("Program başlatıldı. Buton bekliyor...")
while True:
current_button_state = button.value()
# Buton, Pull-Up kullanıldığından basıldığında 0 olur.
if last_button_state == 1 and current_button_state == 0:
running = not running # Çalışma durumunu tersine çevir
if running:
print("Sistem aktif.")
led.value(1)
else:
print("Sistem pasif.")
led.value(0)
time.sleep(0.3) # Debounce gecikmesi
last_button_state = current_button_state
if running:
weight = read_weight()
temp = read_temp()
print("Ağırlık: {:.2f} kg".format(weight))
if temp is not None:
print("Sıcaklık: {:.1f}°C".format(temp))
# NeoPixel: Sıcaklık 30°C'den yüksekse kırmızı, aksi halde mavi
if temp > 30:
np[0] = (255, 0, 0)
else:
np[0] = (0, 0, 255)
np.write()
else:
print("Sıcaklık: Veri yok veya okuma hatası.")
# Servo kontrolü: Ağırlık 10kg'nin üzerindeyse servo 90°'ya,
# aksi halde servo 0° konumunda tutulur.
if weight > 10:
move_servo(160)
print("Servo: 90° (Yük < 10kg)")
else:
move_servo(0)
print("Servo: 0° (Yük > 10kg)")
print("-" * 20)
time.sleep(2)
else:
time.sleep(0.1)