Skip to content

Commit e41142c

Browse files
authored
Merge pull request #1 from aaronchenzhihe/main
solution_sensorhub
2 parents a9582cb + 7fa2092 commit e41142c

27 files changed

+215
-37
lines changed

README.md

Lines changed: 103 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,103 @@
1-
# solution-Sensorhub
2-
海外 vSIM EVB 项目推广 example,硬件选型:EC200UEU + Sense HAT(B)
1+
# 快速上手
2+
3+
## 硬件准备
4+
5+
Windows电脑一台,建议 `Win10` 系统。
6+
7+
一套[EC200U-EU Quecpython 标准开发板](https://python.quectel.com/doc/Getting_started/zh/evb/ec200x-evb.html)(含天线,Type-C数据线)
8+
9+
一张能够正常使用的SIM卡
10+
11+
## 环境搭建
12+
13+
- 下载并安装EC200EU系列模组驱动:[QuecPython_USB_Driver_Win10_ASR](https://images.quectel.com/python/2023/04/Quectel_Windows_USB_DriverA_Customer_V1.1.13.zip)
14+
15+
16+
- 下载并安装 [VSCode](https://code.visualstudio.com/)
17+
- 下载并解压 [QPYCom](https://images.quectel.com/python/2022/12/QPYcom_V3.6.0.zip) 工具到电脑的合适位置。
18+
- 下载[固件包](../../solutions/SimpliKit/EC200UEUAAR05A01M08_TEST0222.zip )
19+
- 下载[实验源码](https://gitee.com/dustin-wei/solution-sensorhub)
20+
21+
## 硬件连接
22+
23+
按照下图硬件连接:
24+
25+
<img src="./media/EVB_link1.png" style="zoom: 25%;" /><img src="./media/EVB_link2.png" style="zoom: 20%;" />
26+
27+
28+
29+
1. 将天线连接至标识有 `LTE` 字样的天线连接座上。
30+
31+
2. 使用 Type-C 数据线连接开发板和电脑。
32+
33+
3. 在图示位置SIM1卡槽插入可用的 Nano SIM 卡
34+
35+
36+
37+
## 设备开发
38+
39+
- ### 开机
40+
41+
完成硬件连接工作后,当PWR,SCK1亮起或电脑设备管理器的端口列表出现包含Quectel USB字样的COM口,表示开机成功
42+
43+
<img src="./media/USB.png" />
44+
45+
46+
47+
- ### 烧录固件包
48+
49+
参考[此章节](https://python.quectel.com/doc/Application_guide/zh/dev-tools/QPYcom/qpycom-dw.html#下载固件),烧录[固件包](../../solutions/SimpliKit/EC200UEUAAR05A01M08_TEST0222.zip )至开发板。
50+
51+
- ### 脚本导入与运行
52+
53+
1.参考[此章节](https://python.quectel.com/doc/Getting_started/zh/first_python.html#PC与模组间的文件传输),将源码目录下的code文件夹中的所有文件按原目录结构导入到模组文件系统中,如下图所示
54+
55+
<img src="./media/Qpycom.png" />
56+
57+
2.参考[此章节](https://python.quectel.com/doc/Getting_started/zh/first_python.html#执行脚本文件),执行主程序文件_main.py
58+
59+
3.参考[此章节](https://python.quectel.com/doc/Getting_started/zh/first_python.html#停止程序运行),停止程序运行。
60+
61+
## 业务调试
62+
63+
### 程序启动
64+
65+
执行_main.py脚本后,程序开始运行,会打印拨号信息,包括拨号状态、IP地址、DNS服务器地址,设备号等
66+
67+
<img src="./media/drivers_data.png" />
68+
69+
### 🚩 **Warning**
70+
71+
未插入SIM卡时,SCK1灯不会亮起,并且无法打印设备信息,插入SIM卡并重启设备后即可正常运行。
72+
73+
<img src="./media/sim_erro.png" />
74+
75+
### 数据检测
76+
77+
开始运行后每1s会打印一次检测到的温度1,湿度,气压,温度2,颜色的三原色的数据,
78+
79+
<img src="./media/data.png" />
80+
81+
### 数据更新
82+
83+
当检测以上4种的任一数据产生大于1或者原色产生大于150的变化时就会尝试上传云端更新数据,当上传成功时返回“send ret:True”,并且会提示是哪些数据发生了变化,APP读取云端最新数据进行数据更新。
84+
85+
<img src="./media/data_up.png" />
86+
87+
<img src="./media/yun.png" />
88+
89+
如果数据没有大于1的变化就会只在pqcom中打印当前检测的数据,不会发起上传云端。
90+
91+
<img src="./media/data1.png" />
92+
93+
位置定位更新,当模组位移超过50米时,云端会刷新定位信息,app读取最新定位信息。
94+
95+
<img src="./media/gnss.png" />
96+
97+
主动刷新APP数据,通过点击APP右上角刷新按键,APP会向服务器发起主动读取数据的指令,用于主动更新面板数据
98+
99+
<img src="./media/APP.png" style="zoom: 67%;" />
100+
101+
温度,湿度,气压,颜色,Lbs数据被获取成功
102+
103+
<img src="./media/data_get.png" style="zoom: 100%;" />
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
| module | 描述|
2+
| --- | --- |
3+
|uzlib|zlib解压缩|
4+
|utime|时间相关功能|
5+
|uos|基本系统服务|
6+
|ujson|JSON编码和解码|
7+
|uhashlib|哈希算法|
8+
|urandom|生成随机数|
9+
|ubinascii|二进制与ASCLL转换|
10+
|umqtt|MQTT客户端|
11+
|_thread|多线程|
12+
|net|网络相关功能|
13+
|sim|SIM卡功能|
14+
|misc.Power|关机以及软件重启功能|
15+
|ql_fs|高级文件操作|
16+
|fota|fota升级|
17+
|app_fota_download|py脚本升级|
18+
|log|日志输出|
19+
|modem|设备相关|
20+
|queue|消息队列|
21+
|request|http客户端|
22+

code/_main.py

Lines changed: 8 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
1-
import net
21
import utime
3-
import checkNet
42
import dataCall
5-
from misc import Power
63
from usr.libs import Application
74
from usr.libs.logging import getLogger
85
from usr.extensions import (
@@ -16,23 +13,6 @@
1613
logger = getLogger(__name__)
1714

1815

19-
def wait_network_ready():
20-
for _ in range(3):
21-
logger.info("wait network ready...")
22-
code = checkNet.waitNetworkReady(300)
23-
if code == (3, 1):
24-
logger.info("network has been ready.")
25-
break
26-
else:
27-
logger.warn("network not ready, code: {}".format(code))
28-
net.setModemFun(0, 0)
29-
utime.sleep_ms(200)
30-
net.setModemFun(1, 0)
31-
else:
32-
logger.warn("power restart")
33-
Power.powerRestart()
34-
35-
3616
def create_app(name="SimpliKit", version="1.0.0", config_path="/usr/config.json"):
3717
_app = Application(name, version)
3818
_app.config.init(config_path)
@@ -46,9 +26,15 @@ def create_app(name="SimpliKit", version="1.0.0", config_path="/usr/config.json"
4626

4727

4828
if __name__ == "__main__":
49-
wait_network_ready()
29+
while True:
30+
lte = dataCall.getInfo(1, 0)
31+
if lte[2][0] == 1:
32+
logger.debug('lte network normal')
33+
break
34+
logger.debug('wait lte network normal...')
35+
utime.sleep(3)
5036

51-
dataCall.setPDPContext(1, 0, 'BICSAPN', '', '', 0) #激活之前,应该先配置APN,这里配置第1路的APN
37+
dataCall.setPDPContext(1, 0, 'BICSAPN', '', '', 0) # 激活之前,应该先配置APN,这里配置第1路的APN
5238
dataCall.activate(1)
5339

5440
app = create_app()

code/config.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
{
22
"QTH_PRODUCT_KEY": "pe16Db",
3-
"QTH_PRODUCT_SECRET": "ZGZMQWQ3QkVyN2Jm"
3+
"QTH_PRODUCT_SECRET": "ZGZMQWQ3QkVyN2Jm",
4+
"QTH_SERVER": "mqtt://iot-south.acceleronix.io:1883"
45
}

code/config2.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"QTH_PRODUCT_KEY": "pe17gQ",
3+
"QTH_PRODUCT_SECRET": "REdmNmlMRS8yUmNi",
4+
"QTH_SERVER": "mqtt://iot-south.quectelcn.com:1883"
5+
}

code/extensions/gnss_service.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
from usr.libs import CurrentApp
44
from usr.libs.threading import Thread
55
from usr.libs.logging import getLogger
6+
import _thread
7+
from .import qth_client
68
try:
79
from math import sin, asin, cos, radians, fabs, sqrt
810
except:
@@ -188,6 +190,7 @@ def start_update(self):
188190
lng = lng_high + lng_low
189191
if nmea_tuple[5] == "W":
190192
lng = -lng
193+
191194
break
192195

193196
if nmea_data is not None:
@@ -218,3 +221,5 @@ def start_update(self):
218221
else:
219222
logger.error("send gnss to qth server fail")
220223
utime.sleep(3)
224+
225+

code/extensions/lbs_service.py

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from usr.libs import CurrentApp
44
from usr.libs.threading import Thread
55
from usr.libs.logging import getLogger
6-
6+
import _thread
77

88
logger = getLogger(__name__)
99

@@ -57,3 +57,25 @@ def start_update(self):
5757

5858
logger.debug("send lbs data to qth server success, next report will be after 1800 seconds")
5959
utime.sleep(1800)
60+
61+
def put_lbs(self):
62+
while True:
63+
lbs_data = self.read()
64+
if lbs_data is None:
65+
utime.sleep(2)
66+
continue
67+
68+
for _ in range(3):
69+
with CurrentApp().qth_client:
70+
if CurrentApp().qth_client.sendLbs(lbs_data):
71+
break
72+
else:
73+
logger.debug("send lbs data to qth server fail, next report will be after 2 seconds")
74+
utime.sleep(2)
75+
continue
76+
77+
logger.debug("send LBS data to qth server success")
78+
break
79+
80+
81+

code/extensions/qth_client.py

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
from usr.libs.threading import Lock
22
from usr.libs.logging import getLogger
33
from usr import Qth
4-
5-
4+
from usr.libs import CurrentApp
5+
from . import lbs_service
66
logger = getLogger(__name__)
77

88

@@ -24,7 +24,7 @@ def init_app(self, app):
2424
app.register("qth_client", self)
2525
Qth.init()
2626
Qth.setProductInfo(app.config["QTH_PRODUCT_KEY"], app.config["QTH_PRODUCT_SECRET"])
27-
Qth.setServer('mqtt://iot-south.acceleronix.io:1883')
27+
Qth.setServer(app.config["QTH_SERVER"])
2828
Qth.setEventCb(
2929
{
3030
"devEvent": self.eventCallback,
@@ -47,7 +47,6 @@ def start(self):
4747

4848
def stop(self):
4949
Qth.stop()
50-
5150
def sendTsl(self, mode, value):
5251
return Qth.sendTsl(mode, value)
5352

@@ -76,15 +75,38 @@ def recvTslCallback(self, value):
7675
def readTslCallback(self, ids, pkgId):
7776
logger.info("readTsl ids:{} pkgId:{}".format(ids, pkgId))
7877
value=dict()
78+
79+
temp1, humi =CurrentApp().sensor_service.get_temp1_and_humi()
80+
press, temp2 = CurrentApp().sensor_service.get_press_and_temp2()
81+
r,g,b = CurrentApp().sensor_service.get_rgb888()
82+
83+
value={
84+
3:temp1,
85+
4:humi,
86+
5:temp2,
87+
6:press,
88+
7:{1:r, 2:g, 3:b},
89+
90+
}
91+
lbs=lbs_service.LbsService()
92+
lbs.put_lbs()
93+
94+
95+
7996
for id in ids:
80-
if 1 == id:
81-
value[1]=180.25
82-
elif 2 == id:
83-
value[2]=30
84-
elif 3 == id:
85-
value[3]=True
97+
if 3 == id:
98+
value[3]=temp1
99+
elif 4 == id:
100+
value[4]=humi
101+
elif 5 == id:
102+
value[5]=temp2
103+
elif 6 == id:
104+
value[6]=press
105+
elif 7 == id:
106+
value[7]={1:r, 2:g, 3:b}
86107
Qth.ackTsl(1, value, pkgId)
87-
108+
109+
88110
def recvTslServerCallback(self, serverId, value, pkgId):
89111
logger.info("recvTslServer serverId:{} value:{} pkgId:{}".format(serverId, value, pkgId))
90112
Qth.ackTslServer(1, serverId, value, pkgId)

code/extensions/sensor_service.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,20 @@ def load(self):
4040
Thread(target=self.start_update).start()
4141

4242

43+
def get_temp1_and_humi(self):
44+
return self.shtc3.getTempAndHumi()
45+
46+
def get_press_and_temp2(self):
47+
return self.lps22hb.getTempAndPressure()
48+
def get_rgb888(self):
49+
rgb888 = self.tcs34725.getRGBValue()
50+
logger.debug("R: {}, G: {}, B: {}".format((rgb888 >> 16) & 0xFF, (rgb888 >> 8) & 0xFF, rgb888 & 0xFF))
51+
52+
r = (rgb888 >> 16) & 0xFF
53+
g = (rgb888 >> 8) & 0xFF
54+
b = rgb888 & 0xFF
55+
return r, g, b
56+
4357
def start_update(self):
4458
prev_temp1 = None
4559
prev_humi = None

media/1.png

7.88 MB
Loading

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy