diff --git "a/docs/Advanced_development/zh/HeliosService/Helio_Service\346\214\207\345\215\227(1)_\345\205\245\351\227\250.pdf" "b/docs/Advanced_development/zh/HeliosService/Helio_Service\346\214\207\345\215\227(1)_\345\205\245\351\227\250.pdf" deleted file mode 100644 index 9b7f3d7c7170a87fb8ef4154b47fcf464ac0f107..0000000000000000000000000000000000000000 Binary files "a/docs/Advanced_development/zh/HeliosService/Helio_Service\346\214\207\345\215\227(1)_\345\205\245\351\227\250.pdf" and /dev/null differ diff --git "a/docs/Advanced_development/zh/HeliosService/Helio_Service\346\214\207\345\215\227(2)_\350\277\233\351\230\266.pdf" "b/docs/Advanced_development/zh/HeliosService/Helio_Service\346\214\207\345\215\227(2)_\350\277\233\351\230\266.pdf" deleted file mode 100644 index a8f8eef69b83758a9202a44f7703642dddcb7526..0000000000000000000000000000000000000000 Binary files "a/docs/Advanced_development/zh/HeliosService/Helio_Service\346\214\207\345\215\227(2)_\350\277\233\351\230\266.pdf" and /dev/null differ diff --git "a/docs/Advanced_development/zh/HeliosService/Helio_Service\346\214\207\345\215\227(3)_\351\253\230\347\272\247.pdf" "b/docs/Advanced_development/zh/HeliosService/Helio_Service\346\214\207\345\215\227(3)_\351\253\230\347\272\247.pdf" deleted file mode 100644 index ae29e4972542e6de2702d2833d000ca44e9c373e..0000000000000000000000000000000000000000 Binary files "a/docs/Advanced_development/zh/HeliosService/Helio_Service\346\214\207\345\215\227(3)_\351\253\230\347\272\247.pdf" and /dev/null differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/Aliyun.md b/docs/Advanced_development/zh/QuecPythonCloud/Aliyun.md index a0ed340e9329f0f2b8011b0e61fb7f9151c5b7af..ccb90cfcd22729fa7148cd2354997ffc72235118 100644 --- a/docs/Advanced_development/zh/QuecPythonCloud/Aliyun.md +++ b/docs/Advanced_development/zh/QuecPythonCloud/Aliyun.md @@ -1,3 +1,13 @@ +## 文档历史 + +**修订记录** + +| **版本** | **日期** | **作者** | **变更表述** | +| -------- | ---------- | -------- | ------------ | +| 1.0 | 2021-09-29 | Chic | 初始版本 | + + + # QuecPython 接入阿里云 文档主要介绍如何使用“企业物联网平台”,企业物联网平台提供全托管的实例服务,无需自建物联网的基础设施即可便捷地接入和管理设备,具有低成本、高可靠、高性能、易运维的优势。下面主要从MQTT连接方式讲解,通过阅读本文,您将了解到QuecPython连接“企业物联网平台”的过程操作和验证实验理论。 @@ -40,6 +50,8 @@ http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/attach/189223/cn_zh/1605168543507/MQTT_Password.7z?spm=a2c4g.11186623.2.19.373573a8XfigN5&file=MQTT_Password.7z +#### 填入设备信息: + 其中clientid是自定义,一般和deviceName同名即可,用于MQTT连接。 method加密方式要和连接MQTT时的设置一致。 diff --git a/docs/Advanced_development/zh/QuecPythonCloud/AmazonCloud.md b/docs/Advanced_development/zh/QuecPythonCloud/AmazonCloud.md index 11f22a23faf505eb828ea6a2eb115476acd85e80..1c10939da25c688f3bebda5cc9f8ac247d775f4b 100644 --- a/docs/Advanced_development/zh/QuecPythonCloud/AmazonCloud.md +++ b/docs/Advanced_development/zh/QuecPythonCloud/AmazonCloud.md @@ -1,3 +1,13 @@ +## 文档历史 + +**修订记录** + +| **版本** | **日期** | **作者** | **变更表述** | +| -------- | ---------- | -------- | ------------ | +| 1.0 | 2021-09-29 | Chic | 初始版本 | + + + # QuecPython AmazonCloud实验介绍 ​ 本文主要介绍如何使用AWS IoT亚马逊物连网云。AWS IoT提供了可用于实施IoT解决方案的云服务和设备支持,同时提供众多云服务支持基于IoT的应用程序,用户可以访问IoT设备以及这些设备所连接的云服务所提供的功能。下面主要从MQTT连接方式讲解,通过阅读本文,您将了解到QuecPython连接AWS IoT的过程操作和验证实验理论。 @@ -14,7 +24,7 @@ ![2](media/2.png) -![1](media/1.png) +![image-20210929165153457](media\image-20210929165153457.png) ![3](media/3.png) diff --git a/docs/Advanced_development/zh/QuecPythonCloud/HuaweiCloud.md b/docs/Advanced_development/zh/QuecPythonCloud/HuaweiCloud.md index f6919d3fde307cf5611e1abe0f112edbc5249c7e..1894bb649e64cce56f5637db46be4064aadc3a2a 100644 --- a/docs/Advanced_development/zh/QuecPythonCloud/HuaweiCloud.md +++ b/docs/Advanced_development/zh/QuecPythonCloud/HuaweiCloud.md @@ -1,3 +1,13 @@ +## 文档历史 + +**修订记录** + +| **版本** | **日期** | **作者** | **变更表述** | +| -------- | ---------- | -------- | ------------ | +| 1.0 | 2021-09-29 | Chic | 初始版本 | + + + # QuecPython 接入华为云 文档主要介绍如何使用HuaweiCloud华为云,HuaweiCloud设备接入服务(IoTDA)是华为云的物联网平台,提供海量设备连接上云、设备和云端双向消息通信、批量设备管理、远程控制和监控、OTA升级、设备联动规则等能力,并可将设备数据灵活流转到华为云其他服务。 @@ -56,7 +66,9 @@ USER = b'5fbbb784b4ec2202e982e643_868540050954037' PASSWORD =b'8001a12405743199b3396943a2ed397286117a9ebab4f5dfda8dd6fafe341d94' ``` -![IMG_256](media/744a99b28c9b15b0e515f4ce6b4e63a1.png) +![image-20210929163551641](media\image-20210929163551641.png) + +![image-20210929163737178](media\image-20210929163737178.png) ![IMG_256](media/ad674210c976e30f24d800bede396808.png)说明: diff --git a/docs/Advanced_development/zh/QuecPythonCloud/TencentCloud.md b/docs/Advanced_development/zh/QuecPythonCloud/TencentCloud.md index c78d5f0c43c674601ccbdd76b977037e91e49683..11b545ae0f5aa606e8515d5ae3f336f5e6256020 100644 --- a/docs/Advanced_development/zh/QuecPythonCloud/TencentCloud.md +++ b/docs/Advanced_development/zh/QuecPythonCloud/TencentCloud.md @@ -1,8 +1,12 @@ -## 修订历史 +## 文档历史 + +**修订记录** + +| **版本** | **日期** | **作者** | **变更表述** | +| -------- | ---------- | -------- | ------------ | +| 1.0 | 2021-09-29 | Chic | 初始版本 | + -| Version | Date | Author | Change expression | -| ------- | ---------- | ---------- | ----------------- | -| 1.0 | 2021-09-18 | David.Tang | Initial version | ## 前言 diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210929163551641.png b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210929163551641.png new file mode 100644 index 0000000000000000000000000000000000000000..fa2214a3a466023a5e1bf54f08943fd127954da3 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210929163551641.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210929163737178.png b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210929163737178.png new file mode 100644 index 0000000000000000000000000000000000000000..df147d9da57578ffef1cfa85003d774bbede4fef Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210929163737178.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210929165153457.png b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210929165153457.png new file mode 100644 index 0000000000000000000000000000000000000000..ea2489091ae1474006eea8de5c49ab0d2609f264 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210929165153457.png differ diff --git a/docs/Quick_start/zh/GPIO.md b/docs/Quick_start/zh/GPIO.md index 46f70ff3fa0b1164d82e8ae0000dfe260ec25b80..0b133b1d50ac4ce92d217bcbfad3affff6669fa7 100644 --- a/docs/Quick_start/zh/GPIO.md +++ b/docs/Quick_start/zh/GPIO.md @@ -1,303 +1,287 @@ -## 输入捕获实验 +## 文档历史 -文档主要基于 EC600S 介绍如何使用 QuecPython 的输入捕获,在日常应用中,输入捕获主要用于检测 GPIO 的电平,判断电平的时间长短;或者对于一个规律的 PWM 波形,计算占空比等等。 +**修订记录** -### 硬件描述 +| **版本** | **日期** | **作者** | **变更表述** | +| -------- | ---------- | -------- | ------------ | +| 1.0 | 2021-09-29 | Chic | 初始版本 | -输入捕获主要就是检测 GPIO 口的电平时间,硬件的话,可以参考“ QuecPython GPIO 及中断开发 ”文 -档。 -### 实验 1:检测 GPIO 触发时间长短 +## 概述 -#### 实验目的 +GPIO:(英语:General-purpose input/output),通用型之输入输出的简称。 -EC600S 的 PIN10 和 PIN11 外接两个按键,一个按键( PIN10)模拟触发,进行检测,对于短时间的触 发,默认输出短按状态显示,对于长时间的触发,输出长按状态显示,如果超过一定时间的长按,默认溢 出;另外一个按键( PIN11)用于触发,中断循环。 -#### 参考代码 -下载 .py 文件到模组运行,代码如下: +## 功能描述 -```python -import log -import _thread -import utime -from machine import Pin -from machine import Timer -from machine import ExtInt - -Time_mun_low = 0 -key_time = 0 -key_short = 10 -key_log = 500 -key_out = 3000 -state = 1 -gpio1 = Pin(Pin.GPIO1, Pin.OUT, Pin.PULL_PU, 1) -gpio2 = Pin(Pin.GPIO2, Pin.OUT, Pin.PULL_PU, 1) -log.basicConfig(level=log.NOTSET) -KEY_log = log.getLogger("KEY") - -def Time1_fun(args): - global Time_mun_low - Time_mun_low += 1 - -def I_C_fun(args): - global Time_mun_low - global key_time - if gpio1.read() == 0: - Time_mun_low = 0 - elif gpio1.read() == 1: - key_time = Time_mun_low - else: - pass - -def Input_Capture(): - KEY_log.debug("I_C start!") - global state - global key_time - timer1 = Timer(Timer.Timer1) #定时器 1 - timer1.start(period=1, mode=timer1.PERIODIC, callback=Time1_fun) - extint1 = ExtInt(ExtInt.GPIO1, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, I_C_fun) - extint1.enable() - while True: - if gpio2.read() == 0: - utime.sleep_ms(10) - if gpio2.read() == 0: - KEY_log.info("GPIO2 levels:{}".format(gpio2.read())) - break - if key_time != 0: - KEY_log.info("key_time:{}ms".format(key_time)) - if key_time <= key_short: - pass - elif key_short < key_time <= key_log: - print(" key short input ") - elif key_log < key_time <= key_out: - print(" key log input ") - else: - print(" key out ") - pass - key_time = 0 - state = 0 - KEY_log.debug("I_C end!") - -if __name__ == "__main__": - KEY_log.info("in_capture thread start") - _thread.start_new_thread(Input_Capture, ()) - while True: - if state == 0: - KEY_log.info("in_capture thread end") - break - else: - pass -``` +GPIO可以输出高电平、低电平两种状态,设置为1即高电平,0即为低电平 - - 下载代码 - -#### 硬件连接 +![image-20210906154509891](media\image-20210906154509891.png) -本文验证 无需外接外设。 +GPIO可以读取外部电平状态,读到高电平返回1,读到低电平返回0 -#### 运行效果 +![image-20210906154519521](media\image-20210906154519521.png) -(1) 打开 QPYcom 运行 gpio_check.py,如下图: -![QuecPython_输入捕获小实验_01](media/QuecPython_输入捕获小实验_01.png) -(2) 运行后,手动按键 1(PIN10)不同时间会输出不同的打印,尝试多次后,可以使用按键 2(PIN11) 中断循环, QPYcom 交互界面输出结果 如下 所示 : +## API介绍 -![QuecPython_输入捕获小实验_02](media/QuecPython_输入捕获小实验_02.png) +### 创建对象 +**gpio = Pin(GPIOn, direction, pullMode, level)** +**参数:** -### 实验 2:模拟计算 PWM 波占空比 +​ GPIOn: -#### 实验目标 +​ EC100YCN平台引脚对应关系如下(引脚号为外部引脚编号): -利用按键 1,简单模拟 PWM 波,由于计算占空比至少需要两个周期,所以对于按键来说,需要输入两 次触发,两次触发后,计算占空比。 +​ GPIO1 – 引脚号22 +​ GPIO2 – 引脚号23 +​ GPIO3 – 引脚号38 -#### 参考代码 +​ GPIO4 – 引脚号53 -下载 .py 文件到模组运行,代码如下: +​ GPIO5 – 引脚号54 -``` -import utime -import log -import _thread -from machine import ExtInt -from machine import Pin +​ GPIO6 – 引脚号104 -count_num = 0 -low_ratio = 0 -count_high_num = 0 -count_low_num1 = 0 -count_low_num2 = 0 - -log.basicConfig(level=log.INFO) -Testlog = log.getLogger("Quectel") -gpio1 = Pin(Pin.GPIO1, Pin.IN, Pin.PULL_DISABLE, 0) - -def fun(args): - gpio1_data = gpio1.read() - global count_low_num1 - global count_low_num2 - global count_high_num - global low_ratio - global count_num - if gpio1_data == 0: - Testlog.info("GPIO_data:{}".format(gpio1_data)) - if count_low_num1 == 0 and count_high_num == 0 and count_low_num1 != count_num: - count_num = 0 - count_low_num1 = count_num - Testlog.info("count_num reset") - elif count_high_num != 0: - if count_low_num2 == 0: - count_low_num2 = count_num - Testlog.info("count_low_num1:{}ms".format(count_low_num1)) - Testlog.info("count_low_num2:{}ms".format(count_low_num2)) - low_ratio = (count_high_num-count_low_num1)/(count_low_num2-count_low_num1) - print('low_ratio: {:.2%}'.format(low_ratio)) - else: - pass - else: - pass - elif gpio1_data == 1: - Testlog.info("GPIO_data:{}".format(gpio1_data)) - if count_low_num2 == 0 and count_num != 0 and count_high_num != count_num: - count_high_num = count_num - Testlog.info("count_high_num:{}ms".format(count_high_num)) - elif count_low_num2 != 0 and count_high_num != count_num: - count_low_num1 = 0 - count_low_num2 = 0 - count_high_num = 0 - Testlog.info("count_high_num count_low_num1_2 reset") - else: - pass - else: - pass -def extint_gpio1(): - Testlog.debug("thread start") - global extint - extint = ExtInt(ExtInt.GPIO1, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, fun) - -def time_num(): - global count_num - while True: - utime.sleep_us(1) - count_num += 1 - -if __name__ == "__main__": - Testlog.info("main start") - _thread.start_new_thread(extint_gpio1, ()) - _thread.start_new_thread(time_num,()) - while True: - pass +​ GPIO7 – 引脚号105 -``` +​ GPIO8 – 引脚号106 - - 下载代码 +​ GPIO9 – 引脚号107 -#### 硬件连接 +​ GPIO10 – 引脚号178 -本文验证无需外接外设。 +​ GPIO11 – 引脚号195 +​ GPIO12 – 引脚号196 +​ GPIO13 – 引脚号197 -#### 运行效果 +​ GPIO14 – 引脚号198 -(1) 打开 QPYcom 运行 in_capture.py,如下图: +​ GPIO15 – 引脚号199 -![QuecPython_输入捕获小实验_03](media/QuecPython_输入捕获小实验_03.png) +​ GPIO16 – 引脚号203 -(2) 两次一个循环,计算占空比(如有不足,请指出)。 QPYcom 交互界面输出结果 如下所示: +​ GPIO17 – 引脚号204 -```python -import example ->>> example.exec('usr/in_capture.py') -INFO:Quectel:main start +​ GPIO18 – 引脚号214 + +​ GPIO19 – 引脚号215 + +​ EC600SCN/EC600NCN平台引脚对应关系如下(引脚号为模块外部引脚编号): + +​ GPIO1 – 引脚号10 + +​ GPIO2 – 引脚号11 + +​ GPIO3 – 引脚号12 + +​ GPIO4 – 引脚号13 + +​ GPIO5 – 引脚号14 + +​ GPIO6 – 引脚号15 + +​ GPIO7 – 引脚号16 + +​ GPIO8 – 引脚号39 + +​ GPIO9 – 引脚号40 + +​ GPIO10 – 引脚号48 + +​ GPIO11 – 引脚号58 + +​ GPIO12 – 引脚号59 + +​ GPIO13 – 引脚号60 + +​ GPIO14 – 引脚号61 + +​ GPIO15 – 引脚号62 + +​ GPIO16 – 引脚号63 + +​ GPIO17 – 引脚号69 + +​ GPIO18 – 引脚号70 + +​ GPIO19 – 引脚号1 + +​ GPIO20 – 引脚号3 + +​ GPIO21 – 引脚号49 + +​ GPIO22 – 引脚号50 + +​ GPIO23 – 引脚号51 + +​ GPIO24 – 引脚号52 + +​ GPIO25 – 引脚号53 + +​ GPIO26 – 引脚号54 + +​ GPIO27 – 引脚号55 + +​ GPIO28 – 引脚号56 + +​ GPIO29 – 引脚号57 + +​ EC600UCN平台引脚对应关系如下(引脚号为模块外部引脚编号) + +​ GPIO1 – 引脚号61 + +​ GPIO2 – 引脚号58 + +​ GPIO3 – 引脚号34 + +​ GPIO4 – 引脚号60 + +​ GPIO5 – 引脚号69 + +​ GPIO6 – 引脚号70 -INFO:Quectel:GPIO_data:0 -INFO:Quectel:count_num reset +​ GPIO7 – 引脚号123 -INFO:Quectel:GPIO_data:1 -INFO:Quectel:count_high_num:6ms +​ GPIO8 – 引脚号118 -INFO:Quectel:GPIO_data:0 -INFO:Quectel:count_low_num1:0ms -INFO:Quectel:count_low_num2:12ms -low_ratio: 50.00% +​ GPIO9 – 引脚号9 -INFO:Quectel:GPIO_data:1 -INFO:Quectel:count_high_num count_low_num1_2 reset +​ GPIO10 – 引脚号1 -INFO:Quectel:GPIO_data:0 -INFO:Quectel:count_num reset +​ GPIO11 – 引脚号4 -INFO:Quectel:GPIO_data:1 -INFO:Quectel:count_high_num:5ms +​ GPIO12 – 引脚号3 -INFO:Quectel:GPIO_data:0 -INFO:Quectel:count_low_num1:0ms -INFO:Quectel:count_low_num2:13ms -low_ratio: 38.46% -INFO:Quectel:GPIO_data:1 -INFO:Quectel:count_high_num count_low_num1_2 reset +​ GPIO13 – 引脚号2 -INFO:Quectel:GPIO_data:0 -INFO:Quectel:count_num reset +​ GPIO14 – 引脚号54 -INFO:Quectel:GPIO_data:1 -INFO:Quectel:count_high_num:5ms +​ GPIO15 – 引脚号57 -INFO:Quectel:GPIO_data:0 -INFO:Quectel:count_low_num1:0ms -INFO:Quectel:count_low_num2:13ms -low_ratio: 38.46% +​ GPIO16 – 引脚号56 -INFO:Quectel:GPIO_data:1 -INFO:Quectel:count_high_num count_low_num1_2 reset +​ EC200UCN平台引脚对应关系如下(引脚号为模块外部引脚编号) -INFO:Quectel:GPIO_data:0 -INFO:Quectel:count_num reset +​ GPIO1 – 引脚号27 -INFO:Quectel:GPIO_data:1 -INFO:Quectel:count_high_num:3ms +​ GPIO2 – 引脚号26 -INFO:Quectel:GPIO_data:0 -INFO:Quectel:count_low_num1:0ms -INFO:Quectel:count_low_num2:27ms -low_ratio: 11.11% +​ GPIO3 – 引脚号24 -INFO:Quectel:GPIO_data:1 -INFO:Quectel:count_high_num count_low_num1_2 reset +​ GPIO4 – 引脚号25 -INFO:Quectel:GPIO_data:0 -INFO:Quectel:count_num reset +​ GPIO5 – 引脚号13 -INFO:Quectel:GPIO_data:1 -INFO:Quectel:count_high_num:6ms +​ GPIO6 – 引脚号135 + +​ GPIO7 – 引脚号136 + +​ GPIO8 – 引脚号133 + +​ GPIO9 – 引脚号3 + +​ GPIO10 – 引脚号40 + +​ GPIO11 – 引脚号37 + +​ GPIO12 – 引脚号38 + +​ GPIO13 – 引脚号39 + +​ GPIO14 – 引脚号5 + +​ GPIO15 – 引脚号141 + +​ GPIO16 – 引脚号142 + +​ direction: + +​ IN – 输入模式 + +​ OUT – 输出模式 + +​ pullMode: + +​ PULL_DISABLE – 浮空模式 + +​ PULL_PU – 上拉模式 + +​ PULL_PD – 下拉模式 + +​ level: + +​ 0 - 设置引脚为低电平, 1- 设置引脚为高电平 + +**返回值:** + +​ 返回创建出来的对象 + + + +### 获取引脚电平 + +**Pin.read()** + +**参数:** + +​ 无 + +**返回值:** + +​ 返回0-低电平,1-高电平 + + + +### 设置引脚电平 + +**Pin.write(value)** + +**参数:** + +​ value:1为高电平,0为低电平 + +**返回值:** + +​ 设置成功返回整型值0,失败返回-1 + + + +## 实战操作 + +```python +from machine import Pin +import utime + +gpio1 = Pin(Pin.GPIO1, Pin.OUT, Pin.PULL_DISABLE, 0) +gpio2 = Pin(Pin.GPIO2, Pin.OUT, Pin.PULL_DISABLE, 0) +gpio3 = Pin(Pin.GPIO3, Pin.OUT, Pin.PULL_DISABLE, 0) + +while True: + gpio1.write(1) + gpio2.write(1) + gpio3.write(1) + print('Output high level') + utime.sleep_ms(500) + gpio1.write(0) + gpio2.write(0) + gpio3.write(0) + print('Output low level') + utime.sleep_ms(500) +``` -INFO:Quectel:GPIO_data:0 -INFO:Quectel:count_low_num1:0ms -INFO:Quectel:count_low_num2:17ms -low_ratio: 35.29% -INFO:Quectel:GPIO_data:1 -INFO:Quectel:count_high_num count_low_num1_2 reset +把上面的代码编写成.py文件,使用QPYcom工具下载到模组里面运行,即可看到实验现象啦。 -INFO:Quectel:GPIO_data:0 -INFO:Quectel:count_num reset +![image-20210906163913049](media\image-20210906163913049.png) -INFO:Quectel:GPIO_data:1 -INFO:Quectel:count_high_num:4ms -INFO:Quectel:GPIO_data:0 -INFO:Quectel:count_low_num1:0ms -INFO:Quectel:count_low_num2:13ms -low_ratio: 30.77% -INFO:Quectel:GPIO_data:1 -INFO:Quectel:count_high_num count_low_num1_2 reset -``` \ No newline at end of file diff --git "a/docs/Quick_start/zh/GPIO\346\227\247.md" "b/docs/Quick_start/zh/GPIO\346\227\247.md" new file mode 100644 index 0000000000000000000000000000000000000000..46f70ff3fa0b1164d82e8ae0000dfe260ec25b80 --- /dev/null +++ "b/docs/Quick_start/zh/GPIO\346\227\247.md" @@ -0,0 +1,303 @@ +## 输入捕获实验 + +文档主要基于 EC600S 介绍如何使用 QuecPython 的输入捕获,在日常应用中,输入捕获主要用于检测 GPIO 的电平,判断电平的时间长短;或者对于一个规律的 PWM 波形,计算占空比等等。 + +### 硬件描述 + +输入捕获主要就是检测 GPIO 口的电平时间,硬件的话,可以参考“ QuecPython GPIO 及中断开发 ”文 + +档。 + +### 实验 1:检测 GPIO 触发时间长短 + +#### 实验目的 + +EC600S 的 PIN10 和 PIN11 外接两个按键,一个按键( PIN10)模拟触发,进行检测,对于短时间的触 发,默认输出短按状态显示,对于长时间的触发,输出长按状态显示,如果超过一定时间的长按,默认溢 出;另外一个按键( PIN11)用于触发,中断循环。 + +#### 参考代码 + +下载 .py 文件到模组运行,代码如下: + +```python +import log +import _thread +import utime +from machine import Pin +from machine import Timer +from machine import ExtInt + +Time_mun_low = 0 +key_time = 0 +key_short = 10 +key_log = 500 +key_out = 3000 +state = 1 +gpio1 = Pin(Pin.GPIO1, Pin.OUT, Pin.PULL_PU, 1) +gpio2 = Pin(Pin.GPIO2, Pin.OUT, Pin.PULL_PU, 1) +log.basicConfig(level=log.NOTSET) +KEY_log = log.getLogger("KEY") + +def Time1_fun(args): + global Time_mun_low + Time_mun_low += 1 + +def I_C_fun(args): + global Time_mun_low + global key_time + if gpio1.read() == 0: + Time_mun_low = 0 + elif gpio1.read() == 1: + key_time = Time_mun_low + else: + pass + +def Input_Capture(): + KEY_log.debug("I_C start!") + global state + global key_time + timer1 = Timer(Timer.Timer1) #定时器 1 + timer1.start(period=1, mode=timer1.PERIODIC, callback=Time1_fun) + extint1 = ExtInt(ExtInt.GPIO1, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, I_C_fun) + extint1.enable() + while True: + if gpio2.read() == 0: + utime.sleep_ms(10) + if gpio2.read() == 0: + KEY_log.info("GPIO2 levels:{}".format(gpio2.read())) + break + if key_time != 0: + KEY_log.info("key_time:{}ms".format(key_time)) + if key_time <= key_short: + pass + elif key_short < key_time <= key_log: + print(" key short input ") + elif key_log < key_time <= key_out: + print(" key log input ") + else: + print(" key out ") + pass + key_time = 0 + state = 0 + KEY_log.debug("I_C end!") + +if __name__ == "__main__": + KEY_log.info("in_capture thread start") + _thread.start_new_thread(Input_Capture, ()) + while True: + if state == 0: + KEY_log.info("in_capture thread end") + break + else: + pass +``` + + + 下载代码 + +#### 硬件连接 + +本文验证 无需外接外设。 + +#### 运行效果 + +(1) 打开 QPYcom 运行 gpio_check.py,如下图: + +![QuecPython_输入捕获小实验_01](media/QuecPython_输入捕获小实验_01.png) + +(2) 运行后,手动按键 1(PIN10)不同时间会输出不同的打印,尝试多次后,可以使用按键 2(PIN11) 中断循环, QPYcom 交互界面输出结果 如下 所示 : + +![QuecPython_输入捕获小实验_02](media/QuecPython_输入捕获小实验_02.png) + + + +### 实验 2:模拟计算 PWM 波占空比 + +#### 实验目标 + +利用按键 1,简单模拟 PWM 波,由于计算占空比至少需要两个周期,所以对于按键来说,需要输入两 次触发,两次触发后,计算占空比。 + + + +#### 参考代码 + +下载 .py 文件到模组运行,代码如下: + +``` +import utime +import log +import _thread +from machine import ExtInt +from machine import Pin + +count_num = 0 +low_ratio = 0 +count_high_num = 0 +count_low_num1 = 0 +count_low_num2 = 0 + +log.basicConfig(level=log.INFO) +Testlog = log.getLogger("Quectel") +gpio1 = Pin(Pin.GPIO1, Pin.IN, Pin.PULL_DISABLE, 0) + +def fun(args): + gpio1_data = gpio1.read() + global count_low_num1 + global count_low_num2 + global count_high_num + global low_ratio + global count_num + if gpio1_data == 0: + Testlog.info("GPIO_data:{}".format(gpio1_data)) + if count_low_num1 == 0 and count_high_num == 0 and count_low_num1 != count_num: + count_num = 0 + count_low_num1 = count_num + Testlog.info("count_num reset") + elif count_high_num != 0: + if count_low_num2 == 0: + count_low_num2 = count_num + Testlog.info("count_low_num1:{}ms".format(count_low_num1)) + Testlog.info("count_low_num2:{}ms".format(count_low_num2)) + low_ratio = (count_high_num-count_low_num1)/(count_low_num2-count_low_num1) + print('low_ratio: {:.2%}'.format(low_ratio)) + else: + pass + else: + pass + elif gpio1_data == 1: + Testlog.info("GPIO_data:{}".format(gpio1_data)) + if count_low_num2 == 0 and count_num != 0 and count_high_num != count_num: + count_high_num = count_num + Testlog.info("count_high_num:{}ms".format(count_high_num)) + elif count_low_num2 != 0 and count_high_num != count_num: + count_low_num1 = 0 + count_low_num2 = 0 + count_high_num = 0 + Testlog.info("count_high_num count_low_num1_2 reset") + else: + pass + else: + pass +def extint_gpio1(): + Testlog.debug("thread start") + global extint + extint = ExtInt(ExtInt.GPIO1, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, fun) + +def time_num(): + global count_num + while True: + utime.sleep_us(1) + count_num += 1 + +if __name__ == "__main__": + Testlog.info("main start") + _thread.start_new_thread(extint_gpio1, ()) + _thread.start_new_thread(time_num,()) + while True: + pass + +``` + + + 下载代码 + +#### 硬件连接 + +本文验证无需外接外设。 + + + +#### 运行效果 + +(1) 打开 QPYcom 运行 in_capture.py,如下图: + +![QuecPython_输入捕获小实验_03](media/QuecPython_输入捕获小实验_03.png) + +(2) 两次一个循环,计算占空比(如有不足,请指出)。 QPYcom 交互界面输出结果 如下所示: + +```python +import example +>>> example.exec('usr/in_capture.py') +INFO:Quectel:main start + +INFO:Quectel:GPIO_data:0 +INFO:Quectel:count_num reset + +INFO:Quectel:GPIO_data:1 +INFO:Quectel:count_high_num:6ms + +INFO:Quectel:GPIO_data:0 +INFO:Quectel:count_low_num1:0ms +INFO:Quectel:count_low_num2:12ms +low_ratio: 50.00% + +INFO:Quectel:GPIO_data:1 +INFO:Quectel:count_high_num count_low_num1_2 reset + +INFO:Quectel:GPIO_data:0 +INFO:Quectel:count_num reset + +INFO:Quectel:GPIO_data:1 +INFO:Quectel:count_high_num:5ms + +INFO:Quectel:GPIO_data:0 +INFO:Quectel:count_low_num1:0ms +INFO:Quectel:count_low_num2:13ms +low_ratio: 38.46% +INFO:Quectel:GPIO_data:1 +INFO:Quectel:count_high_num count_low_num1_2 reset + +INFO:Quectel:GPIO_data:0 +INFO:Quectel:count_num reset + +INFO:Quectel:GPIO_data:1 +INFO:Quectel:count_high_num:5ms + +INFO:Quectel:GPIO_data:0 +INFO:Quectel:count_low_num1:0ms +INFO:Quectel:count_low_num2:13ms +low_ratio: 38.46% + +INFO:Quectel:GPIO_data:1 +INFO:Quectel:count_high_num count_low_num1_2 reset + +INFO:Quectel:GPIO_data:0 +INFO:Quectel:count_num reset + +INFO:Quectel:GPIO_data:1 +INFO:Quectel:count_high_num:3ms + +INFO:Quectel:GPIO_data:0 +INFO:Quectel:count_low_num1:0ms +INFO:Quectel:count_low_num2:27ms +low_ratio: 11.11% + +INFO:Quectel:GPIO_data:1 +INFO:Quectel:count_high_num count_low_num1_2 reset + +INFO:Quectel:GPIO_data:0 +INFO:Quectel:count_num reset + +INFO:Quectel:GPIO_data:1 +INFO:Quectel:count_high_num:6ms + +INFO:Quectel:GPIO_data:0 +INFO:Quectel:count_low_num1:0ms +INFO:Quectel:count_low_num2:17ms +low_ratio: 35.29% +INFO:Quectel:GPIO_data:1 +INFO:Quectel:count_high_num count_low_num1_2 reset + +INFO:Quectel:GPIO_data:0 +INFO:Quectel:count_num reset + +INFO:Quectel:GPIO_data:1 +INFO:Quectel:count_high_num:4ms + +INFO:Quectel:GPIO_data:0 +INFO:Quectel:count_low_num1:0ms +INFO:Quectel:count_low_num2:13ms +low_ratio: 30.77% + +INFO:Quectel:GPIO_data:1 +INFO:Quectel:count_high_num count_low_num1_2 reset +``` \ No newline at end of file diff --git a/docs/Quick_start/zh/media/image-20210906154509891.png b/docs/Quick_start/zh/media/image-20210906154509891.png new file mode 100644 index 0000000000000000000000000000000000000000..b9bc03507e44a7147e7785e78f947a4fabc6c704 Binary files /dev/null and b/docs/Quick_start/zh/media/image-20210906154509891.png differ diff --git a/docs/Quick_start/zh/media/image-20210906154519521.png b/docs/Quick_start/zh/media/image-20210906154519521.png new file mode 100644 index 0000000000000000000000000000000000000000..57b30c80fa4a47470d969e0ac716a9d5f2f063d3 Binary files /dev/null and b/docs/Quick_start/zh/media/image-20210906154519521.png differ diff --git a/docs/Quick_start/zh/media/image-20210906163913049.png b/docs/Quick_start/zh/media/image-20210906163913049.png new file mode 100644 index 0000000000000000000000000000000000000000..0182f3599aa30dfcafa4879d07c8d9542c81888d Binary files /dev/null and b/docs/Quick_start/zh/media/image-20210906163913049.png differ diff --git a/docs/sbs/zh/QuecPythonPlatform/FOTA_binary_upgrade.md b/docs/sbs/zh/QuecPythonPlatform/FOTA_binary_upgrade.md new file mode 100644 index 0000000000000000000000000000000000000000..42040d9d853548096f5053023a76177ef35a9c21 --- /dev/null +++ b/docs/sbs/zh/QuecPythonPlatform/FOTA_binary_upgrade.md @@ -0,0 +1,117 @@ +## 文档历史 + +**修订记录** + +| Version | Date | Author | Change expression | +| ------- | ---------- | ------- | ----------------- | +| 1.0 | 2021-09-29 | Chic.YE | Initial version | + + + +## FOTA_binary_upgrade 固件升级 + +本文主要基于EC600S-CNLA介绍如何升级固件,通过本文您将了解到EC600S-CNLA固件差分升级的使用方法。 + + + +## 操作步骤 + +1、 提取升级文件: + +将‘新’‘旧’两个固件包中的system.img文件复制出来,并重命名system_old.img、system_new.img,如下图: + +![image-20210929155209368](media\image-20210929155209368.png) + + + +2、 配置 config 文件如下: + +```python +[Image_List] + +Number_of_Images = 1 + +1_Image_Enable = 1 + +1_Image_Image_ID = 0x30 + +1_Image_Path = system.bin + +1_Image_Flash_Entry_Address = 0x00024000 + +1_Image_ID_Name = 1 +``` + + + +3、 制作.bin文件: + +将system_old.img、system_new.img复制到FOTA工具根目录下,cmd执行一下指令: + +adiff.exe -l fp system_old.img system_new.img FotaFile.bin + +![image-20210929155313692](media\image-20210929155313692.png) + +执行结果: + +![image-20210929155327009](media\image-20210929155327009.png) + +生成供模组下载升级用的FotaFile.bin文件。 + + + +4、 升级文件放到http服务器中 + +本次实验时,下载地址为: + +`'http://120.197.216.227:6000/FotaFile.bin'` + + + +## 软件设计 + +```Python +import fota +import utime + +DEF_URL1 = 'http://120.197.216.227:6000/FotaFile.bin' + +def result(args): + print('download status:', args[0], 'download process:', args[1]) + +def run(): + fota_obj = fota() # 创建Fota对象 + print("进入升级状态......") + res = fota_obj.httpDownload(url1=DEF_URL1, callback=result) + if res != 0: + return + utime.sleep(2) + +run() +``` + + + +## 下载验证 + +#### 软件代码 + +下载.py 文件到模组运行: + +![image-20210929155530265](media\image-20210929155530265.png) + + + +下载之后,手动让脚本跑起来。 + +等待大概5分钟结束后,升级完成后可查询: + +交互界面发送 + +`>>> modem.getDevFwVersion()` + +`'EC600SCNLAR01A01M16_OCPU_PY_BETA0414'` + + + +验证升级成功! \ No newline at end of file diff --git a/docs/sbs/zh/QuecPythonPlatform/media/image-20210929155209368.png b/docs/sbs/zh/QuecPythonPlatform/media/image-20210929155209368.png new file mode 100644 index 0000000000000000000000000000000000000000..13434ed3d06a90ef7405ebd256c901fa8ab8340a Binary files /dev/null and b/docs/sbs/zh/QuecPythonPlatform/media/image-20210929155209368.png differ diff --git a/docs/sbs/zh/QuecPythonPlatform/media/image-20210929155313692.png b/docs/sbs/zh/QuecPythonPlatform/media/image-20210929155313692.png new file mode 100644 index 0000000000000000000000000000000000000000..f893be002f939f85a1d3a7426e50250567333d60 Binary files /dev/null and b/docs/sbs/zh/QuecPythonPlatform/media/image-20210929155313692.png differ diff --git a/docs/sbs/zh/QuecPythonPlatform/media/image-20210929155327009.png b/docs/sbs/zh/QuecPythonPlatform/media/image-20210929155327009.png new file mode 100644 index 0000000000000000000000000000000000000000..3a53693417f9d7a7d9efa0dcf78329e8a184830e Binary files /dev/null and b/docs/sbs/zh/QuecPythonPlatform/media/image-20210929155327009.png differ diff --git a/docs/sbs/zh/QuecPythonPlatform/media/image-20210929155530265.png b/docs/sbs/zh/QuecPythonPlatform/media/image-20210929155530265.png new file mode 100644 index 0000000000000000000000000000000000000000..07df8594bab443643a38ef76e78460d376345dbc Binary files /dev/null and b/docs/sbs/zh/QuecPythonPlatform/media/image-20210929155530265.png differ diff --git a/docs/sbs/zh/QuecPythonWirelessNetwork/cellLocator.md b/docs/sbs/zh/QuecPythonWirelessNetwork/cellLocator.md new file mode 100644 index 0000000000000000000000000000000000000000..208b94ae2a79cf564318a1c1b5932e95b7d47d8e --- /dev/null +++ b/docs/sbs/zh/QuecPythonWirelessNetwork/cellLocator.md @@ -0,0 +1,127 @@ +## 文档历史 + +**修订记录** + +| **版本** | **日期** | **作者** | **变更表述** | +| -------- | ---------- | -------- | ------------ | +| 1.0 | 2021-09-07 | FAE | 初始版本 | +| 1.1 | 2021-09-08 | Chic | 增加图片 | + + + +## QuecPython_cellLocator基站定位 + +本片文章主要简介QuecPytho_cellLocator 基站定位的使用。 + +**模块功能:** + +提供基站定位接口,获取终端坐标信息。 + +**对应API:** + +- cellLocator.getLocation(serverAddr, port, token, timeout, profileID) + +具体的API 详解请参考 [cellLocator - 基站定位](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=celllocator-基站定位) + + + +## 定位概述 + +定位是指通过特定的方法来获取用户终端的位置信息(经纬度坐标)的技术或服务。 + +常见的定位技术有两种:一种是基于GPS的定位,一种是基于移动运营网的基站定位。基于GPS的定位方式是利用GPS定位模块将自己的位置信号发送到定位后台来实现定位的。基站定位则是利用基站与终端之间的距离来确定终端位置的。QuecPython_cellLocator基站定位便是属于基站定位一种。 + +基站定位的大致原理为:移动终端通过运营商的网络(如GSM网)测量不同基站的下行导频信号时间,得到不同基站下行导频的TOA(Time of Arrival,到达时刻)或TDOA(Time Difference of Arrival,到达时间差),根据该测量结果并结合基站的坐标,一般采用三角公式估计算法,获取移动终端用户的位置信息(经纬度坐标),在电子地图平台的支持下,为用户提供相应定位位置。实际的位置估计算法需要考虑多基站(3个或3个以上)定位的情况,因此算法要复杂很多。一般而言,移动台测量的基站数目越多,测量精度越高,定位性能改善越明显。 + + + +## QuecPython_cellLocator 特性 + +QuecPython_cellLocator基站定位不需要终端具有GPS定位能力,无需任何额外硬件支持,但是精度很大程度依赖于基站的分布及覆盖范围的大小。定位精准度大概500m~1500m(因基站密度及数据库数量而异)。此外还可以利用Wi-Fi在小范围内辅助定位,定位精准度约50m。 + +由于是基站定位,需要基站信号覆盖。目前国内4G信号已基本覆盖,2G网络暂时间依旧可以使用,但面临退网风险,3G网络只有电信还没退网,也列入退网计划。在使用该功能前需先对使用地信号覆盖有所了解。 + + + +## 快速开发 + +### 交互实验 + +进行本次实验, 需要先确定SIM卡状态。 具体请参考SIM模块的文档。 + +我们使用交互命令来获取当前的坐标信息。 + +```python +>>> import cellLocator +>>> cellLocator.getLocation("www.queclocator.com", 80, "1111111122222222", 8, 1) +(117.1305, 31.82508, 550) +# 上面使用的密钥仅为测试密钥 +``` + +![image-20210908140227016](media\image-20210908140227016.png) + + + +### 代码实验 + +计算当前位置到北京首都的距离 + +```python +import cellLocator +from math import sin, asin, cos, radians, fabs, sqrt + +EARTH_RADIUS = 6371 # 地球平均半径,6371km + + +def hav(theta): + s = sin(theta / 2) + return s * s + + +def get_distance_hav(lat0, lng0, lat1, lng1): + "用haversine公式计算球面两点间的距离。" + # 经纬度转换成弧度 + lat0 = radians(lat0) + lat1 = radians(lat1) + lng0 = radians(lng0) + lng1 = radians(lng1) + + dlng = fabs(lng0 - lng1) + dlat = fabs(lat0 - lat1) + h = hav(dlat) + cos(lat0) * cos(lat1) * hav(dlng) + distance = 2 * EARTH_RADIUS * asin(sqrt(h)) + + return distance + + +def test_cellLocator(): + # 测试地点 + lon1, lat1 = (22.599578, 113.973129) # 深圳野生动物园(起点) + lon2, lat2 = (39.9087202, 116.3974799) # 北京天安门(1938.4KM) + d2 = get_distance_hav(lon1, lat1, lon2, lat2) + print(d2) + # 获取当前位置 + # (latitude, longtitude, accuracy) + ret = cellLocator.getLocation( + "www.queclocator.com", 80, "1111111122222222", 8, 1) + lon3, lat3 = ret[1], ret[0] + d2 = get_distance_hav(lon3, lat3, lon2, lat2) + print(d2) + + +if __name__ == "__main__": + test_cellLocator() + +``` + + + +## 参考资料 + +[cellLocator - 基站定位](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=celllocator-基站定位) + +## 配套代码 + + + 下载代码 + diff --git a/docs/sbs/zh/QuecPythonWirelessNetwork/media/image-20210908140227016.png b/docs/sbs/zh/QuecPythonWirelessNetwork/media/image-20210908140227016.png new file mode 100644 index 0000000000000000000000000000000000000000..d10092a8256edccfea18e07d3569ff48298d3fb3 Binary files /dev/null and b/docs/sbs/zh/QuecPythonWirelessNetwork/media/image-20210908140227016.png differ