import ssd1306
import framebuf
import time
from machine import Pin, ADC, I2C
from onewire import OneWire
from ds18x20 import DS18X20
import math
import time # اضافه کردن ماژول time
# تنظیمات I2C
i2c = I2C(0, scl=Pin(9), sda=Pin(8)) # تغییر پینها در صورت نیاز
# تنظیم نمایشگر (اندازه: 128x64)
oled = ssd1306.SSD1306_I2C(128, 64, i2c, addr=0x3C)
# دادههای باینری تصویر
image_data = bytearray([
0x00, 0x00, 0x00, 0x1f, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0x3f, 0xff, 0x80, 0x7f, 0xff, 0xfc, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0x1f, 0xff, 0x80, 0x1f, 0xff, 0xfc, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0x1f, 0xfc, 0x00, 0x0f, 0xff, 0xfc, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0x1f, 0xf8, 0x00, 0x01, 0xff, 0xf8, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0x1f, 0xf8, 0x00, 0x00, 0x3f, 0xf8, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0x0f, 0xf0, 0xc0, 0x00, 0x0f, 0xf0, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0x03, 0xe7, 0xc6, 0x00, 0xe7, 0xc0, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0x80, 0x1f, 0xfc, 0x26, 0x78, 0x00, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0x80, 0x3f, 0xf9, 0xe7, 0x7c, 0x01, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0xc0, 0x3f, 0xff, 0xef, 0xfc, 0x03, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0xf0, 0x7f, 0xff, 0xff, 0xfe, 0x0f, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0x00, 0xfc, 0x6f, 0xff, 0xff, 0xf6, 0x3f, 0x00, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1c, 0x00, 0x3f, 0xef, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x38, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x18, 0x00, 0x0f, 0xdf, 0xff, 0xff, 0xfb, 0xf0, 0x00, 0x18, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x10, 0x00, 0x03, 0x1f, 0xff, 0xff, 0xfa, 0xc0, 0x00, 0x08, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x43, 0xff, 0xff, 0xc2, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0x71, 0x80, 0x41, 0xff, 0xff, 0x82, 0x01, 0x8e, 0x80, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x11, 0xff, 0x00, 0x80, 0xff, 0xff, 0x81, 0x00, 0xff, 0x88, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x10, 0xfe, 0x80, 0x00, 0xff, 0xff, 0x01, 0x01, 0x7f, 0x88, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x18, 0x7f, 0x80, 0xf0, 0x7f, 0xff, 0x07, 0x01, 0xfe, 0x18, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1c, 0x1f, 0x00, 0x80, 0x7f, 0xff, 0x01, 0x00, 0xf8, 0x38, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1e, 0x02, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0x80, 0x07, 0x00, 0x3f, 0xfe, 0x00, 0x60, 0x01, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xf0, 0x1f, 0xe0, 0x3f, 0xfe, 0x07, 0xf8, 0x07, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0x80, 0x3f, 0xfe, 0x01, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0x80, 0x3f, 0xfc, 0x01, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0x80, 0x3f, 0xfc, 0x01, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0x40, 0x3f, 0xfc, 0x03, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0x40, 0x3f, 0xfc, 0x03, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0xfe, 0x60, 0x1f, 0xfc, 0x03, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0xfe, 0x60, 0x1f, 0xfc, 0x03, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0xfe, 0x40, 0x1f, 0xfc, 0x03, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0xfc, 0x40, 0x1f, 0xfc, 0x03, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0xfc, 0x40, 0x1f, 0xfe, 0x03, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0xfc, 0x00, 0x3f, 0xff, 0x03, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0xfc, 0x00, 0x3e, 0x1f, 0x23, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0xf8, 0x24, 0x07, 0xf8, 0x23, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0xf8, 0x26, 0x3f, 0xff, 0x27, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0xf8, 0x10, 0x7f, 0xff, 0xc7, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0xf8, 0x10, 0xc3, 0xf0, 0xcf, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0xf8, 0x08, 0xc0, 0x00, 0xdf, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0xf8, 0x04, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0xf8, 0x01, 0xe2, 0x10, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0xf8, 0x01, 0xe2, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0xfc, 0x03, 0xfc, 0x0f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0xfc, 0x03, 0xf8, 0x07, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0xfc, 0x03, 0xf0, 0x03, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0xfc, 0x00, 0xfe, 0x3f, 0xdf, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0xfe, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0x80, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0x80, 0x00, 0x03, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xc0, 0x00, 0x07, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xe0, 0x00, 0x07, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xe0, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xf0, 0x01, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xf8, 0x07, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xfc, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xfe, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00
])
image_logo = bytearray([
0x00, 0x00, 0x00, 0x1f, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0x3f, 0xff, 0x80, 0x7f, 0xff, 0xfc, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0x1f, 0xff, 0x80, 0x1f, 0xff, 0xfc, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0x1f, 0xfc, 0x00, 0x0f, 0xff, 0xfc, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0x1f, 0xf8, 0x00, 0x01, 0xff, 0xf8, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0x1f, 0xf8, 0x00, 0x00, 0x3f, 0xf8, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0x0f, 0xf0, 0xc0, 0x00, 0x0f, 0xf0, 0xff, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1f, 0xff, 0x03, 0xe7, 0xc6, 0x00, 0xe7, 0xc0, 0xff, 0xf8, 0x00, 0x00, 0x00,
])
# ایجاد فریمبافر برای تصویر
fb = framebuf.FrameBuffer(image_data, 128, 64, framebuf.MONO_HLSB)
tb = framebuf.FrameBuffer(image_logo, 128, 64, framebuf.MONO_HLSB)
# پاک کردن نمایشگر
oled.fill(0)
# نمایش تصویر
oled.blit(fb, 0, 0)
oled.show()
time.sleep(3)
# پاک کردن نمایشگر
oled.fill(0)
time.sleep(3)
# نمایش تصویر
oled.blit(tb, 0, 0)
oled.show()
time.sleep(3)
# خاموش کردن نمایشگر
oled.fill(0)
oled.show()
#/////////////////////////////////////////////////////////////////////////////////////////////////////
# تنظیم پین برای DS18B20
data_pin = Pin(28) # سنسور دما روی پورت GP26
ow = OneWire(data_pin)
ds = DS18X20(ow)
# تنظیم پینهای سنسور سطح آب
##sensor_power = Pin(15, Pin.OUT) # GPIO 15 برای تغذیه سنسور
##sensor_pin = ADC(27) # GPIO 27 برای خواندن سنسور سطح آب
# تنظیم پینهای سنسور سوماتیک
somatic_sensor_pin = ADC(26) # GPIO 27 برای سنسور سوماتیک (فرض بر این است که آنالوگ است)
# تنظیم سنسور ارتفاع
height_sensor_pin = ADC(27) # GPIO 28 برای سنسور ارتفاع (فرض بر این است که آنالوگ است)
# ثابتها
diameter = 15 / 1000 # قطر استوانه به متر (15 میلیمتر به متر تبدیل میشود)
radius = diameter / 2 # شعاع استوانه به متر
pi = math.pi
# مقدار اولیه پایه تغذیه سنسور را LOW قرار دهید
sensor_power.value(0)
# تنظیم نمایشگر OLED
I2C_SCL_PIN = 9
I2C_SDA_PIN = 8
I2C_FREQ = 400000
OLED_ADDR = 0x3c
i2c = I2C(0, scl=Pin(I2C_SCL_PIN), sda=Pin(I2C_SDA_PIN), freq=I2C_FREQ)
oled = ssd1306.SSD1306_I2C(128, 64, i2c, addr=OLED_ADDR)
# جستجوی سنسورهای متصل به باس DS18B20
roms = ds.scan()
if not roms:
print("No DS18B20 sensors found. Check connections.")
else:
print("Found DS18B20 devices:", roms)
def read_water_sensor():
sensor_power.value(1) # روشن کردن تغذیه سنسور سطح آب
time.sleep_ms(10) # تأخیر 10 میلیثانیه
value = sensor_pin.read_u16() # خواندن مقدار آنالوگ سنسور سطح آب
sensor_power.value(0) # خاموش کردن تغذیه سنسور
return value
def read_somatic_sensor():
# خواندن مقدار سنسور سوماتیک
value = somatic_sensor_pin.read_u16() # مقدار آنالوگ سنسور سوماتیک
return value
def read_height_sensor():
# خواندن مقدار سنسور ارتفاع
value = height_sensor_pin.read_u16() # مقدار آنالوگ سنسور ارتفاع
return value
# تبدیل ارتفاع به حجم
def height_to_volume(height):
volume = pi * (radius ** 2) * height # حجم استوانه
return volume
# تبدیل ارتفاع به فلو
def height_to_flow(current_height, previous_height, time_interval):
volume_current = height_to_volume(current_height)
volume_previous = height_to_volume(previous_height)
flow = (volume_current - volume_previous) / time_interval # فلو = تغییر حجم / زمان
return flow
# اعمال نویزگیری و ایزوله کردن مقادیر منفی
def noise_filter(flow):
# اگر فلو منفی باشد آن را نادیده میگیریم
if flow < 0:
flow = 0
# اعمال نویزگیری به کمک میانگینگیری از چند نمونه
return flow
# حلقه اصلی
previous_height = 0
total_volume = 0
time_interval = 1 # زمان به ثانیه
height_samples = [] # لیست نمونهها برای میانگینگیری
sample_count = 10 # تعداد نمونهها برای میانگینگیری (به عنوان مثال 10 نمونه)
while True:
try:
# پاک کردن نمایشگر
oled.fill(0)
# خواندن و نمایش دما از DS18B20
if roms:
ds.convert_temp()
time.sleep(0.75) # مدت زمان کافی برای خواندن دما
for rom in roms:
temp = ds.read_temp(rom)
print(f"Temperature from {rom}: {temp:.2f} °C")
oled.text(f"Temp: {temp:.2f} C", 0, 0)
# خواندن و نمایش سطح آب
water_level = read_water_sensor()
print(f"Water level: {water_level}")
oled.text(f"Water: {water_level}", 0, 16)
# خواندن و نمایش مقدار ADC از سنسور سوماتیک
somatic_value = read_somatic_sensor()
print(f"Somatic Sensor Value: {somatic_value}")
oled.text(f"Somatic: {somatic_value}", 0, 32)
# خواندن مقدار ارتفاع و اعمال میانگینگیری
current_height = read_height_sensor()
height_samples.append(current_height)
if len(height_samples) > sample_count:
height_samples.pop(0) # حذف قدیمیترین نمونهها
average_height = sum(height_samples) / len(height_samples) # محاسبه میانگین
print(f"Height Sensor Value: {current_height}")
# تبدیل ارتفاع به حجم
volume = height_to_volume(average_height)
total_volume += volume # اضافه کردن حجم فعلی به حجم کلی
# محاسبه فلو
flow = height_to_flow(average_height, previous_height, time_interval)
flow = noise_filter(flow) # اعمال نویزگیری
# نمایش فلو و حجم کلی دوشیده شده شیر
oled.text(f"Flow: {flow:.3f} m^3/s", 0, 48)
oled.text(f"Total Volume: {total_volume:.3f} m^3", 0, 56)
# ذخیره ارتفاع فعلی برای استفاده در دور بعد
previous_height = average_height
# بهروزرسانی نمایشگر
oled.show()
time.sleep(1) # تأخیر 1 ثانیه
except Exception as e:
print("Error:", e)
time.sleep(1)