עברתי לכיוון אחר לגמרי.
לפני שבוע קניתי ערכת לימוד של ESP32 וגיליתי שיש שם חיישן תאורה.
בעזרת GPT כתבתי קוד כדלהלן,
הרעיון הוא אני מחבר מיקרו בקר לוויפי, ואליו מחובר רגש המחזיר את ההתנגדות לאור האם כרגע דלוק אור בחדר או לא, בנוסף פתחתי שם שרת שמאזין לבקשות HTTP ומחזיר בתגובה את הסטטוס הנוכחי וממתי זה כך, בנוסף אעשה בעזה"י הפניית פורט לבקר וככה אוכל לבדוק כאשר אני רוצה לצאת למשרד האם עדיין האור דלוק שם..
המכשיר מוכן וכעת נותר לחכות להתקין ולבדוק (היכן להתקין ולוודא שרמת הבדיקה נכונה בצהריים כשהאור לא דלוק וכו').
import machine
import time
import network
import socket
import _thread
import ntptime
# הגדרת חיבור ל-WiFi
ssid = 'ssid'
password = 'password'
led = machine.Pin(2, machine.Pin.OUT)
# פונקציה לסנכרון הזמן עם שרת NTP
def sync_time():
try:
print('Syncing time with NTP...')
ntptime.settime()
print('Time synchronized')
except:
print('Failed to sync time')
# פונקציה להמרת הזמן ל-UTC+2/UTC+3
def local_time(offset=2):
tm = time.time() + offset * 3600
return tm
# התחברות ל-WiFi
led.value(1)
time.sleep(1)
led.value(0)
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect(ssid, password)
while not sta_if.isconnected():
led.value(1)
time.sleep(0.5)
led.value(0)
time.sleep(0.5)
print('Connection successful')
print(sta_if.ifconfig())
# סנכרון הזמן עם שרת NTP
sync_time()
# הגדרת החיישן על פין דיגיטלי מתאים
photoresistor_pin = machine.Pin(19, machine.Pin.IN)
# משתנים לשמירת תאריך השינוי הקודם והמצב הנוכחי
last_change_time = None
last_light_status = None
# פונקציה לבדיקה אם האור דלוק
def is_light_on():
return photoresistor_pin.value() == 0
# פונקציה לדגימה ושמירת הזמן
def sample_light():
global last_change_time, last_light_status
current_light_status = is_light_on()
if current_light_status != last_light_status:
last_change_time = local_time(offset=3)
last_light_status = current_light_status
print(last_change_time, current_light_status)
# דגימת מצב האור בכל דקה
def sampling_loop():
while True:
sample_light()
time.sleep(1)
# הפעלת דגימת האור בלולאה נפרדת
_thread.start_new_thread(sampling_loop, ())
# קוד לשרת HTTP
def web_page():
if last_change_time is not None:
last_change = time.localtime(last_change_time) # שים לב לאזור זמן UTC+3
last_change_str = '{:04d}-{:02d}-{:02d} {:02d}:{:02d}:{:02d}'.format(
last_change[0], last_change[1], last_change[2], last_change[3], last_change[4], last_change[5]
)
else:
last_change_str = 'Never'
current_status = "דולק" if last_light_status else "כבוי"
change_str = "הדלקה" if last_light_status else "כיבוי"
time_diff_minutes = int((local_time(offset=3) - last_change_time) / 60)
time_diff_str = f"לפני {time_diff_minutes} דקות"
html = f"""
<html lang="he">
<head> <title>מצב תאורה</title> </head>
<body dir="RTL">
<h1>מצב תאורה נוכחי: {current_status}</h1>
<h2>תאריך {change_str} אחרון: {last_change_str} {time_diff_str} </h2>
</body>
</html>
"""
return html
def start_web_server():
addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]
s = socket.socket()
s.bind(addr)
s.listen(1)
print('Listening on', addr)
while True:
conn, addr = s.accept()
print('Client connected from', addr)
cl_file = conn.makefile('rwb', 0)
while True:
line = cl_file.readline()
if not line or line == b'\r\n':
break
response = web_page()
conn.send('HTTP/1.1 200 OK\r\n')
conn.send('Content-Type: text/html; charset=utf-8\r\n')
conn.send('Connection: close\r\n\r\n')
conn.sendall(response)
conn.close()
start_web_server()