import machine
import time
import math
from machine import Pin, ADC
# تعريف منافذ 7-Segment (Common Cathode)
SEG_PINS = [Pin(i, Pin.OUT) for i in range(7)] # a-g على GPIO0-6
DP_PIN = Pin(7, Pin.OUT) # النقطة العشرية
DIGIT_PINS = [Pin(i, Pin.OUT) for i in range(8, 11)] # الخانات على GPIO8-10
# تعريف أنماط الأرقام (0-9)
DIGITS = [
[1,1,1,1,1,1,0], # 0
[0,1,1,0,0,0,0], # 1
[1,1,0,1,1,0,1], # 2
[1,1,1,1,0,0,1], # 3
[0,1,1,0,0,1,1], # 4
[1,0,1,1,0,1,1], # 5
[1,0,1,1,1,1,1], # 6
[1,1,1,0,0,0,0], # 7
[1,1,1,1,1,1,1], # 8
[1,1,1,1,0,1,1] # 9
]
# تعريف منافذ المستشعرات
VOLTAGE_PIN = 26 # GPIO26 - قياس الجهد
NTC_PIN = 27 # GPIO27 - مستشعر الحرارة
PHOTO_PIN = 28 # GPIO28 - مستشعر الضوء
# تهيئة ADC
adc_voltage = ADC(Pin(VOLTAGE_PIN))
adc_ntc = ADC(Pin(NTC_PIN))
adc_photo = ADC(Pin(PHOTO_PIN))
# ثوابت NTC
NTC_BETA = 3950
NTC_R0 = 10000
R_REF = 10000
# متغيرات المتوسطات
avg_voltage = 0
avg_temp = 0
avg_light = 0
read_count = 0
def clear_display():
"""إطفاء جميع القطاعات والخانات"""
for pin in SEG_PINS:
pin.off()
for pin in DIGIT_PINS:
pin.on()
DP_PIN.off()
def show_digit(number, position, show_dp=False):
"""عرض رقم واحد في خانة محددة"""
clear_display()
if 0 <= number <= 9:
for i in range(7):
SEG_PINS[i].value(DIGITS[number][i])
DP_PIN.value(show_dp)
DIGIT_PINS[position].off()
def display_voltage(voltage):
"""عرض الجهد على 7-Segment"""
if voltage is None:
return
str_voltage = "{:.2f}".format(voltage)
for pos in range(3):
char = str_voltage[pos]
if char == '.':
show_digit(int(str_voltage[pos-1]), pos-1, True)
else:
show_digit(int(char), pos)
time.sleep_ms(3)
def read_sensors():
"""قراءة جميع المستشعرات وإرجاع القيم الحالية"""
global avg_voltage, avg_temp, avg_light, read_count
# قراءة الجهد
try:
raw = adc_voltage.read_u16()
voltage = (raw * 3.3) / 65535
except:
voltage = None
# قراءة الحرارة من NTC
try:
raw = adc_ntc.read_u16()
if raw > 0:
v_ntc = (raw * 3.3) / 65535
r_ntc = (3.3 * R_REF) / v_ntc - R_REF
temp_k = 1 / (1/(273.15+25) + (1/NTC_BETA)*math.log(r_ntc/NTC_R0)
temp = temp_k - 273.15
else:
temp = None
except:
temp = None
# قراءة شدة الإضاءة
try:
raw = adc_photo.read_u16()
if raw > 0:
light = (65535 - raw) / 65535 * 100
else:
light = None
except:
light = None
# تحديث المتوسطات
if voltage is not None:
avg_voltage = (avg_voltage * read_count + voltage) / (read_count + 1)
if temp is not None:
avg_temp = (avg_temp * read_count + temp) / (read_count + 1)
if light is not None:
avg_light = (avg_light * read_count + light) / (read_count + 1)
read_count += 1
return voltage, temp, light
def print_readings(voltage, temp, light):
"""طباعة القراءات الحالية والمتوسطات"""
print("\n" + "="*50)
print("القراءات الفورية:")
print(f"🔌 الجهد: {voltage:.3f}V" if voltage is not None else "🔌 الجهد: غير متصل")
print(f"🌡️ الحرارة: {temp:.1f}°C" if temp is not None else "🌡️ الحرارة: غير متصل")
print(f"☀️ الإضاءة: {light:.1f}%" if light is not None else "☀️ الإضاءة: غير متصل")
print("\nالمتوسطات الحالية:")
print(f"🔌 متوسط الجهد: {avg_voltage:.3f}V")
print(f"🌡️ متوسط الحرارة: {avg_temp:.1f}°C")
print(f"☀️ متوسط الإضاءة: {avg_light:.1f}%")
print("="*50)
def main():
while True:
# قراءة المستشعرات
voltage, temp, light = read_sensors()
# عرض الجهد على 7-Segment
display_voltage(voltage)
# طباعة القراءات كل 2 ثانية
if read_count % 20 == 0: # 20 قراءة (20 × 0.1 ثانية = 2 ثانية)
print_readings(voltage, temp, light)
time.sleep(0.1)
if __name__ == "__main__":
main()