import network
import time
import ujson
from machine import Pin, ADC
from umqtt.simple import MQTTClient
print("=== ระบบ AI Battery Edge Node เริ่มทำงาน ===")
# ==========================================
# 1. ตั้งค่า WiFi และ MQTT Broker (NETPIE)
# ==========================================
WIFI_SSID = "Wokwi-GUEST"
WIFI_PASSWORD = ""
MQTT_BROKER = "broker.netpie.io"
MQTT_CLIENT_ID = "315f1bf7-1770-4592-912e-572f9e587612"
MQTT_USER = "rWbGi38e5WDtrCMwTcwQ1iw3Wyridx3V"
MQTT_PWD = "bfMzqkM39GUsqqy8QDnXRCr3RiRVKvtZ"
# ⚠️ ข้อควรระวัง: NETPIE บังคับใช้ Topic นี้ในการอัปเดตข้อมูล (Shadow)
MQTT_TOPIC = "@shadow/data/update"
print("🔌 กำลังเชื่อมต่อ WiFi...")
wifi = network.WLAN(network.STA_IF)
wifi.active(True)
wifi.connect(WIFI_SSID, WIFI_PASSWORD)
while not wifi.isconnected():
time.sleep(0.5)
print(".", end="")
print("\n✅ WiFi เชื่อมต่อสำเร็จ!")
print("🌐 กำลังเชื่อมต่อ MQTT Broker...")
# เติม user และ password สำหรับ NETPIE ตรงนี้
mqtt = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PWD)
try:
mqtt.connect()
print("✅ MQTT พร้อมส่งข้อมูลขึ้น NETPIE!\n" + "="*40)
except Exception as e:
print("❌ ไม่สามารถเชื่อมต่อ MQTT ได้:", e)
# ==========================================
# 2. ตั้งค่าฮาร์ดแวร์ (เซนเซอร์ & Relay)
# ==========================================
adc_temp = ADC(Pin(32))
adc_temp.atten(ADC.ATTN_11DB)
adc_volt = ADC(Pin(34))
adc_volt.atten(ADC.ATTN_11DB)
adc_curr = ADC(Pin(35))
adc_curr.atten(ADC.ATTN_11DB)
relay = Pin(23, Pin.OUT)
led = Pin(21, Pin.OUT)
prev_temp = 25.0
prev_time = time.ticks_ms()
relay.value(0)
led.value(0)
# ==========================================
# 3. ลูปการทำงานหลัก (คำนวณฟิสิกส์ + ส่ง Cloud)
# ==========================================
while True:
current_time = time.ticks_ms()
dt_ms = time.ticks_diff(current_time, prev_time)
if dt_ms >= 1000: # ประมวลผลทุก 1 วินาที
# อ่านและแปลงค่าจาก Slider ทั้ง 3 ตัว
raw_t = adc_temp.read()
raw_v = adc_volt.read()
raw_i = adc_curr.read()
t = 20.0 + (raw_t / 4095.0) * (120.0 - 20.0)
v = 2.5 + (raw_v / 4095.0) * (4.2 - 2.5)
i = (raw_i / 4095.0) * 100.0
# คำนวณสมการความชันความร้อน
dt_sec = dt_ms / 1000.0
dTdt = (t - prev_temp) / dt_sec
# Edge Logic: ตัดไฟฉุกเฉินเบื้องต้น
is_danger = (dTdt > 5.0) or (t > 80.0)
if is_danger:
led.value(1)
relay.value(1)
status = "DANGER_CUT"
else:
led.value(0)
relay.value(0)
status = "NORMAL"
print(f"V:{v:.2f} | I:{i:.1f} | T:{t:.1f}°C | dT/dt:{dTdt:.1f} | {status}")
# 📦 แพ็กข้อมูลเป็น JSON เตรียมส่งขึ้น Cloud (มี "data" ครอบไว้สำหรับ NETPIE)
payload = ujson.dumps({
"data": {
"voltage": round(v, 2),
"current": round(i, 2),
"temperature": round(t, 2),
"dTdt": round(dTdt, 2),
"status": status
}
})
# 🚀 ส่งข้อมูลผ่าน MQTT
try:
mqtt.publish(MQTT_TOPIC, payload)
print(" ☁️ [NETPIE] ส่งข้อมูลขึ้น Shadow สำเร็จ!")
except Exception as e:
print(" ❌ [NETPIE] ขัดข้อง:", e)
prev_temp = t
prev_time = current_time
time.sleep(0.1)Voltage (V)
Current (I)
Temperature (T)