【得捷电子Follow me第1期】 项目总结报告
[复制链接]
本帖最后由 太阳上的骑士 于 2023-6-24 13:25 编辑
项目描述
考虑到活动提供硬件的功能,包含控制器、蜂鸣器、显示屏、GPS模块、WiFi BLE模组,结合最近看到的新闻,总有老人走失,尤其是一些患有阿尔茨海默症的老人,走失非常危险,如果有一个设备,能有电子围栏的功能,佩戴者如果走出围栏就会通过蜂鸣器鸣叫提醒自己和路人,并且显示屏能显示联系人和联系方式,这样别人就能帮助佩戴者及时找到家人,避免危险的发生。当然这个也能佩戴在宠物身上,帮助宠物找到主人。
硬件框图
软件流程图
功能模块调试
联网并同步时间:
import time
import network
ssid = ' YOUR NETWORK NAME' #wifi名称
password = ' YOUR NETWORK PASSWORD' #wifi密码
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)
#尝试联网
max_wait = 10
while max_wait > 0:
if wlan.status() < 0 or wlan.status() >= 3:
break
max_wait -= 1
print('等待连接')
time.sleep(1)
#判断联网状态
if wlan.status() != 3:
raise RuntimeError('联网失败')
else:
print('网络已连接')
status = wlan.ifconfig()
print('ip = ' + status[0])
#访问互联网测试
import urequests
r = urequests.get("https://www.digikey.cn/zh")
print(r.status_code)
print(r.headers)
r.close()
def show_local_time(timezone=8):
rtc = RTC()
now = time.time()
now += timezone * 3600
t = time.localtime(now)
print(f'{t[0]} - {t[1]:02d}-{t[2]:02d} {t[3]:02d}:{t[4]:02d}:{t[5]:02d}')
#NTP网络校时演示
from machine import RTC
import ntptime
#先手动设置一个错误时间,模拟系统时间不准
rtc = RTC()
rtc.datetime((2020, 1, 1, 3, 9, 0, 0, 0)) #年、月、日、星期、时、分、秒、亚秒
print('校时前系统时间:')
show_local_time()
#NTP校时
print('开始NTP校时...')
ntptime.host = 'ntp1.aliyun.com'
ntptime.settime()
print(f'校时后系统时间:')
show_local_time()
BLE通信:
稳定版固件不支持BLE,需要下载最新版本的固件,通信没问题。
显示屏显示时间、联系人和联系方式:
oled.fill(0)
oled.text(f'{t[0]}-{t[1]:02d}-{t[2]:02d}', 0, 0, 1)
oled.text(f'{t[3]:02d}:{t[4]:02d}:{t[5]:02d}', 0, 15, 1)
#显示联系方式
oled.text('EEWORLD', 0, 30, 1)
oled.text('86-10-82350740', 0, 45, 1)
oled.show()
获取GPS坐标并转换成普通GPS坐标:
#转换公式 dd.ddddd = dd + mm.mmmm/60
latitude = my_gps.latitude
latitudeD = latitude[0] + latitude[1]/60
#print(latitudeD)
longitude = my_gps.longitude
longitudeD = longitude[0] + longitude[1]/60
#print(longitudeD)
判断GPS坐标是否在围栏内:
这个算法网上有很多介绍,尝试了用射线法,但是一直没调好。
最终决定做一个桌面闹钟,通过WiFi联网校准rtc时间,显示屏显示时间和闹钟时间,手机通过ble设置闹钟时间,比如ble输入12345,其中1的位置是是否开启闹钟功能,1代表开启,0代表关闭。23的位置是时的占位,23代表的是23时。45的位置是fen的占位,45代表的是45分。12345的意思是开启23时45分的闹钟。怎么关闭闹钟呢,一种方法是输入02345,另一种是让闹钟响一分钟自己停,还有一种是拔电源。
这个活动挺好的,让人有机会接触了一下micropython,对新手很友好。希望这种活动越来越多,越办越好。
以下是最终项目短视频:
6月24日
源代码放在最后附件,以下是最终代码:
from machine import Pin, UART, I2C, RTC
from ssd1306 import SSD1306_I2C
from ble_simple_peripheral import BLESimplePeripheral
import network
import utime, time
import urequests
import ntptime
import bluetooth
import re
ssid = ' ' #wifi名称
password = ' ' #wifi密码
#Grove Shield for Pi Pico I2C0
i2c = I2C(0, sda = Pin(8), scl = Pin(9), freq = 400000)
oled = SSD1306_I2C(128, 64, i2c)
#Grove Shield For Pi Pico UART0
gps_module = UART(0, baudrate = 9600, tx = Pin(0), rx = Pin(1))
# Create a Bluetooth Low Energy (BLE) object
ble = bluetooth.BLE()
# Create an instance of the BLESimplePeripheral class with the BLE object
sp = BLESimplePeripheral(ble)
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)
# Create a Pin object for the onboard LED, configure it as an output
led = Pin("LED", Pin.OUT)
buzzer_pin = machine.Pin(20, machine.Pin.OUT)
# Initialize the LED state to 0 (off)
rec_state = 0
BLEdata = '02424'
# Define a callback function to handle received data
def on_rx(data):
#print("Data received: ", data) # Print the received data
global rec_state, BLEdata# Access the global variable led_state
BLEdata = data
rec_state = 1
#尝试联网
max_wait = 10
while max_wait > 0:
if wlan.status() < 0 or wlan.status() >= 3:
break
max_wait -= 1
print('等待连接')
time.sleep(1)
#判断联网状态
if wlan.status() != 3:
raise RuntimeError('联网失败')
else:
print('网络已连接')
status = wlan.ifconfig()
print('ip = ' + status[0])
#先手动设置一个错误时间,模拟系统时间不准
rtc = RTC()
rtc.datetime((2020, 1, 1, 3, 9, 0, 0, 0)) #年、月、日、星期、时、分、秒、亚秒
ntptime.host = 'ntp1.aliyun.com'
ntptime.settime()
h = 24
m = 24
h1 = h
m1 = m
while True:
timezone=8
rtc = RTC()
now = time.time()
now += timezone * 3600
t = time.localtime(now)
#global BLEdata
if sp.is_connected(): # Check if a BLE connection is established
sp.on_write(on_rx) # Set the callback function for data reception
if rec_state:
print("Data received: ", BLEdata)
rec_state = 0
oled.fill(0)
oled.text(f'{t[0]}-{t[1]:02d}-{t[2]:02d}', 0, 0, 1)
oled.text(f'{t[3]:02d}:{t[4]:02d}:{t[5]:02d}', 0, 15, 1)
#显示闹钟时间
#onoff = int(int(BLEdata)/1000)
onoff = int(int(BLEdata)/10000)
h = int(int(BLEdata)/100) - onoff * 100
m = int(int(BLEdata)%100)
#print("onoff: ", onoff)
#print("h: ", h)
#print("m: ", m)
if (h <=24) and (h >=0) and (m <= 60) and (m >= 0):
h1 = h
m1 = m
oled.text(str(h1), 0, 45, 1)
oled.text(':', 17, 45, 1)
oled.text(str(m1), 25, 45, 1)
if (t[3] == h) and (t[4] == m) and (onoff == 1):
buzzer_pin.value(1)
else:
buzzer_pin.value(0)
oled.show()
|