from machine import Pin, PWM
import time
import network
import urequests
import json
# ===== Cấu hình Wi-Fi =====
WIFI_SSID = "Wokwi-GUEST"
WIFI_PASSWORD = ""
# ===== Cấu hình Firebase =====
FIREBASE_URL = "https://projectcuoiki-51209-default-rtdb.firebaseio.com/location"
FIREBASE_API_KEY = "AIzaSyAm4o2RszcNNmXJ0aMiowiSuBxtFJ5rrkY"
# ===== Cấu hình đèn LED và buzzer =====
led = Pin(2, Pin.OUT)
led.off()
button_buzzer = Pin(35, Pin.IN, Pin.PULL_DOWN)
button_led = Pin(34, Pin.IN, Pin.PULL_DOWN)
buzzer = PWM(Pin(21))
buzzer.deinit()
# ===== Kết nối Wi-Fi =====
def connect_wifi():
print("Đang kết nối Wi-Fi...")
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(WIFI_SSID, WIFI_PASSWORD)
while not wlan.isconnected():
print("Đang chờ kết nối Wi-Fi...")
time.sleep(1)
print("Wi-Fi đã kết nối:", wlan.ifconfig())
# ===== Xử lý chuỗi Unicode không có unicodedata =====
def remove_unicode_simple(text):
"""Chuyển đổi chuỗi Unicode sang chuỗi không dấu ASCII"""
conversion_table = {
'àáảãạâầấẩẫậăằắẳẵặ': 'a',
'èéẻẽẹêềếểễệ': 'e',
'ìíỉĩị': 'i',
'òóỏõọôồốổỗộơờớởỡợ': 'o',
'ùúủũụưừứửữự': 'u',
'ỳýỷỹỵ': 'y',
'đ': 'd',
'ÀÁẢÃẠÂẦẤẨẪẬĂẰẮẲẴẶ': 'A',
'ÈÉẺẼẸÊỀẾỂỄỆ': 'E',
'ÌÍỈĨỊ': 'I',
'ÒÓỎÕỌÔỒỐỔỖỘƠỜỚỞỠỢ': 'O',
'ÙÚỦŨỤƯỪỨỬỮỰ': 'U',
'ỲÝỶỸỴ': 'Y',
'Đ': 'D'
}
for chars, replacement in conversion_table.items():
for char in chars:
text = text.replace(char, replacement)
return text
# ===== Lấy địa chỉ từ tọa độ qua OpenStreetMap =====
def get_address_from_coordinates(latitude, longitude):
url = f"https://nominatim.openstreetmap.org/reverse?format=json&lat={latitude}&lon={longitude}"
headers = {"User-Agent": "ESP32 Smart Cane Project"}
print(f"Gửi yêu cầu tới OpenStreetMap: {url}")
try:
response = urequests.get(url, headers=headers)
if response.status_code == 200:
data = response.json()
address = data.get("display_name", "Không thể lấy địa chỉ")
print(f"Địa chỉ: {address}")
return address
else:
print(f"Lỗi OpenStreetMap: {response.status_code}")
return "Không xác định địa chỉ"
except Exception as e:
print(f"Lỗi khi gửi yêu cầu OpenStreetMap: {e}")
return "Không xác định địa chỉ"
# ===== Gửi dữ liệu tới Firebase =====
def send_to_firebase(location, latitude, longitude):
try:
# Xóa Unicode trước khi gửi
clean_location = remove_unicode_simple(location)
# Payload JSON
payload = {
"address": clean_location,
"latitude": latitude,
"longitude": longitude
}
# Firebase URL
url = f"{FIREBASE_URL}.json?auth={FIREBASE_API_KEY}"
headers = {"Content-Type": "application/json"}
print(f"Gửi dữ liệu tới Firebase: {url}")
print(f"Payload: {json.dumps(payload)}")
response = urequests.put(url, headers=headers, data=json.dumps(payload))
if response.status_code == 200:
print("Dữ liệu đã được gửi tới Firebase thành công!")
else:
print(f"Lỗi khi gửi dữ liệu tới Firebase: {response.status_code} - {response.text}")
except Exception as e:
print(f"Lỗi khi gửi dữ liệu tới Firebase: {e}")
# ===== Chương trình chính =====
def main():
connect_wifi()
while True:
if button_buzzer.value() == 1: # Khi nút buzzer được nhấn
print("Chế độ khẩn cấp kích hoạt!")
buzzer.init(freq=1000, duty=512)
latitude = 10.731899765883608 # Tọa độ ví dụ
longitude = 106.69929887972742
address = get_address_from_coordinates(latitude, longitude)
print(f"Địa chỉ nhận được: {address}")
send_to_firebase(address, latitude, longitude)
else:
buzzer.deinit()
print("Buzzer tắt - Không khẩn cấp")
if button_led.value() == 1: # Khi nút LED được nhấn
led.on()
print("Đèn LED bật!")
else:
led.off()
print("Đèn LED tắt!")
time.sleep(3)
# ===== Chạy chương trình =====
main()