[经验分享] 【得捷电子Follow me第1期】第五贴: 扩展任务——GPS智能手杖定位器

硬核王同学   2023-6-2 17:17 楼主

【得捷电子Follow me第1期】第五贴: 扩展任务——GPS智能手杖定位器

扩展任务就是利用PICO相应模块,实现带有网络、显示、声音功能的创意制作,可以增加其它传感器、外设。

那么本次就做一个GPS只能手杖定位器,简单来说就是智杖!

 

GPS智能手杖定位器一般具有以下功能:

  1. 实时定位:可以通过 GPS 技术获取当前位置

  2. 安全围栏:可以设置安全围栏,一旦设备离开围栏区域,会自动向用户发送警报信息。

  3. 电子时钟:显示屏实时显示当前时间。

  4. 温度预警:超出温度蜂鸣器将会报警。

  5. 进阶选项:开发者可自行添加:

    1. 历史轨迹:可以查看设备过去一段时间内的运动轨迹,便于用户了解设备的活动范围和行踪。

    2. SOS 求救:可以通过设备上的 SOS 按钮向用户发送求救信息,并提供当前位置信息,便于用户快速找到设备。

    3. 低功耗模式:可以通过低功耗模式延长设备的使用时间,节约能源。

    4. 实时定位:将位置信息上传到云端服务器,用户可以在手机或电脑上查看设备所在位置

 

首先,研发思路还是把这些模块一一实现,联网、屏幕、温度传感器、蜂鸣器、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)
​

 

以下为用充电宝实现的智杖!当然,目前还没有制作外壳哈哈哈,有兴趣想做完成品的可以加上外壳~ 1b5c21cfeebdaa6a949f982b04e952f.jpg  

回复评论 (3)

过网络获取时间ADC获取温度,再去配置PWM控制蜂鸣器,UART获取GPS信息,最后结果都打印到屏幕上,完全做出来,实用场景很大

点赞  2023-6-3 10:47

不错不错

点赞  2023-6-5 21:59

大功告成,恭喜恭喜

点赞  2023-6-6 08:40
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复