902|1

109

帖子

25

TA的资源

一粒金砂(高级)

楼主
 

【得捷电子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()

 

main.py

2.83 KB, 下载次数: 1

最新回复

这个算法网上有很多介绍,尝试了用射线法 为何要尝试这个射线法   详情 回复 发表于 2023-6-24 21:22
点赞 关注
 
 

回复
举报

1704

帖子

0

TA的资源

五彩晶圆(初级)

沙发
 

这个算法网上有很多介绍,尝试了用射线法

为何要尝试这个射线法

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表