扩展任务就是利用PICO相应模块,实现带有网络、显示、声音功能的创意制作,可以增加其它传感器、外设。
那么本次就做一个GPS只能手杖定位器,简单来说就是智杖!
GPS智能手杖定位器一般具有以下功能:
实时定位:可以通过 GPS 技术获取当前位置
安全围栏:可以设置安全围栏,一旦设备离开围栏区域,会自动向用户发送警报信息。
电子时钟:显示屏实时显示当前时间。
温度预警:超出温度蜂鸣器将会报警。
进阶选项:开发者可自行添加:
历史轨迹:可以查看设备过去一段时间内的运动轨迹,便于用户了解设备的活动范围和行踪。
SOS 求救:可以通过设备上的 SOS 按钮向用户发送求救信息,并提供当前位置信息,便于用户快速找到设备。
低功耗模式:可以通过低功耗模式延长设备的使用时间,节约能源。
实时定位:将位置信息上传到云端服务器,用户可以在手机或电脑上查看设备所在位置
首先,研发思路还是把这些模块一一实现,联网、屏幕、温度传感器、蜂鸣器、GPS。
其次,通过网络获取时间,ADC获取温度,配置PWM控制蜂鸣器,UART获取GPS信息,全都打印到屏幕上,并在一个while循环里判断是否超出温度、GPS设定的阈值,超出则报警,实现安全围栏和温度预警等功能。
以下为代码具体实现:
import time
import ntptime
import network
import hashlib
import framebuf
from micropyGPS import MicropyGPS
from machine import RTC, Pin, I2C, PWM, UART
from ssd1306 import SSD1306_I2C
#配置联网
ssid = '汤圆和奶茶'
password = 'tangyuan888'
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])
#配置OLED屏幕
#Grove Shield For Pi Pico I2C1
i2c = I2C(1,sda=Pin(6),scl=Pin(7),freq=400000)
oled = SSD1306_I2C(128, 64, i2c)
#配置温度传感器
sensor_temp = machine.ADC(4)
conversion_factor = 3.3/(65535)
#配置蜂鸣器
# Construct PWM object, with BEEP on Pin(16).
pwm = PWM(Pin(16))
# Set the PWM frequency.
pwm.freq(1000)
#配置GPS
#Grove Shield For Pi Pico UART0
uart0 = UART(0, baudrate=9600, tx = Pin(0), rx = Pin(1))
#print(gps_module)
time.sleep(0.1)
rxData = bytes()
my_gps = MicropyGPS()
while True:
#显示实时温度
read = sensor_temp.read_u16() * conversion_factor
temp = 27 - (read - 0.706) / 0.001721
print("温度:{:.1f}".format(temp))
oled.fill(0)
oled.text(f'temp is {temp:.1f}', 0, 12, 1)
#oled.show()
#显示实时时间
timezone=8
rtc = RTC()
now = time.time()
now += timezone * 3600
t = time.localtime(now)
year, month, day, hour, minute, second, *_ = t
time_str = f"{year}-{month:02d}-{day:02d} {hour:02d}:{minute:02d}:{second:02d}"
print("时间:", time_str)
oled.text(time_str, 0, 0, 1)
#oled.show()
#温度超出30度报警
if temp>38:
pwm.duty_u16(1000)
time.sleep(1)
pwm.duty_u16(0)
if uart0.any():
stat = my_gps.update(uart0.read(1).decode('ascii')) # Note the conversion to to chr, UART outputs ints normally
if stat:
#显示GPS信息
stat = my_gps.update(uart0.read(1).decode("ascii"))
# Note the conversion to to chr, UART outputs ints normally
print("纬度:", my_gps.latitude_string())
print("经度:", my_gps.longitude_string())
print(
"Speed:",
my_gps.speed_string("kph"),
"or",
my_gps.speed_string("mph"),
"or",
my_gps.speed_string("knot"),
)
lat_disp = my_gps.latitude_string()
oled.text(lat_disp,0,24,1)
lon_disp = my_gps.longitude_string()
oled.text(lon_disp,0,36,1)
lon_disp = my_gps.speed_string()
oled.text(lon_disp,0,48,1)
oled.show()
#安全围栏
if my_gps.latitude_string()>'30' and my_gps.longitude_string()>'123':
pwm.duty_u16(1000)
time.sleep(1)
pwm.duty_u16(0)
不错不错