diff --git a/docs/Quick_start/zh/code/timer_file.py b/docs/Quick_start/zh/code/timer_file.py new file mode 100644 index 0000000000000000000000000000000000000000..e6daa0bc760df56eb2c468e50d294055e7c57951 --- /dev/null +++ b/docs/Quick_start/zh/code/timer_file.py @@ -0,0 +1,27 @@ +import log +from machine import Timer + + +log.basicConfig(level=log.INFO) # 设置日志输出级别 +Timer_Log = log.getLogger("Quectel") # 获取logger对象 + +log_print_num = 5 +state = 1 +timer0 = Timer(Timer.Timer1) + + +# 创建一个执行函数,并将timer实例传入 +def timer_test(t): + global log_print_num + global state + Timer_Log.info('log_print_num is %d' % log_print_num) + log_print_num -= 1 + if log_print_num <= 0: + Timer_Log.info('timer exit') + state = 0 + timer0.stop() # 结束该定时器实例 + +timer0.start(period=1000, mode=timer0.PERIODIC, callback=timer_test) # 启动定时器 + +while state: + pass diff --git a/docs/Quick_start/zh/media/Timer_1.png b/docs/Quick_start/zh/media/Timer_1.png new file mode 100644 index 0000000000000000000000000000000000000000..f1107ce4581ae3697e2445b68d756ec5c718de96 Binary files /dev/null and b/docs/Quick_start/zh/media/Timer_1.png differ diff --git a/docs/Quick_start/zh/media/Timer_2.png b/docs/Quick_start/zh/media/Timer_2.png new file mode 100644 index 0000000000000000000000000000000000000000..0e188fe252661fb74ec89fb81ae8c0dbddf2108f Binary files /dev/null and b/docs/Quick_start/zh/media/Timer_2.png differ diff --git a/docs/Quick_start/zh/media/Timer_3.png b/docs/Quick_start/zh/media/Timer_3.png new file mode 100644 index 0000000000000000000000000000000000000000..26fc6499fca482baef2dabcf06fd37cc7aa08e9e Binary files /dev/null and b/docs/Quick_start/zh/media/Timer_3.png differ diff --git a/docs/Quick_start/zh/timer.md b/docs/Quick_start/zh/timer.md index 6f5bc275bc8f0cf12728d22eda64496b0699b582..a20539f720e1901cf8757062314c911a027e7874 100644 --- a/docs/Quick_start/zh/timer.md +++ b/docs/Quick_start/zh/timer.md @@ -1,151 +1,125 @@ -### 定时器 使用指导 +## 修订历史 -#### 定时器功能 +| 版本 | 日期 | 作者 | 变更表述 | +| ---- | ---------- | ------ | ---------------------------------------------------- | +| 1.0 | 2021-09-09 | Kayden | 增加修订历史,增加部分参考链接,更改代码下载链接位置 | -**定时器基本功能** -定时器可用于多种任务。目前,仅实现了最简单的情况,即定时调用函数,当前移远通信提供的定时器可实现单次和周期性调用函数两种模式。当到达定时器周期时,会触发事件。通过使用回调函数,定时器事件可调用一个Python 函数。 -**定时器功能示例** +# QuecPython Timer定时器开发 -将开发板接入电脑,之后,参考《Quectel_QuecPython_基础操作说明》文档进行操作,下面以 -EC100Y-CN 模块为例进行说明。 +文档主要基于EC600S介绍如何使用QuecPython\_Timer,**其他模组操作类同**。定时器最常用的就是定时与计数,即可以作为精准延时处理,也可以在接通一个时钟源的前提下,统计总共有多少脉冲。通过本文你将了解到Timer的所有设置参数及使用方法。 -![](media/782cd2c870c62e6f022cca4e47c7c806.jpg) +## 硬件描述 -> 图 **1**:模块接入电脑 +目前开放共4个定时器,具体请参阅硬件支持文档进行确认:[硬件支持](https://python.quectel.com/doc/doc/Quecpython_intro/zh/Qp_Product_intro/Hardware_Support.html) -> 创建 test.py 文件,在文件内导入 QuecPython 中的 Timer 类,Timer 类在 Machine -> 模块中。编写定时器代码,如下所示: +## 软件设计 -``` -from machine import Timer - -def func(args): - - print('###timer callback function###') - - timer = Timer(Timer.Timer1) - - timer.start(period=1000, mode=timer.PERIODIC, callback=func) -``` - - - -> 将 test.py -> 文件上传到开发板内,上传方法详见《Quectel_QuecPython_基础操作说明》。 - -> 程序运行结果,如下所示: - -``` ->>> import example - ->>> example.exec('test.py') - ->>> ###timer callback function### +软件相关API介绍参考链接:https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=timer - ###timer callback function### - - ###timer callback function### - - ###timer callback function### - - ###timer callback function### - - ###timer callback function### - - ###timer callback function### - - ###timer callback function### - -timer.stop() 0 - ->>> -``` - - - -#### **QuecPython** 中的定时器 - -**Timer 类中的常量** +### 常量说明 | 常量 | 说明 | -| -------------- | -------------------------- | -| Timer.Timer0 | 定时器 0 | -| Timer.Timer1 | 定时器 1 | -| Timer.Timer2 | 定时器 2 | -| Timer.Timer3 | 定时器 3 | +|----------------|----------------------------| +| Timer.Timer0 | 定时器0 | +| Timer.Timer1 | 定时器1 | +| Timer.Timer2 | 定时器2 | +| Timer.Timer3 | 定时器3 | | Timer.ONE_SHOT | 单次模式,定时器只执行一次 | | Timer.PERIODIC | 周期模式,定时器循环执行 | -#### Timer 类中的方法 +### 创建Timer对象 -**timer = Timer** +timer = Timer(Timer)。创建Timer对象接口参数介绍如下: -> 该函数用于创建一个 timer 对象。使用定时器相关函数 *timer.start* 和 -> *timer.stop* 之前,需先使用该函数 +| 参数 | 类型 | 说明 | +| ----- | ---- | ---------------------------------------- | +| Timer | int | 定时器号。EC600S支持定时器Timer0\~Timer3 | -> 实例化对象,即创建 Timer 对象。 +### 启动定时器 -- 函数原型 +timer.start(period, mode, callback):启动对应的定时器,接口参数介绍如下: - timer = Timer(Timern) +| 参数 | 类型 | 说明 | +|----------|----------|--------------------------------------------------------------------------------------| +| period | int | 中断周期,单位毫秒 | +| mode | int | 运行模式 Timer.ONE_SHOT 单次模式,定时器只执行一次 Timer.PERIODIC 周期模式,循环执行 | +| callback | function | 定时器执行函数 | -- 参数 +返回值:启动成功返回整型值0,失败返回整型值-1。 - *Timern*:常量。定时器号。EC100Y-CN 和 EC600S-CN - 模块支持的定时器为:Timer0~Timer3。 ⚫ 返回值 +### 关闭定时器 - 返回 timer 对象。 +timer.stop():关闭对应的定时器,无参数。 -**timer.start** +返回值:成功返回整型0,失败返回整型-1 -> 该函数用于启动定时器。 +## 交互操作 -- 函数原型 +使用QPYcom工具和模组进行交互,下面实例是基于Timer0,Timer1。Timer2和Timer3配置类似。 - timer.start(period, mode, callback) +
+![](media/Timer_1.png) -- 参数 - *period*:整型。中断周期,单位:毫秒。 - *mode*: +注意: - 常量。定时器运行模式,如下: +1. from machine import Timer即为让Timer模块在当前空间可见。 +2. 只有from machine import Timer模块,才能使用Timer内的函数和变量。 +3. 上述操作没有连接任何外设,仅作为熟悉指令参考。 - Timer.ONE_SHOT 单次模式,定时器只执行一次 - Timer.PERIODIC 周期模式,循环执行 - *callback*: 回调函数,定时执行的函数。 +## 下载验证 -- 返回值 +### 软件代码 - 0 定时器启动成功。 -1 定时器启动失败。 +配套demo的参考代码为文档同目录下的timer_file.py文件。下载.py文件到模组运行,代码如下: 点击下载代码 -**timer.stop** +```python +import log +from machine import Timer +log.basicConfig(level=log.INFO) # 设置日志输出级别 +Timer_Log = log.getLogger("Quectel") # 获取logger对象 +log_print_num = 5 +state = 1 +timer0 = Timer(Timer.Timer1) +# 创建一个执行函数,并将timer实例传入 +def timer_test(t): + global log_print_num + global state + Timer_Log.info('log_print_num is %d' % log_print_num) + log_print_num -= 1 + if log_print_num <= 0: + Timer_Log.info('timer exit') + state = 0 + timer0.stop() # 结束该定时器实例 +timer0.start(period=1000, mode=timer0.PERIODIC, callback=timer_test) # 启动定时器 +while state: + pass + +``` -> 该函数用于关闭定时器。 -- 函数原型 - timer.stop() +### 硬件连接: -- 参数 +本文验证仅对timer,无需外接外设。 - 无。 +### 运行效果 -- 返回值 +1. 打开QPYcom运行timer\_file.py,如下图: - 0 定时器关闭成功。 -1 定时器关闭失败。 +
+![](media/Timer_2.png) +
+2. 在QPYcom交互界面查看输出结果如下: -#### 附录 +
+![](media/Timer_3.png) -> 表 **1**:术语缩写 -| 术语 | 英文全称 | 中文全称 | -| ---- | --------------------------------- | ---------------- | -| API | Application Programming Interface | 应用程序编程接口 | diff --git a/docs/sbs/zh/BSP/ADC.md b/docs/sbs/zh/BSP/ADC.md index e7411a19033bc809aff82c80a3f60dc592005194..573350acac2a01c2a53c60725d2fabe26d9d0a3f 100644 --- a/docs/sbs/zh/BSP/ADC.md +++ b/docs/sbs/zh/BSP/ADC.md @@ -1,22 +1,28 @@ +## 修订历史 + +| 版本 | 日期 | 作者 | 变更表述 | +| ---- | ---------- | ------ | -------------------------------------------------- | +| 1.0 | 2021-09-10 | Kayden | 增加修订历史,参考链接,更换截图和代码下载链接位置 | + # **QuecPython ADC采样开发使用说明** ## 硬件描述 本文主要基于EC600S_QuecPython_EVB进行介绍,其他开发板类同。 -本部分介绍可结合光敏传感器实验进行学习:https://python.quectel.com/doc/doc/little_demo/zh/QuecPythonTest/Photoresistor.html +本部分介绍可结合光敏传感器实验进行学习:[光敏传感器实验](https://python.quectel.com/doc/doc/little_demo/zh/QuecPythonTest/Photoresistor.html) 目前EC600S开放共2路ADC,2路ADC连接位置如下图所示: -其他模组开放ADC情况可查看硬件支持内容,链接:https://python.quectel.com/doc/doc/Quecpython_intro/zh/Qp_Product_intro/Hardware_Support.html +其他模组开放ADC情况可查看硬件支持内容:[硬件支持](https://python.quectel.com/doc/doc/Quecpython_intro/zh/Qp_Product_intro/Hardware_Support.html) -具体ADC相关API使用介绍链接:https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=adc +具体ADC相关API使用介绍:[ADC相关API](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=adc) -ADC硬件原理图请查看模组硬件设计手册和开发板原理图,官网下载链接:https://python.quectel.com/download +ADC硬件原理图请查看模组硬件设计手册和开发板原理图[官网下载链接](https://python.quectel.com/download) 资料如有缺失可在QQ群搜索群文件获取:445121768 -![](media/ADC_0.png) +![](media/7acc910ebd7bf4eb806399676e468795.png) 对应关系如下表: diff --git a/docs/sbs/zh/BSP/I2C.md b/docs/sbs/zh/BSP/I2C.md index 2d8551bd9c7c2c1079e945bbc31dfb2a17b34bc6..6353ee806ea51908ecf6b12f084ca72c080feb6e 100644 --- a/docs/sbs/zh/BSP/I2C.md +++ b/docs/sbs/zh/BSP/I2C.md @@ -1,3 +1,9 @@ +## 修订历史 + +| 版本 | 日期 | 作者 | 变更描述 | +| ---- | ---------- | ------ | -------------------------------------------- | +| 1.0 | 2021-09-13 | Kayden | 增加修订历史,删除参考代码,新增参考实验链接 | + ## 简介 本文主要介绍QuecPython I2C模块的使用。 @@ -41,6 +47,6 @@ I2C的数据和地址传输都带响应。响应包括“应答(ACK)”和 ### 快速开始 1. 具体关于 QuecPython I2C 的详细的API 请参考:[QuecPython-machine - 硬件相关功能-I2C](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=i2c) -2. 关于I2C的应用实验详情参考内部温度传感器实验:https://python.quectel.com/doc/doc/little_demo/zh/QuecPythonTest/i2c_aht.html -3. 关于I2C的应用实验详情还可以参考加速度传感器实验:https://python.quectel.com/doc/doc/little_demo/zh/QuecPythonTest/i2c_lis2dh.html +2. 关于I2C的应用实验详情参考温湿度传感器实验:[温湿度传感器实验](https://python.quectel.com/doc/doc/little_demo/zh/QuecPythonTest/i2c_aht.html) +3. 关于I2C的应用实验详情还可以参考加速度传感器实验:[加速度传感器实验](https://python.quectel.com/doc/doc/little_demo/zh/QuecPythonTest/i2c_lis2dh.html) diff --git a/docs/sbs/zh/BSP/media/Qp_Advanced_development_QuecPythonSub_i2c_bus_01.png b/docs/sbs/zh/BSP/media/Qp_Advanced_development_QuecPythonSub_i2c_bus_01.png deleted file mode 100644 index e72dff666e5705908527cf7e83e7e0042770866b..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/BSP/media/Qp_Advanced_development_QuecPythonSub_i2c_bus_01.png and /dev/null differ diff --git a/docs/sbs/zh/BSP/media/Qp_Advanced_development_QuecPythonSub_i2c_bus_02.png b/docs/sbs/zh/BSP/media/Qp_Advanced_development_QuecPythonSub_i2c_bus_02.png deleted file mode 100644 index 90ea0941abd6f13a8848135233d6a6e781ce8dab..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/BSP/media/Qp_Advanced_development_QuecPythonSub_i2c_bus_02.png and /dev/null differ diff --git a/docs/sbs/zh/QuecPythonWirelessNetwork/DataCall.md b/docs/sbs/zh/QuecPythonWirelessNetwork/DataCall.md new file mode 100644 index 0000000000000000000000000000000000000000..297b4ef9a9c692157377644c46903009e3008e80 --- /dev/null +++ b/docs/sbs/zh/QuecPythonWirelessNetwork/DataCall.md @@ -0,0 +1,204 @@ +## 修订记录 + +| 版本 | 日期 | 作者 | 变更表述 | +| ---- | ---------- | ------ | ------------ | +| 1.0 | 2021-09-13 | Kayden | 初始版本修订 | + + + +# QuecPython_dataCall数据拨号 + +本片文章主要简介QuecPython_datacall 模块的使用,模块默认开机自动拨号上网。 + +**模块功能:** + +提供数据拨号相关接口。启动;配置;查询终端通过何种接入方式来访问何种网络。 + +**对应API:** + +- dataCall.start(profileIdx, ipType, apn, username, password, authType) +- dataCall.setApn(profileIdx, ipType, apn, username, password, authType) +- dataCall.setCallback(usrFun) +- dataCall.getInfo(profileIdx, ipType) + +具体的API 详解请参考[Quecpython - dataCall - 数据拨号](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=datacall-数据拨号) + + + +## 数据拨号简介 + +简单理解, 数据拨号即为通过拨号的方式和服务器建立连接,获取网络访问许可过程。 对于终端设备来说就是配置APN。 + +### 什么是APN + +APN指一种网络接入技术,是终端入网时必须配置的一个参数,它决定了终端通过哪种接入方式来访问网络。 + +对于用户来说,可以访问的外部网络类型有很多,例如:[Internet](https://baike.baidu.com/item/Internet/272794)、[WAP网站](https://baike.baidu.com/item/WAP网站/3419865)、集团企业内部网络、行业内部专用网络。而不同的接入点所能访问的范围以及接入的方式是不同的,网络侧如何知道终端激活以后要访问哪个网络从而分配哪个网段的IP呢,这就要靠APN来区分了,即APN决定了用户的终端通过哪种接入方式来访问什么样的网络。 + + [APN Configuration](https://prepaid-data-sim-card.fandom.com/wiki/APN_Configuration) + + [What is Access Point Name (APN)](https://1ot.mobi/resources/blog/iot-hacking-series-3-what-is-access-point-name-apn-and-how-it-works) + +所有运营商都使用特定的APN(Access Point Name,接入点名称)。这通常是您的SIM卡预先配置的,但必要时,您需手动进行调整。 + +### APN的含义 + +APN决定了终端通过哪种接入方式来访问网络,用来标识[GPRS](https://baike.baidu.com/item/GPRS/107439)的业务种类。 + +APN分为两大类: + +- [WAP](https://baike.baidu.com/item/WAP/207452)业务。 +- [WAP](https://baike.baidu.com/item/WAP/207452)以外的服务,比如:连接因特网。 + +从运营商角度看,APN就是一个逻辑名字,APN一般都部署在GGSN设备上或者逻辑连接到GGSN上,用户使用GPRS上网时,都通过[GGSN](https://baike.baidu.com/item/GGSN/6041769)代理出去到外部网络,因此,APN设置、过滤、统计等,就成为一个对GPRS计费、GPRS资费有重要参考价值的参数之一(因为APN可以区分一个业务或者外部网络)。 + +APN的完整说明在3GPP规范TS23.003 Clause 9中进行了详细定义。 + +### APN的构成 + +APN接入点名称由两部分组成: + +- 网络标识符 + +- 运营商标识符 + +运营商标识符又由其他两个部分组成: + +- 移动网络代码(MNC) + +- 移动国家代码(MCC) + +### APN的类型 + +我们可以根据APN是连接到公共网络还是专用网络以及IP地址的分配方式来划分APN,有以下四种不同的类型: + +- **公用的APN-**通常简称为“ APN”。使用公用APN连接到网关的设备会动态获得IP地址,以便大部分访问互联网; + +- **具有静态IP的公用APN-**网关根据公共网络的可用IP池为设备分配静态IP地址; + +- **专用APN-**这也被认为是“带有VPN的APN”。具有专用APN配置的设备可以通过网关连接到自己的内部网络; + +- **具有静态IP的专用APN-**网关根据专用网络的可用IP池为设备分配静态IP地址。 + +当我们比较公用APN和专用APN时,我们可以看到后者甚至不需要互联网连接。专用APN永远不允许其访问公共互联网,而同时又保持其在蜂窝网络基础架构上,从而确保了安全的数据处理。 + +### 配置APN + +对于QuecPython,可使用SIM卡默认APN或者手动配置APN,也可以调用API函数配置APN。 + + + +## 快速开始 + +### 操作流程 + +1. 使用链路拨号,获取进行链路激活。 +2. 获取IP信息等基本数据。 +3. 注册断网回调函数, 在回调函数里面,判断网络状态,进入重拨等操作。 + +### 交互实验 + +```python +>>> import dataCall +>>> import net +>>> dataCall.setApn(1, 0, "3gnet.mnc001.mcc460.gprs", "", "", 0) +0 +>>> dataCall.start(1, 0, "3gnet.mnc001.mcc460.gprs", "", "", 0) +0 +>>> def nw_cb(args): + pdp = args[0] + nw_sta = args[1] + if nw_sta == 1: + print("*** network %d connected! ***" % pdp) + else: + print("*** network %d not connected! ***" % pdp) + +>>> dataCall.setCallback(nw_cb) +0 +>>> net.setModemFun(4) # 进入飞行模式 +0 +>>> *** network 1 not connected! *** # 进入飞行模式导致断网,通过回调告知用户 +>>> net.setModemFun(1) # 退出飞行模式 +0 +>>> *** network 1 connected! *** # 退出飞行模式,自动拨号,等待联网成功,通过回调告知用户 +``` + + + +### 代码实验 + +1. 首先链路激活。 +2. 打印IP信息等。 +3. 注册回调函数。 +4. 使用飞行模式模拟离线 +5. 在回调函数中重新拨号。 + + 下载代码 + +**注意:**运行此代码想要正确观察现象需要插入可以使用的SIM卡。 + +```python +import dataCall +import net +import utime as time + + +g_net_status = False + + +def callback(args): + pdp = args[0] + nw_sta = args[1] + if nw_sta == 1: + g_net_status = True + print("*** network %d connected! ***" % pdp) + else: + g_net_status = False + print("*** network %d not connected! ***" % pdp) + # 重新进入 + test_datacall_module() + + +def test_datacall_module(): + # 拨号 + ret = dataCall.start(1, 0, "3gnet.mnc001.mcc460.gprs", "", "", 0) + if ret == 0: + print("datacall start has success") + g_net_status = True + # 获取IP地址等信息 + Info = dataCall.getInfo(1, 0) + print(Info) + print("test datacall has exit") + pass + + +def test_datacall_callback(): + test_datacall_module() + # 注册回调中断 + ret = dataCall.setCallback(callback) + if ret == 0x00: + print("set Callback has success") + net.setModemFun(4) # 进入飞行模式 + time.sleep_ms(1000) + net.setModemFun(1) # 重新进入正常模式 + print("test_datacall_callback funcation has exited") + pass + + +if __name__ == "__main__": + test_datacall_callback() + +``` + +运行结果: + +![](media/datacall_result.png) + +## 参考资料 + +[What is Access Point Name (APN)](https://1ot.mobi/resources/blog/iot-hacking-series-3-what-is-access-point-name-apn-and-how-it-works) + +[APN Configuration](https://prepaid-data-sim-card.fandom.com/wiki/APN_Configuration) + +[Quecpython - dataCall - 数据拨号](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=datacall-数据拨号) + diff --git a/docs/sbs/zh/QuecPythonWirelessNetwork/code/datacall_base.py b/docs/sbs/zh/QuecPythonWirelessNetwork/code/datacall_base.py new file mode 100644 index 0000000000000000000000000000000000000000..8f09e5e499e071bc5a2d42e95784d84d7e818737 --- /dev/null +++ b/docs/sbs/zh/QuecPythonWirelessNetwork/code/datacall_base.py @@ -0,0 +1,52 @@ + +# 参考 https://python.quectel.com/wiki/#/zh-cn/api/?id=datacall-%e6%95%b0%e6%8d%ae%e6%8b%a8%e5%8f%b7 + +import dataCall +import net +import utime as time + + +g_net_status = False + + +def callback(args): + pdp = args[0] + nw_sta = args[1] + if nw_sta == 1: + g_net_status = True + print("*** network %d connected! ***" % pdp) + else: + g_net_status = False + print("*** network %d not connected! ***" % pdp) + # 重新进入 + test_datacall_module() + + +def test_datacall_module(): + # 拨号 + ret = dataCall.start(1, 0, "3gnet.mnc001.mcc460.gprs", "", "", 0) + if ret == 0: + print("datacall start has success") + g_net_status = True + # 获取IP地址等信息 + Info = dataCall.getInfo(1, 0) + print(Info) + print("test datacall has exit") + pass + + +def test_datacall_callback(): + test_datacall_module() + # 注册回调中断 + ret = dataCall.setCallback(callback) + if ret == 0x00: + print("set Callback has success") + net.setModemFun(4) # 进入飞行模式 + time.sleep_ms(1000) + net.setModemFun(1) # 重新进入正常模式 + print("test_datacall_callback funcation has exited") + pass + + +if __name__ == "__main__": + test_datacall_callback() diff --git a/docs/sbs/zh/QuecPythonWirelessNetwork/media/datacall_result.png b/docs/sbs/zh/QuecPythonWirelessNetwork/media/datacall_result.png new file mode 100644 index 0000000000000000000000000000000000000000..99fc5428f7a0e0dbee3dbc91dc089c3069b46327 Binary files /dev/null and b/docs/sbs/zh/QuecPythonWirelessNetwork/media/datacall_result.png differ