【得捷电子Follow me第1期】第五贴: 扩展任务——GPS智能手杖定位器
[复制链接]
【得捷电子Follow me第1期】第五贴: 扩展任务——GPS智能手杖定位器
扩展任务就是利用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])
-
-
-
- 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)
-
-
-
- pwm = PWM(Pin(16))
-
- pwm.freq(1000)
-
-
-
- uart0 = UART(0, baudrate=9600, tx = Pin(0), rx = Pin(1))
-
- 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)
-
-
-
- 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)
-
-
-
- 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'))
- if stat:
-
- stat = my_gps.update(uart0.read(1).decode("ascii"))
-
- 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)
-
以下为用充电宝实现的智杖!当然,目前还没有制作外壳哈哈哈,有兴趣想做完成品的可以加上外壳~
|