diff --git a/.gitignore b/.gitignore index 30f92d3a3f28b070e85be40f1591e2ab2691a611..1fd142f7e7c13d2155f23235502577c20a3d5d6a 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,5 @@ _navbar.md .vscode test* Quecpython_toc.yml -pages/index/zh/README.html \ No newline at end of file +pages/index/zh/README.html +*.diff diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..359bb5307e8535ab7d59faf27a7377033291821e --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml diff --git a/.idea/Community-document.iml b/.idea/Community-document.iml new file mode 100644 index 0000000000000000000000000000000000000000..8b8c395472a5a6b3598af42086e590417ace9933 --- /dev/null +++ b/.idea/Community-document.iml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000000000000000000000000000000000000..a5c3b12383864bafaa953a912639ea8783b5c07d --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,20 @@ + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000000000000000000000000000000000000..105ce2da2d6447d11dfe32bfb846c3d5b199fc99 --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000000000000000000000000000000000000..d56657add3eb3c246989284ec6e6a8475603cf1d --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000000000000000000000000000000000000..77e6910aa8e0faa743d9a3cab30cd399bcd23c7a --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000000000000000000000000000000000000..94a25f7f4cb416c083d265558da75d457237d671 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/README.md b/README.md index 020c298f9918cccbffd26d14a9f302ff32923b4c..1de8dcf17e5a39e5279848ff26ba14649b69ee3b 100644 --- a/README.md +++ b/README.md @@ -31,3 +31,4 @@ teedoc build teedoc serve ``` then visit [http://127.0.0.1:2333](http://127.0.0.1:2333) + diff --git a/docs/Mass_production/zh/config.json b/config/config_en.json old mode 100755 new mode 100644 similarity index 45% rename from docs/Mass_production/zh/config.json rename to config/config_en.json index 10c2a1cc1964035be8ce534c1a708e32e4094fcc..ed438f2dc0efbab3d7e6d90b0291002d57622c25 --- a/docs/Mass_production/zh/config.json +++ b/config/config_en.json @@ -1,5 +1,5 @@ { - "class": "language_zh", + "class": "language_en", "navbar": { "title": "QuecPython", "logo": { @@ -8,63 +8,83 @@ }, "home_url": "/", "items": [ - { + { + "url": "/doc/Quick_start/en/Quick_start.html", + "label": "The document overview", + "position": "left" + }, + { + "url": "https://python.quectel.com/download", + "label": "Official website to download", + "position": "left" + }, + { "url": "https://python.quectel.com/wiki/#/", - "label": "wiki", + "label": "    wiki    ", "position": "left" }, { - "label": "    文档    ", + "label": "    doc    ", "position": "left", "items": [ { - "url": "/doc/Quecpython_intro/zh/index.html", - "label": "产品介绍" - }, - { - "url": "/doc/Quick_start/zh/index.html", - "label": "快速开始" - }, - { - "url": "/doc/sbs/zh/index.html", - "label": "手把手教程" + "url": "/doc/Quecpython_intro/en/index.html", + "label": "Product introduction" }, { - "url": "/doc/Advanced_development/zh/index.html", - "label": "开发进阶" + "url": "/doc/Quick_start/en/index.html", + "label": "Quick start" }, { - "url": "/doc/little_demo/zh/index.html", - "label": "小实验" + "url": "/doc/sbs/en/index.html", + "label": "Hand in hand tutorial" }, { - "url": "/doc/Product_case/zh/index.html", - "label": "产品案例" + "url": "/doc/Advanced_development/en/index.html", + "label": "The development of advanced" }, { - "url": "/doc/Mass_production/zh/index.html", - "label": "产品量产" + "url": "/doc/Product_case/en/index.html", + "label": "Product case" }, { - "url": "/doc/FAQ/zh/index.html", - "label": "常见问题" + "url": "/doc/FAQ/en/index.html", + "label": "Q&A" } ] }, { - "label": "GitHub", + "label": "Git", "position": "right", - "url": "https://github.com/quecpython/Community-document" + "url": "https://gitee.com/quecpython/Community-document" + }, + { + "id": "language", + "label": "language: ", + "position": "right", + "type": "selection", + "items": [ + { + "id": "zh", + "url": "/", + "label": "中文" + }, + { + "id": "en", + "url": "/en/", + "label": "English" + } + ] } ] }, "footer": { "top": [ { - "label": "链接", + "label": "link", "items": [ { - "label": "使用 teedoc 构建", + "label": "Build with teedoc", "url": "https://github.com/neutree/teedoc", "target": "_blank" }, @@ -76,7 +96,7 @@ ] }, { - "label": "源码", + "label": "The source code", "items": [ { "label": "github", @@ -84,8 +104,8 @@ "target": "_blank" }, { - "label": "本网站源文件", - "url": "https://github.com/quecpython/Community-document", + "label": "Source files for this website", + "url": "https://gitee.com/quecpython/Community-document", "target": "_blank" } ] diff --git a/docs/Development_env_tools/zh/config.json b/config/config_zh.json similarity index 66% rename from docs/Development_env_tools/zh/config.json rename to config/config_zh.json index 10c2a1cc1964035be8ce534c1a708e32e4094fcc..f8eb6b651cd7b0209a80a4979353f051401843a7 100644 --- a/docs/Development_env_tools/zh/config.json +++ b/config/config_zh.json @@ -8,9 +8,19 @@ }, "home_url": "/", "items": [ - { + { + "url": "/doc/Quick_start/zh/Quick_start.html", + "label": "文档简介", + "position": "left" + }, + { + "url": "https://python.quectel.com/download", + "label": "官网下载", + "position": "left" + }, + { "url": "https://python.quectel.com/wiki/#/", - "label": "wiki", + "label": "    wiki    ", "position": "left" }, { @@ -27,24 +37,16 @@ }, { "url": "/doc/sbs/zh/index.html", - "label": "手把手教程" + "label": "基础教程" }, { "url": "/doc/Advanced_development/zh/index.html", - "label": "开发进阶" - }, - { - "url": "/doc/little_demo/zh/index.html", - "label": "小实验" + "label": "进阶开发" }, { "url": "/doc/Product_case/zh/index.html", "label": "产品案例" }, - { - "url": "/doc/Mass_production/zh/index.html", - "label": "产品量产" - }, { "url": "/doc/FAQ/zh/index.html", "label": "常见问题" @@ -52,9 +54,27 @@ ] }, { - "label": "GitHub", + "label": "Git", "position": "right", - "url": "https://github.com/quecpython/Community-document" + "url": "https://gitee.com/quecpython/Community-document" + }, + { + "id": "language", + "label": "Language: ", + "position": "right", + "type": "selection", + "items": [ + { + "id": "zh", + "url": "/", + "label": "中文" + }, + { + "id": "en", + "url": "/en/", + "label": "English" + } + ] } ] }, @@ -85,11 +105,19 @@ }, { "label": "本网站源文件", - "url": "https://github.com/quecpython/Community-document", + "url": "https://gitee.com/quecpython/Community-document", "target": "_blank" } ] } ] - } + }, + "plugins": { + "teedoc-plugin-search": { + "from": "pypi", + "config": { + "search_hint": "Search" + } + } + } } \ No newline at end of file diff --git "a/diff_\350\234\202\351\270\243\345\231\250.diff" "b/diff_\350\234\202\351\270\243\345\231\250.diff" deleted file mode 100755 index 115cc6e8da3b4ba424626b001f250bc1815aa881..0000000000000000000000000000000000000000 --- "a/diff_\350\234\202\351\270\243\345\231\250.diff" +++ /dev/null @@ -1,1184 +0,0 @@ -diff --git a/docs/little_demo/zh/QuecPythonTest/buzzer.md b/docs/little_demo/zh/QuecPythonTest/buzzer.md -index 089738f..e8afa28 100644 ---- a/docs/little_demo/zh/QuecPythonTest/buzzer.md -+++ b/docs/little_demo/zh/QuecPythonTest/buzzer.md -@@ -27,47 +27,31 @@ - - | **蜂鸣器** | **EC600开发板** | **对应的函数标号** | - | ---------- | ----------------- | ------------------ | --| IO (PWM) | GPIO81 (引脚号16) | PWM2 | -+| IO (PWM) | GPIO2 (引脚号70) | PWM2 | - | VCC | 5_5V电源 | 无 | - | GND | 地 | 无 | - --#### 实验代码 -- --``` --''' -- --File: pwm_buzzer.py -- --Project: pwm -+#### 查询开发板对应的IO口 - --File Created: Wednesday, 30th December 2020 5:02:46 pm -+在wiki_API说明_类库_PWM中可以确定70号引脚对应的函数标号为PWM2,原理图找到对应的GPIO口为GPIO2,通过搜索查询GPIO2可确定IO口为开发板上J5的倒数第二口。(也可直接通过肉眼找到开发板中G2字眼) - --Author: chengzhu.zhou -+EC600S_EVB_v1.1开发板原理图下载链接: - ------- -+![](media\QuecPython_little_demo_buzzer01.png) - --Last Modified: Wednesday, 30th December 2020 5:02:48 pm - --Modified By: chengzhu.zhou -- ------- -- --Copyright 2020 - 2020 quectel -+#### 实验代码 - --''' -+```python - - from misc import PWM -- - import utime as time -- - import urandom as random -- - import log - --# API https://python.quectel.com/wiki/#/zh-cn/api/?id=pwm -- -+# API https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=pwm - # 蜂鸣器模块 https://detail.tmall.com/item.htm?id=41251333522 --无源蜂鸣器-频率可控版 -+# 无源蜂鸣器-频率可控版 - - """ - -@@ -85,86 +69,69 @@ PWM3 – 引脚号69 - - """ - --""" -- --| 蜂鸣器 | EC600开发板 | 对应的函数标号 | -- --| ---------- | ------------------ | ------- | -- --| IO (PWM) | GPIO81 (引脚号16) | PWM2 | -- --| VCC | 3_3V电源 | 无 | -- --| GND | 地 | 无 | -- --""" -+# 获取logger对象 - - buzzer_log = log.getLogger("buzzer_test") - -- -- - # Duration 为 ms - - def outputpwm(HZ, duty_cycle, Duration): - --# 将HZ 转化为 10us 级别 -- --cycleTime = int((10000000/HZ)/10) -- -- highTime = int(cycleTime * duty_cycle) -- -- buzzer_log.debug( -+ # 将HZ 转化为 10us 级别 - -- """out put pin70 cycleTime {0} * 10us, -+ cycleTime = int((10000000/HZ)/10) -+ highTime = int(cycleTime * duty_cycle) - -- highTime {1} * 10us, Duration of {2}""" -- -- .format(cycleTime, highTime, Duration)) -- -- pwm1 = PWM(PWM.PWM2, PWM.ABOVE_10US, highTime, cycleTime) -- -- pwm1.open() -- -- time.sleep_ms(Duration) -- -- pwm1.close() -- -- pass -+ # 输出debug级别的日志 -+ -+ buzzer_log.debug( -+ """out put pin70 cycleTime {0} * 10us, -+ highTime {1} * 10us, Duration of {2}""" -+ .format(cycleTime, highTime, Duration)) -+ pwm1 = PWM(PWM.PWM2, PWM.ABOVE_10US, highTime, cycleTime) -+ pwm1.open() - -+ # 休眠给定毫秒数的时间 -+ -+ time.sleep_ms(Duration) -+ pwm1.close() -+ pass - - - def test_Buzzer(): - -- log.basicConfig(level=log.DEBUG) -- -- for i in range(10): -- -- # 建议输出2000~5000HZ 的PWM波形 -+ #设置日志输出级别 - -- # 范围可以自己选择, 0~1 -+ log.basicConfig(level=log.DEBUG) - -- duty_cycle = random.uniform(0.1, 0.8) -+ # 循环遍历10次 - -- HZ = random.randint(2000, 5000) -+ for i in range(10): - -- outputpwm(HZ, duty_cycle, 500) -+ # 随机生成 start 到 end 范围内的浮点数,范围可以自己选择, 0~1 - -- time.sleep_ms(1500) -+ duty_cycle = random.uniform(0.1, 0.8) - -- pass -+ # 建议输出2000~5000HZ 的PWM波形 -+ # 随机生成一个 start 到 end 之间的整数 - -+ HZ = random.randint(2000, 5000) -+ outputpwm(HZ, duty_cycle, 500) -+ time.sleep_ms(1500) -+ -+ pass - - - if __name__ == "__main__": - -- # creat a thread Check key status -+ # creat a thread Check key status - -- test_Buzzer() -+ test_Buzzer() - --将代码下载运行,可以听到蜂鸣器产生随机的声音。 -+# 将代码下载运行,可以听到蜂鸣器产生随机的声音 - ``` - - ### 配套代码 - -- -- 下载代码 -\ No newline at end of file -+* [下载代码](code/pwm_buzzer.py) -+ -\ No newline at end of file -diff --git a/docs/little_demo/zh/QuecPythonTest/code/pwm_buzzer.py b/docs/little_demo/zh/QuecPythonTest/code/pwm_buzzer.py -index 0c9c61d..2b4f549 100644 ---- a/docs/little_demo/zh/QuecPythonTest/code/pwm_buzzer.py -+++ b/docs/little_demo/zh/QuecPythonTest/code/pwm_buzzer.py -@@ -1,67 +1,83 @@ --''' --File: pwm_buzzer.py --Project: pwm --File Created: Wednesday, 30th December 2020 5:02:46 pm --Author: chengzhu.zhou ------- --Last Modified: Wednesday, 30th December 2020 5:02:48 pm --Modified By: chengzhu.zhou ------- --Copyright 2020 - 2020 quectel --''' - from misc import PWM - import utime as time - import urandom as random - import log --# API https://python.quectel.com/wiki/#/zh-cn/api/?id=pwm --# 蜂鸣器模块 https://detail.tmall.com/item.htm?id=41251333522 无源蜂鸣器-频率可控版 -+ -+# API https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=pwm -+# 蜂鸣器模块 https://detail.tmall.com/item.htm?id=41251333522 -+# 无源蜂鸣器-频率可控版 -+ - """ -+ - pwm0 = PWM(PWM.PWMn,PWM.ABOVE_xx,highTime,cycleTime) -+ - 注:EC600SCN平台,支持PWM0-PWM3,对应引脚如下: -+ - PWM0 – 引脚号52 -+ - PWM1 – 引脚号53 -+ - PWM2 – 引脚号70 -+ - PWM3 – 引脚号69 --""" - - """ --| 蜂鸣器 | EC600开发板 | 对应的函数标号 | --| ---------- | ------------------ | ------- | --| IO (PWM) | GPIO81 (引脚号16) | PWM2 | --| VCC | 3_3V电源 | 无 | --| GND | 地 | 无 | --""" --buzzer_log = log.getLogger("buzzer_test") - -+# 获取logger对象 -+ -+buzzer_log = log.getLogger("buzzer_test") - - # Duration 为 ms -+ - def outputpwm(HZ, duty_cycle, Duration): -+ - # 将HZ 转化为 10us 级别 -+ - cycleTime = int((10000000/HZ)/10) - highTime = int(cycleTime * duty_cycle) -+ -+ # 输出debug级别的日志 -+ - buzzer_log.debug( -- """out put pin70 cycleTime {0} * 10us, -- highTime {1} * 10us, Duration of {2}""" -- .format(cycleTime, highTime, Duration)) -- pwm1 = PWM(PWM.PWM2, PWM.ABOVE_10US, highTime, cycleTime) -+ """out put pin70 cycleTime {0} * 10us, -+ highTime {1} * 10us, Duration of {2}""" -+ .format(cycleTime, highTime, Duration)) -+ pwm1 = PWM(PWM.PWM2, PWM.ABOVE_10US, highTime, cycleTime) - pwm1.open() -+ -+ # 休眠给定毫秒数的时间 -+ - time.sleep_ms(Duration) - pwm1.close() - pass - - - def test_Buzzer(): -- log.basicConfig(level=log.DEBUG) -- for i in range(10): -- # 建议输出2000~5000HZ 的PWM波形 -- # 范围可以自己选择, 0~1 -- duty_cycle = random.uniform(0.1, 0.8) -- HZ = random.randint(2000, 5000) -- outputpwm(HZ, duty_cycle, 500) -- time.sleep_ms(1500) -- pass -+ -+ #设置日志输出级别 -+ -+ log.basicConfig(level=log.DEBUG) -+ -+ # 循环遍历10次 -+ -+ for i in range(10): -+ -+ # 随机生成 start 到 end 范围内的浮点数,范围可以自己选择, 0~1 -+ -+ duty_cycle = random.uniform(0.1, 0.8) -+ -+ # 建议输出2000~5000HZ 的PWM波形 -+ # 随机生成一个 start 到 end 之间的整数 -+ -+ HZ = random.randint(2000, 5000) -+ outputpwm(HZ, duty_cycle, 500) -+ time.sleep_ms(1500) -+ -+ pass - - - if __name__ == "__main__": -- # creat a thread Check key status -- test_Buzzer() -+ -+ # creat a thread Check key status -+ -+ test_Buzzer() -\ No newline at end of file -diff --git a/docs/little_demo/zh/QuecPythonTest/media/QuecPython_little_demo_buzzer01.png b/docs/little_demo/zh/QuecPythonTest/media/QuecPython_little_demo_buzzer01.png -new file mode 100644 -index 0000000000000000000000000000000000000000..e4546daabdc18b88a1e3b2243f68044b7a680661 -GIT binary patch -literal 47255 -zcmZ5{dpy(MAHNbpQVCH}xg|-_$aPc*ja)W!x7^LG+;W@TySe0=dpEajY+;04qH@cn -z*p};5SS;o?iy6PSKHu;6_xb()*kfkzo%1^9yv}*Op3m3wJiKLUD8MJq$HBoNV07cU -z1qTNwhJ$0T_I_^QKjY{{f8cFTpoQU8j;j6>bHImv9(oWx4vsge{96bv;4^Q)4Vyp? -z4iTB%*B&Da=_L-1x95$n>sj4%Twq6M9%U9%SOb!*0d3}VL6c5*GV3?{)5z(OjPw1U -zTnn2OqFVQ;@}JH2?=qk{IM`@norM+2Ul>Zcm(nYbMPR289EdqjQU8cEpUMw6q@<6F -zJ=_mT`(S+AHBI1%1gEmWfhW@OpE%<<1U|R47KgHbRaI>Vg$9R0LxY(${b4s$h(st6 -zjQ;a(b`?WoGby5g#T*=8S6L+HE-6>@q>5;1Z -z<^>;?wv-`@+M8EJb9MDO*NU2b@Y_MhniPb~dX*D2G3MT6)|JN<+Vg%na5j{F#i2ND -z;g$d6n~Ry1VsvV*%iREmMfbs0L|x#3FJvI?rpO63=M}M$7F4SJySt|S2XL8$e%f2< -z8o5N*iz;SyiyFC?1J0wJ*6%rb4Pa)QgH}7Jr`@?@Bg3iZ;hjpfZsgUrnl; -zn@mXOC(oC;uh1rt4ZTfsR%ejXT>pNVlOT(LQAB -z+0^EM`mK>h>hznz2#cd2LzP(7_t9$O3_S~ALzdG|=vxo3_=XrjFuy2OPmRw!pYU42Ub#eOWZ^bJSt@+HEAK%i{$pWVDRqJsd;ycjv*qiyQ -zzd+PCxWv^{*t$AzaBC=v0fxYv^{c|Zzt+-jHrt+FM>H_Ec(MnfqumOUaOTNmQ5YK! -zUxJ^)=237@si%w<=Vw3F5HZ%^j+2x5jTJ*F!&{CkvAj==W3ek=r|6rB}= -zb#`|0AA)@;DqZirF<@`m)nr~L*n0G=YhyxJOA+>o8Ki+A4JBeHPb)1nTC2|RrIwy* -zYBWPt*WmDJwzZPD!8xBm+fOxWMowh=?sdWLFZRz67e=Fk<87Fw-@5o70`%U;W -zqht@UVn)D9fu9*oiV2I--`delRlNnB%7GF>paLEQfdJjvD9lK5Vi#@ogNmP0Y?$~+ -z+5~@g8?=a2C9?hgwYcc?j~7^1mGHjGtmappoYAgd@!?snHLRJJL&h(A@`!eIU3!5| -z0mUvP^_YMgs8KM5AJe$A_=D}KNd57o3G&NP?QTOIeshDqEqw^4FmCpa+&DY0pUy@r -zeoz}(c6v}ybk-3^TYIy#se0r9M(AhfO!BKFUJQpt0-kTWAltG@wU@+|tD9jDt_^Ou -zxyQe=*YUf`ZTJL|kAufrG5!5_DPdzW5n4GjE-y7&fa}G%B_D$kKi^TW -z-u~1+8)~{|{T$AKEbxVkaOuH}oV+&Kd8P3eul1zJ< -z2wiH+?Z{uPGv5FdB)I7qY*CGSITQ{&8ksE36B0OuxErZTO -zXBnMUL2$(#c-Za$8B~w<@yea`<13YOg70)N#ZSRuj3+Wd(2)MRopTLrbvBBY(06|o -zy&q#L$tQ5-j7v);nKpIW3@Su)ejc#B_5u=%Ifz-*RmyLV -z8J7RhpW`!7nGmPDQ7{`p78SiKWGo&n%=m<>a@n -zZRB;#KTcdYHsf{5;hbHPVAn_cjHxRf=pCM_20x?#Rp)0Cw8r7#p6v0e1G74Z8p%;e -z2VVrEbwb-V(yVsU>>bB~z|!>A_X`3DLiTfwmTRthpS1j|x;B&aRl#1Q*3(~y78ZNS -zHQhd%r*G@zY&E`UkCI=_HLlmuF?;=M(jDdGMxq7wdC;)ODJ~?%m36QFj>wcB%%5t^ -z8#W8tq#8ZxrV*c=kdJ`@9rK9XmhZ(q*U9wW<4P^2aIUm-@z6H;vwrDM9RwR8_X#6K -zmd}P_3*~k5qNkx3@fwIBJE!q@>jti_t)CfpKkd7<&;ebt2jlxst&n{x*Sde^+3Cgv+X(}wp={k~>tee&yDRPG)^CG~>TlHf -zjSQvfxWAwJ#Z7X?+ekOhY8{!Y(a@3Z{Y=FVY;?R=&%O8p^+Nt;>P^$Gmfud@4|a-j -zWAD)k`7;5WlaEPd#S@j)SdSK0*g|H__GU$nYXIAn9yt7^h@NH!^Bi?pURAhjdoUll -zu(Rc{bF;Ckp=8#*t>q0mpEF-~v^XoS|H0%WXnLPD?qO9;|MAy-BRcnR7k$Xp+|ZM} -z-=gj9qQ|R0?Q0q08eq`PYh;IiuhT_MotSbH0ph^=ZCu;2@axu*6D%xFS4>42ZU4?g -z+Pm$gS%M|g^FOP;|2Z>23;|!-I{c6k`E~HX+fs3;K&o}_lE>ax4Q3A-%%(evxk+XZ -zetCF1Vua52F&!!Xmv$22ap(a-?5uXiR76O-mYfTTr5D_DB2=%Q_qFUrTFCYt5v&S0 -z|L5;{21>QKMhI=4w?k_+nHf0kR1)9ovbUzN@_Ei?vCsf+Lv-IB~W@`93<}5H^FQxX6 -zt&@*<`)$$^py2Z&S|a-~o2*~9Lb?K$_(w-!Inn*`#FE*t4f7(m$GpXApBe4w4ef|R -zUYxr_d04$`Eo?nr6b89}VKYt|A*_p(!tM=T&ZB!J>&5u_U$7br{E?j)ctdFw1}9TJ -z;h^I)`K5{ZRcO!md{rZFuv;bE5dxKuarLeKhmmLn6w2+yXGpI_u}AWiO&m-F8zpd# -zJn=jPXG(_Fdi#QCD*0-pp -zM?$99LHgzu?Zz+8Yjt9W4mFNy8Rjo(AfQZ&!#l~qsBR!4^<}Dur1IA19`C!s2YTZwx^_GI_4)fh8737-4!j6oPnOG~c(7!F(Gk9f;Nu!;9! -zA|jW$bfj3D{w2Ht(xR^6L2=mq+^h<1WxR96f$7bkVw*fM;72e^2Y)y*prY@d?|Y2M -zXb>r+0QQP)>Wjmr&+`-*=jL%@xGjWalRzAskl3F<=%Bvon;oCcqdvoXEoyGyy(JVt -zZ5FBOsTF~<>I!{ycktxdfv-a-1OqvcbI)`!hB_1G-+E@CmmE9BQQkw}*{1jY`1rVR -zXH25LB7{{Am^^CRfOjcul+{|ntHBRJ?kn`R7H=N~F9uy-WaZ&1`x#yW+LTXP#KsnJ -z0_jZl%P53zr8T0nY8r4j1o+wJ52DUfrxJCU$OUdM6f%hW~|E>d5I -zH8Nnp_grlvD5IuXXJGxF_U_Q~vcLGyzKH+W-14q8I$x5-iL9jS`>ytvS`|QI?cgo$ -zj3+mrNam=eNSM~SgN{kFWsVw~$cw=OS+7-vA7n`CDsaJ~HQB8T%i)J%dul=L-pI$a -z)h6c;BPZa5+s>6`*&D7HwLJ%saAyHh3-`qNMf>tP>W4nm!D#>f?<-1W;zF>>zF>CA -z^})}?ywPm6nHaNtU!Og1ox@u0wQ`)PI10}=h~C|rz*+aXPNMsZb2$VO#W-Mmlu9i_ -z^oq34zlb3~xgF4DJANjDSgRCCc=5LR_i!+NJ*qh%D&Om7pLa_tdhEQ~xCe;h`qo~O -z;){tFNQ(mzYu2RC7rb -zRh+BJl>Ilt$+#uH52sJSj|*D~14pEt6!w!DCpv}CPQC#4^1Bhz(YJHyBYVTEd^o^M -zvpD>h&XCrhG?ZiAYRXGrB=jj9F2Fr7n$!N=Mgu$Bfs?!&2*Mp^b?hzwELiTey^?cW -zJ;R1D^Qpq9N*UfjkQGi~G})vh)76^}K-2puwZHE16~QAopmyED!r -zYHS8m>;NWa)IRpyp(Z8N^5cd!aktE=D~JABOLjV61tR>w0$p4y#G=?~d}w6fNr?Gd -zj9U4;$L%qt(Q7~3y@gFqxsG~!`m${w*SYkFp9(?sp(Ww3Op%sKz)@6Z0Iw`m&4s*7 -z^-#CftcY@E2i{m&#i(^y&UVq(91LEjIV0Nt -zy0Z*+uO~8|IO^Hwas=Y`>MOnsp*}aD)O}In;AHYkx}A2M{Ki+SYfoHjQE-9Ftl;dP -z&ONsZ18xc6%rx)-(5fZ4Cqe}Tde-52M3rM^1($yZv*V`0t*?=(!Am6u3^(G>Va=ti -zmmB^bp7!v{+YgVy;-cWe4i|pU=5bKtd;-86FBOEXI#T7t;6T(JwXJDKCt3-}S1MON -z{JJ`vcAHIWHJ(aCC>nX)bZzwTszn#nPWJc4hvAw& -zhxN}z%Zn}oJWKDVqK5v>n`W?2r5EChtaHQA!BOd3&*w$A?M~ypukaQH+Iqr?JIF&d -zg`sZ(l@Tqg{CzwWBH@M~CHSU$<(TkeMZ6=*MAhF$F*>9Vv_hrTbw`=e)BIZ_uBuix -zb=xpSt(_E|wvs7nI7(3J39;h+_MHX;x4KzvzyFw2*Y6n21=cx8+to08vT-`6qdodr -zbD>U8HCuw>Ms^feHabIk>qCBLb^1_eBbe$N@6>a^Ok?_Lw4!cd)Tb%2| -z5@PT{MU!ftGdzOD^44}_IhhkyQC$F5B04UJxtUCFsPi+SSdD&6AHj+|qCApCZ3YS)Vz(TOm>0m*EC-w_!>2OX*Wn&KQgi71D<0mrmX -zM|RP8^Xg%+@8Z!!1Hw;REZ-eYzs(vhqT_}JSu;m -z)RuVhX$hbJhYFF83dT?X0eQaVoa7_O>6NF%n7qSOEyk7n=^N(9%rcA-3|X5O3DYk- -zdyrP}%Ax1_+<*v*zdNk+s#( -zX)jvH=@>j3M-E$Xqsuueq*aAgzvqs#Gl98_||KoXJ -z3!-@#x8M%%DzMGPv)KZe?bRNTkZP%8M%>8Q&F@M=Z?cI;MVuyGulnIP3RQ=i`jL%g -zryI;9c*)XzCvv1{{+TTw^JlEQSVt`SNr)h{`-&CMYHC;4AE?ce)Vl<~i77PJni1_(+yI@w0&gr=R -zO=AQx!m*^ZnHnvhU%Y+1VJ7eROJa36f?+7RkHwkORQyYFL?Uy6ruK|A{cinN4H~fq -zkU1-BseEMQEr&Puuj#Y|+Smag9T+_fi@8`P`AchLdM)(;i1Q#CBNp&telyxj0JDBv -zGsBLm)f!Rqn?0kTe0Skw0_1*Fc*}&N6M4y{;?^0g_aAsP?#VFxaYhil60`==#FzRG -zQ!I=VpwMk?EjhU)Yh(9icXfNi=U<;bprNB$A}v&X|2)A)Za&jG>CIhWEsrhANh;b- -z+!_&}D1JHcc5tYyI74ZCNnnHYaFx^*xMABw?b)I57q116)uKf-(I;&}3^*FA98Thl6?$KYj4eQO^tG-rl_E*+~U{oh_5hEy`b%I)n<`(y2~}AuHO?Z!YuiQ+(0KiNKU$y^^ -ziaiIo_>#mt)k|mX=72_+tQub^J7@=IfKDb&ZNx{?h==QW@v7ayv9xYop(!Pw -zF&p1AxfKE9H*>JGOh)t0$hMj6NUYX~o(bGz#YvO9UQ6g5-cwV^TYw44V>sSBFKPw( -zmBS_bJ1;u$!_KwwVboJ1MM&Lc{plBW%fi<8n=mC13p2bks#z)tBl6bJKWhc{$AHg2 -zi?*B|wVR<+wzBLeH)L|RccLt1QQLuGKcf%q77X}yp#w$}>pt#vtADZaTK2Qp`Pwj3 -zdp#n#ybay?!0{S9H&NoG9*i^K{hOP5_m;A;Pfm`W-$Bhi|J||`!$f((*-s)p<9Kay -z7*tfl1~o&UCGhA74Ek#F+CpdEx?V-k7p4*NkuR=NYIuB&%#Xo@KBI^Jd7}#_QVhwD -zo<%%*77N|LYsjQG_wVa=JZwi!HWI+d{#jJk18u>LvhnjLsNqVU5wsu*CNwXW!t#T& -zmz=sj=m^1zS!0bI^X<_pX4{?q?C9xnLmlarr#pQNvq1^e#Dr~RJX%~B4*K2jUDMAo(781mM3vpx;up$Z=#`%&@2ujsv$pD; -zSX9D9{-~ZqlojNeRwn5Cm+@QSHxB`E_}sEbeFsiVi6HVg7#WdrkEII*S9ox*p^gEuA+jB?&fq%_OggOz@tBCFK4 -zXsNcXJi7M#F*gWRRUprZ_s@?hF*T2##%_Wz4W*si`>RJiLJEDxBlFK60B9oJ%sc+Lc*U5u>K1Z+UFgj!CXsU_R(Tz&V5p_0f*#%*V -z%jF2mAF-Cb)r&?DG@}oc4WPMu{|3eG&Me++7ui4FL$?Lef+=+;=D7Y69QrA3J|rRPTRKtBJi~DOwvgBz(1&*V -zX$w#sALe+%3whHw4aEcsW8B-+v)a+B1Bycj-rnbJot2QDwLRyTc*5!oc5}eVuYV?O -zB*}6W^J-5--+eGM9$-o;Faz^}J6md41or~Hkg}CTqVGGzvkQb_4sdP7q@)P97ehz? -z2&nt;r91RoQI#|>_2r$+_ee# -z8I$QdLf+xs=ycjCmf_iJL5PPEyV}re+NMK6y5SeXP3r;|JV87#f!7*sU-qolH1J%3 -z#L@&Xi9+EjvRZ!2-Yx`LhS5_7_)yr8R$bdZ8;|D~aYg}s2x7oyTfZ7L5ED8n4vUt_ -zXz}l8o&Dlyf+pWK4Tb3Q{s)Lr4 -zRoz)fyw=8hFXSy8Gxz-UFkE7Tx#~VL`y_3_)Nr~5=jY2<`l(efOoW`$25F8^Hl^ra&>o)}P> -zzrp^UY5C06tEOZsa9!vB=>l{Hi>~E{og|R!D8_k*SA6J*W&{-Uld#Y0!SIy0hYDgM -zhkH1sD6!O0fFJvQl>9tj-?;CKLpu3$y{D7=4(Q3s34gc%&#|}?ZBgnfW9Q0uc5%YT -z>Tip}#522eiETs=<5-IqT -z4|5I@BP{>&{o2~~<#30x)C6)pz(AWo_=`a%A3lcQ%0+hL7BUD9_2R{jULUS2zFR9Y -zP=_;ErE~z5vorX;Ve!!HJP{pa_JhX@j^>KHTZQxlkN$cHP8ccom7IC)l_n8Y=wRJ> -z93~tioP0NIjW>6Q@M%10MOja~=NuCv|3>E6P2p_`E&a -zB{b+R{SszbyZR=R!oH5`_bfE__DNlvM=4XDCM&hd)a0OKIVZLoA}zDEH-*C123ioP -zmX1Gp2U`EA0OOeX|K>mei+1NBd9yI{>vinQmSmjK&^7QaQGs;Sg943naoR{X)1866 -z6tDo6(w{`ky)#l58HYV4kz?b*YAOjOH*K)9j%cN9>jd897G-L(8X|9}Vt=8&70QkB -zV*Rdcvjk;b*P19f(ai4=u6-HctXIR>>gzUtur_Bd)J5nM{*uuu9cXWNXQFI#9W^`s -zQ-#^uDsnbr|FGhrGaj9SU7w0jHtE_T&uY|M^CJTA&EzNuOzw)6#JolhGrCTq~M%iakDh0Tl5 -zRIU9r=6$CW4b{4d4%R032u)ft^+y+^HtV>k9Tsn|Z((iVKFmkne@S4=S$viMYxe}j -zu|VT5Q6uYLe732E&icJ8`M)$E_lwiMJG5rb#rn2`Fn-Cus(+i;Ohi=UcE-LEYYb)i -zid+u!VN8XlKMr&u%6OMEYl_`E%HH7{VcC_9PT6Z(Qn+Gu@-rQbDgLtF(mcc>QxtMV -zasNwGc=N~WU2Q+W;Adw{;-TO}q6v0N`;y4uU=vTt$&h`dBPJySc?low{;~2YAM!Jp -zua2SHyoPbJqj>i1x2sz)`LY4`WqH<3?OJPc7r-H6VarL?7Xw>;G!GZqfsVp(1vw8L -zQhTlnyyf4v%~t&5UM^d=&ko*~FdpjWN=$r-Z^R>CMSA@ze^+=99*n&3xZS1VqX;bc -z4v8nWL=hYQqRw^j$AfnnZ>7y_OHO`{UKpa>~JGW_i -zD75)JI83Dhzd5WZ<85W42%Jb~J0HChKoDCpH?TIgf$AZ@;nKwac+?H9cJDGxz(LeB -zqZf*Xb}UX^euvp1a<9&!|bJA4wKR;=KD9)*VK;C9%AuE%x|D(A+#R@C86gn -z&R`q+A~m~b?_a`-&C4$$0?BkND;CU$rayCfhzuRT8Q -zZUUZMHmMlMD{;$tEUMJg%$!6DR2WMR`Jx^EanvtIROMFH -z$9H%;^xbdP%PKdoe3uCv4YpCa&z_~Vw6xgYA{GZbRQ|`|^J4LjZWoHepy@Hhy2;Wk -zfQCW|0)h!l^{)h8=JH$=poYs7#5`(y6heN6pHFC0<`n-Z3VW6O!%pj7`tiF80*xPj -zD9V75*&*=D1)B&$(R1{FniiKmc7qplmXwQt$_T?>c{A{6K1#=C-X5OA@TdFOj%u+B -z-}I7sG49KGjO?DY^sH4><*2;JG3obB|4!$FTJqQfwn7!vp^8XFMk%nGlE -z5nSK8$vd8lB%MFM{hvX5x&K2_<2*7>h=Hlt{F4+#O}|S!H-7z!`FSlJv?nCs&y6a4 -zWekC`?}5VPKxi;7xW4%xF{XjQTXw|s%lat!cxa~30hNt5@dHT&h|?=4#gn?_R#VTk -zFG(vX2fB@HPAGrh`tosKRgPM>Qx!QdfHTP2y~IcJyQ9*g`oyoo#}TN8)k2L^V=zVK -z&fx%dU42y0#_o*7LxnaC$=&VtZ^_`j2Xd!I75V$v@5R0hk2_`OvJCyalXq*$-f&sI -zb;}!I@Ytrsns(&(L8eS#ALzv#va}#=^M$e{IrEycZ_Dz}vgv3owhMKquG7wlK%v=Q -zS2vLAKsWtiU+uX1zP2Aff5CBR@^0ssk0XZnG$q;Al_sx&aFT$3gm(B_G;k`lJ~(fW -ztn9mSt1l;BjZ_3V={%vnnQr -z@SExzK?4@KLm63b^|zA|@_qZUZ=P^#1?qB(dR)b^Vhcdbf+r2& -zE329!@kDv`t+u$0Dce{Ss*W)u&5$?(&o86XI?^|m)IKv2$&uf-b|RQyR8xrfW5{hYXdtE~)Y=d|fuUl4%G)E*U40Wn|_Z>j&YTaCk*)7V2W -zP`n#1qsm#}c9!@_xJ#}FG|tm{IiiA@B!jAaTLXDcI@2EUy13XkN@gEv{ROB3bxRh%}PWfmK#j&LM@PA)8;XSvu#=0$0mqz?v#(;c?DSsW;jm>Os*bYsU*L4S#rxb^xLORek^fmuNCCZ%5IiyJ<@oV3G -z(5>vv=5ZI@g2ru|J8=z7MwW`6thr#Z@KvsL!Q^A`Y) -zuB;IYxFy9&YZ!ckfd#8fd9IP1?IfWVbi|^d#Elam4B_G3C)d4U;H&q&SRXecqbFF{ -zz8xUq8=wCtc`S7IPW5q0d)iVIyfSpD-VAN0;?0ZMd?sHY=-xPe0SR}zFZ0@otQ7%= -zD)l?2J2h83iiGrKxv|Z95M^d)>%UKT=4Ny#$YdPR58=H+tux|V=q;sW^INTUPh!OsW>qfD0%$6?Kb -zM?QQlGWioo8Yuc7hzWT8?_xKZaG+VdxHN1H7DO|Z=NO7VDb*|-a8=lSz) -zd{PB6?XE*KTmy?1^`PVk;k43=8x0iSLbyYdd-xk<-^VS)|&tt$|T6oLrWZn)yp-<2zaok&e#y%2> -zWQrgh_USzMNCn%%$lvKYa$D;?3hQa^w!O4uCmC{;li%dt|Bc&U_T%~ucH^Y@&}G$2 -zk1VFDL}CcR1QR&q@f9E{ZS@<@&?}4X6@Qya0-AXXG=t^E(xa!Z#pqtUIh1W5n0mRy22#Z9DprLV%|(ajA?oyi;!sz?vT=CvUFkus6!whpe$0b>$s@Y} -zo-~NyN4LQEuyXl;7UM7sT0lRo2U3qG-UBepZs}sT<$}xmH{ZXQ#G}yyk~6Vr9CR;o -zoN7~PkN_3#jJRfu`56LFldWo6|#S=b=-dvb6ET&45|p2K)BTSr^6llpZeEx#f=!L -zexNXwkZ$`=|0;WJRNB$#S#6(BtgjXOG0OnP-&M`tuPfQ}k~V*@1I?F|5f11H7AtO} -zdF_avK^KuQIMjUdTCBIrzpbdGk)^*3iWuI4oLjoiYe(>O)kV6)p)->m1}%aC|9%qE -zTW6G5R|{0i(s9j)^(sdY&=KINX4KI$*iQgWva3Y~q(hP+>3qHnPpc`Td4k%Ht)W9O -z=#sY2Fg5WuFsU+PuxL6HWhQdL{%rJSS@gLbM(eh9tr*)L*EoNU8dw*#J+n07>CcE% -z^Z5&FFaDMm9`*k6t1V*~X|@^sS_XSAs*uM6?D>nDcy+fyVHhE8bZAH_E-r4RKAKhU -zX}P&EPql}f{oeFN%zMKx^Xe{V*p85^7=$Go@Iaj`aN6DEj8gogSwM250JtULT>R7i -z=fyRo^wAa`)krlBLjon);_p}#e_vL?t11A?qX@`G4qt~STU#KY`FlqBaGqv6b6~a{ -zjoFq+H}I&KZ8HDM#VZJh!?ba{IaeKL0>39fbA5my0Gay`^e*LSG#PuHD?*k6mBI@x%xd9!bFJdkd;S -zvpZqAMJJUtP?KSiAzSx-e%sJ0DKajWqT^K4lNr94MO7NPr<%dzdb{)O>T~ -zX49W$BmbwhY?Ph+1TCg!3tV>GoOcq6a&)9^Sk4xjh@;O1WkG?s53nH5=ka;Sy<71I=$j=sMSU>{kb**Dr`!71 -z0oUg&9kCPnArehmoAICLMx=!F2fX~_p=H>yalALLR11t(CY~4{^zHA$-A^Hx108{C -zwU@t9x_35PQ4>n4^vB?RXczdg7LVG -z{b9|%;lCR~?vR~60@GB*X4@S(pb&H3qS461`BkkdOB(wLC)9ep1gIGX)$VSk$`=bu -z-;^q88M@B;Do{xnL2T(SW#i{GJayklMM$}NTV8CL+u=yw9!=n;fKB}}2m=m>+*NNl -zbztFXqyZo4^$b}}K`U#BgdjSJGfvJ;{j)7jVj^#8ONCZNz#FT=E>0shIt+_5ZZ0wl -z?^2sYr@xDa%t|<|wTp#qPITO5=d5j911?~Yr};Gx_I5N-1`#rOV{7Xxnc}ZQ05m<1yo(!~`E50yQusJyi^FVy?H`i3-ZI -z3!0rP1?ud9?pp(D&A#K}a=zjtY$PSE3X|marO~jNOdTQz-;`)Mfug)TjenUw+K#rN -z9(X;h)LU)XT-uhQTsI@X5o0+P?kH>El+j`7F%z(kb3^RVWXtF7-#mc74k!3#SRZxt -zwz+&Wvr<4o_=Z*kwG=bwVV49I(49_IOmcHw -ziK_4Z5i8l#QsJep9@*+D0+vbwt#R}J-i%bN#f6K3DOrL2QDo&fMTi*dkQ> -ze3NYRGG1p08t*93a|65_lX$0d4Jnx?Yb3jb{9DdF_WLHQwzCyErHwflBRq2**fs#2 -zLSG4EMl9fZeY$qATeOeILC-3X`!NC-5T^XAPe^px -z%(hUg^83KjQ`p6KTJp@3xtD1WXVymVil$Te2yd|(B(0S0_a4Un|(;}Xz5qupUypN@>*2tZK2PA)kmrNZmeOEr3 -z*CW3l!A$cHa<9yWg;acGX*On%on#B676bGvyg_3(#W>Jb=vS- -zZ_lQ)auQ9gz#2+rZW44&6{+|3Q9Tekzfey7=0VnA-YVEss$>D(Py|Kg}@J#}-rf%Qw` -z&zr42iq5>MTh*IZG{9~k;&)T7!s-hMf@z@$EI;n=Oy7CQ4FhBSE+Igo(#fJq#ZUdU -z@rH|$tD<*T7c^)1{YR1F#X9Up`&SV6)Kt6tJ>W$j>h|{WXqHLCuamFrfm)-fr322t -z$Vo_iu_n)Q{KJ(l^^}oL6(z7#bZ!*1$Od%EWNimiA4b3>u-;w??%Lv9t6#tG2%Pk> -z`!U^8SPeIacJIRdm}Fh}u9DTxR><29_i`TqFItx?sBV{!?e&;U&r#JmQ>-0C^7#p3 -zHAmHt&s|O?K8=q)8@K}nIn-(yEBeQM_qNg -z*sA%WPt1AFQS6wu)KF4L?kV&OE5l38W{m|v5ie)XywF{(i7Of_e<`mH -z-1TfkXQ<|yLFYhI<*}`79u4vJUx6F43=)`wz_S~OWw4}&_|g4;-K1_>u=Mp#y>?X( -z7fi0)8w@FIm$_K-*bdJwUDFEb*@yK4SViB-%nKU9eM-~)hE7@j&3HRhr;W$e3L*PG -zox(H?tILeXmJu`ve}*8o6kmB7-_Q3^pP%%;ivB`hM-bMjl_z6_(eru4fZn|{&r#8L+50qfM>2<$-}{zK -zftr{_V9o7DE$6CB;LqHtWK)eZ*jWohZIf5rL#MH&TnLZ^kfEKGx-w6HKO%@7`(w;S -zI{V&8lDyzEfHPExuQNq0+<-MBh?7sYfi_Pw4fA!8@%C`-SC&_zEVEtN?>~-OdyuiE -zhY=v)&foGWAP?fLoAc@cYPH|nY$49`(}SdL+{x|=HLS+>8qdoMYM*!L{XFI#;$^yz -zAAWW+p^GkNxQ)D847%l;f`4?S)&;Jw1*EOc=H3#-OF{;|V>}x%z>Tu&&V=G1a-<-EE?s6XFX2m0kO!6af+3G#hMwXe_DiPGf5u){z}`fomVqvAO_C@OPmHH8;T -z;C^j-(6?}F^l)o3@wzx|a> -z;=LsyW5=Dl#ULzgxy(^+_>pMa@+u%n`vV_Sy01t=)*aAQUq;`eT$Ebd5hu|zmgmXvet3WH(#983d=<^wU0kqCSj`x_^_f$EfMygK`m -z;k7@xXFbv?+Z71&f5r7!+c=_3q*uF50PvD)u(~#+PsIJ@ -z*F2jsRL0fanFj4g7bgD?+wS$W5j|k{{2^KlV#Et1@u{)T`P#kT0dBFYqkLZC73gS( -ze`pLyL0XN@;712qPsE-(`ak%}HTX5?xwPHehu&Ddp>OfKrutvIm5}1aus@eE}(sjldn4a -z_5~XL{5QgUF*yp2YVmE|{jM_5An?$?(DJJy;JYf|cYyl8{3QTi{x>FHPl}}-{PBFD -zEV&8|AbE}Sy9M;zB1t{rnSVEMEiPppOh_P{4YERvp^jGy@1-rbNpc^|Vdfs0i8+2JwC@LxTFDo+x)%FDlMz4TSsN4mVu)~EfOH*nM@U`C^d>IQ0W1Uf@l -z5lN(f&rS2sU{Y0SvltT4FNl}z=+OY|{y)kA&_vi$d7(UZ&l4{~Vn99PmAbnJ>VFMO -zxkZnBA$p#5Grx8psW#>1lU=i{%i@V<;H6T_@+@krNciueAKBt!Jz*ojR*YNwJh>>8uSC|or>rA2YIDz>)!F=&wz6xfVaAEj=+>2Y -zk&16y_R&yxS!bgnIS9bD$6v?9ulVj!cm$)x*$f~ng@Kj;(=h-(Zh;Y7j`Dmn%XiuM -zayj%uJoJ<~u*pwe%U>D23bU$I6)=(7?HI@rlC8fYf|q}MygLL@>)ySJW+$n%fZVtR -zrybc}T8Fp2)Fy&enx+m>TisE(>JSm#;N21IdNHsTHqEP_VK3=MdDNHs5vPH!4E4n)e7E4pN+%GFjDXj#vl_;gib49sN1zAd -zvNSP)hNFe8+2+w-ZUEd1=p1%4h9S5;1w=pL?vhX8*^&3oWA*#UqyLAiFOP@vi~hHS -z5G|CDEk#*U){relh=>`Cy{t2aWGVX=ZI&oxC;N -z`Tb%^wp*TR-5pW3%xGI>c^+OUKB@7~%zUVvr~v0{dK=87%NJENgkh>3o9BQC)MI!^ -z69;^9UTK@hENEV%5_X*k$`P@V-hl_MyNtas;5ZA^OS*z}b2mz^1 -zBka1s*^DfE<4*j6zgusudBCvB#(Zw-ij)6lnXANo1v|U -z{a~9yyth$CA41*F(rgO2jS^jY^Q&2qY5bWoD~1qIg@9r-`+fRISD~J&?HPPwqBCO} -zu@r^jag97TS|(t?j8-293x2+DRIVh@7)B(phc69U)Q-AM@u@qxfTVuk#T3gebniLS -z1m^eES5uaVu<-}HZ3<>+o*NmB6TSx5>lktLC#Z{b8^l`}u|7vj{8pxhAZ&amhj2DD -z&J58<(V#%knB-YZFt1qbcn%>7-f2D=A^hw?0_#_b;F9=hXWCmpI~gWQ7Dl=_Bk-`V -ze%h@LJ7)yBaSere!x^#d@$6{t*Y%Fr>&3J5c~xfg$TxZ0?#$JJyIrqoO`?Hj%Dto^ -zS9n?z0d_5q4|10wq;hE;lT!A{JJa~eU=1A>lR)R3MZrF%VKfAewh#zbL+*}t95S!( -zaqD8C6@K%@D1@e@(7OdLr{`hT?Un=!syY8lc0?A-Ak_r8 -zqXOOrxrrt)61&yJW(62}UyTClTnUoA=fkH4o)PfdS+LSrv5+mWVAXY=T&@a-uJ@c;3zS>XO7l4E|||tTtIexUqSj8WHF6 -zEH@nfhF>&#V8Xe=fw--e-Ge1@(DZ{6#zP2)aObl(+~`u|6$1NC`LuYYns(uM7UNeo -zN4|kkalI&V1?ff(JYv6EeaG_6>xcK+DH+vnGLsL -zo0;h1zF1_1?`g%|qsi;aI2+&GY1vjfDfw2WW+m-zL!Hiw%^|Rkwa9aKd0L;mWfhNZ -z{}@IBufy&Y})9C;6E&?k(AEf;F$eYRZlu}j8Y34jyPu(i>{lTa{7dJ8cn<) -zt6aJ0}u0lp9CP%;$Y?I04)(RM)&9BM&ORSSR{? -z437?5N!QV_nJ*{5q9N`i_$Xrx-F@_>;+iR$Atvmc&~_dNRR3!Fs4$UBVk1o4PLBPb -zowk^jeL=s=8S7}mj*}sYG{Ip}RxHJf}AbO-| -zOs;7?gR-UJrnR$!WwU%vzxWYmdCp3dw{}(+cc7y8P%2jWDuYa>gWzmYXpDS`XWm;jI*}%keYT!P) -zI8?f*7j}eB}|s#eU=?xJS+vtzoxt@ -zBzBrx|H3UoSF$uqE!(uuXTO -zD2?oE$>J4|l>)Op65`nFe@YHL|5S$wQlc}M#gWH&&xJJoex%`~M(K!Yr6H*bLQo}gbQ0EIQ`i3b}APIPPz8H{9r_HL95OgWTp~KQSsd!WLErBG4!){ -zsjO{y_0Xd4%L_G6mY0JVI%mfE&3Tpi -zZ*iZ0$5bmUsOXYG$+p+K+%S~YO+*25j(BG$gK1JgMT+QS -z^bYkA=+=R-$>mOl>Zd`vB9no76E}QJ*!ljvT;BcF@p$z+ZNYXrg=>J;!0VO)&7JnZ -z&GET0#Ck@~X2!=%zQ-#%e(wGL?_i -z$=H>ce`;?c!bSir)EOG5D+V3aHuX!g41`g9xZ1dA+47$9_OJPl-=oc$O6>eJA@*CF -z$wM~Ef@;d^Dd+r11>N;`$p7=IS1WeUAeA|}VelM8C!9@hM%Hfy4_|O9*i)4=BX&0$ -z{b~4yjhvGuJfNSy8)R%-QoV&wt{OKA)ff7;5nk4Qj}qIyFVHBlYwg>1WQdDa@T6aC -zpMUg(=lVp>rXY36b;$Yzk)~IeS3YlV8RDDzi&wL0M|=#hx)zi8$Lm;y3LA9L3N~^U -z>X%7dsU~@3@%u%t{NNc*cC5T+>ZD8PuW!Rkzt=RG_#T!C(1e(6Z*tWS&8ujWRs4?k -z`^QbZEv6UWK8ki0)nR}%nmbo~8NYB{QkY&lFZfb#Pz!D--m!$DO7Cm~J25EY1G_W` -zJBIWr*!$wudr?w$u~J?ap+qBSu)lYkEa%tL=N~%}zHXhnc>!Sq0ZM`N!73aj)s4yT -zdW~$oqs$iUayII+n2ITJi6+Exl^!i$HL!07GaNj5-Mjs0`t#E?@wuBk^>g#}+GGts -zDKTDZ!8}RuWfp2zPtOqI(eM?TX?=V0wd}F4oD5iSeik_kOCY$?s0(jxroR%xgJ3UO -zPpoh;2-%9r_schC)-yg)_MC!1Qf%+e$imm1X$lk1aDva;b@PIFix|vY6jT*Q3J`rw -z^|Z&Zq(;cXrPi)je#3!}A4Ih-=n1IcO^AoV6p$P$Q@DF$|KSPLLDQ?K9#Ng~7 -z?Md;H5m%o^D9Hk$tOiDT2O^8&LWQ&cT}z1Wwt<5|`kT&fZi6J>VBwhokviNEB-$VodVBJ-7W>!1(r_3p -z4b26RyH_b(m+0JG?O8jo -zEnZ-H_~ZByF!)J;vjRPWZwF3N-_~aYzsbq_Ko`)^ya>U(l09Fj1su>B?5{YVG!hKR -z;>T!cPB7b@cF{D9E(M`^;UA-v*AHO4N@t84q2td3C;fUGzL0xlR_ehO$|4TEpEmR0k#GT-&?+w7qPQ$C~D(n4iqveMQkvt^@E#oJA*yb1o*9WzK|dl1B1+N -zMP&vtWn$}wjIQ>c0z)#`osPa~SYo4seWJ={lD?iH7Y{rj^>YcU$$$_uFomN!Mz7o>&EvIOj;PD#nBpoQf0dbt|}_Qu%wE@FE}YMXv{5;Pw5$~iK>wnxP8-Wh% -zle2v;VXm2a7w<{|Qo(NcFmklG^m;hzgQAOPJ#2bT#|&)E)f3P-#&mwOX?E0+j9Ikz -z1*g3$!xXTfy&iyhuMOCWJ(wUZ25T;B2%-}Q!(J3%>y2lST%7_2!Y80sXZ!A9x7Yn0 -zcLP53&VB}#5e<#kxfZehd}EMfq5+xPxKNm{sp9#w{~7OJ3VE>pw$aLki~f1!WRjV) -zM7rNs3ioYb<@}`uO5!nNMv?RoxTU>r=^lWf8S)%_Jcz0$o+pNoyGC#Mu?D6bUd`n; -z|2Q>@)w9(g`GF@Vq@eWTsKc -z*-Kz41fOAELEllDbPbXBV5vNy4hQTGFc=UK&JY*2;v;y1xzEPyzAf)I3D@;7(i{$kTvcXW(%g)ZKkC8U}?qSJ)GMTO$r9 -zf8hn@72E|m^E&ZSf`}3}nlv`8WeXOa<`mF=a+SgG(Qp*SR3Ein24alh=Q}iZr;RT1 -zwg31q=c0T7Jp5E%y$A7>+vp>Zblg{;{b=>W=N|ykbg|@=iTBPq;RnrI~2P(#_8Oa9ZPFg7?nw`)vA)BNV$egLb-ehXWLX -zC`{fL#aNWVMPt3J!M^8M0eJOyR5O7x=JbgQ;GW -zTq6!S5Oz4_K``a3C0)e|whL>qqMW(1Squ9K8E9mxtkB^m0DI*8U4$kw`;u76UKCm$ -z%SoC{S-u>d7h -zsU*$qY}(?}JF)q+f4LBXVad}NI1}&zp0}Ul@|Rs=g2gxSG6nGaIr})}!&Rhy3mb!| -z#c$2H!1FwRe**8&*3bILkbY^t0H${Mo2`afME7ert73xlfE{t)Q04H~6F1FBu4F?r -ztm0F_!ry7pKEroImzs3Te4dsp`bRSAvF+ko5efF-yMBbEswkTKAaXeZXVda{UI{(5 -zJdGyXh!0}mhS9q>sEd5-Bvd&m@;nHswBQioW({QJ#1n*$2+vIovQ66lBkUNN@k -z(mjy-cN0#Xdee2JhUhDwOdALy22tW|Q2x^E9gx0YW2+Mdi+%F_T2RPf(gTT`2ZN8} -z7i$;Ax&F~84rt_b=*_zCx{F}qS%;SxvGs2fa0j1;fzYLX0LbT<(PVf!PRqrtoK(R# -zXgs})_%f*4{BLxN^M|9uYmZ}0+>LGVFM{fM%xvVE-%}-82<{f3ZQ~g}H?>+mHByb_ -z5BDb-@wu;U9;JR-=j^aD_<=D9f*-l-DynoIL&9p~U*tD|YgEvzL#iopm86Ps=kJyE -z`-QH%)Kvpg8!O`ytZmWs3dOObLr@;RU%N><{Dg0tkt}f`ry;eQ78`iuTGU<`a1>D= -zp#>{N4Uc_$^}#rWZb(L;BxVo+&ewp%qes!{OSb8O(nQ||ykM~E0Q}lFU}4c1GPS_x -z`WGOsLgHd1w3`CO6 -z8@E?g18aecuFo7YM-yD)>AMa$O^CVbs;niBo~d^k`pyoXl09N~y5SSJKnch4<($SV -z^}v-QeZYk*yQAn;7ZOU|3d>LitLzBT!?LU64MO?AHRtOsVqrgcxXoM!%+p)(0Hp6R -z=4*4p=oA*%g*5uW;4&)_o*b?8vn|0&Nrj7pPm0F-JdiY>^CUy?s04aoP$E*W@&ue3 -zxI#T2*m2C+>Y*S2kS_4)WOkz%_|;GVM6G@MPPHud!9%fxrqZ&3zqdoEq3QJUyu|&K -znMz&Tk~yr51F+6%PSCfAwfD^yCo-zkbBq53~1w=hGf=L`EWsY9|Uha_)TtNuT|BHJNV$ldgbD51H~W -z7D?1nQCJ33R>Ix3hJCgbZ@12cgXCTJsZNV>_YTeStDo3ul)zUc@4=9+b?3u9=lVV6 -zoLFEXOPEfkWm;|z2B~a{OcIqb50oeEn7&C&6r;*(=NTuf94$gn*y{UkHhS| -zDPQ=_>lA%4a8fE -zy@wiuLs`TH%FYeq{$kv%5-CFi5G_i1_gOjkQit?pVrbtc3yz@|fIs~$C-$m}Xmyc(x`;@`} -z3JK*?8r*T4GySHxfWc -zWBrc~jQ;pUho&$i3r3xI!^BbwZn2?^iNA;XYnR5Ga5S(X!1zVtgxp>RbLnP#3tlbp -zC2-#F4>^qP+@NvRe1`8=%EKAj|6EReVm9+d!^tuX2+w~`$DPsyTP&dO4z*=&_S?A`?o_Ki5 -z$v4x-ip5Hc?E1r+-+?_D0?fNJdhn}xaIJE@=hIeKG}bqorOfY~NN}sP -zO7Nj6+u&@gm&AK~01>@5%iis!vLc-11-qn6~b$ -zfcJ&wZR@t<_an$kC)7&4X^viFwZrFNlW^bfOS08%5OSd(=2E=2URUT~`ZsTBW|7QX -zjNFZ#_l>kqU239B4@L0N-0Zw*Cimm4VbMgEaY^py%!Z8XOjf_;P(Ghv9)IFOg9qb| -zuwc}kzQdS8PE?$LM*Dq!%l_@%EzIllZ7{+GCN5n)XM9sxa4{zR;l-)oFWcIDI$1QV -zUW|v-=(U0zQG478js!-aGxwk$?8H}2M!h|T(%^xm_TBiD@n(_rK)73N@eUn>S(ePB -z5_;e-ska`T=`-+<|6~{5;dPdUQ_f4{sBPR>-LWC`oxjAx#9XI(_W#Y -zLwO~>wv&uFGj^G&wWpeB?Wco#!e#Kt+PTzz_xaDl#z5|xK)FVGk4Furi8t-Dkx+xXYQf(9aym>vo-RDPA>P>N_Jc(^#4^OA?5hYU7NL_nAcmu^G -z<@`RGpQ;Lv%IeVv7ps4$Bmr)A`#V%mumqaoBzG~@1T``G-AIYp*4I79)s2($9)5q6 -zK)$AMl+d8Z0N^C@;os<*fo*_VRS*b@xl?iTXM?tI%$1o}H!G}1lzm41|5Qdf?b>e+ -zzuV>t1{GtyNV?@WX}`%&jCUREH#UF13vQHn45D}|Z^Pd<@8$#xtVo)bWm7V~*AIQK -zJ!Q3yu%cgTrJ`kKnkz{c!>?CF;4a0(AHYhwkD3vr?@%p?M{c&0|0 -zL4U|(OJLzrqp9#Y^*+>k#ofe`6XsEv(UWPrc*wT8QnfL^d5K&}!b+^jU};K{JI>;C -z=o+l_ppO#r(hYXF7;n6yg$bX -zakw0%I5i;k(^;)l#m%hVOXErmsKtcQXE$Rt?BurmE%!eM58Ja`i--{U|F|M__Eb1F -zdCmcVhpvsh1Euv`FF~^UV{+pYh7>_%x#}Q&PfO0v8dgy4glQGJ#7e?$vmJX?P*px+Jd?!MLtq&uWHh3$Au}hQN&P($26T3f_ -ze#h=lDLmGIfYT}t*%y>XPRKjt$>lVE=%((-ZilJ;&r#*a*km19diMUkNseWyrST%GC=h?w@PB0;aKXSVUiD0>mz4g|)9O2TD-S-rfng9QNke^(1jFbctL0|P($4K54SmHnCgP_tm|^7|AG -zmnlTWxqv{^1|5umK^Kr6%0J@}`e#)HT&0&0B}E8oNnlQ(;-t8qko5BJhE)5Q5$JCH -zMLsj$Usl?RK}j!`>~Cprv#I7!$tuW28(o#g@ETNYzE@wmQM%dP^sVW39pN(TY{$-b -zfurGR8f5A6%V$&Qw@PnukzfMxf%F32rE6MuZ9dO2WfgVy8`(iLp;v8h<2yx~Tv$cLXNP>g-L -za|7QR&@LzTwd+nE6mme7k29EE=-~}$3n-0fkFMiq15c-Iwm+_yvNQEVpBM&rscyV)8=vB2J(OcT-m{H$LO&<~fYhw;|C?FS0*oI72 -zEQ{;7u%O8A15E~cOslF$1$+?)C*8lOEdq*x$@hPX>P!p#Nc1r@xEVWmYiXNE!N&l7 -zrtm`maStZ|=zD~ge*1k6k(I+JIVIL>?#%=_5cfIC$Z#+K=vbrM#cwoE8l|jRo0nE)jl9H`dyHszHZoYnn^VlWQ-j88tSq>9cG`n|H-ng*K -zsCvap&n@9|1qC^+PAl)Sa;YvbThS=p*C6S5TXHh%V-K%%*TEA?0ZqKwL&eIKxA{jN -zt2-7@zEK#)BZT)1NJ#*KuEIcSI_659j!#qrNk6zkR)Gua%@0q%vOH?xKz>;i-?Ii* -zqx3gcRpPn8yvM;=ITb;ARy7GdM)F(pCETy?YxKP)jthktIIF3V?D^vSi-n6X+OUy+ -zHllJ2?C`%UWL!;S;Y?XADZj9GnOiZ{GMbfPnDNnUEMe6tEUUtR-XZhGhwMII3E{)! -zkEuDU(EACH{GpA{|^i3FPqCEiqHxA9iIK|-|19O>aU -z-^tYf_VFX{OkVZ$YW>=aOLE(i_BabUsmXxr<%fNwwq2><$!^KV2Akl~EBTgNY|my{ -zdW?a9La)GvFg16et{wL)Sh50>BQQJ~@pf|h8hBF#hpmmwTpluC>rYN82vFs`T@&qq -zzNj2T}dolq&T=uc@QiJ@oW9>w7CHHE1s)Ilvz_OMB7NqbCnWKz(*9ygu -zUlGa%a+Q;4;KoNybDoim`1T;S?aMdak?Z9b`%=!_rp0Nb1!b){JlYD0a&qt9RAFInKdsB1{IqlbY1H4{dK7)~ -z!nGba$X70#2tr4n)8KY?>SMvgcB~I4*-sxI6A7*0;C0xX`l)p!pN4p8^e4`A=ZvM) -z$jnI7_d63bca@s@6IHAShy#z|bM@uZzl0zE$IW?JnAa45M^4YB?OC4lzwc9g5SsRp -z9mDxOiX|X$Dnz&4#qWkqxk^?0w_%g1ho~=Wf8|`T*;jtE%WBt)G&Zg!4-ZK_=P0(C -z`JbH$L(mL3e#GtJ#Yh?umqugawH)2^-*XrZJT)vlYt@oO8-J63H!ABh*3X7_*C6z> -zy{z{=?%DLfMwI==5VLcekhOyTqkOy{dpC!mFFIuy2z?gz<|4yst8nfcH(W>L`MVX( -zyH7Jey7?f#(6@xwU`U4$u(Gnj&BHzXY+$TX-ipVPUYMQ>;H>TK{iJ*JW{At@*Q~m8 -z>7N_G+EpYc%=mRM8yL+z{OL|Z>ZFR>rG?inL>oz%P@x##>0zHS&}`uHHB||VbfX*N -z)hGA1xqFV4y&Zp8;P7}Tz5JR&@P`p=)~~P0@4^j`cUKi>KNiuKKS}5=*m~J?G>?)W -z{Nmn!bgmqRA-7Hb*C+@3<<&!_L?|;#HC+bp^XJl!(rB&d{FrZ-^;XmPCZ!r55gL&M -zsg3-+Pl8<9jiSQUf;=qf_61EK{Y+ypDY7h>7xxg;HHm3ze -zpp1k;IC*4|AZ~;QS^U@-Ptflm`r^}_It|P6y;OUDO5PvKSA@BzUHjk=+^4srY$xZ! -zX{&rsxxVp#$@DTY!)H0MLXGfBEl6=j2;|-;(c*mlWPl#~Bi{V7|2=0Ux-kQj!U!Hb -zPIhx8nQbhX#9>3W>c@RgVO0JznYZ>x(!+`+!-t{|)IsoRM&9iGmN -zV~_s-hans5p9kll#iZ`K7qw^D+mCzYH*)cDAbYmQB!?_$(;se7VikpHoe~3~Ur(js -zw0>C~p$gki7}!0vyQi@}SUhML<6~fS0y=QPMDR&|5p(GpOB(~j>LueL&PX~sg!Fnn -z_Vjtyw7vXeuIJvkaKP@l)k0O3FdA2gxYsW|4H7+(uRe?h<#pi?&HZY1*iP(~1pduU -z?tEjF1$n2sNpDQK+zR$*ry`s(Wr^5%FOO~1lrNbOdh4FZn@vn_lx^GG{GVe*OE=H9 -zljll&$#E5@arS7_ZCJ2ncg)y%-c1$zn+PbbWGj$+SiyeeifT~}f!2$kYTBu|wPZ?K -z-p<3KVbjjUsxqrERC&57CrH8Lk844>@2HLt{7Wu3rL+{2e!b5vp;4xydrO+lVNdjW -zi|U&#gOf($89J2Ucc|Z(g=y~9;_eu>wiU}qa`{v>r&r&E2y>B7P;Xl^Kn{}2g^m29pZn`EuAUIqD|76bec`@>mJ -z=ieCR_J_Vrq8h?3YW70khL*sVSn$8r;bFzNNzVSSxnC#JwDbNV -zrwHhVG_06BhK2HT^Ct-J4e80(s$G5lQA_|D-q^a(;Q!>hesH*u>z}R5)WumW^{$Ha -zHW1yo$JFcF*&hc^MeA6GVz>)i$qL#k9Ij$KH1CPrz4dTJ>o#d=SLtHD1k5*A= -zx234tUYInz6y+U~x4oU;YH;0ZnveMB&+qzj?|SxJd;U}^5c^OYVTwMqX%ql(H9R?} -zFt}5{A+y;r_0a}arIW6w_BM3IRrWOnGy|{ae|RuK|Va_-s(-z(K_w8DZGmF7I)rAEbrAVFIB3d -z+4oi`x;8`J(m$e6OH4OaCbPcem-anu+_&7nMy?Ut$}#G59@{4U*;}d!o4%;7`3@Oa -zlMX6pCn?)^BYy=hNw^_nYkpUcv4O33_=0cpRpQ2#`6P#>cr8N|# -z^R0e!O2Pe{#KngUcKGoL7q{eOu0o^p#Ue$IX>q?UHHo~&z;p!xj&4z+p^`EsN}}zC -zgm88KcYLq<&bzVwRX1}YA3ItI6#Z_(4z_~K0yd+i0{8mfr=`iVq2h(Q;Z+BtOZ)C*5SS6E}A76m&e!R3>!x^)vhh -zqY$J>V{)x2eadu~zH6Yt9?!3R8~{ts_goo0^7MP0>CB_j2lq`FExRfl(vz$uu@7ME?%Ua}${rJAyJ8V|TMpYjl@m~|0OK>I -zqYv5oXa2e$c}_v~7$7z>^oR<$>A*RYgzk$7WwLIDg6pm($4m-sqonq(nq9J1PG@1B -zEWMi&3+B#Ekg}{s(ZcW%XQ()aE=YK4^(0$jb!$(@m(l{dKwY#w@0X&&NmM}=Glpf| -zJpB-9Q~%MpP!43U$@9>Sc3pTL&XP+t>x{uV;=)xMsV}mZs#Xgiw0=TnHv(s^BLNZp`G=RV-kPf -zA6w=vSL5dZK3si=#9N>yBx?}?wN-&>za4_-sT8727YmVuED&)_$+6|UFN(>a;)CV& -z*vwT#!+2a4Q@$7GXV130h-j$7-L(JM>fkrYV(yF+E&dRn$ckpbX1KjbQ~9V3wg2Od -zn7Q{@4ZX;8UCi(VR8zwwmDTC_E6}(mX1qe%AWBup^YPsMQbiBzb;S5yj*01zHq|Sa -zYJQ3pjR)v16?AC+AsDP01&x7BR*F=Tq3eiWM7p`UV3rb -zU$3Ddfp;j#B)zBzIiBD*bVV+;Z4@XwBaSH2FcNWvNN7 -z|3O9oXd$@emBtF_?D9%{Y1W+EyJ&ZT9(_}3<$7)Yt%dXCUr`c&7T%m|cz=+Q5D?&Z -zCy`+@)w9AiHAYp+>HOm%!g*i&BsDp`M}y@1UMmis_l}O6T8_u_1?6m+#eClg%=wd4 -zO75tLO+|XQmwec}bl|7ZlddQz{92~J3SLl`NwoP@--VY99yplkou7}`%&Xn8iSHon -z<~5S-7Zis}6+nh2J0*Ki!#I<+7j>e2Qd#v~2`@)gCTClWt;po!%=sl%a -zl_{j^-8UW*sBZQNFvBTrN-A8cZSD7OQW{a2ZP2cGXwJP{Z7uKUH}gIBK%36fM%bb37|$1eD5UlXl!SmQ$6lXDxIoqJ1saBnoBZ}8Y!9kDH7MZ4A-!D0+w6uQXt_J?H -znIG|e7+Dw{j+Mwip(205!e9P+#L!p+>?p&qh!{6ibY?YfDYxTz={|+)i7wf5EqC)L -z?~K5~%w*e?3tMP222O`x5AwyElaZ6Mer&#~%xXnd6JKh`^a(N~}DGZs_vFxA2MimVM4da_Np -zIt5C;kv1Dpn|gmMik`|dcqv-Lq|wIx8_u*QZz(}2`KVj)cF3`Ych{!YG`PifKk*uT -zwv(%}8d$)3K6e!e{CwoUya|D4va%Cqh83tudQfJMhn(O9aJ%V=zn1m;3x-?{-kg(! -zI~bjXdM;s4|0ij#C^x;|*G_pZMO3`Lq#KEUyxH;dZ%7Yl7u|zj$c?6yLB!Gipv=(= -z3T;EVyQNRQ*koo%jyMKWY}&C7i{6N$GBksX>^v(Q2uL+e_oFTaa}jJDnwHieFSM#k?Z&x->hyJa(6w&)@DSNJTcQB9`W6ru$gu7Ce -zIp=Ntwz|c!$v2?|ehi={_+l@Ea7AkeWYF4~4WThLKx*|H`Yq(U+3Q$cV4HQ?rqFi$ -z!KEg7BMlkbhqD*CpEg(|?)}CBa9U+-MNKKSv($LCyO$JbGafWaZXYu7w!_a^_b>#% -zDUXDZ`RyB?`|byJP3GSpg^4#yh^HU_mDddI?2r -zD!Nfr)SCSaXMI>v%!TDNo2hHBs_8RaS(xrSg(PmrldAF7go>AWLN)zpG|EHrF*L`)iF7cf7S3S*Kdbz%XXp -z_1d?~f>P<5iEo`*z7sp9`a7`W;V;kbw#TKUF97dk<#xZnS1hk;mwbfrKxcx(^9%_Y -zZ~ZL~g~C}1pPTfUY_q@m_lfU+`sPH|c7MeWeVQDcV18M>5nANv`c)u_G$L?4Cr+8j -z<#il07W>$E=}7+PUptj^H~>GL`B^bJ!1wKd6h2U5tF`?8re2_gub(Pzsib$);U^{I -z*1_4+KdDDy+AI)$#2kV(zK#nHoqYkKCSC2g(*kj&rLj6>dV1+=h!GJjPTSC}+tmc8 -zdqL*V_gUlERV82B$vtUs$>6Uw#Kwk3SAMcR${H;S!zA$njlKf@V>2 -zH5Ybm#c!SQx6D5ttk0O(6&C@9Mvja8b*EyccVb$qOC^RZK0cpWl@Yf$pPiP*kcB#? -ze|b>Z1u{9P2R{hugc+oNU^JIjL(ZzEh9Kx&bIM8lR-zZ~p5I)r6Lw&@G4(~#-cHn8 -zl3&F@{y}EE;yP%k*4^3v4ucxKh~aPSZwQ6hq>|+5ozv#AlKgzm3vY)wprL1sN!U_q -z!VRz!)06XD>>wab9#0$dBaJ72WF32T(S7%k)`I1mYY{Qk@&99!N$LlT`$9#}vtx31 -z19d1=T`IOqT{>p?!Fb>X_I5^KouzT(cgi6e@cC*DlXsKL*RKx0 -zidps5U<&YHa#&abm9HkYuinUiDC+^i1OK}sT5fMH0=6d_x3%0drRtfFqrPI< -zsgXU*?6!LG=LA7*#kdh{bQC8`$Yq{)1 -zEm_4@wNG#ugXp<_`DewiCr4_>G7qj{Cgp)QVd+?n^qkGN7WCY=^3bxjsRes&mOL8P -zFJ-^6`|s1nd`ddaw~VTl)|jMMJ8dqGDp&#K;4D@lt5S^eVJ_A!c=It`PyDF^B|Ngx -z=1vM1)Rc_5I}U1NW;g$&JplxfZ!f7vV29?`?7sM`hqY#74uqZP|eBjl)a8|)iSGpu8I0^A%sBDH5s -zOi=q+FP}iwx3NrgxsiDESlh33p58(^^h90$MS)Eb%8+C0o@S!2kz}3ksqy@8+oW_w -zsAu+8SY0E!=b3F|K3>4iBvpazHsWg{o=x-GEV|y&CioB6`GLlAwaCc7i9Wd^V3I7w -zx(M@ui6jWZ7|UEi`qQTcFvLOoI{SyzzB#aAcR2x0@dyancP52dSuR7_;Y;$o+5^d@ -z|5bbD2HVZXse4x%+7T?SH-9fSd>9=Y`88gi -zjy@h}!R7MC?!bMkj^{teHB)E!3uYBC^`BKHYwH?HBVw_tAP#_MttEluHB@cC_W#~; -zx -zS*Dbjbor%vk!IlkRi+uteYgEPQ)fl -z{5GOGmd8cdIc;;UP9CH$-IAUKeb~@W;dgv0zHPnVt|nT|EsfZNmh0=F!@5jnX0?dD -z*XwU#QB^^4FRBwgThC6$1$T}-CraP!+*m4J3clQkJP|6F@WEyY#LgOe^vEs8b%xSX -z?I#_G^1r}h0zbTt1K34pK{+wuqloNr!jQf`TvR%=Qcaxcx&L^Po!2Ywf6Zyu=tJeM -zszix#n~guJsdp-^Dq%ErxBvdD)xn>_)IHzQ{jmBwoESSKC0BJ^?GIzsubppaj#!uZ -z4EbjG>RV8}0y6OpndE$9z47R|ZL8QdKFdISo9 -z0^3)uf#woFaUMm>h&;X0{Zxn$oWWdN>(|u~-NrF{%`{;NXP>?;oEJo+Xd}vP`uYWx!ml0lI+F7aLs8nX2GK -zj-rWq8{UG}ps)NJC99Ver_YC9A=m26+LtB(r^s3g{Q>I&-*$sH@w#D%Wa}xYRC4by -zazZ9>GK~hnC+E%{bd$9{HM$I9lpI>z4j4JS^oP4hnpJ4fN2rzGyXRq*V%hhdOo3C| -z(UadY3+x&hm2UsSaw|~%Ak^f6MQqk;3cZu+MPaAy&zvFh4vC3J(I^gjaT=3SmwO_oner;T2>)eG8hY18sWr>RPyg$qLgM7n}bymX|j~}_2AFLQA!BmFC4F1b^2Mi2jProX`E-|TA;iixAt=o8d7?+$ -zUO<1Jwo<&J(!>mM1e&FEn2p20Z9M;8d}QNz$G2HghyH#6>|du!;SHYEyd(gup{m*= -zZ55^PxXiayjl8hD#XmxdJ$CM#oLSYA{B#e2rKJ%;wKliJzF$>2(RVCY$BLs;1Ffk| -zA0jf7lx;TCt}sm=H=b`iJK^3w?@MHfi?}P~vs_Uwk)zMN(3;4iv_oEnahP?1ioT@n -zl@3&w$fFe*yTNC7ozjQWhJ0hTgY$|IVN(iR)}M`s-nV)+i3F?Vfx?T!PxN@l@b~it -z?tZ3@amQj*Tt`Gy|C(QtT-3fuFLXaoL&`q}$1*#t+{owkoRYfQvj}VeRB{7Esnuo1 -z7wSoSRW=xH-aqy%y_$hBMs(g?>-7{qhu^8s~X_ -zvdyT~@tL15ILsN$n^;$#``NjwyU;;xf-H4{S4rjnwfCjrQ1*Yk_8ugaQbe>^O9^9N -zlNQ;EVeDkho@ui0N{hV+V=LJQ6NV6DsVrlSnZZ~eWgAPSv5n#UM$iBJpX)j=&N

6;K%@Hs3*O{UJgNrD -z*es^P9G6ks_V1^Fs~`lcf=M3dpE&yj|2^kr*$c?|?LjBK&SI%XfCwxTF>)F2X5^Dlyv$V-^6RFS)Q|g0kl+}{ -zti!7nx5YrjI<5u5{Hck6ATc;eMW3SUw9Px6tBaTDLw_r0c*1>HW0xlf8B$zU;!H`E -z^6ihlv!Udi#r`G%1q=g#b2jj78B+WxB&O#)=2@_gyV+;ONPu?f&zPE%%>&54l9Clrqt3Yr6ZZEGiI_W)0VuR=s!C8CX0o>mEdZ -zi=PPU6>xD1eP~yB%Ln)t-ER#J5l?i}fG%?f0a%{<(?cGs57-`B1mCbvG%%_@0?ba%ZtsdK2C`Q7y{0bKeeF&{4$g2{8=G8MQaa`_i=8&c_c4++-iKVh+2fB#nQ -zX8F2{5)fEPi7V)T|K-@D@u?Cmyf>4o#$nhvdZApw!~RZGiNf*NwGV`Q6O~`0n+93? -zD9rBDLlC$KY44o^B985=zDy-qtCroz%L3U-8)hywb0>Q^*bJtsMW~maE@V?M?pGc5 -zj$Bgp1`fInx!m5$3w5I$Ndd|mf6qDP^}b)+*$v@aXuJ*<*qE9Z3G_k#68@{ -z*~>zH#03+1viDj+343=Hh#mQL>SIcG^SZ0tS_^y2lqtz0IRWu&jS30N^=;9_oDb84 -z5gTHT92G*Xf*{1u1qR>UX<$mS$w$Wn(P$nyze9hSDyg2Dxb)A`<4MmSj%%tETZMDI -zVIT#+6uss=o8Is09$L<14-F#*+-Zor9f4jXCMwh8|C6saRo;2II-1XnO6DFcJ74a% -zI1Dq+uXm?CP*U-24EFt@zM5dt`6uhT-$1WSH3jJ9q(Tt<&1g1Htz4!yd;xTy&Mt%Q -zNe&3%ekQu1Hy|h*k>qjj$ZuDY@TnR22W^CCzwYS1@~y4hQq-HF3Qr1>>-E$DLKx*v -z5>IFxs+}9P2REAzJpZ=dU2Ti^*mHM5Iw)I;?nd`k5P>MuT4bRnh_r!PEDwCCRCM5i -zNRroD_5yX5rQbzg7_#RVs*tH(x*|S|kHO!4Q?17{h2|O^8_sOUUFIz(T0r*%)Yjc| -zjgQ$PA5>X;n{v5oy#dP*K>m%&11GAKzL-{L0l=;0&o3F}y)9zN+=3hLHYt#tS4a?3^$ptAP~17xz-9;Egz~LB35aI -zCXZjt3+)*MwMYGTdGEvG4q6pUf+~WeeotjN&{z#Y>&-|jdZ62){^(Pa7JhYT`=Qci -zsN)9i^N&#D>wP3}vg$s1Ki)aQI(*FE^4(|VaVJe7X%+`yG7)A- -zZff6v1xcea`fi9H -zRTF&$mNRR=t}j*$_~u1@>ls6dDljnc=IBlW6KjSK{_vJ+=@r%Tt)%dAhwhh4KkU6F -z(-FQy(Ygwn6~DK$7Ol#1q!}p&O7n7$Riz3u2VPLd^xjNrI5TEtIKN!#Z_iSKz79Oc -zpR+%VyDV2*YES|1`*lW1)?p%H7wg-n)kn#r%SZia8Wag+d;~khZDYtNFZJ;EMj&A9@yCMmB+l -zZH;`gG!p+aCXD~9ba69<8x>Jy0|e=jCroJp2ArokqoHdJ#urA)rlsz|tap`0>S5Y% -zg~SWL4W-(2PDt14!6?l4Lv2@7%cdV{jM~>C}fP?Y6<|Th+3>oaG~XiX|9`kPneScu9D(P{Yr=%!n;2iAwP%YUMy@ITQJv5ma+ -z@8Ed6wWNK)Ws$A>0s_Kpy0SH!a9@#{b2+MQAMoxZEDl|y6mo(%Tw=nt_|x`j@Q&ZO -zk{LTnzh(a-NN|(_#|yOg*!3?*7qMXdyLp1k@wQVbyXOhGe&o!-QUDaG6Fqr4Y2-qF -z>tfo-+&^CHlXnYmp>0oD+zZd|)|c@uYJJ+=_1~Cz?q4x80L07|O}+ca${46=da+}| -zoIN$x)kDo0Ip_daIQ01cZwS@(o+z -zR(27G^U1$R2Xd;&2HxXVNfgn{C)hoD%zRkZ=arO1(r{K+hnKnRYRbn?kD5!tvI5gE;goFE7!GAd#YUdjn0$TwO%m5GoiBq{JL2Vu^~&E&m1;<5DF -zy3K9YV&swU@J?{!MZS}X_vwi4{qkCZ&lIY1fbh=U40?l=(CK$=w^U*{_;=3J;BR4Y -z8V^I(9C4hySG)VZLu@yzV<2Z_mCqB$`N~>UmG>Y&?>l>nWYSV7k8Z*gV2*GR=G%*$9(6 -zgPSIL=I3iE%CffcJQM{yorf;D`0`)eukB)*M1vS-9gsCOlprN@rXATe5j*XAl+K?c+@F#nzB=w7QkIFgMqwifg4>`TlsA+ -zMHCqM;cis1XPh+XeO$c&Qzk?up4Aw){c!r()6s+e24GH+(mtkMnr_(HVV<$W>}u@% -z>=?Ku*a+{COw>_%^zLWMdaDEj3oQrhiH)hwuhrSsKZ$2debh8t4sR`F8-5BL(25b^ -zB0TDVld>mJhM}FqvZJS2oV>&Hi`AT|rMfYAU(mHFT6Cz__fb1)tb{s*n{Fx1$MMbD?6!V*R8K(9-UWSYo`cw?_Z|SFqwE=9+LMUT5Gg3X1EL*(M8qvn9W5^# -z6B*_YI~V`yOx{Z15Fk8?m^2k`q`}X6$B}ApwEahjGUIBgN+WK6jxmO{nY)UZGeOMh -zQ05et5p$;ng_1ppJ(YetnSaC&dFj33&ZQK9rv7Mk5VxvdOS2KN#8Hyq(QPHus(!`h8#T2C -z2?H)nl`A-niT!GCCpgCAYi=gVmg+XbX6pWr6d#iYnG?@gY>^G2pzA`P&*@|YGUP&BGO5B3#lId*9HU>Q0o*& -zr?D{xQNM9>t19K~+^w*m>eU3e@#_;FGz!0BMI)Z2i(}AfxOFjwKEA(n__=<+&G>8X -zHre*>)fbLE_!sA?ctIPf2UPcE^y1zX92M)SB1gznIvdu6+O&bUyCqHTzGlIT0yRrO -zNOe0@S|Z5g4(1j;j}cT0CU+7W^!tG!VbUX?c1@_nxBK8;WCcQJw#agI{DplNU+ -z!{74(M)4Ww45}JDZ^?h_L-%40GzL$nx6Nv_4o2&Y;<@YgAniXOKKNTpahqECwBp$08I&KOr -zJwWg~E6=>%R#GC0u0a?XC#5H)QXJ}))_6DQfJk)K(W -z4z%8!)j#ZpkPHYksLxIFP~9(B6PkIuNu+cmym}QNJhNZlvAq38z$vpyh!` -z7oZE@^@Bmn1Ymi9><}7v2b_!p(BtkALo5mJ#dHE^>sdtww|*5%olQun8&sNC&QV|g -z^&n{g6G3rC{_JcWkVT9h;0g9^KdJCoI&4qP9M1ZRQ)NQ#Xnh$wyth8GlSc7ZUcjtIKZB(2Frsti;=o0_3H`ll^*o8E#K#8bss6+a2$HV*`-1<;Cr^ -zG4;y)t#i>|0=->@*BbpQR?!+Kwz{ymy_Hx(sd4|qAaXfGqYtN%P3j%vxlRjeR!Xw= -zt0&7UJQGmP(kPD$yA)_!_m0f8k#Pxbg~e#Es2AmN8h%T-<0favJW_88gM{k2O$q&mTBsbj)2>G5(I-&*rY%YutMRW6(>$R+W*Pr#{ -zdT!(M@M@j{B#Qk)@23re2!p6RgEc$k>;7Yl+Z$<+*W@kE;1mXrCFIeMsu6|}2gz|Fq1TlxGWL~EqxHu9(aYUnhp -z_S~q#MyfqrKOsFRhKGfwVUoVwvjOErA_Dg${Nn?A|&5|91Eal$gF&6WgnAr=JCy+z!6J -zB#ey9=hxrAEw#zWf4DjOd%crR1bg}r;4SZVAGHK0|0E1zGHP=>O$sGxX}6q~TXOG0 -zV#ZW$7fW*_6U<0lP8pJE@xqQH24HB{pvJC4bqAxU(h<@l?5m65qPq%FhcMD0v%=$5FkKm2gcLd3skTQ#^6%l8xsk -zFOOcj`34$(<7e#OR&r&BdL9`^YDkXa`5d)%>Ov|-CjQ$*-wM(6T~1x7yDW>Rp3JR?18#b{b> -zJSlk3Vwl6DNqMh7t9~?iY+YcL+aYx7;fmQTjeMmK(OQAEX0Jh)NGb8!reNp3?ZOHY -zkRi$#>{|Dg?vUcIS9Y3#4HerQk9H+qkh3gS>j`B -zVn@w0&s5KuBMX3r^DYe_H%ox*+x095XbM37*uvXcp~uZ4s>M-(kJV{0UnPds=AT^O -z+px3kw`eVqXI>dGs{eAP@ES}?{34qhB(vS{g@?IV4HEm9<0nR5(U>tV-D7Xz+2zGI>1nfm&_GOd1?P2%1~^EhgKCUju{0 -zQ@kdK-xFfM{dHmLnxSWsi;xh!5IulU_nvx-OJRe_to{T;;jJTKJuZoON`X;G_1$R| -z;x$E$4|iL_4SK~tJ2%|E+_~=MmnFM7*bR`W8H}mAL9jy_RaaAcer7OR);^1&_cx^u -zlN#Tc>qbKb?*ymR#VBrY!8JNFsBMz)oCl%YYGSI*cfB-bC-U?WZH$Bh$07*hLp*eL -z7oMkd04@;LIGFrNC0jPpD!0z(q!t7UD360-B7FyUBDx=BFpCjwp&;Hc(od8es-&8Y -zP-INljOQ_3-nlw|<8RP`_LpOo4RhneOvxMfZ$CSAl7?t$bpS(~YQ7b~PWPl0_|+}P -z>Gu4Hq+aGgS-|A96h9_dG2&GVO=PFQyY>E0q4njSh(H5T+lliV6~uwCC}Uz~s&QN6 -zmV|vKgN4^(h8N(#7D}V9bCgP|BH}_;hRltBG_|LnBjkL&URa*)TMJnY3Ux!SA1`Jo -zWiCrwmcf~J$i}?nDv=C?(GaT>cDuI3#y0~W`->}#mBOSs%Ljvc0_M0Sw~B$}lJyMB -zE$a#?&F+wryX5$(-4{%ybq3YPZx9g?8mSUIxrpkAbBePz7A1VrVDuzu`wvyg0Z^4r -zZDt4BZnsn-6shvrM6-O3iLQr9ldHTJ7d{p5V3RkNH(>@UEIea~ed`bXtmdkt95 -zrQ5_63YkuhT?Sa+HzEGhS596cbCiDRW`t+vJ7?K4=eN(xGMc+T-kB+T)hJfb-RIX) -zU}xmzkkslHrNdpSHEUx}Iur-&OY>73_pcG?mf#O6o5TTyWjA*yw4E#S81zoWkYeai -zlc!|knXOy2sE-*uWcXtLyn4w?WtaQ4j=0!Lls%?G?83|}n{*wy_wNk+z=58<7aMOd -z*~rMXcZ5@>6<`LngorTmh+JQ63O>1xWVCI(S!p{yjXzq8U1u+S;@M!}QjYwanlL>y -zYf)2i0t}geggMYod5bRLu7=w++L>6EZhy2Vorp~c?zk(C8LDBL7p@6nfRq;JPR}$2 -zy&&$95?%x^CcGf#0ZA=zD6ji|$%)|LCk3RuB!t!$|DXzCj_Ila(_aQ<&2$YD8bPCG -zQoA2Egem|+tn@rmW*>Qhk=ui=rp=A4A8=UZ6mc_S6rQS(A6`A -zL7E?};S^WiH+J54zPh%F1*_rib$)6}DQ#w()&ZaMJbfywLnvw>+)}q1y=^^Gv(z@5 -zM=d(IBs<9+M*AI7S+?QeOuOMY@&zMvWKb21ed%n7=k`!wRAVd0e}rCO&)m@BnR=QX -zqWjHuS15u>QtSAwWnKRD{{u14;wi5cpjBVZW`j6n>8~Z7a((&$rk~I}1J->m^hONi@wW=!cWRHr5 -zgKo%xI}kbuRXuD90B3+vZvN9rDM0B0$uw9m@J5r+a1#)kr+?I&;G^=vAbO+mds(eIsw@pcQ3+i?-mB+OdEAAbO%lILK10C-mFe&hVaR{&(oVC}0}nIN7|9P>?Cb+D-^F -z!^@LAc}Q3LN^M9n(2x*a-U% -zC2cHw!;6ZpNw{y=#ld#ks4Y)rPFCH_^ -za;MUH;7dE90h9VNE+em<-cBiDfTu0U3`{^B3499{7;e@$nBGS6V%;JOmQUhyO)(MA -zTT9I52gAgn3G8qA`Dv4~3K@|pL~azHJth}@vIy^UT0^SRDXU|a#L-uE4D0MLqd6Uj -zb)HE`H+cI}r^567WBi|#R7is)*2vfDremNeM_hX`%m2vY=5TBFZbX;2){$Vf;B9xk^kK;L!%|uohY9au54x@+zl}e2_?sq_e{S1wtSp$ -zzihF67t>+5aiaXjS#b4h(2KUD1l&lH;jJg2%o0q?UqqKAA4H8_1aebFbEbw>wnCT^ -zuGwg8Y=`e!f_J&ycVa;XBL8aMuQs=~48{w_ns{}Wz@`|z2w6Y9RsY`A33=A`LqDV3 -zJ``sOnP3hVKkl4zm>0*yKrMr2OB&B%YV9?zB8C5I%5OhMU%^pM!}_UcDxPNDdooO!Y -z1B95Y#EdIs8Jt(rz_a$}*=8?lq?*|({KSL<%g*f}lmaW1yiY4^M0tby@LL -z>}?}YnLn_MivR+wZHFh?1$kO}*(sl(NywWekI6)tzuwW#;{%(tg<_ -z0o0)x-|_udz3nJ_sV=j7=32IBL@sb``LE1eG7JWN9d~|KD~>rzg3*=rzkdOws*+r& -zirxa3cXpoHJ2vwIjKXEr=(OuKa8@G~5+aoiya<2ddJRSq)NdJ*uSn}hO^-YZ1&VwO -z;jdf)F2^EoBsLUff$SQRW3U+bJ|O03K;&PzJ8sy~bi2^evQJ@rvY|-=_r%aV$L#Co -zY4d`@Uz5hs0_tW~Xewc&KnzhAZDNl^5!gyk{#4&{Vnphv>*OY<+wyZszzaNeCBn*j`m -z3$MpO^C8GMloMX-RgpfhEUcb_8MzMi58GOv8S-KB(YJ>#yvGXuRXXUa_`i6AM=Ud5 -zn_<%vE7~S!_QO1lDEAq5AN6cJdrR%@zQSiUb{Y6?fB*GNt@16^o-h5Q(T*y^)7!vJ -zd^Pfo)>mHXnOrKtVK|kuQH$7 -z1h_g!h%9RR?}KHdpJ48u?8OYD&yDRUNapRa*^sK41C9=T7B1EWF0W(tvtB;4PUyPo -zt>QP%$|EV}=!hYiYz(SxWKj4`0pk^?;%I)o*7^eQm;P>MQ#GUHx19RsJ9BEJmpIC1 -zJN@9pNwFx0!QNF0t9|avEq%WzVx2Fbn7W5N+G+P~7&O_iF@F^0$JO^yB#(?e$2Ttj -zGNnbE2fPti<$98fqt2J3Pqppwbu}k|$8(nRE`rUT;ptg`u_+AG8Cq~G5mbT|e&Lht -z8w{|fdvm3lRXS79u_*q;$FvGuwQ-x05p3{Eoo!&&)p_%MdB}l+dReb3>%zX0wGV84 -z8)FtPW97-nhaB(!xX7zxD+DY7%cTCqx25u!Mqz=_)8W6m@TexiWs9&i{gImBs6i7y -z!iZN{onhv~3LLA(s}N(CacAo2c1ztO+;7?1$M`V}tz0RG3#4V8y2dcB!Ird#M(4{U -zxCSZPiXnFxA4VtJQxI!mVQ7)p#{F3Vx7XF01_l56EHR(`qsEUjweD)6@!?(#qM+h} -zrx=R&SQ=+^t7K1jMA|FP(m<{o9|$*cIOR^QyKA(+aQC2u`r5R)xuUCc`$J-!n;G~o -z^?-bP3e3qGGw^tgLqoA2T{wz1>dBWjG1>J7?zb`NQ+$OC$O`jDORq`Dk(2mA!4x`7 -ziw(BzUi-ymvFPBsbn{Uo7ovuUcxAYP2q -zOii?rvuS~)v#M^_%O(d}Ma$eJI;s*~5OEUSp@yfs4h6JV9ltj&Og^ph;{(s#@eo-A -zm(hzUj8jg%v;UsqSu3(eO4}}E`L{WKxd*fT>t}Ed6g~<2up`0u5vO9)BGjsCkcjt; -zO0f0OE~)Y^C}->k3hVUMLvs;$JJDYh1J5z~zwZu#a|M19mH&_b14zkONl)kpF~~ia -zLS=va6%pdFzscXiYuXOVBk&XMT=^Jp<_tzv^bJw4kyRzT9=HFuU8C>Xr)Z_p_b}*# -z?p%`#iS7u(5Pn_!xM_myzIro5uDR}GJRmdEcW71tal8XOCy&7BiP}2#?Fe@H0euI9 -zKtABU4ie`z^+(@r22>f2SFBpOs_gIbP5!I&b=*tQTsJ8<>0CCEJ8(|=?_GHwJceS~ -zpgAWF70CDT^SgOc=`z6#4?kG6m9X{r=_v|U$^DGeb+`4Tvi;dnWDljLxqTR#ZBW*{ -ztLRU-s_pe-{{u59>OO{YB`b%-Ju&sHJas7J!N8HoGO_)`=B>a-%iA~m0P?>#tJ+HL -z<%-bXPcuRev_f=-1AXaR;k~b(pu040@4sfc&t59Wx_|gLIa$==%{FDTQpzX#K8CE) -z0efg+3!f|_C34wu|5rwF9Hq)ST$m#IR`|_ij#9wsW~97hFZz9B|Kgg6^rE-lJ{XD~ -z-0(QC|1E_}0$WQCCBBX$

+ +### Access platform + +Click [product] - [IOT] - [enterprise IOT platform] + +![](media/AliyunCloud_IoT_210324_001.png) + +### Create instance + +![](media/AliyunCloud_IoT_210324_002.png) + +![](media/AliyunCloud_IoT_210324_002A.png) + +### Create product + +![](media/AliyunCloud_IoT_210324_003.png) + +### Add device + +![](media/AliyunCloud_IoT_210324_004.png) + +### Get triples + +The triple productkey, devicename and devicesecret are used to generate the connection password in the next step + +![](media/AliyunCloud_IoT_210324_005.png) + +![](media/AliyunCloud_IoT_210324_006.png) + +### Generate connection information + +Click download password generation widget + +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 is user-defined, which is generally the same name as devicename. It is used for mqtt connection. + +The encryption method should be consistent with that of mqtt connection. + +![](media/AliyunCloud_IoT_210324_007.png) + +After calculating the signature, you can obtain the password to connect to the platform. + +``` +CLIENT_ID = b'Chic_001|securemode=3,signmethod=hmacsha1|' +SERVER = b'a1llZotKkCm.iot-as-mqtt.cn-shanghai.aliyuncs.com' +PORT = 1883 +USER = b'Chic_001&a1llZotKkCm' +PASSWORD = b'EC01986E912222B0A82049A874AF183D0A490E5E' +``` + +**CLIENT_ ID: ** fixed format: \ ${ClientID} \ | securemode = 3, signmethod = hmacsha1\| + +Complete example: Chic_ 001\|securemode=3,signmethod=hmacsha1\| + +**User: ** fixed format: \ ${yourdevicename} & \ ${yourproductkey} + +Complete example: Chic_ 001&a1llZotKkCm + +**Password: ** is the string generated by the above tool + +**Port: ** fixed 1883 + +**Server: ** \ ${yourproductkey}. IOT as mqtt. \ ${yourregionid}. Aliyuncs.com, where: + +​ ${ Yourproductkey}: please replace with the productkey of the product to which the device belongs, which can be obtained from the device details page of the Internet of things platform console. + +​ ${ Yourregionid}: replace the region selected when creating the instance with your region ID. + +​ https://help.aliyun.com/document_detail/40654.html?spm=a2c4g.11186623.2.21.7b967908BJu7SZ + +![](media/AliyunCloud_IoT_210324_008.png) + +### Report and distribute data + +The topic name created above, such as test, can subscribe to the publication as long as the topic starts with test /. + +Example topic: / broadcast / a1llzotkcm / 123 + +![](media/AliyunCloud_IoT_210324_009.png) + +![](media/AliyunCloud_IoT_210324_010.png) + +## Software design + +​ After the aliyuncloud platform obtains the productkey, devicename and devicesecret, you can use aliyun suite to connect to the cloud platform. The address and port of the cloud platform are fixed. Therefore, after setting the corresponding connection information in the program, you can run the experiment. + +Example code: + +```python +import log +import utime +import checkNet +from aLiYun import aLiYun + +''' +The following two global variables are required. Users can modify the values of the following two global variables according to their actual projects, +The values of these two variables are printed before executing the user code. +''' +PROJECT_NAME = "QuecPython_AliYin_example" +PROJECT_VERSION = "1.0.0" +checknet = checkNet.CheckNetwork(PROJECT_NAME, PROJECT_VERSION) + + +#Set log output level +log.basicConfig(level=log.INFO) +aliYun_log = log.getLogger("ALiYun") + +productKey = "a1llZotKkCm" #Product identification (refer to Alibaba cloud application development guidance) +productSecret = None #Product key (this parameter is passed to none when using one machine and one password authentication. Please refer to Alibaba cloud application development guidance) +DeviceName = "11111" #Device name (refer to Alibaba Cloud Application Development Guide) +#Device key (use one type one secret authentication. This parameter is passed into none without pre registration. It is not supported temporarily. You need to create a device in the cloud first, and refer to Alibaba cloud application development guidance) +DeviceSecret = "03c5e91aea167edead7d381d4b41ed71" + +state = 1 + +#Callback function + + +def sub_cb(topic, msg): + global state + aliYun_log.info( + "Subscribe Recv: Topic={},Msg={}".format( + topic.decode(), msg.decode())) + state -= 1 + + +if __name__ == '__main__': + ''' +When running this routine manually, you can remove the delay. If you change the routine file name to main.py, you need to add the delay when you want to start up and run automatically, +Otherwise, the following poweron cannot be seen from the CDC port_ print_ Information printed in once() + ''' + utime.sleep(5) + checknet.poweron_print_once() + ''' +If the user program contains network related code, wait must be executed_ network_ Connected() wait for the network to be ready (dialing succeeded); +If it is a network independent code, you can mask the wait_ network_ connected() +[this routine must keep the following line!] + ''' + checknet.wait_network_connected() + + #Create aliyun connection object + ali = aLiYun(productKey, productSecret, DeviceName, DeviceSecret) + + #Set mqtt connection properties + clientID = b'11111clientID' #Custom characters (no more than 64) + ali.setMqtt(clientID, clean_session=False, keepAlive=300) + + #Set callback function + ali.setCallback(sub_cb) + topic = '/broadcast/a1llZotKkCm/123' #Cloud customized or self owned topics + #Subscribe to topics + ali.subscribe(topic) + #Release news + ali.publish(topic, "hello world") + #function + ali.start() + + while True: + if state: + pass + else: + ali.disconnect() + break +``` + +Next, you can download and verify. The Python code does not need to be compiled. You can directly download the. Py file to the module through the qpycom tool. + +## Download verification + +Download the. Py file to the module to run: + +![](media/AliyunCloud_IoT_210324_011.png) + +After downloading, manually let the script run. + +![](media/AliyunCloud_IoT_210324_012.png) + +## Matching code diff --git a/docs/Advanced_development/en/QuecPythonCloud/AmazonCloud.md b/docs/Advanced_development/en/QuecPythonCloud/AmazonCloud.md new file mode 100644 index 0000000000000000000000000000000000000000..6bec9a6c308bbc77c29fae9d4495fdd634a1a8a5 --- /dev/null +++ b/docs/Advanced_development/en/QuecPythonCloud/AmazonCloud.md @@ -0,0 +1,61 @@ +# Introduction to quecpthon Amazon cloud experiment + +​ This article mainly introduces how to use AWS IOT Amazon Internet of things cloud. AWS IOT provides cloud services and device support that can be used to implement IOT solutions. At the same time, it provides many cloud services to support IOT based applications. Users can access IOT devices and the functions provided by the cloud services connected to these devices. The following mainly explains the connection mode of mqtt. By reading this article, you will understand the process operation of quecpthon connecting AWS IOT and verify the experimental theory. + + + +## Cloud settings + +Amazon cloud homepage: https://amazonaws-china.com/cn/ + +#### [enter the platform] + +Click [my account] - [AWS management console] - [IOT core] + +![2](media/2.png) + +![1](media/1.png) + +![3](media/3.png) + +#### [create strategy] + +![4](media/4.png) + +![5](media/5.png) + +#### [create item] + +![6](media/6.png) + +![7](media/7.png) + +![8](media/8.png) + +![9](media/9.png) + +![10](media/10.png) + +![11](media/11.png) + +This completes the "create item". Connect the AWS IOT platform with a certificate. The same certificate can be used for multiple devices, and the client ID of different devices remains unique. + + + +#### [equipment communication] + +Obtain mqtt connection address and port of AWS server: + +![14](media/14.png) + +![15](media/15.png) + +Use the mqtt.fx tool to test the communication, and fill in "#" in the subscription topic column to receive all topics. + +![13](media/13.png) + +![12](media/12.png) + + + + diff --git a/docs/Advanced_development/en/QuecPythonCloud/HuaweiCloud.md b/docs/Advanced_development/en/QuecPythonCloud/HuaweiCloud.md new file mode 100644 index 0000000000000000000000000000000000000000..50cadd97452f05fa7dd00ae711f2d7e331461938 --- /dev/null +++ b/docs/Advanced_development/en/QuecPythonCloud/HuaweiCloud.md @@ -0,0 +1,246 @@ +# QuecPython accessing Huawei cloud + +The document mainly introduces how to use Huawei cloud. Huawei cloud device access service (iotda) is the Internet of things platform of Huawei cloud. It provides the capabilities of connecting massive devices to the cloud, two-way message communication between devices and the cloud, batch device management, remote control and monitoring, OTA upgrade, equipment linkage rules, and can flexibly transfer device data to other Huawei cloud services. + +The following mainly explains the mqtt connection mode of quecpthon. By reading this article, you will understand the process operation of quecpthon connecting Huawei cloud and verify the experimental theory. + +## Cloud settings + +Open Huawei cloud connection [www.huawei cloud. Com](http://www.huaweicloud.com) + +### Access platform + +Click [product] - [IOT Internet of things] - [device access to iotda] on the home page + +![](media/184cc27df7aaf8e51ff5fba33b354abe.png) + +### Create product + +Click [product] - [create product] + +![](media/437eefd54847b5780adc6b9c2c496544.png) + +Select mqtt for the "protocol type" of the product + +![](media/58e05991a4eddf591effea2642579f4a.png) + +### Add device + +Click [equipment] - [all equipment] + +> [https://console.huaweicloud.com/iotdm/?region=cn-north-4\#/dm-portal/device/all-device](https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-portal/device/all-device) + +![](media/ee306a4acca2ec6a25d90a026d6cff22.png) + +The [device ID] and [device key] automatically generated after registering the device are used to generate the information of the connection platform in the next step. + +![](media/178b3243bd5399776eaac723d81ce845.png) + +### Generate connection information + +Visit [here](https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/),填写[注册设备](https://support.huaweicloud.com/qs-iothub/iot_05_0006.html#ZH-CN_TOPIC_0251997880__li1261073102011)后生成的设备ID(DeviceId)和密钥(DeviceSecret),生成连接信息(ClientId、Username、Password)。 + + + +![](media/f51db8dc51ba6ae73375cbfe7f8b0063.png) + +``` +CLIENT_ID = b'5fbbb784b4ec2202e982e643_868540050954037_0_0_2021011909' + +SERVER = b'a15fbbd7ce.iot-mqtts.cn-north-4.myhuaweicloud.com' + +PORT = 1883 + +USER = b'5fbbb784b4ec2202e982e643_868540050954037' + +PASSWORD =b'8001a12405743199b3396943a2ed397286117a9ebab4f5dfda8dd6fafe341d94' +``` + +![IMG_256](media/744a99b28c9b15b0e515f4ce6b4e63a1.png) + +![IMG_256](media/ad674210c976e30f24d800bede396808.png)说明: + +For devices that do not support domain name access, execute "Ping" in the CMD command box +"Domain name" to obtain the IP address and use the IP address to access the platform. Because the IP address is not fixed, you need to make the IP address into a configurable item. + +a15fbbd7ce.iot-mqtts.cn-north-4.myhuaweicloud.com + +1883 + +Use the ClientID format generated by the generation tool. By default, the timestamp is not verified: device ID_ 0_ 0\_ Timestamp. + +-When the "hmacsha256" time stamp verification method is adopted, it will first verify whether the message time stamp is consistent with the platform time, and then judge whether the password is correct. + +-When "hmacsha256" does not check the timestamp, the authentication message must also have a timestamp, but it does not check whether the time is accurate, but only judge whether the password is correct. + +### Report data + +Fill in the interface address with "\ $OC / devices / {device"_ ID} / sys / properties / report ", for example," \ $OC / devices / 5e4e2e92ac-164aefa8fouquan1 / sys / properties / report ". + +![](media/bf41a9ad7dcf2bc0718496712c30dd72.png) + +\$oc/devices/{device_id}/sys/properties/report + +\$oc/devices/5fbbb784b4ec2202e982e643_868540050954037/sys/properties/report + +![](media/c919d92250a8d791e7b604d40a08d13d.png) + +### Distribute data + +The distributed data can only be requested through the API on the application side. + +URI + +Request method post + +URI /v5/iot/{project_id}/devices/{device_id}/messages + +Transport protocol HTTPS + +Description of distributed data: + + + +API debugging page: + + + +![](media/6928f54528bf7a8c7f9ad115db1520e4.png) + +Topic: \$oc/devices/{device_id}/sys/messages/down + +\$oc/devices/5fbbb784b4ec2202e982e643_1234567890123456789/sys/messages/down + +![](media/8b01f010e317cfd3129333709d60a514.png) + +## Software design + +After the Huawei cloud platform obtains ClientID, username and password, you can connect to the cloud platform through umqtt of quecpthon. The address and port of the cloud platform are fixed. Then you can write code experiments. + +Example code: + +```python +from umqtt import MQTTClient + +CLIENT_ID = b'5fbbb784b4ec2202e982e643_868540050954037_0_0_2021011909' + +SERVER = b'a15fbbd7ce.iot-mqtts.cn-north-4.myhuaweicloud.com' + +PORT = 1883 + +USER = b'5fbbb784b4ec2202e982e643_868540050954037' + +PASSWORD = b'8001a12405743199b3396943a2ed397286117a9ebab4f5dfda8dd6fafe341d94' + +DEVICE_ID = '5fbbb784b4ec2202e982e643_868540050954037' + +state = 0 + +def sub_cb(topic, msg): + + global state + + print( + + "Subscribe Recv: Topic={},Msg={}".format( + + topic.decode(), + + msg.decode())) + + state = 1 + +def MQTT_Init(): + + #Create an mqtt instance + + c = MQTTClient( + + client_id=CLIENT_ID, + + server=SERVER, + + port=PORT, + + user=USER, + + password=PASSWORD, + + keepalive=30) #You must keep alive = 30, otherwise you can't connect + + #Set message callback + + c.set_callback(sub_cb) + + #Establish connection + + c.connect() + + #Subscribe to topics + + c.subscribe('$oc/devices/{}/sys/messages/down'.format(DEVICE_ID)) + + msg = b'''{ + + "services": [{ + + "service_id": "WaterMeterControl", + + "properties": { + + "state": "T:15c, H: 85% " + + }, + + "event_time": "20151212T121212Z" + + } + + ] + + }''' + + #Release news + + c.publish('$oc/devices/{}/sys/properties/report'.format(DEVICE_ID), msg) + + while True: + + c.wait_msg() + + if state == 1: + + break + + #Close connection + + c.disconnect() + +def main(): + + MQTT_Init() + +if __name__ == "__main__": + + main() +``` + +Next, you can download and verify. The Python code does not need to be compiled. You can directly download the. Py file to the module through the qpycom tool. + +## Download verification + +Download the. Py file to the module to run: + +![](media/4f4a5ee0d3c9728fc3a5e1a0044c02d4.png) + +After downloading, manually let the script run. + +![](media/2dd7f1fa61d4861ddf3d5118b4d18a31.png) + +After sending the data, you can see the experimental results: + +![](media/38b2f5b0b684ffdd198d772baef2c946.png) + +## Matching code + + diff --git a/docs/Advanced_development/en/QuecPythonCloud/QuecCloud.md b/docs/Advanced_development/en/QuecPythonCloud/QuecCloud.md new file mode 100644 index 0000000000000000000000000000000000000000..dbfb4a00f7f75027e71fd7941637e5148d2198de --- /dev/null +++ b/docs/Advanced_development/en/QuecPythonCloud/QuecCloud.md @@ -0,0 +1,196 @@ +## Document history + +|** version ** date ** author ** change statement **| +| -------- | ---------- | -------- | ------------ | +|1.0 | 2021-04-30 | chic | initial version| + + + +## Platform settings + +Move far cloud home page:< http://iot-cloud.quectel.com/dashboard > + +### Access platform + +![image-20210429152213712](media\QuecPythonCloud_210430_01.png) + +### Create project + +Click to enter the R & D center and click create new project + +![image-20210430094256723](media\QuecPythonCloud_210430_02.png) + +Set project name: + +![image-20210429152734418](media\QuecPythonCloud_210430_03.png) + +### Create product + +In the created item table, click View product --> create product + +![image-20210430094646473](media\QuecPythonCloud_210430_04.png) + +Customize products according to requirements: + +Network connection mode selection: cellular mobile + +Data format: in case of Jason, interpret the data according to the function points of the object model; During transparent transmission, the data goes directly to the module as is and interprets the data by itself. + +![image-20210429160105700](media\QuecPythonCloud_210430_05.png) + +Click [next] to select the module model used by a product to facilitate product tracking and management. + +![image-20210429170536898](media\QuecPythonCloud_210430_06.png) + +After the product is created, you can see the new products: + +![image-20210429175540612](media\QuecPythonCloud_210430_07.png) + + + +### Definition object model + +Click product information --> function definition to add product functions according to your needs. Note: the serial number of "** function ID **" here is used in the code. + +![image-20210429175757844](media\QuecPythonCloud_210430_08.png) + + + +So far, the platform creation operation has been completed. + + + +### Certified equipment + +When the module is connected to the platform, the device will be automatically created and authenticated without adding the device manually. + +![image-20210429161558848](media\QuecPythonCloud_210430_09.png) + +There is no device at present, and the device list is empty. + +![image-20210429172733143](media\QuecPythonCloud_210430_10.png) + +### Get secret + +"R & D center" --> "view product" --> "product information" --> click [view], and productkey and productsecret will be sent to your registered mailbox for connecting to the platform. + +![image-20210429180045538](media\QuecPythonCloud_210430_11.png) + +![image-20210429171216156](media\QuecPythonCloud_210430_12.png) + +After obtaining the productkey and productsecret, you can use quecpthon code to connect to the platform. + +**Reminder: all operations are in the "R & D center"** + + + +## Software design + +Example code: + +```python +import quecIot +import quecTtlv + +key = "p1116T" #Fill in the product key +src = "bGpkVnordkFodFZj" #Fill in product key + +DEF_ ID_ Type = ['0', 'temperature', 'Humidity', 'light'] +DEF_DATA_TYPE0 = 'bool' +DEF_DATA_TYPE1 = 'num' +DEF_DATA_TYPE2 = 'byte' +DEF_DATA_TYPE3 = 'struct' +DEF_DATA_TYPE = [ + DEF_DATA_TYPE0, + DEF_DATA_TYPE1, + DEF_DATA_TYPE2, + DEF_DATA_TYPE3] +#0 Boolean +#1 value +# 2 Byt +#3 structure + + +class Quecthing: + def __init__(self): + #'' initialize qucsdk '' ' + quecIot.init() + #'' register event callback function '' ' + quecIot.setEventCB(self.eventCB) + #'' configure product information '' ' + quecIot.setProductinfo(key, src) + #'' configure server information, optional, default connection to mqtt production environment server '' ' + # quecIot.setServer(1, "http://iot-south.quectel.com:2883") + #'' configure PDP context ID, optional, default is 1 '' + # quecIot.setPdpContextId(1) + #'' configure lifetime. Optional. Mqtt defaults to 120 '' + # quecIot.setLifetime(120) + #'' configure external MCU ID number and version number. Optional. If there is no external MCU, you do not need to configure '' + # quecIot.setMcuVersion("MCU1", "1_0_0") + #'' start cloud platform connection '' ' + quecIot.setConnmode(1) + return + + @staticmethod + def eventCB(data): + print("event:", data) + + if 5 == data[0] and 10210 == data[1]: + data = data[2] + listret = quecTtlv.nodeGet(data) + print(listret) + listretlen = len(listret) + for i in range(listretlen): + id = listret[i][0] + type = listret[i][1] + if DEF_DATA_TYPE[type] == DEF_DATA_TYPE0: + ret = quecTtlv.idGetBool(data, id) + print(DEF_ID_TYPE[id], ret) + elif DEF_DATA_TYPE[type] == DEF_DATA_TYPE1: + ret = quecTtlv.idGetNum(data, id) + print(DEF_ID_TYPE[id], ret) + + +if __name__ == '__main__': + Quecthing() +``` + +Next, you can download and verify. The Python code does not need to be compiled. You can directly download the. Py file to the module through the qpycom tool. + +## Download verification + +Download the. Py file to the module to run: + +![image-20210429173115854](media\QuecPythonCloud_210430_13.png) + +After downloading, manually let the script run. + +![image-20210429174656611](media\QuecPythonCloud_210430_14.png) + +Return to the device management list of the device management platform: + +![image-20210429172813553](media\QuecPythonCloud_210430_15.png) + +A device is automatically added to the device list, which has been connected to the platform and authenticated. + +![image-20210429172700699](media\QuecPythonCloud_210430_16.png) + + + +## Distribute data + +The mobile IOT equipment management platform provides equipment debugging functions, + +![image-20210430093707367](media\QuecPythonCloud_210430_17.png) + +Enter the "equipment details" page, click [equipment debugging], see the debugging interface, change the data, and click [send command], and the module will receive the data. + +![image-20210430093737418](media\QuecPythonCloud_210430_18.png) + +After the module receives the data, explain it in the code, and the qpycom debugging tool is shown as follows: + +![image-20210429205539854](media\QuecPythonCloud_210430_19.png) + + + +## Matching code diff --git a/docs/Advanced_development/en/QuecPythonCloud/README.md b/docs/Advanced_development/en/QuecPythonCloud/README.md new file mode 100644 index 0000000000000000000000000000000000000000..82ec3b146d77ca95dc25fd28bedb3e7684829478 --- /dev/null +++ b/docs/Advanced_development/en/QuecPythonCloud/README.md @@ -0,0 +1,11 @@ +# QuecPython cloud service + +[quecpthon access to alicloud](/zh-cn/QuecPythonCloud/Aliyun.md) + +[quecpthon access to Tencent cloud](/zh-cn/QuecPythonCloud/TencentCloud.md) + +[QuecPython QuecCloud](/zh-cn/QuecPythonCloud/QuecCloud.md) + +[quecpthon Huawei cloud](/zh-cn/QuecPythonCloud/HuaweiCloud.md) + +[quecpthon Amazon cloud](/zh-cn/QuecPythonCloud/AmazonCloud.md) diff --git a/docs/Advanced_development/en/QuecPythonCloud/TencentCloud.md b/docs/Advanced_development/en/QuecPythonCloud/TencentCloud.md new file mode 100644 index 0000000000000000000000000000000000000000..93c5c99dda73b5aea744a07606e93d75aa42e642 --- /dev/null +++ b/docs/Advanced_development/en/QuecPythonCloud/TencentCloud.md @@ -0,0 +1,215 @@ +# QuecPython access to Tencent cloud + +The document mainly introduces how to use Tencent cloud Tencent cloud. Tencent cloud Internet of things hub (IOT hub) aims to provide a safe, stable and efficient connection platform to help developers quickly realize reliable and highly concurrent data communication between "device device", "device user application" and "device cloud service" at low cost. It can not only realize the interaction between devices, data reporting and configuration distribution of devices, but also connect with Tencent cloud products based on rule engine, so as to conveniently and quickly realize the storage, calculation and intelligent analysis of massive device data. The following mainly explains the connection mode of mqtt. By reading this article, you will understand the process operation of quecpthon connecting tencentcloud and verify the experimental theory. + +## Cloud settings + +Tencent cloud homepage:< https://cloud.tencent.com/ > + +### Access platform + +Click "console" in the upper left corner + +![](media/24a89c0909a160b38a301d4ca2876df9.png) + +Click "cloud products" -- "Internet of things communication" + +![](media/1416c8539a0b3d360a83a545da7788f4.png) + +### Create product + +Select "secret key authentication" in the "authentication method" when creating the product + +![](media/598f51f9cd2a03212a6db95152a3e840.png) + +### Add device + +![](media/cdb8eb0e42b3d0f64f6406a651073271.png) + +### Generate connection information + +![](media/474489294eb1eb48b202e8cc30882230.png) + +**Broker address: ** Guangzhou domain equipment fill in: product_ Id.iotcloud.tencentdevices.com, product here_ ID is a variable parameter. You need to fill in the product ID automatically generated when creating the product + +**Broker port: ** certificate authentication port: 8883; Key authentication type: 1883 + +``` +CLIENT_ID = b'X3Z30XABBU001' + +SERVER = b'X3Z30XABBU.iotcloud.tencentdevices.com' + +PORT = 1883 + +USER = b'X3Z30XABBU001;12010126;M8STP;1647306844' + +PASSWORD=b'e181d0cfaf5540c8e3f173a6e88efa1f3d34db2db7a9ff845aedc67f48d9d607;hmacsha256' +``` + + + +### Rule engine + +The rule engine is used for topic message forwarding + +![](media/06b02e9c78f1823acca37eb37a725377.png) + +![](media/c5a7283bc7b1752b03ecb85d32ca9418.png) + +### Filter data + +![](media/b47c7195c07ef6a35deecf2d120f0439.png) + +### Behavior operation + +The destination of the platform to topic message is set here + +![](media/0d84f9fc42466747b7c45e8b42a3c2c7.png) + +Fill in the variable \ ${devicename}, set the value of devicename in the payload of publishing topic, and the message will be forwarded to the corresponding topic, such as: device a subscribes to "x3z30xabbu / 001 / data"; B device publishes "{" devicename ":" 001 "," MSG ":" test publish "}", then the destination is "x3z30xabbu / \ ${devicename} / data" = "x3z30xabbu / 001 / data"; A device receives data. + +### Report and distribute data + +Device theme format: x3z30xabbu / \ ${devicename} / data + +The published message content must contain "devicename": "001" before the message can be forwarded to the topic "x3z30xabbu / 001 / data". + +For example: {"devicename": "001", "MSG": "test publish"} " + +![](media/c0c93c45631fe7577ebb26031461ec10.png) + +![](media/c9cd162f304fac476fe198c32b5b912e.png) + +![](media/ad7ae354e1ce677edab9f54818878657.png) + +## Software design + +After the queicloud platform obtains the connection information, you can connect to the cloud platform in umqtt. The address and port of the cloud platform are fixed. Therefore, after setting the value of the connection information in the program, you can run the experiment. + +Example code: + +```python +CLIENT_ID = b'X3Z30XABBU001' + +SERVER = b'X3Z30XABBU.iotcloud.tencentdevices.com' + +PORT = 1883 + +USER = b'X3Z30XABBU001;12010126;M8STP;1647306844' + +PASSWORD=b'e181d0cfaf5540c8e3f173a6e88efa1f3d34db2db7a9ff845aedc67f48d9d607;hmacsha256' + +IMEI = None # modem.getDevImei() + +SUB_TOPIC = 'X3Z30XABBU/{}/data' + +PUB_TOPIC = SUB_TOPIC + +def GetDevImei(): + + global IMEI + + # IMEI = modem.getDevImei() + + IMEI= '001' + + print(IMEI) + +state = 0 + +def sub\_cb(topic, msg): + + global state + + print( + + "Subscribe Recv: Topic={},Msg={}".format( + + topic.decode(), + + msg.decode())) + + state = 1 + +def MQTT_Init(): + + #Create an mqtt instance + + c = MQTTClient( + + client_id=CLIENT_ID, + + server=SERVER, + + port=PORT, + + user=USER, + + password=PASSWORD, + + keepalive=30) #You must keep alive = 30, otherwise you can't connect + + #Set message callback + + c.set_callback(sub_cb) + + #Establish connection + + try: + + c.connect() + + except Exception as e: + + print('!!!,e=%s' % e) + + # c.connect() + + #Subscribe to topics + + c.subscribe(SUB_TOPIC.format(IMEI)) + + #Release news + + Payload = '{"DeviceName":"{}","msg":"test publish"}'.format(IMEI) + + c.publish(PUB_TOPIC.format(IMEI), Payload) + + while True: + + c.wait_msg() + + if state == 1: + + break + + #Close connection + + c.disconnect() + +def main(): + + GetDevImei() + + MQTT_Init() + +if __name__ == "__main__": + + main() +``` + +Next, you can download and verify. The Python code does not need to be compiled. You can directly download the. Py file to the module through the qpycom tool. + +## Download verification + +Download the. Py file to the module to run: + +![](media/c6405128fd86e2502ab214141b264435.png) + +After downloading, manually let the script run. + +![](media/155611da8af10b8e913850f238390899.png) + +## Matching code + + diff --git "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\233\276\347\211\207/example_display_image.py" b/docs/Advanced_development/en/QuecPythonCloud/code/AliyunCloud_IoT.py similarity index 34% rename from "docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\233\276\347\211\207/example_display_image.py" rename to docs/Advanced_development/en/QuecPythonCloud/code/AliyunCloud_IoT.py index 77020b5c7ea7ff9d1de8e6341dc136677f8c7480..9f3908c7f61f49da9e276529c182df61beeeb287 100644 --- "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\233\276\347\211\207/example_display_image.py" +++ b/docs/Advanced_development/en/QuecPythonCloud/code/AliyunCloud_IoT.py @@ -1,49 +1,75 @@ -# -*- coding: UTF-8 -*- - - -import utime - -''' -如果用户使用的固件版本中没有checkNet库,请将checkNet.mpy文件上传到模块的usr目录, -并将 import checkNet 改为 from usr import checkNet -''' -import checkNet -from usr import st7789v -from usr import image - - -''' -下面两个全局变量是必须有的,用户可以根据自己的实际项目修改下面两个全局变量的值, -在执行用户代码前,会先打印这两个变量的值。 -''' -PROJECT_NAME = "QuecPython_ST7789V_LCD_Example" -PROJECT_VERSION = "1.0.0" - -checknet = checkNet.CheckNetwork(PROJECT_NAME, PROJECT_VERSION) -lcd_st7789v = st7789v.ST7789V(240, 240) - - -if __name__ == '__main__': - ''' - 手动运行本例程时,可以去掉该延时,如果将例程文件名改为main.py,希望开机自动运行时,需要加上该延时, - 否则无法从CDC口看到下面的 poweron_print_once() 中打印的信息 - ''' - # utime.sleep(5) - checknet.poweron_print_once() - - ''' - 如果用户程序包含网络相关代码,必须执行 wait_network_connected() 等待网络就绪(拨号成功); - 如果是网络无关代码,可以屏蔽 wait_network_connected() - ''' - # checknet.wait_network_connected() - - # 用户代码 - '''######################【User code star】###################################################''' - - ''' - 要显示的图片像素为 99*100,下面设置显示图片的起始坐标位置为(70,70) - 要注意:显示图片时,最后两个参数传入的是图片大小,即宽高,不是终点坐标 - ''' - lcd_st7789v.lcd_show_image(image.image_buf, 70, 70, 99, 100) - - '''######################【User code end 】###################################################''' + +import log +import utime +import checkNet +from aLiYun import aLiYun + +''' +下面两个全局变量是必须有的,用户可以根据自己的实际项目修改下面两个全局变量的值, +在执行用户代码前,会先打印这两个变量的值。 +''' +PROJECT_NAME = "QuecPython_AliYin_example" +PROJECT_VERSION = "1.0.0" +checknet = checkNet.CheckNetwork(PROJECT_NAME, PROJECT_VERSION) + + +# 设置日志输出级别 +log.basicConfig(level=log.INFO) +aliYun_log = log.getLogger("ALiYun") + +productKey = "a1llZotKkCm" # 产品标识(参照阿里云应用开发指导) +productSecret = None # 产品密钥(使用一机一密认证时此参数传入None,参照阿里云应用开发指导) +DeviceName = "11111" # 设备名称(参照阿里云应用开发指导) +# 设备密钥(使用一型一密认证此参数传入None,免预注册暂不支持,需先在云端创建设备,参照阿里云应用开发指导) +DeviceSecret = "03c5e91aea167edead7d381d4b41ed71" + +state = 1 + +# 回调函数 + + +def sub_cb(topic, msg): + global state + aliYun_log.info( + "Subscribe Recv: Topic={},Msg={}".format( + topic.decode(), msg.decode())) + state -= 1 + + +if __name__ == '__main__': + ''' + 手动运行本例程时,可以去掉该延时,如果将例程文件名改为main.py,希望开机自动运行时,需要加上该延时, + 否则无法从CDC口看到下面的 poweron_print_once() 中打印的信息 + ''' + utime.sleep(5) + checknet.poweron_print_once() + ''' + 如果用户程序包含网络相关代码,必须执行 wait_network_connected() 等待网络就绪(拨号成功); + 如果是网络无关代码,可以屏蔽 wait_network_connected() + 【本例程必须保留下面这一行!】 + ''' + checknet.wait_network_connected() + + # 创建aliyun连接对象 + ali = aLiYun(productKey, productSecret, DeviceName, DeviceSecret) + + # 设置mqtt连接属性 + clientID = b'11111clientID' # 自定义字符(不超过64) + ali.setMqtt(clientID, clean_session=False, keepAlive=300) + + # 设置回调函数 + ali.setCallback(sub_cb) + topic = '/broadcast/a1llZotKkCm/123' # 云端自定义或自拥有的Topic + # 订阅主题 + ali.subscribe(topic) + # 发布消息 + ali.publish(topic, "hello world") + # 运行 + ali.start() + + while True: + if state: + pass + else: + ali.disconnect() + break diff --git a/docs/Advanced_development/en/QuecPythonCloud/code/HuaweiCloud.py b/docs/Advanced_development/en/QuecPythonCloud/code/HuaweiCloud.py new file mode 100644 index 0000000000000000000000000000000000000000..23bc8d6fab5103da0d9866a9934f3c4b8b83d82e --- /dev/null +++ b/docs/Advanced_development/en/QuecPythonCloud/code/HuaweiCloud.py @@ -0,0 +1,71 @@ +# 实验1: HuaweiCloud 实验 +# API资料参考连接: https://python.quectel.com/wiki/api/#umqtt-mqtt + + +from umqtt import MQTTClient + +CLIENT_ID = b'5fbbb784b4ec2202e982e643_868540050954037_0_0_2021011909' +SERVER = b'a15fbbd7ce.iot-mqtts.cn-north-4.myhuaweicloud.com' +PORT = 1883 +USER = b'5fbbb784b4ec2202e982e643_868540050954037' +PASSWORD = b'8001a12405743199b3396943a2ed397286117a9ebab4f5dfda8dd6fafe341d94' + +DEVICE_ID = '5fbbb784b4ec2202e982e643_868540050954037' + +state = 0 + + +def sub_cb(topic, msg): + global state + print( + "Subscribe Recv: Topic={},Msg={}".format( + topic.decode(), + msg.decode())) + state = 1 + + +def MQTT_Init(): + # 创建一个mqtt实例 + c = MQTTClient( + client_id=CLIENT_ID, + server=SERVER, + port=PORT, + user=USER, + password=PASSWORD, + keepalive=30) # 必须要 keepalive=30 ,否则连接不上 + # 设置消息回调 + c.set_callback(sub_cb) + # 建立连接 + c.connect() + # 订阅主题 + c.subscribe('$oc/devices/{}/sys/messages/down'.format(DEVICE_ID)) + + msg = b'''{ + "services": [{ + "service_id": "WaterMeterControl", + "properties": { + "state": "T:15c, H: 85% " + }, + "event_time": "20151212T121212Z" + } + ] + }''' + + # 发布消息 + c.publish('$oc/devices/{}/sys/properties/report'.format(DEVICE_ID), msg) + + while True: + c.wait_msg() + if state == 1: + break + + # 关闭连接 + c.disconnect() + + +def main(): + MQTT_Init() + + +if __name__ == "__main__": + main() diff --git a/docs/Advanced_development/en/QuecPythonCloud/code/QuecIoTCloud.py b/docs/Advanced_development/en/QuecPythonCloud/code/QuecIoTCloud.py new file mode 100644 index 0000000000000000000000000000000000000000..751dcd08f368f85ddce664f904e34ab643e4bbb2 --- /dev/null +++ b/docs/Advanced_development/en/QuecPythonCloud/code/QuecIoTCloud.py @@ -0,0 +1,64 @@ +import quecIot +import quecTtlv + +key = "p1116T" # 填入产品key +src = "bGpkVnordkFodFZj" # 填入产品密钥 + +DEF_ID_TYPE = ['0', '温度', '湿度', '光照'] +DEF_DATA_TYPE0 = 'bool' +DEF_DATA_TYPE1 = 'num' +DEF_DATA_TYPE2 = 'byte' +DEF_DATA_TYPE3 = 'struct' +DEF_DATA_TYPE = [ + DEF_DATA_TYPE0, + DEF_DATA_TYPE1, + DEF_DATA_TYPE2, + DEF_DATA_TYPE3] +# 0 布尔 +# 1 数值 +# 2 Byt +# 3 结构体 + + +class Quecthing: + def __init__(self): + # ''' 初始化qucsdk ''' + quecIot.init() + # ''' 注册事件回调函数 ''' + quecIot.setEventCB(self.eventCB) + # ''' 配置产品信息''' + quecIot.setProductinfo(key, src) + # ''' 配置服务器信息,可选,默认连接MQTT生产环境服务器 ''' + # quecIot.setServer(1, "http://iot-south.quectel.com:2883") + # ''' 配置PDP context Id,可选,默认为1 ''' + # quecIot.setPdpContextId(1) + # ''' 配置lifetime,可选,MQTT默认为120 ''' + # quecIot.setLifetime(120) + # ''' 配置外部MCU标识号和版本号,可选,如没有外部MCU则不需要配置 ''' + # quecIot.setMcuVersion("MCU1", "1_0_0") + # ''' 启动云平台连接 ''' + quecIot.setConnmode(1) + return + + @staticmethod + def eventCB(data): + print("event:", data) + + if 5 == data[0] and 10210 == data[1]: + data = data[2] + listret = quecTtlv.nodeGet(data) + print(listret) + listretlen = len(listret) + for i in range(listretlen): + id = listret[i][0] + type = listret[i][1] + if DEF_DATA_TYPE[type] == DEF_DATA_TYPE0: + ret = quecTtlv.idGetBool(data, id) + print(DEF_ID_TYPE[id], ret) + elif DEF_DATA_TYPE[type] == DEF_DATA_TYPE1: + ret = quecTtlv.idGetNum(data, id) + print(DEF_ID_TYPE[id], ret) + + +if __name__ == '__main__': + Quecthing() diff --git a/docs/Advanced_development/en/QuecPythonCloud/code/TencentCloud.py b/docs/Advanced_development/en/QuecPythonCloud/code/TencentCloud.py new file mode 100644 index 0000000000000000000000000000000000000000..27fb262781ead47a78c7d4e2928a477c556449be --- /dev/null +++ b/docs/Advanced_development/en/QuecPythonCloud/code/TencentCloud.py @@ -0,0 +1,77 @@ +# 实验1: TencentCloud 实验 +# API资料参考连接: https://python.quectel.com/wiki/api/#umqtt-mqtt + + +from umqtt import MQTTClient +import modem + +CLIENT_ID = b'X3Z30XABBU001' +SERVER = b'X3Z30XABBU.iotcloud.tencentdevices.com' +PORT = 1883 +USER = b'X3Z30XABBU001;12010126;M8STP;1647306844' +PASSWORD = b'e181d0cfaf5540c8e3f173a6e88efa1f3d34db2db7a9ff845aedc67f48d9d607;hmacsha256' + +IMEI = None # modem.getDevImei() +SUB_TOPIC = 'X3Z30XABBU/{}/data' +PUB_TOPIC = SUB_TOPIC + + +def GetDevImei(): + global IMEI + # IMEI = modem.getDevImei() + IMEI= '001' + print(IMEI) + + +state = 0 + + +def sub_cb(topic, msg): + global state + print( + "Subscribe Recv: Topic={},Msg={}".format( + topic.decode(), + msg.decode())) + state = 1 + + +def MQTT_Init(): + # 创建一个mqtt实例 + c = MQTTClient( + client_id=CLIENT_ID, + server=SERVER, + port=PORT, + user=USER, + password=PASSWORD, + keepalive=30) # 必须要 keepalive=30 ,否则连接不上 + # 设置消息回调 + c.set_callback(sub_cb) + # 建立连接 + try: + c.connect() + except Exception as e: + print('!!!,e=%s' % e) + return + # c.connect() + # 订阅主题 + c.subscribe(SUB_TOPIC.format(IMEI)) + # 发布消息 + Payload = '{"DeviceName":"{}","msg":"test publish"}'.format(IMEI) + c.publish(PUB_TOPIC.format(IMEI), Payload) + + while True: + c.wait_msg() + if state == 1: + break + + # 关闭连接 + c.disconnect() + + +def main(): + GetDevImei() + MQTT_Init() + + +if __name__ == "__main__": + main() diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/00e8249a6f31097d6f644a540787cf16.png b/docs/Advanced_development/en/QuecPythonCloud/media/00e8249a6f31097d6f644a540787cf16.png new file mode 100644 index 0000000000000000000000000000000000000000..c2b9341c1d88f306decb80b5f374390c9af14159 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/00e8249a6f31097d6f644a540787cf16.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/01d0bcf1fbf597194344c90c7b58e995.png b/docs/Advanced_development/en/QuecPythonCloud/media/01d0bcf1fbf597194344c90c7b58e995.png new file mode 100644 index 0000000000000000000000000000000000000000..3a8f4368fa1cdf5c9c562a273d729e1ffcdcb6a9 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/01d0bcf1fbf597194344c90c7b58e995.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/06b02e9c78f1823acca37eb37a725377.png b/docs/Advanced_development/en/QuecPythonCloud/media/06b02e9c78f1823acca37eb37a725377.png new file mode 100644 index 0000000000000000000000000000000000000000..8cce881e8de7896ad5ef328974384c371bad8d5c Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/06b02e9c78f1823acca37eb37a725377.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/0c60712858d58b38683613fbb697dd03.png b/docs/Advanced_development/en/QuecPythonCloud/media/0c60712858d58b38683613fbb697dd03.png new file mode 100644 index 0000000000000000000000000000000000000000..f89636900d30bae00ab5ff3f44c14eb7591f42ac Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/0c60712858d58b38683613fbb697dd03.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/0d84f9fc42466747b7c45e8b42a3c2c7.png b/docs/Advanced_development/en/QuecPythonCloud/media/0d84f9fc42466747b7c45e8b42a3c2c7.png new file mode 100644 index 0000000000000000000000000000000000000000..4fd8ec85b1511dce6518093d2c656094f8ee8b7b Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/0d84f9fc42466747b7c45e8b42a3c2c7.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/0d9c74f77ca83805912f29392d23cf08.png b/docs/Advanced_development/en/QuecPythonCloud/media/0d9c74f77ca83805912f29392d23cf08.png new file mode 100644 index 0000000000000000000000000000000000000000..1b315182fafd33bdd89e5ba6e740b29fb38df821 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/0d9c74f77ca83805912f29392d23cf08.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/1.png b/docs/Advanced_development/en/QuecPythonCloud/media/1.png new file mode 100644 index 0000000000000000000000000000000000000000..d0e6381512ac74878ef80a0e941fb78ff3fbc812 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/1.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/10.png b/docs/Advanced_development/en/QuecPythonCloud/media/10.png new file mode 100644 index 0000000000000000000000000000000000000000..395a9176f8e3f9e939616fd42e4604d81c6d4d84 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/10.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/11.png b/docs/Advanced_development/en/QuecPythonCloud/media/11.png new file mode 100644 index 0000000000000000000000000000000000000000..fedc518e47091a91fa4dddf768b40f24ddc50cdd Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/11.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/12.png b/docs/Advanced_development/en/QuecPythonCloud/media/12.png new file mode 100644 index 0000000000000000000000000000000000000000..da0e93167b0be9269b18fdf709325db2822c80bd Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/12.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/13.png b/docs/Advanced_development/en/QuecPythonCloud/media/13.png new file mode 100644 index 0000000000000000000000000000000000000000..9cdea6e45f0dd590284eb192340a44a3850ae743 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/13.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/14.png b/docs/Advanced_development/en/QuecPythonCloud/media/14.png new file mode 100644 index 0000000000000000000000000000000000000000..2615399d47b78a9f9cf0982410b552d45ab09cd5 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/14.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/1416c8539a0b3d360a83a545da7788f4.png b/docs/Advanced_development/en/QuecPythonCloud/media/1416c8539a0b3d360a83a545da7788f4.png new file mode 100644 index 0000000000000000000000000000000000000000..d9a17a43beb7cbe5c93e6b2c23d9201efc02c186 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/1416c8539a0b3d360a83a545da7788f4.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/15.png b/docs/Advanced_development/en/QuecPythonCloud/media/15.png new file mode 100644 index 0000000000000000000000000000000000000000..4c4017d127e1c356bb9f6331485b39d638e5c848 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/15.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/155611da8af10b8e913850f238390899.png b/docs/Advanced_development/en/QuecPythonCloud/media/155611da8af10b8e913850f238390899.png new file mode 100644 index 0000000000000000000000000000000000000000..ceb540e833b0abc7a4361b041dc212c30bbcb057 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/155611da8af10b8e913850f238390899.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/178b3243bd5399776eaac723d81ce845.png b/docs/Advanced_development/en/QuecPythonCloud/media/178b3243bd5399776eaac723d81ce845.png new file mode 100644 index 0000000000000000000000000000000000000000..fc2d09cab274976edc9787de1a67b2f09b603f01 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/178b3243bd5399776eaac723d81ce845.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/184cc27df7aaf8e51ff5fba33b354abe.png b/docs/Advanced_development/en/QuecPythonCloud/media/184cc27df7aaf8e51ff5fba33b354abe.png new file mode 100644 index 0000000000000000000000000000000000000000..116e135897e5d13c552cb5585082407fa21a3ba8 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/184cc27df7aaf8e51ff5fba33b354abe.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/2.png b/docs/Advanced_development/en/QuecPythonCloud/media/2.png new file mode 100644 index 0000000000000000000000000000000000000000..813d35c1b3a291132384fd2830f61d0e4ba4dd27 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/2.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/20cb75f8677c6c8c4f54642e400036d9.png b/docs/Advanced_development/en/QuecPythonCloud/media/20cb75f8677c6c8c4f54642e400036d9.png new file mode 100644 index 0000000000000000000000000000000000000000..79c59673e1f20f6a51145a2caefdda17a2d2ee4a Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/20cb75f8677c6c8c4f54642e400036d9.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/21a2c497d167773be8850aa506d34eb9.png b/docs/Advanced_development/en/QuecPythonCloud/media/21a2c497d167773be8850aa506d34eb9.png new file mode 100644 index 0000000000000000000000000000000000000000..adde3dab1e8a572c9f82fa748cbf5cbc2920ffef Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/21a2c497d167773be8850aa506d34eb9.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/24a89c0909a160b38a301d4ca2876df9.png b/docs/Advanced_development/en/QuecPythonCloud/media/24a89c0909a160b38a301d4ca2876df9.png new file mode 100644 index 0000000000000000000000000000000000000000..bca31f7c3d9c355a025b55dcf44e9402320b7b4b Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/24a89c0909a160b38a301d4ca2876df9.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/2dd7f1fa61d4861ddf3d5118b4d18a31.png b/docs/Advanced_development/en/QuecPythonCloud/media/2dd7f1fa61d4861ddf3d5118b4d18a31.png new file mode 100644 index 0000000000000000000000000000000000000000..5774b0d47181b9ab376ea730525200678ac12560 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/2dd7f1fa61d4861ddf3d5118b4d18a31.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/3.png b/docs/Advanced_development/en/QuecPythonCloud/media/3.png new file mode 100644 index 0000000000000000000000000000000000000000..d14144b6b22f27473e52951c87ed859dde192c5c Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/3.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/33a7f4fd4ea75b78b264ea78eaa1c2e6.png b/docs/Advanced_development/en/QuecPythonCloud/media/33a7f4fd4ea75b78b264ea78eaa1c2e6.png new file mode 100644 index 0000000000000000000000000000000000000000..6abf2331a35fa03d8cfec6deb73174e6dc059146 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/33a7f4fd4ea75b78b264ea78eaa1c2e6.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/38b2f5b0b684ffdd198d772baef2c946.png b/docs/Advanced_development/en/QuecPythonCloud/media/38b2f5b0b684ffdd198d772baef2c946.png new file mode 100644 index 0000000000000000000000000000000000000000..d3033cb5a4e7d459a875b2e133c5194127ac4d21 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/38b2f5b0b684ffdd198d772baef2c946.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/4.png b/docs/Advanced_development/en/QuecPythonCloud/media/4.png new file mode 100644 index 0000000000000000000000000000000000000000..8bb158e663f68649cdfbbb04e5a930044b37c730 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/4.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/40eb66200d1d4ad0090a1786f8d27579.png b/docs/Advanced_development/en/QuecPythonCloud/media/40eb66200d1d4ad0090a1786f8d27579.png new file mode 100644 index 0000000000000000000000000000000000000000..f9a3dbe26273cde1fd45b98926e942ca88474abc Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/40eb66200d1d4ad0090a1786f8d27579.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/437eefd54847b5780adc6b9c2c496544.png b/docs/Advanced_development/en/QuecPythonCloud/media/437eefd54847b5780adc6b9c2c496544.png new file mode 100644 index 0000000000000000000000000000000000000000..a3184158813ec1d9242e0f83ad4291d76850da2c Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/437eefd54847b5780adc6b9c2c496544.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/440b41bd014245ad52d9f4680babcbac.png b/docs/Advanced_development/en/QuecPythonCloud/media/440b41bd014245ad52d9f4680babcbac.png new file mode 100644 index 0000000000000000000000000000000000000000..63458ce91ca7f41149692be67b05d6143910a21f Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/440b41bd014245ad52d9f4680babcbac.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/474489294eb1eb48b202e8cc30882230.png b/docs/Advanced_development/en/QuecPythonCloud/media/474489294eb1eb48b202e8cc30882230.png new file mode 100644 index 0000000000000000000000000000000000000000..c49c08787ea4e11db0efba87b1f438861f156be9 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/474489294eb1eb48b202e8cc30882230.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/4f4a5ee0d3c9728fc3a5e1a0044c02d4.png b/docs/Advanced_development/en/QuecPythonCloud/media/4f4a5ee0d3c9728fc3a5e1a0044c02d4.png new file mode 100644 index 0000000000000000000000000000000000000000..fe0281c7abc524584e5fe2ac5f7cccb55cc53fe2 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/4f4a5ee0d3c9728fc3a5e1a0044c02d4.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/5.png b/docs/Advanced_development/en/QuecPythonCloud/media/5.png new file mode 100644 index 0000000000000000000000000000000000000000..310681b5213a39746f719144a85630df9f7389c9 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/5.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/56bc1e7957122a00bd028918c3bb5d18.png b/docs/Advanced_development/en/QuecPythonCloud/media/56bc1e7957122a00bd028918c3bb5d18.png new file mode 100644 index 0000000000000000000000000000000000000000..eaf88691e868934c105f1ea361b08e18ab054077 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/56bc1e7957122a00bd028918c3bb5d18.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/579f0beb67f1e0a7daa16ff000d6b33d.png b/docs/Advanced_development/en/QuecPythonCloud/media/579f0beb67f1e0a7daa16ff000d6b33d.png new file mode 100644 index 0000000000000000000000000000000000000000..780e66ef99524c186709290402d6db948be8b416 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/579f0beb67f1e0a7daa16ff000d6b33d.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/58e05991a4eddf591effea2642579f4a.png b/docs/Advanced_development/en/QuecPythonCloud/media/58e05991a4eddf591effea2642579f4a.png new file mode 100644 index 0000000000000000000000000000000000000000..593edb06dc739392e1287e27d3d562ecf611391f Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/58e05991a4eddf591effea2642579f4a.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/598f51f9cd2a03212a6db95152a3e840.png b/docs/Advanced_development/en/QuecPythonCloud/media/598f51f9cd2a03212a6db95152a3e840.png new file mode 100644 index 0000000000000000000000000000000000000000..18f747eb1f19a4d70f8a8209f03b8a8a527a3aa3 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/598f51f9cd2a03212a6db95152a3e840.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/5cb4cffb7b4e9f1d2464ee487f5f1544.png b/docs/Advanced_development/en/QuecPythonCloud/media/5cb4cffb7b4e9f1d2464ee487f5f1544.png new file mode 100644 index 0000000000000000000000000000000000000000..9b15b3874eda4eaeb622585a4d09ee27b7e64b62 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/5cb4cffb7b4e9f1d2464ee487f5f1544.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/6.png b/docs/Advanced_development/en/QuecPythonCloud/media/6.png new file mode 100644 index 0000000000000000000000000000000000000000..a4c7bbc2dc7904a5cf6d101d923eafbfcef61d4c Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/6.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/642222a1f350d8d00ea7df18a97d1da9.png b/docs/Advanced_development/en/QuecPythonCloud/media/642222a1f350d8d00ea7df18a97d1da9.png new file mode 100644 index 0000000000000000000000000000000000000000..ea0ee61503aa4669bffc1108b518336db1ffc86e Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/642222a1f350d8d00ea7df18a97d1da9.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/6928f54528bf7a8c7f9ad115db1520e4.png b/docs/Advanced_development/en/QuecPythonCloud/media/6928f54528bf7a8c7f9ad115db1520e4.png new file mode 100644 index 0000000000000000000000000000000000000000..d8530ddb48142490b6b0fec199e2c9355f6745e8 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/6928f54528bf7a8c7f9ad115db1520e4.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/7.png b/docs/Advanced_development/en/QuecPythonCloud/media/7.png new file mode 100644 index 0000000000000000000000000000000000000000..d7b11a1ac6f3478d6a97dc6d1b3083c8fda4bfa5 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/7.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/7404fb362b289bcd55a5d50aa25c8546.png b/docs/Advanced_development/en/QuecPythonCloud/media/7404fb362b289bcd55a5d50aa25c8546.png new file mode 100644 index 0000000000000000000000000000000000000000..67adda1ced914156855e4b0a540f731fc8177164 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/7404fb362b289bcd55a5d50aa25c8546.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/744a99b28c9b15b0e515f4ce6b4e63a1.png b/docs/Advanced_development/en/QuecPythonCloud/media/744a99b28c9b15b0e515f4ce6b4e63a1.png new file mode 100644 index 0000000000000000000000000000000000000000..8adf3b3f1c6958c634e1a049de9bf76c28060280 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/744a99b28c9b15b0e515f4ce6b4e63a1.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/7d97c96182cd7cba909f2f8110af2195.png b/docs/Advanced_development/en/QuecPythonCloud/media/7d97c96182cd7cba909f2f8110af2195.png new file mode 100644 index 0000000000000000000000000000000000000000..b49a5d4b6956e71e61d6d96a44040ac8e2175cb7 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/7d97c96182cd7cba909f2f8110af2195.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/8.png b/docs/Advanced_development/en/QuecPythonCloud/media/8.png new file mode 100644 index 0000000000000000000000000000000000000000..c7b5c51fbc627a0b5a397eb89dd3bc325768d0e4 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/8.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/88b354fa6b1122bc4eae448106fdb35e.png b/docs/Advanced_development/en/QuecPythonCloud/media/88b354fa6b1122bc4eae448106fdb35e.png new file mode 100644 index 0000000000000000000000000000000000000000..6ca33a88b240676c41afc08666470023fd605a31 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/88b354fa6b1122bc4eae448106fdb35e.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/8b01f010e317cfd3129333709d60a514.png b/docs/Advanced_development/en/QuecPythonCloud/media/8b01f010e317cfd3129333709d60a514.png new file mode 100644 index 0000000000000000000000000000000000000000..73d636b418908539572692a738d02e7f07fb842d Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/8b01f010e317cfd3129333709d60a514.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/8e92e1660f578af51625aaaf9daf23f8.png b/docs/Advanced_development/en/QuecPythonCloud/media/8e92e1660f578af51625aaaf9daf23f8.png new file mode 100644 index 0000000000000000000000000000000000000000..5c5ec164137af2ade2b865adcccbc832d8559ce6 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/8e92e1660f578af51625aaaf9daf23f8.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/9.png b/docs/Advanced_development/en/QuecPythonCloud/media/9.png new file mode 100644 index 0000000000000000000000000000000000000000..68eeecd8088498da7ce215e0df3605f48171d479 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/9.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/AliyunCloud_IoT_210324_001.png b/docs/Advanced_development/en/QuecPythonCloud/media/AliyunCloud_IoT_210324_001.png new file mode 100644 index 0000000000000000000000000000000000000000..275a04a2c06c5f40ab346be17eb467533e84c76d Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/AliyunCloud_IoT_210324_001.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/AliyunCloud_IoT_210324_002.png b/docs/Advanced_development/en/QuecPythonCloud/media/AliyunCloud_IoT_210324_002.png new file mode 100644 index 0000000000000000000000000000000000000000..1ea252d0fc741f5f827190e0e0226a12d560d355 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/AliyunCloud_IoT_210324_002.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/AliyunCloud_IoT_210324_002A.png b/docs/Advanced_development/en/QuecPythonCloud/media/AliyunCloud_IoT_210324_002A.png new file mode 100644 index 0000000000000000000000000000000000000000..c2b9341c1d88f306decb80b5f374390c9af14159 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/AliyunCloud_IoT_210324_002A.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/AliyunCloud_IoT_210324_003.png b/docs/Advanced_development/en/QuecPythonCloud/media/AliyunCloud_IoT_210324_003.png new file mode 100644 index 0000000000000000000000000000000000000000..9a3b3664300a19d9633f7f2799a62b4e1f113d24 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/AliyunCloud_IoT_210324_003.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/AliyunCloud_IoT_210324_004.png b/docs/Advanced_development/en/QuecPythonCloud/media/AliyunCloud_IoT_210324_004.png new file mode 100644 index 0000000000000000000000000000000000000000..f52880d0c6ac4f92c3fddf633cd0477a3f6a28da Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/AliyunCloud_IoT_210324_004.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/AliyunCloud_IoT_210324_005.png b/docs/Advanced_development/en/QuecPythonCloud/media/AliyunCloud_IoT_210324_005.png new file mode 100644 index 0000000000000000000000000000000000000000..66d66e980f1a9744569da5ccc245c42fc69f34fe Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/AliyunCloud_IoT_210324_005.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/AliyunCloud_IoT_210324_006.png b/docs/Advanced_development/en/QuecPythonCloud/media/AliyunCloud_IoT_210324_006.png new file mode 100644 index 0000000000000000000000000000000000000000..9f17684074e74a616ba212c1821c143139bc19f8 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/AliyunCloud_IoT_210324_006.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/AliyunCloud_IoT_210324_007.png b/docs/Advanced_development/en/QuecPythonCloud/media/AliyunCloud_IoT_210324_007.png new file mode 100644 index 0000000000000000000000000000000000000000..b67a870232d0783407f6484f0f89594f0f09b509 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/AliyunCloud_IoT_210324_007.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/AliyunCloud_IoT_210324_008.png b/docs/Advanced_development/en/QuecPythonCloud/media/AliyunCloud_IoT_210324_008.png new file mode 100644 index 0000000000000000000000000000000000000000..ab1c297875ac5aae8176694152c5f11d35002d1e Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/AliyunCloud_IoT_210324_008.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/AliyunCloud_IoT_210324_009.png b/docs/Advanced_development/en/QuecPythonCloud/media/AliyunCloud_IoT_210324_009.png new file mode 100644 index 0000000000000000000000000000000000000000..9135c8e237116aa32bb1d8ce7efc5875ab4c026e Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/AliyunCloud_IoT_210324_009.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/AliyunCloud_IoT_210324_010.png b/docs/Advanced_development/en/QuecPythonCloud/media/AliyunCloud_IoT_210324_010.png new file mode 100644 index 0000000000000000000000000000000000000000..fc098834adec4d916f668ae85c87db4075880e5b Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/AliyunCloud_IoT_210324_010.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/AliyunCloud_IoT_210324_011.png b/docs/Advanced_development/en/QuecPythonCloud/media/AliyunCloud_IoT_210324_011.png new file mode 100644 index 0000000000000000000000000000000000000000..0f43d769e739ce8e4b432e625891f194ab5ac922 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/AliyunCloud_IoT_210324_011.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/AliyunCloud_IoT_210324_012.png b/docs/Advanced_development/en/QuecPythonCloud/media/AliyunCloud_IoT_210324_012.png new file mode 100644 index 0000000000000000000000000000000000000000..7449980c169dafd0f3c24781d24842fc5da5434c Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/AliyunCloud_IoT_210324_012.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_01.png b/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_01.png new file mode 100644 index 0000000000000000000000000000000000000000..614a7b8539bad8485a9e1accb0b02fc8a60ac224 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_01.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_02.png b/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_02.png new file mode 100644 index 0000000000000000000000000000000000000000..9e54b39bef6c5aa6290ecd7cb8d9166d311cef07 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_02.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_03.png b/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_03.png new file mode 100644 index 0000000000000000000000000000000000000000..5c7244c13aeaec346556e336a840a800bea49cc9 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_03.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_04.png b/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_04.png new file mode 100644 index 0000000000000000000000000000000000000000..456ae8874d0e9ecaa2a1f36de1ff6c9833515bb4 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_04.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_05.png b/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_05.png new file mode 100644 index 0000000000000000000000000000000000000000..1d58fbee9a8a7a280af8963383a3b01aa0f7b9a6 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_05.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_06.png b/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_06.png new file mode 100644 index 0000000000000000000000000000000000000000..6543f10084c45867b7d9e0e4265e74292842cfe2 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_06.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_07.png b/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_07.png new file mode 100644 index 0000000000000000000000000000000000000000..0b913c4e90ff7a5f2ef00179ce4989ffcfbf6833 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_07.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_08.png b/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_08.png new file mode 100644 index 0000000000000000000000000000000000000000..224e2ee147ee984e863b9618e7e1077d2a891e9b Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_08.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_09.png b/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_09.png new file mode 100644 index 0000000000000000000000000000000000000000..5925e10ac2dee7a6a339d334711f54b517d6c8a5 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_09.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_10.png b/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_10.png new file mode 100644 index 0000000000000000000000000000000000000000..a8fde8c7554ca55fc6c5117c0db30f6af328064b Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_10.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_11.png b/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_11.png new file mode 100644 index 0000000000000000000000000000000000000000..dfc0b493ef3a8724ac1e8ca5445cb4118780bb4e Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_11.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_12.png b/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_12.png new file mode 100644 index 0000000000000000000000000000000000000000..cdf32912a2dfd94260ccbd056f12f2b0e904f75f Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_12.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_13.png b/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_13.png new file mode 100644 index 0000000000000000000000000000000000000000..72d27d648e44b8a284ac7864184c6bc45107f13a Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_13.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_14.png b/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_14.png new file mode 100644 index 0000000000000000000000000000000000000000..a58c4a7402112b3d3bda32861967e964d2d0e315 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_14.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_15.png b/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_15.png new file mode 100644 index 0000000000000000000000000000000000000000..a8fde8c7554ca55fc6c5117c0db30f6af328064b Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_15.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_16.png b/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_16.png new file mode 100644 index 0000000000000000000000000000000000000000..2631c4c57384aa68616709e6c1befdc9e6c4bbf1 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_16.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_17.png b/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_17.png new file mode 100644 index 0000000000000000000000000000000000000000..84f311855a2616d3ac3bb09f84403665c168daab Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_17.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_18.png b/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_18.png new file mode 100644 index 0000000000000000000000000000000000000000..9d898906b29096e18d897457e5c516250eb26919 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_18.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_19.png b/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_19.png new file mode 100644 index 0000000000000000000000000000000000000000..c8fdd43eee6fadbd4baebece11b9f2ad346d7e8d Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/QuecPythonCloud_210430_19.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/a77c5bba88013408eb44dde38f358938.png b/docs/Advanced_development/en/QuecPythonCloud/media/a77c5bba88013408eb44dde38f358938.png new file mode 100644 index 0000000000000000000000000000000000000000..44d32143102ab2d7532540dcf7a9bf807649a39a Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/a77c5bba88013408eb44dde38f358938.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/ad674210c976e30f24d800bede396808.png b/docs/Advanced_development/en/QuecPythonCloud/media/ad674210c976e30f24d800bede396808.png new file mode 100644 index 0000000000000000000000000000000000000000..5aa44c76a3c43bb9a73f9811df9c12c2243bcad1 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/ad674210c976e30f24d800bede396808.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/ad7ae354e1ce677edab9f54818878657.png b/docs/Advanced_development/en/QuecPythonCloud/media/ad7ae354e1ce677edab9f54818878657.png new file mode 100644 index 0000000000000000000000000000000000000000..d9d36c41172e4f7d0fb7a590df041c5a69b4578f Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/ad7ae354e1ce677edab9f54818878657.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/b47c7195c07ef6a35deecf2d120f0439.png b/docs/Advanced_development/en/QuecPythonCloud/media/b47c7195c07ef6a35deecf2d120f0439.png new file mode 100644 index 0000000000000000000000000000000000000000..ed6122453bc9912191b87ff6fb63da3044d25f8b Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/b47c7195c07ef6a35deecf2d120f0439.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/be1090df6a3161dd621b541463887a8f.png b/docs/Advanced_development/en/QuecPythonCloud/media/be1090df6a3161dd621b541463887a8f.png new file mode 100644 index 0000000000000000000000000000000000000000..0caede62ae632f073fc3684437dbd418459c1571 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/be1090df6a3161dd621b541463887a8f.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/bf41a9ad7dcf2bc0718496712c30dd72.png b/docs/Advanced_development/en/QuecPythonCloud/media/bf41a9ad7dcf2bc0718496712c30dd72.png new file mode 100644 index 0000000000000000000000000000000000000000..f37e7170efb5b5c930f2e5c243ba4cb9da78d47e Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/bf41a9ad7dcf2bc0718496712c30dd72.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/c0c93c45631fe7577ebb26031461ec10.png b/docs/Advanced_development/en/QuecPythonCloud/media/c0c93c45631fe7577ebb26031461ec10.png new file mode 100644 index 0000000000000000000000000000000000000000..fa3080902976eb7ad4c157e1c626177915b1b467 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/c0c93c45631fe7577ebb26031461ec10.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/c5a7283bc7b1752b03ecb85d32ca9418.png b/docs/Advanced_development/en/QuecPythonCloud/media/c5a7283bc7b1752b03ecb85d32ca9418.png new file mode 100644 index 0000000000000000000000000000000000000000..bd2ed4ae3ef8080c79b7f3c4709bdc09c26b98ee Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/c5a7283bc7b1752b03ecb85d32ca9418.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/c6405128fd86e2502ab214141b264435.png b/docs/Advanced_development/en/QuecPythonCloud/media/c6405128fd86e2502ab214141b264435.png new file mode 100644 index 0000000000000000000000000000000000000000..1776bf8d0f61334e3b8e8b0569961cc54ba36412 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/c6405128fd86e2502ab214141b264435.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/c919d92250a8d791e7b604d40a08d13d.png b/docs/Advanced_development/en/QuecPythonCloud/media/c919d92250a8d791e7b604d40a08d13d.png new file mode 100644 index 0000000000000000000000000000000000000000..2381744c2f0703c4ea21d71d06c7e91019820ffc Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/c919d92250a8d791e7b604d40a08d13d.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/c9cd162f304fac476fe198c32b5b912e.png b/docs/Advanced_development/en/QuecPythonCloud/media/c9cd162f304fac476fe198c32b5b912e.png new file mode 100644 index 0000000000000000000000000000000000000000..64b8d54bdd82385bd4ce3957eded5423f8f31aee Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/c9cd162f304fac476fe198c32b5b912e.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/cdb8eb0e42b3d0f64f6406a651073271.png b/docs/Advanced_development/en/QuecPythonCloud/media/cdb8eb0e42b3d0f64f6406a651073271.png new file mode 100644 index 0000000000000000000000000000000000000000..43fff9f01f636b4cad406d54e4ca623be7fda54b Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/cdb8eb0e42b3d0f64f6406a651073271.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/cf31ba54e8b803da79ad1e8b9fccfa4e.png b/docs/Advanced_development/en/QuecPythonCloud/media/cf31ba54e8b803da79ad1e8b9fccfa4e.png new file mode 100644 index 0000000000000000000000000000000000000000..4e607d3c97b6f7d517d98971571464051ec604b1 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/cf31ba54e8b803da79ad1e8b9fccfa4e.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/cfd9d30539dcc7bec17d952c04e7d5b6.png b/docs/Advanced_development/en/QuecPythonCloud/media/cfd9d30539dcc7bec17d952c04e7d5b6.png new file mode 100644 index 0000000000000000000000000000000000000000..58608880682881e9f192c87683f3bf186230a2f0 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/cfd9d30539dcc7bec17d952c04e7d5b6.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/dc2b5625311e10a79eca5427746c05f5.png b/docs/Advanced_development/en/QuecPythonCloud/media/dc2b5625311e10a79eca5427746c05f5.png new file mode 100644 index 0000000000000000000000000000000000000000..78aaa807b016ee63cee9c467b8bea1e1b9754400 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/dc2b5625311e10a79eca5427746c05f5.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/ed3b9173920f4482dfa234c37b3850e7.png b/docs/Advanced_development/en/QuecPythonCloud/media/ed3b9173920f4482dfa234c37b3850e7.png new file mode 100644 index 0000000000000000000000000000000000000000..1c8c03193b0aedc7aac32f87fb89275289a50fbe Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/ed3b9173920f4482dfa234c37b3850e7.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/ee306a4acca2ec6a25d90a026d6cff22.png b/docs/Advanced_development/en/QuecPythonCloud/media/ee306a4acca2ec6a25d90a026d6cff22.png new file mode 100644 index 0000000000000000000000000000000000000000..574ea533f50387429d5bf9527e5dfe65750f47ec Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/ee306a4acca2ec6a25d90a026d6cff22.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/ee86dd4eeaf37ec47d9a51073c1ca133.png b/docs/Advanced_development/en/QuecPythonCloud/media/ee86dd4eeaf37ec47d9a51073c1ca133.png new file mode 100644 index 0000000000000000000000000000000000000000..3151e3ed0d57c3897df897418aa151d38d6f424f Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/ee86dd4eeaf37ec47d9a51073c1ca133.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/f3a6297aa2a71798598892414c41d361.png b/docs/Advanced_development/en/QuecPythonCloud/media/f3a6297aa2a71798598892414c41d361.png new file mode 100644 index 0000000000000000000000000000000000000000..1f19efe3d5af360bc8a1203945c3e14fbbefe1ca Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/f3a6297aa2a71798598892414c41d361.png differ diff --git a/docs/Advanced_development/en/QuecPythonCloud/media/f51db8dc51ba6ae73375cbfe7f8b0063.png b/docs/Advanced_development/en/QuecPythonCloud/media/f51db8dc51ba6ae73375cbfe7f8b0063.png new file mode 100644 index 0000000000000000000000000000000000000000..3ce8dba29dc342d6a0b73ae9b117ebdc5ebaff2d Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonCloud/media/f51db8dc51ba6ae73375cbfe7f8b0063.png differ diff --git a/docs/Advanced_development/en/QuecPythonInterface/FOTA_binary_upgrade.md b/docs/Advanced_development/en/QuecPythonInterface/FOTA_binary_upgrade.md new file mode 100644 index 0000000000000000000000000000000000000000..ebb2797f7d2d6d8b021d3bbdd0ae0815d5a958fa --- /dev/null +++ b/docs/Advanced_development/en/QuecPythonInterface/FOTA_binary_upgrade.md @@ -0,0 +1,204 @@ +## ** user guide for quecpthon FOTA firmware upgrade** + +This document introduces how to upgrade FOTA firmware based on quecpthon, and guides users to use FOTA upgrade function from the aspects of introduction of new FOTA scheme, production of upgrade package, firmware upgrade process, etc. + +This document applies to the following modules: + +- EC100Y-CN + +- EC600S-CN + + + +## New FOTA upgrade scheme + +Compared with the old scheme, the biggest advantage of the new FOTA scheme is that it can reduce the occupation of flash. Firstly, CP and DSP adopt LZMA compression with higher compression rate. Compared with the previous lzop compression, the image of CP can be reduced by 1m +, and the image of DSP can be reduced by 200 K +; Secondly, using the difference before compression, the differential packet can be smaller. Because the compression changes the file content, the difference effect is not good. The higher the compression rate, the worse the difference effect will be. Using LZMA's high compression rate algorithm, we must adopt a new FOTA upgrade scheme, which not only reduces the image, but also does not increase the differential packet. Compared with the old lzop upgrade scheme, the differential packet is smaller. + +## Manufacturing method of differential upgrade package + +The directory of upgrade package making tools is shown in the figure below. + +![](media/Qp_fota_01.png) + +### Upgrade package production command and parameter description + +>The upgrade package creation commands are as follows: + +> adiff_2.3.exe -l [fs][fp] system_old.img system_new.img system_patch.bin + +- *system_ Old. Img *: represents the firmware upgrade file of the old version; + +- *system_ New. Img *: represents the firmware upgrade file of the new version; + +- *system_ Patch. Bin *: represents the generated differential upgrade file; + +-- L represents the location where the differential upgrade file is stored. If it is set to FS, it means that the differential file will be put into the file system; If it is set to FP, it means that the difference file will be put into FOTA_ PKG partition. + +The purpose of specifying the file storage location is to judge whether the backup area is sufficient at the stage of making differential subcontracting, so as to meet the old firmware backup during differential restore, which is used as a security protection test. + +### Upgrade package production process + +When making differential packages, two different versions of firmware packages are required: the old version of firmware package B (short for before) and the new version of firmware package a (short for after). The manufacturing steps are as follows: + +1. Copy the * system. Img * file in the firmware package to the root directory of the tool, as shown in the following figure: + +![fota升级根目录](media/Qp_fota_02.png) + +1. Name * system. Img * in a * systeam_ Old. Img *, and then name * system. Img * in B as + *systeam_ New. Img *, as shown in the figure below: + +![](media/Qp_fota_03.png) + +1. Execute the following command: + + adiff_2.3.exe -l fs system_old.img system_new.img FotaFile.bin + +When a and B need to upgrade each other, exchange the command to create * a respectively_ b. Bin * and * B_ a.bin*; As follows: + +> adiff_2.3.exe -l fs system_new.img system_old.img FotaFile.bin + +Similarly, you can also modify the image name. + +![](media/Qp_fota_04.png) + +1. Complete the upgrade package of differential upgrade, and the results are shown in the figure below: + +![](media/Qp_fota_05.png) + +## FOTA firmware upgrade process + +### Process introduction + +Upload the completed differential upgrade package to the file system of the module, and then complete the firmware upgrade through the demo provided. + +### Introduction to FOTA related APIs + +fota_obj + +This function is used to create FOTA objects. + +-** function prototype** + +fota_obj = fota() + + +-** parameters** + +nothing + +-** return value** + +Returns the FOTA object. + +fota_obj.write + +This function is used to write upgrade package file data. + +-** function prototype** + +fota_obj.write(bytes, file_size) + + +-** parameters** + +*bytes*: + +[in] upgrade package data. + +*file_size*: + +[in] total byte size of upgrade package file. + +-** return value** + +*0 * indicates successful writing + +*-1 * indicates write failure + +fota_obj.verify + +This function is used to verify the upgrade package file data. + +-** function prototype** + +fota_obj.verify() + + +-** parameters** + +nothing + +-** return value** + +*0 * indicates that the verification is successful + +*-1 * indicates verification failure + +### Sample code + +```python +import fota + +import utime + +import log + +import uos + +from misc import Power + +#Set log output level + +log.basicConfig(level=log.INFO) + +fota_log = log.getLogger("Fota") + +#This example requires upgrade package files (differential package and other. Bin files). Please refer to the method of making upgrade package in this document. + +def run(): + + fota_obj = fota() #Create a FOTA object + + file_size = uos.stat("FotaFile.bin")[6] #Get total bytes of file + + with open("/usr/FotaFile.bin", "rb")as f: #Open. Bin file in Rb mode (upgrade package file needs to be made) + + while 1: + + c = f.read(1024) # read + + if not c: + + break + + fota_obj.write(c, file_size) #Write. Bin file data and total bytes of the file + + fota_log.info("flush verify...") + + res = fota_obj.verify() #check + + if res != 0: + + fota_log.error("verify error") + + return + + fota_log.info("flush power_reset...") + +utime.sleep(2) + +Power.powerRestart() #Restart module +``` + + + +## Appendix a abbreviations of terms + +Table 1: Abbreviations of terms + +|** abbreviation *** full English name *** full Chinese name **| +| -------- | ---------------------------- | ---------------- | +|CP | payload compression protocol | IP load compression protocol| +|DSP | digital signal processing | digital signal processing| +|FOTA firmware over the air download software upgrade| + diff --git a/docs/Advanced_development/en/QuecPythonInterface/Multithreading.md b/docs/Advanced_development/en/QuecPythonInterface/Multithreading.md new file mode 100644 index 0000000000000000000000000000000000000000..d423dadaa7cc5d2961cc953629fec17b5a72cec9 --- /dev/null +++ b/docs/Advanced_development/en/QuecPythonInterface/Multithreading.md @@ -0,0 +1,394 @@ +## ** quecpthon multithreaded development** + +Taking ec600s-cn as an example, this paper introduces how to use the multithreading function of quecpthon. Almost all operating systems support the concept of process, and the running tasks in the operating system generally correspond to a process. When a program runs in memory, it becomes a process. Multithreading extends the concept of multi process, so that the same process can process multiple tasks simultaneously. A thread is also called a lightweight process. A thread is the execution unit of a process. Similar to the status of process in the operating system, thread is an independent and concurrent execution flow in the program. + +Through this article, you will understand all the setting parameters and usage of ec600s-cn thread. + +### Hardware description + +Thread is a function realization at the software level. In terms of hardware, it only needs enough memory, which will not be repeated here. + +### Software design + +_ The thread module provides methods to create new threads and provides mutexes. The functions of each interface are described in detail below. + +#### Get current thread number + +**_thread.get_ident()** + +**Parameter description** + +nothing + +**Return value** + +If the execution is successful, the current thread number is returned; + +Other values indicate execution failure. + +#### Gets the remaining memory size of the system + +**_thread.get_heap_size()** + +**Parameter description** + +nothing + +**Return value** + +If the execution is successful, the remaining memory size of the system is returned; + +Other values indicate execution failure. + +#### Set the stack size used by the thread to be created + +**_thread.stack_size(size)** + +**Parameter description** + +|Parameter | type | description| +| :--: | :--: | :----------------------------------------------: | +|Size | integer | the stack size used by the thread to be created. Unit: byte; Default: 8K| + +**Return value** + +0 is returned if the execution is successful; + +Other values indicate execution failure. + +#### Create a new thread + +**_thread.start_new_thread(function, args)** + +**Parameter description** + +|Parameter | type | description| +| :------: | :--: | :------------: | +|Function | - | receive and execute function| +|Args | - | executed function parameters| + +**Return value** + +If the creation is successful, there is no return; + +If the creation fails, an error is returned. + +#### Create a mutex object + +**_thread.allocate_lock()** + +**Parameter description** + +nothing + +**Return value** + +If the creation is successful, there is no return; + +If the creation fails, an error is returned. + +#### Get mutex + +**lock.acquire()** + +**Parameter description** + +nothing + +**Return value** + +* ture * will be returned if the acquisition is successful; + +* false * is returned if acquisition fails. + +#### Release mutex + +**lock.release()** + +**Parameter description** + +nothing + +**Return value** + +If the release is successful, there is no return; + +An error is returned if the release fails. + +#### Query mutex status + +**lock.locked()** + +**Parameter description** + +nothing + +**Return value** + +* true * is returned if the mutex is obtained by a thread; + +* false * is returned if the mutex is not obtained by the thread. + +### Interactive operation + +Use qpycom tool to interact with ec600s-cn, as shown in the screenshot below. + +```python +>>> import _thread +>>> _thread.get_ident() +2126467632 +>>> _thread.get_heap_size() +748032 +>>> lock = _thread.allocate_lock() +>>> lock.acquire() +True +>>> lock.locked() +True +>>> lock.release() +>>> lock.locked() +False +``` + +be careful: + +1. import _ Thread is to let_ The thread module is visible in the current space. + +2. Only import_ Thread module can only be used_ Functions and variables in thread. + +### Download verification + +#### Software code + +The reference code of the supporting demo is * thread in the same directory as the document_ File. Py * file. Download the. Py file to ec600s-cn and run it. The code is as follows: + +```python +import _thread +import utime +import log +from machine import UART + +#Set log output level +log.basicConfig(level=log.INFO) +uart_log = log.getLogger("Thread") + +state = 1 +msglen = 0 +count = 10 +uart = UART(UART.UART2, 115200, 8, 0, 1, 0) + +def uartwrite(): + global count + while count: + write_msg = "Quectel count={}".format(count) #send data + uart.write(write_msg) + uart_log.info("write msg :{}".format(write_msg)) + utime.sleep(1) + count -= 1 + if count == 0: + break + uart_log.info("uartWrite end!") + +def uartread(): + global state + global msglen + while 1: + utime.sleep_ms(10) + msgLen = uart.any() #Returns whether there is a readable data length + if msgLen: + msg = uart.read(msgLen) #Read when there is data + utf8_msg = msg.decode() #The initial data is the byte type (bytes), and the byte type data is converted to str + uart_log.info("uartread msg: {}".format(utf8_msg)) + state = 0 + break + else: + continue + +def run(): + _thread.start_new_thread(uartread, ()) #Create a thread to listen and receive UART messages + _thread.start_new_thread(uartwrite, ()) + + +if __name__ == "__main__": + run() + while 1: + if state: + pass + else: + break + +``` + +#### Hardware connection + +Power is supplied to ec600s-cn through type-C interface. The connection between UART and TTL to USB module is shown in the table below (for reference only): + +|Module UART_ Pin | TTL to USB module| +| :------------: | :----------: | +| Rx1 | Tx | +| Tx1 | Rx | +| GND | GND | + +The hardware connection diagram is as follows: + +![硬件连接图](media/硬件连接图.jpg) + +#### Operation effect + +(1) Open qpycom and run * thread_ File. Py *, as shown below: + +![执行01](media/多线程_执行01.png) + +(2) Since the two threads are running at the same time, UART can send data to ec600s-cn serial port while writing data (the following only indicates that reading and writing are running at the same time, but the specific log output order depends on the time of manual transmission). The following is the "quecpython" sent to ec600s-cn through TTL to USB in the third and fourth gaps of ec600s-cn writing data. + +![执行02](media/多线程_执行02.png) + +### Matching code + + + + download code + +## QuecPython file system + +This article mainly introduces the operation and use of quecpthon file system. The file system is the method and data structure used by the operating system to specify the files on the storage device (disk or solid state disk based on NAND flash) or partition; That is, a method of organizing files on a storage device. The software organization responsible for managing and storing file information in the operating system is called file management system, or file system for short. Through this article, you will learn how to operate and use the file system. + +Applicable modules: + +- EC100Y-CN +- EC600S-CN + +### How to store files in the file system + +#### Download operation debugging files through qpycom tool + +**Script Download** + +For script download, there are two methods: + +(1) Use the drag and drop function of qpycom to directly drag the file to the module, + +(2) Using the script download function of qpycom, you can download the script to the module with one click. + +Note: see quectel quecpthon for specific script download operations_ Qpycom tool instructions + +**File operation** + +For how the quecpthon file system operates, you can see the UOS module and UIO module. The main functional interfaces include: + +[**uos.remove(path)**](https://python.quectel.com/wiki/api/#uos-) + +[**uos.chdir(path)**](https://python.quectel.com/wiki/api/#uos-) + +[**uos.getcwd()**](https://python.quectel.com/wiki/api/#uos-) + +[**fd = uio.open(name, mode=’r’, \**kwarg)**](https://python.quectel.com/wiki/api/#uio-) + +Examples of various interfaces are as follows: + +```python +>>> import uos +>>> uos.getcwd() #Get path +'/' +>>> uos.chdir('/usr') #Change path +>>> uos.mkdir('QuecPython') #Create folder at current path +>>> uos.listdir() +['apn_cfg.json', 'a.py', 'b.py', 'V05.bin', 'system_config.json', 'checksum.json', 'b.txt', 'QuecPython'] +>>> uos.chdir('QuecPython')#Change path +>>> uos.getcwd() +'/usr/QuecPython' +>>> import uio +>>> fd = uio.open('test.py', mode='w') #Create a new file in the current path and open it in write mode +>>> fd.write('quectel') #Write operation +7 +>>> fd.close() #Close file +>>> fd = uio.open('test.py', mode='r') #For files in the current path, open them in read mode +>>> fd.read() #Read operation +'quectel' +>>> fd.close() +``` + +#### Generation mode of mass production file + + For the firmware merging operation, the * customer is actually generated_ FS. Bin *, the principle is as follows: + +1. Find * mklfs * and unpack the directory (* qpycom) in qpycom_ In v1.1.1 \ exes \ aboot *), open the following file by CMD command in the * mklfs * tool Directory: + +![cmd初始界面](media/cmd初始界面.jpg) + +2. Create a folder, which can be named at will. This article calls it * mount *, and place the files to be merged in this folder, for example: + +![合并文件](media/合并文件.jpg) + +3. CMD command line operation is as follows + +![cmd操作](media/cmd操作.jpg) + +(1) The *. Bin * generation command is as above, and the specific command is explained as follows: + +![cmd命令说明](media/cmd命令说明.jpg) + +(2) As shown in the figure above, * customer is generated_ FS. Bin *, the default is 5 MB, that is, the size in the figure is 5242880 + +(3) For * customer_ backup_ FS. Bin *, the default is 200 KB, that is, the output value in the figure is 20480 + +4. The generated *. Bin * file can be seen in the tool directory of * mklfs *, as shown in the screenshot below: + +![生成.bin文件](media/生成.bin文件.jpg) + +### Parameter saving method + +#### Saving method of dynamic parameters + +The temporary parameters, variables and string definitions used by developers in the development process belong to dynamic parameters. For these dynamic parameters, quecpthon provides a GC memory management module for memory garbage collection. For details, please refer to the relevant instructions of the wiki on the official website of quecpthon: [GC - memory fragment recycling](https://python.quectel.com/wiki/#/zh-cn/api/pythonStdlib?id=gc-%e5%86%85%e5%ad%98%e7%a2%8e%e7%89%87%e5%9b%9e%e6%94%b6) + +#### Storage method of factory parameters + +For the saving of factory parameters, it is necessary to write the configured factory parameters into the file first, and then generate *. Bin * file through file image. For specific operation methods, please refer to the chapter "** bin generation method of mass production file **". + +### File backup (script backup) + +For file backup, it is necessary to merge the backup file with the original firmware to generate new firmware, and then burn it into the module again. See the following chapters for specific operation steps. + +#### Make image file + +For the production of image files, please refer to the above chapter "** generation BIN method of mass production files **" or quectel_ EC100Y-QuecOpen_ FS image production_ Application Guide + +This article describes the creation of image files for the following files: + +![用于制作镜像文件的文档](media/用于制作镜像文件的文档.png) + +The image files created are: + +![制作的镜像文件](media/制作的镜像文件.png) + +#### Image file replacement and burning firmware + +Because "the module will burn a formatted image file with empty content for the user area and backup area by default", it is necessary to create the image file * customer_ backup_ FS. Bin * replaces the original image file, generates a new compressed package firmware, and uses qpycom to burn the firmware. Refer to quectel for burning steps_ QuecPython_ Qpycom tool instructions. + +#### File update + +For the burning of the above documents, log in to qpycom and the results are as follows: + +![文件列表](media/文件列表.png) + +The interactive interface operation is as follows: + +```python +>>> import checksum +>>> checksum.update('/usr/a.py') + +[{'name': '/usr/a.py', 'sha256': '454f048b9b584add8b6f67a86ec4ec01ce63baace41efba994881f608a227e30'}, {'name': '/usr/b.py', 'sha256': '3edc1bd333bc7f4caf33bb35e7602bafe5d85c6b6b2ca74a92588a470fbee917'}, {'name': '/usr/b.txt', 'sha256': 'cced28c6dc3f99c2396a5eaad732bf6b28142335892b1cd0e6af6cdb53f5ccfa'}, {'name': '/usr/V05.bin', 'sha256': 'e5d2dd354947292348a8fb29cdf78e4ffc05754f8e12ecf0dc0ff3783b6b8822'}] +>>> uos.listdir('usr/') +['apn_cfg.json', 'checksum.json', 'a.py', 'b.py', 'b.txt', 'V05.bin', 'system_config.json'] +>>> uos.listdir('/bak/usr/') +['test.txt', 'a.py', 'b.py', 'b.txt', 'V05.bin'] +>>> +``` + +Operating instructions: + +(1) For change * customer_ backup_ The burning after FS. Bin * is shown in the figure above + +(2) If you update the files in the * usr * directory and want to continue running after the next power on, you need to use the * checksum. Update * interface to update the * checksum. JSON * file. + +(3) The operation of file backup is to retain the merged files to prevent the subsequent accidental deletion of files, resulting in program deletion and irrecoverable recovery. diff --git a/docs/Advanced_development/en/QuecPythonInterface/code/modem_file.py b/docs/Advanced_development/en/QuecPythonInterface/code/modem_file.py new file mode 100644 index 0000000000000000000000000000000000000000..9fb480fec5211fab77af40ebe9a61e17ad032ab1 --- /dev/null +++ b/docs/Advanced_development/en/QuecPythonInterface/code/modem_file.py @@ -0,0 +1,29 @@ +import modem +import log + +state = 1 +log.basicConfig(level=log.INFO) # 设置日志输出级别 + +log = log.getLogger("QuecPython") + +def modem_msg(): + global state + modem_Imei = modem.getDevImei() + modem_DevModel = modem.getDevModel() + modem_DevSN = modem.getDevSN() + modem_DevFwVersion = modem.getDevFwVersion() + modem_DevProductId = modem.getDevProductId() + log.info("modem_Imei:{}".format(modem_Imei)) + log.info("modem_DevModel:{}".format(modem_DevModel)) + log.info("modem_DevSN:{}".format(modem_DevSN)) + log.info("modem_DevFwVersion:{}".format(modem_DevFwVersion)) + log.info("modem_DevProductId:{}".format(modem_DevProductId)) + state = 0 + +if __name__ == "__main__": + modem_msg() + while 1: + if state: + pass + else: + break diff --git a/docs/Advanced_development/en/QuecPythonInterface/code/thread_file.py b/docs/Advanced_development/en/QuecPythonInterface/code/thread_file.py new file mode 100644 index 0000000000000000000000000000000000000000..39a63c3947ebd252f3c94e758672f6216f5d7ca5 --- /dev/null +++ b/docs/Advanced_development/en/QuecPythonInterface/code/thread_file.py @@ -0,0 +1,54 @@ +import _thread +import utime +import log +from machine import UART # 导入UART模块 + +# 设置日志输出级别 +log.basicConfig(level=log.INFO) +uart_log = log.getLogger("Thread") + +state = 1 +msglen = 0 +count = 10 +uart = UART(UART.UART2, 115200, 8, 0, 1, 0) + +def uartwrite(): + global count + while count: + write_msg = "Quectel count={}".format(count) # 发送数据 + uart.write(write_msg) + uart_log.info("write msg :{}".format(write_msg)) + utime.sleep(1) + count -= 1 + if count == 0: + break + uart_log.info("uartWrite end!") + + +def uartread(): + global state + global msglen + while 1: + utime.sleep_ms(10) + msgLen = uart.any() # 返回是否有可读取的数据长度 + if msgLen: + msg = uart.read(msgLen) # 当有数据时进行读取 + utf8_msg = msg.decode() # 初始数据是字节类型(bytes),将字节类型数据进行编码,转STR + uart_log.info("uartread msg: {}".format(utf8_msg)) + state = 0 + break + else: + continue + +def run(): + _thread.start_new_thread(uartread, ()) # 创建一个线程来监听接收uart消息 + _thread.start_new_thread(uartwrite, ()) + + +if __name__ == "__main__": + run() + while 1: + if state: + pass + else: + break diff --git a/docs/Advanced_development/en/QuecPythonInterface/media/Qp_fota_01.png b/docs/Advanced_development/en/QuecPythonInterface/media/Qp_fota_01.png new file mode 100644 index 0000000000000000000000000000000000000000..1c5149e0a9524bf79e318986cf890e0a4a736ac4 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonInterface/media/Qp_fota_01.png differ diff --git a/docs/Advanced_development/en/QuecPythonInterface/media/Qp_fota_02.png b/docs/Advanced_development/en/QuecPythonInterface/media/Qp_fota_02.png new file mode 100644 index 0000000000000000000000000000000000000000..a28f3d0ddd7e9d4c117f4fea052a024a5a45cbc2 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonInterface/media/Qp_fota_02.png differ diff --git a/docs/Advanced_development/en/QuecPythonInterface/media/Qp_fota_03.png b/docs/Advanced_development/en/QuecPythonInterface/media/Qp_fota_03.png new file mode 100644 index 0000000000000000000000000000000000000000..7bc1e34c646c27581d2237802970fc0459c085f6 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonInterface/media/Qp_fota_03.png differ diff --git a/docs/Advanced_development/en/QuecPythonInterface/media/Qp_fota_04.png b/docs/Advanced_development/en/QuecPythonInterface/media/Qp_fota_04.png new file mode 100644 index 0000000000000000000000000000000000000000..6656bd34e348ae72eccb627cd174e357adc646ed Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonInterface/media/Qp_fota_04.png differ diff --git a/docs/Advanced_development/en/QuecPythonInterface/media/Qp_fota_05.png b/docs/Advanced_development/en/QuecPythonInterface/media/Qp_fota_05.png new file mode 100644 index 0000000000000000000000000000000000000000..9f9c936f0444644b4089bf06643dd4eacd532285 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonInterface/media/Qp_fota_05.png differ diff --git a/docs/Advanced_development/en/QuecPythonInterface/media/Qp_modem_get_dev_info_01.png b/docs/Advanced_development/en/QuecPythonInterface/media/Qp_modem_get_dev_info_01.png new file mode 100644 index 0000000000000000000000000000000000000000..fd836d5bc3eabad45160a2f25872de0b05082308 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonInterface/media/Qp_modem_get_dev_info_01.png differ diff --git a/docs/Advanced_development/en/QuecPythonInterface/media/Qp_modem_get_dev_info_02.png b/docs/Advanced_development/en/QuecPythonInterface/media/Qp_modem_get_dev_info_02.png new file mode 100644 index 0000000000000000000000000000000000000000..dae82362f99ab88e9cccecdf8c36b5d0906f2e9b Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonInterface/media/Qp_modem_get_dev_info_02.png differ diff --git "a/docs/Advanced_development/en/QuecPythonInterface/media/cmd\345\210\235\345\247\213\347\225\214\351\235\242.jpg" "b/docs/Advanced_development/en/QuecPythonInterface/media/cmd\345\210\235\345\247\213\347\225\214\351\235\242.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..1931c71147c5b749bd3c5dbbd505cc2109547ebd Binary files /dev/null and "b/docs/Advanced_development/en/QuecPythonInterface/media/cmd\345\210\235\345\247\213\347\225\214\351\235\242.jpg" differ diff --git "a/docs/Advanced_development/en/QuecPythonInterface/media/cmd\345\221\275\344\273\244\350\257\264\346\230\216.jpg" "b/docs/Advanced_development/en/QuecPythonInterface/media/cmd\345\221\275\344\273\244\350\257\264\346\230\216.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..7c5b4a8eb58b280bbc701708f5b14b734100c05d Binary files /dev/null and "b/docs/Advanced_development/en/QuecPythonInterface/media/cmd\345\221\275\344\273\244\350\257\264\346\230\216.jpg" differ diff --git "a/docs/Advanced_development/en/QuecPythonInterface/media/cmd\346\223\215\344\275\234.jpg" "b/docs/Advanced_development/en/QuecPythonInterface/media/cmd\346\223\215\344\275\234.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..322f3f654806cbc5e6ba7ed64058142583c6d442 Binary files /dev/null and "b/docs/Advanced_development/en/QuecPythonInterface/media/cmd\346\223\215\344\275\234.jpg" differ diff --git "a/docs/Advanced_development/en/QuecPythonInterface/media/\345\210\266\344\275\234\347\232\204\351\225\234\345\203\217\346\226\207\344\273\266.png" "b/docs/Advanced_development/en/QuecPythonInterface/media/\345\210\266\344\275\234\347\232\204\351\225\234\345\203\217\346\226\207\344\273\266.png" new file mode 100644 index 0000000000000000000000000000000000000000..90bd22f3ecefbd6a4eaff6f23d1db6f2909fb90f Binary files /dev/null and "b/docs/Advanced_development/en/QuecPythonInterface/media/\345\210\266\344\275\234\347\232\204\351\225\234\345\203\217\346\226\207\344\273\266.png" differ diff --git "a/docs/Advanced_development/en/QuecPythonInterface/media/\345\220\210\345\271\266\346\226\207\344\273\266.jpg" "b/docs/Advanced_development/en/QuecPythonInterface/media/\345\220\210\345\271\266\346\226\207\344\273\266.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..21b5ef0284bc874f7d0c92b9161f7b56c91913a6 Binary files /dev/null and "b/docs/Advanced_development/en/QuecPythonInterface/media/\345\220\210\345\271\266\346\226\207\344\273\266.jpg" differ diff --git "a/docs/Advanced_development/en/QuecPythonInterface/media/\345\244\232\347\272\277\347\250\213_\346\211\247\350\241\21401.png" "b/docs/Advanced_development/en/QuecPythonInterface/media/\345\244\232\347\272\277\347\250\213_\346\211\247\350\241\21401.png" new file mode 100644 index 0000000000000000000000000000000000000000..fb4afa04648ff72ec99f87cd7de7d3d7f0f896ec Binary files /dev/null and "b/docs/Advanced_development/en/QuecPythonInterface/media/\345\244\232\347\272\277\347\250\213_\346\211\247\350\241\21401.png" differ diff --git "a/docs/Advanced_development/en/QuecPythonInterface/media/\345\244\232\347\272\277\347\250\213_\346\211\247\350\241\21402.png" "b/docs/Advanced_development/en/QuecPythonInterface/media/\345\244\232\347\272\277\347\250\213_\346\211\247\350\241\21402.png" new file mode 100644 index 0000000000000000000000000000000000000000..f641a64fa5eded86c887ba2d7778be8bfa9302c0 Binary files /dev/null and "b/docs/Advanced_development/en/QuecPythonInterface/media/\345\244\232\347\272\277\347\250\213_\346\211\247\350\241\21402.png" differ diff --git "a/docs/Advanced_development/en/QuecPythonInterface/media/\346\226\207\344\273\266\345\210\227\350\241\250.png" "b/docs/Advanced_development/en/QuecPythonInterface/media/\346\226\207\344\273\266\345\210\227\350\241\250.png" new file mode 100644 index 0000000000000000000000000000000000000000..e9600be3531d9e5c3975c86692cfb2f66ffea1d0 Binary files /dev/null and "b/docs/Advanced_development/en/QuecPythonInterface/media/\346\226\207\344\273\266\345\210\227\350\241\250.png" differ diff --git "a/docs/Advanced_development/en/QuecPythonInterface/media/\347\224\237\346\210\220.bin\346\226\207\344\273\266.jpg" "b/docs/Advanced_development/en/QuecPythonInterface/media/\347\224\237\346\210\220.bin\346\226\207\344\273\266.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..12a9f7620876915bacffadebb9e4880e07375861 Binary files /dev/null and "b/docs/Advanced_development/en/QuecPythonInterface/media/\347\224\237\346\210\220.bin\346\226\207\344\273\266.jpg" differ diff --git "a/docs/Advanced_development/en/QuecPythonInterface/media/\347\224\250\344\272\216\345\210\266\344\275\234\351\225\234\345\203\217\346\226\207\344\273\266\347\232\204\346\226\207\346\241\243.png" "b/docs/Advanced_development/en/QuecPythonInterface/media/\347\224\250\344\272\216\345\210\266\344\275\234\351\225\234\345\203\217\346\226\207\344\273\266\347\232\204\346\226\207\346\241\243.png" new file mode 100644 index 0000000000000000000000000000000000000000..426fda2253d2726f3e5b5c3335a1fe5e031ca3ea Binary files /dev/null and "b/docs/Advanced_development/en/QuecPythonInterface/media/\347\224\250\344\272\216\345\210\266\344\275\234\351\225\234\345\203\217\346\226\207\344\273\266\347\232\204\346\226\207\346\241\243.png" differ diff --git "a/docs/Advanced_development/en/QuecPythonInterface/media/\347\241\254\344\273\266\350\277\236\346\216\245\345\233\276.jpg" "b/docs/Advanced_development/en/QuecPythonInterface/media/\347\241\254\344\273\266\350\277\236\346\216\245\345\233\276.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..e3abe8e641c5f3deaa199fba730fb01a687c0b20 Binary files /dev/null and "b/docs/Advanced_development/en/QuecPythonInterface/media/\347\241\254\344\273\266\350\277\236\346\216\245\345\233\276.jpg" differ diff --git a/docs/Advanced_development/en/QuecPythonInterface/modem_get_dev_info.md b/docs/Advanced_development/en/QuecPythonInterface/modem_get_dev_info.md new file mode 100644 index 0000000000000000000000000000000000000000..77d2e2a254ad0b6e5b658449b206f718777df921 --- /dev/null +++ b/docs/Advanced_development/en/QuecPythonInterface/modem_get_dev_info.md @@ -0,0 +1,174 @@ + +## ** get device information from quecpthon modem** + +Based on ec600s-cn, this paper mainly introduces how to use quecpthon modem module to obtain device information. Through this article, you will learn all the setting parameters and usage of ec600s-cn thread. + +Applicable modules: + +- EC100Y-CN + +- EC600S-CN + +## Software design + +The modem module provides interfaces for obtaining various information of the equipment. The functions of each interface are described in detail below. + +#### Gets the IMEI of the device + +**modem.getDevImei()** + +**Parameter description** + +nothing + +**Return value** + +If successful, the IMEI of the string type device is returned; + +If it fails, an integer value of - 1 is returned. + +#### Get device model + +**modem.getDevModel()** + +**Parameter description** + +nothing + +**Return value** + +If successful, the device model of string type is returned; + +If it fails, an integer value of - 1 is returned. + +#### Get device serial number + +**modem.getDevSN()** + +**Parameter description** + +nothing + +**Return value** + +If successful, the string type device serial number will be returned; + +If it fails, an integer value of - 1 is returned. + +#### Get device firmware version number + +**modem.getDevFwVersion()** + +**Parameter description** + +nothing + +**Return value** + +If successful, the string type firmware version number is returned; + +If it fails, an integer value of - 1 is returned. + +#### Gets the manufacturer ID of the device + +**modem.getDevProductId()** + +**Parameter description** + +nothing + +**Return value** + +If successful, the string type device manufacturer ID is returned; + +If it fails, an integer value of - 1 is returned. + +## Interactive operation + +Use qpycom tool to interact with ec600s-cn, as follows: + +```Python +>>> import modem +>>> help(modem) +object is of type module + __name__ -- modem + getDevSN -- + getDevImei -- + getDevModel -- + getDevFwVersion -- + getDevProductId -- +>>> from modem import * +>>> getDevSN() +'D1D20J60A0017870P' +>>> getDevImei() +'868540050393723' +>>> getDevModel() +'EC600S' +>>> getDevFwVersion() +'EC600SCNAAR01A01M16_OCPU_PY_BETA1211' +>>> getDevProductId() +'Quectel' +``` + +be careful: + +1. Import modem is to make the modem module visible in the current space. + +2. Only the import modem module can use the functions and variables in the modem. + +## Download verification + +#### Software code + +Download the. Py file and run it on ec600s-cn. The code is as follows: + +```python +import modem +import log + +state = 1 +log.basicConfig(level=log.INFO) #Set log output level + +log = log.getLogger("QuecPython") + +def modem_msg(): + global state + modem_Imei = modem.getDevImei() + modem_DevModel = modem.getDevModel() + modem_DevSN = modem.getDevSN() + modem_DevFwVersion = modem.getDevFwVersion() + modem_DevProductId = modem.getDevProductId() + log.info("modem_Imei:{}".format(modem_Imei)) + log.info("modem_DevModel:{}".format(modem_DevModel)) + log.info("modem_DevSN:{}".format(modem_DevSN)) + log.info("modem_DevFwVersion:{}".format(modem_DevFwVersion)) + log.info("modem_DevProductId:{}".format(modem_DevProductId)) + state = 0 + +if __name__ == "__main__": + modem_msg() + while 1: + if state: + pass + else: + break +``` + +#### Hardware connection + +No hardware connection required + +#### Operation effect + +Open qpycom and run * thread_ File. Py *, as shown below: + +![执行01](media/Qp_modem_get_dev_info_01.png) + +The operation results are as follows: + +![执行02](media/Qp_modem_get_dev_info_02.png) + + + + + diff --git a/docs/Advanced_development/en/QuecPythonSub/ADC.md b/docs/Advanced_development/en/QuecPythonSub/ADC.md new file mode 100644 index 0000000000000000000000000000000000000000..644f9ce8b85646f262f7476d81bb4a2593028b37 --- /dev/null +++ b/docs/Advanced_development/en/QuecPythonSub/ADC.md @@ -0,0 +1,103 @@ +# ** instructions for quecpthon ADC sampling development** + +## Hardware description + +At present, there are two ADCs open, and the connection positions of the two ADCs are shown in the table below: + +![](media/7acc910ebd7bf4eb806399676e468795.png) + +The corresponding relationship is shown in the following table: + +|Module pin number | description| +|---------------|----------| +|19 | ADC channel 0| +|20 | ADC channel 1| + +## Software design + +### Constant description + +|Constant | description| +|----------|----------| +|Adc.adc0 | ADC channel 0| +|Adc.adc1 | ADC channel 1| + +### Create ADC object + +ADC = ADC (): no parameter, no return value. + +### ADC function initialization + +ADC. Open(), no parameters. + +Return value: integer 0 is returned successfully, and integer - 1 is returned in failure. + +### Read the voltage value + +ADC. Read (adcn): read the voltage value of the specified channel, in MV. + +|Parameter | parameter type | parameter description| +|------|----------|------------------------------------------------------------------------------------| +|Adcn | int | ADC channel note: the ec600s platform supports ADC0 and ADC1, and the corresponding pins are as follows: ADC0 – pin number 19, ADC1 – pin number 20| + +### Turn off ADC + +ADC. Close(), no parameters. + +Return value: integer 0 is returned successfully, and integer - 1 is returned in failure. + +## Interactive operation + +The qpycom tool is used to interact with the module. The following example is based on ADC0. + +![](media/d498ea36bae149ce7f0f7221587898bc.png) + +be careful: + +1. From misc import ADC is to make the ADC module visible in the current space. + +2. Only from misc import ADC module can use functions and variables in ADC. + +3. The above operations are carried out when the ADC0 is connected with a photoresist (ec600s development board has been externally connected). ADC1 needs to connect peripherals for corresponding operations. + +## Download verification + +### Software code + +Download the. Py file to the module for operation. The code is as follows: + +```python +from misc import ADC #Import ADC module +import utime #Import timing module +read_time = 5 #Set reading times a +dc = ADC() +while read_time: + adc.open() + read_data = adc.read(ADC.ADC0) + print(read_data) + adc.close() + read_time -= 1 + utime.sleep(1) #Delay 1s +``` + +### Hardware connection + +No additional hardware connection is required. The ADC0 interface of ec600s has been externally connected with photoresist. The download verification of this paper is to use photoresist for auxiliary verification. + +### Operation effect + +1. Open qpycom and run ADC_ File.py (ensure that the photoresist receives different degrees of light during operation), as shown in the following figure: + + ![](media/e574fb98f5cd8906b43f82b87012770d.png) + + + +2. View the output results on the qpycom interactive interface (the values will be different) + +![](media/fbce9c32a8929f43a5635b8e6c770219.png) + +## Matching code + + + + download code diff --git a/docs/Advanced_development/en/QuecPythonSub/Audio.md b/docs/Advanced_development/en/QuecPythonSub/Audio.md new file mode 100644 index 0000000000000000000000000000000000000000..920c51b26495215c718cfda454fab544a80f118a --- /dev/null +++ b/docs/Advanced_development/en/QuecPythonSub/Audio.md @@ -0,0 +1,178 @@ +## Revision history +|Version | date | author | change statement| +|------|------|------|------| +|1.0 | 2021-4-6 | gary.zhou | First Edition| + +## API introduction + +Taking ec600s-cn module as an example, this paper mainly introduces the use of audio in quecpthon audio module. The module can be used to play MP3, WAV and other files. For specific API details, please refer to [quecpthon audio - audio playback](https://python.quectel.com/wiki/api/#audio) + +This document is applicable to the following modules of mobile communication: + +- EC100Y-CN +- EC600S-CN + +## Play sound with audio + +The hardware version of the code shown in this article is ec600s-cn v1.1. External speakers are required to play sound on the development board. + +Taobao link: + + +![QuecPython_Sub_TTS02](media\QuecPython_Sub_TTS02.png) + + +## Hardware connection + +Refer to [ec600s v1.1 development board schematic. PDF](https://python.quectel.com/download) + +![QuecPython_Sub_TTS01](media\QuecPython_Sub_TTS01.png) + +![QuecPython_Sub_Audio01](media\QuecPython_Sub_Audio01.png) + +VOP: positive amplifier output + +Von: negative amplifier output + +Connect pin 1 of J7 to the positive pole of power amplifier. + +Pin 2 is connected to the negative pole. Due to the external horn used this time. The gpio11 pin needs to be enabled on ec600s v1.1. + +Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_ PD, 1) 。 Before you can play audio. + +### Play mp3 + +1. Add the example provided with the package_ Download the file maonv.mp3 into the development board. + +2. Then burn the following code. + +```python +# -*- coding: UTF-8 -*- + +import utime as time +import audio +from machine import Pin + + +def example_audio_mp3(): + ''' +The external speaker plays the recording file, and the parameter is 0 + ''' + aud = audio.Audio(0) + ''' +Enable external speaker playback + ''' + #Pin(Pin.GPIO10, Pin.OUT, Pin.PULL_ PD, 1) # self use commissioning board + Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) #Official board v1.1 use + #Pin(Pin.GPIO9, Pin.OUT, Pin.PULL_ PD, 1) # official board v1.2 use + #U: Indicates the user directory. The GUI download tool will download the file to the / usr file + aud.play(2, 1, "U:/example_maonv.mp3") + pass + + +if __name__ == "__main__": + example_audio_mp3() + +``` + +3. Just run the python script. + + + +### Play wav file + +1. Add the example provided with the package_ Download the file haixiu.wav into the development board. +2. Burn the following code into the development board. + +```python +# -*- coding: UTF-8 -*- + +import utime as time +import audio +from machine import Pin + + +def example_audio_wav(): + ''' +The external speaker plays the recording file, and the parameter is 0 + ''' + aud = audio.Audio(0) + ''' +Enable external speaker playback + ''' + #Pin(Pin.GPIO10, Pin.OUT, Pin.PULL_ PD, 1) # self use commissioning board + Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) #Official board v1.1 use + #Pin(Pin.GPIO9, Pin.OUT, Pin.PULL_ PD, 1) # official board v1.2 use + #U: Indicates the user directory. The GUI download tool will download the file to the / usr file + aud.play(2, 1, "U:/example_haixiu.wav") + pass + + +if __name__ == "__main__": + example_audio_wav() + +``` + + + +### Switch volume during playback + +Above, we show the basic playback operation. Next, we show how to switch the volume during playback. Add a callback function to judge the playback status. + +```python +# -*- coding: UTF-8 -*- + +import utime as time +import urandom as random +import audio +from machine import Pin + +exited = True + +#Toggle playback volume parameters +def audio_cb(event): + global exited + #7 indicates that the playback is complete + if event == 7: + exited = False + print('audio-play finish.') + + +def example_audio_mp3(): + global exited + ''' +The external speaker plays the recording file, and the parameter is 0 + ''' + aud = audio.Audio(0) + ''' +Enable external speaker playback + ''' + #Pin(Pin.GPIO10, Pin.OUT, Pin.PULL_ PD, 1) # self use commissioning board + Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) #Official board v1.1 use + #Pin(Pin.GPIO9, Pin.OUT, Pin.PULL_ PD, 1) # official board v1.2 use + aud.setCallback(audio_cb) + for i in range(3): #Demo 3 times + #U: Indicates the user directory. The GUI download tool will download the file to the / usr file + aud.play(2, 1, "U:/example_maonv.mp3") + while exited: + aud.setVolume(random.randint(6, 11)) + time.sleep_ms(500) + exited = True + + print("example_audio_mp3 has exit") + + +if __name__ == "__main__": + example_audio_mp3() + +``` + +## Bit depth and sampling rate + +To be added + +## Matching code + + + + download code and audio files diff --git a/docs/Advanced_development/en/QuecPythonSub/GPIO.md b/docs/Advanced_development/en/QuecPythonSub/GPIO.md new file mode 100644 index 0000000000000000000000000000000000000000..4d9c9b349772532576dd3124f5a9be75b98066cf --- /dev/null +++ b/docs/Advanced_development/en/QuecPythonSub/GPIO.md @@ -0,0 +1,188 @@ +# Ec600s GPIO and IO interrupt development + +This document is mainly based on ec600s and describes how to use quecpthon_ GPIO is usually used to connect drive LEDs, buzzers, relays, etc. it can also be used to read key, switch status, pin level status of external IC, etc. Through this article, you will learn all the setting parameters and usage of GPIO. + +## Hardware description + +At present, a total of 10 gpios are open, and other gpios are gradually open. The connection positions of each GPIO port are shown in the table below: + +Gpio1 – pin10 of the module +Gpio2 – pin11 of the module +Gpio3 – pin12 of the module +Gpio4 – pin13 of the module +Gpio5 – PIN14 of the module +Gpio6 – pin15 of the module +Gpio7 – pin16 of the module +Gpio8 - pin39 of the module +Gpio9 - pin40 of the module +Gpio10 - pin48 of the module + +![](media/9351c08c142de93cfa88095688ab7535.png) + +## Software design + +### Creating GPIO objects + +gpio = Pin(GPIOn, direction, pullMode, level) + +Function prototype: pin (gpion, direction, pullmode, level) returns a pgio object for reading and writing IO status. + +|Parameter | type | description| +| --------- | ---- | ------------------------------------------------------------ | +|Gpion | int | gpio1 – module pin10 gpio2 – module pin11 < br / > gpio3 – module pin12 gpio4 – module pin13 < br / > gpio5 – module PIN14 gpio6 – module pin15 < br / > gpio7 – module pin16 gpio8 – module pin39 < br / > gpio9 – module pin40 gpio10 – module pin48| +|Direction | int | in - input mode, out - output mode| +| pullMode | int | PULL_ Disable – floating mode < br / > pull_ Pu – pull-up mode < br / > pull_ PD – drop down mode| +|Level | int | 0 - set pin to low level, 1 - set pin to high level| + +### Get pin pin level + +state= gpio.read() + +Function prototype: read(), return the input level state of pin corresponding to creating GPIO object. + +|Parameter | type | description| +|-------|------|------------------| +|State | int | 0 low level, 1 high level| + +### Set pin level + +ret = gpio.Pin.write(value) + +Function prototype: write (value), set the pin output level state corresponding to the created GPIO object, and return the setting result. + +|Parameter | type | description| +|-------|------|-----------------------------------------------------------------------------------------| +|Value | int | 0 - when the pin pin is in the output mode, set the current pin pin output low 1 - when the pin pin is in the output mode, set the current pin output high| +|RET | int | 0 success - 1 Failure| + +## Interactive operation + +Qpycom tool and module are used for interaction. Examples are as follows: + +![](media/5c3518e6007b37481d75644bb6fc3659.png) + +be careful: + +1. Import pin is to make the pin module visible in the current space. + +2. Only the import pin module can use the functions and variables in pin. + +## Download verification + +Download the. Py file to the module for operation. The code is as follows: + +```python +from machine import Pin +gpio1 = Pin(Pin.GPIO1, Pin.OUT, Pin.PULL_DISABLE, 0) +ret = gpio1.write(1) +print(ret) +ret = gpio1.read() +print(ret) +ret = gpio1.write(0) +print(ret) +ret = gpio1.read() +print(ret) +``` + + + + + download code + +## External interrupt\_ Basic overview + +After understanding the ordinary GPIO, then introduce the external interrupt. The ordinary GPIO can query the level status of pin pin at any time, but it can not find the change of level in time, and the external interrupt can perfectly solve this problem. If the rising edge is set to trigger the external interrupt, the external interrupt will be triggered when the level rises from low level to high level, so as to execute the callback function immediately when the level changes. + +## Software design + +### To create an extint object: + +extint = ExtInt(GPIOn, mode, pull, callback) + +Function prototype: exint (gpion, mode, pull, callback), which returns an exint object to enable and disable interrupt response. + +|Parameter | type | description| +| -------- | -------- | ------------------------------------------------------------ | +|Gpion | int | gpio1 – module pin10 gpio2 – module pin11 < br / > gpio3 – module pin12 gpio4 – module pin13 < br / > gpio5 – module PIN14 gpio6 – module pin15 < br / > gpio7 – module pin16 gpio8 – module pin39 < br / > gpio9 – module pin40 gpio10 – module pin48| +| mode | int | IRQ_ Rising – rising edge triggers < br / > IRQ_ Falling – falling edge triggers < br / > IRQ_ RISING_ Falling – rising and falling edge trigger| +| pull | int | PULL_ Disable – floating mode < br / > pull_ Pu – pull-up mode < br / > pull_ PD – drop down mode| +|Callback | function | interrupt triggers callback function| + +### Allow interrupt + +ret = extint.enable() + +Function prototype: enable(), set the interrupt response corresponding to the creation of extint object, and return the setting result. + +|Parameter | type | description| +|------|------|--------------| +|RET | int | 0 success - 1 Failure| + +### Prohibit interrupt + +ret = extint.disable() + +Function prototype: disable(), set the interrupt response corresponding to the creation of extint object, and return the setting result. + +|Parameter | type | description| +|------|------|--------------| +|RET | int | 0 success - 1 Failure| + +## Interactive operation + +Qpycom tool and module are used for interaction. Examples are as follows: + +![](media/2d5c069c492cc483e86f32f3fe88480a.png) + +Note: args in the callback function fun (args) is the internal GPIO line number returned after pin interruption. It is generally not used, but it should also be set. + +## Download verification + +Download the. Py file to the module for operation. The code is as follows: + +``` +from machine import ExtInt +import utime +def fun1(args): + print(args) + print("1111111111111111111111") +def fun2(args): + print(args) + print("222222222222222222222") +extint1 = ExtInt(ExtInt.GPIO1, ExtInt.IRQ_FALLING, ExtInt.PULL_PU, fun1) extint1.enable() +extint2 = ExtInt(ExtInt.GPIO2, ExtInt.IRQ_FALLING, ExtInt.PULL_PU, fun2) extint2.enable() +while True: + utime.sleep_ms(200) + print("。。。。。。。。。") +``` + +Note: args in the callback function fun (args) is the internal GPIO line number returned after pin interruption. It is generally not used, but it must be set. + + + + + download code + +## Noun interpretation + +Low level: usually 0 is used to indicate low level + +High level: usually 1 is used to represent high level + +Rising edge: the edge rising from low level to high level + +Falling edge: edge rising from high level to low level + +Callback function: an ordinary function that is triggered to execute when the set conditions are met + +Floating: pin is straight out, there is no default level, and it is in an unstable state + +Pull up: a resistor inside pin is pulled to VCC, which defaults to high level + +Pull down: a resistor inside pin is pulled to GND, which defaults to low level + +Input: the level state of pin changes with the external + +Output: the level of pin drives the peripheral circuit + +Interrupt: stop executing the current program to execute another program. This process is called interrupt diff --git a/docs/Advanced_development/en/QuecPythonSub/I2C.md b/docs/Advanced_development/en/QuecPythonSub/I2C.md new file mode 100644 index 0000000000000000000000000000000000000000..461a902579d0c93c4ff01af44eb3391d06e5ebe8 --- /dev/null +++ b/docs/Advanced_development/en/QuecPythonSub/I2C.md @@ -0,0 +1,84 @@ +## Introduction + +This paper is based on ** ec600s v1.1 ** development board. Used to introduce the use of quecpthon I2C module. For detailed API of quecpthon I2C, please refer to +1. [quecpthon machine - hardware related functions - I2C](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=i2c) + +The main purpose of this article is to teach you how to use quecpython I2C library. For more basic knowledge, please Baidu ** I2C **. + +**I2C ** can also be called ** IIC **. The full name is ** inter integrated circuit **. + +### I2C introduction +Please refer to [I2C bus] by yourself(https://baike.baidu.com/item/I2C%E6%80%BB%E7%BA%BF),更多详细信息不在此赘述。 + +### I2C protocol basis +Taking the data written from the host to the slave as an example, its basic structure is shown in the figure, in sequence: + +**Start signal - slave address - read / write signal - data bit - reply bit -... - stop bit** + +![image-20210114104618677](media/Qp_Advanced_development_QuecPythonSub_i2c_bus_03.png) + +-Start signal (s): when SCL is at high level, SDA line switches from high level to low level; +-Stop signal (P): when SCL is high, SDA line switches from low level to high level. + +![image-20210114104649678](media/Qp_Advanced_development_QuecPythonSub_i2c_bus_04.png) + +Frame address: each device on I2C bus has its own independent address. When the host initiates communication, it sends the device address (slave) through SDA signal line_ Address) to find the slave. I2C protocol stipulates that the device address can be 7 bits or 10 bits. In practice, 7-bit address is widely used. + +I2C uses SDA signal line to transmit data and SCL signal line to synchronize data. The SDA data line transmits one bit of data in each clock cycle of SCL. During transmission, the data represented by SDA is valid when SCL is high level, that is, SDA represents data "1" at high level and data "0" at low level. When SCL is at low level, SDA data is invalid. Generally, SDA performs level switching at this time to prepare for the next presentation of data. + +Both data and address transmission of I2C have response. The response includes "ack" and "NACK". + +As the data receiving end, when the device (regardless of the master and slave) receives a byte data or address transmitted by I2C, if it wants the other party to continue to send data, it needs to send an "ack" signal to the other party, and the sender will continue to send the next data; If the receiving end wants to end the data transmission, it sends a "non response (NACK)" signal to the other party. After receiving the signal, the sender will generate a stop signal to end the signal transmission. + +### ** common I2C command formats** + +Common I2C buses have the following uses. +-Read the fixed length data of the specified peripheral and ** specified register **. +-Read the specified peripheral, ** specify the starting address **, and specify the length of data. +-Write the fixed data of the specified peripheral and ** specified register **. +-Write the data of the specified peripheral, ** specified starting address **, ** specified length **. +-Trigger an action by writing the specified register of the specified peripheral, and then wait for the peripheral to return data. + + +## Quick start +Download the ec600s schematic diagram on the official website. Determine the model of on-board temperature and humidity sensor +-** temperature and humidity sensor** +![温湿度传感器](media/Qp_Advanced_development_QuecPythonSub_i2c_bus_02.png) +For more information about ** temperature and humidity sensor **, please refer to ** [aht10 data manual] by yourself(http://www.aosong.com/userfiles/files/media/AHT10%E4%BA%A7%E5%93%81%E6%89%8B%E5%86%8C%20A2%2020201221.pdf)** 数据手册。 +Next, we control the temperature and humidity sensor through I2C bus. By consulting the manual, we can determine that the slave address is ** 0x38 **. + +```python +from machine import I2C + +def test_i2c(): + #To use I2C, we first need to allocate an I2C object + i2c_dev = I2C(I2C.I2C1, I2C.STANDARD_MODE) + #Then we need to declare the address of the slave + addres = 0x19 + #You also need to declare the address of the read register + LIS2DH12_WHO_AM_I = 0x0F #Onboard triaxial acceleration sensor identity register + """ +Finally, we need to allocate a space to store data. Here we can use the list [0x00], +Tuples (0x0) can also be used. Remember + """ + r_data = bytearray((0x00)) + #Remember that you need to convert the data to a bytearray type + i2c_dev.read(addres, bytearray(LIS2DH12_WHO_AM_I), 1, r_data, 1, 1) + print("read data lis2dh12 who_am_i reg 0x{0:02x}".format(list(r_data)[0])) + + #In the following demonstration, write data first, and then read data. + LIS2DH12_CTRL_REG2 = 0x21 # + w_data = [0x04] #Write the data you want + print("write 0x04 to 0x21") + i2c_dev.write(addres, bytearray(LIS2DH12_CTRL_REG2), 1, bytearray(w_data), + len(w_data)) + i2c_dev.read(addres, bytearray(LIS2DH12_CTRL_REG2), 1, r_data, 1, 1) + print("read 0x{0:02x} from 0x{1:02x}".format( + list(r_data)[0], LIS2DH12_CTRL_REG2)) + print("test_i2c funcation has exited") + pass + + +if __name__ == "__main__": + test_i2c() +``` diff --git a/docs/Advanced_development/en/QuecPythonSub/PM.md b/docs/Advanced_development/en/QuecPythonSub/PM.md new file mode 100644 index 0000000000000000000000000000000000000000..8deae34d2126ded50228318aa29f0ec3cf295817 --- /dev/null +++ b/docs/Advanced_development/en/QuecPythonSub/PM.md @@ -0,0 +1,152 @@ +## Revision history + +|Version | date | author | change statement| +| ---- | --------- | ----- | ------------------------------------------ | +|1.0 | 2021-3-31 | David | was transplanted from Wiki and made a detailed description and test based on the code| + +## Introduction to low power consumption + +This article mainly introduces the use of quecpthon low-power library. This document is mainly based on ec600s and describes how to use quecpthon\_ Low power consumption mode. In embedded applications, the power consumption of products is paid more and more attention by users; The requirements of battery powered equipment on product power consumption are particularly obvious. Reducing the power consumption of the product and prolonging the service life of the battery can reduce the operating cost of the product and improve the market competitiveness of the product. The minimization of power consumption of mobile communication module products needs to start with software and hardware design. This document focuses on how to minimize power consumption through software design. + +## Quick start + +For API information, please refer to [quecpthon wiki low power library information](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=pm-%e4%bd%8e%e5%8a%9f%e8%80%97) + +### How to enter low power consumption + +If the module needs to enter the low power consumption mode, the following conditions must be met: + +-USB unplug +-All system wake-up locks are released (the number of wake-up locks can be accessed through ** pm.get_ wakelock_ Num() ** interface acquisition) +-No external pin interrupt interference +-Enable the system to automatically enter sleep (specific interface: ** PM. Autosleep (sleep)_ flag)**) +-CFUN = 0 or it is in normal network injection state + +### Principle of low power consumption + +First, briefly introduce the CPU log and list some processes as follows: + +| priority | thread name | scheduled count | total run tick | percentage | +| -------- | ----------- | --------------- | -------------- | ----------- | +| 0 | System T | 57522 | 3275860 | 0.108458% | +| 0 | NUTick | 3814 | 144837 | 0.004795% | +| 2 | UsbSusH | 2 | 238 | 0.000008% | +| 2 | UsbTimeH | 2 | 78 | 0.000003% | +| 2 | UsbPcgH | 2 | 55 | 0.000002% | +| 2 | usbWakeU | 4 | 317 | 0.000010% | +| 2 | UsbCConn | 4 | 3611 | 0.000120% | +| 2 | Mdm1TxH | 12 | 1227 | 0.000041% | +| 103 | quec_led | 392 | 2546432 | 0.084308% | +| 113 | quecpyth | 57460 | 2787610 | 0.092293% | +| 255 | CommPM_L | 71377 | 7341327913 | 243.059120% | +| 254 | CommPM_s | 70706 | 1721021 | 0.056980% | + +From the CPU log, it can be seen that the operation of the CPU is composed of multiple levels and multiple processes. For the operation of the module, the control right of these multi processes over the CPU belongs to preemptive scheduling, that is, when the priority of a process in the ready queue (e.g. system t in the above table) is higher than that of the process running in the processor (e.g. nutick in the above table), it will preempt the process nutick, force nutick to be in the ready queue and directly run the process system t, When the process in the system is ready, the highest priority of the process in the system is judged. If the process in the system is ready, the priority of the process in the system is judged. + +Then, for the sleep process of the module, the module will enter sleep and reduce power consumption only when many processes with higher priority than the sleep process are running without tasks, that is, all processes release their CPU control. + +### How to check whether to enter low power consumption + +For the low power consumption mode of the module, we can view it from two aspects: software and hardware. + +#### Software + +When the module is in normal operation, use qcom to connect the virtual at port of the module and send the at instruction (at + log = 80,1). This instruction will print the flag and register values related to internal sleep from the debugging serial port regularly for 3S. At this time, you can view the log information through the debug port of the module, as follows: + +![pm_log](media/pm_log.jpg) + +**Tips:** + +-For the debug port, you can use the hardware debug port or the USB virtual debug port, and you can see the log information +-In the process of testing the current consumption, if you want to obtain the log information, you can only connect the hardware debug port. The reason is that the USB cannot enter sleep without unplugging + +The above log mainly views the first four parameters: + +-Pmenablessleep: Master sleep switch +-Pmenablessleep: allow sleep switch +-Pmenablessleep: USB status +-Pmenablessleep: UART status + +The above four parameters are "1, 1, 0, 0", which basically indicates that the module has entered sleep. The following parameter is the value of the wake-up register, through which you can see which wake-up sources have not been cleared. + +#### Hardware + +Sleep state test: check the actual current value + +### Wake source + +-External pin interrupt wake-up. For ec600s, the GPIO supporting interrupt wake-up is listed as follows: + + |GPIO number ** module pin **| +| -------- | ------------ | + |Gpio1 | pin No. 10| + |Gpio2 | pin No. 11| + |Gpio3 | pin No. 12| + |Gpio4 | pin No. 13| + |Gpio5 | pin 14| + |Gpio6 | pin No. 15| + |Gpio7 | pin No. 16| + |Gpio8 | pin No. 39| + |Gpio9 | pin No. 40| + |Gpio10 | pin 48| + |Gpio11 | pin No. 58| + |Gpio12 | pin No. 59| + |Gpio13 | pin No. 60| + |Gpio14 | pin No. 61| + +-Phone, SMS, network data wake-up + +### Current consumption test (commissioning with the help of the open-evb board) + +Environment construction: + +Disconnect the USB power supply to the module (remove r0106 in the figure), and supply power to the module through the program-controlled power supply (the positive and negative poles are connected to the VABT and GND of the module respectively). The hardware reference connection diagram is as follows. + +![image-20210326134332982](media/pm_Hardware_connection.png) + +**Tips:** + +The above figure shows quectel lteevb-kit [development base plate], which can be purchased by Taobao in "Yiyuan flagship store"; Or you can fly your own cable to supply power to the module separately (Vbat_ BB、VBAT_ RF requires 3.8V power supply) + +Coding: + +Write the following code, save it as a. Py file, and then download it to the module to run. + +```python +import pm +import utime +lpm_fd = pm.create_wakelock("test_lock", len("test_lock")) #Create wakelock lock lock +pm.autosleep(1) #Set auto sleep mode +#Simulation test, please select and use according to the business scenario for actual development +while 1: + utime.sleep(10) #dormancy + res = pm.wakelock_lock(lpm_fd) #Add lock + print("ql_lpm_idlelock_lock, g_c1_axi_fd = %d" %lpm_fd) + print("unlock sleep") + utime.sleep(10) + res = pm.wakelock_unlock(lpm_fd) #Release lock + print(res) + print("ql_lpm_idlelock_unlock, g_c1_axi_fd = %d" % lpm_fd) + num = pm.get_wakelock_num() #Gets the number of locks created + print(num) +``` + +The current consumption test results are as follows: + +The current consumption during sleep is about 1mA, as shown in the screenshot below + +pm_1mA + +The current consumption during non sleep is about 15mA, as shown in the screenshot below + +pm_15mA + +**Tips:** + +The above test data is the sleep reference value and the measured low-power consumption current value in the scene. You can set up your own environment for relevant tests. If you encounter any problems in the test, please contact QQ group: 445121768 and answer them online. + +## Interpretation of professional terms + +>** lock **: the module is not allowed to enter the low power consumption mode + +>** release lock **: as opposed to locking, it allows the module to enter the low-power mode diff --git a/docs/Advanced_development/zh/QuecPythonSub/Power.md b/docs/Advanced_development/en/QuecPythonSub/Power.md similarity index 50% rename from docs/Advanced_development/zh/QuecPythonSub/Power.md rename to docs/Advanced_development/en/QuecPythonSub/Power.md index e3fbfb644a6cf2bf6419f618d8d1b278ec129398..d24be2b5810c2d5cc67c8afe0532d9a010e64fe9 100644 --- a/docs/Advanced_development/zh/QuecPythonSub/Power.md +++ b/docs/Advanced_development/en/QuecPythonSub/Power.md @@ -1,6 +1,6 @@ -# Quecpython Power开关机开发 +# Development of quecpython power switch -本文主要介绍QuecPython Power 模块的使用。 Power模块提供关机、软件重启、电压检测功能,可以用作远程关机等操作,包含的API有: +This article mainly introduces the use of quecpthon power module. The power module provides shutdown, software restart and voltage detection functions, which can be used for remote shutdown and other operations. The APIs include: - **Power.powerDown()** - **Power.powerRestart()** @@ -8,16 +8,16 @@ - **Power. powerDownReason()** - **Power. getVbatt()** -具体的API 详解请参考 [QuecPython-misc - 其他-Power](https://python.quectel.com/wiki/api/#power) +For specific API details, please refer to [quecpthon misc - other - power](https://python.quectel.com/wiki/api/#power) -本文档适用于移远通信如下模块: +This document is applicable to the following modules of mobile communication: - EC100Y-CN - EC600S-CN -## 交互使用 +## Interactive use ```python >>> from misc import Power @@ -34,12 +34,12 @@ powerDown powerDownReason powerOnReason powerRestart -## 实验代码 +## Experimental code -执行脚本以后,使用定时中断设置5秒以后睡眠。 +After executing the script, use the timed interrupt to set the sleep after 5 seconds. ```python -# 使用定时器,定时关机 +#Use the timer to shut down regularly from machine import Timer from misc import Power import utime as time @@ -50,10 +50,10 @@ def CallBack(t): def test_power_module(): - # 创建一个定时器对象 + #Create a timer object T = Timer(Timer.Timer1) - # period 单位为 ms - T.start(period=5000, mode=Timer.ONE_SHOT, callback=CallBack) # 启动定时器 + #Period in MS + T.start(period=5000, mode=Timer.ONE_SHOT, callback=CallBack) #Start timer # wait while True: time.sleep_ms(1) @@ -65,7 +65,7 @@ if __name__ == "__main__": ``` -## 配套代码 +## Matching code - - 下载代码 \ No newline at end of file + + download code diff --git a/docs/Advanced_development/en/QuecPythonSub/Qp_sub_PWM.md b/docs/Advanced_development/en/QuecPythonSub/Qp_sub_PWM.md new file mode 100644 index 0000000000000000000000000000000000000000..540632fbe08db473e8b1de74f4b81026a941d489 --- /dev/null +++ b/docs/Advanced_development/en/QuecPythonSub/Qp_sub_PWM.md @@ -0,0 +1,130 @@ +## QuecPython PWM development +This article mainly introduces how to use the quecpthon PWM library, + +### Introduction to PWM +PWM is a digital coding method for analog signal level. The bias of transistor base or MOS gate is modulated according to the change of corresponding load to change the on time of transistor or MOS, so as to change the output of switching regulated power supply. This method can keep the output voltage of the power supply constant when the working conditions change. It is a very effective technology to control the analog circuit by using the digital signal of the microprocessor. Pulse width modulation is a very effective technology to control analog circuits by using the digital output of microprocessor. It is widely used in many fields from measurement, communication to power control and transformation. + +## Quick start + +For API information, please refer to [quecpthon wiki PWM library information](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=pwm) +Next, we use ec600s v1.1 hardware and use pin 69 G1 to send PWM waveform. +![EC600S V1.1 硬件-PWM 引脚连接](media/Qp_Advance_develop_Sub_pwm01.jpg) + +Connect the red and blue wires to the logic analyzer. Then run the following code to grab the waveform. + + + +The PWM API interface is divided into three levels: 1ms, 10us and 1US. + + + +```python +from misc import PWM +import utime as time +import log + + +class pwmclass(): + def __init__(self): + self.Log = log.basicConfig() + self.Log = log.getLogger("pwm_class") + # self.Log.setLevel(log.INFO) + self.Log.setLevel(log.DEBUG) + self.pwm = None + pass + + """ +Note: ec100ycn platform supports pwm0 ~ pwm3, and the corresponding pins are as follows: +Pwm0 – pin 19 +Pwm1 – pin 18 +Pwm2 – pin 23 +Pwm3 – pin 22 + +Note: ec600scn platform supports pwm0 ~ pwm3, and the corresponding pins are as follows: +Pwm0 – pin 52 +Pwm1 – pin 53 +Pwm2 – pin 70 +Pwm3 – pin 69 + """ + + #Fre frequency is k, (0.0 ~ 1000] + # Duty_Cycle (0~1) + def init(self, Pwm_pin=PWM.PWM3, fre=1, Duty_Cycle=0.5): + # https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=pwm + + #Calculate the high and low levels according to the frequency + #Calculate the cycle time + if (fre <= 0) or (fre > 1000): + self.Log.error( +"Error: {0} unsupported frequency parameter, please enter (frequency in the range of 0 ~ 1000]k). Format (FRE)) + if (Duty_Cycle < 0.000) or (Duty_Cycle >= 1): + self.Log.error( +"Error: {0} unsupported duty cycle parameter, please enter the frequency in the range of (0 ~ 1.0)". Format (duty)_ Cycle)) + #Unit us + cycle_time = int(1 * 1000 / fre) + hight_time = int(cycle_time * Duty_Cycle) +Self. Log. Info ('set {0} device frequency to {1} kHz +Cycle is {2} US duty cycle {3} us "" ". Format (PWM_ pin, fre, cycle_ time, + hight_time)) + #MS cycle range + #Period (1K us ~ 1000K US) + if cycle_time > 1000: + self.pwm = PWM(Pwm_pin, PWM.ABOVE_MS, int(hight_time / 1000), + int(cycle_time / 1000)) + #The cycle is 10us ~ 15.75ms + if (cycle_time > 10) and (cycle_time < 15750): + self.pwm = PWM(Pwm_pin, PWM.ABOVE_10US, int(hight_time / 10), + int(cycle_time / 10)) + #Period (0 ~ 157us) + if (cycle_time > 0) and (cycle_time < 157): + self.pwm = PWM(Pwm_pin, PWM.ABOVE_1US, hight_time, cycle_time) + + def deinit(self, fre=0): + self.pwm = None + pass + + def start(self, fre=1): +Self. Log. Info ("start outputting PWM waveform". Format()) + if self.pwm is not None: + self.pwm.open() + pass + + def stop(self): + if self.pwm is not None: + self.pwm.close() + pass + + +def test_pwm(fre, duty, delay=2): + obj_pwm = pwmclass() + obj_pwm.init(fre=fre, Duty_Cycle=duty, Pwm_pin=PWM.PWM3) + obj_pwm.start() + time.sleep(delay) + obj_pwm.stop() + obj_pwm.deinit() + + +if __name__ == "__main__": + #Frequency 1K, duty cycle 0.1 + test_pwm(fre=1, duty=0.1) + #Frequency 10K, duty cycle 0.2 + test_pwm(fre=10, duty=0.2) + #Frequency 100k, duty cycle 0.4 + test_pwm(fre=100, duty=0.4) + +``` +![占空比 0.2 频率为 10K](media/Qp_Advance_develop_Sub_pwm02.jpg) + +Above, we show the encapsulated ** pwmclass ** direct output, 1K, 10K and 100k waveforms. + +### Noun interpretation + +PWM: pulse width modulation + +High level: usually higher than 0.8V, it is considered as high level + +Low level: generally lower than 0.6V, it is considered as low level + +Cycle: sum of low-level and high-level time + +Duty cycle: the proportion of high level in the whole cycle diff --git a/docs/Advanced_development/en/QuecPythonSub/README.md b/docs/Advanced_development/en/QuecPythonSub/README.md new file mode 100644 index 0000000000000000000000000000000000000000..845bded77b635f78f325a1aafd2b9a1ea3890b2a --- /dev/null +++ b/docs/Advanced_development/en/QuecPythonSub/README.md @@ -0,0 +1,47 @@ +# QuecPython driver subsystem +## Platform driven development +[quecpthon RTC development](zh-cn/QuecPythonSub/RTC.md) + +[quecpthon timer development](zh-cn/QuecPythonSub/Timer.md) + +[quecpthon watchdog development](zh-cn/QuecPythonSub/WDT.md) + +[quecpthon power switch development](zh-cn/QuecPythonSub/Power.md) + +[quecpthon low power development](zh-cn/QuecPythonSub/PM.md) + + + +## Audio development + +[quecpthon audio playback](zh-cn/QuecPythonSub/Audio.md) + + + +[quecpthon TTS module development](zh-cn/QuecPythonSub/TTS.md) + +## Bus development + +[quecpthon GPIO and IO interrupt development](zh-cn/QuecPythonSub/GPIO.md) + +[quercpthon UART development](zh-cn/QuecPythonSub/UART.md) + +[quecpthon I2C bus development](zh-cn/QuecPythonSub/IIC.md) + +[quecpthon PWM development](zh-cn/QuecPythonSub/PWM.md) + +[ADC development](zh-cn/QuecPythonSub/ADC.md) + +[quecpthon SPI bus development](zh-cn/QuecPythonSub/SPI.md) + +## Peripheral debugging + + + +[quecpthon LCD debugging process](zh-cn/QuecPythonSub/LCD.md) + +[quecpthon sensor debugging process](zh-cn/QuecPythonSub/Sensor.md) + + + + diff --git a/docs/Advanced_development/en/QuecPythonSub/RTC.md b/docs/Advanced_development/en/QuecPythonSub/RTC.md new file mode 100644 index 0000000000000000000000000000000000000000..3b854fb359d11ad3fe57dbefc6692c770e8bf54d --- /dev/null +++ b/docs/Advanced_development/en/QuecPythonSub/RTC.md @@ -0,0 +1,79 @@ +# QuecPython RTC instructions + +## Software design + +### Create RTC object + +RTC = RTC (), no parameter, no return value. + +### Set RTC time + +rtc.datetime([year, month, day, week, hour, minute, second, microsecond]) + +With parameters, the time can be set; When setting the time, the parameter week is not involved in the setting. The microsecond parameter is reserved and not used. The default is 0. Specific parameters are as follows: + +|Parameter | type | description| +|-------------|------|--------------------------------------------------------------| +|Year | int || +|Month | int | month| +|Day | int | day| +|Week | int | week. When setting the time, this parameter does not work and is reserved; This parameter is valid when getting time| +|Hour | int || +|Minute | int | min| +|Second | int | second| +|Microsecond | int | microseconds. The parameter is reserved and not used yet. When setting the time, the parameter can be written as 0| + +Return value: the integer value 0 is returned after successful startup, and the integer value - 1 is returned after failure. + +### Get RTC time + +rtc.datetime() + +When there is no parameter, it is used to obtain the time. + +Return value: when obtaining time, a tuple containing date and time is returned. The format is as follows: [year, month, day, week, hour, minute, second, microsecond] + +## Interactive operation + +Use qpycom tools to interact with modules. + +![](media/f2a690aaeb6e47658a02fc03ab7eedc1.png) + +be careful: + +1. From machine import RTC is to make the RTC module visible in the current space. + +2. Only from machine import RTC module can use functions and variables in RTC. + +3. The above operations are not connected to any peripherals and are only used as a reference for familiar instructions. + +## Download verification + +### Software code + +Download the. Py file to the module for operation. The code is as follows: + +``` +from machine import RTC +rtc = RTC() +rtc_ before_ Set = RTC. Datetime() # query date time +print(rtc_ before_ Set) # print time +Rtc.datetime ([2020, 3, 12, 1, 12, 12, 0]) # setting time +rtc_ after_ Set = RTC. Datetime() # query date time +print(rtc_ after_ Set) # print time +``` + +### Operation effect + +Open qpycom and run RTC\_ File.py, as shown below: + +![](media/933970b3720e7ebda87f77e2669bee7d.png) + +You can view the output results in the qpycom interactive interface: + +![](media/29423f9b58431c5881424d7510039b96.png) + +## Matching code + + + download code diff --git a/docs/Advanced_development/en/QuecPythonSub/SPI.md b/docs/Advanced_development/en/QuecPythonSub/SPI.md new file mode 100644 index 0000000000000000000000000000000000000000..9f002ff1cea28d71c164910bc174c69103ee4624 --- /dev/null +++ b/docs/Advanced_development/en/QuecPythonSub/SPI.md @@ -0,0 +1,96 @@ +# QuecPython SPI bus development + +## API introduction + +Taking ec600s-cn module as an example, this paper mainly introduces the use of SPI in quecpthon machine module. The API included in this module includes: + +- **machine.SPI(port, mode, clk)** + +- **SPI.wtite(data,datalen)** + +- **SPI.read(data,datalen)** + +- **SPI.write_read(r_data,data, datalen)** + + + +For specific API details, please refer to [quecpthon machine - SPI](https://python.quectel.com/wiki/api/#spi) + +This document is applicable to the following modules of mobile communication: + +- EC100Y-CN +- EC600S-CN + +## SPI introduction + +SPI is the abbreviation of English serial peripheral interface. As the name suggests, it is the serial peripheral interface. It was first defined by Motorola on its mc68hcxx series processors. SPI interface is mainly used between EEPROM, flash, real-time clock, AD converter, digital signal processor and digital signal decoder. SPI is a high-speed, full duplex and synchronous communication bus, and only occupies four wires on the pins of the chip, which saves the pins of the chip, saves space and provides convenience for the layout of PCB. It is precisely because of this simple and easy-to-use characteristic that more and more chips have integrated this communication protocol. + + + +## SPI features + +### The control mode of master-slave mode is adopted + +SPI specifies that the communication between two SPI devices must be controlled by the master device (slave). A master device can control multiple slave devices by providing clock and selecting slave devices. SPI protocol also stipulates that the clock of slave devices is provided to slave devices by the master device through SCK pins, The slave device itself cannot generate or control a clock. Without a clock, the slave device cannot work normally + + + +### Synchronous data transmission is adopted + +The master device will generate the corresponding clock pulse according to the data to be exchanged. The clock pulse constitutes the clock signal. The clock signal controls when the data is exchanged between the two SPI devices and when the received data is sampled through the clock polarity (cpol) and clock phase (CPHA), so as to ensure that the data is transmitted synchronously between the two devices + +![](media\SPI_1.jpg) + +### Data exchanges + +​ The data transmission between SPI devices is also called data exchange because the SPI protocol stipulates that an SPI device cannot only act as a "transmitter" or "receiver" in the process of data communication. In each clock cycle, the SPI device will send and receive a bit of data, It is equivalent to that the device has a bit size of data to be exchanged. A slave device must be accessible by the master device before it can receive the control signal sent by the master. Therefore, the master device must first select the slave device through the SS / CS pin and select the slave device to be accessed. In the process of data transmission, Each received data must be sampled before the next data transmission. If the previously received data is not read, these received data may be discarded, resulting in the final failure of the SPI physical module. Therefore, in the program, generally, the data in the SPI device will be read after the SPI transmits the data, Even if this data is useless in our program. + +### SPI has four transmission modes + +Rising edge, falling edge, leading edge and trailing edge trigger. Of course, there are also MSB and LSB transmission modes + +![](media\spi_2.jpg) + + + +### SPI can only be divided into master mode and slave mode. + +There is no saying of reading and writing, because essentially every SPI is the master-slave device exchanging data. In other words, if you send a data, you will inevitably receive a data; If you want to receive a data, you must also send a data first. + + + + + +## Communication using SPI + +The hardware version of the code shown in this article is ec600s-cn v1.1. + +```python +# -*- coding: UTF-8 -*- + +from machine import SPI +import utime + +def spi_test(): + spi_obj = SPI(1, 0, 1) + r_data = bytearray(5) + data = b"world" + # print(data) + ret = spi_obj.write_read(r_data, data, 5) + if ret is None: + print('----------', ret) + print('#########', r_data) + + +if __name__ == '__main__': + while True: + spi_test() + utime.sleep(1) + +``` + +## Matching code + + + + download code diff --git a/docs/Advanced_development/zh/QuecPythonSub/Sensor.md b/docs/Advanced_development/en/QuecPythonSub/Sensor.md similarity index 50% rename from docs/Advanced_development/zh/QuecPythonSub/Sensor.md rename to docs/Advanced_development/en/QuecPythonSub/Sensor.md index 08f694fb7e2e45c61b49abb73cd1c0d9345db196..e9c0b150a897bf9e8fbc6889b76674b539661a72 100644 --- a/docs/Advanced_development/zh/QuecPythonSub/Sensor.md +++ b/docs/Advanced_development/en/QuecPythonSub/Sensor.md @@ -1,50 +1,50 @@ -# QuecPython sensor调试流程 +# QuecPython sensor debugging process -本文档主要介绍传感器的调试流程。本文以调试EC600S-CN V1.1 版本的板载温湿度传感器为例,介绍如何调试传感器。 +This document mainly introduces the commissioning process of the sensor. Taking the debugging of ec600s-cn v1.1 onboard temperature and humidity sensor as an example, this paper introduces how to debug the sensor. -本文档适用于移远通信如下模块: +This document is applicable to the following modules of mobile communication: - EC100Y-CN - EC600S-CN -## 分析原理图 +## Analysis schematic diagram -首先,分析原理图,确定传感器的型号,参数,引脚等配置。 +Firstly, the schematic diagram is analyzed to determine the model, parameters and pin configuration of the sensor. -打开[EC600S 开发板 原理图](https://python.quectel.com/download.html#others)。 +Open [ec600s development board schematic](https://python.quectel.com/download.html#others)。 ![image-20210121141307016](media/image-20210121141307016.png) -即可看到温湿度传感器型号为 AHT10 , 6个引脚,且通过SDA SCL引脚和外部通信。 +It can be seen that the model of temperature and humidity sensor is aht10, with 6 pins, and communicates with the outside through SDA SCL pin. -## 查阅数据手册 +## Refer to the data manual -搜索关键词**AHT10 datesheet filetype:pdf** 。找到datasheet,最终找到[aht10规格书v1.1](http://www.aosong.com/userfiles/files/media/aht10%E8%A7%84%E6%A0%BC%E4%B9%A6v1_1%EF%BC%8820191015%EF%BC%89.pdf) +Search keywords ** aht10 datesheet filetype: PDF **. Find datasheet and finally find [aht10 specification v1.1](http://www.aosong.com/userfiles/files/media/aht10%E8%A7%84%E6%A0%BC%E4%B9%A6v1_1%EF%BC%8820191015%EF%BC%89.pdf) ![image-20210121141532781](media/image-20210121141532781.png) -查阅datasheet,即可查阅到以下基本信息。 +Check the datasheet to find the following basic information. -1. AHT10,新一代温湿度传感器。 -2. 数字输出,I2C接口。 -3. 引脚定义,如下图所示: +1. Aht10, a new generation of temperature and humidity sensor. +2. Digital output, I2C interface. +3. Pin definition, as shown in the figure below: ![image-20210121142652639](media/image-20210121142652639.png) -如需在开发板上确定芯片的引脚序号,芯片周围有小白点的引脚即为1号引脚;引脚顺序为逆时针旋转。 +If the pin number of the chip needs to be determined on the development board, the pin with a small white dot around the chip is pin 1; The pin sequence is counterclockwise rotation. -## 确定数据交互 +## Determine data interaction -获取具体参数后,需要通过总线和传感器交互数据。关于I2C总线的详细信息,请参考 [I²C(IIC)总线协议详解—完整版](https://zhuanlan.zhihu.com/p/149364473)。 +After obtaining the specific parameters, the data needs to be exchanged with the sensor through the bus. For details of I2C bus, refer to [i] ² Detailed explanation of C (IIC) bus protocol - full version](https://zhuanlan.zhihu.com/p/149364473)。 -阅读数据手册,确定传感器的开发流程。以下步骤都需要在传感器上电后操作: +Read the data book and determine the development process of the sensor. The following steps need to be operated after the sensor is powered on: -1. 上电后需要等待40 ms,读取温湿值之前,首先看状态字的校准使能位**Bit[3]**是否为1。若不为1,则发 送**0XE1**命令 ( 初 始 化),该命令参数有两个字节,第一个字节为**0x08**,第二个字节为**0x00**。 -2. 发送触发测量命令**0xac**,该命令参数有两个字节,第一个字节为**0x33**,第二个字节为**0x00**。 -3. 等待75 ms待测量完成,忙状态**Bit[7]**为 0,然后可以读取6个字节(发送**0X71**命令即可读取)。 -4. 计算温湿度值。 +1. Wait for 40ms after power on. Before reading the temperature and humidity value, first check whether the calibration enable bit ** bit [3] ** of the status word is 1. If it is not 1, send ** 0xe1 ** command (initialization). The command parameter has two bytes, the first byte is ** 0x08 **, and the second byte is ** 0x00 **. +2. Send the trigger measurement command ** 0xac **. The command parameter has two bytes, the first byte is ** 0x33 **, and the second byte is ** 0x00 **. +3. Wait for 75 ms to complete the measurement. The busy status ** bit [7] ** is 0, and then 6 bytes can be read (read by sending ** 0x71 ** command). +4. Calculate the temperature and humidity value. ![image-20210121144624090](media/image-20210121144624090.png) @@ -58,24 +58,24 @@ write: 0x70 0xac 0x33 0x00 ```python write: 0x71 -read: 6个字节 +Read: 6 bytes ``` -## 实验代码 +## Experimental code -确定了传感器的初始化以及使能命令后,执行以下代码,以使能传感器。 +After determining the initialization of the sensor and the enable command, execute the following code to enable the sensor. -### 声明变量 +### Declare variable ```python from machine import I2C import utime as time -# 声明一个I2C 对象 +#Declare an I2C object i2c_dev = I2C(I2C.I2C1, I2C.STANDARD_MODE) i2c_addre = 0x38 ``` -### 读写函数 +### Read write function ```python def read_data(length): @@ -95,11 +95,11 @@ def write_data(data): ``` -### 初始化函数,触发检测函数 +### Initialization function, trigger detection function ```python def init(): - # 设置校准位 + #Set calibration bit write_data([0xE1, 0x08, 0x00]) time.sleep_ms(300) # at last 300ms @@ -109,12 +109,12 @@ def trigger_measure(): pass ``` -### 温度转换函数 +### Temperature conversion function ```python def aht10_transformation_temperature(data): r_data = data - # 根据数据手册的描述来转化温度 + #Convert the temperature as described in the data book humidity = (r_data[0] << 12) | ( r_data[1] << 4) | ((r_data[2] & 0xF0) >> 4) humidity = (humidity/(1 << 20)) * 100.0 @@ -132,7 +132,7 @@ def read_temperature(): pass ``` -### 运行 +### Run ```python init() @@ -143,12 +143,12 @@ while True: time.sleep_ms(500) ``` -### 完整代码 +### Complete code ```python from machine import I2C import utime as time -# 声明一个I2C 对象 +#Declare an I2C object i2c_dev = I2C(I2C.I2C1, I2C.STANDARD_MODE) i2c_addre = 0x38 @@ -170,7 +170,7 @@ def write_data(data): def init(): - # 设置校准位 + #Set calibration bit write_data([0xE1, 0x08, 0x00]) time.sleep_ms(300) # at last 300ms @@ -179,12 +179,12 @@ def trigger_measure(): write_data([0xac, 0x33, 0x00]) pass -# 温湿度转换函数 +#Temperature humidity conversion function def aht10_transformation_temperature(data): r_data = data - # 根据数据手册的描述来转化温度 + #Convert the temperature as described in the data book humidity = (r_data[0] << 12) | ( r_data[1] << 4) | ((r_data[2] & 0xF0) >> 4) humidity = (humidity/(1 << 20)) * 100.0 @@ -211,7 +211,7 @@ while True: ``` -## 配套代码 +## Matching code -[代码下载](code/example_sensor_base.py) +[code download](code/example_sensor_base.py) diff --git a/docs/Advanced_development/en/QuecPythonSub/TTS.md b/docs/Advanced_development/en/QuecPythonSub/TTS.md new file mode 100644 index 0000000000000000000000000000000000000000..3c2c11241df7eb158214a5b8a33486230822860a --- /dev/null +++ b/docs/Advanced_development/en/QuecPythonSub/TTS.md @@ -0,0 +1,128 @@ +## Revision history +|Version | date | author | change statement| +|------|------|------|------| +|1.0 | 2021-3-25 | gary.zhou | First Edition| + +## QuecPython TTS module development + +This article mainly introduces the use of TTS module in quecpthon audio module. TTS is a kind of speech synthesis application. It stores files stored in the computer, such as help files or [web pages](https://baike.baidu.com/item/网页/99347)转换成自然语音输出。TTS不仅能帮助有[视觉障碍](https://baike.baidu.com/item/视觉障碍/5582072)的人阅读计算机上的信息,更能增加[文本文档](https://baike.baidu.com/item/文本文档/557654)的可读性。TTS应用包括语音驱动的邮件以及声音敏感系统,并常与声音识别程序一起使用。 + + +## API introduction + +The TTS API provided by mobile communication supports volume setting, playback speed setting, etc. +For specific API details, please refer to [quecpthon audio - audio playback TTS](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=tts) + +This document is applicable to the following modules of mobile communication: + +- EC100Y-CN +- EC600S-CN + + +## Play sound using TTS + +The hardware version of the code shown in this article is ec600s-cn v1.1. External speakers are required to play sound on the development board. Please refer to [quecpthon driver subsystem audio playback] for speaker parameters and connection methods(https://python.quectel.com/doc/doc/Advanced_development/zh/QuecPythonSub/Audio.html) + +## Interactive experiment + +### Play TTS + +```python +import audio +from machine import Pin +#Create TTS object +tts = audio.TTS(0) +#Enable GPIO pin +#Pin(Pin.GPIO10, Pin.OUT, Pin.PULL_ PD, 1) # self use commissioning board +Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) #Official board v1.1 use +#Pin(Pin.GPIO9, Pin.OUT, Pin.PULL_ PD, 1) # official board v1.2 use +#TTS voice playback +tts.play(1, 1, 2, '1111111111111111') +``` + + +### Set volume + +```python +import audio +from machine import Pin +tts=audio.TTS(0) +#Set TTS volume +tts.setVolume(5) +#Enable GPIO pin +#Pin(Pin.GPIO10, Pin.OUT, Pin.PULL_ PD, 1) # self use commissioning board +Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) #Official board v1.1 use +#Pin(Pin.GPIO9, Pin.OUT, Pin.PULL_ PD, 1) # official board v1.2 use +tts.play(1, 1, 2, '12345') +``` + + +### Set playback speed + +```python +import audio +from machine import Pin +tts=audio.TTS(0) +#Set TTS playback speed +tts.setSpeed(9) +#Enable GPIO pin +#Pin(Pin.GPIO10, Pin.OUT, Pin.PULL_ PD, 1) # self use commissioning board +Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) #Official board v1.1 use +#Pin(Pin.GPIO9, Pin.OUT, Pin.PULL_ PD, 1) # official board v1.2 use +tts.play(1, 1, 2, '12345') +``` + + +## Experimental code + +Try playing with different sounds and speech speeds. + +```python + +import audio +import utime as time +from machine import Pin + + +def play(tts, strList): + for Str in strList: + while tts.getState(): + time.sleep_ms(5) + tts.play(1, 1, 2, Str) + pass + + +def test_tts_base(): + ''' +The external speaker plays the recording file, and the parameter is 0 + ''' + tts = audio.TTS(0) + ''' +Enable external horn + ''' + #Enable GPIO pin + #Pin(Pin.GPIO10, Pin.OUT, Pin.PULL_ PD, 1) # self use commissioning board + Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) #Official board v1.1 use + #Pin(Pin.GPIO9, Pin.OUT, Pin.PULL_ PD, 1) # official board v1.2 use + for i in range(1, 9): + #Cycle bad play to increase sound + tts.setVolume(i) +Play (TTS, ['12345 ','Hello']) + tts.setVolume(5) + for i in range(1, 9): + #Cycle to increase speech speed + tts.setSpeed(i) +Play (TTS, ['Hello world ',' hello move far ']) + print("test_tts_base has exited") + + +if __name__ == "__main__": + test_tts_base() + +``` + + +## Matching code + + *[download code] (code / example)_ tts_ base.py) + diff --git a/docs/Advanced_development/en/QuecPythonSub/Timer.md b/docs/Advanced_development/en/QuecPythonSub/Timer.md new file mode 100644 index 0000000000000000000000000000000000000000..674f65ea557f3b7c9bde8e1a421907b2e3c603d9 --- /dev/null +++ b/docs/Advanced_development/en/QuecPythonSub/Timer.md @@ -0,0 +1,119 @@ +# QuecPython timer development + +This document is mainly based on ec600s and describes how to use quecpthon\_ Timer, the most commonly used timer is timing and counting, which can be used as accurate delay processing, or count the total number of pulses on the premise of connecting a clock source. Through this article, you will learn all the setting parameters and usage of timer. + +## Hardware description + +A total of 4 timers are currently open + +## Software design + +### Constant description + +|Constant | description| +|----------------|----------------------------| +|Timer.timer0 | timer 0| +|Timer.timer1 | timer 1| +|Timer.timer2 | timer 2| +|Timer.timer3 | timer 3| +| Timer.ONE_ Shot | single time mode, the timer only executes once| +|Timer.periodic 𞓜 cycle mode, timer cycle execution| + +### Create timer object + +timer = Timer(Timern)。 Create timer object interface parameters as follows: + +|Parameter | type | description| +|--------|------|------------------------------------------| +|Timern | int | timer number. Ec600s supports timer timer0 \ ~ timer3| + +### Start timer + +Timer. Start (period, mode, callback): start the corresponding timer. The interface parameters are described as follows: + +|Parameter | type | description| +|----------|----------|--------------------------------------------------------------------------------------| +|Period | int | interrupt cycle, unit: milliseconds| +|Mode | int | operation mode timer.one_ Timer. Timer cycle mode, execute only once| +|Callback | function | timer execution function| + +Return value: the integer value 0 is returned after successful startup, and the integer value - 1 is returned after failure. + +### Turn off the timer + +Timer. Stop(): close the corresponding timer without parameters. + +Return value: integer 0 is returned successfully, and integer - 1 is returned in failure + +## Interactive operation + +The qpycom tool is used to interact with the module. The following examples are based on timer0 and Timer1. Timer2 and timer3 are configured similarly. + +

+![](media/d255a2ca8359e29ec11c9302558c8730.png) + +
+ +be careful: + +1. From machine import timer is to make the timer module visible in the current space. + +2. Only from machine import timer module can use functions and variables in timer. + +3. The above operations are not connected to any peripherals and are only used as a reference for familiar instructions + +## Download verification + +### Software code + +The reference code of the supporting demo is timer in the same directory as the document_ File.py file. Download the. Py file to the module for operation. The code is as follows: + +```python +import log +from machine import Timer +log.basicConfig(level=log.INFO) #Set log output level +Timer_Log = log.getLogger("Quectel") #Get logger object +log_print_num = 5 +state = 1 +timer0 = Timer(Timer.Timer1) +#Create an execution function and pass in the timer instance +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() #End the timer instance +timer0.start(period=1000, mode=timer0.PERIODIC, callback=timer_test) #Start timer +while state: + pass + +``` + + + +### Hardware connection: + +This paper verifies that it is only for timer without external peripherals. + +### Operation effect + +1. Open qpycom and run timer\_ File.py, as shown below: + +
+![](media/d79a7e4c4f33637063273447996990c0.png) +
+ +2. View the output results on the qpycom interactive interface as follows: + +
+![](media/7b7eed9267576d8033ab0fa72a075efb.png) + +
+ +## Matching code + + + download code diff --git a/docs/Advanced_development/zh/QuecPythonSub/UART.md b/docs/Advanced_development/en/QuecPythonSub/UART.md similarity index 32% rename from docs/Advanced_development/zh/QuecPythonSub/UART.md rename to docs/Advanced_development/en/QuecPythonSub/UART.md index 712aee60672d604c61690c108798035d2cc94306..f6591fb08bc019e6310d4aa35e280cc285f735eb 100644 --- a/docs/Advanced_development/zh/QuecPythonSub/UART.md +++ b/docs/Advanced_development/en/QuecPythonSub/UART.md @@ -1,28 +1,28 @@ -# **QuecPython UART开发使用说明** +# ** instructions for development and use of quecpthon UART** -文档主要基于EC600S介绍如何使用QuecPython_UART,UART作为一种通用串行数据总线,用于异步通信,可实现全双工传输和接收。在嵌入式设计中,UART用来与PC进行通信,包括监控调试器和其它器件。通过本文你将了解到EC600S\_UART的所有设置参数及使用方法。 +This document is mainly based on ec600s and describes how to use quecpthon_ UART, as a universal serial data bus, is used for asynchronous communication and can realize full duplex transmission and reception. In embedded design, UART is used to communicate with PC, including monitoring debugger and other devices. Through this article, you will learn about ec600s\_ All setting parameters and usage of UART. -## 硬件描述 +## Hardware description -目前开放共3路UART,各路UART对应模组的PIN脚如下图所示: +Currently, three UARTS are open, and the pin pin pin of the module corresponding to each UART is shown in the figure below: ![](media/f3263989fb6aaafabf504ceb0d305c5b.png) -3路UART对应开发板的接口如下图所示: +The interface of 3-way UART corresponding development board is shown in the figure below: ![](media/e6ebd36d248fb439b2fdfb7bca8ec724.png) -3路串口对应关系列表如下: +The corresponding relationship of three serial ports is listed as follows: -| 串口名 | 模组引脚名 | 模组引脚号 | +|Serial port name | module pin name | module pin number| |----------|----------------|------------| -| 调试串口 | DBG_RXD | 72 | +|Debug serial port | DBG_ RXD | 72 | | | DBG_TXD | 71 | -| 辅助串口 | GPIO2/SPI_MISO | 2 | +|Auxiliary serial port | gpio2 / SPI_ MISO | 2 | | | GPIO3/SPI_MOSI | 3 | -| 主串口 | MAIN_DTR | 39 | +|Main serial port | main_ DTR | 39 | | | MAIN_RXD | 31 | | | MAIN_TXD | 32 | | | MAIN_CTS | 33 | @@ -30,95 +30,95 @@ | | MAIN_DCD | 48 | | | MAIN_RI | 40 | -## 软件设计 +## Software design -### 创建UART对象 +### Create UART object -uart = UART(UART.UARTn, buadrate, databits, parity, stopbits,flowctl)。创建UART对象接口参数介绍如下: +uart = UART(UART.UARTn, buadrate, databits, parity, stopbits,flowctl)。 Create UART object interface parameters are described as follows: -| 参数 | 类型 | 说明 | +|Parameter | type | description| |----------|------|-------------------------------------------------------------------------------| -| UARTn | int | 端口号 UART0 - DEBUG PORT UART1 – BT PORT UART2 – MAIN PORT | -| buadrate | int | 波特率,常用波特率都支持,如4800、9600、19200、38400、57600、115200、230400等 | -| databits | int | 数据位(5~8) | -| parity | int | 奇偶校验(0 – NONE,1 – EVEN,2 - ODD) | -| stopbits | int | 停止位(1~2) | -| flowctl | int | 硬件控制流(0 – FC_NONE, 1 – FC_HW | +|Uartn | int | port number UART0 - debug port uart1 – BT port UART2 – main port| +|Buadrate | int | baud rate and common baud rates are supported, such as 4800, 9600, 19200, 38400, 57600, 115200, 230400, etc| +|Databits | int | data bits (5 ~ 8)| +|Parity | int | parity (0 – none, 1 – even, 2 - odd)| +|Stopbits | int | stop bit (1 ~ 2)| +|Flowctl | int | hardware control flow (0 – FC)_ NONE, 1 – FC_ HW | -### 查询串口未读字节数 +### Query the number of unread bytes of serial port -uart.any():返回接收缓存器中有多少字节的数据未读,无参数。 +UART. Any(): returns the number of bytes of unread data in the receive buffer. There is no parameter. -返回值:指令执行成功或者不存在未读数据都返回0,否则返回未读字节数。 +Return value: 0 is returned if the instruction is executed successfully or there is no unread data. Otherwise, the number of unread bytes is returned. -### 读取数据 +### Read data -uart.read(nbytes):从串口读取数据,建议先执行上个命令,查询未读数据的字节数,然后读取数据时加上需要读取的字节数。 +UART. Read (nbytes): read data from the serial port. It is recommended to execute the previous command to query the number of bytes of unread data, and then add the number of bytes to be read when reading data. -参数介绍如下: +The parameters are described as follows: -| 参数 | 类型 | 说明 | +|Parameter | type | description| |--------|------|----------------| -| nbytes | int | 要读取的字节数 | +|Nbytes | int | number of bytes to read| -返回值:返回读取的数据 +Return value: returns the read data -### 发送数据 +### Send data -uart.write(data),用于从模组向外发送数据,参数介绍如下: +Uart.write (data) is used to send data from the module. The parameters are described as follows: -| 参数 | 类型 | 说明 | +|Parameter | type | description| |------|--------|------------| -| data | string | 发送的数据 | +|Data | string | data sent| -返回值:返回发送的字节数 +Return value: returns the number of bytes sent -### 关闭串口 +### Close the serial port -uart.close():关闭串口,无参数。 +UART. Close(): close the serial port without parameters. -返回值:成功返回整型0,失败返回整型-1 +Return value: integer 0 is returned successfully, and integer - 1 is returned in failure -## 交互操作 +## Interactive operation -使用QPYcom工具和模组进行交互,下面实例是基于UART0,UART1和UART2操作类似。 +The qpycom tool is used to interact with the module. The following examples are based on UART0, and the operations of uart1 and UART2 are similar.
![](media/cfdf4c62be36f4910398ee6579cbb633.png)
-注意: +be careful: -1. from machine import UART即为让UART模块在当前空间可见。 +1. From machine import UART is to make the UART module visible in the current space. -2. 只有from machine import UART模块,才能使用UART内的函数和变量。 +2. Only from machine import UART module can use functions and variables in UART. -3. 上述操作没有连接任何外设,仅作为熟悉指令参考 +3. The above operations are not connected to any peripherals and are only used as a reference for familiar instructions -## 下载验证 +## Download verification -### 软件代码 +### Software code -配套demo的参考代码为文档同目录下的example_uart_file.py文件。下载.py文件到模组运行,代码如下: +The reference code of the supporting demo is example in the same directory as the document_ uart_ File.py file. Download the. Py file to the module for operation. The code is as follows: ```python -import _thread # 导入线程模块 -import utime # 导入定时模块 -import log # 导入log模块 -from machine import UART # 导入UART模块 -# 测试该示例代码需要配置uart -# 设置日志输出级别 +import _thread #Import thread module +import utime #Import timing module +import log #Import log module +from machine import UART #Import UART module +#To test the sample code, you need to configure UART +#Set log output level log.basicConfig(level=log.INFO) uart_log = log.getLogger("UART") state = 1 def uartWrite(): count = 10 - # 配置uart + #Configure UART uart = UART(UART.UART1, 115200, 8, 0, 1, 0) while count: write_msg = "Hello count={}".format(count) - # 发送数据 + #send data uart.write(write_msg) uart_log.info("Write msg :{}".format(write_msg)) utime.sleep(1) @@ -128,12 +128,12 @@ def UartRead(): global state uart = UART(UART.UART1, 115200, 8, 0, 1, 0) while 1: - # 返回是否有可读取的数据长度 + #Returns whether there is a readable data length msgLen = uart.any() - # 当有数据时进行读取 + #Read when there is data if msgLen: msg = uart.read(msgLen) - # 初始数据是字节类型(bytes),将字节类型数据进行编码 + #The initial data is byte type, and the byte type data is encoded utf8_msg = msg.decode() # str uart_log.info("UartRead msg: {}".format(utf8_msg)) @@ -141,7 +141,7 @@ def UartRead(): continue state = 0 def run(): - # 创建一个线程来监听接收uart消息 + #Create a thread to listen and receive UART messages _thread.start_new_thread(UartRead, ()) if __name__ == "__main__": uartWrite() @@ -153,41 +153,41 @@ if __name__ == "__main__": break ``` -### 硬件连接 +### Hardware connection -使用type-c给模块供电,UART与TTL转USB模块的连接如下表(仅供参考): +Use type-C to supply power to the module. The connection between UART and TTL to USB module is shown in the following table (for reference only): -| 模块UART_pin脚 | TTL转USB模块 | +|Module UART_ Pin | TTL to USB module| |----------------|--------------| | SPI_MISO | Tx | | SPI_MOSI | Rx | | GND | GND | -硬件连接展示图如下图所示: +The hardware connection diagram is shown in the figure below:
![](media/d5d74b7f74c6fb3c9ccfefd19a145e6f.jpeg)
-### 运行效果 +### Operation effect -1. 打开QCOM,连接TTL转USB对应的端口,如下图所示: +1. Open qcom and connect the corresponding port of TTL to USB, as shown in the figure below:
![](media/cca92c331b45112155d3542adaf0ee97.png)
-2. 打开QPYcom运行uart_file.py,可在QCOM查看到UART write数据,现象如下截图红色部分 +2. Open qpycom and run UART_ File.py, UART write data can be viewed in qcom. The phenomenon is shown in the red part of the screenshot below -3. 然QCOM上写quectel两次,可在QPYcom上查看读取的数据。现象如下截图蓝色部分 +3. Write quectel twice on qcom, and you can view the read data on qpycom. The phenomenon is shown in the blue part of the screenshot below
![](media/a89ce52fa9591a2b1252f9d2bb841cdf.png)
-## 配套代码 +## Matching code - - 下载代码 \ No newline at end of file + + download code diff --git a/docs/Advanced_development/en/QuecPythonSub/WDT.md b/docs/Advanced_development/en/QuecPythonSub/WDT.md new file mode 100644 index 0000000000000000000000000000000000000000..5c2b85c79aec8d5a73ff19442134b28554736cc0 --- /dev/null +++ b/docs/Advanced_development/en/QuecPythonSub/WDT.md @@ -0,0 +1,85 @@ +# Ec600s watchdog development instructions + +This document is mainly based on ec600s and describes how to use quecpthon_ Watchdog is usually used to prevent the device from crashing and no longer operating. After adding watchdog, the system will automatically restart after an accidental crash, so that the device can continue to work. Watchdog is hereinafter referred to as WDT. Through this article, you will learn all the setting parameters and usage of WDT. + +## Hardware description + +WDT module function: restart the system when the app application is abnormal and does not execute. This function is completely built into the system and does not need to be connected to any peripheral circuit. + +## Software design + +1. The function prototype WDT (period) returns a WDT object, which is used to set the dog feeding, on and off functions of WDT. + +Create a WDT object and start immediately: + +> wdt = WDT(period) + +|Parameter | type | description| +|--------|------|----------------------------| +|Period | int | set the soft dog detection time, unit (s)| + +1. Function prototype feed (), no return value. + +Feed the dog: + +> wdt.feed() + +1. Function prototype ** stop ** (), no return value. + +Turn off the soft dog function: + +> wdt.stop() + +## Interactive operation + +1. Use qpycom tool and module to interact. Examples are as follows: + +
+![](media/078f1a0cb7cadb85b5e1806a14f57841.png) + +
+ +be careful: + +1. From machine import WDT is to make the WDT module visible in the current space. + +2. Only from machine import WDT module can use functions and variables in WDT. + +Note: there is no dog feeding action. It can be seen that the system will reset automatically after two seconds. + +## Download verification + +Download the. Py file to the module for operation. The code is as follows: + +```python +from machine import WDT +from machine import Timer + +count = 0 +def feed(t): + global count + count += 1 + if count >= 5: +Print ('stop feeding the dog ') + timer1.stop() +Print ('feed the dog ') + wdt.feed() + + +timer1 = Timer(Timer.Timer1) +wdt = WDT(2) #Start the watchdog. The interval is in seconds +timer1.start(period=1000, mode=timer1.PERIODIC, callback=feed) #Use the timer to feed the dog + +``` + +## Matching code + + + download code + +## Interpretation of professional terms + +>** watchdog **: timed count [increase](https://baike.baidu.com/item/%E5%A2%9E%E5%8A%A0/9062530)到[设定值](https://baike.baidu.com/item/%E8%AE%BE%E5%AE%9A%E5%80%BC/7386889)就认为程序没有正常工作,[强制](https://baike.baidu.com/item/%E5%BC%BA%E5%88%B6/16011573)整个系统复位 + +>** feed dog **: reset count value + diff --git a/docs/Advanced_development/en/QuecPythonSub/code/Audio.zip b/docs/Advanced_development/en/QuecPythonSub/code/Audio.zip new file mode 100644 index 0000000000000000000000000000000000000000..68d0aa6f779cca057e2bf3fad48e9aa33d25bc99 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonSub/code/Audio.zip differ diff --git a/docs/Advanced_development/zh/QuecPythonSub/code/ExtInt.py b/docs/Advanced_development/en/QuecPythonSub/code/ExtInt.py similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/code/ExtInt.py rename to docs/Advanced_development/en/QuecPythonSub/code/ExtInt.py diff --git a/docs/Advanced_development/zh/QuecPythonSub/code/GPIO.py b/docs/Advanced_development/en/QuecPythonSub/code/GPIO.py similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/code/GPIO.py rename to docs/Advanced_development/en/QuecPythonSub/code/GPIO.py diff --git a/docs/Advanced_development/zh/QuecPythonSub/code/Watchdog.py b/docs/Advanced_development/en/QuecPythonSub/code/Watchdog.py similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/code/Watchdog.py rename to docs/Advanced_development/en/QuecPythonSub/code/Watchdog.py diff --git a/docs/Advanced_development/zh/QuecPythonSub/code/adc_file.py b/docs/Advanced_development/en/QuecPythonSub/code/adc_file.py similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/code/adc_file.py rename to docs/Advanced_development/en/QuecPythonSub/code/adc_file.py diff --git a/docs/Advanced_development/zh/QuecPythonSub/code/example_sensor_base.py b/docs/Advanced_development/en/QuecPythonSub/code/example_sensor_base.py similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/code/example_sensor_base.py rename to docs/Advanced_development/en/QuecPythonSub/code/example_sensor_base.py diff --git a/docs/Advanced_development/zh/QuecPythonSub/code/example_tts_base.py b/docs/Advanced_development/en/QuecPythonSub/code/example_tts_base.py similarity index 73% rename from docs/Advanced_development/zh/QuecPythonSub/code/example_tts_base.py rename to docs/Advanced_development/en/QuecPythonSub/code/example_tts_base.py index 6cbe2c37c9065346d7abc371193d9ce6790d5f9f..3c35187b7c0985cf1d18dd8ac364d14bc8402039 100644 --- a/docs/Advanced_development/zh/QuecPythonSub/code/example_tts_base.py +++ b/docs/Advanced_development/en/QuecPythonSub/code/example_tts_base.py @@ -1,5 +1,3 @@ - - import audio import utime as time from machine import Pin @@ -12,8 +10,6 @@ def play(tts, strList): tts.play(1, 1, 2, Str) pass -# https://python.quectel.com/wiki/#/zh-cn/api/?id=audio-%e9%9f%b3%e9%a2%91%e6%92%ad%e6%94%be - def test_tts_base(): ''' @@ -23,7 +19,10 @@ def test_tts_base(): ''' 使能外接喇叭 ''' - Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) + # 使能GPIO引脚 + # Pin(Pin.GPIO10, Pin.OUT, Pin.PULL_PD, 1) # 自用调试板使用 + Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) # 官方板V1.1使用 + # Pin(Pin.GPIO9, Pin.OUT, Pin.PULL_PD, 1) # 官方板V1.2使用 for i in range(1, 9): # 循坏播放,增加声音 tts.setVolume(i) @@ -37,4 +36,4 @@ def test_tts_base(): if __name__ == "__main__": - test_tts_base() + test_tts_base() \ No newline at end of file diff --git a/docs/Advanced_development/zh/QuecPythonSub/code/i2c_base.py b/docs/Advanced_development/en/QuecPythonSub/code/i2c_base.py similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/code/i2c_base.py rename to docs/Advanced_development/en/QuecPythonSub/code/i2c_base.py diff --git a/docs/Advanced_development/zh/QuecPythonSub/code/image.py b/docs/Advanced_development/en/QuecPythonSub/code/image.py similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/code/image.py rename to docs/Advanced_development/en/QuecPythonSub/code/image.py diff --git a/docs/Advanced_development/zh/QuecPythonSub/code/pm.py b/docs/Advanced_development/en/QuecPythonSub/code/pm.py similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/code/pm.py rename to docs/Advanced_development/en/QuecPythonSub/code/pm.py diff --git a/docs/Advanced_development/zh/QuecPythonSub/code/power_base.py b/docs/Advanced_development/en/QuecPythonSub/code/power_base.py similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/code/power_base.py rename to docs/Advanced_development/en/QuecPythonSub/code/power_base.py diff --git a/docs/little_demo/zh/QuecPythonTest/code/record.py b/docs/Advanced_development/en/QuecPythonSub/code/record.py similarity index 62% rename from docs/little_demo/zh/QuecPythonTest/code/record.py rename to docs/Advanced_development/en/QuecPythonSub/code/record.py index b51fe772674e3ea09f21533d638053085e77c574..a10632ccbdcc6e4f2de2f43d8b6c202558d934cc 100644 --- a/docs/little_demo/zh/QuecPythonTest/code/record.py +++ b/docs/Advanced_development/en/QuecPythonSub/code/record.py @@ -1,64 +1,83 @@ -# -*- coding: UTF-8 -*- - -import utime -import checkNet -import audio -from machine import Pin -''' -下面两个全局变量是必须有的,用户可以根据自己的实际项目修改下面两个全局变量的值, -在执行用户代码前,会先打印这两个变量的值。 -''' -PROJECT_NAME = "QuecPython_Record_example" -PROJECT_VERSION = "1.0.0" - -checknet = checkNet.CheckNetwork(PROJECT_NAME, PROJECT_VERSION) - -''' -外接喇叭播放录音文件,参数选择0 -''' -aud = audio.Audio(0) -tts = audio.TTS(0) - -''' -外接喇叭播放录音文件,需要下面这一句来使能 -''' -audio_EN = Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) - - -def record_callback(args): - print('file_name:{}'.format(args[0])) - print('file_size:{}'.format(args[1])) - print('record_sta:{}'.format(args[2])) - - record_sta = args[2] - if record_sta == 3: - print('The recording is over, play it') - tts.play(1, 0, 2, '录音结束,准备播放录音文件') - aud.play(1, 0, record.getFilePath()) - elif record_sta == -1: - print('The recording failure.') - tts.play(1, 0, 2, '录音失败') - - -if __name__ == '__main__': - ''' - 手动运行本例程时,可以去掉该延时,如果将例程文件名改为main.py,希望开机自动运行时,需要加上该延时, - 否则无法从CDC口看到下面的 poweron_print_once() 中打印的信息 - ''' - # utime.sleep(5) - checknet.poweron_print_once() - - ''' - 如果用户程序包含网络相关代码,必须执行 wait_network_connected() 等待网络就绪(拨号成功); - 如果是网络无关代码,可以屏蔽 wait_network_connected() - ''' - # checknet.wait_network_connected() - - # 用户代码 - '''######################【User code star】###################################################''' - print('the recording will begin in 2 seconds. Please be ready!') - utime.sleep(2) - print('start recording!') - record = audio.Record('recordfile.wav', record_callback) - record.start(10) - '''######################【User code end 】###################################################''' +# -*- coding: UTF-8 -*- + +import utime +import checkNet +import audio +from machine import Pin + +''' +下面两个全局变量是必须有的,用户可以根据自己的实际项目修改下面两个全局变量的值, +在执行用户代码前,会先打印这两个变量的值。 +''' +PROJECT_NAME = "QuecPython_Record_example" +PROJECT_VERSION = "1.0.0" + +checknet = checkNet.CheckNetwork(PROJECT_NAME, PROJECT_VERSION) + +''' +外接喇叭播放录音文件,参数选择0 +''' +aud = audio.Audio(0) +tts = audio.TTS(0) + +# 设置播放音量大小 +tts.setVolume(9) +aud.setVolume(11) +''' +外接喇叭播放录音文件,需要下面这一句来使能 +''' +# audio_EN = Pin(Pin.GPIO10, Pin.OUT, Pin.PULL_PD, 1) # 自用调试板使用 +# audio_EN = Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) # 官方板V1.1使用 +audio_EN = Pin(Pin.GPIO9, Pin.OUT, Pin.PULL_PD, 1) # 官方板V1.2使用 + +def record_callback(args): + print('file_name:{}'.format(args[0])) + print('file_size:{}'.format(args[1])) + print('record_sta:{}'.format(args[2])) + + print('11111') + record_sta = args[2] + if record_sta == 3: + print('The recording is over, play it') + tts.play(1, 0, 2, '录音结束,准备播放录音文件') + aud.play(1, 0, record.getFilePath()) + elif record_sta == -1: + print('The recording failure.') + tts.play(1, 0, 2, '录音失败') + +if __name__ == '__main__': + ''' + 手动运行本例程时,可以去掉该延时,如果将例程文件名改为main.py,希望开机自动运行时,需要加上该延时, + 否则无法从CDC口看到下面的 poweron_print_once() 中打印的信息 + ''' + # utime.sleep(5) + checknet.poweron_print_once() + + ''' + 如果用户程序包含网络相关代码,必须执行 wait_network_connected() 等待网络就绪(拨号成功); + 如果是网络无关代码,可以屏蔽 wait_network_connected() + ''' + # checknet.wait_network_connected() + + tts.play(1, 0, 2, '录音实验,录音时间四秒') + utime.sleep(2) + print("录音实验, 一秒后开始录音, 录音时间四秒. ") + utime.sleep(1) + record = audio.Record() + aaa = record.start("recordfile.wav", 4) + + utime.sleep(5) + if aaa == 0: + tts.play(1, 0, 2, '录音结束,准备播放录音文件') + print("录音成功, 准备播放录音文件") + utime.sleep(1) + bbb = aud.play(1, 0, 'u:/recordfile.wav') + if bbb == 1: + tts.play(1, 0, 2, '播放完成') + print("播放完成") + else : + tts.play(1, 0, 2, '播放失败') + print("播放失败") + else : + print("录音失败") + diff --git a/docs/Advanced_development/zh/QuecPythonSub/code/rtc_file.py b/docs/Advanced_development/en/QuecPythonSub/code/rtc_file.py similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/code/rtc_file.py rename to docs/Advanced_development/en/QuecPythonSub/code/rtc_file.py diff --git a/docs/Advanced_development/zh/QuecPythonSub/code/show_image.py b/docs/Advanced_development/en/QuecPythonSub/code/show_image.py similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/code/show_image.py rename to docs/Advanced_development/en/QuecPythonSub/code/show_image.py diff --git a/docs/Advanced_development/zh/QuecPythonSub/code/spi_base.py b/docs/Advanced_development/en/QuecPythonSub/code/spi_base.py similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/code/spi_base.py rename to docs/Advanced_development/en/QuecPythonSub/code/spi_base.py diff --git a/docs/Advanced_development/en/QuecPythonSub/code/sub_pwm.py b/docs/Advanced_development/en/QuecPythonSub/code/sub_pwm.py new file mode 100644 index 0000000000000000000000000000000000000000..7c10dbe2931ee2862754f70b21729fee2a8453ad --- /dev/null +++ b/docs/Advanced_development/en/QuecPythonSub/code/sub_pwm.py @@ -0,0 +1,92 @@ +from misc import PWM +import utime as time +import log + + +class pwmclass(): + def __init__(self): + self.Log = log.basicConfig() + self.Log = log.getLogger("pwm_class") + # self.Log.setLevel(log.INFO) + self.Log.setLevel(log.DEBUG) + self.pwm = None + pass + + """ + 注:EC100YCN平台,支持PWM0~PWM3,对应引脚如下: + PWM0 – 引脚号19 + PWM1 – 引脚号18 + PWM2 – 引脚号23 + PWM3 – 引脚号22 + + 注:EC600SCN平台,支持PWM0~PWM3,对应引脚如下: + PWM0 – 引脚号52 + PWM1 – 引脚号53 + PWM2 – 引脚号70 + PWM3 – 引脚号69 + """ + + # fre 频率为K, (0.0 ~ 1000] + # Duty_Cycle (0~1) + def init(self, Pwm_pin=PWM.PWM3, fre=1, Duty_Cycle=0.5): + # https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=pwm + + # 根据频率,计算出高低电平 + # 计算出周期时间 + if (fre <= 0) or (fre > 1000): + self.Log.error( + "ERROR: {0} 不支持的频率参数, 请输入 (0 ~ 1000]k 范围的频率".format(fre)) + if (Duty_Cycle < 0.000) or (Duty_Cycle >= 1): + self.Log.error( + "ERROR: {0} 不支持的占空比参数, 请输入 (0~1.0) 范围的频率".format(Duty_Cycle)) + # us 单位 + cycle_time = int(1 * 1000 / fre) + hight_time = int(cycle_time * Duty_Cycle) + self.Log.info("""设置 {0} 设备 频率为 {1}khz + 周期为 {2}us 占空比 {3}us""".format(Pwm_pin, fre, cycle_time, + hight_time)) + # ms 周期范围 + # 周期在 (1K us ~ 1000K us) + if cycle_time > 1000: + self.pwm = PWM(Pwm_pin, PWM.ABOVE_MS, int(hight_time / 1000), + int(cycle_time / 1000)) + # 周期在 10us ~ 15.75ms + if (cycle_time > 10) and (cycle_time < 15750): + self.pwm = PWM(Pwm_pin, PWM.ABOVE_10US, int(hight_time / 10), + int(cycle_time / 10)) + # 周期在 (0~157us) + if (cycle_time > 0) and (cycle_time < 157): + self.pwm = PWM(Pwm_pin, PWM.ABOVE_1US, hight_time, cycle_time) + + def deinit(self, fre=0): + self.pwm = None + pass + + def start(self, fre=1): + self.Log.info("开始输出 PWM 波形".format()) + if self.pwm is not None: + self.pwm.open() + pass + + def stop(self): + if self.pwm is not None: + self.pwm.close() + pass + + +def test_pwm(fre, duty, delay=2): + obj_pwm = pwmclass() + obj_pwm.init(fre=fre, Duty_Cycle=duty, Pwm_pin=PWM.PWM3) + obj_pwm.start() + time.sleep(delay) + obj_pwm.stop() + obj_pwm.deinit() + + +if __name__ == "__main__": + # 频率 1K, 占空比 0.1 + test_pwm(fre=1, duty=0.1) + # 频率 10K, 占空比 0.2 + test_pwm(fre=10, duty=0.2) + # 频率 100K, 占空比 0.4 + test_pwm(fre=100, duty=0.4) diff --git a/docs/Advanced_development/zh/QuecPythonSub/code/timer_file.py b/docs/Advanced_development/en/QuecPythonSub/code/timer_file.py similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/code/timer_file.py rename to docs/Advanced_development/en/QuecPythonSub/code/timer_file.py diff --git a/docs/Advanced_development/zh/QuecPythonSub/code/uart_file.py b/docs/Advanced_development/en/QuecPythonSub/code/uart_file.py similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/code/uart_file.py rename to docs/Advanced_development/en/QuecPythonSub/code/uart_file.py diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/078f1a0cb7cadb85b5e1806a14f57841.png b/docs/Advanced_development/en/QuecPythonSub/media/078f1a0cb7cadb85b5e1806a14f57841.png similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/media/078f1a0cb7cadb85b5e1806a14f57841.png rename to docs/Advanced_development/en/QuecPythonSub/media/078f1a0cb7cadb85b5e1806a14f57841.png diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/079186e2c37f4af6a3c3d52c58a77644.png b/docs/Advanced_development/en/QuecPythonSub/media/079186e2c37f4af6a3c3d52c58a77644.png similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/media/079186e2c37f4af6a3c3d52c58a77644.png rename to docs/Advanced_development/en/QuecPythonSub/media/079186e2c37f4af6a3c3d52c58a77644.png diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/29423f9b58431c5881424d7510039b96.png b/docs/Advanced_development/en/QuecPythonSub/media/29423f9b58431c5881424d7510039b96.png similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/media/29423f9b58431c5881424d7510039b96.png rename to docs/Advanced_development/en/QuecPythonSub/media/29423f9b58431c5881424d7510039b96.png diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/2d5c069c492cc483e86f32f3fe88480a.png b/docs/Advanced_development/en/QuecPythonSub/media/2d5c069c492cc483e86f32f3fe88480a.png similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/media/2d5c069c492cc483e86f32f3fe88480a.png rename to docs/Advanced_development/en/QuecPythonSub/media/2d5c069c492cc483e86f32f3fe88480a.png diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/5c3518e6007b37481d75644bb6fc3659.png b/docs/Advanced_development/en/QuecPythonSub/media/5c3518e6007b37481d75644bb6fc3659.png similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/media/5c3518e6007b37481d75644bb6fc3659.png rename to docs/Advanced_development/en/QuecPythonSub/media/5c3518e6007b37481d75644bb6fc3659.png diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/7acc910ebd7bf4eb806399676e468795.png b/docs/Advanced_development/en/QuecPythonSub/media/7acc910ebd7bf4eb806399676e468795.png similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/media/7acc910ebd7bf4eb806399676e468795.png rename to docs/Advanced_development/en/QuecPythonSub/media/7acc910ebd7bf4eb806399676e468795.png diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/7b7eed9267576d8033ab0fa72a075efb.png b/docs/Advanced_development/en/QuecPythonSub/media/7b7eed9267576d8033ab0fa72a075efb.png similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/media/7b7eed9267576d8033ab0fa72a075efb.png rename to docs/Advanced_development/en/QuecPythonSub/media/7b7eed9267576d8033ab0fa72a075efb.png diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/933970b3720e7ebda87f77e2669bee7d.png b/docs/Advanced_development/en/QuecPythonSub/media/933970b3720e7ebda87f77e2669bee7d.png similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/media/933970b3720e7ebda87f77e2669bee7d.png rename to docs/Advanced_development/en/QuecPythonSub/media/933970b3720e7ebda87f77e2669bee7d.png diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/9351c08c142de93cfa88095688ab7535.png b/docs/Advanced_development/en/QuecPythonSub/media/9351c08c142de93cfa88095688ab7535.png similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/media/9351c08c142de93cfa88095688ab7535.png rename to docs/Advanced_development/en/QuecPythonSub/media/9351c08c142de93cfa88095688ab7535.png diff --git a/docs/Advanced_development/en/QuecPythonSub/media/Qp_Advance_develop_Sub_pwm01.jpg b/docs/Advanced_development/en/QuecPythonSub/media/Qp_Advance_develop_Sub_pwm01.jpg new file mode 100644 index 0000000000000000000000000000000000000000..87ad83134730a1e452146796034fbb3c4eb7806d Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonSub/media/Qp_Advance_develop_Sub_pwm01.jpg differ diff --git a/docs/Advanced_development/en/QuecPythonSub/media/Qp_Advance_develop_Sub_pwm02.jpg b/docs/Advanced_development/en/QuecPythonSub/media/Qp_Advance_develop_Sub_pwm02.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c349a57c53ea1b5cb1e4bf94e79be4402e67bf91 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonSub/media/Qp_Advance_develop_Sub_pwm02.jpg differ diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/Qp_Advanced_development_QuecPythonSub_i2c_bus_01.png b/docs/Advanced_development/en/QuecPythonSub/media/Qp_Advanced_development_QuecPythonSub_i2c_bus_01.png old mode 100755 new mode 100644 similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/media/Qp_Advanced_development_QuecPythonSub_i2c_bus_01.png rename to docs/Advanced_development/en/QuecPythonSub/media/Qp_Advanced_development_QuecPythonSub_i2c_bus_01.png diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/Qp_Advanced_development_QuecPythonSub_i2c_bus_02.png b/docs/Advanced_development/en/QuecPythonSub/media/Qp_Advanced_development_QuecPythonSub_i2c_bus_02.png old mode 100755 new mode 100644 similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/media/Qp_Advanced_development_QuecPythonSub_i2c_bus_02.png rename to docs/Advanced_development/en/QuecPythonSub/media/Qp_Advanced_development_QuecPythonSub_i2c_bus_02.png diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/Qp_Advanced_development_QuecPythonSub_i2c_bus_03.png b/docs/Advanced_development/en/QuecPythonSub/media/Qp_Advanced_development_QuecPythonSub_i2c_bus_03.png similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/media/Qp_Advanced_development_QuecPythonSub_i2c_bus_03.png rename to docs/Advanced_development/en/QuecPythonSub/media/Qp_Advanced_development_QuecPythonSub_i2c_bus_03.png diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/Qp_Advanced_development_QuecPythonSub_i2c_bus_04.png b/docs/Advanced_development/en/QuecPythonSub/media/Qp_Advanced_development_QuecPythonSub_i2c_bus_04.png similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/media/Qp_Advanced_development_QuecPythonSub_i2c_bus_04.png rename to docs/Advanced_development/en/QuecPythonSub/media/Qp_Advanced_development_QuecPythonSub_i2c_bus_04.png diff --git a/docs/Advanced_development/en/QuecPythonSub/media/QuecPytgon_sbs_http_02.png b/docs/Advanced_development/en/QuecPythonSub/media/QuecPytgon_sbs_http_02.png new file mode 100644 index 0000000000000000000000000000000000000000..6409e0a425ba2f2021e3832086c678ef3522030f Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonSub/media/QuecPytgon_sbs_http_02.png differ diff --git a/docs/Advanced_development/en/QuecPythonSub/media/QuecPython_Sub_Audio01.png b/docs/Advanced_development/en/QuecPythonSub/media/QuecPython_Sub_Audio01.png new file mode 100644 index 0000000000000000000000000000000000000000..7db5265b2ee04aac86f62d50ecee45268c9bfdb3 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonSub/media/QuecPython_Sub_Audio01.png differ diff --git a/docs/Advanced_development/en/QuecPythonSub/media/QuecPython_Sub_Record01.png b/docs/Advanced_development/en/QuecPythonSub/media/QuecPython_Sub_Record01.png new file mode 100644 index 0000000000000000000000000000000000000000..ca191df2f3a042f9ed9e9767b42063e72064a065 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonSub/media/QuecPython_Sub_Record01.png differ diff --git a/docs/Advanced_development/en/QuecPythonSub/media/QuecPython_Sub_Record02.png b/docs/Advanced_development/en/QuecPythonSub/media/QuecPython_Sub_Record02.png new file mode 100644 index 0000000000000000000000000000000000000000..45f57cb7455e5294cfd3963c1ffff21cc68d85ac Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonSub/media/QuecPython_Sub_Record02.png differ diff --git a/docs/Advanced_development/en/QuecPythonSub/media/QuecPython_Sub_Record03.png b/docs/Advanced_development/en/QuecPythonSub/media/QuecPython_Sub_Record03.png new file mode 100644 index 0000000000000000000000000000000000000000..f08fc862faa956f3de05b6ffcd9a20bf5f207b91 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonSub/media/QuecPython_Sub_Record03.png differ diff --git a/docs/Advanced_development/en/QuecPythonSub/media/QuecPython_Sub_TTS01.png b/docs/Advanced_development/en/QuecPythonSub/media/QuecPython_Sub_TTS01.png new file mode 100644 index 0000000000000000000000000000000000000000..b08531abf55836a85715f71d178f810645513917 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonSub/media/QuecPython_Sub_TTS01.png differ diff --git a/docs/Advanced_development/en/QuecPythonSub/media/QuecPython_Sub_TTS02.png b/docs/Advanced_development/en/QuecPythonSub/media/QuecPython_Sub_TTS02.png new file mode 100644 index 0000000000000000000000000000000000000000..b7dce5eec226770e64a143c76a69e8a503cb7980 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonSub/media/QuecPython_Sub_TTS02.png differ diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/SPI_1.jpg b/docs/Advanced_development/en/QuecPythonSub/media/SPI_1.jpg similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/media/SPI_1.jpg rename to docs/Advanced_development/en/QuecPythonSub/media/SPI_1.jpg diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/a89ce52fa9591a2b1252f9d2bb841cdf.png b/docs/Advanced_development/en/QuecPythonSub/media/a89ce52fa9591a2b1252f9d2bb841cdf.png similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/media/a89ce52fa9591a2b1252f9d2bb841cdf.png rename to docs/Advanced_development/en/QuecPythonSub/media/a89ce52fa9591a2b1252f9d2bb841cdf.png diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/cca92c331b45112155d3542adaf0ee97.png b/docs/Advanced_development/en/QuecPythonSub/media/cca92c331b45112155d3542adaf0ee97.png similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/media/cca92c331b45112155d3542adaf0ee97.png rename to docs/Advanced_development/en/QuecPythonSub/media/cca92c331b45112155d3542adaf0ee97.png diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/cfdf4c62be36f4910398ee6579cbb633.png b/docs/Advanced_development/en/QuecPythonSub/media/cfdf4c62be36f4910398ee6579cbb633.png similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/media/cfdf4c62be36f4910398ee6579cbb633.png rename to docs/Advanced_development/en/QuecPythonSub/media/cfdf4c62be36f4910398ee6579cbb633.png diff --git a/docs/Advanced_development/en/QuecPythonSub/media/clip_image001.gif b/docs/Advanced_development/en/QuecPythonSub/media/clip_image001.gif new file mode 100644 index 0000000000000000000000000000000000000000..f6dcc56861dd163c8cfb99c78a80b341307d43a0 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonSub/media/clip_image001.gif differ diff --git a/docs/Advanced_development/en/QuecPythonSub/media/clip_image002.gif b/docs/Advanced_development/en/QuecPythonSub/media/clip_image002.gif new file mode 100644 index 0000000000000000000000000000000000000000..24d4e21acef257d3eb9d1a0b7ee82c4e99ad4062 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonSub/media/clip_image002.gif differ diff --git a/docs/Advanced_development/en/QuecPythonSub/media/clip_image003.gif b/docs/Advanced_development/en/QuecPythonSub/media/clip_image003.gif new file mode 100644 index 0000000000000000000000000000000000000000..77933f6b518c0b45b2320efe867b6299dadb8cfa Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonSub/media/clip_image003.gif differ diff --git a/docs/Advanced_development/en/QuecPythonSub/media/clip_image004.gif b/docs/Advanced_development/en/QuecPythonSub/media/clip_image004.gif new file mode 100644 index 0000000000000000000000000000000000000000..90f7f94c565e45bc2a100b632f474560d40fa73f Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonSub/media/clip_image004.gif differ diff --git a/docs/Advanced_development/en/QuecPythonSub/media/clip_image005.gif b/docs/Advanced_development/en/QuecPythonSub/media/clip_image005.gif new file mode 100644 index 0000000000000000000000000000000000000000..ef61f0f9ce7ddf00fbe997c727d56fff54c67053 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonSub/media/clip_image005.gif differ diff --git a/docs/Advanced_development/en/QuecPythonSub/media/clip_image006.gif b/docs/Advanced_development/en/QuecPythonSub/media/clip_image006.gif new file mode 100644 index 0000000000000000000000000000000000000000..beeacb839f6190bb4f356766e3569f20c5bca7b6 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonSub/media/clip_image006.gif differ diff --git a/docs/Advanced_development/en/QuecPythonSub/media/clip_image007.gif b/docs/Advanced_development/en/QuecPythonSub/media/clip_image007.gif new file mode 100644 index 0000000000000000000000000000000000000000..bc4a1ff86cf86739cc7c7f073b92b09005a65542 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonSub/media/clip_image007.gif differ diff --git a/docs/Advanced_development/en/QuecPythonSub/media/clip_image008.gif b/docs/Advanced_development/en/QuecPythonSub/media/clip_image008.gif new file mode 100644 index 0000000000000000000000000000000000000000..41e89c4c33e83f29d744f2bb72c24e7e5ecb4240 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonSub/media/clip_image008.gif differ diff --git a/docs/Advanced_development/en/QuecPythonSub/media/clip_image009.gif b/docs/Advanced_development/en/QuecPythonSub/media/clip_image009.gif new file mode 100644 index 0000000000000000000000000000000000000000..d59265e85ebb1a544856e10ef69df7488d4a5bd4 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonSub/media/clip_image009.gif differ diff --git a/docs/Advanced_development/en/QuecPythonSub/media/clip_image010.gif b/docs/Advanced_development/en/QuecPythonSub/media/clip_image010.gif new file mode 100644 index 0000000000000000000000000000000000000000..b1dea77c5b45d67abda80c4e292e8bfe9dbb0b6d Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonSub/media/clip_image010.gif differ diff --git a/docs/Advanced_development/en/QuecPythonSub/media/clip_image011.gif b/docs/Advanced_development/en/QuecPythonSub/media/clip_image011.gif new file mode 100644 index 0000000000000000000000000000000000000000..fccdd22197a25fc2072d46cdfa6ae8e9730f6a83 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonSub/media/clip_image011.gif differ diff --git a/docs/Advanced_development/en/QuecPythonSub/media/clip_image012.gif b/docs/Advanced_development/en/QuecPythonSub/media/clip_image012.gif new file mode 100644 index 0000000000000000000000000000000000000000..22aea78589e6487ee2338198d3997a8438736be4 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonSub/media/clip_image012.gif differ diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/d255a2ca8359e29ec11c9302558c8730.png b/docs/Advanced_development/en/QuecPythonSub/media/d255a2ca8359e29ec11c9302558c8730.png similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/media/d255a2ca8359e29ec11c9302558c8730.png rename to docs/Advanced_development/en/QuecPythonSub/media/d255a2ca8359e29ec11c9302558c8730.png diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/d498ea36bae149ce7f0f7221587898bc.png b/docs/Advanced_development/en/QuecPythonSub/media/d498ea36bae149ce7f0f7221587898bc.png similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/media/d498ea36bae149ce7f0f7221587898bc.png rename to docs/Advanced_development/en/QuecPythonSub/media/d498ea36bae149ce7f0f7221587898bc.png diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/d5d74b7f74c6fb3c9ccfefd19a145e6f.jpeg b/docs/Advanced_development/en/QuecPythonSub/media/d5d74b7f74c6fb3c9ccfefd19a145e6f.jpeg similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/media/d5d74b7f74c6fb3c9ccfefd19a145e6f.jpeg rename to docs/Advanced_development/en/QuecPythonSub/media/d5d74b7f74c6fb3c9ccfefd19a145e6f.jpeg diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/d79a7e4c4f33637063273447996990c0.png b/docs/Advanced_development/en/QuecPythonSub/media/d79a7e4c4f33637063273447996990c0.png similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/media/d79a7e4c4f33637063273447996990c0.png rename to docs/Advanced_development/en/QuecPythonSub/media/d79a7e4c4f33637063273447996990c0.png diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/e574fb98f5cd8906b43f82b87012770d.png b/docs/Advanced_development/en/QuecPythonSub/media/e574fb98f5cd8906b43f82b87012770d.png similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/media/e574fb98f5cd8906b43f82b87012770d.png rename to docs/Advanced_development/en/QuecPythonSub/media/e574fb98f5cd8906b43f82b87012770d.png diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/e6ebd36d248fb439b2fdfb7bca8ec724.png b/docs/Advanced_development/en/QuecPythonSub/media/e6ebd36d248fb439b2fdfb7bca8ec724.png similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/media/e6ebd36d248fb439b2fdfb7bca8ec724.png rename to docs/Advanced_development/en/QuecPythonSub/media/e6ebd36d248fb439b2fdfb7bca8ec724.png diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/f2a690aaeb6e47658a02fc03ab7eedc1.png b/docs/Advanced_development/en/QuecPythonSub/media/f2a690aaeb6e47658a02fc03ab7eedc1.png similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/media/f2a690aaeb6e47658a02fc03ab7eedc1.png rename to docs/Advanced_development/en/QuecPythonSub/media/f2a690aaeb6e47658a02fc03ab7eedc1.png diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/f3263989fb6aaafabf504ceb0d305c5b.png b/docs/Advanced_development/en/QuecPythonSub/media/f3263989fb6aaafabf504ceb0d305c5b.png similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/media/f3263989fb6aaafabf504ceb0d305c5b.png rename to docs/Advanced_development/en/QuecPythonSub/media/f3263989fb6aaafabf504ceb0d305c5b.png diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/fbce9c32a8929f43a5635b8e6c770219.png b/docs/Advanced_development/en/QuecPythonSub/media/fbce9c32a8929f43a5635b8e6c770219.png similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/media/fbce9c32a8929f43a5635b8e6c770219.png rename to docs/Advanced_development/en/QuecPythonSub/media/fbce9c32a8929f43a5635b8e6c770219.png diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/image-20210114110306885.png b/docs/Advanced_development/en/QuecPythonSub/media/image-20210114110306885.png similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/media/image-20210114110306885.png rename to docs/Advanced_development/en/QuecPythonSub/media/image-20210114110306885.png diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/image-20210121141307016.png b/docs/Advanced_development/en/QuecPythonSub/media/image-20210121141307016.png similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/media/image-20210121141307016.png rename to docs/Advanced_development/en/QuecPythonSub/media/image-20210121141307016.png diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/image-20210121141532781.png b/docs/Advanced_development/en/QuecPythonSub/media/image-20210121141532781.png similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/media/image-20210121141532781.png rename to docs/Advanced_development/en/QuecPythonSub/media/image-20210121141532781.png diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/image-20210121142652639.png b/docs/Advanced_development/en/QuecPythonSub/media/image-20210121142652639.png similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/media/image-20210121142652639.png rename to docs/Advanced_development/en/QuecPythonSub/media/image-20210121142652639.png diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/image-20210121144624090.png b/docs/Advanced_development/en/QuecPythonSub/media/image-20210121144624090.png similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/media/image-20210121144624090.png rename to docs/Advanced_development/en/QuecPythonSub/media/image-20210121144624090.png diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/image-20210121144644579.png b/docs/Advanced_development/en/QuecPythonSub/media/image-20210121144644579.png similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/media/image-20210121144644579.png rename to docs/Advanced_development/en/QuecPythonSub/media/image-20210121144644579.png diff --git a/docs/Advanced_development/en/QuecPythonSub/media/image-20210406102358570.png b/docs/Advanced_development/en/QuecPythonSub/media/image-20210406102358570.png new file mode 100644 index 0000000000000000000000000000000000000000..76930a4ff60636877f134d7ae2a2d16250312a23 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonSub/media/image-20210406102358570.png differ diff --git a/docs/Advanced_development/en/QuecPythonSub/media/pm_15mA.jpg b/docs/Advanced_development/en/QuecPythonSub/media/pm_15mA.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0c38725871d3a4bb3db2945fa59f7232d88094d9 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonSub/media/pm_15mA.jpg differ diff --git a/docs/Advanced_development/en/QuecPythonSub/media/pm_1mA.jpg b/docs/Advanced_development/en/QuecPythonSub/media/pm_1mA.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b953317f66a5723c5835519fde9b9e74ef92ddf1 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonSub/media/pm_1mA.jpg differ diff --git a/docs/Advanced_development/en/QuecPythonSub/media/pm_Hardware_connection.png b/docs/Advanced_development/en/QuecPythonSub/media/pm_Hardware_connection.png new file mode 100644 index 0000000000000000000000000000000000000000..5b48e56c204e3f2e0a482a3fa4c9b2ab9ac955f9 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonSub/media/pm_Hardware_connection.png differ diff --git a/docs/Advanced_development/en/QuecPythonSub/media/pm_log.jpg b/docs/Advanced_development/en/QuecPythonSub/media/pm_log.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7edff0f5226051d77a2293058271015dc7712d34 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonSub/media/pm_log.jpg differ diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/spi_2.jpg b/docs/Advanced_development/en/QuecPythonSub/media/spi_2.jpg similarity index 100% rename from docs/Advanced_development/zh/QuecPythonSub/media/spi_2.jpg rename to docs/Advanced_development/en/QuecPythonSub/media/spi_2.jpg diff --git a/docs/Advanced_development/en/QuecPythonSub/record.md b/docs/Advanced_development/en/QuecPythonSub/record.md new file mode 100644 index 0000000000000000000000000000000000000000..f02845ca720b64c63e4bb13fa7b3cedd42f6c598 --- /dev/null +++ b/docs/Advanced_development/en/QuecPythonSub/record.md @@ -0,0 +1,131 @@ +## Revision history +|Version | date | author | change statement| +|------|------|------|------| +|1.0 | 2021-4-6 | gary.zhou | First Edition| + +## Recording development + +The document is mainly based on ec600x_ QuecPython_ EVB_ V1.2 development board introduces how to use the recording function of quecpthon. + +### Hardware design + +The hardware design circuit of recording function is as follows: + +![QuecPython_Sub_Record02](media/QuecPython_Sub_Record02.png) + +Fig. 1 circuit schematic diagram of recording module + +![QuecPython_Sub_Record01](media/QuecPython_Sub_Record01.png) + +Figure 2 development board recording hardware + +matters needing attention + +(1) The v1.2 development board comes with a microphone, and the v1.1 development board needs to be welded with a microphone. When welding mic, pay attention to distinguish the positive and negative electrodes. The methods for distinguishing the positive and negative electrodes of the microphone are as follows: +Among the two pins of the microphone head, the pin with copper skin connected to the shell is the negative pole, or measured with a multimeter, and the pin connected to the shell is the negative pole. + +![QuecPython_Sub_Record03](media/QuecPython_Sub_Record03.png) + +Figure 3 description of positive and negative electrodes of microphone + +(2) When playing audio files with external speakers, please use 4 Ω 3W or 8 Ω 2W speakers. Please refer to [quecpthon driver subsystem audio playback] for speaker parameters and connection methods(./Audio.html) + +### Software design + +#### Recording API description + +Usage of API related to recording function. For specific API details, please refer to [quecpthon audio record](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=record) + +### Download verification + +#### Experimental code + +```python +# -*- coding: UTF-8 -*- + +import utime +import checkNet +import audio +from machine import Pin + +''' +The following two global variables are required. Users can modify the values of the following two global variables according to their actual projects, +The values of these two variables are printed before executing the user code. +''' +PROJECT_NAME = "QuecPython_Record_example" +PROJECT_VERSION = "1.0.0" + +checknet = checkNet.CheckNetwork(PROJECT_NAME, PROJECT_VERSION) + +''' +The external speaker plays the recording file, and the parameter is 0 +''' +aud = audio.Audio(0) +tts = audio.TTS(0) + +#Set playback volume +tts.setVolume(9) +aud.setVolume(11) +''' +The following sentence is required to enable the external speaker to play the recording file +''' +#audio_ EN = Pin(Pin.GPIO10, Pin.OUT, Pin.PULL_ PD, 1) # self use commissioning board +audio_EN = Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) #Official board v1.1 use +#audio_ EN = Pin(Pin.GPIO9, Pin.OUT, Pin.PULL_ PD, 1) # official board v1.2 use +def record_callback(args): + print('file_name:{}'.format(args[0])) + print('file_size:{}'.format(args[1])) + print('record_sta:{}'.format(args[2])) + + print('11111') + record_sta = args[2] + if record_sta == 3: + print('The recording is over, play it') +Tts.play (1, 0, 2, 'end of recording, ready to play the recording file') + aud.play(1, 0, record.getFilePath()) + elif record_sta == -1: + print('The recording failure.') +Tts.play (1, 0, 2, 'recording failed') + +if __name__ == '__main__': + ''' +When running this routine manually, you can remove the delay. If you change the routine file name to main.py, you need to add the delay when you want to start up and run automatically, +Otherwise, the following poweron cannot be seen from the CDC port_ print_ Information printed in once() + ''' + # utime.sleep(5) + checknet.poweron_print_once() + + ''' +If the user program contains network related code, wait must be executed_ network_ Connected() wait for the network to be ready (dialing succeeded); +If it is a network independent code, you can mask the wait_ network_ connected() + ''' + # checknet.wait_network_connected() + +Tts.play (1, 0, 2, 'recording experiment, recording time four seconds') + utime.sleep(2) +Print ("recording experiment, start recording in one second, recording time four seconds.") + utime.sleep(1) + record = audio.Record() + aaa = record.start("recordfile.wav", 4) + + utime.sleep(5) + if aaa == 0: +Tts.play (1, 0, 2, 'end of recording, ready to play the recording file') +Print ("recording succeeded, ready to play the recording file") + utime.sleep(1) + bbb = aud.play(1, 0, 'u:/recordfile.wav') + if bbb == 1: +Tts.play (1, 0, 2, 'play complete') +Print ("play complete") + else : +Tts.play (1, 0, 2, 'play failed') +Print ("playback failed") + else : +Print ("recording failed") + +``` + +### Matching code + + *[download code] (code / record. Py) + diff --git a/docs/Advanced_development/en/QuecPythonWirelessNetwork/DataCall.md b/docs/Advanced_development/en/QuecPythonWirelessNetwork/DataCall.md new file mode 100644 index 0000000000000000000000000000000000000000..2147039581096ce46362576ec14c1134582527cb --- /dev/null +++ b/docs/Advanced_development/en/QuecPythonWirelessNetwork/DataCall.md @@ -0,0 +1,196 @@ +# QuecPython_ Datacall data dialing + +This article mainly introduces quecpthon_ Use of datacall module. + +**Module functions:** + +Provide data dialing related interfaces. Start up; to configure; Query which access mode the terminal uses to access which network. + +**Corresponding API:** + +- dataCall.start(profileIdx, ipType, apn, username, password, authType) +- dataCall.setApn(profileIdx, ipType, apn, username, password, authType) +- dataCall.setCallback(usrFun) +- dataCall.getInfo(profileIdx, ipType) + +Please refer to [quecpython - datacall - Data dialing] for specific API details(https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=datacall-数据拨号) + + + +## Introduction to data dialing + +Simply understand, data dialing is the process of establishing a connection with the server through dialing and obtaining network access permission. For terminal equipment, it is to configure APN. + +### What is APN + +APN refers to a network access technology. It is a parameter that must be configured when the terminal accesses the network. It determines the access mode through which the terminal accesses the network. + +There are many types of external networks that users can access, such as: [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) + +All operators use a specific APN (access point name). This is usually pre configured by your SIM card, but you need to adjust it manually if necessary. + +### Meaning of APN + +APN determines the access mode through which the terminal accesses the network to identify [GPRS](https://baike.baidu.com/item/GPRS/107439)的业务种类。 + +APNs fall into two categories: + +- [WAP](https://baike.baidu.com/item/WAP/207452)业务。 +- [WAP](https://baike.baidu.com/item/WAP/207452)以外的服务,比如:连接因特网。 + +From the perspective of operators, APN is a logical name. APN is generally deployed on GGSN devices or logically connected to GGSN. When users use GPRS to surf the Internet, they use [GGSN](https://baike.baidu.com/item/GGSN/6041769)代理出去到外部网络,因此,APN设置、过滤、统计等,就成为一个对GPRS计费、GPRS资费有重要参考价值的参数之一(因为APN可以区分一个业务或者外部网络)。 + +The complete description of APN is defined in detail in 3GPP specification ts23.003 clause 9. + +### Composition of APN + +The APN access point name consists of two parts: + +-Network identifier + +-Operation trademark identifier + +The operation trademark identifier consists of two other parts: + +-Mobile network code (MNC) + +-Mobile country code (MCC) + +### Type of APN + +APNs can be divided according to whether they are connected to public or private networks and the allocation of IP addresses. There are four different types: + +-** public APN - ** usually referred to as "APN". The devices connected to the gateway using the public APN will dynamically obtain the IP address so that most of them can access the Internet; + +-** public APN - ** gateway with static IP assigns static IP address to the device according to the available IP pool of the public network; + +-** dedicated APN - ** this is also considered "APN with VPN". A device with a dedicated APN configuration can be connected to its own internal network through a gateway; + +-** private APN with static IP - ** gateway assigns static IP addresses to devices according to the available IP pools of the private network. + +When we compare public APN with private APN, we can see that the latter does not even need an Internet connection. The private APN will never allow it to access the public Internet, while maintaining it on the cellular network infrastructure, thus ensuring secure data processing. + +### Configure APN + +For quecpthon, you can use the SIM card default APN or manually configure the APN, or call the API function to configure the APN. + + + +## Quick start + +### Operation process + +1. Use link dialing to obtain link activation. +2. Obtain basic data such as IP information. +3. Register the disconnection callback function. In the callback function, judge the network status and enter redial and other operations. + +### Interactive experiment + +```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) #Enter flight mode +0 +>>> *** network 1 not connected! *** #The user is informed that the flight mode is disconnected through callback +>>> net.setModemFun(1) #Exit flight mode +0 +>>> *** network 1 connected! *** #Exit flight mode, dial automatically, wait for successful networking, and notify the user through callback +``` + + + +### Code experiment + +1. First, activate the link. + +2. Print IP information, etc. + +3. Register callback function. + +4. Use flight mode to simulate offline + +5. Redial in the callback function. + +```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) + #reenter + test_datacall_module() + + +def test_datacall_module(): + #dial + ret = dataCall.start(1, 0, "3gnet.mnc001.mcc460.gprs", "", "", 0) + if ret == 0: + print("datacall start has success") + g_net_status = True + #Obtain IP address and other information + Info = dataCall.getInfo(1, 0) + print(Info) + print("test datacall has exit") + pass + + +def test_datacall_callback(): + test_datacall_module() + #Registration callback interrupt + ret = dataCall.setCallback(callback) + if ret == 0x00: + print("set Callback has success") + net.setModemFun(4) #Enter flight mode + time.sleep_ms(1000) + net.setModemFun(1) #Re enter normal mode + print("test_datacall_callback funcation has exited") + pass + + +if __name__ == "__main__": + test_datacall_callback() + +``` + +## References + +[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 - Data dialing](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=datacall-数据拨号) + +## Matching code + + + download code diff --git a/docs/Advanced_development/en/QuecPythonWirelessNetwork/Quectel_sbs_Socket_relation.png b/docs/Advanced_development/en/QuecPythonWirelessNetwork/Quectel_sbs_Socket_relation.png new file mode 100644 index 0000000000000000000000000000000000000000..83842de47d3fd0894a1c4cb9f3538fc8103f3276 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonWirelessNetwork/Quectel_sbs_Socket_relation.png differ diff --git a/docs/Advanced_development/en/QuecPythonWirelessNetwork/README.md b/docs/Advanced_development/en/QuecPythonWirelessNetwork/README.md new file mode 100644 index 0000000000000000000000000000000000000000..c3edb1f0016e3cf22db509873c675c4fb1d6a3aa --- /dev/null +++ b/docs/Advanced_development/en/QuecPythonWirelessNetwork/README.md @@ -0,0 +1,185 @@ +## QuecPython SIM card function development + +This article mainly introduces the use of quecpthon SIM card module. + +The APIs it contains are + +- **sim.getImsi()** +- **sim.getIccid()** +- **sim.getPhoneNumber()** +- **sim.getStatus()** +- **sim.enablePin(pin)** +- **sim.disablePin(pin)** +- **sim.verifyPin(pin)** +- **sim.unblockPin(puk, newPin)** +- **sim.changePin(oldPin, newPin)** +- **sim.readPhonebook(storage, start, end, username)** +- **sim.writePhonebook(storage, index, username, number)** + +Please refer to [quecpython sim - SIM card library] for specific API details(https://python.quectel.com/wiki/api/#sim-sim) + +Applicable modules: + +- EC100Y-CN +- EC600S-CN + +### Basic overview of SIM card + +Sim is divided into mobile phone card and IOT network card. The difference is that the IOT network card can't send and receive text messages without a phone number, and the mobile phone can send text messages. The most common is the mobile phone card. + +The second generation standard mini card is commonly known as the big card by domestic users. + +The third generation of standard micro card, commonly known as small card. + +The fourth generation standard nano card. + +![image-20210113215601231](media/image-20210113215601231.png) + +Ec600s-cn needs the fourth generation standard nano card. + +### Explanation of common terms + +#### IMSI + +The full name of IMSI is international mobile subscriber identity, i.e. international mobile subscriber identification code. + +-The first three digits represent the mobile country code (MCC). +-The next two or three digits represent the mobile network code (MNC). E. 212 allows the use of three digit MNC codes, but mainly in the United States and Canada. +-The next number represents the mobile subscriber identification number (MSIN). + +#### ICCID + +The full name of iccid is integrated circuit card identifier, i.e. integrated circuit card identification code. + +It can be simply understood as the ID number of SIM card. + +-The code format is XXXXXX 0mfss yygxx XXXX. + +-Top six operator Codes: + + 890 for China Mobile; 898602; 898604; 898607 , + + The of China Unicom are: 898601, 898606, 898609, + + China Telecom 898603, 898611. + + +#### Phonebook Memory Storage + +Phonebook memory storage is the storage area of SIM card phonebook. For details, please refer to [ts_ 127007v100300p.pdf](https://www.etsi.org/deliver/etsi_ts/127000_127099/127007/10.03.00_60/ts_127007v100300p.pdf) 。 + +![image-20210113220623353](media/image-20210113220623353.png) + +### Quick start + +#### Interactive experiment + +```python +>>> import sim +>>> sim.getStatus() +1 +>>> sim.getImsi() +'460110847679419' +>>> sim.getIccid() +'89860319747555431000' +#Write a phone book, +>>> sim.writePhonebook(9, 1, 'Tom', '18144786859') +0 +>>> sim.writePhonebook(9, 2, 'z', '18144786859') +0 +>>> sim.readPhonebook(9, 1, 4, "") +(1, [(1, 'Tom', '18144786859')]) +>>> sim.readPhonebook(9, 2, 4, "") +(1, [(2, 'z', '18144786859')]) +``` + +#### Code experiment + +Use the command line to randomly write the phonebook in the SIM card. + + +```python +#Reference documents +# https://python.quectel.com/wiki/#/zh-cn/api/?id=sim-sim%e5%8d%a1 +import sim +import utime as time +import urandom as random +#Print all contacts + + +def print_sim_phonebook(): + for i in range(1, 1000): + #Read one at a time + info = sim.readPhonebook(9, i, i+1, "") + if info == -1: + print("read has error") + break + else: + print(info) + time.sleep_ms(5) + +#Generate random names + + +def CreatRandomStr(length): + # The limit for the extended ASCII Character set + MAX_LENGTH = 16 + random_string = '' + if length > MAX_LENGTH: + length = length % MAX_LENGTH + if length == 0: + length = random.randint(1, MAX_LENGTH) + for _ in range(length): + # 0 ~ z + random_integer = random.randint(48, 122) + # Keep appending random characters using chr(x) + random_string += (chr(random_integer)) + return random_string + + +def CreatRandomPhoneNum(count=8): + pre_lst = ["130", "131", "132", "133", "134", "135", "136", "137", "138", "139", "147", "150", + "151", "152", "153", "155", "156", "157", "158", "159", "186", "187", "188"] + #Generate 8 random digits + tail_str = [str(random.randint(0, 9)) for i in range(count)] + #Convert it to a string + tail_str = ''.join(tail_str) + return random.choice(pre_lst) + tail_str + pass + + +def write_random_sim_phonebook(): + for i in range(1, 10): + #Write one at a time + name = CreatRandomStr(random.randint(4, 6)) + number = CreatRandomPhoneNum() + sim.writePhonebook(9, i, name, number) + + +def test_sim_base(): + # check sim statsu + ret = sim.getStatus() + if ret == 1: + write_random_sim_phonebook() + print_sim_phonebook() + else: + #Wrong state + print("sim status has error , value is {0}".format(ret)) + print("test_sim_base has exited") + + +if __name__ == "__main__": + test_sim_base() + +``` + +### References + +**[ts_127007v100300p.pdf](https://www.etsi.org/deliver/etsi_ts/127000_127099/127007/10.03.00_60/ts_127007v100300p.pdf)** + +**[quecpython sim - SIM card library](https://python.quectel.com/wiki/api/#sim-sim)** + +### Matching code + + + download code diff --git a/docs/Advanced_development/en/QuecPythonWirelessNetwork/cellLocator.md b/docs/Advanced_development/en/QuecPythonWirelessNetwork/cellLocator.md new file mode 100644 index 0000000000000000000000000000000000000000..37639302c0301eb31673ad571ee648fd5cd0bab1 --- /dev/null +++ b/docs/Advanced_development/en/QuecPythonWirelessNetwork/cellLocator.md @@ -0,0 +1,112 @@ + +# QuecPython_ Cell locator base station location + +This article mainly introduces quecpytho_ Celllocator is used to locate the base station. + +**Module functions:** + +Provide the base station positioning interface to obtain the terminal coordinate information. + +**Corresponding API:** + +- cellLocator.getLocation(serverAddr, port, token, timeout, profileID) + +Please refer to [celllocator - base station location] for specific API details(https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=celllocator-基站定位) + + + +## Positioning overview + +Positioning refers to the technology or service of obtaining the location information (longitude and latitude coordinates) of the user terminal through a specific method. + +There are two common positioning technologies: one is positioning based on GPS and the other is base station positioning based on mobile operation network. The positioning method based on GPS uses the GPS positioning module to send its own position signal to the positioning background to realize positioning. Base station positioning uses the distance between the base station and the terminal to determine the location of the terminal. QuecPython_ Cell locator is a kind of base station location. + +The basic principle of base station positioning is as follows: the mobile terminal measures the downlink pilot signal time of different base stations through the operator's network (such as GSM network) to obtain the toa (time of arrival) or TDOA (time difference of arrival) of downlink pilots of different base stations. According to the measurement results and combined with the coordinates of the base station, the triangular formula estimation algorithm is generally adopted, Obtain the location information (longitude and latitude coordinates) of the mobile terminal user, and provide the user with the corresponding positioning position with the support of the electronic map platform. The actual location estimation algorithm needs to consider the location of multiple base stations (3 or more), so the algorithm is much more complex. Generally speaking, the more the number of base stations measured by the mobile station, the higher the measurement accuracy, and the more obvious the improvement of positioning performance. + + + +## QuecPython_ Celllocator property + +QuecPython_ Cell locator base station positioning does not require the terminal to have GPS positioning capability and no additional hardware support, but the accuracy largely depends on the distribution and coverage of the base station. The positioning accuracy is about 500m ~ 1500m (depending on the density of base stations and the number of databases). In addition, Wi Fi can be used to assist positioning in a small range, with a positioning accuracy of about 50m. + +Since it is the base station positioning, the base station signal coverage is required. At present, the domestic 4G signal has been basically covered, and the 2G network can still be used temporarily, but it faces the risk of network withdrawal. Only Telecom has not been withdrawn from the 3G network, which is also included in the network withdrawal plan. Before using this function, you need to understand the signal coverage of the place of use. + + + +## Rapid development + +### Interactive experiment + +For this experiment, you need to determine the SIM card status first. Please refer to the SIM module documentation for details. + +We use interactive commands to obtain the current coordinate information. + +```python +>>> import cellLocator +>>> cellLocator.getLocation("www.queclocator.com", 80, "1111111122222222", 8, 1) +(117.1138, 31.82279, 550) +#The key used above is only a test key +``` + +### Code experiment + +Calculate the distance from the current location to the capital of Beijing, + +```python +import cellLocator +from math import sin, asin, cos, radians, fabs, sqrt + +EARTH_RADIUS = 6371 #Average radius of the earth, 6371km + + +def hav(theta): + s = sin(theta / 2) + return s * s + + +def get_distance_hav(lat0, lng0, lat1, lng1): +"Use haversine formula to calculate the distance between two points on the sphere." + #Convert latitude and longitude into radians + 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(): + #Test location + lon1, lat1 = (22.599578, 113.973129) #Shenzhen Wildlife Park (starting point) + lon2, lat2 = (39.9087202, 116.3974799) #Beijing Tiananmen Square (1938.4km) + d2 = get_distance_hav(lon1, lat1, lon2, lat2) + print(d2) + #Get current location + # (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() + +``` + + +## References + +[celllocator - base station location](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=celllocator-基站定位) + +## Matching code + + + download code + diff --git a/docs/Advanced_development/zh/QuecPythonWirelessNetwork/code/cellLocator_base.py b/docs/Advanced_development/en/QuecPythonWirelessNetwork/code/cellLocator_base.py similarity index 100% rename from docs/Advanced_development/zh/QuecPythonWirelessNetwork/code/cellLocator_base.py rename to docs/Advanced_development/en/QuecPythonWirelessNetwork/code/cellLocator_base.py diff --git a/docs/Advanced_development/zh/QuecPythonWirelessNetwork/code/datacall_base.py b/docs/Advanced_development/en/QuecPythonWirelessNetwork/code/datacall_base.py similarity index 100% rename from docs/Advanced_development/zh/QuecPythonWirelessNetwork/code/datacall_base.py rename to docs/Advanced_development/en/QuecPythonWirelessNetwork/code/datacall_base.py diff --git a/docs/Advanced_development/zh/QuecPythonWirelessNetwork/code/sim_base.py b/docs/Advanced_development/en/QuecPythonWirelessNetwork/code/sim_base.py similarity index 100% rename from docs/Advanced_development/zh/QuecPythonWirelessNetwork/code/sim_base.py rename to docs/Advanced_development/en/QuecPythonWirelessNetwork/code/sim_base.py diff --git a/docs/Advanced_development/zh/QuecPythonWirelessNetwork/media/image-20210113215601231.png b/docs/Advanced_development/en/QuecPythonWirelessNetwork/media/Qp_Sim_fun_01.png similarity index 100% rename from docs/Advanced_development/zh/QuecPythonWirelessNetwork/media/image-20210113215601231.png rename to docs/Advanced_development/en/QuecPythonWirelessNetwork/media/Qp_Sim_fun_01.png diff --git a/docs/Advanced_development/zh/QuecPythonWirelessNetwork/media/image-20210113220623353.png b/docs/Advanced_development/en/QuecPythonWirelessNetwork/media/Qp_Sim_fun_02.png similarity index 100% rename from docs/Advanced_development/zh/QuecPythonWirelessNetwork/media/image-20210113220623353.png rename to docs/Advanced_development/en/QuecPythonWirelessNetwork/media/Qp_Sim_fun_02.png diff --git a/docs/Advanced_development/en/QuecPythonWirelessNetwork/media/mediaQp_Advanced_development_QuecPythonWirelessNetwork_SIM_card.png b/docs/Advanced_development/en/QuecPythonWirelessNetwork/media/mediaQp_Advanced_development_QuecPythonWirelessNetwork_SIM_card.png new file mode 100644 index 0000000000000000000000000000000000000000..5e6bbcc8267d8a34062af3cf1913fa79e393e4f4 Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonWirelessNetwork/media/mediaQp_Advanced_development_QuecPythonWirelessNetwork_SIM_card.png differ diff --git a/docs/Advanced_development/en/QuecPythonWirelessNetwork/media/mediaQp_Advanced_development_QuecPythonWirelessNetwork_SIM_telephone.png b/docs/Advanced_development/en/QuecPythonWirelessNetwork/media/mediaQp_Advanced_development_QuecPythonWirelessNetwork_SIM_telephone.png new file mode 100644 index 0000000000000000000000000000000000000000..c69de7da003570f058d13bfe7394e6e9202f518b Binary files /dev/null and b/docs/Advanced_development/en/QuecPythonWirelessNetwork/media/mediaQp_Advanced_development_QuecPythonWirelessNetwork_SIM_telephone.png differ diff --git a/docs/Advanced_development/zh/QuecPythonWirelessNetwork/media/image-20210113192225821.png b/docs/Advanced_development/en/QuecPythonWirelessNetwork/media/mediaQp_Advanced_development_QuecPythonWirelessNetwork_cellLocator_overview.png similarity index 100% rename from docs/Advanced_development/zh/QuecPythonWirelessNetwork/media/image-20210113192225821.png rename to docs/Advanced_development/en/QuecPythonWirelessNetwork/media/mediaQp_Advanced_development_QuecPythonWirelessNetwork_cellLocator_overview.png diff --git a/docs/Advanced_development/en/QuecPythonWirelessNetwork/sim.md b/docs/Advanced_development/en/QuecPythonWirelessNetwork/sim.md new file mode 100644 index 0000000000000000000000000000000000000000..fbf4edb82dd1141f83f145579f5de968aa2616bb --- /dev/null +++ b/docs/Advanced_development/en/QuecPythonWirelessNetwork/sim.md @@ -0,0 +1,149 @@ +## SIM card function development + +This article mainly introduces the use of quecpthon SIM card module. +Please refer to [quecpython sim - SIM card library] for specific API details(https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=sim-sim%e5%8d%a1) + +## Basic overview of SIM card + +Sim is divided into mobile phone card and IOT network card. The difference is that the IOT network card can't send and receive text messages without a phone number, and the mobile phone can send text messages. The most common is the mobile phone card. + +The second generation standard mini card is commonly known as the big card by domestic users. + +The third generation of standard micro card, commonly known as small card. + +The fourth generation standard nano card. + +![mediaQp_Advanced_development_QuecPythonWirelessNetwork_SIM_card](media/mediaQp_Advanced_development_QuecPythonWirelessNetwork_SIM_card.png) +>>>>>>> c381258ea927bd1c9d4f650bc704239508fc86ba + +![SIM卡-二三四代卡不同形状区别](media/Qp_Sim_fun_01.png) + +What is needed is the fourth generation standard nano card. + +## Quick start +Before obtaining the SIM card information, please first confirm whether the SIM card is in good condition, +```python +import sim +#Returning status 1 indicates that the status is correct. For other error codes, please refer to wiki SIM API +sim.getStatus() +``` +### Get IMSI +The full name of IMSI is international mobile subscriber identity, i.e. international mobile subscriber identification code. + +-The first three digits represent the mobile country code (MCC). +-The next two or three digits represent the mobile network code (MNC). E. 212 allows the use of three digit MNC codes, but mainly in the United States and Canada. +-The next number represents the mobile subscriber identification number (MSIN). +```python +import sim +sim.getImsi() +``` +### Get iccid +The full name of iccid is integrated circuit card identifier, i.e. integrated circuit card identification code. + +It can be simply understood as the ID number of SIM card. + +-The code format is XXXXXX 0mfss yygxx XXXX. + +-Top six operator Codes: + + 890 for China Mobile; 898602; 898604; 898607 , + + The of China Unicom are: 898601, 898606, 898609, + + China Telecom 898603, 898611. +```python +import sim +sim.iccid() +``` + +### Pin code operation + Pin code (Pin1) is a telecommunication term, full name ** personal identification number **. Refers to the personal identification code of the SIM card +The mobile phone pin code is a security measure to protect the SIM card and prevent others from stealing the SIM card. If the boot pin code is enabled, enter the ** 4-8 ** digit PIN code after each boot. +When the pin code is entered incorrectly for more than three times, it will be automatically locked and protected. To unlock, you need to use PUK code to call the operator's customer service hotline +It should be noted that if you enter the wrong pin code three times, the phone will automatically lock the card and prompt you to enter the PUK code to unlock, +This time is close to the edge of danger. If you don't know your PUK code, don't move for the time being, +Take the service password and call the customer service hotline. The customer service will tell you the initial PUK code, +After entering the PUK code, the pin will be unlocked and the password can be reset. If you modify the pin code without authorization, be sure to keep it in mind. + +#### Pin1 code + Pin1 code is a personal identification code. It is a storage unit inside the SIM card, which is set through the mobile phone. +The Pin1 code will be required to be input when the machine is turned on. If the Pin1 code is input incorrectly for 3 times, it will lead to "locking". +At this time, the operator needs to provide PUK code and enter it on the mobile phone keyboard to unlock it. +If you mistakenly enter the PUK code 10 times, you will "burn the card". You must bring the valid certificate of the owner to the business hall of the operation network to make up the card. + +#### Pin2 code + If "Pin2 code restricted call" is displayed on your phone, it may be because you have enabled the relevant functions of Pin2 code, +However, since the network does not support the relevant functions of Pin2 code temporarily, its functions cannot be used even if it is turned on. +If you accidentally lock the Pin2 code, it will not affect the normal use of the mobile phone. Please bring the valid certificate of the owner to the business hall of the operator service provider for free unlocking service. + +Enable SIM card PIN code verification. After enabling, you need to enter the correct pin. After successful verification, the SIM card can be used normally. There are only three opportunities to enter the pin code. All three times are wrong. The SIM card is locked and needs to be unlocked by PUK. + +#### Enable verification pin code +```python +import sim +#1234 is modified into your PIN code, usually 4 to 8 bits. Please be careful in such operations. +sim.enablePin("1234") +#Pin can only be verified after enabling pin code +sim.verifyPin("1234") +#Close pin code +sim.disablePin("1234") +``` +#### Modify pin code +```python +import sim +#1234 is the long pin code and 4321 is the new pin code +sim.changePin("1234", "4321") +``` + +### Reset pin code PUK code +When the pin code is entered incorrectly too many times, the pin code cannot be entered again. At this time, you need to use PUK code to unlock. + +#### Puk1 code +The PUK code (puk1) consists of 8 digits, which cannot be changed by the user. The PUK code will not be changed until the SIM card is replaced. +When the mobile phone pin code is locked and prompted for PUK code. +Don't act rashly, because the PUK code has only 10 input opportunities, and if you lose it wrong 10 times, +The SIM card will be permanently locked, that is, scrapped. The PUK code of some SIM cards is attached to the card when the user purchases the card. + +#### Puk2 code +Pin2 code is used by Telecom Bureau for billing and is generally not provided to users. +If the input is wrong for three times, the phone will need to be unlocked with puk2 code. The process is the same as the pin code and PUK code described earlier. +However, these two passwords are related to network billing and modification of SIM card internal data, +Therefore, it will not be disclosed, and even if the Pin2 password is locked, it will not affect the normal use of the mobile phone** Therefore, Pin2 code and puk2 code do not need to be deliberately ignored **. + +#### Unlock pin +```python +import sim +#12345678 is the PUK code and 0000 is the new pin code +sim.unblockPin("12345678", "0000") +``` + +### Read / write SIM memory area + +#### Phonebook Memory Storage +Phonebook memory storage is the storage area of SIM card phonebook. For details, please refer to [ts_ 127007v100300p.pdf](https://www.etsi.org/deliver/etsi_ts/127000_127099/127007/10.03.00_60/ts_127007v100300p.pdf) +![Phonebook Memory Storage简介-英文版](media/Qp_Sim_fun_02.png) + +```python +>>> import sim +>>> sim.getStatus() +1 +>>> sim.getImsi() +'460110847679419' +>>> sim.getIccid() +'89860319747555431000' +#Write a phone book, +>>> sim.writePhonebook(9, 1, 'Tom', '18144786859') +0 +>>> sim.writePhonebook(9, 2, 'z', '18144786859') +0 +>>> sim.readPhonebook(9, 1, 4, "") +(1, [(1, 'Tom', '18144786859')]) +>>> sim.readPhonebook(9, 2, 4, "") +(1, [(2, 'z', '18144786859')]) +``` +## References + +**[ts_127007v100300p.pdf](https://www.etsi.org/deliver/etsi_ts/127000_127099/127007/10.03.00_60/ts_127007v100300p.pdf)** + +**[quecpython sim - SIM card library]([QuecPython 类库 (quectel.com)](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=sim-sim卡))** + diff --git a/docs/Advanced_development/en/README.md b/docs/Advanced_development/en/README.md new file mode 100644 index 0000000000000000000000000000000000000000..318bb527df26d1621b2a09a17c602d19bde79179 --- /dev/null +++ b/docs/Advanced_development/en/README.md @@ -0,0 +1,2 @@ +## Advanced development +To be added diff --git a/docs/Advanced_development/en/config.json b/docs/Advanced_development/en/config.json new file mode 100644 index 0000000000000000000000000000000000000000..132af4bf2cdc2b93723164b0894da50e527665b3 --- /dev/null +++ b/docs/Advanced_development/en/config.json @@ -0,0 +1,24 @@ +{ + "import": "config_en", + "navbar": { + "items": [ + { + "id": "language", + "label": "Language: ", + "position": "right", + "items": [ + { + "id": "zh", + "url": "/doc/Advanced_development/zh/", + "label": "中文" + }, + { + "id": "en", + "url": "/doc/Advanced_development/en/", + "label": "English" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/docs/Advanced_development/en/sidebar.yaml b/docs/Advanced_development/en/sidebar.yaml new file mode 100644 index 0000000000000000000000000000000000000000..1354868b6a9de313f490b42e5347101e2a248b7e --- /dev/null +++ b/docs/Advanced_development/en/sidebar.yaml @@ -0,0 +1,78 @@ +items: + - label: Advanced Development + file: README.md + - label: bus interface + items: + - label: UART development + file: QuecPythonSub/UART.md + - label: GPIO and IO interrupt development + file: QuecPythonSub/GPIO.md + - label: I2C bus development + file: QuecPythonSub/I2C.md + - label: PWM development + file: QuecPythonSub/Qp_sub_PWM.md + - label: ADC sampling development + file: QuecPythonSub/ADC.md + - label: SPI bus development + file: QuecPythonSub/SPI.md + - label: cloud platform + items: + - label: access to alicloud + file: QuecPythonCloud/Aliyun.md + - label: access Tencent cloud + file: QuecPythonCloud/TencentCloud.md + - label: access to mobile cloud + file: QuecPythonCloud/QuecCloud.md + - label: access Huawei cloud + file: QuecPythonCloud/HuaweiCloud.md + - label: access Amazon cloud + file: QuecPythonCloud/AmazonCloud.md + - label: drive subsystem + items: + - label: platform driven + items: + - label: RTC development + file: QuecPythonSub/RTC.md + - label: timer timer development + file: QuecPythonSub/Timer.md + - label: watchdog development + file: QuecPythonSub/WDT.md + - label: power switch + file: QuecPythonSub/Power.md + - label: low power management + file: QuecPythonSub/PM.md + # - label: charging management + - label: Audio + items: + - label: audio playback + file: QuecPythonSub/Audio.md + - label: TTS development + file: QuecPythonSub/TTS.md + - label: recording development + file: QuecPythonSub/record.md + # - label: record audio + - label: peripheral debugging + items: + # - label: LCD debugging process + # file: QuecPythonSub/LCD.md + # - label: SPI nor flash debugging process + - label: sensor debugging process + file: QuecPythonSub/Sensor.md + # - label: camera debugging process + # - label: SD card debugging process + - label: platform interface + items: + - label: modem to obtain device information + file: QuecPythonInterface/modem_get_dev_info.md + - label: FOTA firmware upgrade User Guide + file: QuecPythonInterface/FOTA_binary_upgrade.md + - label: wireless networking development + items: + - label: datacall data dialing + file: QuecPythonWirelessNetwork/DataCall.md + - label: SIM card function development + file: QuecPythonWirelessNetwork/sim.md + - label: celllocator base station location + file: QuecPythonWirelessNetwork/cellLocator.md + - label: multithreading development + file: QuecPythonInterface/Multithreading.md diff --git a/docs/Advanced_development/zh/HeliosSDK/HeliosSDK1.md b/docs/Advanced_development/zh/HeliosSDK/HeliosSDK1.md new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git "a/docs/Advanced_development/zh/HeliosService/Helio_Service\346\214\207\345\215\227(1)_\345\205\245\351\227\250.md" "b/docs/Advanced_development/zh/HeliosService/Helio_Service\346\214\207\345\215\227(1)_\345\205\245\351\227\250.md" new file mode 100644 index 0000000000000000000000000000000000000000..b8100ac394218a7c322e4ece86592fde48da4b65 --- /dev/null +++ "b/docs/Advanced_development/zh/HeliosService/Helio_Service\346\214\207\345\215\227(1)_\345\205\245\351\227\250.md" @@ -0,0 +1,248 @@ +## 文档历史 + +**修订记录** + +| **版本** | **日期** | **作者** | **变更表述** | +| -------- | ---------- | -------- | ------------ | +| 1.0 | 2021-09-17 | Chic | 初始版本 | + + + +# Helios Services指南(1)-入门 + +1.背景 + +2.新框架解决那些问题/特性/优势 + +3.能帮助客户解决那些问题 可举例 + +4.简单说明框架如何使用,目录结构解析,使用教程 + +5.一个简单的例子 举例论证新框架的易用性和为什么要用新框架 + +​ 用新框架连阿里云,设备端喂狗、拉GPIO、组包发数据 + +描述一下开发过程中的痛点 ---> 为解决这些痛点开发了新框架来解决这些问题-->如何解决问题/解决了那些问题 + +(比如支持日志服务、解决线程通信问题、支持看门狗组件、支持腾讯云组件、阿里云组件) + +以下是正文(待补充) + +## 背景 + +QuecPython目前一直没有一个应用层框架来实现统筹的消息注册,消息监听,事件管理, 组件通信,会话等功能, 解决一直存在的重复工作量和安全稳定性问题,为了迎合QuecPython的发展, 简化用户对底层网络, 日志, 移远云服务, 定位, 媒体等复杂的数据处理和数据保护等操作,特此我们专门开发了一套应用编程框架来简化复杂的创建、维护的等操作。 + +我们想通过数据驱动来改善我们目前复杂的编码过程, 顺着这个出发点QuecPython应用编程框架--HeliosService 正式面世! + +## 优势 + +尽管python开发已经相当便捷且功能强大,而QuecPython又在python的基础上极大的拉低了嵌入式开发的门槛,但是仍然会有很多新手开发者在想要开发自己的项目时不知从何入手亦或是在搭建项目框架、编写项目代码时遇到形形色色的问题(以上种种俗称踩坑),为了避免开发者重复踩坑,提升开发者开发效率,于是集结了众多前人的踩坑经验以及官方开发者的满腔心血而开发出的HeliosService顺应天时而生。 + +那么HeliosService新框架给QuecPython带来了哪些变革呢? + +HeliosService将常用的功能整合成服务,并提供统一的API来供客户调用,用户在实现网络、日志、异常、线程通信、队列等功能时更加便捷,另外提供了丰富的第三方组件,例如中断拦截器、GPIO读写拦截器、定时拦截器、看门狗拦截器,极大的减轻了用户的开发难度。 + +**设计的初衷** + +- 将用户和操作一些主动行为变为被动行为的 +- 业务之间的解耦, 所以我们特此讲系统的一些组件设计成发布订阅的模式 +- 开发者订阅相关只需要关注的服务, 即可获取相关的状态 +- 提供消息队列,客户可以通过消息队列来定制自己的组件 +- 提供会话中心, 脱离系统服务外支持客户自定义TOPIC发布订阅的服务 +- 容器化, 我们提供启动器, 所有的服务和组件获取都通过容器来获取,而不再逐个依赖进行加载 +- 简化客户的操作, 和解耦业务之间的依赖使我们的和兴目标 + +而新框架又解决了哪些问题呢?让我们走进下一章。 + +## 解决的问题 + +**携带发布订阅BUS总线** + + - 支持消息和处理的绑定 + - 异步的消息处理机制 + - 用户不需关心对应的处理函数,只管向对应的topic发消息即可 + +**携带消息队列广播机制** + + - 可自定义消息类型,执行异步和同步模式,支持事件派发和事件管理, 支持标准队列和观察者模式) + - 解决了两个线程之间传递消息,以及多个事件广播的问题 + - 给模块进行了标准化的解耦过程, 提供了统一稳定的事件管理中心来保证通信的质量 + +**NET(网络)** + + - 提供网络服务(解决了客户网络的依赖, 客户只需要注册回调接口, 就可以发现注网的状态, 也支持主动查询, 设置APN等操作) + - 支持断网通知, 断网重连通知等,支持订阅消息 + - 支持网络主动查询 + +**LOG(日志)** + + - 提供标准化的日志系统(解决日志标准化的问题, 提供日志标准化的输出并携带时间,同样支持异步和同步的配置, 支持云端发送, 落盘等行为) + - 支持不同uart口输出, 落盘输出等 + - 支持订阅消息发布消息 + +**CLOUD(移远云服务)** + + - 提供基于移远云的OTA升级和日志发送接口(临终遗言日志上报, OTA的升级, OTA组件等 + - 同样支持异步和同步模式) + - 支持自动化固件升级 + - 支持自动化文件升级 + - 支持提交云端日志可配合我们日志系统使用 + +**MEDIA(媒体服务)** + + - 提供媒体功能(支持发布异步的媒体消息, 统一媒体消息管理等等) + - 支持异步tts, audio播报 + - 支持tts,audio消息发布,消息广播,消息订阅 + - 支持tts, audio播报的自动管理,保证消息播报的可靠性 + +**EXCEPTION(异常服务)** + + - 提供异常服务支持 + - 支持同步异步消息 + - 支持异常消息订阅, 异常消息发送 + +**PM(低功耗服务)** + + - 可选的功耗管理 + - 默认低功耗模式 + - 支持高刷唤醒 + +**SYS_BUS(发布订阅总线)** + + - 支持自定义topic实现发布订阅 + - 支持发布订阅, 通过自动化的线程渠道去分配线程处理业务 + - 支持高并发的处理 + +**Queue(标准队列)** + + - 支持不同线程中消息的传递 + - 阻塞实现, 支持多线程的put ,get 原子操作 + +## 使用说明 + +**代码目录结构** + +```python +usr # 用户分区 +├─main.py # 用户代码(程序入口) +├─bin # 脚本和启动器(下面放着一些共有服务和一些公有的组件) +│ ├─cloud_service.py # 云服务组件 +│ ├─exception_service.py # 异常服务组件 +│ ├─guard.py # 全局监控和配置文件的启动容器 +│ ├─log_service.py # 日志服务组件 +│ ├─media_service.py # 媒体服务组件 +│ ├─net_service.py # 网络服务组件 +│ ├─pm_service.py # 低功耗服务组件 +│ └─components # 该目录下存放一些公共组件 +│ │ ├─abstract_service.py # 服务抽象类 +│ │ ├─blinker_min.py +│ │ ├─monitor.py +│ │ ├─OTA.py # OTA升级组件 +│ │ └─service_models.py # 服务模型基类 +│ └─third_party +│ ├─ql_interrupter.py # 第三方服务组件,外部中断/看门狗等 +│ └─ ... +├─etc # 配置文件目录(非必须存在) +│ ├─app_config # app业务服务配置文件目录 +│ └─system_config # 系统服务配置文件目录 +├─log # 日志存储服务(非必须存在,选择日志存储为本地时自动创建) +└─utils # 通用工具目录 + ├─JsonParserUtils.py # josn处理utils + ├─resolver.py # 时间格式化处理器 + └─service_utils.py # 单例模式类实现 +``` + +> +> +> 第三方的组件会持续更新增加新内容 + +### 搭配工具使用说明 + +> 新框架需要搭配QPYcom_V1.7版本使用 + +以上所有目录和文件可通过QPYcom下载到模块中,用户编辑好自己的代码之后下载到模块中即可进行调试,下载方式参考下图 + +第一种方式,下载页面配置项目,优势是一键导入目录结构之后再次下载调试点击下载脚本按钮即可,方便后续调试 + +![t21fkamlv5](http://1.116.208.16/images/wiki/t21fkamlv5.gif) + +第二种方式,文件页面从左侧本地文件树拖拽到右侧模块文件树,等待下载完成即可,优势是直接拖拽操作简单便捷 + +![ZLLVygvK5o](http://1.116.208.16/images/wiki/ZLLVygvK5o.gif) + +> 上述两种方案均可下载框架代码至模块中 + +### api使用说明 + +参见api说明文档 + +## 举个栗子 + +### 读取配置文件示例 + +```python +# 初始化全局的guard环境 +from usr.bin.guard import GuardContext +guard_context = GuardContext() +# 刷新容器并启动的所有服务 +guard_context.refresh() +# 读取配置文件示例 +config = guard_context.service_config["cloud"] # 读取/usr/etc/app_config/cloud/config.json 配置文件内容返回的字典对象 +``` + +网络服务和日志服务示例 + +```python +from usr.bin.guard import GuardContext + +def net(*args, **kwargs): + """网络回调函数""" + app_log.debug("net_callback,args:{},kwargs:{}".format(args, kwargs)) + +if __name__ == '__main__': + # 初始化全局容器 + guard_context = GuardContext() + guard_context.refresh() + # 获取网络服务&日志服务 + net_service = guard_context.get_server('net') + log_service = guard_context.get_server('log') + # 订阅网络服务 + net_service.subscribe(net) + + # 获取app_log + app_log = guard_context.get_logger("app_log") + app_log.debug("net status: {}".format(net_service.get_net_status())) +``` + +### 第三方组件示例 + +GPIO读写拦截器 + +```python +from ql_interrupter import PinInterrupter +from machine import Pin, ExtInt +pin_inter = PinInterrupter(Pin.GPIO1, trige_mode=Pin.OUT, pull_mode=Pin.PULL_DISABLE, mode=0) # 初始化 +pin_inter.write(1) # 设置PIN脚电平输出为高 +``` + +看门狗示例 + +```python +from ql_interrupter import WatchDog +from machine import Pin, ExtInt +import sys_bus +# 初始化watch dog +wd = WatchDog(Pin.GPIO15, 1, 10000) +wd.start() +def topic1_cb(topic, msg): + pass +def topic2_cb(topic, msg): + pass +# 订阅喂狗后,硬件狗拉GPIO 告知模块喂狗成功 +sys_bus.subscribe("WDT_KICK_TOPIC", topic1_cb) +# 订阅喂狗后的回调 +sys_bus.subscribe("WDT_KICK_TOPIC_FEED", topic2_cb) +``` + +> 更多示例代码和演示参考API说明 + 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" new file mode 100644 index 0000000000000000000000000000000000000000..9b7f3d7c7170a87fb8ef4154b47fcf464ac0f107 Binary files /dev/null and "b/docs/Advanced_development/zh/HeliosService/Helio_Service\346\214\207\345\215\227(1)_\345\205\245\351\227\250.pdf" differ diff --git "a/docs/Advanced_development/zh/HeliosService/Helio_Service\346\214\207\345\215\227(2)_\350\277\233\351\230\266.md" "b/docs/Advanced_development/zh/HeliosService/Helio_Service\346\214\207\345\215\227(2)_\350\277\233\351\230\266.md" new file mode 100644 index 0000000000000000000000000000000000000000..271797e268f1708f36af6d993fc27ac122a74e7a --- /dev/null +++ "b/docs/Advanced_development/zh/HeliosService/Helio_Service\346\214\207\345\215\227(2)_\350\277\233\351\230\266.md" @@ -0,0 +1,164 @@ +## 文档历史 + +**修订记录** + +| **版本** | **日期** | **作者** | **变更表述** | +| -------- | ---------- | -------- | ------------ | +| 1.0 | 2021-09-17 | Chic | 初始版本 | + + + +# Helios Services指南(2)-进阶 + +## Helios Services进阶概述 + +进阶篇,我们主要描述各个功能是如何使用的, 从入门篇我们已经帮环境搭好了, 从现在起, 我们将正式开始和使用上述功能, 并展示使用成果 + +## Helio Services使用文档 + +### 容器 + +主要是包裹和集成所有服务和配置的集中化管理的东西, 下面演示起核心使用, 其他功能请查看API文档 + +#### 启动容器 + +- [OK] 为启动成功 +- [FAILED]为服务启动失败 +- sys 和 app 代表服务所属的分区,sys是系统级别的, app是用户级别的 +- 启动成功的服务我们就可以调用了, 我们也可以查看所有启动成功的服务 + +![QPYcom_GniGshUtTV](./media/QPYcom_GniGshUtTV.png) + +#### 网络服务 + +##### 基本使用 + +- 我们可以获取到sim, net, dataCall对象无需导入 +- 我们可以订阅网络状态 + +![image-20210827100748287](media/image-20210827100748287.png) + +##### 检测联网 + +- 开启后可检查网络状态, 返回值请参考`HeliosService API文档` + +![image-20210827101129580](./media/image-20210827101129580.png) + +##### 其他功能 + +请参考AP文档进行调用 + +#### 日志服务 + +##### 基本使用 + +- 获取一个带命名的日志客户端 +- 输出日志 +- 设置日志输出级别 + +![QPYcom_PAk2AjLkiN](./media/QPYcom_PAk2AjLkiN.png) + +- 订阅日志 + +![QPYcom_AZHnngQa4K](./media/QPYcom_AZHnngQa4K.png) + +##### 其他功能 + +请参考AP文档进行调用 + + + +#### 媒体服务 + +##### 基本使用 + +- 获取原生tts,audio +- 订阅消息 +- 设置模式 +- 设置pa `参考API文档` + +![QPYcom_BlN4sYhUOK](./media/QPYcom_BlN4sYhUOK.png) + +##### 其他功能 + +- 请查看API文档 + +#### 低功耗服务 + +##### 基本使用 + +- 默认是开启低功耗模式 +- 存在投票机制 +- 查看偷拍不为0即无法进入休眠 +- 可以取消投票, 每一张投票都需要一次取消 + +![image-20210827131630704](./media/image-20210827131630704.png) + +##### 其他功能 + +请查看API相关文档 + +#### 移远云服务 + +##### 基本使用 + +- 提供日志上传至移远云 +- OTA单文件升级 + +![image-20210827132925708](./media/image-20210827132925708.png) + +创建cloud服务的config.json cloud服务是在app_config下面的 + +![image-20210827134613132](./media/image-20210827134613132.png) + +cloud服务config.json的内容 + +![image-20210827135011406](./media/image-20210827135011406.png) + +由于当时设置的level是3即使这里创建成功也是不能使用的, 所以我们需要, reload服务才会开启自动升级服务, 设计的初衷是让一些服务的启动等级变低, 客户去控制器启动顺序 + +![image-20210827134636763](./media/image-20210827134636763.png) + +![image-20210827141310248](./media/image-20210827141310248.png) + +- 提交日志 + +![image-20210827141503388](./media/image-20210827141503388.png) + +##### 其他功能 + +请查看API文档 + + + +#### 异常服务 + +##### 基本使用 + +- 订阅异常服务 +- 发布异常 + +![image-20210827175123097](./media/image-20210827175123097.png) + +### 三方组件 + +主要有gpio, 中断, 定时器, 看门狗的封装, 还有安全组件, 断传的封装 + + + +请查看相关API文档 + + + +### sys_bus使用 + +- 订阅topic的函数 +- 发布数据 + +![image-20210827152347130](./media/image-20210827152347130.png) + +### 裁剪说明 + +- 圈出来的, 带_service下坠的都是可以裁剪的, 如果不想用此服务, 删除即可 + +![image-20210827175241263](./media/image-20210827175241263.png) 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" new file mode 100644 index 0000000000000000000000000000000000000000..a8f8eef69b83758a9202a44f7703642dddcb7526 Binary files /dev/null and "b/docs/Advanced_development/zh/HeliosService/Helio_Service\346\214\207\345\215\227(2)_\350\277\233\351\230\266.pdf" differ diff --git "a/docs/Advanced_development/zh/HeliosService/Helio_Service\346\214\207\345\215\227(3)_\351\253\230\347\272\247.md" "b/docs/Advanced_development/zh/HeliosService/Helio_Service\346\214\207\345\215\227(3)_\351\253\230\347\272\247.md" new file mode 100644 index 0000000000000000000000000000000000000000..f408265ba5ca97bf9b23b2b5a65e18bd4eadaff7 --- /dev/null +++ "b/docs/Advanced_development/zh/HeliosService/Helio_Service\346\214\207\345\215\227(3)_\351\253\230\347\272\247.md" @@ -0,0 +1,144 @@ +## 文档历史 + +**修订记录** + +| **版本** | **日期** | **作者** | **变更表述** | +| -------- | ---------- | -------- | ------------ | +| 1.0 | 2021-09-17 | Chic | 初始版本 | + + + +# Helios Services指南(3)-高级 + +## Helios Services高级概述 + +此篇主要说的是, helios services的软件设计的思考, 和后续将要支持的功能, 以及通过我们软件设计知道内部的通信原理, 了解和理解内部的机制等等... + + + +## Helios Services软件架构设计 + +### 架构设计 + +![image-20210825131423890](./media/image-20210825131423890.png) + +名词解释: + +- `Services`: 服务组件 +- `Config`: 配置存储 + - `app_config`: 存储用户配置文件的目录 + - `system_config`: 系统配置文件的目录 +- `monitos`: 监控器,监控各个服务的状态 +- `sys_bus`: 会话的处理总线主要处理, 生产者和消费者模型, 目前支持异步模式 +- `queue:` 普通队列, 用于线程间通信 +- `event_message`: 异步的带有命名空间的高级消息队列 + +- `GuardContext`: 上下文容器, 统一管理所有的服务和配置, 还有监控等组件, 提供服务, 配置, 监控等获取的接口 +- `third_party`: 三方组件目录, 拥有我们提供和封装的一些组件以便客户敏捷开发和二次开发 + +### 设计原理 + +#### 服务设计原理 + +![image-20210825134134474](media\image-20210825134134474.png) + +1. 我们将写好的一些系统级别的提供了一些服务这些服务的发布者可能来自, 系统底层或者用户发布等 +2. 用户只需要订阅网络服务, 当网络信号不好或者, 断网服务会发起自动重连,并且通知所有订阅的者函数, 通知各种状态 +3. 例如日志服务等是需要用户自己承当发布者的作用的 +4. 发布者和订阅者是毫无关系的, 发布者无需关注订阅者, 只用把发布的数据给用户即可 +5. 发布者发布到服务是, 服务再到订阅者是异步的, 我们同时也提供了同步的配置和支持 +6. 服务的中间本质实现是一个, `带命名空间的高级的消息队列`+其他一些组件来组成的 + +优点: + +- 我们替客户实现好了一些系统级别的服务, 并支持后续迭代, 解决了客户客户还需要维护系统接别的代码问题, 只提供对外的API供客户调用 +- 降低了业务之间的耦合, 订阅者和发布者之间的解耦 +- 订阅者,只需要订阅服务, 或者使用服务, 既能使用我们维护并提供的功能 + +缺点: + +- 我们限定死了服务的类型, 客户无法的到定制, 比如我现在有个需求是, 想自己业务上有两个或者多个业务解耦, 客户无法实现自己的服务, 这些服务都是我们写好的, 解决方案`sys_bus` +- 首先我们是由一个高级消息队列组成, 所以有可能存在服务还在, 但是消息队列崩溃的现象, 所以我们在服务崩溃的时候给他拉起来, 解决方案`monitor` + + + +**示例:** + +订阅服务 + +![QPYcom_vOTKl9QLSz](./media/QPYcom_vOTKl9QLSz.png) + +#### sys_bus实现原理 + +![image-20210826140649441](./media/image-20210826140649441.png) + +上面服务是我们通过服务的形式来给用户体现的, 缺点中我们也明确了, 用户无法定制服务, 反之sys_bus即可实现用户定制服务的需求 + +- 异步的模式, 用户可以订阅和发布,还有解绑服务 +- 将发布和订阅分离, 模块化分离, 支持多个发布者, 和服务的区别是,这里发布者和订阅者都是用户去维护的 +- 用户只需要关注topic而不用关注sys_bus等本身和订阅者本身 +- 优点: + - 客户可以自己定制和发布相关的数据等 + - 我们帮客户维护了sys_bus的稳定性 +- 缺点: + - 过于灵活可能会导致, 用户的一些订阅代码需要用户自己去维护 + +示例: + +![QPYcom_NKUsHGzKV3](./media/QPYcom_NKUsHGzKV3.png) + +#### monitor设计原理 + +- 负责监控每个服务在每隔15秒给服务一个心跳, 如果, 服务, 收到这个心跳包, 会将这个发给的指定的接收人的, monitor接收到心跳包, 即认为, 服务运行正常 +- 可以设置, 当服务几次运行失败后执行什么样的行为, 比如说失败三次后执行, 重启设备或者 + +**示例** + +![QPYcom_T38gWTvOPr](./media/QPYcom_T38gWTvOPr.png) + +#### config设计原理 + +为了方便配置文件的读取和设置等, 特此讲配置文件路径统一到config下面设置按照下列规则的config.json文件 + +- app_config + - 用户层级的配置文件设置, 用户按照一定的文件夹格式, 我们将会自动读取里面的配置文件, 在组织进容器中, 以便用户进行获取, 相关接口参考, 请参考`API文档` +- system_config + - 系统级别的配置我们会按照系统级别的配置文件作为提供对外, 用于区分和读取, 因为后期我们有可能会提供相应的配置文件, 和相关服务 + +**示例:** + +![RtP8rx7WtN](./media/RtP8rx7WtN.png) + +- 我们可以看出上面app_config下面存在 + - lexin + - config.json + - abc + - config.json + - 我们可以看到读取的service_config下面 + - {'abc': {'a': 1}, 'lexin': {'a': 1}} + - abc和lexin就是我们的文件夹名字, 对应的value就是我们config.json中的内容 +- system_config也是通app_config的对应关系一致 +- 注意: 如若想读取必须按照此类调教key是文件夹名,value读取的是config.json中的内容书写 + +#### queue设计原理 + +普通队列用作消息通信, 创建队列后获取数据的时候会阻塞, 当有数据信号的时候将会被唤醒 + +![QPYcom_zcAf9dvHik](./media/QPYcom_zcAf9dvHik.png) + +### 三方组件和容器设计 + + + +#### GuardContext设计原理 + +上面说了那么多组件设计后, 我们说下, 我们说下容器设计 + +- 因为目前存在很多服务, 很多配置, 为了方便客户不用这导入一下那导入一下, 并且做统一化管理, 特此容器化了所有组件 + +- 用户只需要关注容器设计即 + +#### ThirdParty设计 + +请查看第三方组件API文档 + 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" new file mode 100644 index 0000000000000000000000000000000000000000..ae29e4972542e6de2702d2833d000ca44e9c373e Binary files /dev/null and "b/docs/Advanced_development/zh/HeliosService/Helio_Service\346\214\207\345\215\227(3)_\351\253\230\347\272\247.pdf" differ diff --git a/docs/Advanced_development/zh/HeliosService/media/QPYcom_30JfGTTZ1R.png b/docs/Advanced_development/zh/HeliosService/media/QPYcom_30JfGTTZ1R.png new file mode 100644 index 0000000000000000000000000000000000000000..0201bf3f11c828bf94e8e8c9686907570dce522f Binary files /dev/null and b/docs/Advanced_development/zh/HeliosService/media/QPYcom_30JfGTTZ1R.png differ diff --git a/docs/Advanced_development/zh/HeliosService/media/QPYcom_AZHnngQa4K.png b/docs/Advanced_development/zh/HeliosService/media/QPYcom_AZHnngQa4K.png new file mode 100644 index 0000000000000000000000000000000000000000..7f83788c68cc07523f01956d5670f3f5272735a3 Binary files /dev/null and b/docs/Advanced_development/zh/HeliosService/media/QPYcom_AZHnngQa4K.png differ diff --git a/docs/Advanced_development/zh/HeliosService/media/QPYcom_BlN4sYhUOK.png b/docs/Advanced_development/zh/HeliosService/media/QPYcom_BlN4sYhUOK.png new file mode 100644 index 0000000000000000000000000000000000000000..49ca253cd8992159399b5fd63dd4542ca851abd9 Binary files /dev/null and b/docs/Advanced_development/zh/HeliosService/media/QPYcom_BlN4sYhUOK.png differ diff --git a/docs/Advanced_development/zh/HeliosService/media/QPYcom_DJiXH0NYTb.png b/docs/Advanced_development/zh/HeliosService/media/QPYcom_DJiXH0NYTb.png new file mode 100644 index 0000000000000000000000000000000000000000..2e2fa6204968cbfbbb638456b02fdabaa2c80eab Binary files /dev/null and b/docs/Advanced_development/zh/HeliosService/media/QPYcom_DJiXH0NYTb.png differ diff --git a/docs/Advanced_development/zh/HeliosService/media/QPYcom_GniGshUtTV.png b/docs/Advanced_development/zh/HeliosService/media/QPYcom_GniGshUtTV.png new file mode 100644 index 0000000000000000000000000000000000000000..72f5918487e60ba72f259dd522f39e31dafe74fa Binary files /dev/null and b/docs/Advanced_development/zh/HeliosService/media/QPYcom_GniGshUtTV.png differ diff --git a/docs/Advanced_development/zh/HeliosService/media/QPYcom_NKUsHGzKV3.png b/docs/Advanced_development/zh/HeliosService/media/QPYcom_NKUsHGzKV3.png new file mode 100644 index 0000000000000000000000000000000000000000..e07bb5fed62ced247608f175dc180e5c1066d7a0 Binary files /dev/null and b/docs/Advanced_development/zh/HeliosService/media/QPYcom_NKUsHGzKV3.png differ diff --git a/docs/Advanced_development/zh/HeliosService/media/QPYcom_PAk2AjLkiN.png b/docs/Advanced_development/zh/HeliosService/media/QPYcom_PAk2AjLkiN.png new file mode 100644 index 0000000000000000000000000000000000000000..6cec4c7257f84029e5faf23b271b8f9bb5f4b7bd Binary files /dev/null and b/docs/Advanced_development/zh/HeliosService/media/QPYcom_PAk2AjLkiN.png differ diff --git a/docs/Advanced_development/zh/HeliosService/media/QPYcom_T38gWTvOPr.png b/docs/Advanced_development/zh/HeliosService/media/QPYcom_T38gWTvOPr.png new file mode 100644 index 0000000000000000000000000000000000000000..2d6d3b53817b093b29e2ba89d3c1d921e2869271 Binary files /dev/null and b/docs/Advanced_development/zh/HeliosService/media/QPYcom_T38gWTvOPr.png differ diff --git a/docs/Advanced_development/zh/HeliosService/media/QPYcom_gyUbNjpF97.png b/docs/Advanced_development/zh/HeliosService/media/QPYcom_gyUbNjpF97.png new file mode 100644 index 0000000000000000000000000000000000000000..e4def986f47636ad24e787ff37b1f0ebf851e4cc Binary files /dev/null and b/docs/Advanced_development/zh/HeliosService/media/QPYcom_gyUbNjpF97.png differ diff --git a/docs/Advanced_development/zh/HeliosService/media/QPYcom_jQgwCtwkWi.png b/docs/Advanced_development/zh/HeliosService/media/QPYcom_jQgwCtwkWi.png new file mode 100644 index 0000000000000000000000000000000000000000..43f9e6013af0749e289220b6f96f0049b17aee8b Binary files /dev/null and b/docs/Advanced_development/zh/HeliosService/media/QPYcom_jQgwCtwkWi.png differ diff --git a/docs/Advanced_development/zh/HeliosService/media/QPYcom_omadfZslxp.png b/docs/Advanced_development/zh/HeliosService/media/QPYcom_omadfZslxp.png new file mode 100644 index 0000000000000000000000000000000000000000..2049299ecd4e074887804f64f14ce9ac4c15606a Binary files /dev/null and b/docs/Advanced_development/zh/HeliosService/media/QPYcom_omadfZslxp.png differ diff --git a/docs/Advanced_development/zh/HeliosService/media/QPYcom_tPoPHz2rzP.png b/docs/Advanced_development/zh/HeliosService/media/QPYcom_tPoPHz2rzP.png new file mode 100644 index 0000000000000000000000000000000000000000..d02d4c9e88908ebd6059146e3dfae3f4983c6272 Binary files /dev/null and b/docs/Advanced_development/zh/HeliosService/media/QPYcom_tPoPHz2rzP.png differ diff --git a/docs/Advanced_development/zh/HeliosService/media/QPYcom_vOTKl9QLSz.png b/docs/Advanced_development/zh/HeliosService/media/QPYcom_vOTKl9QLSz.png new file mode 100644 index 0000000000000000000000000000000000000000..d1a8b421c6d42780f56b34d5f273cea7184b4d0d Binary files /dev/null and b/docs/Advanced_development/zh/HeliosService/media/QPYcom_vOTKl9QLSz.png differ diff --git a/docs/Advanced_development/zh/HeliosService/media/QPYcom_zcAf9dvHik.png b/docs/Advanced_development/zh/HeliosService/media/QPYcom_zcAf9dvHik.png new file mode 100644 index 0000000000000000000000000000000000000000..2d4de99a7e232875280d6e33b4fa1aa4120c55a6 Binary files /dev/null and b/docs/Advanced_development/zh/HeliosService/media/QPYcom_zcAf9dvHik.png differ diff --git a/docs/Advanced_development/zh/HeliosService/media/RtP8rx7WtN.png b/docs/Advanced_development/zh/HeliosService/media/RtP8rx7WtN.png new file mode 100644 index 0000000000000000000000000000000000000000..c906ab2c87506c6831b41736beed6e67a4ccdfb7 Binary files /dev/null and b/docs/Advanced_development/zh/HeliosService/media/RtP8rx7WtN.png differ diff --git a/docs/Advanced_development/zh/HeliosService/media/ShareX_0g8w1cWTaA.png b/docs/Advanced_development/zh/HeliosService/media/ShareX_0g8w1cWTaA.png new file mode 100644 index 0000000000000000000000000000000000000000..81dcefd712738b2be352037ccca71ae27a9a7ac3 Binary files /dev/null and b/docs/Advanced_development/zh/HeliosService/media/ShareX_0g8w1cWTaA.png differ diff --git a/docs/Advanced_development/zh/HeliosService/media/WmOUFWwtRo.png b/docs/Advanced_development/zh/HeliosService/media/WmOUFWwtRo.png new file mode 100644 index 0000000000000000000000000000000000000000..b060397273ab9e121ae7c21b54b3bfeb36ee5fa8 Binary files /dev/null and b/docs/Advanced_development/zh/HeliosService/media/WmOUFWwtRo.png differ diff --git a/docs/Advanced_development/zh/HeliosService/media/image-20210825131355877.png b/docs/Advanced_development/zh/HeliosService/media/image-20210825131355877.png new file mode 100644 index 0000000000000000000000000000000000000000..db3ed80a58c89976fe2dfcaf42b9b388f5c7b379 Binary files /dev/null and b/docs/Advanced_development/zh/HeliosService/media/image-20210825131355877.png differ diff --git a/docs/Advanced_development/zh/HeliosService/media/image-20210825131423890.png b/docs/Advanced_development/zh/HeliosService/media/image-20210825131423890.png new file mode 100644 index 0000000000000000000000000000000000000000..0ffd6d4a27a07b292c69ad77a6efc171ce880455 Binary files /dev/null and b/docs/Advanced_development/zh/HeliosService/media/image-20210825131423890.png differ diff --git a/docs/Advanced_development/zh/HeliosService/media/image-20210825134134474.png b/docs/Advanced_development/zh/HeliosService/media/image-20210825134134474.png new file mode 100644 index 0000000000000000000000000000000000000000..810be7f78bc431b301d86e1ec14d0af02b9712d1 Binary files /dev/null and b/docs/Advanced_development/zh/HeliosService/media/image-20210825134134474.png differ diff --git a/docs/Advanced_development/zh/HeliosService/media/image-20210826140649441.png b/docs/Advanced_development/zh/HeliosService/media/image-20210826140649441.png new file mode 100644 index 0000000000000000000000000000000000000000..3807aa73f7758f2e850070602269e2e798db5887 Binary files /dev/null and b/docs/Advanced_development/zh/HeliosService/media/image-20210826140649441.png differ diff --git a/docs/Advanced_development/zh/HeliosService/media/image-20210827093115294.png b/docs/Advanced_development/zh/HeliosService/media/image-20210827093115294.png new file mode 100644 index 0000000000000000000000000000000000000000..65a6f8d8363d1ea423cb82021c5925bc75be5d93 Binary files /dev/null and b/docs/Advanced_development/zh/HeliosService/media/image-20210827093115294.png differ diff --git a/docs/Advanced_development/zh/HeliosService/media/image-20210827094450921.png b/docs/Advanced_development/zh/HeliosService/media/image-20210827094450921.png new file mode 100644 index 0000000000000000000000000000000000000000..4d83911b0a85a46c3864295ba8a6075907819c2c Binary files /dev/null and b/docs/Advanced_development/zh/HeliosService/media/image-20210827094450921.png differ diff --git a/docs/Advanced_development/zh/HeliosService/media/image-20210827100748287.png b/docs/Advanced_development/zh/HeliosService/media/image-20210827100748287.png new file mode 100644 index 0000000000000000000000000000000000000000..af10bb6599fd53d2f61e4016b31b20746a2d0d31 Binary files /dev/null and b/docs/Advanced_development/zh/HeliosService/media/image-20210827100748287.png differ diff --git a/docs/Advanced_development/zh/HeliosService/media/image-20210827101129580.png b/docs/Advanced_development/zh/HeliosService/media/image-20210827101129580.png new file mode 100644 index 0000000000000000000000000000000000000000..3d39e2b99a9cd6d5bec6cbb408094bfa3da57e9c Binary files /dev/null and b/docs/Advanced_development/zh/HeliosService/media/image-20210827101129580.png differ diff --git a/docs/Advanced_development/zh/HeliosService/media/image-20210827103835637.png b/docs/Advanced_development/zh/HeliosService/media/image-20210827103835637.png new file mode 100644 index 0000000000000000000000000000000000000000..0f7d322c87283e6033ce47c34a00e850105eef17 Binary files /dev/null and b/docs/Advanced_development/zh/HeliosService/media/image-20210827103835637.png differ diff --git a/docs/Advanced_development/zh/HeliosService/media/image-20210827131630704.png b/docs/Advanced_development/zh/HeliosService/media/image-20210827131630704.png new file mode 100644 index 0000000000000000000000000000000000000000..5212a4bac8bb54a850259e3aa74924085f5fb5d6 Binary files /dev/null and b/docs/Advanced_development/zh/HeliosService/media/image-20210827131630704.png differ diff --git a/docs/Advanced_development/zh/HeliosService/media/image-20210827132834775.png b/docs/Advanced_development/zh/HeliosService/media/image-20210827132834775.png new file mode 100644 index 0000000000000000000000000000000000000000..4fbdf17e49fdd02a546c931a319b7afe39f300ce Binary files /dev/null and b/docs/Advanced_development/zh/HeliosService/media/image-20210827132834775.png differ diff --git a/docs/Advanced_development/zh/HeliosService/media/image-20210827132925708.png b/docs/Advanced_development/zh/HeliosService/media/image-20210827132925708.png new file mode 100644 index 0000000000000000000000000000000000000000..cc38502aba35454291f0b93cdf09d6309e7d0cb6 Binary files /dev/null and b/docs/Advanced_development/zh/HeliosService/media/image-20210827132925708.png differ diff --git a/docs/Advanced_development/zh/HeliosService/media/image-20210827134613132.png b/docs/Advanced_development/zh/HeliosService/media/image-20210827134613132.png new file mode 100644 index 0000000000000000000000000000000000000000..53ab8c0eff1948d947dc9015784069de95e865a6 Binary files /dev/null and b/docs/Advanced_development/zh/HeliosService/media/image-20210827134613132.png differ diff --git a/docs/Advanced_development/zh/HeliosService/media/image-20210827134636763.png b/docs/Advanced_development/zh/HeliosService/media/image-20210827134636763.png new file mode 100644 index 0000000000000000000000000000000000000000..e7690b0ea9cc3a44638d386868dced3e1620e2b2 Binary files /dev/null and b/docs/Advanced_development/zh/HeliosService/media/image-20210827134636763.png differ diff --git a/docs/Advanced_development/zh/HeliosService/media/image-20210827135011406.png b/docs/Advanced_development/zh/HeliosService/media/image-20210827135011406.png new file mode 100644 index 0000000000000000000000000000000000000000..a06d436155706a86ae17b644b6fb1a0539fe0dcc Binary files /dev/null and b/docs/Advanced_development/zh/HeliosService/media/image-20210827135011406.png differ diff --git a/docs/Advanced_development/zh/HeliosService/media/image-20210827141310248.png b/docs/Advanced_development/zh/HeliosService/media/image-20210827141310248.png new file mode 100644 index 0000000000000000000000000000000000000000..d51714cb5ddd4dbbaf94d94377264d16d6f7fb36 Binary files /dev/null and b/docs/Advanced_development/zh/HeliosService/media/image-20210827141310248.png differ diff --git a/docs/Advanced_development/zh/HeliosService/media/image-20210827141503388.png b/docs/Advanced_development/zh/HeliosService/media/image-20210827141503388.png new file mode 100644 index 0000000000000000000000000000000000000000..56350aa1fdb60f8a7e5984741dc3763374ae57ad Binary files /dev/null and b/docs/Advanced_development/zh/HeliosService/media/image-20210827141503388.png differ diff --git a/docs/Advanced_development/zh/HeliosService/media/image-20210827152347130.png b/docs/Advanced_development/zh/HeliosService/media/image-20210827152347130.png new file mode 100644 index 0000000000000000000000000000000000000000..2d58a18a032ccfb463444e0bf4da469b9362425e Binary files /dev/null and b/docs/Advanced_development/zh/HeliosService/media/image-20210827152347130.png differ diff --git a/docs/Advanced_development/zh/HeliosService/media/image-20210827175123097.png b/docs/Advanced_development/zh/HeliosService/media/image-20210827175123097.png new file mode 100644 index 0000000000000000000000000000000000000000..11e227ff9cc797d3dbe68d85a6181696e28e6491 Binary files /dev/null and b/docs/Advanced_development/zh/HeliosService/media/image-20210827175123097.png differ diff --git a/docs/Advanced_development/zh/HeliosService/media/image-20210827175241263.png b/docs/Advanced_development/zh/HeliosService/media/image-20210827175241263.png new file mode 100644 index 0000000000000000000000000000000000000000..870b2081cd748cd2f255869f391bd309b0e65d20 Binary files /dev/null and b/docs/Advanced_development/zh/HeliosService/media/image-20210827175241263.png differ diff --git a/docs/Advanced_development/zh/Mass_production/CodeEncryption.md b/docs/Advanced_development/zh/Mass_production/CodeEncryption.md new file mode 100644 index 0000000000000000000000000000000000000000..51bfd9ad433d7fd69bf105b7937c5362cf07f859 --- /dev/null +++ b/docs/Advanced_development/zh/Mass_production/CodeEncryption.md @@ -0,0 +1,72 @@ +## 文档历史 + +**修订记录** + +| **版本** | **日期** | **作者** | **变更表述** | +| -------- | ---------- | -------- | ------------ | +| 1.0 | 2021-04-07 | Chic | 初始版本 | +| 1.1 | 2021-07-08 | Chic | 增加交互保护 | +| 1.2 | 2021-09-06 | Chic | 更新图片 | + + + +## 加密方式介绍 + +在 python 中,可以将 py 文件编译为 pyc 文件。编译后的 pyc 文件是二进制格式,一是可以加快加载速度, 更重要的是可以保护原始代码。在 micropython 中同样提供了这个功能,只是它将 pyc 改名为 mpy,编译出的文件扩展名是.mpy。这一加密过程正是通过 mpy-cross 工具来完成。 + +**使用mpy-cross保护py文件** + +- py 文件 + + python 源代码文件后缀 。 + +- pyc 文件 + + pyc 是一种二进制文件,是由 py 文件经过编译后,编译后的pyc文件是二进制格式,一是可以加快加载速度,更重要的是可以保护原始代码。而且 pyc 是一种跨平台的字节码,是由 Python 虚拟机来执行。 + +- mpy 文件 + + Micropython 中提供了将.py 文件编译成.mpy 文件,和.pyc 文件一样是二进制文件。如:user.py加密后,就会变成user.mpy,我们可以直接用user.mpy代替原有的user.py文件,使用起来和原来一样。 + + + + +## 使用工具加密 + +- 登录官方网站“[资源下载](https://python.quectel.com/download)”,在一级分类“资源”,二级分类“工具”栏中找到【QPYcom 图形化工具】,具体位置如下图: + +![image-20210906170850437](media\image-20210906170850437.png) + +- 打开QPYcom工具后,在**“下载”**选项卡中有【加密】的选项,加密功能用于保护用户的应用代码,加密后使源代码.py编译成.mpy二进制代码; + +![image-20210906171528571](media\image-20210906171528571.png) + +​ 注意:工具的加密功能在合并产生固件时生效 + + + +## 单独文件加密 + +使用 mpy-cross-amd64.exe 工具,在工具同目录下编写 user.py 文件,如: + +![2103311410](media\2103311410.png) + +打开 windows 下 cmd 命令行,进入 mpy-cross-amd64.exe 工具所在目录,使用如下命令及参数生成 mpy 文件,如: + +`mpy-cross-amd64.exe -mno-unicode user.py` + +![2103311411](media\2103311411.png) + +user.py加密后,就会变成user.mpy,我们可以直接用user.mpy代替原有的user.py文件,使用起来和原来一样。 + + + +## 文件读保护 + +![image-20210708153532854](media\20210708153532854.png) + + + +## 更多mpy-cross资料 + + mpy-cross官方资料 diff --git a/docs/Advanced_development/zh/Mass_production/DataEncryption.md b/docs/Advanced_development/zh/Mass_production/DataEncryption.md new file mode 100644 index 0000000000000000000000000000000000000000..e9c66314dedc01669966e9684460642d46a1508f --- /dev/null +++ b/docs/Advanced_development/zh/Mass_production/DataEncryption.md @@ -0,0 +1,133 @@ +## 文档历史 + +**修订记录** + +| **版本** | **日期** | **作者** | **变更表述** | +| -------- | ---------- | -------- | ------------ | +| 1.0 | 2021-04-07 | Chic | 初始版本 | +| 1.1 | 2021-09-06 | Chic | 初始版本 | + + + +## 加密方式介绍 + +MD5、SHA1和SHA256是非常常用的两种单向散列函数,现在比较常用的是SHA256算法。 + +三大特性: +1. 将任意长度的数据转换成固定长度的数据 +(无论输入的是一个比特还是一亿个比特,输出的结果长度固定,具体长度根据不同算法决定,比如MD5输出的长度就是128位) +2. 很强的抗碰撞性 +(输出的结果唯一,也就是很难找到H(x1)=H(x2)) +3. 不可逆 +(目前没有任何方法可以通过散列值找到对应的输入值,也就是不能通过H(X)的值找到对应的X) + +QuecPython模组支持的功能: 实现二进制数据散列算法,目前支持MD5 , SHA1, SHA256; + +以一个60M的文件为测试样本,经过1000次的测试平均值,三种算法的表现为: + +- MD5 算法运行1000次的平均时间为:226ms + +- SHA1 算法运行1000次的平均时间为:308ms + +- SHA256 算法运行1000次的平均时间为:473ms + + 安全性方面,SHA256(又称SHA2)的安全性最高,建议使用SHA256。 + + + +## 常见应用场景: + +1、数据库中保存用户密码 +比如前段时间频频爆出一些公司的数据库被爆,用户的账户密码以明文存在,大量资料流出这样的做法是极其不负责和危险的。 +最好的方法就是将用户的密码通过单向散列函数输出到数据库,每次登录时对比散列值即可。由于单向散列函数的不可逆性,就算数据库被盗取,也没有办法得到用户的信息。 +(某些自称破解单向散列函数的网站使用的方法其实是低级的穷举法,保存大量常用明文的散列值,这样做是很愚蠢的。有很多方法可以应对,比如一种叫做“加盐”的常用方法,将用户的信息后面统一加上诸如$%*^&这样的字符,然后计算散列值存入数据库中,或者可以计算散列值的散列值,这样可以保证绝对的安全性。) + +2、防止文件篡改 +目前大部分提供下载服务的网站都有提供文件的SHA256值,这是因为单向散列函数具备防篡改的效果,若是下载的文件的SHA256和网站提供的值不符,则可能此文件已经遭到了修改,可能含有病毒或者是盗版等等。。。接下来的代码中我们也会来实现计算文件的SHA256值。 + +3、 数字签名(阿里云、腾讯云等) +在进行数字签名时也会使用单向散列函数。 +数字签名是现实社会中的签名和盖章这样行为在数字世界中的实现。数字签名的处理过程非常耗时,因此一般不会对整个消息内容直接使用数字签名,而是先通过单向散列函数计算出消息的散列值,然后再对这个散列值使用私钥加密,得到的就是数字签名。 + +4、伪随机数生成器 +使用单向散列函数可以构造伪随机数生成器。 +密码技术中所使用的随机数需要具备“事实上不可能根据过去的随机数列预测未来的随机数列”这样的性质。为了保证不可预测性,可以利用单向散列函数的单向性。 + +5、秒传 +很多诸如某云盘,某网盘这样的公司利用单向散列函数的特性实现秒传的效果。 +单向散列函数就像文件的指纹一样,当用户上传文件时,首先计算一下此文件的单向散列值,将此值在数据库中进行查找,若存在相同值,证明此用户上传的文件已经存在相同的,所以无需上传,共享即可。如此可大幅降低服务器负载,大幅缩减存储空间,实现去重的效果。 + + + +## 二进制数据加密 + +示例代码: + +```python +import uhashlib +import ubinascii +# 目前支持 md5,sha1, sha256 + +data = b"QuecPython" # 待加密数据 +data2 = b"QuecPython" # 待加密数据 + +hash_obj = uhashlib.md5() +hash_obj.update(data) +# hash_obj.update(data2) +res = hash_obj.digest() +hex_msg = ubinascii.hexlify(res) +print("md5加密后的数据:", hex_msg) +# b'37b8419ee7cdb3c64d7e66019216117c' + +hash_obj = uhashlib.sha1() +hash_obj.update(data) +# hash_obj.update(data2) +res = hash_obj.digest() +hex_msg = ubinascii.hexlify(res) +print("sha1加密后的数据:", hex_msg) +# b'614a4247ef68e9f9793e11353cc86acb932badab' + +hash_obj = uhashlib.sha256() +hash_obj.update(data) +# hash_obj.update(data2) +res = hash_obj.digest() +hex_msg = ubinascii.hexlify(res) +print("sha256加密后的数据:", hex_msg) +# b'1ec66771b3a9ac3ea4c44f009e545797d42e9e7d426fff8275895468fe27c6cd' + +res = b'\x11\x22\x33123' +print("原始数据:", res) +res = ubinascii.b2a_base64(res) +print("编码base64数据:", res) +res = ubinascii.a2b_base64(res) +print("还原base64数据:", res) + +``` + +执行结果如下图: + +![image-20210906190809839](media\image-20210906190809839.png) + + + +## 更多内容 + +想要了解其他功能吗?请浏览官方网站: + +https://python.quectel.com/wiki/#/zh-cn/api/?id=pin + +官方网站: + +https://python.quectel.com/ + +相关工具、例程、驱动、文档下载: + +https://python.quectel.com/download + + + +了解更多,请关注QuecPython公众号 + + + + \ No newline at end of file diff --git a/docs/Advanced_development/zh/Mass_production/QuecPythonBack.md b/docs/Advanced_development/zh/Mass_production/QuecPythonBack.md new file mode 100644 index 0000000000000000000000000000000000000000..dcf558efcb6344581630478663ae094560451d64 --- /dev/null +++ b/docs/Advanced_development/zh/Mass_production/QuecPythonBack.md @@ -0,0 +1,122 @@ +## 文档历史 + +**修订记录** + +| **版本** | **日期** | **作者** | **变更表述** | +| -------- | ---------- | -------- | ------------ | +| 1.0 | 2021-04-07 | Chic | 初始版本 | +| 1.1 | 2021-09-06 | Chic | 初始版本 | + + + +## 概述 + +QuecPython具备文件备份还原功能,当用户的代码误删除或意外被修改,可以从备份区还原丢失或错误的文件。 + +先了解QuecPython的文件系统,为了保障产品在市场上稳定运作,我们推出双文件系统备份机制,分别称为“**用户文件系统**”和“**备份文件系统**”。 + +![210331_2023_1](media\210331_2023_1.png) + +备份还原功能指的是“**用户文件系统分区**”需要备份的文件(包括脚本文件及其它任何格式的文件),在开机阶段检测到被损坏时,从“**备份文件系统分区**”将出厂烧录的文件还原至“**用户文件系统分区**"的功能。 + + + +## 为何需要备份还原功能 + +当应用或系统的关键参数或脚本不允许丢失或出现异常时,往往需要备份和还原功能。 + + + +## 哪些文件需要备份还原 + +系统级可能需要备份的文件包括apn_cfg.json(拨号配置文件)、system_config.json(系统配置文件)。 +用户级可能需要备份还原的文件依据应用场景而定。 + +例如:要备份音量值、原始密码、服务器IP地址、阿里云、腾讯云产品及设备信息等。 + + + +## 备份还原实现机制 + +开始之前,先了解下备份还原功能的基本原理,以帮助理解下文。 + +1. 用户通过使用QPYcom工具合并生产固件时,勾选【备份】,文件将自动导入“**备份文件系统分区**”,会在“**备份文件系统分区**”生成两个名称分别为checksum.json和backup_restore.json的文件。checksum.json记录了备份区文件的hash表。backup_restore.json表明是否开启备份还原功能。 +2. checksum.json:开机过程检测到开启了备份还原功能,系统会检测“**用户文件系统分区**”是否存在checksum.json。若不存在,则将”**备份文件系统分区**“的checksum.json拷贝到“**用户文件系统分区**”。 +3. 开机检测"**用户文件系统分区**"的checksum.json中的hash值,校验“**用户文件系统分区**”的用户文件。如果文件不存在或者校验不通过,则将“**备份文件系统分区**”对应的文件拷贝到“**用户文件系统分区**”相应的位置,并重新计算hash值,更新在“**用户文件系统分区**”的checksum.json中。 +4. 当参与备份还原的用户文件需要FOTA升级时,在升级过程的最后一步,会将更新后的用户文件的hash值写入“**用户文件系统分区**”的checksum.json。 + +**注意:** +1.本文所指的备份功能,是备份出厂烧录的文件;同样,还原也是出厂烧录的文件。 +2.备份文件系统分区为只读属性,用户不可配置其读写属性。 + + + +## 触发条件 + +了解到QuecPython的备份还原的原理以后,可以知道,触发备份还原功能有以下几种可能: + +1. 用户文件系统分区的checksum.json文件被用户意外删除。 +2. 当设备短路断电等导致文件系统发生意外错误,致使被标记为备份的用户文件系统分区中文件的数据发生变化,或者文件丢失。 +3. 用户在应用过程中,手动改写了标记为备份的用户文件系统分区的文件数据,却没有更新checksum.json。 + + + +## 防止误触发 + +为了稳定运行,我们可以有针对性的防止备份还原的误触发: + +1. 用户应用程序上做好把关,避免误删除用户文件系统分区的checksum.json文件。 + +2. 在访问文件系统时尽量避免暴力开关机,或者必要时,在硬件设计上增加掉电检测和后备电源功能,给文件系统足够的时间更新物理数据。 + +3. 手动改写了标记为备份的用户文件系统分区的文件数据后,通过以下代码段来更新用户文件系统分区的checksum.sjon文件。更新成功后,会返回当前文件的hash值。 + +```python +import file_crc32 + +file_crc32.calc('/usr/1.txt') +``` + +执行输出结果如图1所示: + +![210331_2023_2](media\210331_2023_2.jpg) + +更新到参与备份文件的hash值。 + + + +## 开启备份还原功能 + +开启QuecPython的备份还原功能,在QPYcom工具上操作即可。 + +- 登录官方网站“[资源下载](https://python.quectel.com/download)”,在一级分类“资源”,二级分类“工具”栏中找到【QPYcom 图形化工具】,具体位置如下图: + +![image-20210906170850437](media\image-20210906170850437.png) + +- 打开QPYcom工具后,在**“下载”**选项卡勾选【备份】,合并即可生成带备份的生产固件。 + +![image-20210906171528571](media\image-20210906171528571.png) + + + +## 更多内容 + +想要了解其他功能吗?请浏览官方网站: + +https://python.quectel.com/wiki/#/zh-cn/api/?id=pin + +官方网站: + +https://python.quectel.com/ + +相关工具、例程、驱动、文档下载: + +https://python.quectel.com/download + + + +了解更多,请关注QuecPython公众号 + + + + \ No newline at end of file diff --git a/docs/Advanced_development/zh/Mass_production/README.md b/docs/Advanced_development/zh/Mass_production/README.md new file mode 100644 index 0000000000000000000000000000000000000000..76c67164d5838d40d0ae20aca5d2f34e3fe45af5 --- /dev/null +++ b/docs/Advanced_development/zh/Mass_production/README.md @@ -0,0 +1,137 @@ +## 文档历史 + +**修订记录** + +| **版本** | **日期** | **作者** | **变更表述** | +| -------- | ---------- | -------- | ------------ | +| 1.0 | 2021-04-07 | Chic | 初始版本 | +| 1.1 | 2021-09-06 | Chic | 更新部分图片 | + + + +## 代码保护 + +- 登录官方网站“[资源下载](https://python.quectel.com/download)”,在一级分类“资源”,二级分类“工具”栏中找到【QPYcom 图形化工具】,具体位置如下图: + +![image-20210906170850437](media\image-20210906170850437.png) + +- 打开QPYcom工具后,在**“下载”**选项卡中有【加密】【备份】的选项。 +- 加密功能用于保护用户的APP代码,加密后使源代码被掩盖; +- 备份功能用于投入市场后,若usr区备份文件意外丢失、篡改等,自动从bak区恢复。 + +![image-20210906171528571](media\image-20210906171528571.png) + + + +## 使用QPYcom生成量产固件包 + +合并源码后,只需烧录一次固件即可完成生产,在合并时已经将usr区的文件嵌入到固件中,因此烧录合并后的固件已经包含usr区的文件。 + +### 合并条件 + +- 合并的*.py*文件中必须包含*main.py*代码。 + +- *main.py*代码中必须包含以下两行语句: + + ​ PROJECT_NAME = 'QUEC_TEST' # 必须要有这行代码才能合并 + + ​ PROJECT_VERSION = '1.0.0' # 必须要有这行代码才能合并 + +**注意:** + +在合并的所有*.py*文件中,*main.py*作为程序入口文件,工具自动不对其加密,故写代码时,从*main.py*调用其他文件的接口更加安全。 + +### 示例工程 + +*main.py*文件: + +```python +from usr import user_file # 用户的.py文件放在usr路径下,要用 from usr 导入APP +import utime + +PROJECT_NAME = 'QUEC_TEST' # 必须要有这行代码才能合并 +PROJECT_VERSION = '1.0.0' # 必须要有这行代码才能合并 + +if __name__ == "__main__": # 标准写法,从main.py开始执行 + while True: + user_file.Qprint() + user_file.Qlistdir() + utime.sleep_ms(300) + +``` + +*user_file.py*文件: + +```python +import uos + +def Qprint(): + print('Hello World !') + +def Qlistdir(): + print(uos.listdir('/usr')) + +``` + +将以上*main.py* 和*user_file.py*两个文件添加到usr区中。固件建议使用官网发布的最新版本:[资源下载专区](https://python.quectel.com/download) 中找到于模组型号对应的固件 。 + +合并后的固件存放在用户指定的路径下,如《QUEC_TEST_1.0.0.zip》固件包,固件包名由*mian.py*中的变量**PROJECT_NAME**、**PROJECT_VERSION**组合而成。 + +![image-20210906173316872](media\image-20210906173316872.png) + +仅需几秒钟,即可完成合并: + +![image-20210906173923292](media\image-20210906173923292.png) + +合并完成后的文件名是由*mian.py*中的变量**PROJECT_NAME**、**PROJECT_VERSION**组合而成 + +![image-20210906173416123](media\image-20210906173416123.png) + +烧录合并后的固件,开机自动运行*main.py*: + +![image-20210906174329859](media\image-20210906174329859.png) + +## 量产工具 + +- 登录官方网站“[资源下载](https://python.quectel.com/download)”,在一级分类“资源”,二级分类“工具”栏中找到【QMulti_DL 批量下载工具】,具体位置如下图: + +![image-20210906174758192](media\image-20210906174758192.png) + +- 打开软件后,在**“Load FW Files”**中选择上面合并后的固件,点击**“Auto ALL”**后,即自动检测8个通道直至烧录完毕: + + ​ 首先,夹具通过USB先接入电脑; + + ​ 其次,在电脑打开QMulti_DL批量下载工具,并选择要烧录的固件,随后软件会自动检测烧录。 + +![image-202109061rtyurewry4](media\image-202109061rtyurewry4.png) + + + +**提醒:** + +只要夹具中的任意一个通信有模块接通电源,就会自动烧录。 + +烧录失败,意外终止时,只需要模块重新上电即可继续烧录。 + +## 下载配套代码 + + 下载配套代码模板 + + 下载差分包生成教程和工具 + + + +## 附录A参考文档及术语缩写 + +表1:参考文档 + +| **序号** | **文档名称** | **备注** | 文档位置 | +| -------- | ---------------------------------- | --------------------- | ----------------------- | +| [1] | Quectel QuecPython_QPYcom_用户指导 | QPYcom工具使用说明 | QPYcom工具压缩包自带 | +| [2] | Quectel_QMulti_DL_用户指导 | QMulti_DL工具使用说明 | QMulti_DL工具压缩包自带 | + +表2:术语缩写 + +| **术语** | **英文全称** | **中文全称** | +| -------- | -------------------- | ------------ | +| USB | Universal Serial Bus | 通用串行总线 | diff --git a/docs/Advanced_development/zh/Mass_production/code/DataEncryption.py b/docs/Advanced_development/zh/Mass_production/code/DataEncryption.py new file mode 100644 index 0000000000000000000000000000000000000000..edc9dde5c15d9db5d1f3b9e4d1a15d39ddbea1b2 --- /dev/null +++ b/docs/Advanced_development/zh/Mass_production/code/DataEncryption.py @@ -0,0 +1,33 @@ +import uhashlib +import ubinascii +# 目前支持 md5,sha1, sha256 + +data = b"QuecPython" # 待加密数据 + +hash_obj = uhashlib.md5() +hash_obj.update(data) +res = hash_obj.digest() +hex_msg = ubinascii.hexlify(res) +print("md5加密后的数据:", hex_msg) +# b'37b8419ee7cdb3c64d7e66019216117c' + +hash_obj = uhashlib.sha1() +hash_obj.update(data) +res = hash_obj.digest() +hex_msg = ubinascii.hexlify(res) +print("sha1加密后的数据:", hex_msg) +# b'614a4247ef68e9f9793e11353cc86acb932badab' + +hash_obj = uhashlib.sha256() +hash_obj.update(data) +res = hash_obj.digest() +hex_msg = ubinascii.hexlify(res) +print("sha256加密后的数据:", hex_msg) +# b'1ec66771b3a9ac3ea4c44f009e545797d42e9e7d426fff8275895468fe27c6cd' + + +# print("原始数据:", b'\x11\x22\x33123') +# res = ubinascii.b2a_base64('\x11\x22\x33123') +# print("编码base64数据:", res) +# res = ubinascii.a2b_base64(res) +# print("还原base64数据:", res) diff --git a/docs/Mass_production/zh/code/fota.zip b/docs/Advanced_development/zh/Mass_production/code/fota.zip old mode 100755 new mode 100644 similarity index 100% rename from docs/Mass_production/zh/code/fota.zip rename to docs/Advanced_development/zh/Mass_production/code/fota.zip diff --git a/docs/Mass_production/zh/code/main.zip b/docs/Advanced_development/zh/Mass_production/code/main.zip old mode 100755 new mode 100644 similarity index 100% rename from docs/Mass_production/zh/code/main.zip rename to docs/Advanced_development/zh/Mass_production/code/main.zip diff --git a/docs/Advanced_development/zh/Mass_production/config.json b/docs/Advanced_development/zh/Mass_production/config.json new file mode 100644 index 0000000000000000000000000000000000000000..b7762ace301692d4eef8bac9a2032f9923d6c26d --- /dev/null +++ b/docs/Advanced_development/zh/Mass_production/config.json @@ -0,0 +1,24 @@ +{ + "import": "config_zh", + "navbar": { + "items": [ + { + "id": "language", + "label": "Language: ", + "position": "right", + "items": [ + { + "id": "zh", + "url": "/doc/Mass_production/zh/", + "label": "中文" + }, + { + "id": "en", + "url": "/doc/Mass_production/en/", + "label": "English" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/docs/Mass_production/zh/media/1.png b/docs/Advanced_development/zh/Mass_production/media/1.png old mode 100755 new mode 100644 similarity index 100% rename from docs/Mass_production/zh/media/1.png rename to docs/Advanced_development/zh/Mass_production/media/1.png diff --git a/docs/Mass_production/zh/media/2.png b/docs/Advanced_development/zh/Mass_production/media/2.png old mode 100755 new mode 100644 similarity index 100% rename from docs/Mass_production/zh/media/2.png rename to docs/Advanced_development/zh/Mass_production/media/2.png diff --git a/docs/Advanced_development/zh/Mass_production/media/20210708153532854.png b/docs/Advanced_development/zh/Mass_production/media/20210708153532854.png new file mode 100644 index 0000000000000000000000000000000000000000..40af642b60bbd3acb8514c91183a10926e7b2be7 Binary files /dev/null and b/docs/Advanced_development/zh/Mass_production/media/20210708153532854.png differ diff --git a/docs/Advanced_development/zh/Mass_production/media/2103311410.png b/docs/Advanced_development/zh/Mass_production/media/2103311410.png new file mode 100644 index 0000000000000000000000000000000000000000..7a32c28469a540dafb0e2dc1f5b8b6c617b50f0f Binary files /dev/null and b/docs/Advanced_development/zh/Mass_production/media/2103311410.png differ diff --git a/docs/Advanced_development/zh/Mass_production/media/2103311411.png b/docs/Advanced_development/zh/Mass_production/media/2103311411.png new file mode 100644 index 0000000000000000000000000000000000000000..65fe61a0eaa846c829f6e9f32a289f98ba0a3dff Binary files /dev/null and b/docs/Advanced_development/zh/Mass_production/media/2103311411.png differ diff --git a/docs/Advanced_development/zh/Mass_production/media/210331_2023_1.png b/docs/Advanced_development/zh/Mass_production/media/210331_2023_1.png new file mode 100644 index 0000000000000000000000000000000000000000..5901f8199bb435725a170d8af82b4aedfbe4fb29 Binary files /dev/null and b/docs/Advanced_development/zh/Mass_production/media/210331_2023_1.png differ diff --git a/docs/Advanced_development/zh/Mass_production/media/210331_2023_2.jpg b/docs/Advanced_development/zh/Mass_production/media/210331_2023_2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ebf7bfe5ec6e469c8c823cace07dafa9899e6982 Binary files /dev/null and b/docs/Advanced_development/zh/Mass_production/media/210331_2023_2.jpg differ diff --git a/docs/Advanced_development/zh/Mass_production/media/210331_2023_3.png b/docs/Advanced_development/zh/Mass_production/media/210331_2023_3.png new file mode 100644 index 0000000000000000000000000000000000000000..6d128f226266dc57115f754d5138cc8431fc81fd Binary files /dev/null and b/docs/Advanced_development/zh/Mass_production/media/210331_2023_3.png differ diff --git a/docs/Mass_production/zh/media/mp3.png b/docs/Advanced_development/zh/Mass_production/media/210331_2023_4.png old mode 100755 new mode 100644 similarity index 100% rename from docs/Mass_production/zh/media/mp3.png rename to docs/Advanced_development/zh/Mass_production/media/210331_2023_4.png diff --git a/docs/Mass_production/zh/media/3.png b/docs/Advanced_development/zh/Mass_production/media/3.png old mode 100755 new mode 100644 similarity index 100% rename from docs/Mass_production/zh/media/3.png rename to docs/Advanced_development/zh/Mass_production/media/3.png diff --git a/docs/Mass_production/zh/media/4.png b/docs/Advanced_development/zh/Mass_production/media/4.png old mode 100755 new mode 100644 similarity index 100% rename from docs/Mass_production/zh/media/4.png rename to docs/Advanced_development/zh/Mass_production/media/4.png diff --git a/docs/Mass_production/zh/media/5.png b/docs/Advanced_development/zh/Mass_production/media/5.png old mode 100755 new mode 100644 similarity index 100% rename from docs/Mass_production/zh/media/5.png rename to docs/Advanced_development/zh/Mass_production/media/5.png diff --git a/docs/Mass_production/zh/media/6.png b/docs/Advanced_development/zh/Mass_production/media/6.png old mode 100755 new mode 100644 similarity index 100% rename from docs/Mass_production/zh/media/6.png rename to docs/Advanced_development/zh/Mass_production/media/6.png diff --git a/docs/Mass_production/zh/media/7.png b/docs/Advanced_development/zh/Mass_production/media/7.png old mode 100755 new mode 100644 similarity index 100% rename from docs/Mass_production/zh/media/7.png rename to docs/Advanced_development/zh/Mass_production/media/7.png diff --git a/docs/Mass_production/zh/media/8.png b/docs/Advanced_development/zh/Mass_production/media/8.png old mode 100755 new mode 100644 similarity index 100% rename from docs/Mass_production/zh/media/8.png rename to docs/Advanced_development/zh/Mass_production/media/8.png diff --git a/docs/Mass_production/zh/media/9.png b/docs/Advanced_development/zh/Mass_production/media/9.png old mode 100755 new mode 100644 similarity index 100% rename from docs/Mass_production/zh/media/9.png rename to docs/Advanced_development/zh/Mass_production/media/9.png diff --git a/docs/Advanced_development/zh/Mass_production/media/DataEncryption_210406_01.png b/docs/Advanced_development/zh/Mass_production/media/DataEncryption_210406_01.png new file mode 100644 index 0000000000000000000000000000000000000000..7b48e23d2fc8242a874d7bc06f412d229da750e8 Binary files /dev/null and b/docs/Advanced_development/zh/Mass_production/media/DataEncryption_210406_01.png differ diff --git a/docs/Advanced_development/zh/Mass_production/media/Qp_Mass_production_QMulti_location.png b/docs/Advanced_development/zh/Mass_production/media/Qp_Mass_production_QMulti_location.png new file mode 100644 index 0000000000000000000000000000000000000000..e7c1be48564fcda5fc3f2e765623bc6a5743fb6d Binary files /dev/null and b/docs/Advanced_development/zh/Mass_production/media/Qp_Mass_production_QMulti_location.png differ diff --git a/docs/Advanced_development/zh/Mass_production/media/Qp_Mass_production_QPYcom_location.png b/docs/Advanced_development/zh/Mass_production/media/Qp_Mass_production_QPYcom_location.png new file mode 100644 index 0000000000000000000000000000000000000000..6d128f226266dc57115f754d5138cc8431fc81fd Binary files /dev/null and b/docs/Advanced_development/zh/Mass_production/media/Qp_Mass_production_QPYcom_location.png differ diff --git a/docs/Advanced_development/zh/Mass_production/media/Qp_Mass_production_backup.png b/docs/Advanced_development/zh/Mass_production/media/Qp_Mass_production_backup.png new file mode 100644 index 0000000000000000000000000000000000000000..1dcb83243a448425f1abd36672aed7826ea1a57c Binary files /dev/null and b/docs/Advanced_development/zh/Mass_production/media/Qp_Mass_production_backup.png differ diff --git a/docs/Advanced_development/zh/Mass_production/media/image-20210906170850437.png b/docs/Advanced_development/zh/Mass_production/media/image-20210906170850437.png new file mode 100644 index 0000000000000000000000000000000000000000..0c87f5d2cc2fdf259d0a3ebf87101a4d26e85815 Binary files /dev/null and b/docs/Advanced_development/zh/Mass_production/media/image-20210906170850437.png differ diff --git a/docs/Advanced_development/zh/Mass_production/media/image-20210906171528571.png b/docs/Advanced_development/zh/Mass_production/media/image-20210906171528571.png new file mode 100644 index 0000000000000000000000000000000000000000..79c6cb5d8b21127b0b09edad423bfb69c173ad60 Binary files /dev/null and b/docs/Advanced_development/zh/Mass_production/media/image-20210906171528571.png differ diff --git a/docs/Advanced_development/zh/Mass_production/media/image-20210906173316872.png b/docs/Advanced_development/zh/Mass_production/media/image-20210906173316872.png new file mode 100644 index 0000000000000000000000000000000000000000..c3a2e8615f2b2d46d9f5bc796f11bd2f8ca9ed3a Binary files /dev/null and b/docs/Advanced_development/zh/Mass_production/media/image-20210906173316872.png differ diff --git a/docs/Mass_production/zh/media/mp5A.png b/docs/Advanced_development/zh/Mass_production/media/image-20210906173416123.png old mode 100755 new mode 100644 similarity index 100% rename from docs/Mass_production/zh/media/mp5A.png rename to docs/Advanced_development/zh/Mass_production/media/image-20210906173416123.png diff --git a/docs/Advanced_development/zh/Mass_production/media/image-20210906173923292.png b/docs/Advanced_development/zh/Mass_production/media/image-20210906173923292.png new file mode 100644 index 0000000000000000000000000000000000000000..0c063fbd2526734c14bb2200fa62f56a351bc586 Binary files /dev/null and b/docs/Advanced_development/zh/Mass_production/media/image-20210906173923292.png differ diff --git a/docs/Advanced_development/zh/Mass_production/media/image-20210906174329859.png b/docs/Advanced_development/zh/Mass_production/media/image-20210906174329859.png new file mode 100644 index 0000000000000000000000000000000000000000..44df4e45d94bbc8a518852772cb6e12d6fd67c25 Binary files /dev/null and b/docs/Advanced_development/zh/Mass_production/media/image-20210906174329859.png differ diff --git a/docs/Advanced_development/zh/Mass_production/media/image-20210906174758192.png b/docs/Advanced_development/zh/Mass_production/media/image-20210906174758192.png new file mode 100644 index 0000000000000000000000000000000000000000..fb3cca3a4e2c4d6dc6f85af52d87b91b8ebd676c Binary files /dev/null and b/docs/Advanced_development/zh/Mass_production/media/image-20210906174758192.png differ diff --git a/docs/Advanced_development/zh/Mass_production/media/image-20210906190809839.png b/docs/Advanced_development/zh/Mass_production/media/image-20210906190809839.png new file mode 100644 index 0000000000000000000000000000000000000000..5bad7ff90a85bf0d252c2fb58d9bd2764e361598 Binary files /dev/null and b/docs/Advanced_development/zh/Mass_production/media/image-20210906190809839.png differ diff --git a/docs/Mass_production/zh/media/mp7.png b/docs/Advanced_development/zh/Mass_production/media/image-202109061rtyurewry4.png old mode 100755 new mode 100644 similarity index 100% rename from docs/Mass_production/zh/media/mp7.png rename to docs/Advanced_development/zh/Mass_production/media/image-202109061rtyurewry4.png diff --git a/docs/Mass_production/zh/media/mp05.png b/docs/Advanced_development/zh/Mass_production/media/mp05.png old mode 100755 new mode 100644 similarity index 100% rename from docs/Mass_production/zh/media/mp05.png rename to docs/Advanced_development/zh/Mass_production/media/mp05.png diff --git a/docs/Mass_production/zh/media/mp1.png b/docs/Advanced_development/zh/Mass_production/media/mp1.png old mode 100755 new mode 100644 similarity index 100% rename from docs/Mass_production/zh/media/mp1.png rename to docs/Advanced_development/zh/Mass_production/media/mp1.png diff --git a/docs/Mass_production/zh/media/mp2.png b/docs/Advanced_development/zh/Mass_production/media/mp2.png old mode 100755 new mode 100644 similarity index 100% rename from docs/Mass_production/zh/media/mp2.png rename to docs/Advanced_development/zh/Mass_production/media/mp2.png diff --git a/docs/Mass_production/zh/media/mp4.png b/docs/Advanced_development/zh/Mass_production/media/mp4.png old mode 100755 new mode 100644 similarity index 100% rename from docs/Mass_production/zh/media/mp4.png rename to docs/Advanced_development/zh/Mass_production/media/mp4.png diff --git a/docs/Mass_production/zh/media/mp5.png b/docs/Advanced_development/zh/Mass_production/media/mp5.png old mode 100755 new mode 100644 similarity index 100% rename from docs/Mass_production/zh/media/mp5.png rename to docs/Advanced_development/zh/Mass_production/media/mp5.png diff --git a/docs/Advanced_development/zh/Mass_production/media/mp5A.png b/docs/Advanced_development/zh/Mass_production/media/mp5A.png new file mode 100644 index 0000000000000000000000000000000000000000..1bbd53aa32076a0d2234e28f63aadec539f73699 Binary files /dev/null and b/docs/Advanced_development/zh/Mass_production/media/mp5A.png differ diff --git a/docs/Mass_production/zh/media/mp6.png b/docs/Advanced_development/zh/Mass_production/media/mp6.png old mode 100755 new mode 100644 similarity index 100% rename from docs/Mass_production/zh/media/mp6.png rename to docs/Advanced_development/zh/Mass_production/media/mp6.png diff --git a/docs/Advanced_development/zh/Mass_production/media/mp7.png b/docs/Advanced_development/zh/Mass_production/media/mp7.png new file mode 100644 index 0000000000000000000000000000000000000000..c72becdc48e948cf5853038555355ec5ee08daec Binary files /dev/null and b/docs/Advanced_development/zh/Mass_production/media/mp7.png differ diff --git a/docs/Advanced_development/zh/Mass_production/sidebar.yaml b/docs/Advanced_development/zh/Mass_production/sidebar.yaml new file mode 100644 index 0000000000000000000000000000000000000000..1731dbfc355aa0d01dc2037af9826556fe071c14 --- /dev/null +++ b/docs/Advanced_development/zh/Mass_production/sidebar.yaml @@ -0,0 +1,10 @@ +# 产品量产 +items: + - label: 量产工具 + file: README.md + - label: 代码加密保护 + file: CodeEncryption.md + - label: 数据加密保护 + file: DataEncryption.md + - label: 备份还原机制 + file: QuecPythonBack.md \ No newline at end of file diff --git a/docs/Advanced_development/zh/QuecPythonAdvance/wifi.md b/docs/Advanced_development/zh/QuecPythonAdvance/wifi.md new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/docs/Advanced_development/zh/QuecPythonBus/ExtInt.md b/docs/Advanced_development/zh/QuecPythonBus/ExtInt.md new file mode 100644 index 0000000000000000000000000000000000000000..8212f411d32600013ac5fbdc48a1e56c33d2395b --- /dev/null +++ b/docs/Advanced_development/zh/QuecPythonBus/ExtInt.md @@ -0,0 +1,58 @@ +# 外部中断实验 + +## 修订历史 + +| 版本 | 日期 | 作者 | 变更表述 | +| ---- | ---------- | ------- | -------- | +| 1.0 | 2021-09-22 | Grey.Tu | 初版 | + +文档主要介绍如何实现 ExtInt 检测外部中断,从硬件设计和软件设计两方面讲解,通过阅读本文,您将学会 ExtInt 外部中断功能使用。 + +有关API详解请参考 [QuecPython-machine - ExtInt](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=extint) + + + +## 硬件设计 + +ExtInt 外部中断原理为检测 PIN 脚外部电平转变,既 PIN 脚上有上升沿或下降沿信号。 + +![media_ExtInt_1](media/media_ExtInt_1.jpg) + +原理图与按键原理图类似: + +![media_ExtInt_2](media/media_ExtInt_2.jpg) + +## 软件设计 + +首先确定要控制硬件的哪个引脚,然后通过官网的 API 类库找到对应的 GPIO 编号 。详解请参考 [QuecPython-machine - ExtInt](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=extint) + +例: ![media_ExtInt_3](media/media_ExtInt_3.jpg)EC600S/N的引脚10为GPIO1。 + +开始编写代码,选择对应的 GPIO 进行 ExtInt 外部中断初始化: + +```python +from machine import ExtInt + + +def callback(args): + print('interrupt: {}'.format(args)) + + +extint13 = ExtInt(ExtInt.GPIO13, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, callback) # 创建对象 +extint12 = ExtInt(ExtInt.GPIO12, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, callback) # 创建对象 +extint13.enable() # 使能中断 +extint12.enable() # 使能中断 +print('开启GPIO: {}中断. \r\n'.format(extint13.line())) +print('开启GPIO: {}中断. \r\n'.format(extint12.line())) + +# extint13.disable() # 关闭中断 +# extint12.disable() # 关闭中断 +``` + +配套代码 + +## 配套代码 + + + 下载代码 + diff --git a/docs/little_demo/zh/QuecPythonTest/LED.md b/docs/Advanced_development/zh/QuecPythonBus/LED.md similarity index 56% rename from docs/little_demo/zh/QuecPythonTest/LED.md rename to docs/Advanced_development/zh/QuecPythonBus/LED.md index 00fc33fadb08d48495121302cded023132e93be2..0bc7b3dd60bf7a419442331fed2e8c034cad3b78 100644 --- a/docs/little_demo/zh/QuecPythonTest/LED.md +++ b/docs/Advanced_development/zh/QuecPythonBus/LED.md @@ -1,130 +1,129 @@ -***以上实验均可在模块中直接运行*** - -> 适用模块: - -> - EC600S-CN - -*** - -## 跑马灯实验 - -文档主要介绍如何实现 GPIO控制外部器件,从硬件设计和软件设计两方面讲解,通过阅读本文,您将学会查看硬件连接关系、代码编写思路和验证实验理论。 - -### 硬件描述 - -GPIO是最常用的外设之一,可以输出高电平和低电平,以便控制外部的器件。如查看原理图,标有GPIO 的 Pin 就是我们想要找的引脚。 - -![](media/3500f8868c71d63ff9da393a10cbe747.jpg) - -### 软件设计 - -3.1. 首先确定要控制硬件的哪个引脚,然后通过官网的 API 类库找到 Pin -介绍,查看引脚号对应的 GPIO,如图: - -> GPIO1–引脚号 10 对应硬件 Pin10,GPIO2–引脚号 11 对应硬件 -> Pin11......如此类推。 - -![](media/dc6f8d77e95daecdd93e8bf209c840e6.jpg) - -开始编写代码,在.py 文件里加入下面代码,用于对 GPIO 读写: - -```python -IOdictRead = {} # 记录已经初始化的 GPIO 口 -IOdictWrite = {} # 记录已经初始化的 GPIO 口 -def GPIO_Read(gpioX, Pull=Pin.PULL_DISABLE, level=1): - if IOdictWrite.get(gpioX, None): - del IOdictWrite[gpioX] - gpioIO = IOdictRead.get(gpioX, None) - if gpioIO: - return gpioIO.read() - else: - IOdictRead[gpioX] = (Pin(gpioX, Pin.IN, Pull, level)) - gpioIO = IOdictRead.get(gpioX, None) - return gpioIO.read() -def GPIO_Write(gpioX, level, Pull=Pin.PULL_DISABLE): - if IOdictRead.get(gpioX, None): - del IOdictRead[gpioX] - gpioIO = IOdictWrite.get(gpioX, None) - if gpioIO: - gpioIO.write(level) - else: - IOdictWrite[gpioX] = (Pin(gpioX, Pin.OUT, Pull, level)) - gpioIO = IOdictWrite.get(gpioX, None) - gpioIO.write(level) -``` - -定义需要控制的 GPIO 别名: - -| **LED1 = Pin.GPIO1** | **# 定义 LED 引脚** | -| -------------------- | ------------------- | -| **LED2 = Pin.GPIO2** | **# 定义 LED 引脚** | -| **LED3 = Pin.GPIO3** | **# 定义 LED 引脚** | -| **LED4 = Pin.GPIO4** | **# 定义 LED 引脚** | -| **LED5 = Pin.GPIO5** | **# 定义 LED 引脚** | -| | | - -对某一个引脚实现控制: - -```python -def IO_On(gpioX): # 某个引脚置 0 - GPIO_Write(gpioX, 0) # 调用写函数 -def IO_Off(gpioX): # 某个引脚置 1 - GPIO_Write(gpioX, 1) # 调用写函数 - -``` - -对全部引脚实现控制: - -```python -def IO_All_Off(): # 全部引脚置 1 - IO_Off(LED1) - IO_Off(LED2) - IO_Off(LED3) - IO_Off(LED4) - IO_Off(LED5) - -``` - -完成上面的代码后,我们可以编写主程序 -main(),主要实现思路,亮-灭-亮-灭,如此循环;仅点亮 LED1,延时 200 毫秒,看到 -LED1 亮,LED1 灭;仅点亮 LED2,延时 200 毫秒,LED2 灭;仅点亮 LED3,延时 - -200 毫秒,LED3 灭;这样就能看到 LED 轮流点亮的效果。 - -```python -def main(): - while True: - IO_All_Off() # 灭 IO_On(LED1) # 亮 - utime.sleep_ms(200) # 延时 - IO_All_Off() # 灭 IO_On(LED2) # 亮 - utime.sleep_ms(200) # 延时 - IO_All_Off() # 灭 IO_On(LED3) # 亮 - utime.sleep_ms(200) # 延时 - IO_All_Off() # 灭 IO_On(LED4) # 亮 - utime.sleep_ms(200) # 延时 - IO_All_Off() # 灭 IO_On(LED5) # 亮 - utime.sleep_ms(200) # 延时 -``` - -接下来就可以下载验证了,python 代码不需要编译,直接通过 QPYcom 工具把.py文件下载到模块中运行。 - -### 下载验证 - -下载.py 文件到模组运行: - -
-![](media/cec8ced13c05b84026f408456b6272f7.jpg) - -
- -下载之后,看到 LED 逐个点亮,有流水灯的效果: - -
-![](media/45596bd79ed75b965d2b2f5cd16b7fc6.jpg) - -
- -### 配套代码 - - -下载代码 \ No newline at end of file +# 跑马灯实验 + +## 修订历史 + +| 版本 | 日期 | 作者 | 变更表述 | +| ---- | ---------- | ---- | -------- | +| 1.0 | 2021-09-15 | Grey | 初版 | + +文档主要介绍如何实现 GPIO控制外部器件,从硬件设计和软件设计两方面讲解,通过阅读本文,您将学会查看硬件连接关系、代码编写思路和验证实验理论。 + +有关API详解请参考 [QuecPython-machine - PIN](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=pin) + + + +## 硬件描述 + +GPIO是最常用的外设之一,可以输出高电平和低电平,以便控制外部的器件。如下图标有GPIO 的 Pin 就是我们想要找的引脚。 + +![media_PIN_1](media/media_PIN_1.jpg) + + + +## 软件设计 + +首先确定要控制硬件的哪个引脚,然后通过官网的 API 类库找到对应的 GPIO编号 。详解请参考 [QuecPython-machine - PIN](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=pin) + +例: ![media_PIN_2](media/media_PIN_2.jpg)EC600S/N的引脚10为GPIO1。 + +开始编写代码,在.py 文件里加入下面代码,用于对 GPIO 读写: + +```python +IOdictRead = {} # 记录已经初始化的 GPIO 口 +IOdictWrite = {} # 记录已经初始化的 GPIO 口 +def GPIO_Read(gpioX, Pull=Pin.PULL_DISABLE, level=1): + if IOdictWrite.get(gpioX, None): + del IOdictWrite[gpioX] + gpioIO = IOdictRead.get(gpioX, None) + if gpioIO: + return gpioIO.read() + else: + IOdictRead[gpioX] = (Pin(gpioX, Pin.IN, Pull, level)) + gpioIO = IOdictRead.get(gpioX, None) + return gpioIO.read() +def GPIO_Write(gpioX, level, Pull=Pin.PULL_DISABLE): + if IOdictRead.get(gpioX, None): + del IOdictRead[gpioX] + gpioIO = IOdictWrite.get(gpioX, None) + if gpioIO: + gpioIO.write(level) + else: + IOdictWrite[gpioX] = (Pin(gpioX, Pin.OUT, Pull, level)) + gpioIO = IOdictWrite.get(gpioX, None) + gpioIO.write(level) +``` + +定义需要控制的 GPIO 别名: + +```python +from machine import Pin + +LED1 = Pin.GPIO1 # 定义LED引脚 +LED2 = Pin.GPIO2 # 定义LED引脚 +LED3 = Pin.GPIO3 # 定义LED引脚 +LED4 = Pin.GPIO4 # 定义LED引脚 +LED5 = Pin.GPIO5 # 定义LED引脚 +``` + +对某一个引脚实现控制: + +```python +def IO_On(gpioX): # 某个引脚置 0 + GPIO_Write(gpioX, 0) # 调用写函数 +def IO_Off(gpioX): # 某个引脚置 1 + GPIO_Write(gpioX, 1) # 调用写函数 + +``` + +对全部引脚实现控制: + +```python +def IO_All_Off(): # 全部引脚置 1 + IO_Off(LED1) + IO_Off(LED2) + IO_Off(LED3) + IO_Off(LED4) + IO_Off(LED5) + +``` + +完成上面的代码后,我们可以编写主程序 +main(),主要实现思路,亮-灭-亮-灭,如此循环;仅点亮 LED1,延时 200 毫秒,看到LED1 亮,LED1 灭;仅点亮 LED2,延时 200 毫秒,LED2 灭;仅点亮 LED3,延时200 毫秒,LED3 灭;这样就能看到 LED 轮流点亮的效果。 + +```python +import utime + +def main(): + while True: + IO_All_Off() # 灭 IO_On(LED1) # 亮 + utime.sleep_ms(200) # 延时 + IO_All_Off() # 灭 IO_On(LED2) # 亮 + utime.sleep_ms(200) # 延时 + IO_All_Off() # 灭 IO_On(LED3) # 亮 + utime.sleep_ms(200) # 延时 + IO_All_Off() # 灭 IO_On(LED4) # 亮 + utime.sleep_ms(200) # 延时 + IO_All_Off() # 灭 IO_On(LED5) # 亮 + utime.sleep_ms(200) # 延时 +``` + +接下来就可以下载验证了,python 代码不需要编译,直接通过 QPYcom 工具把.py文件下载到模块中运行。 + + + +## 下载验证 + +下载.py 文件到模组运行: + +![media_PIN_3](media/media_PIN_3.jpg) + +下载之后,看到 LED 逐个点亮,有流水灯的效果: + +![media_PIN_4](media/media_PIN_4.jpg) + + + +## 配套代码 + + +下载代码 \ No newline at end of file diff --git a/docs/Advanced_development/zh/QuecPythonSub/WDT.md b/docs/Advanced_development/zh/QuecPythonBus/WDT.md similarity index 70% rename from docs/Advanced_development/zh/QuecPythonSub/WDT.md rename to docs/Advanced_development/zh/QuecPythonBus/WDT.md index 0e30e3e609562b5c5d6b97fec55f4a70db0ac9cc..3324f6bf84737b80bb59c76343980a1c459a0fda 100644 --- a/docs/Advanced_development/zh/QuecPythonSub/WDT.md +++ b/docs/Advanced_development/zh/QuecPythonBus/WDT.md @@ -1,6 +1,14 @@ -# EC600S Watchdog开发使用说明 +## 修订历史 -文档主要基于EC600S介绍如何使用QuecPython_Watchdog,Watchdog通常用于防止设备死机不再运作的情况,加入了Watchdog后,在意外死机后系统将会自动重启,从而使设备继续工作,Watchdog以下简称WDT。通过本文你将了解到WDT的所有设置参数及使用方法。 +| 版本 | 日期 | 作者 | 变更表述 | +| ---- | ---------- | ------ | ------------ | +| 1.0 | 2021-09-15 | Kayden | 初始版本修订 | + + + +## Watchdog开发使用说明 + +文档主要基于EC600S介绍如何使用QuecPython_Watchdog(**适用于其他模组**),Watchdog通常用于防止设备死机不再运作的情况,加入了Watchdog后,在意外死机后系统将会自动重启,从而使设备继续工作,Watchdog以下简称WDT。通过本文你将了解到WDT的所有设置参数及使用方法。 ## 硬件描述 @@ -8,6 +16,8 @@ WDT模块功能:APP应用程序发生异常不执行时进行系统重启操 ## 软件设计 +看门狗API详细介绍参见链接:[看门狗API](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=wdt) + 1. 函数原型 WDT(period),返回一个wdt 对象,用于设置WDT的喂狗、开启、关闭功能。 创建WDT对象并立即启动: @@ -35,9 +45,9 @@ WDT模块功能:APP应用程序发生异常不执行时进行系统重启操 1. 使用QPYcom工具和模组进行交互,示例如下:
-![](media/078f1a0cb7cadb85b5e1806a14f57841.png) +![](media/watchdog_1.png) -
+
注意: @@ -51,6 +61,8 @@ WDT模块功能:APP应用程序发生异常不执行时进行系统重启操 下载.py文件到模组运行,代码如下: + 下载代码 + ```python from machine import WDT from machine import Timer @@ -72,10 +84,7 @@ timer1.start(period=1000, mode=timer1.PERIODIC, callback=feed) # 使用定时 ``` -## 配套代码 - - 下载代码 ## 专业名词解释 diff --git a/docs/Advanced_development/zh/QuecPythonBus/button.md b/docs/Advanced_development/zh/QuecPythonBus/button.md new file mode 100644 index 0000000000000000000000000000000000000000..acfec324500112026c303a12032867fa95005da6 --- /dev/null +++ b/docs/Advanced_development/zh/QuecPythonBus/button.md @@ -0,0 +1,68 @@ +# 按键输入实验 + +## 修订历史 + +| 版本 | 日期 | 作者 | 变更表述 | +| ---- | ---------- | ---- | -------- | +| 1.0 | 2021-09-17 | Grey | 初版 | + +文档主要介绍如何实现检测 GPIO 电平,从硬件设计和软件设计两方面讲解,通过阅读本文,您将学会查看硬件连接关系、代码编写思路和验证实验理论。 + +有关API详解请参考 [QuecPython-machine - PIN](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=pin) + + + +## 硬件资源 + +EC600x 开发板引出了两个 PIN 脚供客户实验按键输入实验。 + +我们配置对应 GPIO 为上拉输入模式便可以通过按而不按按键改变 GPIO的电平。 + +![media_button_1](media/media_button_1.jpg) + + + +## 软件设计 + +首先确定要检测的硬件引脚是那一个 GPIO ,我们通过官网的 API 类库找到对应的 GPIO编号 。详解请参考 [QuecPython-machine - PIN](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=pin) + +例: ![media_button_2](media/media_button_2.jpg)EC600S/N的引脚10为GPIO1。 + +而我们 EC600x 开发板两个按键 PIN59/PIN60,对应EC600S/N为:PIN59 => GPIO12;PIN60 => GPIO13。对应EC600U为:PIN60 => GPIO4;PIN59 无对应 GPIO,不能进行按键输入检测。这边我们实现一个按键的按键检测功能。 + +### 代码实现 + +```python +import utime +from machine import Pin + + +if __name__ == '__main__': + gpio13 = Pin(Pin.GPIO13, Pin.IN, Pin.PULL_PU, 1) # EC600S/N开发板使用 + # gpio13 = Pin(Pin.GPIO4, Pin.IN, Pin.PULL_PU, 1) # EC600U开发板使用 + while True: + if gpio13.read() == 0: + utime.sleep_ms(10) + if gpio13.read() == 0: + while gpio13.read() == 0: + pass + print("GPIO13按下") + pass +``` + + + +## 下载验证 + +下载.py 文件到模组运行: + +![media_button_3](media/media_button_3.jpg) + +下载之后,按下按键,便会有信息打印: + +![media_button_4](media/media_button_4.jpg) + +## 配套代码 + + + 下载代码 \ No newline at end of file diff --git a/docs/little_demo/zh/QuecPythonTest/buzzer.md b/docs/Advanced_development/zh/QuecPythonBus/buzzer.md similarity index 51% rename from docs/little_demo/zh/QuecPythonTest/buzzer.md rename to docs/Advanced_development/zh/QuecPythonBus/buzzer.md index e8afa285db712d56a24347c982dd20a27f3a15be..f290fe779ca867c73094f053d4dc77f54dc2a5a7 100644 --- a/docs/little_demo/zh/QuecPythonTest/buzzer.md +++ b/docs/Advanced_development/zh/QuecPythonBus/buzzer.md @@ -1,137 +1,137 @@ -## 蜂鸣器实验 - -### 基本概述 - -本片文章主要简介使用EC600S GPIO 来驱动外部蜂鸣器模块。 - -#### 硬件资源 - -淘宝链接: - - -淘宝: 无源频率可控 - -![](media/8aab25aa717d0a0be57094d08fc53b28.png) - -### 使用说明 - -无源蜂鸣器通过PWM开关三极管驱动。 我们只需要电源,以及2k~5K 的pwm方波即可。 - -### 实验步骤 - -#### 实验环境准备 - - **引脚连接** - -按照下面的链接方式链接引脚 - -| **蜂鸣器** | **EC600开发板** | **对应的函数标号** | -| ---------- | ----------------- | ------------------ | -| IO (PWM) | GPIO2 (引脚号70) | PWM2 | -| VCC | 5_5V电源 | 无 | -| GND | 地 | 无 | - -#### 查询开发板对应的IO口 - -在wiki_API说明_类库_PWM中可以确定70号引脚对应的函数标号为PWM2,原理图找到对应的GPIO口为GPIO2,通过搜索查询GPIO2可确定IO口为开发板上J5的倒数第二口。(也可直接通过肉眼找到开发板中G2字眼) - -EC600S_EVB_v1.1开发板原理图下载链接: - -![](media\QuecPython_little_demo_buzzer01.png) - - -#### 实验代码 - -```python - -from misc import PWM -import utime as time -import urandom as random -import log - -# API https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=pwm -# 蜂鸣器模块 https://detail.tmall.com/item.htm?id=41251333522 -# 无源蜂鸣器-频率可控版 - -""" - -pwm0 = PWM(PWM.PWMn,PWM.ABOVE_xx,highTime,cycleTime) - -注:EC600SCN平台,支持PWM0-PWM3,对应引脚如下: - -PWM0 – 引脚号52 - -PWM1 – 引脚号53 - -PWM2 – 引脚号70 - -PWM3 – 引脚号69 - -""" - -# 获取logger对象 - -buzzer_log = log.getLogger("buzzer_test") - -# Duration 为 ms - -def outputpwm(HZ, duty_cycle, Duration): - - # 将HZ 转化为 10us 级别 - - cycleTime = int((10000000/HZ)/10) - highTime = int(cycleTime * duty_cycle) - - # 输出debug级别的日志 - - buzzer_log.debug( - """out put pin70 cycleTime {0} * 10us, - highTime {1} * 10us, Duration of {2}""" - .format(cycleTime, highTime, Duration)) - pwm1 = PWM(PWM.PWM2, PWM.ABOVE_10US, highTime, cycleTime) - pwm1.open() - - # 休眠给定毫秒数的时间 - - time.sleep_ms(Duration) - pwm1.close() - pass - - -def test_Buzzer(): - - #设置日志输出级别 - - log.basicConfig(level=log.DEBUG) - - # 循环遍历10次 - - for i in range(10): - - # 随机生成 start 到 end 范围内的浮点数,范围可以自己选择, 0~1 - - duty_cycle = random.uniform(0.1, 0.8) - - # 建议输出2000~5000HZ 的PWM波形 - # 随机生成一个 start 到 end 之间的整数 - - HZ = random.randint(2000, 5000) - outputpwm(HZ, duty_cycle, 500) - time.sleep_ms(1500) - - pass - - -if __name__ == "__main__": - - # creat a thread Check key status - - test_Buzzer() - -# 将代码下载运行,可以听到蜂鸣器产生随机的声音 -``` - -### 配套代码 - -* [下载代码](code/pwm_buzzer.py) - \ No newline at end of file +# 蜂鸣器实验 + +## 修订历史 + +| 版本 | 日期 | 作者 | 变更表述 | +|------|------|------|------| +| 1.0 | 2021-03-20 | gary.zhou | 初版 | +| 1.1 | 2021-09-15 | Grey.Tu | 修改有缘蜂鸣器绘制为无缘蜂鸣器控绘制. | + +文档主要介绍如何 PWM 控制 **无缘蜂鸣器** ,使 **无缘蜂鸣器** 发声。从硬件设计和软件设计两方面讲解,通过阅读本文,可以学习 PWM 基本使用。 + +有关 API 详解请参考 [QuecPython-misc - PWM](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=pwm) + + + +## 硬件描述 + +蜂鸣器分为 **有源蜂鸣器** 与 **无源蜂鸣器** 两种。 **有缘蜂鸣器** 直接供电就会发声,控制如同 LED ,控制引脚输出高低电平即可。硬件电路也与 LED 电路类似。 有关驱动请参考 LED 控制章节。本文主要介绍 **无源蜂鸣器** 的驱动,实现 PWM 控制 **无缘蜂鸣器** 。 + +![media_buzzer_1](media/media_buzzer_1.jpg) + +淘宝搜索购买无源蜂鸣器 + +![media_buzzer_2](media/media_buzzer_2.jpg) + +无源蜂鸣器通过PWM开关三极管驱动。 我们只需要电源,以及2KHz~5KHz 的pwm方波即可。 + +![media_buzzer_3](media/media_buzzer_3.jpg) + + + +## 软件设计 + +#### 查询开发板对应的IO口 + +首先确定要控制硬件的哪个引脚,然后通过官网的 API 类库找到对应的 PWM 编号 。详解请参考 [QuecPython-misc - PWM](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=pwm) 例: + +| 模块型号 | **对应引脚号** | +| -------------------------------------- | -------------- | +| EC600S/N ==> PWM2
EC600U ==> PWM0 | 引脚号70 | + + +### **实验代码** + +```python + +from misc import PWM +import utime as time +import urandom as random +import log + +# API https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=pwm +# 蜂鸣器模块 https://detail.tmall.com/item.htm?id=41251333522 +# 无源蜂鸣器-频率可控版 + +""" + +pwm0 = PWM(PWM.PWMn,PWM.ABOVE_xx,highTime,cycleTime) + +注:EC600SCN平台,支持PWM0-PWM3,对应引脚如下: + +PWM0 – 引脚号52 + +PWM1 – 引脚号53 + +PWM2 – 引脚号70 + +PWM3 – 引脚号69 + +""" + +# 获取logger对象 + +buzzer_log = log.getLogger("buzzer_test") + +# Duration 为 ms + +def outputpwm(HZ, duty_cycle, Duration): + + # 将HZ 转化为 10us 级别 + + cycleTime = int((10000000/HZ)/10) + highTime = int(cycleTime * duty_cycle) + + # 输出debug级别的日志 + + buzzer_log.debug( + """out put pin70 cycleTime {0} * 10us, + highTime {1} * 10us, Duration of {2}""" + .format(cycleTime, highTime, Duration)) + pwm1 = PWM(PWM.PWM2, PWM.ABOVE_10US, highTime, cycleTime) + pwm1.open() + + # 休眠给定毫秒数的时间 + + time.sleep_ms(Duration) + pwm1.close() + pass + + +def test_Buzzer(): + + #设置日志输出级别 + + log.basicConfig(level=log.DEBUG) + + # 循环遍历10次 + + for i in range(10): + + # 随机生成 start 到 end 范围内的浮点数,范围可以自己选择, 0~1 + + duty_cycle = random.uniform(0.1, 0.8) + + # 建议输出2000~5000HZ 的PWM波形 + # 随机生成一个 start 到 end 之间的整数 + + HZ = random.randint(2000, 5000) + outputpwm(HZ, duty_cycle, 500) + time.sleep_ms(1500) + + pass + + +if __name__ == "__main__": + + # creat a thread Check key status + + test_Buzzer() + +# 将代码下载运行,可以听到蜂鸣器产生随机的声音 +``` + +## 配套代码 + +* [下载代码](code/code_buzzer.py) + \ No newline at end of file diff --git a/docs/Advanced_development/zh/QuecPythonBus/code/Watchdog.py b/docs/Advanced_development/zh/QuecPythonBus/code/Watchdog.py new file mode 100644 index 0000000000000000000000000000000000000000..42d5cef0ce2cc9c3cd074fc5ed33e513d576f86d --- /dev/null +++ b/docs/Advanced_development/zh/QuecPythonBus/code/Watchdog.py @@ -0,0 +1,17 @@ +from machine import WDT +from machine import Timer + +count = 0 +def feed(t): + global count + count += 1 + if count >= 5: + print('停止喂狗') + timer1.stop() + print('喂狗') + wdt.feed() + + +timer1 = Timer(Timer.Timer1) +wdt = WDT(2) # 启动看门狗,间隔时长 单位 秒 +timer1.start(period=1000, mode=timer1.PERIODIC, callback=feed) # 使用定时器喂狗 diff --git a/docs/Advanced_development/zh/QuecPythonBus/code/code_ExtInt.py b/docs/Advanced_development/zh/QuecPythonBus/code/code_ExtInt.py new file mode 100644 index 0000000000000000000000000000000000000000..241ccd79ca3130dce058c71b9577fac8dc4b6da7 --- /dev/null +++ b/docs/Advanced_development/zh/QuecPythonBus/code/code_ExtInt.py @@ -0,0 +1,29 @@ +from machine import ExtInt +import utime as time +# PIN脚及API介绍请参考 https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=extint +state = 10 # 测试次数 + + +def callback(args): + print('interrupt: {}'.format(args)) + + +def main(): + extint13 = ExtInt(ExtInt.GPIO13, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, callback) # 创建对象 + extint12 = ExtInt(ExtInt.GPIO12, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PU, callback) # 创建对象 + extint13.enable() # 使能中断 + extint12.enable() # 使能中断 + print('开启GPIO: {}中断. \r\n'.format(extint13.line())) + print('开启GPIO: {}中断. \r\n'.format(extint12.line())) + # 等待按键按下,触发 + while state: + time.sleep_ms(1) + pass + # 停止映射外部中断 + extint13.disable() # 关闭中断 + extint12.disable() # 关闭中断 + print("The main function has exited") + + +if __name__ == "__main__": + main() diff --git a/docs/little_demo/zh/QuecPythonTest/code/01_LED.py b/docs/Advanced_development/zh/QuecPythonBus/code/code_LED.py similarity index 96% rename from docs/little_demo/zh/QuecPythonTest/code/01_LED.py rename to docs/Advanced_development/zh/QuecPythonBus/code/code_LED.py index 76a8c987b0a2fd361c13b4cc472bd17f0e834708..80821f9f2b9f0285a3d728d004a4b991497cc57a 100644 --- a/docs/little_demo/zh/QuecPythonTest/code/01_LED.py +++ b/docs/Advanced_development/zh/QuecPythonBus/code/code_LED.py @@ -1,80 +1,80 @@ -# 实验1: 跑马灯 -# API资料参考连接: https://python.quectel.com/wiki/#/zh-cn/api/?id=pin - - -from machine import Pin -import utime - - -IOdictRead = {} # 记录已经初始化的GPIO口 -IOdictWrite = {} # 记录已经初始化的GPIO口 - - -def GPIO_Read(gpioX, Pull=Pin.PULL_DISABLE, level=1): - if IOdictWrite.get(gpioX, None): - del IOdictWrite[gpioX] - gpioIO = IOdictRead.get(gpioX, None) - if gpioIO: - return gpioIO.read() - else: - IOdictRead[gpioX] = (Pin(gpioX, Pin.IN, Pull, level)) - gpioIO = IOdictRead.get(gpioX, None) - return gpioIO.read() - - -def GPIO_Write(gpioX, level, Pull=Pin.PULL_DISABLE): - if IOdictRead.get(gpioX, None): - del IOdictRead[gpioX] - gpioIO = IOdictWrite.get(gpioX, None) - if gpioIO: - gpioIO.write(level) - else: - IOdictWrite[gpioX] = (Pin(gpioX, Pin.OUT, Pull, level)) - gpioIO = IOdictWrite.get(gpioX, None) - gpioIO.write(level) - - -LED1 = Pin.GPIO1 # 定义LED引脚 -LED2 = Pin.GPIO2 # 定义LED引脚 -LED3 = Pin.GPIO3 # 定义LED引脚 -LED4 = Pin.GPIO4 # 定义LED引脚 -LED5 = Pin.GPIO5 # 定义LED引脚 - - -def IO_On(gpioX): # 某个引脚置0 - GPIO_Write(gpioX, 0) # 调用写函数 - - -def IO_Off(gpioX): # 某个引脚置1 - GPIO_Write(gpioX, 1) # 调用写函数 - - -def IO_All_Off(): # 全部引脚置1 - IO_Off(LED1) - IO_Off(LED2) - IO_Off(LED3) - IO_Off(LED4) - IO_Off(LED5) - - -def main(): - while True: - IO_All_Off() # 灭 - IO_On(LED1) # 亮 - utime.sleep_ms(200) # 延时 - IO_All_Off() # 灭 - IO_On(LED2) # 亮 - utime.sleep_ms(200) # 延时 - IO_All_Off() # 灭 - IO_On(LED3) # 亮 - utime.sleep_ms(200) # 延时 - IO_All_Off() # 灭 - IO_On(LED4) # 亮 - utime.sleep_ms(200) # 延时 - IO_All_Off() # 灭 - IO_On(LED5) # 亮 - utime.sleep_ms(200) # 延时 - - -if __name__ == "__main__": - main() +# 实验1: 跑马灯 +# API资料参考连接: https://python.quectel.com/wiki/#/zh-cn/api/?id=pin + + +from machine import Pin +import utime + + +IOdictRead = {} # 记录已经初始化的GPIO口 +IOdictWrite = {} # 记录已经初始化的GPIO口 + + +def GPIO_Read(gpioX, Pull=Pin.PULL_DISABLE, level=1): + if IOdictWrite.get(gpioX, None): + del IOdictWrite[gpioX] + gpioIO = IOdictRead.get(gpioX, None) + if gpioIO: + return gpioIO.read() + else: + IOdictRead[gpioX] = (Pin(gpioX, Pin.IN, Pull, level)) + gpioIO = IOdictRead.get(gpioX, None) + return gpioIO.read() + + +def GPIO_Write(gpioX, level, Pull=Pin.PULL_DISABLE): + if IOdictRead.get(gpioX, None): + del IOdictRead[gpioX] + gpioIO = IOdictWrite.get(gpioX, None) + if gpioIO: + gpioIO.write(level) + else: + IOdictWrite[gpioX] = (Pin(gpioX, Pin.OUT, Pull, level)) + gpioIO = IOdictWrite.get(gpioX, None) + gpioIO.write(level) + + +LED1 = Pin.GPIO1 # 定义LED引脚 +LED2 = Pin.GPIO2 # 定义LED引脚 +LED3 = Pin.GPIO3 # 定义LED引脚 +LED4 = Pin.GPIO4 # 定义LED引脚 +LED5 = Pin.GPIO5 # 定义LED引脚 + + +def IO_On(gpioX): # 某个引脚置0 + GPIO_Write(gpioX, 0) # 调用写函数 + + +def IO_Off(gpioX): # 某个引脚置1 + GPIO_Write(gpioX, 1) # 调用写函数 + + +def IO_All_Off(): # 全部引脚置1 + IO_Off(LED1) + IO_Off(LED2) + IO_Off(LED3) + IO_Off(LED4) + IO_Off(LED5) + + +def main(): + while True: + IO_All_Off() # 灭 + IO_On(LED1) # 亮 + utime.sleep_ms(200) # 延时 + IO_All_Off() # 灭 + IO_On(LED2) # 亮 + utime.sleep_ms(200) # 延时 + IO_All_Off() # 灭 + IO_On(LED3) # 亮 + utime.sleep_ms(200) # 延时 + IO_All_Off() # 灭 + IO_On(LED4) # 亮 + utime.sleep_ms(200) # 延时 + IO_All_Off() # 灭 + IO_On(LED5) # 亮 + utime.sleep_ms(200) # 延时 + + +if __name__ == "__main__": + main() diff --git a/docs/Advanced_development/zh/QuecPythonBus/code/code_UART_CDC.py b/docs/Advanced_development/zh/QuecPythonBus/code/code_UART_CDC.py new file mode 100644 index 0000000000000000000000000000000000000000..a8d288d5ef5c2687598f5a9bd78c390b6eb664ab --- /dev/null +++ b/docs/Advanced_development/zh/QuecPythonBus/code/code_UART_CDC.py @@ -0,0 +1,70 @@ +# import log +import utime +import _thread +import ubinascii +from machine import UART + +state = 1 +uart_x = None +usbcdc = None + +# # | 参数 | 参数类型 | 说明 | +# # | -------- | ------- | ------------------ | +# # | CRITICAL | 常量 | 日志记录级别的数值 50 | +# # | ERROR | 常量 | 日志记录级别的数值 40 | +# # | WARNING | 常量 | 日志记录级别的数值 30 | +# # | INFO | 常量 | 日志记录级别的数值 20 | +# # | DEBUG | 常量 | 日志记录级别的数值 10 | +# # | NOTSET | 常量 | 日志记录级别的数值 0 | +# log.basicConfig(level=log.CRITICAL) # 设置日志输出级别 +# log = log.getLogger("Grey") # 获取logger对象,如果不指定name则返回root对象,多次使用相同的name调用getLogger方法返回同一个logger对象 + + +def uart_x_read(): + global state + global uart_x + global usbcdc + + while state: + msglen = uart_x.any() # 返回是否有可读取的数据长度 + if msglen: # 当有数据时进行读取 + msg = uart_x.read(msglen) # 读取数据 + utf8_msg = msg.decode() # 初始数据是字节类型(bytes),将字节类型数据进行编码 + if "Grey" in utf8_msg: + break + else: + usbcdc.write("{}".format(utf8_msg)) # 发送数据 + utime.sleep_ms(1) + state = 0 + + +def usbcdc_read(): + global state + global uart_x + global usbcdc + + while state: + msglen = usbcdc.any() # 返回是否有可读取的数据长度 + if msglen: # 当有数据时进行读取 + msg = usbcdc.read(msglen) # 读取数据 + utf8_msg = msg.decode() # 初始数据是字节类型(bytes),将字节类型数据进行编码 + if "Grey" in utf8_msg: + break + else: + uart_x.write("{}".format(utf8_msg)) # 发送数据 + utime.sleep_ms(1) + state = 0 + + +if __name__ == "__main__": + uart_x = UART(UART.UART2, 115200, 8, 0, 1, 0) + usbcdc = UART(UART.UART3, 115200, 8, 0, 1, 0) + + uart_x.write("Grey_测试") + usbcdc.write("Grey_测试") + + _thread.start_new_thread(uart_x_read, ()) # 创建一个线程来监听接收uart消息 + _thread.start_new_thread(usbcdc_read, ()) # 创建一个线程来监听接收CDC消息 + + while state: + utime.sleep_ms(1) diff --git a/docs/Advanced_development/zh/QuecPythonBus/code/code_button.py b/docs/Advanced_development/zh/QuecPythonBus/code/code_button.py new file mode 100644 index 0000000000000000000000000000000000000000..097c0992ad2c319c7eabecbc90f4caa34713697c --- /dev/null +++ b/docs/Advanced_development/zh/QuecPythonBus/code/code_button.py @@ -0,0 +1,15 @@ +import utime +from machine import Pin + + +if __name__ == '__main__': + gpio13 = Pin(Pin.GPIO13, Pin.IN, Pin.PULL_PU, 1) # EC600S/N开发板使用 + # gpio13 = Pin(Pin.GPIO4, Pin.IN, Pin.PULL_PU, 1) # EC600U开发板使用 + while True: + if gpio13.read() == 0: + utime.sleep_ms(10) + if gpio13.read() == 0: + while gpio13.read() == 0: + pass + print("GPIO13按下") + pass diff --git a/docs/little_demo/zh/QuecPythonTest/code/pwm_buzzer.py b/docs/Advanced_development/zh/QuecPythonBus/code/code_buzzer.py similarity index 95% rename from docs/little_demo/zh/QuecPythonTest/code/pwm_buzzer.py rename to docs/Advanced_development/zh/QuecPythonBus/code/code_buzzer.py index 2b4f54966a9e4a83ad811cebe713fca47cffd757..5225c7bbaed9b85736d1dad9b7cd261fc11b6215 100644 --- a/docs/little_demo/zh/QuecPythonTest/code/pwm_buzzer.py +++ b/docs/Advanced_development/zh/QuecPythonBus/code/code_buzzer.py @@ -1,83 +1,83 @@ -from misc import PWM -import utime as time -import urandom as random -import log - -# API https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=pwm -# 蜂鸣器模块 https://detail.tmall.com/item.htm?id=41251333522 -# 无源蜂鸣器-频率可控版 - -""" - -pwm0 = PWM(PWM.PWMn,PWM.ABOVE_xx,highTime,cycleTime) - -注:EC600SCN平台,支持PWM0-PWM3,对应引脚如下: - -PWM0 – 引脚号52 - -PWM1 – 引脚号53 - -PWM2 – 引脚号70 - -PWM3 – 引脚号69 - -""" - -# 获取logger对象 - -buzzer_log = log.getLogger("buzzer_test") - -# Duration 为 ms - -def outputpwm(HZ, duty_cycle, Duration): - - # 将HZ 转化为 10us 级别 - - cycleTime = int((10000000/HZ)/10) - highTime = int(cycleTime * duty_cycle) - - # 输出debug级别的日志 - - buzzer_log.debug( - """out put pin70 cycleTime {0} * 10us, - highTime {1} * 10us, Duration of {2}""" - .format(cycleTime, highTime, Duration)) - pwm1 = PWM(PWM.PWM2, PWM.ABOVE_10US, highTime, cycleTime) - pwm1.open() - - # 休眠给定毫秒数的时间 - - time.sleep_ms(Duration) - pwm1.close() - pass - - -def test_Buzzer(): - - #设置日志输出级别 - - log.basicConfig(level=log.DEBUG) - - # 循环遍历10次 - - for i in range(10): - - # 随机生成 start 到 end 范围内的浮点数,范围可以自己选择, 0~1 - - duty_cycle = random.uniform(0.1, 0.8) - - # 建议输出2000~5000HZ 的PWM波形 - # 随机生成一个 start 到 end 之间的整数 - - HZ = random.randint(2000, 5000) - outputpwm(HZ, duty_cycle, 500) - time.sleep_ms(1500) - - pass - - -if __name__ == "__main__": - - # creat a thread Check key status - +from misc import PWM +import utime as time +import urandom as random +import log + +# API https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=pwm +# 蜂鸣器模块 https://detail.tmall.com/item.htm?id=41251333522 +# 无源蜂鸣器-频率可控版 + +""" + +pwm0 = PWM(PWM.PWMn,PWM.ABOVE_xx,highTime,cycleTime) + +注:EC600SCN平台,支持PWM0-PWM3,对应引脚如下: + +PWM0 – 引脚号52 + +PWM1 – 引脚号53 + +PWM2 – 引脚号70 + +PWM3 – 引脚号69 + +""" + +# 获取logger对象 + +buzzer_log = log.getLogger("buzzer_test") + +# Duration 为 ms + +def outputpwm(HZ, duty_cycle, Duration): + + # 将HZ 转化为 10us 级别 + + cycleTime = int((10000000/HZ)/10) + highTime = int(cycleTime * duty_cycle) + + # 输出debug级别的日志 + + buzzer_log.debug( + """out put pin70 cycleTime {0} * 10us, + highTime {1} * 10us, Duration of {2}""" + .format(cycleTime, highTime, Duration)) + pwm1 = PWM(PWM.PWM2, PWM.ABOVE_10US, highTime, cycleTime) + pwm1.open() + + # 休眠给定毫秒数的时间 + + time.sleep_ms(Duration) + pwm1.close() + pass + + +def test_Buzzer(): + + #设置日志输出级别 + + log.basicConfig(level=log.DEBUG) + + # 循环遍历10次 + + for i in range(10): + + # 随机生成 start 到 end 范围内的浮点数,范围可以自己选择, 0~1 + + duty_cycle = random.uniform(0.1, 0.8) + + # 建议输出2000~5000HZ 的PWM波形 + # 随机生成一个 start 到 end 之间的整数 + + HZ = random.randint(2000, 5000) + outputpwm(HZ, duty_cycle, 500) + time.sleep_ms(1500) + + pass + + +if __name__ == "__main__": + + # creat a thread Check key status + test_Buzzer() \ No newline at end of file diff --git a/docs/Advanced_development/zh/QuecPythonBus/media/media_ExtInt_1.jpg b/docs/Advanced_development/zh/QuecPythonBus/media/media_ExtInt_1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..41421feb83f7955a3de178e949d94ed47a6287ea Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonBus/media/media_ExtInt_1.jpg differ diff --git a/docs/Advanced_development/zh/QuecPythonBus/media/media_ExtInt_2.jpg b/docs/Advanced_development/zh/QuecPythonBus/media/media_ExtInt_2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5355ab9897d86fdc57c91e1bd269567dba99043b Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonBus/media/media_ExtInt_2.jpg differ diff --git a/docs/Advanced_development/zh/QuecPythonBus/media/media_ExtInt_3.jpg b/docs/Advanced_development/zh/QuecPythonBus/media/media_ExtInt_3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5f7d9a8fdcc6186a90a06efeaced6fcf0e872fe4 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonBus/media/media_ExtInt_3.jpg differ diff --git a/docs/Advanced_development/zh/QuecPythonBus/media/media_PIN_1.jpg b/docs/Advanced_development/zh/QuecPythonBus/media/media_PIN_1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5f159f0398ba8ea94182d672a232a7edac832a75 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonBus/media/media_PIN_1.jpg differ diff --git a/docs/Advanced_development/zh/QuecPythonBus/media/media_PIN_2.jpg b/docs/Advanced_development/zh/QuecPythonBus/media/media_PIN_2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5f7d9a8fdcc6186a90a06efeaced6fcf0e872fe4 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonBus/media/media_PIN_2.jpg differ diff --git a/docs/Advanced_development/zh/QuecPythonBus/media/media_PIN_3.jpg b/docs/Advanced_development/zh/QuecPythonBus/media/media_PIN_3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cb53a486ee169e810b4f3c6eda9cb39e0ca34e51 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonBus/media/media_PIN_3.jpg differ diff --git a/docs/little_demo/zh/QuecPythonTest/media/45596bd79ed75b965d2b2f5cd16b7fc6.jpg b/docs/Advanced_development/zh/QuecPythonBus/media/media_PIN_4.jpg similarity index 100% rename from docs/little_demo/zh/QuecPythonTest/media/45596bd79ed75b965d2b2f5cd16b7fc6.jpg rename to docs/Advanced_development/zh/QuecPythonBus/media/media_PIN_4.jpg diff --git a/docs/Advanced_development/zh/QuecPythonBus/media/media_UART_1.jpg b/docs/Advanced_development/zh/QuecPythonBus/media/media_UART_1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0dd3d266fee8f2b92601ded72dbc03f677130a5b Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonBus/media/media_UART_1.jpg differ diff --git a/docs/Advanced_development/zh/QuecPythonBus/media/media_UART_2.jpg b/docs/Advanced_development/zh/QuecPythonBus/media/media_UART_2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1337a536d4331ae03a0f3bc74ff52fe0abef3bc5 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonBus/media/media_UART_2.jpg differ diff --git a/docs/Advanced_development/zh/QuecPythonBus/media/media_UART_3.jpg b/docs/Advanced_development/zh/QuecPythonBus/media/media_UART_3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..042fc4cfc8b4c1ccdc900ca31be90588cfcace38 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonBus/media/media_UART_3.jpg differ diff --git a/docs/Advanced_development/zh/QuecPythonBus/media/media_button_1.jpg b/docs/Advanced_development/zh/QuecPythonBus/media/media_button_1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..99ad61a5655bdc24f0b63c0480548be6014594d0 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonBus/media/media_button_1.jpg differ diff --git a/docs/Advanced_development/zh/QuecPythonBus/media/media_button_2.jpg b/docs/Advanced_development/zh/QuecPythonBus/media/media_button_2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5f7d9a8fdcc6186a90a06efeaced6fcf0e872fe4 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonBus/media/media_button_2.jpg differ diff --git a/docs/Advanced_development/zh/QuecPythonBus/media/media_button_3.jpg b/docs/Advanced_development/zh/QuecPythonBus/media/media_button_3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1b8ca2f4595ea54bb892cfbf6c6854e1b9b195e0 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonBus/media/media_button_3.jpg differ diff --git a/docs/Advanced_development/zh/QuecPythonBus/media/media_button_4.jpg b/docs/Advanced_development/zh/QuecPythonBus/media/media_button_4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..80bd9f7dd8497851cab1c8ea92455a595be6a9a7 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonBus/media/media_button_4.jpg differ diff --git a/docs/Advanced_development/zh/QuecPythonBus/media/media_buzzer_1.jpg b/docs/Advanced_development/zh/QuecPythonBus/media/media_buzzer_1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..08655fb0aca59b86c0c8c0c856522fe0f440cd1a Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonBus/media/media_buzzer_1.jpg differ diff --git a/docs/Advanced_development/zh/QuecPythonBus/media/media_buzzer_2.jpg b/docs/Advanced_development/zh/QuecPythonBus/media/media_buzzer_2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..04f1abf9f20c5d03199c9f018b7fb957cc5db9b4 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonBus/media/media_buzzer_2.jpg differ diff --git a/docs/Advanced_development/zh/QuecPythonBus/media/media_buzzer_3.jpg b/docs/Advanced_development/zh/QuecPythonBus/media/media_buzzer_3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e46d0e65656a8f8d992dd1a51dc20e7c6157d2a0 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonBus/media/media_buzzer_3.jpg differ diff --git a/docs/Advanced_development/zh/QuecPythonBus/media/watchdog_1.png b/docs/Advanced_development/zh/QuecPythonBus/media/watchdog_1.png new file mode 100644 index 0000000000000000000000000000000000000000..95bfbbba7ba88614c10c27352dfb0669889d3586 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonBus/media/watchdog_1.png differ diff --git a/docs/Advanced_development/zh/QuecPythonBus/uart.md b/docs/Advanced_development/zh/QuecPythonBus/uart.md new file mode 100644 index 0000000000000000000000000000000000000000..0fb8e8c9997c5fe1ce66e26d9710dbb0e3566668 --- /dev/null +++ b/docs/Advanced_development/zh/QuecPythonBus/uart.md @@ -0,0 +1,78 @@ +# UART实验 + +## 修订历史 + +| 版本 | 日期 | 作者 | 变更表述 | +| ---- | ---------- | ------- | -------- | +| 1.0 | 2021-09-22 | Grey.tu | 初版 | + +文档主要介绍QuecPython_UART,UART作为一种常用的通用方式,主要用数据交互,可实现全双工传输。通过本文你将了解到EC600x(包括EC600S、EC600N、EC600U)UART的设置参数及使用方法。 + +有关API详解请参考 [QuecPython-machine-UART](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=uart) + + + +## 硬件设计 + +针对不同的模组,开放的UART列表如下: + +| 模块型号 | UART编号 | UART_PIN | +| -------- | ------------------------------------------------------------ | ------------------------------------------------------------ | +| EC600S/N | UART0_DEBUG PORT
UART1_BT PORT
UART2_MAIN PORT
UART3_USB CDC PORT | UART0_DEBUG_PORT(TX => PIN71 & RX => PIN72)
UART1_BT_PORT(TX => PIN3 & RX => PIN2)
UART2_MAIN_PORT(TX => PIN32 & RX => PIN31)
USB_CDC_PORT ==> USB虚拟口,波特率不受限 | +| EC600U | UART0_DEBUG PORT
UART1_BT PORT
UART2_MAIN PORT
UART3_USB CDC PORT | UART0_DEBUG_PORT(TX => PIN71 & RX => PIN72)
UART1_BT_PORT(TX => PIN124 & RX => PIN123)
UART2_MAIN_PORT(TX => PIN32 & RX => PIN31)
USB_CDC_PORT ==> USB虚拟口,波特率不受限
注: EC600U_DEBUG PORT只能作为DEBUG_LOG输出使用,
不能作为UART通信使用. | + +官方QuecPython开发板V1.2/V1.3的UART位置标记如下图: + +![media_UART_1](media/media_UART_1.jpg) + +注:次图仅适用于官方QuecPython开发板V1.2/V1.3。后续开发板视情况而定。 + + + +## 软件设计 + +物理 UART 基本连接使用我们在 UART 功能章节已经介绍,我们本章过多介绍,本章我们主要介绍下 USB CDC PORT。 + +USB CDC PORT 为USB虚拟的串行通信口,此通信口采用 UART 一样的通信协议,但并未真正意义的 UART。它的通信速率不受 UART 波特率的限制,可根据USB协议自动设别。可以更快速率的传输数据,也无需固定波特率的繁琐。 + +```python +from machine import UART + +uart_x = UART(UART.UART2, 115200, 8, 0, 1, 0) +usbcdc = UART(UART.UART3, 115200, 8, 0, 1, 0) # 此波特率设置无效, 通信时可以任意波特率 + +while True: + uart_x_msglen = uart_x.any() + if uart_x_msglen: + uart_x_msg = uart_x.read(uart_x_msglen) + uart_x_utf8_msg = uart_x_msg.decode() + usbcdc.write("{}".format(uart_x_utf8_msg)) + + usbcdc_msglen = usbcdc.any() + if usbcdc_msglen: + usbcdc_msg = usbcdc.read(usbcdc_msglen) + usbcdc_utf8_msg = usbcdc_msg.decode() + uart_x.write("{}".format(usbcdc_utf8_msg)) +``` + +运行上面的脚本代码,便可实现物理 UART2 与 USB CDC PORT 的数据透传。 + + + +## 下载验证 + +下载.py 文件到模组运行: + +![media_UART_2](media/media_UART_2.jpg) + +下载之后,便可实现物理 UARTx 与 USB CDC PORT 的数据透传功能。 + +![media_UART_3](media/media_UART_3.jpg) + + + +## 配套代码 + + + 下载代码 + diff --git a/docs/Advanced_development/zh/QuecPythonCloud/Aliyun.md b/docs/Advanced_development/zh/QuecPythonCloud/Aliyun.md index 823fe79a1785d021442553bb8be5ff779b4fc52b..a0ed340e9329f0f2b8011b0e61fb7f9151c5b7af 100644 --- a/docs/Advanced_development/zh/QuecPythonCloud/Aliyun.md +++ b/docs/Advanced_development/zh/QuecPythonCloud/Aliyun.md @@ -10,27 +10,29 @@ 点击【产品】---【物联网IoT】---【企业物联网平台】 -![](media/579f0beb67f1e0a7daa16ff000d6b33d.png) +![](media/AliyunCloud_IoT_210324_001.png) ### 创建实例 -![](media/f3a6297aa2a71798598892414c41d361.png) +![](media/AliyunCloud_IoT_210324_002.png) -![](media/00e8249a6f31097d6f644a540787cf16.png) +![](media/AliyunCloud_IoT_210324_002A.png) ### 创建产品 -![](media/33a7f4fd4ea75b78b264ea78eaa1c2e6.png) +![](media/AliyunCloud_IoT_210324_003.png) ### 添加设备 -![](media/dc2b5625311e10a79eca5427746c05f5.png) +![](media/AliyunCloud_IoT_210324_004.png) ### 获取三元组 三元组ProductKey、DeviceName、DeviceSecret用于下个步骤生成连接密码 -![](media/0c60712858d58b38683613fbb697dd03.png) +![](media/AliyunCloud_IoT_210324_005.png) + +![](media/AliyunCloud_IoT_210324_006.png) ### 生成连接信息 @@ -42,29 +44,25 @@ http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/attach/189223/cn_zh/160 method加密方式要和连接MQTT时的设置一致。 -![](media/8e92e1660f578af51625aaaf9daf23f8.png) +![](media/AliyunCloud_IoT_210324_007.png) 计算签名后,可获得Password,即可连接平台。 ``` -CLIENT_ID = b'22222\|securemode=3,signmethod=hmacsha1\|' - +CLIENT_ID = b'Chic_001|securemode=3,signmethod=hmacsha1|' SERVER = b'a1llZotKkCm.iot-as-mqtt.cn-shanghai.aliyuncs.com' - PORT = 1883 - -USER = b'22222&a1llZotKkCm' - -PASSWORD = b'CD31C5E9C8633B174A6E9C2A97D04FCD8EF73BB4' +USER = b'Chic_001&a1llZotKkCm' +PASSWORD = b'EC01986E912222B0A82049A874AF183D0A490E5E' ``` **CLIENT_ID:**格式固定:\${clientId}\|securemode=3,signmethod=hmacsha1\| -​ 完整示例:22222\|securemode=3,signmethod=hmacsha1\| +​ 完整示例:Chic_001\|securemode=3,signmethod=hmacsha1\| **USER:**固定格式:\${YourDeviceName}&\${YourProductKey} -​ 完整示例:device&alxxxxxxxxx +​ 完整示例:Chic_001&a1llZotKkCm **PASSWORD:**即上面工具生成的字符串 @@ -78,132 +76,99 @@ PASSWORD = b'CD31C5E9C8633B174A6E9C2A97D04FCD8EF73BB4' ​ https://help.aliyun.com/document_detail/40654.html?spm=a2c4g.11186623.2.21.7b967908BJu7SZ -![](media/21a2c497d167773be8850aa506d34eb9.png) +![](media/AliyunCloud_IoT_210324_008.png) ### 上报和下发数据 在上面创建的Topic名称如:test,只要以test/为开头的Topic都可以订阅发布。 -示例Topic如:test、test/123,test/123/ABC +示例Topic如:/broadcast/a1llZotKkCm/123 -![](media/cfd9d30539dcc7bec17d952c04e7d5b6.png) +![](media/AliyunCloud_IoT_210324_009.png) -![](media/7d97c96182cd7cba909f2f8110af2195.png) +![](media/AliyunCloud_IoT_210324_010.png) ## 软件设计 -在AliyunCloud平台取得UserName、Password、ClientID之后,即可在umqtt连接云平台,连接云平台的地址和端口固定不变,因此在程序中设定相应连接信息之后,就可以运行实验了。 +​ 在AliyunCloud平台取得ProductKey、DeviceName、DeviceSecret之后,即可使用aLiYun套件连接云平台,连接云平台的地址和端口固定不变,因此在程序中设定相应连接信息之后,就可以运行实验了。 示例代码: ```python -from umqtt import MQTTClient - -import modem - -CLIENT_ID = b'22222|securemode=3,signmethod=hmacsha1|' - -SERVER = b'a1llZotKkCm.iot-as-mqtt.cn-shanghai.aliyuncs.com' - -PORT = 1883 - -USER = b'22222&a1llZotKkCm' - -PASSWORD = b'CD31C5E9C8633B174A6E9C2A97D04FCD8EF73BB4' +import log +import utime +import checkNet +from aLiYun import aLiYun -IMEI = None # modem.getDevImei() +''' +下面两个全局变量是必须有的,用户可以根据自己的实际项目修改下面两个全局变量的值, +在执行用户代码前,会先打印这两个变量的值。 +''' +PROJECT_NAME = "QuecPython_AliYin_example" +PROJECT_VERSION = "1.0.0" +checknet = checkNet.CheckNetwork(PROJECT_NAME, PROJECT_VERSION) -SUB_TOPIC = '/broadcast/a1llZotKkCm/{}' -PUB_TOPIC = SUB_TOPIC +# 设置日志输出级别 +log.basicConfig(level=log.INFO) +aliYun_log = log.getLogger("ALiYun") -def GetDevImei(): +productKey = "a1llZotKkCm" # 产品标识(参照阿里云应用开发指导) +productSecret = None # 产品密钥(使用一机一密认证时此参数传入None,参照阿里云应用开发指导) +DeviceName = "11111" # 设备名称(参照阿里云应用开发指导) +# 设备密钥(使用一型一密认证此参数传入None,免预注册暂不支持,需先在云端创建设备,参照阿里云应用开发指导) +DeviceSecret = "03c5e91aea167edead7d381d4b41ed71" - global IMEI +state = 1 - IMEI = modem.getDevImei() +# 回调函数 - print('IMEI:{}'.format(IMEI)) - -state = 0 def sub_cb(topic, msg): - - global state - - print( - - "Subscribe Recv: Topic={},Msg={}".format( - - topic.decode(), - - msg.decode())) - - state = 1 - -def MQTT_Init(): - - # 创建一个mqtt实例 - - c = MQTTClient( - - client_id=CLIENT_ID, - - server=SERVER, - - port=PORT, - - user=USER, - - password=PASSWORD, - - keepalive=30) # 必须要 keepalive=30 ,否则连接不上 - - # 设置消息回调 - - c.set_callback(sub_cb) - - # 建立连接 - - try: - - c.connect() - - except Exception as e: - - print('!!!,e=%s' % e) - - # c.connect() - - # 订阅主题 - - c.subscribe(SUB_TOPIC.format(IMEI)) - - # 发布消息 - - c.publish(PUB_TOPIC.format(IMEI), b"test publish") - - while True: - - c.wait_msg() - - if state == 1: - - break - - # 关闭连接 - - c.disconnect() - -def main(): - - GetDevImei() - - MQTT_Init() - -if __name__ == "__main__": - - main() + global state + aliYun_log.info( + "Subscribe Recv: Topic={},Msg={}".format( + topic.decode(), msg.decode())) + state -= 1 + + +if __name__ == '__main__': + ''' + 手动运行本例程时,可以去掉该延时,如果将例程文件名改为main.py,希望开机自动运行时,需要加上该延时, + 否则无法从CDC口看到下面的 poweron_print_once() 中打印的信息 + ''' + utime.sleep(5) + checknet.poweron_print_once() + ''' + 如果用户程序包含网络相关代码,必须执行 wait_network_connected() 等待网络就绪(拨号成功); + 如果是网络无关代码,可以屏蔽 wait_network_connected() + 【本例程必须保留下面这一行!】 + ''' + checknet.wait_network_connected() + + # 创建aliyun连接对象 + ali = aLiYun(productKey, productSecret, DeviceName, DeviceSecret) + + # 设置mqtt连接属性 + clientID = b'11111clientID' # 自定义字符(不超过64) + ali.setMqtt(clientID, clean_session=False, keepAlive=300) + + # 设置回调函数 + ali.setCallback(sub_cb) + topic = '/broadcast/a1llZotKkCm/123' # 云端自定义或自拥有的Topic + # 订阅主题 + ali.subscribe(topic) + # 发布消息 + ali.publish(topic, "hello world") + # 运行 + ali.start() + + while True: + if state: + pass + else: + ali.disconnect() + break ``` 接下来就可以下载验证了,python代码不需要编译,直接通过QPYcom工具把.py文件下载到模块中运行。 @@ -212,10 +177,10 @@ if __name__ == "__main__": 下载.py文件到模组运行: -![](media/40eb66200d1d4ad0090a1786f8d27579.png) +![](media/AliyunCloud_IoT_210324_011.png) 下载之后,手动让脚本运行起来。 -![](media/be1090df6a3161dd621b541463887a8f.png) +![](media/AliyunCloud_IoT_210324_012.png) ## 配套代码 diff --git a/docs/Advanced_development/zh/QuecPythonCloud/QuecCloud.md b/docs/Advanced_development/zh/QuecPythonCloud/QuecCloud.md index f22211bfe8bad0f0981c50ef9ebf88210e3fb82e..267dae8e65891ab9c1ab8580a8b1e7ef5402b775 100644 --- a/docs/Advanced_development/zh/QuecPythonCloud/QuecCloud.md +++ b/docs/Advanced_development/zh/QuecPythonCloud/QuecCloud.md @@ -1,197 +1,259 @@ -# QuecPython 接入QuecCloud +## 文档历史 -文档主要介绍如何使用QuecCloud移远云,QuecCloud物联网平台,为客户的多种终端设备提供安全可靠的网络快速接入、数据传输、数据存储、数据管理等完整的交互服务。可通过云端调用API实现海量设备和应用的数据传输,达到控制设备和采集数据的目的。 +| **版本** | **日期** | **作者** | **变更表述** | +| -------- | ---------- | -------- | ------------ | +| 1.0 | 2021-04-30 | Chic | 初始版本 | +| 1.1 | 2021-09-08 | Chic | 改为DMP | -下面主要从MQTT连接方式讲解,通过阅读本文,您将了解到QuecPython连接QuecCloud的过程操作和验证实验理论。 -## 云端设置 -移远云首页: +## 登录平台创建项目和产品 -### 进入平台 +设备管理平台:https://iot-cloud.quectel.com/Login -点击【控制台】 +进入链接后的界面如下图所示: -![](media/cf31ba54e8b803da79ad1e8b9fccfa4e.png) +![image-20210908144555513](media\image-20210908144555513.png) -### 创建产品 +点击【立即注册】,选择自己的类型,我这里是“个人开发者”,使用个人邮箱就可以完成注册,然后使用注册的邮箱登录即可。“限制项”的数量上,企业比个人更多,例如项目数量,企业帐号可以创建的项目数500个,而个人账号只能50个。 -![](media/88b354fa6b1122bc4eae448106fdb35e.png) +![image-20210908144623750](media\image-20210908144623750.png) -![](media/01d0bcf1fbf597194344c90c7b58e995.png) +登录之后,可以看到已经创建的项目,我这里有2个项目,点击右侧【新建项目】,建立自己的项目。 -### 添加设备 +![image-20210908144652295](media\image-20210908144652295.png) -![](media/ed3b9173920f4482dfa234c37b3850e7.png) +只需输入“项目名称”,点击【确认】,即可完成项目新建。 -进入【设备列表】后,点击【+添加设备】 +![image-20210908144718362](media\image-20210908144718362.png) -![](media/ee86dd4eeaf37ec47d9a51073c1ca133.png) +点击左侧上一步创建的项目,查看项目下的产品。 -![](media/440b41bd014245ad52d9f4680babcbac.png) +![image-20210908144746546](media\image-20210908144746546.png) -IMEI在模组的丝印面上可以找到,也可以通过AT指令“AT+GSN”读取。 +进入项目页面后,新页面中看到项目下的“产品”,点击右侧【创建产品】,新建产品类型。 -至此,手动添加设备已经完成。 +![image-20210908144806929](media\image-20210908144806929.png) -![](media/642222a1f350d8d00ea7df18a97d1da9.png) +输入“产品名称”,选择产品类型只对物模型产品数据有效,这里我们创建透传产品,透传数据方式通信。 -### 获取Secret +![image-20210908144838204](media\image-20210908144838204.png) -在设备详情页面里面记下Secret,用于连接移远云平台。 +点击【下一步】,选择产品所用的模组型号,点【确认选择】,方便自己管理各个项目,如果没有自己的模组选择,则点击【直接跳过】。 -![](media/56bc1e7957122a00bd028918c3bb5d18.png) +![image-20210908144859977](media\image-20210908144859977.png) -批量时可通过API接口获取Secret,用于连接移远云平台 +完成创建产品后,可以看到刚才建立的产品信息。 -文档中心说明:[https://iot.quectel.com/doc_getStart.html\#api_AcquireTheInformation](https://iot.quectel.com/doc_getStart.html#api_AcquireTheInformation) +![image-20210908144924732](media\image-20210908144924732.png) -![](media/5cb4cffb7b4e9f1d2464ee487f5f1544.png) +上方显示: -### 生成连接信息 +产品总数:项目下的产品数量; -``` -CLIENT_ID = IMEI +项目激活码数:项目下的总设备激活码数,每激活一个设备消耗一个激活码; -SERVER = b"southbound.quectel.com" +已激活设备数:新增的设备初始状态是未激活,当设备发送上下行消息超过1000条时,设备状态由“未激活”变成“激活”。 -PORT = 1883 +当前在线设备数:显示当前连接上平台的设备数量。 -USER = IMEI + -PASSWORD = b '7fe0570d91f2ef2bcd4d5683f68521e5' -``` +这里有两个产品,一个PaaS透传产品,支持直接透传数据;另一个是JSON物模型产品,支持在平台定义它的功能。 -**CLIENT_ID:**固定为IMEI +![image-20210908144949454](media\image-20210908144949454.png) -**SERVER:**固定为"southbound.quectel.com" +点击产品名称进入查看“产品信息” -**PORT:**固定为1883 +【基本信息】重点注意ProductKey、ProductSecret在模组连接平台时用到,数据格式是“透传/自定义”则是PaaS透传产品;如果数据格式是“JSON(标准数据格式)”属于JSON通信物模型产品。 -**USER:**固定为IMEI +![image-20210908145010988](media\image-20210908145010988.png) -**PASSWORD:**上一步骤获取的Secret -### 上报和下发数据 -调试设备时,上传、下发的数据都可以在【设备详情】---【数据交互】查看: +## QuecPython设备连接设备管理平台 -![](media/a77c5bba88013408eb44dde38f358938.png) +下面介绍用QuecPython代码在模组上连接平台。 -## 软件设计 +连接设备至“设备管理平台” -在QuecCloud平台取得Secret之后,即可在umqtt连接云平台,模块的IMEI在代码中自动获取,其IMEI号和Secret号码在平台中添加的设备一一对应,连接云平台的地址和端口固定不变,因此在程序中设定Secret的值之后,就可以运行实验了。 +1)设备上电后首先导入quecIot模块,[初始化Quecthing](https://iot-cloud.quectel.com/help?id=3010)。 -示例代码: +​ import quecIot -```python -from umqtt import MQTTClient +​ quecIot.init() -import modem +2)根据产品需要[配置云平台通信协议和引导/认证服务器](https://iot-cloud.quectel.com/help?id=3013),若不配置,则使用默认的通信协议和服务器地址。 -import utime +​ quecIot.setServer(1,"iot-south.quectel.com:2883") -import _thread +3)根据在云平台创建时获取到的产品信息,[配置云平台产品信息](https://iot-cloud.quectel.com/help?id=3013)。 + +​ quecIot.setProductinfo("p11169","QlZ**********WJR") + +4)根据产品需要,[配置云平台lifetime](https://iot-cloud.quectel.com/help?id=3013),若不配置,则使用默认的lifetime(MQTT:120)。 + +​ quecIot.setLifetime(120) + +5)根据产品需要[配置云平台PDP Context ID](https://iot-cloud.quectel.com/help?id=3013),若不配置,则使用默认的PDP Conecte ID(1)。 -IMEI = None # modem.getDevImei() +​ quecIot.setPdpContextId(1) -Secret = '7fe0570d91f2ef2bcd4d5683f68521e5' +6)根据产品需要[配置云平台自动连接模式](https://iot-cloud.quectel.com/help?id=3011),若不配置,则默认不连接云平台。 -address = "southbound.quectel.com" +​ quecIot.setConnmode(1) -Port = 1883 +7)注册[云平台事件接收回调函数](https://iot-cloud.quectel.com/help?id=3016),根据回调事件判断云平台当前连接状态。 -def GetDevImei(): +​ quecIot.setEventCB(queciot_even_cb) - global IMEI + - IMEI = modem.getDevImei() +【设备管理】可以查看该产品下已注册的设备及设备基本详情,同时支持对设备的删除及二次认证。 - #print(IMEI) +![image-20210908145043964](media\image-20210908145043964.png) -state = 0 +点击设备列表中右侧的“查看”,进入设备详细里面的“设备调试” -def sub_cb(topic, msg): +![image-20210908145113011](media\image-20210908145113011.png) - global state - print( - "Subscribe Recv: Topic={},Msg={}".format( +## 软件设计 - topic.decode(), +示例代码: - msg.decode())) +```python +import quecIot +import _thread +import utime - state = 1 +key = "p111bP" # 填入产品key +src = "NlU1VFdpN29OOGpW" # 填入产品密钥 + +class Quecthing: + def __init__(self): + # ''' 初始化qucsdk ''' + quecIot.init() + # ''' 注册事件回调函数 ''' + quecIot.setEventCB(self.eventCB) + # ''' 配置产品信息''' + quecIot.setProductinfo(key, src) + # ''' 启动云平台连接 ''' + quecIot.setConnmode(1) + return + + @staticmethod + def eventCB(data): + print("event:", data) + event = data[0] + errcode = data[1] + if len(data) > 2: + data = data[2] + + if event == 1: # 发送数据操作 + if errcode == 10200: + print('设备认证成功') + elif errcode == 10422: + print('设备已认证(连接失败)') + elif event == 2: # 接入操作 + if errcode == 10200: + print('接入成功') + elif event == 3: # 发送数据操作 + if errcode == 10200: + print('订阅成功') + elif event == 4: # 发送数据操作 + if errcode == 10200: + print('数据发送成功') + elif event == 5: # 接收数据操作 + if errcode == 10210: + print('透传数据') + print(data) + if errcode == 10210: + print('接收数据操作') + elif errcode == 10211: + print('平台读取数据') + elif event == 6: # 接入操作 + if errcode == 10200: + print('注销成功(断开连接成功)') + elif event == 7: # FOTA操作 + if errcode == 10700: + print('有升级任务,为配置信息') + +def QuecIot_passTransSend(): + while True: + quecIot.passTransSend(1, 'Chic') + utime.sleep_ms(2000) + + print('QuecIot_passTransSend') + +if __name__ == '__main__': + Quecthing() + _thread.start_new_thread(QuecIot_passTransSend, ()) +``` -def MQTT_Init(): +接下来就可以下载验证了,python代码不需要编译,直接通过QPYcom工具把.py文件下载到模块中运行。 - # 创建一个mqtt实例 - c = MQTTClient( - IMEI, +## 设备调试进阶 - address, +【设备管理】可以查看该产品下已注册的设备及设备基本详情,同时支持对设备的删除及二次认证。 - Port, +![image-20210908145154238](media\image-20210908145154238.png) - user=IMEI, +点击设备列表中右侧的“查看”,进入设备详细。 - password=Secret) +【设备信息】物模型产品时可上报信息给平台。 - # 设置消息回调 +![image-20210908145218946](media\image-20210908145218946.png) - c.set_callback(sub_cb) - - # 建立连接 +譬如:电量、电源电压、信号强度等,模组上报的信息都在这个页面显示。 - c.connect() +【数据日志】中记录的是模组上传的每一条数据内容,在“数据内容”中点击“查看”,选择模组上传的同时支持HexString、Base64、Text等三种数据格式。 - # 订阅主题 +![image-20210908145242463](media\image-20210908145242463.png) - c.subscribe('quec/{}/down'.format(IMEI)) +![image-20210908145258810](media\image-20210908145258810.png) - # 发布消息 +【事件日志】中记录的是模组每次上线、下线等活动的事件。 - c.publish('quec/{}/up'.format(IMEI), b"test publish") +![image-20210908145320185](media\image-20210908145320185.png) - while True: +【运行状态】仅在物模型产品时有效。 - c.wait_msg() +【服务调用】仅在物模型产品时有效。 - if state == 1: +【设备调试】在透传设备的设备调试中,有Hex和Text两种数据格式的发送调试。Hex表示十六进制,Text是字符串文本格式。右侧“通信日志”实时显示上行、下行的信息,点击“查看详细”可查看Hex或Text数据。 - break +![image-20210908145340796](media\image-20210908145340796.png) - # 关闭连接 +下行数据->模组:Hex - c.disconnect() +![image-20210908145400060](media\image-20210908145400060.png) -def main(): +![image-20210908145421993](media\image-20210908145421993.png) - GetDevImei() +下行数据->模组:Text - MQTT_Init() +![image-20210908145443414](media\image-20210908145443414.png) -if __name__ == "__main__": +![image-20210908145502660](media\image-20210908145502660.png) - main() -``` +上行数据->平台: -接下来就可以下载验证了,python代码不需要编译,直接通过QPYcom工具把.py文件下载到模块中运行。 +模组中的代码每两秒上传一次数据。 + +![image-20210908145524093](media\image-20210908145524093.png) + +![image-20210908145541260](media\image-20210908145541260.png) -## 下载验证 -下载.py文件到模组运行: -![](media/0d9c74f77ca83805912f29392d23cf08.png) +友情链接 -下载之后,手动让脚本运行起来。 +设备管理平台:https://iot-cloud.quectel.com/Login -![](media/7404fb362b289bcd55a5d50aa25c8546.png) -![](media/20cb75f8677c6c8c4f54642e400036d9.png) ## 配套代码 diff --git a/docs/Advanced_development/zh/QuecPythonCloud/TencentCloud.md b/docs/Advanced_development/zh/QuecPythonCloud/TencentCloud.md index 2d9265c1fc1f0294bdd7b218314f6ab056d22b9f..d7f5b784a7530ce0495284ae1c3ea3c1491debfb 100644 --- a/docs/Advanced_development/zh/QuecPythonCloud/TencentCloud.md +++ b/docs/Advanced_development/zh/QuecPythonCloud/TencentCloud.md @@ -8,7 +8,7 @@ ### 进入平台 -点击左上角的“控制台” +点击右上角的“控制台” ![](media/24a89c0909a160b38a301d4ca2876df9.png) diff --git a/docs/Advanced_development/zh/QuecPythonCloud/code/AliyunCloud_IoT.py b/docs/Advanced_development/zh/QuecPythonCloud/code/AliyunCloud_IoT.py index 75d23ea968072a5535843d7619e9ab94bf196b92..9f3908c7f61f49da9e276529c182df61beeeb287 100644 --- a/docs/Advanced_development/zh/QuecPythonCloud/code/AliyunCloud_IoT.py +++ b/docs/Advanced_development/zh/QuecPythonCloud/code/AliyunCloud_IoT.py @@ -1,75 +1,75 @@ -# 实验1: AliyunCloud 实验 -# API资料参考连接: https://python.quectel.com/wiki/api/#umqtt-mqtt +import log +import utime +import checkNet +from aLiYun import aLiYun -from umqtt import MQTTClient -import modem +''' +下面两个全局变量是必须有的,用户可以根据自己的实际项目修改下面两个全局变量的值, +在执行用户代码前,会先打印这两个变量的值。 +''' +PROJECT_NAME = "QuecPython_AliYin_example" +PROJECT_VERSION = "1.0.0" +checknet = checkNet.CheckNetwork(PROJECT_NAME, PROJECT_VERSION) -CLIENT_ID = b'22222|securemode=3,signmethod=hmacsha1|' -SERVER = b'a1llZotKkCm.iot-as-mqtt.cn-shanghai.aliyuncs.com' -PORT = 1883 -USER = b'22222&a1llZotKkCm' -PASSWORD = b'CD31C5E9C8633B174A6E9C2A97D04FCD8EF73BB4' -IMEI = None # modem.getDevImei() -SUB_TOPIC = '/broadcast/a1llZotKkCm/{}' -PUB_TOPIC = SUB_TOPIC +# 设置日志输出级别 +log.basicConfig(level=log.INFO) +aliYun_log = log.getLogger("ALiYun") +productKey = "a1llZotKkCm" # 产品标识(参照阿里云应用开发指导) +productSecret = None # 产品密钥(使用一机一密认证时此参数传入None,参照阿里云应用开发指导) +DeviceName = "11111" # 设备名称(参照阿里云应用开发指导) +# 设备密钥(使用一型一密认证此参数传入None,免预注册暂不支持,需先在云端创建设备,参照阿里云应用开发指导) +DeviceSecret = "03c5e91aea167edead7d381d4b41ed71" -def GetDevImei(): - global IMEI - IMEI = modem.getDevImei() - print('IMEI:{}'.format(IMEI)) +state = 1 - -state = 0 +# 回调函数 def sub_cb(topic, msg): global state - print( + aliYun_log.info( "Subscribe Recv: Topic={},Msg={}".format( - topic.decode(), - msg.decode())) - state = 1 - - -def MQTT_Init(): - # 创建一个mqtt实例 - c = MQTTClient( - client_id=CLIENT_ID, - server=SERVER, - port=PORT, - user=USER, - password=PASSWORD, - keepalive=30) # 必须要 keepalive=30 ,否则连接不上 - # 设置消息回调 - c.set_callback(sub_cb) - # 建立连接 - try: - c.connect() - except Exception as e: - print('!!!,e=%s' % e) - return - # c.connect() + topic.decode(), msg.decode())) + state -= 1 + + +if __name__ == '__main__': + ''' + 手动运行本例程时,可以去掉该延时,如果将例程文件名改为main.py,希望开机自动运行时,需要加上该延时, + 否则无法从CDC口看到下面的 poweron_print_once() 中打印的信息 + ''' + utime.sleep(5) + checknet.poweron_print_once() + ''' + 如果用户程序包含网络相关代码,必须执行 wait_network_connected() 等待网络就绪(拨号成功); + 如果是网络无关代码,可以屏蔽 wait_network_connected() + 【本例程必须保留下面这一行!】 + ''' + checknet.wait_network_connected() + + # 创建aliyun连接对象 + ali = aLiYun(productKey, productSecret, DeviceName, DeviceSecret) + + # 设置mqtt连接属性 + clientID = b'11111clientID' # 自定义字符(不超过64) + ali.setMqtt(clientID, clean_session=False, keepAlive=300) + + # 设置回调函数 + ali.setCallback(sub_cb) + topic = '/broadcast/a1llZotKkCm/123' # 云端自定义或自拥有的Topic # 订阅主题 - c.subscribe(SUB_TOPIC.format(IMEI)) + ali.subscribe(topic) # 发布消息 - c.publish(PUB_TOPIC.format(IMEI), b"test publish") + ali.publish(topic, "hello world") + # 运行 + ali.start() while True: - c.wait_msg() - if state == 1: + if state: + pass + else: + ali.disconnect() break - - # 关闭连接 - c.disconnect() - - -def main(): - GetDevImei() - MQTT_Init() - - -if __name__ == "__main__": - main() diff --git a/docs/Advanced_development/zh/QuecPythonCloud/code/QuecIoTCloud.py b/docs/Advanced_development/zh/QuecPythonCloud/code/QuecIoTCloud.py new file mode 100644 index 0000000000000000000000000000000000000000..751dcd08f368f85ddce664f904e34ab643e4bbb2 --- /dev/null +++ b/docs/Advanced_development/zh/QuecPythonCloud/code/QuecIoTCloud.py @@ -0,0 +1,64 @@ +import quecIot +import quecTtlv + +key = "p1116T" # 填入产品key +src = "bGpkVnordkFodFZj" # 填入产品密钥 + +DEF_ID_TYPE = ['0', '温度', '湿度', '光照'] +DEF_DATA_TYPE0 = 'bool' +DEF_DATA_TYPE1 = 'num' +DEF_DATA_TYPE2 = 'byte' +DEF_DATA_TYPE3 = 'struct' +DEF_DATA_TYPE = [ + DEF_DATA_TYPE0, + DEF_DATA_TYPE1, + DEF_DATA_TYPE2, + DEF_DATA_TYPE3] +# 0 布尔 +# 1 数值 +# 2 Byt +# 3 结构体 + + +class Quecthing: + def __init__(self): + # ''' 初始化qucsdk ''' + quecIot.init() + # ''' 注册事件回调函数 ''' + quecIot.setEventCB(self.eventCB) + # ''' 配置产品信息''' + quecIot.setProductinfo(key, src) + # ''' 配置服务器信息,可选,默认连接MQTT生产环境服务器 ''' + # quecIot.setServer(1, "http://iot-south.quectel.com:2883") + # ''' 配置PDP context Id,可选,默认为1 ''' + # quecIot.setPdpContextId(1) + # ''' 配置lifetime,可选,MQTT默认为120 ''' + # quecIot.setLifetime(120) + # ''' 配置外部MCU标识号和版本号,可选,如没有外部MCU则不需要配置 ''' + # quecIot.setMcuVersion("MCU1", "1_0_0") + # ''' 启动云平台连接 ''' + quecIot.setConnmode(1) + return + + @staticmethod + def eventCB(data): + print("event:", data) + + if 5 == data[0] and 10210 == data[1]: + data = data[2] + listret = quecTtlv.nodeGet(data) + print(listret) + listretlen = len(listret) + for i in range(listretlen): + id = listret[i][0] + type = listret[i][1] + if DEF_DATA_TYPE[type] == DEF_DATA_TYPE0: + ret = quecTtlv.idGetBool(data, id) + print(DEF_ID_TYPE[id], ret) + elif DEF_DATA_TYPE[type] == DEF_DATA_TYPE1: + ret = quecTtlv.idGetNum(data, id) + print(DEF_ID_TYPE[id], ret) + + +if __name__ == '__main__': + Quecthing() diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/AliyunCloud_IoT_210324_001.png b/docs/Advanced_development/zh/QuecPythonCloud/media/AliyunCloud_IoT_210324_001.png new file mode 100644 index 0000000000000000000000000000000000000000..275a04a2c06c5f40ab346be17eb467533e84c76d Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/AliyunCloud_IoT_210324_001.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/AliyunCloud_IoT_210324_002.png b/docs/Advanced_development/zh/QuecPythonCloud/media/AliyunCloud_IoT_210324_002.png new file mode 100644 index 0000000000000000000000000000000000000000..1ea252d0fc741f5f827190e0e0226a12d560d355 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/AliyunCloud_IoT_210324_002.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/AliyunCloud_IoT_210324_002A.png b/docs/Advanced_development/zh/QuecPythonCloud/media/AliyunCloud_IoT_210324_002A.png new file mode 100644 index 0000000000000000000000000000000000000000..c2b9341c1d88f306decb80b5f374390c9af14159 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/AliyunCloud_IoT_210324_002A.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/AliyunCloud_IoT_210324_003.png b/docs/Advanced_development/zh/QuecPythonCloud/media/AliyunCloud_IoT_210324_003.png new file mode 100644 index 0000000000000000000000000000000000000000..9a3b3664300a19d9633f7f2799a62b4e1f113d24 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/AliyunCloud_IoT_210324_003.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/AliyunCloud_IoT_210324_004.png b/docs/Advanced_development/zh/QuecPythonCloud/media/AliyunCloud_IoT_210324_004.png new file mode 100644 index 0000000000000000000000000000000000000000..f52880d0c6ac4f92c3fddf633cd0477a3f6a28da Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/AliyunCloud_IoT_210324_004.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/AliyunCloud_IoT_210324_005.png b/docs/Advanced_development/zh/QuecPythonCloud/media/AliyunCloud_IoT_210324_005.png new file mode 100644 index 0000000000000000000000000000000000000000..66d66e980f1a9744569da5ccc245c42fc69f34fe Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/AliyunCloud_IoT_210324_005.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/AliyunCloud_IoT_210324_006.png b/docs/Advanced_development/zh/QuecPythonCloud/media/AliyunCloud_IoT_210324_006.png new file mode 100644 index 0000000000000000000000000000000000000000..9f17684074e74a616ba212c1821c143139bc19f8 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/AliyunCloud_IoT_210324_006.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/AliyunCloud_IoT_210324_007.png b/docs/Advanced_development/zh/QuecPythonCloud/media/AliyunCloud_IoT_210324_007.png new file mode 100644 index 0000000000000000000000000000000000000000..b67a870232d0783407f6484f0f89594f0f09b509 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/AliyunCloud_IoT_210324_007.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/AliyunCloud_IoT_210324_008.png b/docs/Advanced_development/zh/QuecPythonCloud/media/AliyunCloud_IoT_210324_008.png new file mode 100644 index 0000000000000000000000000000000000000000..ab1c297875ac5aae8176694152c5f11d35002d1e Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/AliyunCloud_IoT_210324_008.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/AliyunCloud_IoT_210324_009.png b/docs/Advanced_development/zh/QuecPythonCloud/media/AliyunCloud_IoT_210324_009.png new file mode 100644 index 0000000000000000000000000000000000000000..9135c8e237116aa32bb1d8ce7efc5875ab4c026e Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/AliyunCloud_IoT_210324_009.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/AliyunCloud_IoT_210324_010.png b/docs/Advanced_development/zh/QuecPythonCloud/media/AliyunCloud_IoT_210324_010.png new file mode 100644 index 0000000000000000000000000000000000000000..fc098834adec4d916f668ae85c87db4075880e5b Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/AliyunCloud_IoT_210324_010.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/AliyunCloud_IoT_210324_011.png b/docs/Advanced_development/zh/QuecPythonCloud/media/AliyunCloud_IoT_210324_011.png new file mode 100644 index 0000000000000000000000000000000000000000..0f43d769e739ce8e4b432e625891f194ab5ac922 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/AliyunCloud_IoT_210324_011.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/AliyunCloud_IoT_210324_012.png b/docs/Advanced_development/zh/QuecPythonCloud/media/AliyunCloud_IoT_210324_012.png new file mode 100644 index 0000000000000000000000000000000000000000..7449980c169dafd0f3c24781d24842fc5da5434c Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/AliyunCloud_IoT_210324_012.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_01.png b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_01.png new file mode 100644 index 0000000000000000000000000000000000000000..614a7b8539bad8485a9e1accb0b02fc8a60ac224 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_01.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_02.png b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_02.png new file mode 100644 index 0000000000000000000000000000000000000000..9e54b39bef6c5aa6290ecd7cb8d9166d311cef07 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_02.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_03.png b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_03.png new file mode 100644 index 0000000000000000000000000000000000000000..5c7244c13aeaec346556e336a840a800bea49cc9 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_03.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_04.png b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_04.png new file mode 100644 index 0000000000000000000000000000000000000000..456ae8874d0e9ecaa2a1f36de1ff6c9833515bb4 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_04.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_05.png b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_05.png new file mode 100644 index 0000000000000000000000000000000000000000..1d58fbee9a8a7a280af8963383a3b01aa0f7b9a6 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_05.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_06.png b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_06.png new file mode 100644 index 0000000000000000000000000000000000000000..6543f10084c45867b7d9e0e4265e74292842cfe2 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_06.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_07.png b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_07.png new file mode 100644 index 0000000000000000000000000000000000000000..0b913c4e90ff7a5f2ef00179ce4989ffcfbf6833 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_07.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_08.png b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_08.png new file mode 100644 index 0000000000000000000000000000000000000000..224e2ee147ee984e863b9618e7e1077d2a891e9b Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_08.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_09.png b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_09.png new file mode 100644 index 0000000000000000000000000000000000000000..5925e10ac2dee7a6a339d334711f54b517d6c8a5 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_09.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_10.png b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_10.png new file mode 100644 index 0000000000000000000000000000000000000000..a8fde8c7554ca55fc6c5117c0db30f6af328064b Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_10.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_11.png b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_11.png new file mode 100644 index 0000000000000000000000000000000000000000..dfc0b493ef3a8724ac1e8ca5445cb4118780bb4e Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_11.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_12.png b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_12.png new file mode 100644 index 0000000000000000000000000000000000000000..cdf32912a2dfd94260ccbd056f12f2b0e904f75f Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_12.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_13.png b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_13.png new file mode 100644 index 0000000000000000000000000000000000000000..72d27d648e44b8a284ac7864184c6bc45107f13a Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_13.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_14.png b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_14.png new file mode 100644 index 0000000000000000000000000000000000000000..a58c4a7402112b3d3bda32861967e964d2d0e315 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_14.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_15.png b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_15.png new file mode 100644 index 0000000000000000000000000000000000000000..a8fde8c7554ca55fc6c5117c0db30f6af328064b Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_15.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_16.png b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_16.png new file mode 100644 index 0000000000000000000000000000000000000000..2631c4c57384aa68616709e6c1befdc9e6c4bbf1 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_16.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_17.png b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_17.png new file mode 100644 index 0000000000000000000000000000000000000000..84f311855a2616d3ac3bb09f84403665c168daab Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_17.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_18.png b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_18.png new file mode 100644 index 0000000000000000000000000000000000000000..9d898906b29096e18d897457e5c516250eb26919 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_18.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_19.png b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_19.png new file mode 100644 index 0000000000000000000000000000000000000000..c8fdd43eee6fadbd4baebece11b9f2ad346d7e8d Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/QuecPythonCloud_210430_19.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908144555513.png b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908144555513.png new file mode 100644 index 0000000000000000000000000000000000000000..026ba95620766a123e22a6df751fcd388d7f1e3d Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908144555513.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908144623750.png b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908144623750.png new file mode 100644 index 0000000000000000000000000000000000000000..da6799cb1112c35753a1fa079898a415f7dff8bb Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908144623750.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908144652295.png b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908144652295.png new file mode 100644 index 0000000000000000000000000000000000000000..399eaf19585e353fc309065f9644c2d9ce777336 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908144652295.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908144718362.png b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908144718362.png new file mode 100644 index 0000000000000000000000000000000000000000..2352921d73b8b66ddb6e1e05b3d9e589e5c64a1a Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908144718362.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908144746546.png b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908144746546.png new file mode 100644 index 0000000000000000000000000000000000000000..84c60efc5461d6f00ccf3f55a7c167ff27f5e461 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908144746546.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908144806929.png b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908144806929.png new file mode 100644 index 0000000000000000000000000000000000000000..f80f49444f4e9298fdcbfdc8313e43b8ad2d1a4b Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908144806929.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908144838204.png b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908144838204.png new file mode 100644 index 0000000000000000000000000000000000000000..baa9072a8a6c61aa582cac3150722ab087995976 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908144838204.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908144859977.png b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908144859977.png new file mode 100644 index 0000000000000000000000000000000000000000..90c8ce51663ad504cd39f0417824729f4a2f0452 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908144859977.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908144924732.png b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908144924732.png new file mode 100644 index 0000000000000000000000000000000000000000..6fe539b31633b5f9a2086c9abd7c86e402c3b6a7 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908144924732.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908144949454.png b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908144949454.png new file mode 100644 index 0000000000000000000000000000000000000000..4ad9a908289836865a86998390041a6fd54387c1 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908144949454.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145010988.png b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145010988.png new file mode 100644 index 0000000000000000000000000000000000000000..774f4f781b11aece7284e93981547f481d54d281 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145010988.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145043964.png b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145043964.png new file mode 100644 index 0000000000000000000000000000000000000000..b77e0c2340203694bc57883469b451da258f226a Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145043964.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145113011.png b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145113011.png new file mode 100644 index 0000000000000000000000000000000000000000..3f2e1a14d4adb34efb608c5ab3296a3ca414bd8c Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145113011.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145154238.png b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145154238.png new file mode 100644 index 0000000000000000000000000000000000000000..b77e0c2340203694bc57883469b451da258f226a Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145154238.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145218946.png b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145218946.png new file mode 100644 index 0000000000000000000000000000000000000000..b7a21c0c6068d678615916565f8042c9c5c29447 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145218946.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145242463.png b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145242463.png new file mode 100644 index 0000000000000000000000000000000000000000..c92b8ced1d55b36b95f8d58b83bb1f9293cfa84e Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145242463.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145258810.png b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145258810.png new file mode 100644 index 0000000000000000000000000000000000000000..d12e249e734d2be127133921c045518ee4ea4a93 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145258810.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145320185.png b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145320185.png new file mode 100644 index 0000000000000000000000000000000000000000..8c277487c200f869ddf6a298fd2b616441ae3d28 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145320185.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145340796.png b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145340796.png new file mode 100644 index 0000000000000000000000000000000000000000..ff6a35ca4803fc647e4d742ee7f6e6dd6f4cc6c4 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145340796.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145400060.png b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145400060.png new file mode 100644 index 0000000000000000000000000000000000000000..719e3f1d48b2f4702fbab1e40c436c80c746c571 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145400060.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145421993.png b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145421993.png new file mode 100644 index 0000000000000000000000000000000000000000..d4bb7cad2dea504fcaf11a3ba8eb434b7b542879 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145421993.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145443414.png b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145443414.png new file mode 100644 index 0000000000000000000000000000000000000000..d0965ca07c8c32a548274d937f9569ecb2cee6d3 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145443414.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145502660.png b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145502660.png new file mode 100644 index 0000000000000000000000000000000000000000..27ee96134c8557d1023f4c0e165e055b7f3d983c Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145502660.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145524093.png b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145524093.png new file mode 100644 index 0000000000000000000000000000000000000000..a3473083da780dcee7d3643d37cd042ad21d0619 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145524093.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145541260.png b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145541260.png new file mode 100644 index 0000000000000000000000000000000000000000..49183b8429431740f4096b3beecd937781c069d4 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/image-20210908145541260.png differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/wps1.jpg b/docs/Advanced_development/zh/QuecPythonCloud/media/wps1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..56cd38b80ebba67a899ccbd810a02fa32cef3293 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/wps1.jpg differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/wps2.jpg b/docs/Advanced_development/zh/QuecPythonCloud/media/wps2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0ba1dacc002d81c79094d3e6ff7127f7aadacb21 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/wps2.jpg differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/wps3.jpg b/docs/Advanced_development/zh/QuecPythonCloud/media/wps3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fa96a12b3a63757f5553ef2b021c5f3758f3d8f8 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/wps3.jpg differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/wps4.jpg b/docs/Advanced_development/zh/QuecPythonCloud/media/wps4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f4113a12eddef9d9b4249827a934fba91b835634 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/wps4.jpg differ diff --git a/docs/Advanced_development/zh/QuecPythonCloud/media/wps5.jpg b/docs/Advanced_development/zh/QuecPythonCloud/media/wps5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b9a514b8bd72f38af5eb6efd708766b9493ce9fe Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonCloud/media/wps5.jpg differ diff --git a/docs/Advanced_development/zh/QuecPythonSub/Audio.md b/docs/Advanced_development/zh/QuecPythonSub/Audio.md deleted file mode 100644 index 0787be9282b34324908b607c0720f14eaf4720fb..0000000000000000000000000000000000000000 --- a/docs/Advanced_development/zh/QuecPythonSub/Audio.md +++ /dev/null @@ -1,155 +0,0 @@ -# QuecPython Audio模块开发 - -## API简介 - -本文以EC600S-CN模块为例,主要介绍QuecPython Audio模块中Audio 的使用。该模块可以用于播放mp3 、wav等格式的文件,包含的API有: - -- ​ **audio.Audio(device)** -- ​ **aud.play(priority, breakin, filename)** -- ​ **aud.stop()** -- ​ **aud.setCallback(usrFun)** -- ​ **aud.getState()** -- ​ **aud.getVolume()** -- ​ **aud.setVolume(vol)** - -具体的API 详解请参考[QuecPython-audio - 音频播放](https://python.quectel.com/wiki/api/#audio) - -本文档适用于移远通信如下模块: - -- EC100Y-CN -- EC600S-CN - - - -## 使用Audio播放声音 - -本文所示代码使用的硬件版本为 EC600S-CN V1.1。 开发板播放声音需要外接喇叭, 具体的喇叭参数以及连接方法请参考《音频播放小实验手册》。 - - - -### 播放mp3 - -1. 将随包的 example_maonv.mp3 的文件下载进开发板。 - -2. 然后将下面的代码烧录进去。 - -```python -# -*- coding: UTF-8 -*- - -import utime as time -import audio -from machine import Pin - - -def example_audio_mp3(): - ''' - 外接喇叭播放录音文件,参数选择0 - ''' - aud = audio.Audio(0) - ''' - 使能外接喇叭播放 - ''' - Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) - # U: 表示用户目录, GUI下载工具会将文件下载到 /usr 文件下 - aud.play(2, 1, "U:/example_maonv.mp3") - pass - - -if __name__ == "__main__": - example_audio_mp3() - -``` - -3. 运行python 脚本即可。 - - - -### 播放wav文件 - -1. 将随包的example_haixiu.wav 的文件下载进开发板。 -2. 将以下代码烧录进入开发板。 - -```python -# -*- coding: UTF-8 -*- - -import utime as time -import audio -from machine import Pin - - -def example_audio_wav(): - ''' - 外接喇叭播放录音文件,参数选择0 - ''' - aud = audio.Audio(0) - ''' - 使能外接喇叭播放 - ''' - Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) - # U: 表示用户目录, GUI下载工具会将文件下载到 /usr 文件下 - aud.play(2, 1, "U:/example_haixiu.wav") - pass - - -if __name__ == "__main__": - example_audio_wav() - -``` - - - -### 播放过程中切换音量 - -以上我们展示了基本的播放操作。 下面我们展示如何在播放过程中切换音量。添加一个回调函数, 判断播放状态。 - -```python -# -*- coding: UTF-8 -*- - -import utime as time -import urandom as random -import audio -from machine import Pin - -exited = True - - -def audio_cb(event): - global exited - # 7表示播放完毕 - if event == 7: - exited = False - print('audio-play finish.') - - -def example_audio_mp3(): - global exited - ''' - 外接喇叭播放录音文件,参数选择0 - ''' - aud = audio.Audio(0) - ''' - 使能外接喇叭播放 - ''' - Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) - aud.setCallback(audio_cb) - for i in range(3): # 演示3次 - # U: 表示用户目录, GUI下载工具会将文件下载到 /usr 文件下 - aud.play(2, 1, "U:/example_maonv.mp3") - while exited: - aud.setVolume(random.randint(6, 11)) - time.sleep_ms(500) - exited = True - - print("example_audio_mp3 has exit") - - -if __name__ == "__main__": - example_audio_mp3() - -``` - -## 配套代码 - - - - 下载代码和音频文件 \ No newline at end of file diff --git a/docs/Advanced_development/zh/QuecPythonSub/Digital_tube.md b/docs/Advanced_development/zh/QuecPythonSub/Digital_tube.md new file mode 100644 index 0000000000000000000000000000000000000000..cbfd3b5ca727110c053a7ae66d542914c0ba48c2 --- /dev/null +++ b/docs/Advanced_development/zh/QuecPythonSub/Digital_tube.md @@ -0,0 +1,115 @@ +## 修订历史 + +| 版本 | 日期 | 作者 | 变更表述 | +| ---- | ---------- | ------ | -------- | +| 1.0 | 2021-09-23 | Kayden | 初始版本 | + + + +## 数码管开发实验 + +本篇文章主要简介基于EC600X_QuecPython_EVB_V1.3开发板进行数码管开发实验,直接适用的模组为EC600S、EC600N、EC600U。 + +## 硬件资源 + +本实验使用的模组硬件资源只有GPIO,由于使用的是数码管模块,仅需要三个GPIO就可以进行本实验。关于数码管模块的介绍和接线情况下面进行详细介绍。 + +共阳极四位数码管模块原理图: + +![](media/Schematic_diagram_of_nixie_tube_module.png) + +本实验为了尽量做到搭载不同模组的开发板之间接线的通用性,接线均接在固定的排针脚,具体连接情况以及排针对应软件GPIO号情况见下表。 + +| 数码管模块排针名称 | V1.3开发板排针名称及模组引脚号 | EC600S/EC600N GPIO | EC600U GPIO | +| ------------------ | ------------------------------ | ------------------ | ----------- | +| VCC | 3V3 | - | - | +| SCLK | P61 | GPIO14 | GPIO1 | +| RCLK | SDA(P58) | GPIO28 | GPIO16 | +| DIO | P60 | GPIO13 | GPIO4 | +| GND | GND | - | - | + +注:模组引脚对应软件GPIO号查看链接:[GPIO相关API](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=pin) + +## 实验代码 + + 下载代码 + +```python +""" +@Author: Kayden +@Date: 2021-09-23 +@Description: Digital tube experiment +@FilePath: Digital_tube.py +""" +from machine import Pin +import utime + +''' +数码管模块和V1.3开发板的排针连接方式为: +DIO接开发板上P60对应的排针 +RCLK接开发板上P58对应的排针 +SCLK接开发板上P61对应的排针 +P60对应EC600S/EC600N模组的GPIO13、对应EC600U模组的GPIO4 +P56对应EC600S/EC600N模组的GPIO28、对应EC600U模组的GPIO16 +P61对应EC600S/EC600N模组的GPIO14、对应EC600U模组的GPIO1 +''' +# 当使用的模组为EC600S/EC600N时 +# DIO = Pin(Pin.GPIO13, Pin.OUT, Pin.PULL_PU, 0) +# RCLK = Pin(Pin.GPIO28, Pin.OUT, Pin.PULL_PU, 0) +# SCLK = Pin(Pin.GPIO14, Pin.OUT, Pin.PULL_PU, 0) + +# 当使用的模组为EC600U时 +DIO = Pin(Pin.GPIO4, Pin.OUT, Pin.PULL_PU, 0) +RCLK = Pin(Pin.GPIO16, Pin.OUT, Pin.PULL_PU, 0) +SCLK = Pin(Pin.GPIO1, Pin.OUT, Pin.PULL_PU, 0) + +# 变量初始化 +i = 0 +j = 0 + +# 字模元组 0 1 2 3 4 5 6 7 8 9 A b C d E F - +LED_fonts = (0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E, 0xBF) + + +# 向74HC595写入数据的函数 +def LED_OUT(data): + for i in range(8): + if data & 0X80: + DIO.write(1) + else: + DIO.write(0) + data <<= 1 + SCLK.write(0) + SCLK.write(1) + + +# 数码管依次显示17个字模的函数 +def LED_Display(): + for j in range(17): + LED_OUT(LED_fonts[j]) + LED_OUT(0x0f) + RCLK.write(0) + RCLK.write(1) + utime.sleep(1) + + +if __name__ == "__main__": + while True: + LED_Display() + +``` + +## 实验操作 + +1.使用杜邦线进行硬件连接; + +2.将示例代码下载进模组运行; + +3.查看数码管上显示结果。 + +最终我们可以看到四个数码管循环显示17个字模,部分现象可见下图: + +![](media/Digital_tube_experiment_phenomenon.png) + +更多有关于数码管使用的方法可百度查找资料。 + diff --git a/docs/Advanced_development/zh/QuecPythonSub/GPIO.md b/docs/Advanced_development/zh/QuecPythonSub/GPIO.md deleted file mode 100644 index 40e589531a5e5c0a76553de4f86a5d3c80b0b559..0000000000000000000000000000000000000000 --- a/docs/Advanced_development/zh/QuecPythonSub/GPIO.md +++ /dev/null @@ -1,188 +0,0 @@ -# EC600S GPIO及IO中断开发 - -文档主要基于EC600S介绍如何使用QuecPython_GPIO,GPIO通常用于连接驱动LED、蜂鸣器、继电器等等,同样也可以用来读取KEY、开关状态、外部IC的引脚电平状态等等。通过本文你将了解到GPIO的所有设置参数及使用方法。 - -## 硬件描述 - -目前开放共10个GPIO,其他的GPIO逐渐开放,各个GPIO口连接位置如下表所示: - -GPIO1 – 模组的Pin10 -GPIO2 – 模组的Pin11 -GPIO3 – 模组的Pin12 -GPIO4 – 模组的Pin13 -GPIO5 – 模组的Pin14 -GPIO6 – 模组的Pin15 -GPIO7 – 模组的Pin16 -GPIO8 – 模组的Pin39 -GPIO9 – 模组的Pin40 -GPIO10 – 模组的Pin48 - -![](media/9351c08c142de93cfa88095688ab7535.png) - -## 软件设计 - -### 创建gpio对象 - -gpio = Pin(GPIOn, direction, pullMode, level) - -函数原型:Pin(GPIOn, direction, pullMode,level),返回一个pgio对象,用于操作读写IO状态。 - -| 参数 | 类型 | 说明 | -| --------- | ---- | ------------------------------------------------------------ | -| GPIOn | int | GPIO1 – 模组的Pin10 GPIO2 – 模组的Pin11
GPIO3 – 模组的Pin12 GPIO4 – 模组的Pin13
GPIO5 – 模组的Pin14 GPIO6 – 模组的Pin15
GPIO7 – 模组的Pin16 GPIO8 – 模组的Pin39
GPIO9 – 模组的Pin40 GPIO10 – 模组的Pin48 | -| direction | int | IN – 输入模式,OUT – 输出模式 | -| pullMode | int | PULL_DISABLE – 浮空模式
PULL_PU – 上拉模式
PULL_PD – 下拉模式 | -| level | int | 0 - 设置引脚为低电平, 1- 设置引脚为高电平 | - -### 获取Pin脚电平 - -state= gpio.read() - -函数原型:read(),返回对应创建gpio对象的Pin脚输入电平状态。 - -| 参数 | 类型 | 说明 | -|-------|------|------------------| -| state | int | 0低电平,1高电平 | - -### 设置Pin脚电平 - -ret = gpio.Pin.write(value) - -函数原型:write(value),设置对应创建gpio对象的Pin脚输出电平状态,返回设置结果。 - -| 参数 | 类型 | 说明 | -|-------|------|-----------------------------------------------------------------------------------------| -| value | int | 0 -当PIN脚为输出模式时,设置当前Pin脚输出低 1 -当PIN脚为输出模式时,设置当前Pin脚输出高 | -| ret | int | 0成功 -1失败 | - -## 交互操作 - -使用QPYcom工具和模组进行交互,示例如下: - -![](media/5c3518e6007b37481d75644bb6fc3659.png) - -注意: - -1. import Pin即为让Pin模块在当前空间可见。 - -2. 只有import Pin模块,才能使用Pin内的函数和变量。 - -## 下载验证 - -下载.py文件到模组运行,代码如下: - -```python -from machine import Pin -gpio1 = Pin(Pin.GPIO1, Pin.OUT, Pin.PULL_DISABLE, 0) -ret = gpio1.write(1) -print(ret) -ret = gpio1.read() -print(ret) -ret = gpio1.write(0) -print(ret) -ret = gpio1.read() -print(ret) -``` - - - - - 下载代码 - -## 外部中断\_基本概述 - -认识了普通的GPIO之后,接着介绍外部中断,普通GPIO可以随时查询Pin引脚的电平状态,但却不能及时发现电平的变化,而外部中断就能完美的解决这个问题。若设定了上升沿触发外部中断时,当电平从低电平上升到高电平瞬间,就会触发外部中断,从而在电平变化时立马执行回调函数。 - -## 软件设计 - -### 创建extint对象: - -extint = ExtInt(GPIOn, mode, pull, callback) - -函数原型:ExtInt(GPIOn, mode, pull,callback),返回一个extint对象,用于使能、禁止中断响应。 - -| 参数 | 类型 | 说明 | -| -------- | -------- | ------------------------------------------------------------ | -| GPIOn | int | GPIO1 – 模组的Pin10 GPIO2 – 模组的Pin11
GPIO3 – 模组的Pin12 GPIO4 – 模组的Pin13
GPIO5 – 模组的Pin14 GPIO6 – 模组的Pin15
GPIO7 – 模组的Pin16 GPIO8 – 模组的Pin39
GPIO9 – 模组的Pin40 GPIO10 – 模组的Pin48 | -| mode | int | IRQ_RISING – 上升沿触发
IRQ_FALLING – 下降沿触发
IRQ_RISING_FALLING – 上升和下降沿触发 | -| pull | int | PULL_DISABLE – 浮空模式
PULL_PU – 上拉模式
PULL_PD – 下拉模式 | -| callback | function | 中断触发回调函数 | - -### 允许中断 - -ret = extint.enable() - -函数原型:enable(),设置对应创建extint对象的中断响应,返回设置结果。 - -| 参数 | 类型 | 说明 | -|------|------|--------------| -| ret | int | 0成功 -1失败 | - -### 禁止中断 - -ret = extint.disable() - -函数原型:disable(),设置对应创建extint对象的中断响应,返回设置结果。 - -| 参数 | 类型 | 说明 | -|------|------|--------------| -| ret | int | 0成功 -1失败 | - -## 交互操作 - -使用QPYcom工具和模组进行交互,示例如下: - -![](media/2d5c069c492cc483e86f32f3fe88480a.png) - -注意:回调函数fun(args)中的args,是引脚中断后返回的内部GPIO行号,一般用不上,但也要设置。 - -## 下载验证 - -下载.py文件到模组运行,代码如下: - -``` -from machine import ExtInt -import utime -def fun1(args): - print(args) - print("1111111111111111111111") -def fun2(args): - print(args) - print("222222222222222222222") -extint1 = ExtInt(ExtInt.GPIO1, ExtInt.IRQ_FALLING, ExtInt.PULL_PU, fun1) extint1.enable() -extint2 = ExtInt(ExtInt.GPIO2, ExtInt.IRQ_FALLING, ExtInt.PULL_PU, fun2) extint2.enable() -while True: - utime.sleep_ms(200) - print("。。。。。。。。。") -``` - -注意:回调函数fun(args)中的args,是引脚中断后返回的内部GPIO行号,一般用不上,但必须设置。 - - - - - 下载代码 - -## 名词解释 - -低电平:通常用0来表示低电平 - -高电平:通常用1来表示高电平 - -上升沿:从低电平上升到高电平的边沿 - -下降沿:从高电平上升到低电平的边沿 - -回调函数:一个普通函数,在满足设定条件下被触发执行这个函数 - -浮空:Pin引脚直出,没有默认电平,处于不稳定状态 - -上拉:Pin引脚内部有个电阻拉到VCC,默认为高电平 - -下拉:Pin引脚内部有个电阻拉到GND,默认为低电平 - -输入:Pin引脚的电平状态随外部变化 - -输出:Pin引脚的电平驱动外围电路 - -中断:停止执行当前的程序去执行另一段程序,这个过程叫中断 \ No newline at end of file diff --git a/docs/Advanced_development/zh/QuecPythonSub/LCD.md b/docs/Advanced_development/zh/QuecPythonSub/LCD.md deleted file mode 100644 index 64da8d8b4f3e9b1cb1420b1e4c647a352a7a3b08..0000000000000000000000000000000000000000 --- a/docs/Advanced_development/zh/QuecPythonSub/LCD.md +++ /dev/null @@ -1,321 +0,0 @@ -# QuecPython LCD调试流程 - -SPI是串行外设接口(Serial Peripheral Interface)的缩写。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性。 - -TFT液晶屏为每个像素都设有一个半导体开关,其加工工艺类似于大规模集成电路。由于每个像素都可以通过点脉冲直接控制,因而,每个节点都相对独立,并可以进行连续控制,这样的设计不仅提高了显示屏的反应速度,同时可以精确控制显示灰度,所以TFT液晶的色彩更逼真。 - -SPI屏幕结合了SPI和TFT屏幕的双重特点,可以使用最少 5 根线来实现CPU对屏幕的控制,它具备占用端口少,刷屏速度适中等特点,可以灵活显示简单字符、汉子、图片等,适用于各种对速度要求不太高的显示场景下。 - -## QuecPython下SPI屏幕添加 - -SPI屏幕通常包括 1 块TFT显示屏、 1 个控制芯片(本文使用的是ILI9341)和一个AD芯片(触摸用,可不用),CPU通过SPI总线+2根GPIO线来控制屏幕显示。用户选择控制器芯片不同和GPIO不同,通常需要修改SPI设备驱动的lcd操作部分和GPIO选择引脚部分。 - -### 硬件连接 - -EC600S和EC100Y上有专门处理LCD的SPI外设。 - -![](media/图1:标准4线SPI外接 TFT的参考设计.jpg) - -以EC600S_QuecPython_EVB_V1.1开发板为例 - -![](media/图2: EC600S_QuecPython_EVB_V1.1实物图.jpg) - - -SPI屏幕通常需要 3 根电源线和 5 根通信线, 3 根电源线包括 1 根地线GND、 1 根控制器电源线VCC和 1 根背光线LED,通信线包括 1 根REST线(复位SPI屏幕控制器,连接到CPU的GPIO线)、 1 根RS线(有的叫D/C线,辨别传输的时数据还是命令,连接到CPU的GPIO线,)、三根spi线(屏幕CLK线链接CPU SPI的CLK、SDI连接CPU SPI的MOSI线、CS线连接CPU SPI的CS线)。 - -**注意:**CPU对SPI屏幕通常不需要读,因此不需要连接屏幕SDO线。 - -![](media/图 3 : EC600S_QuecPython_EVB_V1.1实物接线图.jpg) - -​ 图 3 : EC600S_QuecPython_EVB_V1.1实物接线图 - -### QuecPython下SPI屏幕的软件设计 - -SPI屏幕设备的片选需要不选中时为高,选中时为低。由于EC600S_QuecPython_EVB_V1.1目前硬件缺陷(CS管脚未引出),用户可用普通gpio口代替。只需上电后将CS拉高后拉低即可。设计时需要了解quecpython lcd的api。详细参考https://python.quectel.com/wiki/api/#lcd。 - -由于quecpython下LCD的相关api已经开发好,用户可以直接依照api格式,编写spi屏幕驱动。 - -### 前期准备工作 - -确定使用的spi屏幕,仔细阅读其datasheet,原理图和驱动IC的技术手册。了解屏幕的特性,确定好屏幕的初始化参数(分辨率,颜色深度,spi时钟等)和必要的控制命令(例如:亮屏,息屏,设置显示区域,背光设置等)。 - -查看移远QuecPython LCD相关资料 :https://python.quectel.com/wiki/api/#lcd(LCD API说明) - -### 开始编写python脚本代码 - -1.创建LCD对象 - -``` -from machine import LCD -lcd = LCD() -``` -2.编写初始化参数 -此部分比较容易出错且比较重要,请重点关注。 -参数格式如下所示: - type + len + value - Type: 0:cmd 1:data 2:delay - Len: 若type为cmd: len表示后面接多少个data - 若type为data: len表示data的长度 - 若type为delay: len无实际意义。为 0 即可 - Value: 对应值 - 若type为delay:表示延时的时长,单位为ms。 - -重要点:由于lcd_init传入的是buff,需要进行bytearray转换 - -举例说明: - -```python -init = ( -0,1,0xXX, #命令,后接一个data, cmd值为0xXX -1,2,0xXX,0xXX, #数据, 数据长度为 2 , data值为0x -2,0,120 , #延时120ms -0,2,0xXX, #命令,后接 2 个data, cmd值为0xXX -1,1,0xXX, #数据,命令的第一个data,data值为0xXX -1,2,0xXX,0xFF #数据,命令的第二个data,数据的长度为 2 ,data值为0xXXFF -... -) -init_data = bytearray(init) #将列表转换 -``` - -3.编写display_on 命令 - 由于每款LCD的亮屏命令不一样,故需要用户提供该配置参数。 - -​ 此参数根据具体的屏幕去驱动而定 - -```python -display_on = ( - 0,1,0xXX #命令,后接一个data, cmd值为0xXX -1,2,0xXX,0xYY #数据, 数据长度为2, data值为0xXXYY -) -display_on_data = bytearray(display_on) -``` - -4.编写display_off 命令 - 由于每款LCD的息屏命令不一样,故需要用户提供该配置参数。 - - 此参数根据具体的屏幕去驱动而定 - -```python -display_off = ( - 0,1,0xXX #命令,后接一个data, cmd值为0xXX - 1,2,0xXX,0xYY #数据, 数据长度为2, data值为0xXXYY -) -display_off_data = bytearray(display_off) -``` - -5.编写设置显示区域的命令 - 不同的lcd屏有不同的设置区域方式。 (以ili9225和st7789v为例) - -​ 一般屏幕设置有两种方式: - -​ 一:分两次写:高八位和低八位此参数根据具体的屏幕去驱动而定(如st7789v) - -​ 二:一次写一个short (如ili9225) - -```python -XSTART_H = 0xf0 #代表X起始坐标 高八位 (以此值写入,底层会识别该位是x坐标的高八位) -XSTART_L = 0xf1 #代表X起始坐标 低八位 (以此值写入,底层会识别该位是x坐标的低八位) -YSTART_H = 0xf2 #代表Y起始坐标的高八位 -YSTART_L = 0xf3 #代表Y起始坐标的低八位 -XEND_H = 0xE0 #代表X结束坐标的高八位 -XEND_L = 0xE1 #代表X结束坐标的低八位 -YEND_H = 0xE2 #代表Y结束坐标的高八位 -YEND_L = 0xE3 #代表Y结束坐标的低八位 - -XSTART = 0xD0 #代表X的起始坐标 -XEND = 0xD1 #代表X的结束坐标 -YSTART = 0xD2 #代表Y的起始坐标 -YEND = 0xD3 #代表Y的结束坐标 - -ili9225_invalid = ( -0,1,0x36, -1,2,XEND, -0,1,0x37, -1,2,XSTART, -0,1,0x38, -1,2,YEND, -0,1,0x39, -1,2,YSTART, -0,1,0x20, -1,2,XSTART, -0,1,0x21, -1,2,YSTART, -0,1,0x22, -) -st7789_invalid = ( -0,4,0x2a, -1,1,XSTART_H, -1,1,XSTART_L, -1,1,XEND_H, -1,1,XEND_L, -0,4,0x2b, -1,1,YSTART_H, -1,1,YSTART_L, -1,1,YEND_H, -1,1,YEND_L, -0,0,0x2c, -) -invalid_data = bytearray(invalid) - -``` - -6.编写屏幕背光命令 - 不同的lcd屏有不同的设置背光方式。有些屏通过控制寄存器调节背光,有些屏通过背光控制管脚控制背光。 - -​ 当由背光控制管脚控制背光时,此处可以不需要,init中该部分填入None即可。 - -```python -LIGHT_VALUE = 0xFE #代表背光设置位置 -light = ( - 0,1,0xXX #命令,后接一个data, cmd值为0xXX - 1,1,LIGHT_VALUE, -) -light_data = bytearray(light) -``` - -7.初始化配置 - 按lcd_init参数依次填入。 - -``` -lcd.lcd_init(init_data,width,hight,clk,data_line,line_num,type,invalid_data,display_on_data,display_off_data,light_data/None) - -init_data:(1)中,配置的初始化参数 -width:屏幕宽度 -hight: 屏幕高度 -data_line: 数据线 -line_num: 线 -type: 0:rgb 1:fstn(黑白屏) -lcd_invalid: 区域写屏,设置范围 -display_on: 亮屏参数 -display_off: 息屏参数 -display_light: 亮屏参数,若为None:表示LCD亮度由IO口控制 -``` - -8.清屏 - lcd.lcd_clear(0xXXXX) - -9.区域写屏 - -```python -test_buf = ( -0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f, -0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f, -0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f, -0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f, -0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f, -0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f, -0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f, -0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f, -0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f, -0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f, -0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f, -0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f, -0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f, -0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f, -0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f, -0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f, -0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f, -0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f, -0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f, -0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f, -) -test_buf1 = bytearray(test_buf) -lcd.lcd_write(test_buf1,10,10,20,20) -``` - - - -``` -#注意:该接口采用低位在前 -``` -### 运行代码 - -1.将创建的py文件拷贝到模块的usr目录下; - 利用工具qpycom将文件导入模块中。具体qpycom工具操作参考 - https://python.quectel.com/wiki/#/zh-cn/QuecPythonPrepare/?id=qpycom%e4%b8%b2%e5%8f%a3%e5%b7%a5%e5%85%b7 - -2.进入模块的命令行模式 - -模组烧录固件后,连接USB会产生如下图的com口。其中USB串行设备就是我们的python终端接口。 - -![](media/图4:串口选择.jpg) - -3.键入如下指令,运行创建的py文件: - -```python -import example -example.exec('usr/XXXX.py') #XXXX.py 创建的文件名 -``` - - - -### 工具使用 - -**工具简介** - -Image2Lcd 软件用于图片取模,可以提取单色和彩色图片。 - -PCtoLCD2002 是一款字符取模软件,可以生成汉字、英文以及标点符号的字模数据。 - -**如何对图片取模** - -1. 打开 Image2Lcd 软件,点击【打开】按钮,选择要显示的图片; - - ![](media/图5:image2LCD.jpg) - -2. 输出数据类型选择【C语言数组(*.c)】,扫描方式选择【水平扫描】,输出灰度一定要选择【 16 位真彩色】; - -3. 设置图片的最大宽度和高度,实际输出大小以上图中最下方的【输出图像:(xx, yy)】部分显示为准 - -4. 点击【保存】按钮,得到图片的取模数据,将其放到元组中保存即可。 - ( 3 ) 如何对字符取模 - - 1. 打开 PCtoLCD2002 软件,依次点击【模式】-【字符模式(W)】; - - 2. 根据需要选择字体,设置字体大小等; - - ![](media/图6:汉字取模1.jpg) - -3. 点击齿轮图标,进入如下所示界面,选择 【阴码】、【逐行式】、【顺向】、【C51格式】,点击确定; - -![](media/图7:汉字取模2.jpg) - - -4. 输入要取模的字符后,点击【生成字模】,即可得到对应的字模数据,按照示例 fonts.py - 文件中的格式,将字模数据保存到字典中。 - - ![](media/图8:汉字取模3.jpg) - -**简单刷图测试** - -按照2.2.4节Image2Lcd使用指导生成图片对应的图片数组。(此处以ili 9225 为例) - -详细代码参考LCD小实验 - - -将py文件导入模块的usr目录下。 - -![](media/图9:导入文件.jpg) - -![](media/图10:图片显示.jpg) - - -## 调试注意 - -1. 初始化前需要一个延时(大概为10ms),使Reset稳定;(此部分在c层已经实现,python关注) -2. 如果出现花屏现象,很大的可能是总线速度问题; -3. 如果调试时发现LCD的亮度有问题,首先检查(考虑)提供给LCD的电流是否一致,再考虑调节电压。 -4. 开机花屏问题,最简单的处理方式就是在INIT结束的地方增加一个刷黑屏的功能。(此部分已经在c层实现,python无需关注) -5. 如果出现花屏现象,很大的可能是总线速度问题 -6. 如果图像分开显示,起始点不在原点,多半是全屏刷新起始点寄存器没有设好; - - -## 调试过程中的常见问题 - -1.背光没点亮-调试屏幕首要工作就是把背光点亮,如果没有点亮背光,屏幕就无法显示,可以按照规格书将背光点亮,或者找技术工程师帮助。 - -![](media/图11:背光.jpg) - -2.LCD的星星点点 - -在调试的时候,我们会发现LCD上有莫名其妙的星星点点。一般这种情况下,我们首先要看看VGH和VGL电压是否处于datasheet所描述的范围之内。如果属于标准范围之内,但星星点点依旧,很有可能就是时序问题。这时候不妨在代码中变更采样的时序(比如上升沿采样改为下降沿采样)。如果无法在代码中更改,也可以在clk信号线加个100R电阻,也可能解决该问题。 \ No newline at end of file diff --git a/docs/Advanced_development/zh/QuecPythonSub/PM.md b/docs/Advanced_development/zh/QuecPythonSub/PM.md deleted file mode 100644 index 5655836e9f3104bcf4b4965657cf6c48367373fd..0000000000000000000000000000000000000000 --- a/docs/Advanced_development/zh/QuecPythonSub/PM.md +++ /dev/null @@ -1,121 +0,0 @@ -# **QuecPython低功耗使用说明** - -文档主要基于EC600S介绍如何使用QuecPython\_低功耗模式pm,通常便携式、移动式产品都是电池设计方案,需要整体上节省功耗,加强续航能力。通过本文你将了解到pm模块的所有设置参数及使用方法。 - -## 硬件描述 - -模块内置低功耗模式,只要软件控制,无需额外的电路。 - -## 软件设计 - -1. 函数原型create_wakelock(lock_name, - name_size),成功返回wakelock的标识id,否则返回-1。 - -### 创建锁 - -> lpm_fd = pm.create_wakelock(lock_name, name_size) - -| 参数 | 参数类型 | 参数说明 | -|-----------|----------|-----------------| -| lock_name | string | 自定义lock名 | -| name_size | int | lock_name的长度 | - -1. 函数原型delete_wakelock(lpm_fd),成功返回0。 - -### 删除锁 - -> pm.delete_wakelock(lpm_fd) - -| 参数 | 类型 | 说明 | -|--------|------|------------------------| -| lpm_fd | int | 需要删除的锁对应标识id | - -1. 函数原型wakelock_lock(lpm_fd),成功返回0,否则返回-1。 - -### 加锁 - -> pm.wakelock_lock(lpm_fd) - -| 参数 | 类型 | 说明 | -|--------|------|----------------------------------| -| lpm_fd | int | 需要执行加锁操作的wakelock标识id | - -1. 函数原型wakelock_unlock(lpm_fd),成功返回0,否则返回-1。 - -### 释放锁 - -> pm.wakelock_unlock(lpm_fd) - -| 参数 | 类型 | 说明 | -|--------|------|------------------------------------| -| lpm_fd | int | 需要执行释放锁操作的wakelock标识id | - -1. 函数原型autosleep(sleep_flag),成功返回0。 - -### 自动休眠 - -> pm.autosleep(sleep_flag) - -| 参数 | 类型 | 说明 | -|------------|------|--------------------------------| -| sleep_flag | int | 0,关闭自动休眠;1开启自动休眠 | - -1. 函数原型get_wakelock_num(),返回锁的数量。 - -### 获取已创建的锁数量 - -> pm.get_wakelock_num() - -## 交互操作 - -使用QPYcom工具和模组进行交互,示例如下: - -
-![](media/079186e2c37f4af6a3c3d52c58a77644.png) - -
- -注意: - -1. import pm即为让pm模块在当前空间可见。 - -2. 只有import pm模块,才能使用pm内的函数和变量。 - -## 下载验证 - -下载.py文件到模组运行,代码如下: - -```python -import pm -import utime - -lpm_fd = pm.create_wakelock("test_lock", len("test_lock")) -pm.autosleep(1) - -while 1: - print("sleep") - utime.sleep(5) - res = pm.wakelock_lock(lpm_fd) - print(res) - print("ql_lpm_idlelock_lock, g_c1_axi_fd = %d" %lpm_fd) - print("not sleep") - utime.sleep(5) - res = pm.wakelock_unlock(lpm_fd) - print(res) - print("ql_lpm_idlelock_unlock, g_c1_axi_fd = %d" % lpm_fd) - num = pm.get_wakelock_num() - print(num) - -``` - -## 配套代码 - - - - 下载代码 - -## 专业名词解释 - -> **加锁**:不允许模组进入低功耗模式 - -> **释放锁**:和加锁相对,允许模组进入低功耗模式 diff --git a/docs/Advanced_development/zh/QuecPythonSub/PWM.md b/docs/Advanced_development/zh/QuecPythonSub/PWM.md deleted file mode 100644 index 692c6a243f694afc85ff109795a064163e455b5b..0000000000000000000000000000000000000000 --- a/docs/Advanced_development/zh/QuecPythonSub/PWM.md +++ /dev/null @@ -1,105 +0,0 @@ -# QuecPython PWM开发 - -文档主要基于EC600S介绍如何使用QuecPython_PWM,PWM通常用于连接驱动LED、蜂鸣器、数字模拟DA转换等等。通过本文你将了解到PWM的所有设置参数及使用方法。 - -### 硬件描述 - -目前开放共5个PWM,EVB引出2个PWM口连接位置如下表所示: - - -![](media/ee3e5721dff49d3ba045fd33cadcdc0c.png) - -PWM0 – 引脚号52 -PWM1 – 引脚号53 -PWM2 – 引脚号57 -PWM3 – 引脚号56 -PWM4 – 引脚号70 -PWM5 – 引脚号69 - -### 软件设计 - -#### 创建PWM对象 - -pwm= PWM(PWM.PWMn, highTime, cycleTime) - -函数原型:PWM(PWM.PWMn, highTime, cycleTime),返回一个pwm对象,用于设置PWM的输出周期、占空比。 - -| 参数 | 参数类型 | 参数说明 | -|-----------|----------|-------------------------------------------------------------------------------------------------| -| PWMn | int | PWM0 – 引脚号52 PWM1 – 引脚号53 PWM2 – 引脚号57 PWM3 – 引脚号56 PWM4 – 引脚号70 PWM5 – 引脚号69 | -| highTime | int | 高电平时间,单位ms | -| cycleTime | int | pwm一个周期时间,单位ms | - -#### 开启PWM输出 - -state= pwm.open() - -函数原型:open(),返回pwm 设置状态。 - -| 参数 | 类型 | 说明 | -|-------|------|---------------| -| state | int | 0成功,-1失败 | - -#### 关闭PWM输出 - -state= pwm.close() - -函数原型:close(),返回pwm 设置状态。 - -| 参数 | 类型 | 说明 | -|-------|------|---------------| -| state | int | 0成功,-1失败 | - -### 交互操作 - -使用QPYcom工具和模组进行交互,示例如下: - -![](media/4482bfc474c4c09e9e2be00e462bea32.png) - -注意: - -1. from misc import PWM即为让PWM模块在当前空间可见。 - -2. 只有from misc import PWM模块,才能使用PWM内的函数和变量。 - -### 下载验证 - -下载.py文件到模组运行,代码如下: - -``` -from misc import PWM -import utime -pwm = PWM(PWM.PWM5, 10, 20) -pwm.open() -highTime = 10 -dir = 1 -while 1: - if dir: - highTime += 2 - if highTime >= 20: - dir = 0 - else: - highTime -= 2 - if highTime <= 2: - dir = 1 - PWM(PWM.PWM5, highTime, 20) - utime.sleep_ms(100) -``` - -### 名词解释 - -PWM:脉冲宽度调制 - -高电平:通常高于用0.8V认为是高电平 - -低电平:通常低于用0.6V认为是低电平 - -周期:低电平和高电平时间的总和 - -占空比:高电平占整个周期的比例 - -### 配套代码 - - - - 下载代码 \ No newline at end of file diff --git a/docs/little_demo/zh/QuecPythonTest/Photoresistor.md b/docs/Advanced_development/zh/QuecPythonSub/Photoresistor.md similarity index 63% rename from docs/little_demo/zh/QuecPythonTest/Photoresistor.md rename to docs/Advanced_development/zh/QuecPythonSub/Photoresistor.md index 0f21f7fd709fbedf0573b9059dafeb3105a36fbe..d8fdf36391ea5f05b057ee0b5420fdd7309166a5 100644 --- a/docs/little_demo/zh/QuecPythonTest/Photoresistor.md +++ b/docs/Advanced_development/zh/QuecPythonSub/Photoresistor.md @@ -1,231 +1,213 @@ -## 光敏传感器实验 - -本片文章主要简介EC600S ADC 硬件资源, 介绍quecpython ADC API,以及使用ADC来检测当前光敏电阻的阻值。 - -### 硬件资源 - -EC600 引出了两个ADC接口。参考 EC600S_QuecPython_EVB_V1.0_SCH.pdf 文档。 - -![](media/519176882b0943e5900c9ef59fccd5da.png) - -| 外设 | 引脚 | -| ---- | ---- | -| ADC0 | 19 | -| ADC1 | 20 | - -并且提供了一个光敏电阻。 - -![](media/d511695f57c22b01b84111001a198c20.png) - -### 软件资源 - -#### 创建ADC对象 - -**ADC()** - -返回一个adc对象。 - -#### 打开设备 – open - -ADC功能初始化。 - -参数 - -无 - -返回值 - -成功返回整型0,失败返回整型-1。 - -#### 读取电压值 – read - -读取指定通道的电压值,单位mV。 - -参数 - -| 参数 | 参数类型 | 参数说明 | -| ---- | -------- | ------------------------------------------- | -| ADCn | int | EC600平台: ADC0 – 引脚号19 ADC1 – 引脚号20 | - -#### 关闭设备 – close - -关闭ADC。 - -参数:无 - -返回值: - -0关闭成功,-1关闭失败。 - -### 光敏电阻实验 - -#### 光敏电阻原理简介 - -定义 - -光敏电阻是用硫化隔或硒化隔等半导体材料制成的特殊电阻器,表面还涂有防潮树脂,具有光电导效应。 - -特性 - -光敏电阻对光线十分敏感。光照愈强,阻值就愈低。随着光照强度的升高,电阻值迅速降低,可降低至1KΩ以下。包含了以下几个特性。 - -- 伏安特性: - - 光敏传感器在一定的入射照度下,光敏元件的电流 I 与所加电压 U之间的关系称为光敏 器件的伏安特性。 - -- 光照特性 - - 光敏传感器的光谱灵敏度与入射光强之间的关系称为光照特性,有时光敏传感器的输出电压或电流与入射光强之间的关系也称为光照特性。 - -#### 实验设计 - -设计一个实验,根据当前光照强度,实时打印当前的光敏电阻的阻值。下图是光敏电阻的原理图。 - -![](media/819e212ba12846f5ed1b5879ce8f50d7.png) - -ADC0 是我们可以使用ADC外设测试的电压点。 - -![](media/0bd28ff05bebe5c88f892e0ada5f3b90.png) - -最终可以计算出,按照如下算式计算R22阻值。 - -![](media/dd6e240cbb4d95c565abed6c4d591482.png) - -#### 实验代码 - -```python -''' - -File: Photoresistor.py - -Project: adc - -File Created: Thursday, 24th December 2020 5:44:08 pm - -Author: chengzhu.zhou - ------ - -Last Modified: Wednesday, 30th December 2020 10:10:33 am - -Modified By: chengzhu.zhou - ------ - -Copyright 2020 - 2020 quectel - -''' - -from misc import ADC - -import utime as time - -import _thread - - - -# unit as Ω - - def Voltage_to_Resistance(Volt): - - # - - Va = 2 * Volt - - resistance = (2 * 4700 * 40200 * Va)/(2 * 4700 * (3300 - Va) - (40200 *Va)) - - return resistance - - - -def Photoresistor_thread(delay, retryCount): - - # creat a adc device - - AdcDevice = ADC() - - while retryCount: - - retryCount = retryCount - 1 - - # get ADC.ADC0 value - - adcvalue = AdcDevice.read(ADC.ADC0) - - print("get ADC.ADC0 Voltage value as {0}mv".format(adcvalue)) - - # Converted to resistance - - resistance = Voltage_to_Resistance(adcvalue) - - print("Photoresistor resistance as {0}Ω".format(resistance)) - - time.sleep(delay) - - pass - - - -if __name__ == "__main__": - - # creat a thread Convert ADC to Voltage - - _thread.start_new_thread(Photoresistor_thread, (1, 10)) - - print("creent main thread has exit") -``` - - - -#### 实验操作 - -1.将代码烧录进开发板运行。 - -2.用物品挡住光敏电阻,改变照射到光敏电阻的光强, - -3.查看串口输出的阻值的变化。 - -最终我们可以在串口看到,阻值输出的变化如下。 - -```python -import example - -example.exec('usr/adc1.py') - -creent main thread has exit - -get ADC.ADC0 Voltage value as 151mv - -Photoresistor resistance as 7114.343Ω - -get ADC.ADC0 Voltage value as 152mv - -Photoresistor resistance as 7206.022Ω - -get ADC.ADC0 Voltage value as 279mv - -Photoresistor resistance as 63070.42Ω - -get ADC.ADC0 Voltage value as 272mv - -Photoresistor resistance as 50913.1Ω - -get ADC.ADC0 Voltage value as 199mv - -Photoresistor resistance as 13333.95Ω - -get ADC.ADC0 Voltage value as 296mv - -Photoresistor resistance as 135022.3Ω -``` - - - -### 专业名词 - -> ***ADC:模数转换*** - -### 配套代码 - - - 下载代码 \ No newline at end of file +## 修订历史 + +| 版本 | 日期 | 作者 | 变更表述 | +| ---- | ---------- | ------ | ------------ | +| 1.0 | 2021-09-15 | Kayden | 初始版本修订 | + + + +## 光敏传感器实验 + +本篇文章主要简介EC600S ADC 硬件资源(其他模组类同), 介绍[QuecPython ADC API](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=adc),以及使用ADC来检测当前光敏电阻的阻值。 + +### 硬件资源 + +EC600S 引出了两个ADC接口。参考 EC600S_QuecPython_EVB_V1.0_SCH.pdf 文档。 + +其他开发板参考对应原理图文档,可从下载中心或者QQ群下载:[下载中心](https://python.quectel.com/download) + +QQ群:445121768 + +![](media/photoresistor_1.png) + +| 外设 | 引脚 | +| ---- | ---- | +| ADC0 | 19 | +| ADC1 | 20 | + +**注:每个模组具体对应关系API介绍有详细介绍。** + +并且提供了一个光敏电阻。 + +![](media/photoresistor_2.png) + +### 软件资源 + +#### 创建ADC对象 + +**ADC()** + +返回一个adc对象。 + +#### 打开设备 – open + +ADC功能初始化。 + +参数 + +无 + +返回值 + +成功返回整型0,失败返回整型-1。 + +#### 读取电压值 – read + +读取指定通道的电压值,单位mV。 + +参数 + +| 参数 | 参数类型 | 参数说明 | +| ---- | -------- | ------------------------------------------- | +| ADCn | int | EC600平台: ADC0 – 引脚号19 ADC1 – 引脚号20 | + +#### 关闭设备 – close + +关闭ADC。 + +参数:无 + +返回值: + +0关闭成功,-1关闭失败。 + +### 光敏电阻实验 + +#### 光敏电阻原理简介 + +定义: + +光敏电阻是用硫化隔或硒化隔等半导体材料制成的特殊电阻器,表面还涂有防潮树脂,具有光电导效应。 + +特性: + +光敏电阻对光线十分敏感。光照愈强,阻值就愈低。随着光照强度的升高,电阻值迅速降低,可降低至1KΩ以下。包含了以下几个特性。 + +- 伏安特性: + + 光敏传感器在一定的入射照度下,光敏元件的电流 *I* 与所加电压 *U*之间的关系称为光敏器件的伏安特性。 + +- 光照特性 + + 光敏传感器的光谱灵敏度与入射光强之间的关系称为光照特性,有时光敏传感器的输出电压或电流与入射光强之间的关系也称为光照特性。 + +#### 实验设计 + +设计一个实验,根据当前光照强度,实时打印当前的光敏电阻的阻值。下图是光敏电阻的原理图。 + +![](media/photoresistor_3.png) + +ADC0 是我们可以使用ADC外设测试的电压点。 + +![](media/photoresistor_4.png) + +最终可以计算出,按照如下算式计算R22阻值。 + +![](media/photoresistor_5.png) + +#### 实验代码 + + 下载代码 + +```python +''' + +File: Photoresistor.py + +Project: adc + +File Created: Thursday, 24th December 2020 5:44:08 pm + +Author: chengzhu.zhou + +----- + +Last Modified: Wednesday, 30th December 2020 10:10:33 am + +Modified By: chengzhu.zhou + +----- + +Copyright 2020 - 2020 quectel + +''' + +from misc import ADC + +import utime as time + +import _thread + + + +# unit as Ω + +def Voltage_to_Resistance(Volt): + + # + + Va = 2 * Volt + + resistance = (2 * 4700 * 40200 * Va)/(2 * 4700 * (3300 - Va) - (40200 *Va)) + + return resistance + + + +def Photoresistor_thread(delay, retryCount): + + # creat a adc device + + AdcDevice = ADC() + + while retryCount: + + retryCount = retryCount - 1 + + # get ADC.ADC0 value + + adcvalue = AdcDevice.read(ADC.ADC0) + + print("get ADC.ADC0 Voltage value as {0}mv".format(adcvalue)) + + # Converted to resistance + + resistance = Voltage_to_Resistance(adcvalue) + + print("Photoresistor resistance as {0}Ω".format(resistance)) + + time.sleep(delay) + + pass + + + +if __name__ == "__main__": + + # creat a thread Convert ADC to Voltage + + _thread.start_new_thread(Photoresistor_thread, (1, 10)) + + print("creent main thread has exit") +``` + + + +#### 实验操作 + +1.将代码烧录进开发板运行; + +2.用物品挡住光敏电阻,改变照射到光敏电阻的光强; + +3.查看串口输出的阻值的变化。 + +最终我们可以在串口看到,阻值输出的变化如下。 + +![](media/photoresistor_6.png) + + + +### 专业名词 + +> ***ADC:模数转换*** + diff --git a/docs/Advanced_development/zh/QuecPythonSub/RTC.md b/docs/Advanced_development/zh/QuecPythonSub/RTC.md deleted file mode 100644 index 7e7d53e886a16119fcb1aeeb5f1bfdb040e0ee5e..0000000000000000000000000000000000000000 --- a/docs/Advanced_development/zh/QuecPythonSub/RTC.md +++ /dev/null @@ -1,79 +0,0 @@ -# QuecPython RTC使用说明 - -## 软件设计 - -### 创建RTC对象 - -rtc = RTC(),无参数,无返回值。 - -### 设置RTC时间 - -rtc.datetime([year, month, day, week, hour, minute, second, microsecond]) - -带参数则可设置时间;设置时间时,参数week不参于设置,microsecond参数保留,暂未使用,默认是0。具体参数如下: - -| 参数 | 类型 | 说明 | -|-------------|------|--------------------------------------------------------------| -| year | int | 年 | -| month | int | 月 | -| day | int | 日 | -| week | int | 星期,设置时间时,该参数不起作用,保留;获取时间时该参数有效 | -| hour | int | 时 | -| minute | int | 分 | -| second | int | 秒 | -| microsecond | int | 微秒,保留参数,暂未使用,设置时间时该参数写0即可 | - -返回值:启动成功返回整型值0,失败返回整型值-1。 - -### 获取RTC时间 - -rtc.datetime() - -不带参数时,则用于获取时间。 - -返回值:获取时间时,返回一个元组,包含日期时间,格式如下:[year, month, day,week, hour, minute, second, microsecond] - -## 交互操作 - -使用QPYcom工具和模组进行交互。 - -![](media/f2a690aaeb6e47658a02fc03ab7eedc1.png) - -注意: - -1. from machine import RTC即为让RTC模块在当前空间可见。 - -2. 只有from machine import RTC模块,才能使用RTC内的函数和变量。 - -3. 上述操作没有连接任何外设,仅作为熟悉指令参考。 - -## 下载验证 - -### 软件代码 - -下载.py文件到模组运行,代码如下: - -``` -from machine import RTC -rtc = RTC() -rtc_before_set = rtc.datetime() # 查询日期时间 -print(rtc_before_set) # 打印时间 -rtc.datetime([2020, 3, 12, 1, 12, 12, 12, 0]) # 设置时间 -rtc_after_set = rtc.datetime() # 查询日期时间 -print(rtc_after_set) # 打印时间 -``` - -### 运行效果 - -打开QPYcom运行rtc\_file.py,如下图: - -![](media/933970b3720e7ebda87f77e2669bee7d.png) - -可以在QPYcom交互界面查看输出结果: - -![](media/29423f9b58431c5881424d7510039b96.png) - -## 配套代码 - - - 下载代码 \ No newline at end of file diff --git a/docs/Advanced_development/zh/QuecPythonSub/SPI.md b/docs/Advanced_development/zh/QuecPythonSub/SPI.md deleted file mode 100644 index 0acbe8873ef285ebc498b03eefa31ebedfac466e..0000000000000000000000000000000000000000 --- a/docs/Advanced_development/zh/QuecPythonSub/SPI.md +++ /dev/null @@ -1,96 +0,0 @@ -# QuecPython SPI总线开发 - -## API简介 - -本文以EC600S-CN模块为例,主要介绍QuecPython machine模块中SPI的使用。该模块包含的API有: - -- **machine.SPI(port, mode, clk)** - -- **SPI.wtite(data,datalen)** - -- **SPI.read(data,datalen)** - -- **SPI.write_read(r_data,data, datalen)** - - - -具体的API 详解请参考[QuecPython-machine - spi](https://python.quectel.com/wiki/api/#spi) - -本文档适用于移远通信如下模块: - -- EC100Y-CN -- EC600S-CN - -## SPI简介 - -SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议。 - - - -## SPI特点 - -### 采用主-从模式(Master-Slave) 的控制方式 - -SPI 规定了两个 SPI 设备之间通信必须由主设备 (Master) 来控制次设备 (Slave). 一个 Master 设备可以通过提供 Clock 以及对 Slave 设备进行片选 (Slave Select) 来控制多个 Slave 设备, SPI 协议还规定 Slave 设备的 Clock 由 Master 设备通过 SCK 管脚提供给 Slave 设备, Slave 设备本身不能产生或控制 Clock, 没有 Clock 则 Slave 设备不能正常工作 - - - -### 采用同步方式(Synchronous)传输数据 - -Master 设备会根据将要交换的数据来产生相应的时钟脉冲(Clock Pulse), 时钟脉冲组成了时钟信号(Clock Signal) , 时钟信号通过时钟极性 (CPOL) 和 时钟相位 (CPHA) 控制着两个 SPI 设备间何时数据交换以及何时对接收到的数据进行采样, 来保证数据在两个设备之间是同步传输的. - -![](media\SPI_1.jpg) - -### 数据交换(Data Exchanges) - -​ SPI 设备间的数据传输之所以又被称为数据交换, 是因为 SPI 协议规定一个 SPI 设备不能在数据通信过程中仅仅只充当一个 "发送者(Transmitter)" 或者 "接收者(Receiver)". 在每个 Clock 周期内, SPI 设备都会发送并接收一个 bit 大小的数据, 相当于该设备有一个 bit 大小的数据被交换了. 一个 Slave 设备要想能够接收到 Master 发过来的控制信号, 必须在此之前能够被 Master 设备进行访问 (Access). 所以, Master 设备必须首先通过 SS/CS pin 对 Slave 设备进行片选, 把想要访问的 Slave 设备选上. 在数据传输的过程中, 每次接收到的数据必须在下一次数据传输之前被采样. 如果之前接收到的数据没有被读取, 那么这些已经接收完成的数据将有可能会被丢弃, 导致 SPI 物理模块最终失效. 因此, 在程序中一般都会在 SPI 传输完数据后, 去读取 SPI 设备里的数据, 即使这些数据(Dummy Data)在我们的程序里是无用的。 - -### SPI有四种传输模式 - -上升沿、下降沿、前沿、后沿触发。当然也有MSB和LSB传输方式. - -![](media\spi_2.jpg) - - - -### SPI只有主模式和从模式之分。 - -没有读和写的说法,因为实质上每次SPI是主从设备在交换数据。也就是说,你发一个数据必然会收到一个数据;你要收一个数据必须也要先发一个数据。 - - - - - -## 使用SPI进行通信 - -本文所示代码使用的硬件版本为 EC600S-CN V1.1。 - -```python -# -*- coding: UTF-8 -*- - -from machine import SPI -import utime - -def spi_test(): - spi_obj = SPI(1, 0, 1) - r_data = bytearray(5) - data = b"world" - # print(data) - ret = spi_obj.write_read(r_data, data, 5) - if ret is None: - print('----------', ret) - print('#########', r_data) - - -if __name__ == '__main__': - while True: - spi_test() - utime.sleep(1) - -``` - -## 配套代码 - - - - 下载代码 \ No newline at end of file diff --git a/docs/Advanced_development/zh/QuecPythonSub/TTS.md b/docs/Advanced_development/zh/QuecPythonSub/TTS.md deleted file mode 100644 index 230177f9a874651857da3fef5e53c9b01518226c..0000000000000000000000000000000000000000 --- a/docs/Advanced_development/zh/QuecPythonSub/TTS.md +++ /dev/null @@ -1,135 +0,0 @@ -# QuecPython TTS模块开发使用说明 - -本文主要介绍QuecPython Audio模块中TTS模块的使用。 TTS是语音合成应用的一种,它将储存于电脑中的文件,如帮助文件或者[网页](https://baike.baidu.com/item/网页/99347)转换成自然语音输出。TTS不仅能帮助有[视觉障碍](https://baike.baidu.com/item/视觉障碍/5582072)的人阅读计算机上的信息,更能增加[文本文档](https://baike.baidu.com/item/文本文档/557654)的可读性。TTS应用包括语音驱动的邮件以及声音敏感系统,并常与声音识别程序一起使用。 - -## api介绍 - -移远通信为您提供的TTS API 支持音量设置、播放语速设置等,包含的API有: - -- **tts = audio.TTS(device)** - -- **tts.close()** - -- **tts.play(priority, breakin, mode, str)** - -- **tts.setCallback(usrFun)** - -- **tts.getVolume()** - -- **tts.setVolume(vol)** -- **tts.getSpeed()** -- **tts.setSpeed(speed)** -- **tts.getState()** -- **tts.stop()** - -具体的API 详解请参考[QuecPython-audio - 音频播放-TTS](https://python.quectel.com/wiki/api/#tts) - -本文档适用于移远通信如下模块: - -- EC100Y-CN -- EC600S-CN - - - -## 使用TTS播放声音 - -本文所示代码使用的硬件版本为 EC600S-CN V1.1。 开发板播放声音需要外接喇叭, 具体的喇叭参数以及连接方法请参考《音频播放实验》。 - - - -## 交互小实验 - -### 播放TTS - -```python -import audio -from machine import Pin -tts = audio.TTS(0) -Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) -tts.play(1, 1, 2, '1111111111111111') -``` - - - -### 设置音量 - -```python -import audio -from machine import Pin -tts=audio.TTS(0) -tts.setVolume(5) -Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) -tts.play(1, 1, 2, '12345') -``` - - - -### 设置播放语速 - -```python -import audio -from machine import Pin -tts=audio.TTS(0) -tts.setSpeed(9) -Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) -tts.play(1, 1, 2, '12345') -``` - - - -## 实验代码 - -分别尝试使用不同的声音和语速播放。 - -```python -''' -Author: chengzhu.zhou -LastEditTime: 2021-01-16 12:23:44 -Description: Copyright 2020 - 2020 quectel -''' - -import audio -import utime as time -from machine import Pin - - -def play(tts, strList): - for Str in strList: - while tts.getState(): - time.sleep_ms(5) - tts.play(1, 1, 2, Str) - pass - -# https://python.quectel.com/wiki/#/zh-cn/api/?id=audio-%e9%9f%b3%e9%a2%91%e6%92%ad%e6%94%be - - -def test_tts_base(): - ''' - 外接喇叭播放录音文件,参数选择0 - ''' - tts = audio.TTS(0) - ''' - 使能外接喇叭 - ''' - Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) - for i in range(1, 9): - # 循坏播放,增加声音 - tts.setVolume(i) - play(tts, ['12345', '你好']) - tts.setVolume(5) - for i in range(1, 9): - # 循环增加语速 - tts.setSpeed(i) - play(tts, ['hello world', 'hello 移远']) - print("test_tts_base has exited") - - -if __name__ == "__main__": - test_tts_base() - -``` - -## 配套代码 - - - 下载代码 \ No newline at end of file diff --git a/docs/Advanced_development/zh/QuecPythonSub/camera.md b/docs/Advanced_development/zh/QuecPythonSub/camera.md new file mode 100644 index 0000000000000000000000000000000000000000..128ccd2db785657a46140aa3277a79d038e2d2c0 --- /dev/null +++ b/docs/Advanced_development/zh/QuecPythonSub/camera.md @@ -0,0 +1,132 @@ +## 修订历史 + +| 版本 | 日期 | 作者 | 变更表述 | +| ---- | ---------- | ------ | ------------ | +| 1.0 | 2021-09-15 | Felix | 初始版本修订 | + +## 引言 + +本文档基于QuecPython介绍如何通过camera模块实现摄像头预览,扫码,拍照功能,包括接口、配置流程及示例。 + + + +目前quecpython支持两种camera IC。后续会继续更新 + +- BF3901 (8W像素) +- GC032A (30W像素) + + + +以下实验均以gc032a 为例 + + + +## 原理图分析 + +首先,分析原理图,确定camera的型号,引脚等配置 + +![image-20210910143333760](media/camera_hw.png) + +引脚:SCK、SDA(IIC引脚用于配置和读取sensor的寄存器) + +MCLK:提供给sensor的主时钟 + +SPI_CLK:sensor给模块输出的spi时钟 + +DATA0:摄像头 SPI 数据位 0 + +DARA1:摄像头 SPI 数据位 1 + +PWDN:摄像头关断 + + + + +## Camera相关接口 + +​ camera接口主要参考官网的wiki([CAMERA_API库](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=camera-%e6%91%84%e5%83%8f%e6%89%ab%e7%a0%81)) + + + + +## camera配置开发流程 + +### LCD初始化(非必须) + +​ 该部分若需要预览功能,则需要先初始化LCD。 + +​ 具体实现可参考([LCD使用说明](https://python.quectel.com/doc/doc/sbs/zh/sbs/lcd.html)) + + + +### 预览功能 + +​ 该部分功能仅实现设备的预览功能。 + +``` +import camera + +preview1 = camera.camPreview(0,640,480,240,320,2) + +preview1.open() + +preview1.close() +``` + +​ + +​ + +### 扫码功能 + +该部分功能实现预览,扫码功能。 + +``` +def sacn_call(para): + print(para) + +import camera +scan = camera.camScandecode(0,1,640,480,2,240,320) #需要预览功能,需要LCD +#scan = camera.camScandecode(0,1,640,480,0) #不需要预览功能,即无LCD也可以 + +scan.open() +scan.start() +scan.callback(sacn_call) +``` + + + +### 拍照功能 + +该部分功能实现预览,拍照功能。 + +``` +def cap_call(para): + print(para) + +import camera +cap = camera.camCaputre(0,640,480,0,240,320) + +cap.open() +cap.callback(cap_call) + +cap.start(240,320,'1') +``` + + + + + + +## 附录A术语缩写 + +表 2 :术语缩写 + +``` +缩写 英文全称 中文全称 + +LCD Liquid Crystal Display 液晶显示器 + +SPI Serial Peripheral Interface 串行外设接口 +``` + diff --git a/docs/Advanced_development/zh/QuecPythonSub/code/Audio.zip b/docs/Advanced_development/zh/QuecPythonSub/code/Audio.zip deleted file mode 100644 index 841a0034d95ed81c8eba832e5a7a79a0cd564379..0000000000000000000000000000000000000000 Binary files a/docs/Advanced_development/zh/QuecPythonSub/code/Audio.zip and /dev/null differ diff --git a/docs/Advanced_development/zh/QuecPythonSub/code/Digital_tube.py b/docs/Advanced_development/zh/QuecPythonSub/code/Digital_tube.py new file mode 100644 index 0000000000000000000000000000000000000000..b59691dc1bb40b879a791a0d82be116ed93f4aa4 --- /dev/null +++ b/docs/Advanced_development/zh/QuecPythonSub/code/Digital_tube.py @@ -0,0 +1,61 @@ +""" +@Author: Kayden +@Date: 2021-09-23 +@Description: Digital tube experiment +@FilePath: Digital_tube.py +""" +from machine import Pin +import utime + +''' +数码管模块和V1.3开发板的排针连接方式为: +DIO接开发板上P60对应的排针 +RCLK接开发板上P58对应的排针 +SCLK接开发板上P61对应的排针 +P60对应EC600S/EC600N模组的GPIO13、对应EC600U模组的GPIO4 +P56对应EC600S/EC600N模组的GPIO28、对应EC600U模组的GPIO16 +P61对应EC600S/EC600N模组的GPIO14、对应EC600U模组的GPIO1 +''' +# 当使用的模组为EC600S/EC600N时 +# DIO = Pin(Pin.GPIO13, Pin.OUT, Pin.PULL_PU, 0) +# RCLK = Pin(Pin.GPIO28, Pin.OUT, Pin.PULL_PU, 0) +# SCLK = Pin(Pin.GPIO14, Pin.OUT, Pin.PULL_PU, 0) + +# 当使用的模组为EC600U时 +DIO = Pin(Pin.GPIO4, Pin.OUT, Pin.PULL_PU, 0) +RCLK = Pin(Pin.GPIO16, Pin.OUT, Pin.PULL_PU, 0) +SCLK = Pin(Pin.GPIO1, Pin.OUT, Pin.PULL_PU, 0) + +# 变量初始化 +i = 0 +j = 0 + +# 字模元组 0 1 2 3 4 5 6 7 8 9 A b C d E F - +LED_fonts = (0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E, 0xBF) + + +# 向74HC595写入数据的函数 +def LED_OUT(data): + for i in range(8): + if data & 0X80: + DIO.write(1) + else: + DIO.write(0) + data <<= 1 + SCLK.write(0) + SCLK.write(1) + + +# 数码管依次显示17个字模的函数 +def LED_Display(): + for j in range(17): + LED_OUT(LED_fonts[j]) + LED_OUT(0x0f) + RCLK.write(0) + RCLK.write(1) + utime.sleep(1) + + +if __name__ == "__main__": + while True: + LED_Display() diff --git a/docs/Advanced_development/zh/QuecPythonSub/code/PWM.py b/docs/Advanced_development/zh/QuecPythonSub/code/PWM.py deleted file mode 100644 index 33c5f490241f65b3617316f538c60bea27afe85a..0000000000000000000000000000000000000000 --- a/docs/Advanced_development/zh/QuecPythonSub/code/PWM.py +++ /dev/null @@ -1,20 +0,0 @@ -from misc import PWM -import utime - -pwm = PWM(PWM.PWM5, 10, 20) -pwm.open() - -highTime = 10 -dir = 1 - -while 1: - if dir: - highTime += 2 - if highTime >= 20: - dir = 0 - else: - highTime -= 2 - if highTime <= 2: - dir = 1 - PWM(PWM.PWM5, highTime, 20) - utime.sleep_ms(100) \ No newline at end of file diff --git a/docs/little_demo/zh/QuecPythonTest/code/Photoresistor.py b/docs/Advanced_development/zh/QuecPythonSub/code/Photoresistor.py similarity index 96% rename from docs/little_demo/zh/QuecPythonTest/code/Photoresistor.py rename to docs/Advanced_development/zh/QuecPythonSub/code/Photoresistor.py index 369702888845483417c4e42a785524280958e0a0..171b64f561878b3bec1e24cd05783b12fadbbcfc 100644 --- a/docs/little_demo/zh/QuecPythonTest/code/Photoresistor.py +++ b/docs/Advanced_development/zh/QuecPythonSub/code/Photoresistor.py @@ -1,46 +1,46 @@ -''' -File: Photoresistor.py -Project: adc -File Created: Thursday, 24th December 2020 5:44:08 pm -Author: chengzhu.zhou ------ -Last Modified: Wednesday, 30th December 2020 10:10:33 am -Modified By: chengzhu.zhou ------ -Copyright 2020 - 2020 quectel -''' - - -from misc import ADC -import utime as time -import _thread - -# unit as Ω -def Voltage_to_Resistance(Volt): - # - Va = 2 * Volt - resistance = (2 * 4700 * 40200 * Va)/(2 * 4700 * (3300 - Va) - (40200 * Va)) - return resistance - - -def Photoresistor_thread(delay, retryCount): - # creat a adc device - AdcDevice = ADC() - while retryCount: - retryCount = retryCount - 1 - # get ADC.ADC0 value - adcvalue = AdcDevice.read(ADC.ADC0) - print("get ADC.ADC0 Voltage value as {0}mv".format(adcvalue)) - # Converted to resistance - resistance = Voltage_to_Resistance(adcvalue) - print("Photoresistor resistance as {0}Ω".format(resistance)) - time.sleep(delay) - pass - - -if __name__ == "__main__": - # creat a thread Convert ADC to Voltage - _thread.start_new_thread(Photoresistor_thread, (1, 10)) - print("creent main thread has exit") - - +''' +File: Photoresistor.py +Project: adc +File Created: Thursday, 24th December 2020 5:44:08 pm +Author: chengzhu.zhou +----- +Last Modified: Wednesday, 30th December 2020 10:10:33 am +Modified By: chengzhu.zhou +----- +Copyright 2020 - 2020 quectel +''' + + +from misc import ADC +import utime as time +import _thread + +# unit as Ω +def Voltage_to_Resistance(Volt): + # + Va = 2 * Volt + resistance = (2 * 4700 * 40200 * Va)/(2 * 4700 * (3300 - Va) - (40200 * Va)) + return resistance + + +def Photoresistor_thread(delay, retryCount): + # creat a adc device + AdcDevice = ADC() + while retryCount: + retryCount = retryCount - 1 + # get ADC.ADC0 value + adcvalue = AdcDevice.read(ADC.ADC0) + print("get ADC.ADC0 Voltage value as {0}mv".format(adcvalue)) + # Converted to resistance + resistance = Voltage_to_Resistance(adcvalue) + print("Photoresistor resistance as {0}Ω".format(resistance)) + time.sleep(delay) + pass + + +if __name__ == "__main__": + # creat a thread Convert ADC to Voltage + _thread.start_new_thread(Photoresistor_thread, (1, 10)) + print("creent main thread has exit") + + diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/4482bfc474c4c09e9e2be00e462bea32.png b/docs/Advanced_development/zh/QuecPythonSub/media/4482bfc474c4c09e9e2be00e462bea32.png deleted file mode 100644 index ac54a7f7f7254913caad85411ad043e9f6d86535..0000000000000000000000000000000000000000 Binary files a/docs/Advanced_development/zh/QuecPythonSub/media/4482bfc474c4c09e9e2be00e462bea32.png and /dev/null differ diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/Digital_tube_experiment_phenomenon.png b/docs/Advanced_development/zh/QuecPythonSub/media/Digital_tube_experiment_phenomenon.png new file mode 100644 index 0000000000000000000000000000000000000000..0f214ce4c1f33b63606c04fdc35bd2b9dc899c77 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonSub/media/Digital_tube_experiment_phenomenon.png differ diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/Schematic_diagram_of_nixie_tube_module.png b/docs/Advanced_development/zh/QuecPythonSub/media/Schematic_diagram_of_nixie_tube_module.png new file mode 100644 index 0000000000000000000000000000000000000000..e719133601c15136ed84efb70b71699279348df6 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonSub/media/Schematic_diagram_of_nixie_tube_module.png differ diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/camera_hw.png b/docs/Advanced_development/zh/QuecPythonSub/media/camera_hw.png new file mode 100644 index 0000000000000000000000000000000000000000..0b5f1376ba53807e0dce4469bf71479b663c1c19 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonSub/media/camera_hw.png differ diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/ee3e5721dff49d3ba045fd33cadcdc0c.png b/docs/Advanced_development/zh/QuecPythonSub/media/ee3e5721dff49d3ba045fd33cadcdc0c.png deleted file mode 100644 index af1606cbfb2d099ebb11176160ce6edfa430c3e0..0000000000000000000000000000000000000000 Binary files a/docs/Advanced_development/zh/QuecPythonSub/media/ee3e5721dff49d3ba045fd33cadcdc0c.png and /dev/null differ diff --git a/docs/little_demo/zh/QuecPythonTest/media/519176882b0943e5900c9ef59fccd5da.png b/docs/Advanced_development/zh/QuecPythonSub/media/photoresistor_1.png similarity index 100% rename from docs/little_demo/zh/QuecPythonTest/media/519176882b0943e5900c9ef59fccd5da.png rename to docs/Advanced_development/zh/QuecPythonSub/media/photoresistor_1.png diff --git a/docs/little_demo/zh/QuecPythonTest/media/d511695f57c22b01b84111001a198c20.png b/docs/Advanced_development/zh/QuecPythonSub/media/photoresistor_2.png similarity index 100% rename from docs/little_demo/zh/QuecPythonTest/media/d511695f57c22b01b84111001a198c20.png rename to docs/Advanced_development/zh/QuecPythonSub/media/photoresistor_2.png diff --git a/docs/little_demo/zh/QuecPythonTest/media/819e212ba12846f5ed1b5879ce8f50d7.png b/docs/Advanced_development/zh/QuecPythonSub/media/photoresistor_3.png similarity index 100% rename from docs/little_demo/zh/QuecPythonTest/media/819e212ba12846f5ed1b5879ce8f50d7.png rename to docs/Advanced_development/zh/QuecPythonSub/media/photoresistor_3.png diff --git a/docs/little_demo/zh/QuecPythonTest/media/0bd28ff05bebe5c88f892e0ada5f3b90.png b/docs/Advanced_development/zh/QuecPythonSub/media/photoresistor_4.png similarity index 100% rename from docs/little_demo/zh/QuecPythonTest/media/0bd28ff05bebe5c88f892e0ada5f3b90.png rename to docs/Advanced_development/zh/QuecPythonSub/media/photoresistor_4.png diff --git a/docs/little_demo/zh/QuecPythonTest/media/dd6e240cbb4d95c565abed6c4d591482.png b/docs/Advanced_development/zh/QuecPythonSub/media/photoresistor_5.png similarity index 100% rename from docs/little_demo/zh/QuecPythonTest/media/dd6e240cbb4d95c565abed6c4d591482.png rename to docs/Advanced_development/zh/QuecPythonSub/media/photoresistor_5.png diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/photoresistor_6.png b/docs/Advanced_development/zh/QuecPythonSub/media/photoresistor_6.png new file mode 100644 index 0000000000000000000000000000000000000000..e1dba48bf52138d10014cf41be378f24fb5339cd Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonSub/media/photoresistor_6.png differ diff --git "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\276 3 \357\274\232 EC600S_QuecPython_EVB_V1.1\345\256\236\347\211\251\346\216\245\347\272\277\345\233\276.jpg" "b/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\276 3 \357\274\232 EC600S_QuecPython_EVB_V1.1\345\256\236\347\211\251\346\216\245\347\272\277\345\233\276.jpg" deleted file mode 100644 index 83f06a07c74545e3046ffe988f0921c6b3a795ce..0000000000000000000000000000000000000000 Binary files "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\276 3 \357\274\232 EC600S_QuecPython_EVB_V1.1\345\256\236\347\211\251\346\216\245\347\272\277\345\233\276.jpg" and /dev/null differ diff --git "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\27610\357\274\232\345\233\276\347\211\207\346\230\276\347\244\272.jpg" "b/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\27610\357\274\232\345\233\276\347\211\207\346\230\276\347\244\272.jpg" deleted file mode 100644 index 179be1dc86aeb0f911878dbcf5e4d74a9eb34c4d..0000000000000000000000000000000000000000 Binary files "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\27610\357\274\232\345\233\276\347\211\207\346\230\276\347\244\272.jpg" and /dev/null differ diff --git "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\27611\357\274\232\350\203\214\345\205\211.jpg" "b/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\27611\357\274\232\350\203\214\345\205\211.jpg" deleted file mode 100644 index 0324c4aedd24fa2b99acc7e1475ddd4e9379f261..0000000000000000000000000000000000000000 Binary files "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\27611\357\274\232\350\203\214\345\205\211.jpg" and /dev/null differ diff --git "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2761\357\274\232\346\240\207\345\207\2064\347\272\277SPI\345\244\226\346\216\245 TFT\347\232\204\345\217\202\350\200\203\350\256\276\350\256\241.jpg" "b/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2761\357\274\232\346\240\207\345\207\2064\347\272\277SPI\345\244\226\346\216\245 TFT\347\232\204\345\217\202\350\200\203\350\256\276\350\256\241.jpg" deleted file mode 100644 index d45d8f81ab43090af4167c673f31f60f68dc33a4..0000000000000000000000000000000000000000 Binary files "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2761\357\274\232\346\240\207\345\207\2064\347\272\277SPI\345\244\226\346\216\245 TFT\347\232\204\345\217\202\350\200\203\350\256\276\350\256\241.jpg" and /dev/null differ diff --git "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2762\357\274\232 EC600S_QuecPython_EVB_V1.1\345\256\236\347\211\251\345\233\276.jpg" "b/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2762\357\274\232 EC600S_QuecPython_EVB_V1.1\345\256\236\347\211\251\345\233\276.jpg" deleted file mode 100644 index fce9d81ae9ae67ed2b6e6cd247eadbc3697d819d..0000000000000000000000000000000000000000 Binary files "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2762\357\274\232 EC600S_QuecPython_EVB_V1.1\345\256\236\347\211\251\345\233\276.jpg" and /dev/null differ diff --git "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2764\357\274\232\344\270\262\345\217\243\351\200\211\346\213\251.jpg" "b/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2764\357\274\232\344\270\262\345\217\243\351\200\211\346\213\251.jpg" deleted file mode 100644 index d0d74e0e899576103db2d6f9c95f1f681ba2004d..0000000000000000000000000000000000000000 Binary files "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2764\357\274\232\344\270\262\345\217\243\351\200\211\346\213\251.jpg" and /dev/null differ diff --git "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2765\357\274\232image2LCD.jpg" "b/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2765\357\274\232image2LCD.jpg" deleted file mode 100644 index d569c8ea6a6056e185005af7a848fcb6294e240b..0000000000000000000000000000000000000000 Binary files "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2765\357\274\232image2LCD.jpg" and /dev/null differ diff --git "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2766\357\274\232\346\261\211\345\255\227\345\217\226\346\250\2411.jpg" "b/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2766\357\274\232\346\261\211\345\255\227\345\217\226\346\250\2411.jpg" deleted file mode 100644 index 68cd167605cd6bc331ac9f921c5b3325d649f5fd..0000000000000000000000000000000000000000 Binary files "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2766\357\274\232\346\261\211\345\255\227\345\217\226\346\250\2411.jpg" and /dev/null differ diff --git "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2767\357\274\232\346\261\211\345\255\227\345\217\226\346\250\2412.jpg" "b/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2767\357\274\232\346\261\211\345\255\227\345\217\226\346\250\2412.jpg" deleted file mode 100644 index ccf35bc2c93b6b6e256a9d3e4d5801ab44043500..0000000000000000000000000000000000000000 Binary files "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2767\357\274\232\346\261\211\345\255\227\345\217\226\346\250\2412.jpg" and /dev/null differ diff --git "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2768\357\274\232\346\261\211\345\255\227\345\217\226\346\250\2413.jpg" "b/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2768\357\274\232\346\261\211\345\255\227\345\217\226\346\250\2413.jpg" deleted file mode 100644 index 97d81540415f1baed0db17cea9378f04585a3ed9..0000000000000000000000000000000000000000 Binary files "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2768\357\274\232\346\261\211\345\255\227\345\217\226\346\250\2413.jpg" and /dev/null differ diff --git "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2769\357\274\232\345\257\274\345\205\245\346\226\207\344\273\266.jpg" "b/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2769\357\274\232\345\257\274\345\205\245\346\226\207\344\273\266.jpg" deleted file mode 100644 index 5da22d44e4808cf96be135a27ef9b31425204514..0000000000000000000000000000000000000000 Binary files "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2769\357\274\232\345\257\274\345\205\245\346\226\207\344\273\266.jpg" and /dev/null differ diff --git a/docs/Advanced_development/zh/QuecPythonThird/BLE.md b/docs/Advanced_development/zh/QuecPythonThird/BLE.md new file mode 100644 index 0000000000000000000000000000000000000000..2936173e25be0cee10018b80d4573ff2520c8b6c --- /dev/null +++ b/docs/Advanced_development/zh/QuecPythonThird/BLE.md @@ -0,0 +1,1325 @@ + +本文主要介绍如何使用QuecPython的BLE功能,并提供一个基本的BLE主从交互示例来作为用户开发的参考。 +## 文档历史 + +| **版本** | **日期** | **作者** | **变更表述** | +| -------- | -------- | -------- | ------------ | +| 1.0 | 2021-09-31| jayceon | 初始版本 | + +## 功能支持 + +当前支持BLE功能的模组有EC200U和EC600U系列。使用的是4.2版本的BLE,模块支持BLE 做主机端和做从机端的功能,一个模块同一时刻只能作为主机或者从机,不能同时进行。 + +## BLE 简介 + +BLE (Bluetooth Low Energy),即低功耗蓝牙,是由传统蓝牙发展而来的一种低功耗无线传输技术,非常适合低功耗、低成本的产品设计。 + +## BLE API使用说明 + +请参考QuecPython官方网站上的Wiki说明:[BLE API 说明](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=ble-蓝牙低功耗) + +## BLE Server 和 Client 的一般开发流程 + +### BLE Server 流程 + +![1-BLE Server流程](media\1-BLE Server流程.png) + +### BLE Client 流程 + +2-BLE Client流程 + +## 示例程序 + +### BLE Server 示例 + +```python +# -*- coding: UTF-8 -*- + +import ble +import utime + + +BLE_GATT_SYS_SERVICE = 0 # 0-删除系统默认的GAP和GATT服务 1-保留系统默认的GAP和GATT服务 +BLE_SERVER_HANDLE = 0 +_BLE_NAME = "Quectel_ble" + + +event_dict = { + 'BLE_START_STATUS_IND': 0, # ble start + 'BLE_STOP_STATUS_IND': 1, # ble stop + 'BLE_CONNECT_IND': 16, # ble connect + 'BLE_DISCONNECT_IND': 17, # ble disconnect + 'BLE_UPDATE_CONN_PARAM_IND': 18, # ble update connection parameter + 'BLE_SCAN_REPORT_IND': 19, # ble gatt client scan and report other devices + 'BLE_GATT_MTU': 20, # ble connection mtu + 'BLE_GATT_RECV_WRITE_IND': 21, # when ble client write characteristic value or descriptor,server get the notice + 'BLE_GATT_RECV_READ_IND': 22, # when ble client read characteristic value or descriptor,server get the notice + 'BLE_GATT_RECV_NOTIFICATION_IND': 23, # client receive notification + 'BLE_GATT_RECV_INDICATION_IND': 24, # client receive indication + 'BLE_GATT_SEND_END': 25, # server send notification,and receive send end notice +} + +class EVENT(dict): + def __getattr__(self, item): + return self[item] + + def __setattr__(self, key, value): + raise ValueError("{} is read-only.".format(key)) + +event = EVENT(event_dict) + +def ble_callback(args): + global BLE_GATT_SYS_SERVICE + global BLE_SERVER_HANDLE + event_id = args[0] + status = args[1] + print('[ble_callback]: event_id={}, status={}'.format(event_id, status)) + + if event_id == event.BLE_START_STATUS_IND: # ble start + if status == 0: + print('[callback] BLE start success.') + ret = ble_gatt_set_name() + if ret != 0: + ble_gatt_close() + return + ret = ble_gatt_set_param() + if ret != 0: + ble_gatt_close() + return + ret = ble_gatt_set_data() + if ret != 0: + ble_gatt_close() + return + ret = ble_gatt_set_rsp_data() + if ret != 0: + ble_gatt_close() + return + ret = ble_gatt_add_service() + if ret != 0: + ble_gatt_close() + return + ret = ble_gatt_add_characteristic() + if ret != 0: + ble_gatt_close() + return + ret = ble_gatt_add_characteristic_value() + if ret != 0: + ble_gatt_close() + return + ret = ble_gatt_add_characteristic_desc() + if ret != 0: + ble_gatt_close() + return + ret = ble_gatt_add_service_complete() + if ret != 0: + ble_gatt_close() + return + if BLE_GATT_SYS_SERVICE == 0: + BLE_SERVER_HANDLE = 1 + else: + BLE_SERVER_HANDLE = 16 + ret = ble_adv_start() + if ret != 0: + ble_gatt_close() + return + else: + print('[callback] BLE start failed.') + elif event_id == event.BLE_STOP_STATUS_IND: # ble stop + if status == 0: + print('[callback] ble stop successful.') + else: + print('[callback] ble stop failed.') + elif event_id == event.BLE_CONNECT_IND: # ble connect + if status == 0: + print('[callback] ble connect successful.') + connect_id = args[2] + addr = args[3] + addr_str = '{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}'.format(addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]) + print('[callback] connect_id = {}, addr = {}'.format(connect_id, addr_str)) + + # utime.sleep(3) + ret = ble_gatt_send_notification() + if ret == 0: + print('[callback] ble_gatt_send_notification successful.') + else: + print('[callback] ble_gatt_send_notification failed.') + ble_gatt_close() + return + else: + print('[callback] ble connect failed.') + elif event_id == event.BLE_DISCONNECT_IND: # ble disconnect + if status == 0: + print('[callback] ble disconnect successful.') + connect_id = args[2] + addr = args[3] + addr_str = '{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}'.format(addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]) + ble_gatt_close() + print('[callback] connect_id = {}, addr = {}'.format(connect_id, addr_str)) + else: + print('[callback] ble disconnect failed.') + ble_gatt_close() + return + elif event_id == event.BLE_UPDATE_CONN_PARAM_IND: # ble update connection parameter + if status == 0: + print('[callback] ble update parameter successful.') + connect_id = args[2] + max_interval = args[3] + min_interval = args[4] + latency = args[5] + timeout = args[6] + print('[callback] connect_id={},max_interval={},min_interval={},latency={},timeout={}'.format(connect_id, max_interval, min_interval, latency, timeout)) + else: + print('[callback] ble update parameter failed.') + ble_gatt_close() + return + elif event_id == event.BLE_GATT_MTU: # ble connection mtu + if status == 0: + print('[callback] ble connect mtu successful.') + handle = args[2] + ble_mtu = args[3] + print('[callback] handle = {:#06x}, ble_mtu = {}'.format(handle, ble_mtu)) + else: + print('[callback] ble connect mtu failed.') + ble_gatt_close() + return + elif event_id == event.BLE_GATT_RECV_WRITE_IND: + if status == 0: + print('[callback] ble recv successful.') + data_len = args[2] + data = args[3] # 这是一个bytearray + attr_handle = args[4] + short_uuid = args[5] + long_uuid = args[6] # 这是一个bytearray + print('len={}, data:{}'.format(data_len, data)) + print('attr_handle = {:#06x}'.format(attr_handle)) + print('short uuid = {:#06x}'.format(short_uuid)) + print('long uuid = {}'.format(long_uuid)) + else: + print('[callback] ble recv failed.') + ble_gatt_close() + return + elif event_id == event.BLE_GATT_RECV_READ_IND: + if status == 0: + print('[callback] ble recv read successful.') + data_len = args[2] + data = args[3] # 这是一个bytearray + attr_handle = args[4] + short_uuid = args[5] + long_uuid = args[6] # 这是一个bytearray + print('len={}, data:{}'.format(data_len, data)) + print('attr_handle = {:#06x}'.format(attr_handle)) + print('short uuid = {:#06x}'.format(short_uuid)) + print('long uuid = {}'.format(long_uuid)) + else: + print('[callback] ble recv read failed.') + ble_gatt_close() + return + elif event_id == event.BLE_GATT_SEND_END: + if status == 0: + print('[callback] ble send data successful.') + else: + print('[callback] ble send data failed.') + else: + print('unknown event id.') + + +def ble_gatt_server_init(cb): + ret = ble.serverInit(cb) + if ret != 0: + print('ble_gatt_server_init failed.') + return -1 + print('ble_gatt_server_init success.') + return 0 + + +def ble_gatt_server_release(): + ret = ble.serverRelease() + if ret != 0: + print('ble_gatt_server_release failed.') + return -1 + print('ble_gatt_server_release success.') + return 0 + + +def ble_gatt_open(): + ret = ble.gattStart() + if ret != 0: + print('ble_gatt_open failed.') + return -1 + print('ble_gatt_open success.') + return 0 + + +def ble_gatt_close(): + ret = ble.gattStop() + if ret != 0: + print('ble_gatt_close failed.') + return -1 + print('ble_gatt_close success.') + return 0 + + +def ble_gatt_set_name(): + code = 0 # utf8 + name = _BLE_NAME + ret = ble.setLocalName(code, name) + if ret != 0: + print('ble_gatt_set_name failed.') + return -1 + print('ble_gatt_set_name success.') + return 0 + + +def ble_gatt_set_param(): + min_adv = 0x300 + max_adv = 0x320 + adv_type = 0 # 可连接的非定向广播,默认选择 + addr_type = 0 # 公共地址 + channel = 0x07 + filter_strategy = 0 # 处理所有设备的扫描和连接请求 + discov_mode = 2 + no_br_edr = 1 + enable_adv = 1 + ret = ble.setAdvParam(min_adv, max_adv, adv_type, addr_type, channel, filter_strategy, discov_mode, no_br_edr, enable_adv) + if ret != 0: + print('ble_gatt_set_param failed.') + return -1 + print('ble_gatt_set_param success.') + return 0 + + +def ble_gatt_set_data(): + adv_data = [0x02, 0x01, 0x05] + ble_name = _BLE_NAME + length = len(ble_name) + 1 + adv_data.append(length) + adv_data.append(0x09) + name_encode = ble_name.encode('UTF-8') + for i in range(0, len(name_encode)): + adv_data.append(name_encode[i]) + print('set adv_data:{}'.format(adv_data)) + data = bytearray(adv_data) + ret = ble.setAdvData(data) + if ret != 0: + print('ble_gatt_set_data failed.') + return -1 + print('ble_gatt_set_data success.') + return 0 + + +def ble_gatt_set_rsp_data(): + adv_data = [] + ble_name = _BLE_NAME + length = len(ble_name) + 1 + adv_data.append(length) + adv_data.append(0x09) + name_encode = ble_name.encode('UTF-8') + for i in range(0, len(name_encode)): + adv_data.append(name_encode[i]) + print('set adv_rsp_data:{}'.format(adv_data)) + data = bytearray(adv_data) + ret = ble.setAdvRspData(data) + if ret != 0: + print('ble_gatt_set_rsp_data failed.') + return -1 + print('ble_gatt_set_rsp_data success.') + return 0 + + +def ble_gatt_add_service(): + primary = 1 + server_id = 0x01 + uuid_type = 1 # 短UUID + uuid_s = 0x180F + uuid_l = bytearray([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]) + ret = ble.addService(primary, server_id, uuid_type, uuid_s, uuid_l) + if ret != 0: + print('ble_gatt_add_service failed.') + return -1 + print('ble_gatt_add_service success.') + return 0 + + +def ble_gatt_add_characteristic(): + server_id = 0x01 + chara_id = 0x01 + chara_prop = 0x02 | 0x10 | 0x20 # 0x02-可读 0x10-通知 0x20-指示 + uuid_type = 1 # 短UUID + uuid_s = 0x2A19 + uuid_l = bytearray([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]) + ret = ble.addChara(server_id, chara_id, chara_prop, uuid_type, uuid_s, uuid_l) + if ret != 0: + print('ble_gatt_add_characteristic failed.') + return -1 + print('ble_gatt_add_characteristic success.') + return 0 + + +def ble_gatt_add_characteristic_value(): + data = [] + server_id = 0x01 + chara_id = 0x01 + permission = 0x0001 | 0x0002 + uuid_type = 1 # 短UUID + uuid_s = 0x2A19 + uuid_l = bytearray([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]) + for i in range(0, 244): + data.append(0x00) + value = bytearray(data) + ret = ble.addCharaValue(server_id, chara_id, permission, uuid_type, uuid_s, uuid_l, value) + if ret != 0: + print('ble_gatt_add_characteristic_value failed.') + return -1 + print('ble_gatt_add_characteristic_value success.') + return 0 + + +def ble_gatt_add_characteristic_desc(): + data = [0x00, 0x00, 0x00, 0x00] + server_id = 0x01 + chara_id = 0x01 + permission = 0x0001 | 0x0002 + uuid_type = 1 # 短UUID + uuid_s = 0x2902 + uuid_l = bytearray([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]) + value = bytearray(data) + ret = ble.addCharaDesc(server_id, chara_id, permission, uuid_type, uuid_s, uuid_l, value) + if ret != 0: + print('ble_gatt_add_characteristic_desc failed.') + return -1 + print('ble_gatt_add_characteristic_desc success.') + return 0 + + +def ble_gatt_send_notification(): + global BLE_SERVER_HANDLE + data = [0x39, 0x39, 0x39, 0x39, 0x39] # 随便发点啥数据 + conn_id = 0 + attr_handle = BLE_SERVER_HANDLE + 2 + value = bytearray(data) + ret = ble.sendNotification(conn_id, attr_handle, value) + if ret != 0: + print('ble_gatt_send_notification failed.') + return -1 + print('ble_gatt_send_notification success.') + return 0 + + +def ble_gatt_add_service_complete(): + global BLE_GATT_SYS_SERVICE + ret = ble.addOrClearService(1, BLE_GATT_SYS_SERVICE) + if ret != 0: + print('ble_gatt_add_service_complete failed.') + return -1 + print('ble_gatt_add_service_complete success.') + return 0 + + +def ble_gatt_clear_service_complete(): + global BLE_GATT_SYS_SERVICE + ret = ble.addOrClearService(0, BLE_GATT_SYS_SERVICE) + if ret != 0: + print('ble_gatt_clear_service_complete failed.') + return -1 + print('ble_gatt_clear_service_complete success.') + return 0 + + +def ble_adv_start(): + ret = ble.advStart() + if ret != 0: + print('ble_adv_start failed.') + return -1 + print('ble_adv_start success.') + return 0 + + +def ble_adv_stop(): + ret = ble.advStop() + if ret != 0: + print('ble_adv_stop failed.') + return -1 + print('ble_adv_stop success.') + return 0 + + +def main(): + ret = ble_gatt_server_init(ble_callback) + if ret == 0: + ret = ble_gatt_open() + if ret != 0: + return -1 + else: + return -1 + count = 0 + while True: + utime.sleep(1) + count += 1 + if count % 5 == 0: + print('##### BLE running, count = {}......'.format(count)) + if count > 120: + count = 0 + print('!!!!! stop BLE now !!!!!') + ble_gatt_close() + ble_gatt_server_release() + return 0 + + +if __name__ == '__main__': + main() + +``` + +### BLE Client 示例 + +```python +# -*- coding: UTF-8 -*- + +import ble +import utime +import _thread +import checkNet +from queue import Queue + +PROJECT_NAME = "QuecPython_BLE_Client_Example" +PROJECT_VERSION = "1.0.0" +checknet = checkNet.CheckNetwork(PROJECT_NAME, PROJECT_VERSION) + +event_dict = { + 'BLE_START_STATUS_IND': 0, # ble start + 'BLE_STOP_STATUS_IND': 1, # ble stop + 'BLE_CONNECT_IND': 16, # ble connect + 'BLE_DISCONNECT_IND': 17, # ble disconnect + 'BLE_UPDATE_CONN_PARAM_IND': 18, # ble update connection parameter + 'BLE_SCAN_REPORT_IND': 19, # ble gatt client scan and report other devices + 'BLE_GATT_MTU': 20, # ble connection mtu + 'BLE_GATT_RECV_NOTIFICATION_IND': 23, # client receive notification + 'BLE_GATT_RECV_INDICATION_IND': 24, # client receive indication + 'BLE_GATT_START_DISCOVER_SERVICE_IND': 26, # start discover service + 'BLE_GATT_DISCOVER_SERVICE_IND': 27, # discover service + 'BLE_GATT_DISCOVER_CHARACTERISTIC_DATA_IND': 28, # discover characteristic + 'BLE_GATT_DISCOVER_CHARA_DESC_IND': 29, # discover characteristic descriptor + 'BLE_GATT_CHARA_WRITE_WITH_RSP_IND': 30, # write characteristic value with response + 'BLE_GATT_CHARA_WRITE_WITHOUT_RSP_IND': 31, # write characteristic value without response + 'BLE_GATT_CHARA_READ_IND': 32, # read characteristic value by handle + 'BLE_GATT_CHARA_READ_BY_UUID_IND': 33, # read characteristic value by uuid + 'BLE_GATT_CHARA_MULTI_READ_IND': 34, # read multiple characteristic value + 'BLE_GATT_DESC_WRITE_WITH_RSP_IND': 35, # write characteristic descriptor + 'BLE_GATT_DESC_READ_IND': 36, # read characteristic descriptor + 'BLE_GATT_ATT_ERROR_IND': 37, # attribute error +} + +gatt_status_dict = { + 'BLE_GATT_IDLE' : 0, + 'BLE_GATT_DISCOVER_SERVICE': 1, + 'BLE_GATT_DISCOVER_INCLUDES': 2, + 'BLE_GATT_DISCOVER_CHARACTERISTIC': 3, + 'BLE_GATT_WRITE_CHARA_VALUE': 4, + 'BLE_GATT_WRITE_CHARA_DESC': 5, + 'BLE_GATT_READ_CHARA_VALUE': 6, + 'BLE_GATT_READ_CHARA_DESC': 7, +} + +class EVENT(dict): + def __getattr__(self, item): + return self[item] + + def __setattr__(self, key, value): + raise ValueError("{} is read-only.".format(key)) + + +class BleClient(object): + def __init__(self): + self.ble_server_name = 'Quectel_ble' # 目标设备ble名称 + self.connect_id = 0 + self.connect_addr = 0 + self.gatt_statue = 0 + self.discover_service_mode = 0 # 0-discover all service, 1-discover service by uuid + + self.scan_param = { + 'scan_mode' : 1, # 积极扫描 + 'interval' : 0x0100, # 0x100, + 'scan_window' : 0x50, + 'filter_policy' : 0, + 'local_addr_type' : 0, + } + + self.scan_report_info = { + 'event_type' : 0, + 'name' : '', + 'addr_type' : 0, + 'addr' : 0, # 初始化时,用0表示无效值,实际存放bytearray + 'rssi' : 0, + 'data_len' : 0, + 'raw_data' : 0, + } + + self.target_service = { + 'start_handle' : 0, + 'end_handle' : 0, + 'uuid_type' : 1, # 短uuid + 'short_uuid' : 0x180F, # 电池电量服务 + 'long_uuid' : bytearray([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]) + } + + self.characteristic_list = [] + self.descriptor_list = [] + self.characteristic_count = 0 # ql_ble_gatt_chara_count + self.chara_descriptor_count = 0 # ql_ble_gatt_chara_desc_count + self.characteristic_index = 0 # ql_ble_gatt_chara_desc_index + self.current_chara_index = 0 # ql_ble_gatt_cur_chara + self.current_desc_index = 0 # ql_ble_gatt_chara_cur_desc + self.ble_short_uuid_pair_len = 7 + self.ble_long_uuid_pair_len = 21 + + ret = ble.clientInit(self.ble_client_callback) + if ret != 0: + print('ble client initialize failed.') + raise ValueError("BLE Client Init failed.") + else: + print('ble client initialize successful.') + print('') + + @staticmethod + def gatt_open(): + ret = ble.gattStart() + if ret != 0: + print('ble open failed.') + else: + print('ble open successful.') + print('') + return ret + + @staticmethod + def gatt_close(): + ret = ble.gattStop() + if ret != 0: + print('ble close failed.') + else: + print('ble close successful.') + print('') + return ret + + @staticmethod + def gatt_get_status(): + return ble.getStatus() + + @staticmethod + def release(): + ret = ble.clientRelease() + if ret != 0: + print('ble client release failed.') + else: + print('ble client release successful.') + print('') + return ret + + def set_scan_param(self): + scan_mode = self.scan_param['scan_mode'] + interval = self.scan_param['interval'] + scan_time = self.scan_param['scan_window'] + filter_policy = self.scan_param['filter_policy'] + local_addr_type = self.scan_param['local_addr_type'] + ret = ble.setScanParam(scan_mode, interval, scan_time, filter_policy, local_addr_type) + if ret != 0: + print('ble client set scan-parameters failed.') + else: + print('ble client set scan-parameters successful.') + print('') + return ret + + @staticmethod + def start_scan(): + ret = ble.scanStart() + if ret != 0: + print('ble client scan failed.') + else: + print('ble client scan successful.') + print('') + return ret + + @staticmethod + def stop_scan(): + ret = ble.scanStop() + if ret != 0: + print('ble client failed to stop scanning.') + else: + print('ble client scan stopped successfully.') + print('') + return ret + + def connect(self): + print('start to connect.....') + addr_type = self.scan_report_info['addr_type'] + addr = self.scan_report_info['addr'] + if addr != 0 and len(addr) == 6: + addr_str = '{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}'.format(addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]) + print('addr_type : {}, addr : {}'.format(addr_type, addr_str)) + ret = ble.connect(addr_type, addr) + if ret != 0: + print('ble client connect failed.') + else: + print('ble client connect successful.') + print('') + return ret + + def cancel_connect(self): + ret = ble.cancelConnect(self.scan_report_info['addr']) + if ret != 0: + print('ble client cancel connect failed.') + else: + print('ble client cancel connect successful.') + print('') + return ret + + def disconnect(self): + ret = ble.disconnect(self.connect_id) + if ret != 0: + print('ble client disconnect failed.') + else: + print('ble client disconnect successful.') + print('') + return ret + + def discover_all_service(self): + ret = ble.discoverAllService(self.connect_id) + if ret != 0: + print('ble client discover all service failed.') + else: + print('ble client discover all service successful.') + print('') + return ret + + def discover_service_by_uuid(self): + connect_id = self.connect_id + uuid_type = self.target_service['uuid_type'] + short_uuid = self.target_service['short_uuid'] + long_uuid = self.target_service['long_uuid'] + ret = ble.discoverByUUID(connect_id, uuid_type, short_uuid, long_uuid) + if ret != 0: + print('ble client discover service by uuid failed.') + else: + print('ble client discover service by uuid successful.') + print('') + return ret + + def discover_all_includes(self): + connect_id = self.connect_id + start_handle = self.target_service['start_handle'] + end_handle = self.target_service['end_handle'] + ret = ble.discoverAllIncludes(connect_id, start_handle, end_handle) + if ret != 0: + print('ble client discover all includes failed.') + else: + print('ble client discover all includes successful.') + print('') + return ret + + def discover_all_characteristic(self): + connect_id = self.connect_id + start_handle = self.target_service['start_handle'] + end_handle = self.target_service['end_handle'] + ret = ble.discoverAllChara(connect_id, start_handle, end_handle) + if ret != 0: + print('ble client discover all characteristic failed.') + else: + print('ble client discover all characteristic successful.') + print('') + return ret + + def discover_all_characteristic_descriptor(self): + connect_id = self.connect_id + index = self.characteristic_index + start_handle = self.characteristic_list[index]['value_handle'] + 1 + + if self.characteristic_index == (self.characteristic_count - 1): + end_handle = self.target_service['end_handle'] + print('[1]start_handle = {:#06x}, end_handle = {:#06x}'.format(start_handle - 1, end_handle)) + ret = ble.discoverAllCharaDesc(connect_id, start_handle, end_handle) + else: + end_handle = self.characteristic_list[index+1]['handle'] - 1 + print('[2]start_handle = {:#06x}, end_handle = {:#06x}'.format(start_handle - 1, end_handle)) + ret = ble.discoverAllCharaDesc(connect_id, start_handle, end_handle) + self.characteristic_index += 1 + if ret != 0: + print('ble client discover all characteristic descriptor failed.') + else: + print('ble client discover all characteristic descriptor successful.') + print('') + return ret + + def read_characteristic_by_uuid(self): + connect_id = self.connect_id + index = self.current_chara_index # 根据需要改变该值 + start_handle = self.characteristic_list[index]['handle'] + end_handle = self.characteristic_list[index]['value_handle'] + uuid_type = 1 + short_uuid = self.characteristic_list[index]['short_uuid'] + long_uuid = bytearray([0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00]) + + ret = ble.readCharaByUUID(connect_id, start_handle, end_handle, uuid_type, short_uuid, long_uuid) + if ret != 0: + print('ble client read characteristic by uuid failed.') + else: + print('ble client read characteristic by uuid successful.') + print('') + return ret + + def read_characteristic_by_handle(self): + connect_id = self.connect_id + index = self.current_chara_index # 根据需要改变该值 + handle = self.characteristic_list[index]['value_handle'] + offset = 0 + is_long = 0 + + ret = ble.readCharaByHandle(connect_id, handle, offset, is_long) + if ret != 0: + print('ble client read characteristic by handle failed.') + else: + print('ble client read characteristic by handle successful.') + print('') + return ret + + def read_characteristic_descriptor(self): + connect_id = self.connect_id + index = self.current_desc_index # 根据需要改变该值 + handle = self.descriptor_list[index]['handle'] + print('handle = {:#06x}'.format(handle)) + is_long = 0 + ret = ble.readCharaDesc(connect_id, handle, is_long) + if ret != 0: + print('ble client read characteristic descriptor failed.') + else: + print('ble client read characteristic descriptor successful.') + print('') + return ret + + def write_characteristic(self): + connect_id = self.connect_id + index = self.current_chara_index # 根据需要改变该值 + handle = self.characteristic_list[index]['value_handle'] + offset = 0 + is_long = 0 + data = bytearray([0x40, 0x00]) + print('value_handle = {:#06x}, uuid = {:#06x}'.format(handle, self.characteristic_list[index]['short_uuid'])) + ret = ble.writeChara(connect_id, handle, offset, is_long, data) + if ret != 0: + print('ble client write characteristic failed.') + else: + print('ble client read characteristic successful.') + print('') + return ret + + def write_characteristic_no_rsp(self): + connect_id = self.connect_id + index = self.current_chara_index # 根据需要改变该值 + handle = self.characteristic_list[index]['value_handle'] + data = bytearray([0x20, 0x00]) + print('value_handle = {:#06x}, uuid = {:#06x}'.format(handle, self.characteristic_list[index]['short_uuid'])) + ret = ble.writeCharaNoRsp(connect_id, handle, data) + if ret != 0: + print('ble client write characteristic no rsp failed.') + else: + print('ble client read characteristic no rsp successful.') + print('') + return ret + + def write_characteristic_descriptor(self): + connect_id = self.connect_id + index = self.current_desc_index # 根据需要改变该值 + handle = self.descriptor_list[index]['handle'] + data = bytearray([0x01, 0x02]) + print('handle = {:#06x}'.format(handle)) + + ret = ble.writeCharaDesc(connect_id, handle, data) + if ret != 0: + print('ble client write characteristic descriptor failed.') + else: + print('ble client read characteristic descriptor successful.') + print('') + return ret + + @staticmethod + def ble_client_callback(args): + global msg_queue + msg_queue.put(args) + + +def ble_gatt_client_event_handler(): + global msg_queue + old_time = 0 + while True: + cur_time = utime.localtime() + timestamp = "{:02d}:{:02d}:{:02d}".format(cur_time[3], cur_time[4], cur_time[5]) + if cur_time[5] != old_time and cur_time[5] % 5 == 0: + old_time = cur_time[5] + print('[{}]event handler running.....'.format(timestamp)) + print('') + msg = msg_queue.get() # 没有消息时会阻塞在这 + # print('msg : {}'.format(msg)) + event_id = msg[0] + status = msg[1] + + if event_id == event.BLE_START_STATUS_IND: + print('') + print('event_id : BLE_START_STATUS_IND, status = {}'.format(status)) + if status == 0: + print('BLE start successful.') + ble_status = ble_client.gatt_get_status() + if ble_status == 0: + print('BLE Status : stopped.') + break + elif ble_status == 1: + print('BLE Status : started.') + else: + print('get ble status error.') + ble_client.gatt_close() + break + + ret = ble_client.set_scan_param() + if ret != 0: + ble_client.gatt_close() + break + ret = ble_client.start_scan() + if ret != 0: + ble_client.gatt_close() + break + else: + print('BLE start failed.') + break + elif event_id == event.BLE_STOP_STATUS_IND: + print('') + print('event_id : BLE_STOP_STATUS_IND, status = {}'.format(status)) + if status == 0: + print('ble stop successful.') + else: + print('ble stop failed.') + break + elif event_id == event.BLE_CONNECT_IND: + print('') + print('event_id : BLE_CONNECT_IND, status = {}'.format(status)) + if status == 0: + ble_client.connect_id = msg[2] + ble_client.connect_addr = msg[3] + addr = ble_client.connect_addr + addr_str = '{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}'.format(addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]) + print('connect_id : {:#x}, connect_addr : {}'.format(ble_client.connect_id, addr_str)) + else: + print('ble connect failed.') + break + elif event_id == event.BLE_DISCONNECT_IND: + print('') + print('event_id : BLE_DISCONNECT_IND, status = {}'.format(status)) + if status == 0: + ble_client.connect_id = msg[2] + ble_client.connect_addr = msg[3] + addr = ble_client.connect_addr + addr_str = '{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}'.format(addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]) + print('connect_id : {:#x}, connect_addr : {}'.format(ble_client.connect_id, addr_str)) + else: + print('ble disconnect failed.') + ble_client.gatt_close() + break + elif event_id == event.BLE_UPDATE_CONN_PARAM_IND: + print('') + print('event_id : BLE_UPDATE_CONN_PARAM_IND, status = {}'.format(status)) + if status == 0: + connect_id = msg[2] + max_interval = msg[3] + min_interval = msg[4] + latency = msg[5] + timeout = msg[6] + print('connect_id={},max_interval={},min_interval={},latency={},timeout={}'.format(connect_id,max_interval,min_interval,latency,timeout)) + else: + print('ble update parameter failed.') + ble_client.gatt_close() + break + elif event_id == event.BLE_SCAN_REPORT_IND: + # print('') + # print('event_id : BLE_SCAN_REPORT_IND, status = {}'.format(status)) + if status == 0: + # print(' ble scan successful.') + + ble_client.scan_report_info['event_type'] = msg[2] + ble_client.scan_report_info['name'] = msg[3] + ble_client.scan_report_info['addr_type'] = msg[4] + ble_client.scan_report_info['addr'] = msg[5] + ble_client.scan_report_info['rssi'] = msg[6] + ble_client.scan_report_info['data_len'] = msg[7] + ble_client.scan_report_info['raw_data'] = msg[8] + + device_name = ble_client.scan_report_info['name'] + addr = ble_client.scan_report_info['addr'] + rssi = ble_client.scan_report_info['rssi'] + addr_type = ble_client.scan_report_info['addr_type'] + addr_str = '{:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}'.format(addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]) + if device_name != '' and rssi != 0: + print('name: {}, addr: {}, rssi: {}, addr_type: {}'.format(device_name, addr_str, rssi, addr_type)) + print('raw_data: {}'.format(ble_client.scan_report_info['raw_data'])) + + if device_name == ble_client.ble_server_name: # 扫描到目标设备后就停止扫描 + ret = ble_client.stop_scan() + if ret != 0: + ble_client.gatt_close() + break + + ret = ble_client.connect() + if ret != 0: + ble_client.gatt_close() + break + else: + print('ble scan failed.') + ret = ble_client.stop_scan() + if ret != 0: + ble_client.gatt_close() + break + elif event_id == event.BLE_GATT_MTU: + print('') + print('event_id : BLE_GATT_MTU, status = {}'.format(status)) + if status == 0: + handle = msg[2] + ble_mtu = msg[3] + print('handle = {:#06x}, ble_mtu = {}'.format(handle, ble_mtu)) + else: + print('ble connect mtu failed.') + ble_client.gatt_close() + break + elif event_id == event.BLE_GATT_RECV_NOTIFICATION_IND: + print('') + print('event_id : BLE_GATT_RECV_NOTIFICATION_IND, status = {}'.format(status)) + if status == 0: + data_len = msg[2] + data = msg[3] + print('len={}, data:{}'.format(data_len, data)) + handle = (data[1] << 8) | data[0] + print('handle = {:#06x}'.format(handle)) + else: + print('ble receive notification failed.') + break + elif event_id == event.BLE_GATT_RECV_INDICATION_IND: + print('') + print('event_id : BLE_GATT_RECV_INDICATION_IND, status = {}'.format(status)) + if status == 0: + data_len = msg[2] + data = msg[3] + print('len={}, data:{}'.format(data_len, data)) + else: + print('ble receive indication failed.') + break + elif event_id == event.BLE_GATT_START_DISCOVER_SERVICE_IND: + print('') + print('event_id : BLE_GATT_START_DISCOVER_SERVICE_IND, status = {}'.format(status)) + if status == 0: + ble_client.characteristic_count = 0 + ble_client.chara_descriptor_count = 0 + ble_client.characteristic_index = 0 + ble_client.gatt_statue = gatt_status.BLE_GATT_DISCOVER_SERVICE + + if ble_client.discover_service_mode == 0: + print('execute the function discover_all_service.') + ret = ble_client.discover_all_service() + else: + print('execute the function discover_service_by_uuid.') + ret = ble_client.discover_service_by_uuid() + if ret != 0: + print('Execution result: Failed.') + ble_client.gatt_close() + break + else: + print('ble start discover service failed.') + ble_client.gatt_close() + break + elif event_id == event.BLE_GATT_DISCOVER_SERVICE_IND: + print('') + print('event_id : BLE_GATT_DISCOVER_SERVICE_IND, status = {}'.format(status)) + if status == 0: + start_handle = msg[2] + end_handle = msg[3] + short_uuid = msg[4] + print('start_handle = {:#06x}, end_handle = {:#06x}, short_uuid = {:#06x}'.format(start_handle, end_handle, short_uuid)) + if ble_client.discover_service_mode == 0: # discover service all + if ble_client.target_service['short_uuid'] == short_uuid: # 查找到所有服务后,按指定uuid查找特征值 + ble_client.target_service['start_handle'] = start_handle + ble_client.target_service['end_handle'] = end_handle + ble_client.gatt_statue = gatt_status.BLE_GATT_DISCOVER_CHARACTERISTIC + print('execute the function discover_all_characteristic.') + ret = ble_client.discover_all_characteristic() + if ret != 0: + print('Execution result: Failed.') + ble_client.gatt_close() + break + else: + ble_client.target_service['start_handle'] = start_handle + ble_client.target_service['end_handle'] = end_handle + ble_client.gatt_statue = gatt_status.BLE_GATT_DISCOVER_CHARACTERISTIC + print('execute the function discover_all_characteristic.') + ret = ble_client.discover_all_characteristic() + if ret != 0: + print('Execution result: Failed.') + ble_client.gatt_close() + break + else: + print('ble discover service failed.') + ble_client.gatt_close() + break + elif event_id == event.BLE_GATT_DISCOVER_CHARACTERISTIC_DATA_IND: + print('') + print('event_id : BLE_GATT_DISCOVER_CHARACTERISTIC_DATA_IND, status = {}'.format(status)) + if status == 0: + data_len = msg[2] + data = msg[3] + pair_len = data[0] + print('pair_len={}, len={}, data:{}'.format(pair_len, data_len, data)) + if data_len > 0: + if ble_client.gatt_statue == gatt_status.BLE_GATT_DISCOVER_CHARACTERISTIC: + i = 0 + while i < (data_len - 1) / pair_len: + chara_dict = { + 'handle' : (data[i * pair_len + 2] << 8) | data[i * pair_len + 1], + 'properties': data[i * pair_len + 3], + 'value_handle' : (data[i * pair_len + 5] << 8) | data[i * pair_len + 4], + 'uuid_type' : 0, + 'short_uuid' : 0x0000, + 'long_uuid' : bytearray([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]) + } + print('handle={:#06x}, properties={:#x}, value_handle={:#06x}'.format(chara_dict['handle'], chara_dict['properties'], chara_dict['value_handle'])) + if pair_len == ble_client.ble_short_uuid_pair_len: + chara_dict['uuid_type'] = 1 + chara_dict['short_uuid'] = (data[i * pair_len + 7] << 8) | data[i * pair_len + 6] + print('short_uuid:{:#06x}'.format(chara_dict['short_uuid'])) + elif pair_len == ble_client.ble_long_uuid_pair_len: + start_index = i * pair_len + 6 + end_index = start_index + 16 + chara_dict['uuid_type'] = 0 + chara_dict['long_uuid'] = data[start_index : end_index] + print('long_uuid:{}'.format(chara_dict['long_uuid'])) + i += 1 + if ble_client.characteristic_count < 5: + ble_client.characteristic_list.append(chara_dict) + ble_client.characteristic_count = len(ble_client.characteristic_list) + print('characteristic_list len = {}'.format(ble_client.characteristic_count)) + elif ble_client.gatt_statue == gatt_status.BLE_GATT_READ_CHARA_VALUE: + print('data_len = {}'.format(data_len)) + print('pay_load = {:02x},{:02x},{:02x},{:02x}'.format(data[0], data[1], data[2], data[3])) + else: + print('ble discover characteristic failed.') + ble_client.gatt_close() + break + elif event_id == event.BLE_GATT_DISCOVER_CHARA_DESC_IND: + print('') + print('event_id : BLE_GATT_DISCOVER_CHARA_DESC_IND, status = {}'.format(status)) + if status == 0: + data_len = msg[2] + data = msg[3] + fmt = data[0] + print('fmt={}, len={}, data:{}'.format(fmt, data_len, data)) + if data_len > 0: + i = 0 + if fmt == 1: # 16 bit uuid + while i < (data_len - 1) / 4: + descriptor_dict = { + 'handle': (data[i * 4 + 2] << 8) | data[i * 4 + 1], + 'short_uuid': (data[i * 4 + 4] << 8) | data[i * 4 + 3], + } + print('handle={:#06x}, uuid={:#06x}'.format(descriptor_dict['handle'], descriptor_dict['short_uuid'])) + i += 1 + if ble_client.chara_descriptor_count < 5: + ble_client.descriptor_list.append(descriptor_dict) + ble_client.chara_descriptor_count = len(ble_client.descriptor_list) + print('descriptor_list len = {}'.format(ble_client.chara_descriptor_count)) + if ble_client.characteristic_index == ble_client.characteristic_count: + print('execute the function read_characteristic_by_uuid.') + # ble_client.gatt_statue = gatt_status.BLE_GATT_WRITE_CHARA_VALUE + # ret = ble_client.write_characteristic() + # ret = ble_client.write_characteristic_no_rsp() + + ble_client.gatt_statue = gatt_status.BLE_GATT_READ_CHARA_VALUE + ret = ble_client.read_characteristic_by_uuid() + # ret = ble_client.read_characteristic_by_handle() + + # ble_client.gatt_statue = gatt_status.BLE_GATT_READ_CHARA_DESC + # ret = ble_client.read_characteristic_descriptor() + + # ble_client.gatt_statue = gatt_status.BLE_GATT_WRITE_CHARA_DESC + # ret = ble_client.write_characteristic_descriptor() + else: + print('execute the function discover_all_characteristic_descriptor.') + ret = ble_client.discover_all_characteristic_descriptor() + if ret != 0: + print('Execution result: Failed.') + ble_client.gatt_close() + break + else: + print('ble discover characteristic descriptor failed.') + ble_client.gatt_close() + break + elif event_id == event.BLE_GATT_CHARA_WRITE_WITH_RSP_IND: + print('') + print('event_id : BLE_GATT_CHARA_WRITE_WITH_RSP_IND, status = {}'.format(status)) + if status == 0: + if ble_client.gatt_statue == gatt_status.BLE_GATT_WRITE_CHARA_VALUE: + pass + elif ble_client.gatt_statue == gatt_status.BLE_GATT_WRITE_CHARA_DESC: + pass + else: + print('ble write characteristic with response failed.') + break + elif event_id == event.BLE_GATT_CHARA_WRITE_WITHOUT_RSP_IND: + print('') + print('event_id : BLE_GATT_CHARA_WRITE_WITHOUT_RSP_IND, status = {}'.format(status)) + if status == 0: + print('write characteristic value without response successful.') + else: + print('write characteristic value without response failed.') + break + elif event_id == event.BLE_GATT_CHARA_READ_IND: + print('') + # read characteristic value by handle + print('event_id : BLE_GATT_CHARA_READ_IND, status = {}'.format(status)) + if status == 0: + data_len = msg[2] + data = msg[3] + print('data_len = {}, data : {}'.format(data_len, data)) + if ble_client.gatt_statue == gatt_status.BLE_GATT_READ_CHARA_VALUE: + # print('read characteristic value by handle.') + pass + else: + print('ble read characteristic failed.') + break + elif event_id == event.BLE_GATT_CHARA_READ_BY_UUID_IND: + print('') + # read characteristic value by uuid + print('event_id : BLE_GATT_CHARA_READ_BY_UUID_IND, status = {}'.format(status)) + if status == 0: + data_len = msg[2] + data = msg[3] + print('data_len = {}, data : {}'.format(data_len, data)) + handle = (data[2] << 8) | data[1] + print('handle = {:#06x}'.format(handle)) + else: + print('ble read characteristic by uuid failed.') + break + elif event_id == event.BLE_GATT_CHARA_MULTI_READ_IND: + print('') + # read multiple characteristic value + print('event_id : BLE_GATT_CHARA_MULTI_READ_IND, status = {}'.format(status)) + if status == 0: + data_len = msg[2] + data = msg[3] + print('data_len = {}, data : {}'.format(data_len, data)) + else: + print('ble read multiple characteristic by uuid failed.') + break + elif event_id == event.BLE_GATT_DESC_WRITE_WITH_RSP_IND: + print('') + print('event_id : BLE_GATT_DESC_WRITE_WITH_RSP_IND, status = {}'.format(status)) + if status == 0: + if ble_client.gatt_statue == gatt_status.BLE_GATT_WRITE_CHARA_VALUE: + pass + elif ble_client.gatt_statue == gatt_status.BLE_GATT_WRITE_CHARA_DESC: + pass + else: + print('ble write characteristic descriptor failed.') + break + elif event_id == event.BLE_GATT_DESC_READ_IND: + print('') + # read characteristic descriptor + print('event_id : BLE_GATT_DESC_READ_IND, status = {}'.format(status)) + if status == 0: + data_len = msg[2] + data = msg[3] + print('data_len = {}, data : {}'.format(data_len, data)) + if ble_client.gatt_statue == gatt_status.BLE_GATT_READ_CHARA_DESC: + # print('read characteristic descriptor.') + pass + else: + print('ble read characteristic descriptor failed.') + break + elif event_id == event.BLE_GATT_ATT_ERROR_IND: + print('') + print('event_id : BLE_GATT_ATT_ERROR_IND, status = {}'.format(status)) + if status == 0: + errcode = msg[2] + print('errcode = {:#06x}'.format(errcode)) + if ble_client.gatt_statue == gatt_status.BLE_GATT_DISCOVER_INCLUDES: + ble_client.gatt_statue = gatt_status.BLE_GATT_DISCOVER_CHARACTERISTIC + print('execute the function discover_all_characteristic.') + ret = ble_client.discover_all_characteristic() + if ret != 0: + print('Execution result: Failed.') + ble_client.gatt_close() + break + elif ble_client.gatt_statue == gatt_status.BLE_GATT_DISCOVER_CHARACTERISTIC: + ble_client.gatt_statue = gatt_status.BLE_GATT_IDLE + print('execute the function discover_all_characteristic_descriptor.') + ret = ble_client.discover_all_characteristic_descriptor() + if ret != 0: + print('Execution result: Failed.') + ble_client.gatt_close() + break + else: + print('ble attribute error.') + ble_client.gatt_close() + break + else: + print('unknown event id : {}.'.format(event_id)) + + # ble_client.release() + + +event = EVENT(event_dict) +gatt_status = EVENT(gatt_status_dict) +msg_queue = Queue(50) +ble_client = BleClient() + + +def main(): + checknet.poweron_print_once() + print('create client event handler task.') + _thread.start_new_thread(ble_gatt_client_event_handler, ()) + ret = ble_client.gatt_open() + if ret != 0: + return -1 + + count = 0 + while True: + utime.sleep(1) + count += 1 + cur_time = utime.localtime() + timestamp = "{:02d}:{:02d}:{:02d}".format(cur_time[3], cur_time[4], cur_time[5]) + if count % 5 == 0: + print('[{}] BLE Client running, count = {}......'.format(timestamp, count)) + print('') + if count > 130: # 这里设置计数是为了程序运行一会自己退出,方便测试,实际根据用户需要来处理 + count = 0 + print('!!!!! stop BLE Client now !!!!!') + ble_status = ble_client.gatt_get_status() + if ble_status == 1: + ble_client.gatt_close() + ble_client.release() + break + else: + ble_status = ble_client.gatt_get_status() + if ble_status == 0: # stopped + print('BLE connection has been disconnected.') + ble_client.release() + break + +if __name__ == '__main__': + main() + +``` + + + +## 示例说明 + +上面分别提供了BLE作为从机端(server)和主机端(client)功能的示例程序。其中server的例程是设置了蓝牙名称为 “Quectel_ble”,然后增加了一个关于电池电量的服务(仅添加了服务)并设置了基本属性,将该示例放到模块中跑起来后,可通过手机上安装的nrf Connect软件去搜索名为 “Quectel_ble”的设备,并查看该设备提供的服务;client的示例程序,初始化完成后,开始扫描周边的BLE广播信息,如果扫描到名称为 “Quectel_ble”的设备就停止扫描,并去连接这个设备,然后去发现该设备提供了哪些服务、服务下又有哪些特征描述符等。用户可以用两个模块,一个运行server端示例,一个运行client端示例。 + +## 注意事项 + +运行程序之前,要先确认插好蓝牙天线,注意不要插错位置,应该插到开发板上标有BT、WiFi字样或者蓝牙标志的天线座子上。 + +## 示例程序下载 + +进入QuecPython官网资源下载页面:https://python.quectel.com/download ,找到标题为 “Demo”的选项,下载解压后,进入其中的BLE目录,即可找到对应的示例程序。 \ No newline at end of file diff --git a/docs/Advanced_development/zh/QuecPythonThird/HLS.md b/docs/Advanced_development/zh/QuecPythonThird/HLS.md new file mode 100644 index 0000000000000000000000000000000000000000..90ce1804207d335e77595e2d3418fb4d4b35166d --- /dev/null +++ b/docs/Advanced_development/zh/QuecPythonThird/HLS.md @@ -0,0 +1,231 @@ +## 文档历史 + +| **版本** | **日期** | **作者** | **变更表述** | +| -------- | ---------- | -------- | ------------ | +| 1.0 | 2021-09-31 | igni | 初始版本 | + +## 简介 + +HLS流媒体播放是基于HTTP协议实现的在线流媒体播放功能,其优势在于可以在不占用flash空间的情况下 实现音频播放,非常适合嵌入式项目应用。当前EC600U平台以及支持基于HTTP协议的流媒体播放功能 包括常用的网络媒体格式如M4A MP3 以及M3U8基于HTTP协议的在线直播,同时也支持RTMP格式的flv流在线音频播放。因为其不需要缓存整个多媒体文件,仅需要输入对应资源的链接 就可以以较少内存占用来实现音频多媒体播放,而且价格低廉,是低成本实现流媒体播放的解决方案之一 + +注意:RTMP流播需要支持RTMP的软件版本才能支持 + +### 流媒体播放以及原理 + +* HTTP:HTTP协议,由web服务器提供可下载的音频文件,设备通过请求链接获取资源存放于缓冲区并且播放,常见的网络音频格式多为m4a和mp3格式 另外,M3U8的直播流格式也是基于HTTP协议来实现,通过不断获取m3u8列表来更新http文件目录 实现流媒体播放 + +* RTMP:RTMP(Real-Time Messaging Protocol实时消息传送协议)的缩写,它是Adobe Systems公司为Flash播放器和服务器之间音频、视频和数据传输开发的协议。其原理为服务器提供FLV格式的视频流,头部包含解码相关信息,获取之后对FLV格式内容进行解码播放操作 + +## 硬件链接 +以QuecPython开发板为例,接入天线和SIM卡,之后短接1.8V供电和P40脚 给功放使能上电,在SPK+ SPK-上接入扬声器 即可开始测试 + +![](media/HLS.png) + +## API介绍 + +### 导入hls库 + +> **from hls import hls_audio** + +### 创建 hls 对象 + +> **hls = hls_audio(URL)** + +### 播放链接 + +> **hls.play(URL)** + +* 参数: +| 参数 | 类型 | 说明 | +| ---- | ------ | ------------------------------------------------------------ | +| URL | string | HTTP URL,格式如下:
http://host\[:port][/app[/filepath]]
RTMP URL,格式如下:
rtmp://host\[:port][/app[/playpath]] | + + +* 功能: + +根据用户传入的 HTTP URL 或者RTMP URL 播放对应的在线文件或者RTMP流。 调用后会先确定网络状态 再进行播放操作 + + +* 返回值: + +无返回值 后台会播放对应流媒体内容 + +* 示例: + +```python +from hls import hls_audio +hls = hls_audio() +hls.play("http://home.xiupa617.top:38080/file/down4.m4a") #播放m4a格式文件 +``` + +```python +from hls import hls_audio +hls = hls_audio() +hls.play("rtmp://58.200.131.2:1935/livetv/cctv1") #播放RTMP音频流 +``` + +### 停止播放链接 + +> **hls.close()** + +* 参数: +无参数,针对hls对象作用 + + +* 功能: + +停止当前hls对象的播放 + + +* 返回值: + +函数无返回值 后台会播放对应流媒体内容 并且打印相关信息 + +* 示例: + +```python +from hls import hls_audio +hls = hls_audio() +hls.play("http://home.xiupa617.top:38080/file/down4.m4a") #播放m4a格式文件 +hls.close() #停止m4a播放 +``` + +```python +from hls import hls_audio +hls = hls_audio() +hls.play("rtmp://58.200.131.2:1935/livetv/cctv1") #播放RTMP音频流 +hls.close() #停止RTMP流播 +``` + + +### 文件播放时间跳转 + +> **hls.seek_secs(second)** + +* 参数: +| 参数 | 类型 | 说明 | +| ---- | ------ | ------------------------------------------------------------| +| second | long | 跳转到对应的second秒数 | + + +* 功能: + +跳转当前播放文件到对应的second秒数,仅支持mp3 m4a文件 + + +* 返回值: + +无返回值 后台会播放对应流媒体内容 并且打印文件剩余长度 + +* 示例: + +```python +from hls import hls_audio +hls = hls_audio() +hls.play("http://home.xiupa617.top:38080/file/down4.m4a") #播放m4a格式文件 +hls.seek_secs(100) #跳转到100秒继续播放 +``` + +### 播放音量调节 + +> **hls.set_volume(volume)** + +* 参数: +| 参数 | 类型 | 说明 | +| ---- | ------ | ------------------------------------------------------------| +| volume | int | 音量level 0~11 | + + +* 功能: + +设置当前hls对象播放音量 + + +* 返回值: + +无返回值 + +* 示例: + +```python +from hls import hls_audio +hls = hls_audio() +hls.play("http://home.xiupa617.top:38080/file/down4.m4a") #播放m4a格式文件 +hls.set_volume(3) #设置音量为3 +``` + +### 播放暂停、继续 + +> **hls.pause(state)** + +* 参数: +| 参数 | 类型 | 说明 | +| ---- | ------ | ------------------------------------------------------------| +| state | int | 1:播放暂停 0:播放继续 | + + +* 功能: + +控制当前hls对象播放暂停 继续 + + +* 返回值: + +无返回值 + +* 示例: + +```python +from hls import hls_audio +hls = hls_audio() +hls.play("http://home.xiupa617.top:38080/file/down4.m4a") #播放m4a格式文件 +hls.pause(1) #播放暂停 +hls.pause(0) #播放继续 +``` + +## 在线音乐盒应用 + +```python +from hls import hls_audio +import utime +hls = hls_audio() +hls.set_volume(3) #设置音量为3 +URL1 = "http://home.xiupa617.top:38080/file/down.mp3" +URL2 = "http://home.xiupa617.top:38080/file/down5.m4a" +URL3 = "http://home.xiupa617.top:38080/file/down.m3u8" + +if __name__ == '__main__': + print("start URL1") + hls.play(URL1) + utime.sleep(7) + print("now jump to 30s") + hls.seek_secs(30) + utime.sleep(7) + print("now jump to 40s") + hls.seek_secs(40) + utime.sleep(7) + hls.close() + utime.sleep(1) + print("start URL2") + hls.play(URL2) + utime.sleep(10) + hls.pause(1) + print("play paused resume after 3s") + utime.sleep(3) + print("now resume") + hls.pause(0) + utime.sleep(5) + hls.close() + utime.sleep(1) + print("start URL3") + hls.play(URL3) + utime.sleep(10) + hls.set_volume(9) + print("now set volume to 9") + utime.sleep(3) + hls.set_volume(3) + print("now set volume to 3") + hls.close() + utime.sleep(1) + print("play finshed") +``` \ No newline at end of file diff --git a/docs/Advanced_development/zh/QuecPythonThird/blinker.md b/docs/Advanced_development/zh/QuecPythonThird/blinker.md new file mode 100644 index 0000000000000000000000000000000000000000..11cb9f44daef108dc48f68179635054b739a3391 --- /dev/null +++ b/docs/Advanced_development/zh/QuecPythonThird/blinker.md @@ -0,0 +1,239 @@ +## 修订历史 + +| Version | **Date** | **Author** | **Change expression** | +| ------- | ---------- | ---------- | --------------------- | +| 1.0 | 2021-09-14 | Pawn | 新建文档 | + + +## Blinker介绍 +Blinker是一个基于Python的强大的信号库,支持一对一、一对多的订阅发布模式,支持发送任意大小的数据等等,且线程安全。 + +## APIs + +### blinker.ANY +静态值, 使用此值为向任何人发送信息 + +* 参数 + +无 + +* 返回值 + +无 + +### Signal.connect(receiver, sender=ANY, weak=False) +向发送者订阅信号 +* 参数 + +| 参数 | 类型 | 说明 | +| -------- | -------- | --------------------------------------- | +| receiver | function | 回调函数 | +| sender | int | 订阅的发送者, 当值为ANY时订阅所有发布者 | +| weak | Boolean | 弱引用选项, 功能不可用, 默认值为FALSE | + +* 返回 + +receiver + + + +### Signal.connect_via(sender, weak=False) +以装饰器形式订阅指定发送者 + +* 参数 + +| 参数 | 类型 | 说明 | +| ------ | ------- | --------------------------------------- | +| sender | int | 订阅的发送者, 当值为ANY时订阅所有发布者 | +| weak | Boolean | 弱引用选项, 功能不可用, 默认值为FALSE | + +* 返回 + +返回装饰器 + + +### Signal.send(*sender, **kwargs) +使用send通知订阅者 + +* 参数 + +| 参数 | 类型 | 说明 | +| ---- | ---- | ---- | +| sender | object | 任何对象, 如果省略则为None | +| kwargs | dict | 需要发送到接受者的数据 | +* 返回 + +订阅sender的receiver list + +### Signal.has_receivers_for(sender) +查订阅者是否订阅了某个具体的信号发布者 + +* 参数 + +| 参数 | 类型 | 说明 | +| ---- | ---- | ---- | +| sender | object | 发送方object | + +* 返回 +返回 True 或 False + +### Signal.receivers_for(sender) +返回订阅者的迭代器 + +* 参数 + +| 参数 | 类型 | 说明 | +| ---- | ---- | ---- | +| sender | object | 发送方object | + +* 返回 +包含所有订阅者的迭代器 + +### Signal.disconnect(receiver, sender=ANY) +取消订阅 + +* 参数 + +| 参数 | 类型 | 说明 | +| -------- | -------- | --------------------------------------- | +| receiver | function | 回调函数 | +| sender | int | 订阅的发送者, 当值为ANY时订阅所有发布者 | + +* 返回 +无 + +## 使用实例 + +```python +from blinker import signal, Signal + +FLAGS = None + +""" +定义类Processor,在它的go()方法中触发前面声明的ready信号, +send()方法以self为参数,Processor的实例是信号的发送者 +""" +class Processor(object): + + def __init__(self, name): + self.name = name + + def go(self): + ready = signal('ready') + ready.send(self) + print('Processing...') + complete = signal('complete') + complete.send(self) + + def __repr__(self): + return ''.format(self.name) + +# 实例化类 +processor_a = Processor('a') + +""" +1.使用Signal.connect()方法注册一个函数, +每当触发信号的时候,就会调用该函数。 +该函数以触发信号的对象作为参数,这个函数其实就是信号订阅者。 +""" +# 定义函数 +def subscriber(sender): + print("Got a signal sent by %r" % sender) + +# 在命名为 ready 的signal注册subscriber函数,并发送消息 +ready = signal('ready') +ready.connect(subscriber, sender=processor_a, weak=False) +processor_a.go() + +""" +2.默认情况下,任意发布者触发信号,都会通知订阅者。 +可以给Signal.connect()传递一个可选的参数, +以便限制订阅者只能订阅特定发送者。 +""" +# 定义函数 +def b_subscriber(sender): + print("Caught signal from processor_b.") + assert sender.name == 'b' + +# 订阅特定的发布者 +processor_b = Processor('b') +print(ready.connect(b_subscriber, sender=processor_b)) + + +""" +3.可以给send()方法传递额外的关键字参数, +这些参数会传递给订阅者。 +""" +# 定义收发数据signal +send_data = signal('send-data') + +# 除了使用connect()方法订阅信号之外,使用@connect修饰器可以达到同样的效果 +@send_data.connect +def receive_data(sender, **kw): + FLAGS = kw + print("Caught signal from %r, Flags: %r" % (sender, FLAGS)) + return 'received!' + +# send()方法的返回值收集每个订阅者的返回值, +# 拼接成一个元组组成的列表。 +# 每个元组的组成为(receiver function, return value)。 +result = send_data.send('anonymous', abc=123) +print(result) + + +""" +4.信号可以是匿名的,可以使用Signal类来创建唯一的信号 +(S大写,这个类不像之前的signal,为非单例模式)。 +下面的on_ready和on_complete为两个不同的信号 +""" + +# 创建匿名信号类 +class AltProcessor: + on_ready = Signal() + on_complete = Signal() + + def __init__(self, name): + self.name = name + + def go(self): + self.on_ready.send(self) + print("Alternate processing.") + self.on_complete.send(self) + + def __repr__(self): + return '' % self.name + +# 匿名信号订阅 +apc = AltProcessor('c') +@apc.on_complete.connect +def completed(sender): + print("AltProcessor %s completed!" % sender.name) + +apc.go() + +""" +5.可使用connect_via()装饰器订阅指定发送者 +""" + +# 订阅指定发送者 +dice_roll = signal('dice_roll') +@dice_roll.connect_via(1) +@dice_roll.connect_via(3) +@dice_roll.connect_via(5) +def odd_subscriber(sender): + print("Observed dice roll %r." % sender) + +result = dice_roll.send(3) + +# 检查订阅者 +print(bool(signal('ready').receivers)) +print(bool(signal('complete').receivers)) +print(bool(AltProcessor.on_complete.receivers)) + +# 检查订阅者是否订阅了某个发布者 +signal('ready').has_receivers_for(processor_a) +``` + + + + diff --git "a/docs/Advanced_development/zh/QuecPythonThird/media/1-BLE Server\346\265\201\347\250\213.png" "b/docs/Advanced_development/zh/QuecPythonThird/media/1-BLE Server\346\265\201\347\250\213.png" new file mode 100644 index 0000000000000000000000000000000000000000..0e7671b7c4d42df7bf6ddf576c87cd194ea8bb50 Binary files /dev/null and "b/docs/Advanced_development/zh/QuecPythonThird/media/1-BLE Server\346\265\201\347\250\213.png" differ diff --git "a/docs/Advanced_development/zh/QuecPythonThird/media/2-BLE Client\346\265\201\347\250\213.png" "b/docs/Advanced_development/zh/QuecPythonThird/media/2-BLE Client\346\265\201\347\250\213.png" new file mode 100644 index 0000000000000000000000000000000000000000..092db55bdd17c8965dc6a24e1b52f70165db31f7 Binary files /dev/null and "b/docs/Advanced_development/zh/QuecPythonThird/media/2-BLE Client\346\265\201\347\250\213.png" differ diff --git a/docs/Advanced_development/zh/QuecPythonThird/media/HLS.png b/docs/Advanced_development/zh/QuecPythonThird/media/HLS.png new file mode 100644 index 0000000000000000000000000000000000000000..eee5d7aa46e32d9f4c92da0db1bafb5ad9513b31 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonThird/media/HLS.png differ diff --git a/docs/Advanced_development/zh/QuecPythonThird/modbus.md b/docs/Advanced_development/zh/QuecPythonThird/modbus.md new file mode 100644 index 0000000000000000000000000000000000000000..097bdb13152e0ddcf1a24b42063fcf65c9d5c6d0 --- /dev/null +++ b/docs/Advanced_development/zh/QuecPythonThird/modbus.md @@ -0,0 +1,261 @@ +![](media/d36c1ed416c5d9f95816324ad790f385.png) + +**Modubus使用说明_V1.0** + +版本:Modbus使用说明_V1.0 + +日期:2021-09-14 + +![](media/6e5654be296f4a5fc4f620bb2b0f238a.emf) 状态:临时文件 + +www.quectel.com + +上海移远通信技术股份有限公司始终以为客户提供最及时、最全面的服务为宗旨。如需任何帮助,请随时联系我司上海总部,联系方式如下: + +上海移远通信技术股份有限公司 + +上海市闵行区田林路1016号科技绿洲3期(B区)5号楼 邮编:200233 + +电话:+86 21 51086236 邮箱:[info@quectel.com](mailto:info@quectel.com) + +或联系我司当地办事处,详情请登录: + + + +如需技术支持或反馈我司技术文档中的问题,可随时登陆如下网址: + + + +或发送邮件至:[support@quectel.com](mailto:support@quectel.com) + +**前言** + +上海移远通信技术股份有限公司提供该文档内容用以支持其客户的产品设计。客户须按照文档中提供的规范、参数来设计其产品。由于客户操作不当而造成的人身伤害或财产损失,本公司不承担任何责任。在未声明前,上海移远通信技术股份有限公司有权对该文档进行更新。 + +**版权申明** + +本文档版权属于上海移远通信技术股份有限公司,任何人未经我司允许而复制转载该文档将承担法律责任。 + +版权所有 ©上海移远通信技术股份有限公司 2020,保留一切权利。 + +**Copyright © Quectel Wireless Solutions Co., Ltd. 2020.** + +# 文档历史 + +**修订记录** + +| **版本** | **日期** | **作者** | **变更表述** | +|----------|------------|--------------|--------------| +| 1.0 | 2021-09-14 | Jeremy.Jiang | 初始版本 | + +目录 + +[文档历史 2](#_Toc82531561) + +[1. 基本概述 4](#基本概述) + +[2. modubs使用示例 4](#2-modubs使用示例) + +[3. modubs API 使用说明 5](#3-modubs-api-使用说明) + +[3.1 modubs_utils.init(uartN, buadrate, databits, parity, stopbit, flowctl) +5](#31-modubs_utilsinituartn-buadrate-databits-parity-stopbit-flowctl) + +[3.2 modubs_utils.divmod_low_high(addr) 6](#32-modubs_utilsdivmod_low_highaddr) + +[3.3 modubs_utils.calc_crc(string_byte) 6](#33-modubs_utilscalc_crcstring_byte) + +[3.4 modubs_utils.split_return_bytes(ret_bytes) +7](#34-modubs_utilssplit_return_bytesret_bytes) + +[3.5 modubs_utils.read_uart() 7](#35-modubs_utilsread_uart) + +[3.6 modubs_utils.write_coils(slave, const, start, coil_qty, crc_flag=True) +7](#36-modubs_utilswrite_coilsslave-const-start-coil_qty-crc_flagtrue) + +[3.7 modubs_utils.write_coils_any(\*args, crc_flag=True) +8](#37-modubs_utilswrite_coils_anyargs-crc_flagtrue) + +[3.8 uModBusConst功能码清单 8](#38-umodbusconst功能码清单) + +# 基本概述 + +本文档主要基于modbus DTU使用。 + +# 2. modubs使用示例 + +from usr.sensor import ModbusInit + +import usr.uModBusConst as Const + +from machine import UART + +import utime as time + +\# LightSensor UART info + +uart_port = UART.UART0 + +bardrate = 9600 + +databits = 8 + +parity = 0 + +stopbit = 1 + +flowctl = 0 + +\# sensor addrinfo + +slave = 0x01 + +const = Const.READ_HOLDING_REGISTERS + +start_addr = 0X03 + +coil_qyt = 0x02 + +\# light data transfer + +def light_data_transfer(ret_str): + +str_list = list(map(lambda x: x.decode("utf-8"), ret_str.split(b","))) + +data_bits = int(str_list[2]) + +data_list = str_list[3: 3+data_bits] + +one_place = int("0x" + data_list[0] + data_list[1], 16) + +tens_place = int("0x" + data_list[2] + data_list[3], 16) + +return tens_place \* 10 + one_place + +if \__name_\_ == '__main__': + +modbus = ModbusInit(uart_port, bardrate, databits, parity, stopbit, flowctl) + +while True: + +modbus.write_coils(slave, const, start_addr, coil_qyt) + +ret_str = modbus.read_uart() + +print(ret_str) + +digit_val = light_data_transfer(ret_str) + +print(digit_val) + +time.sleep_ms(1000) + +# 3. modubs API 使用说明 + +## 3.1 modubs_utils.init(uartN, buadrate, databits, parity, stopbit, flowctl) + +初始化UART接口 + +| **参数** | **类型** | **说明** | +|----------|----------|-------------------------------------------------------------------------------------------| +| uartN | int | UARTn作用如下: UART0 - DEBUG PORT UART1 – BT PORT UART2 – MAIN PORT UART3 – USB CDC PORT | +| buadrate | int | 波特率,常用波特率都支持,如4800、9600、19200、38400、57600、115200、230400等 | +| databits | int | 数据位(5\~8),展锐平台当前仅支持8位 | +| parity | int | 奇偶校验(0 – NONE,1 – EVEN,2 - ODD) | +| stopbits | int | 停止位(1\~2) | +| flowctl | int | 硬件控制流(0 – FC_NONE, 1 – FC_HW) | + +## 3.2 modubs_utils.divmod_low_high(addr) + +分割地址高低位 + +| **输入参数** | **类型** | **说明** | +|--------------|----------|--------------| +| addr | int | 十六进制地址 | + +| **返回值** | **类型** | **说明** | +|------------|----------|------------------| +| high | int | 高位十六进制地址 | +| low | int | 低位十六进制地址 | + +## 3.3 modubs_utils.calc_crc(string_byte) + +计算bytearray校验位值 + +| **参数** | **类型** | **说明** | +|-------------|-----------|-----------| +| string_byte | bytearray | bytearray | + +| **返回值类型** | **类型** | **说明** | +|----------------|----------|-------------| +| crc_high | int | CRC高位地址 | +| crc_low | int | CRC低位地址 | + +## 3.4 modubs_utils.split_return_bytes(ret_bytes) + +切分从UART口读取的bytes并转换为bytesarray + +| **参数** | **类型** | **说明** | +|-----------|----------|----------| +| ret_bytes | bytes | bytes | + +| **返回值类型** | **类型** | **说明** | +|----------------|----------|----------------------------------------------| +| bytes_split | list | bytes切分后的列表,格式:[b’00’, b’1E’, …..] | + +## 3.5 modubs_utils.read_uart() + +读取uart的数据,并返回bytes值 + +| **返回值类型** | **类型** | **说明** | +|----------------|----------|----------------------| +| bytes_string | bytes | 格式:b”01,1E,1F…..” | + +## 3.6 modubs_utils.write_coils(slave, const, start, coil_qty, crc_flag=True) + +写线圈操作 + +| **参数** | **类型** | **说明** | +|----------|----------|--------------| +| slave | int | 设备地址 | +| const | int | 功能码 | +| start | int | 起始地址 | +| coil_qty | int | 读取线圈数 | +| crc_flag | bool | 是否需要校验 | + +| **返回值类型** | **类型** | **说明** | +|----------------|----------|----------| +| status | bool | 返回True | + +## 3.7 modubs_utils.write_coils_any(\*args, crc_flag=True) + +任意写入线圈地址操作 + +| **参数** | **类型** | **说明** | +|----------|----------|----------------------| +| \*args | list | 任意的byte组成的list | +| crc_flag | bool | 是否需要校验 | + +## 3.8 uModBusConst功能码清单 + +| **名称** | **地址** | +|-------------------------------|----------| +| READ_DISCRETE_INPUTS | 0X02 | +| READ_COILS | 0X01 | +| WRITE_SINGLE_COIL | 0X05 | +| WRITE_MULTIPLE_COILS | 0X0F | +| READ_INPUT_REGISTER | 0X04 | +| READ_HOLDING_REGISTERS | 0X03 | +| WRITE_SINGLE_REGISTER | 0X06 | +| WRITE_MULTIPLE_REGISTERS | 0X10 | +| READ_WRITE_MULTIPLE_REGISTERS | 0X17 | +| MASK_WRITE_REGISTER | 0X16 | +| READ_FIFO_QUEUE | 0X18 | +| READ_FILE_RECORD | 0X14 | +| WRITE_FILE_RECORD | 0X15 | +| READ_EXCEPTION_STATUS | 0X07 | +| DIAGNOSTICS | 0X08 | +| GET_COM_EVENT_COUNTER | 0X0B | +| GET_COM_EVENT_LOG | 0X0C | +| REPORT_SERVER_ID | 0X11 | +| READ_DEVICE_IDENTIFICATION | 0X2B | diff --git a/docs/Advanced_development/zh/QuecPythonWirelessNetwork/README.md b/docs/Advanced_development/zh/QuecPythonWirelessNetwork/README.md deleted file mode 100644 index 4e3a7808368ee4cfdfd27900a087a6cd83d867b2..0000000000000000000000000000000000000000 --- a/docs/Advanced_development/zh/QuecPythonWirelessNetwork/README.md +++ /dev/null @@ -1,435 +0,0 @@ -# QuecPython 无线联网开发 - -## QuecPythonDataCall数据拨号 - -本片文章主要简介QuecPython datacall 模块的使用。 datacall模块提供数据拨号的等功能。 - -包含的API如下: - -- **dataCall.start(profileIdx, ipType, apn, username, password, authType)** -- **dataCall.setApn(profileIdx, ipType, apn, username, password, authType)** -- **dataCall.setCallback** -- **dataCall.getInfo(profileIdx, ipType)** - -具体的API 详解请参考[Quecpython-dataCall - 数据拨号](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=datacall-%e6%95%b0%e6%8d%ae%e6%8b%a8%e5%8f%b7) - -适用模块: - -- EC100Y-CN -- EC600S-CN - -### 数据拨号简介 - -简单理解, 数据拨号即为通过和服务器连接,获取网络访问许可。 - -#### 什么是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接入点名称由两部分组成: - -- 网络标识符 - -- 运营商标识符 - -运营商标识符又由其他两个部分组成: - -- 移动网络代码(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。 - -### 快速开始 - -QuecPython使用datacall 模块常规流程: - -1. 使用链路拨号,获取进行链路激活。 - -2. 获取IP信息等基本数据。 - -3. 注册断网回调函数, 在回调函数里面,判断网络状态,进入重拨等操作。 - -#### 代码实验 - -1. 首先链路激活。 - -2. 打印IP信息等。 - -3. 注册回调函数。 - -4. 使用飞行模式模拟离线 - -5. 在回调函数中重新拨号。 - -```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() - -``` - -### 参考资料 - -[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-%e6%95%b0%e6%8d%ae%e6%8b%a8%e5%8f%b7) - -### 配套代码 - - - 下载代码 - -## QuecPython cellLocator基站定位 - -本片文章主要简介QuecPython cellLocator 模块的使用。 - -包含的API有 - -- **cellLocator.getLocation(serverAddr, port, token, timeout, profileID)** - -具体的API 详解请参考 [cellLocator - 基站定位](https://python.quectel.com/wiki/api/#celllocator-) - -适用模块: - -- EC100Y-CN -- EC600S-CN - -### cellLocator 概述 - -定位是指通过特定的定位技术来获取移动手机或终端用户的位置信息(经纬度坐标),在电子地图上标出被定位对象的位置的技术或服务。定位技术有两种,一种是基于GPS的定位,一种是基于移动运营网的基站的定位。基于GPS的定位方式是利用手机上的GPS定位模块将自己的位置信号发送到定位后台来实现手机定位的。基站定位则是利用基站对手机的距离的测算距离来确定手机位置的。后者不需要手机具有GPS定位能力,但是精度很大程度依赖于基站的分布及覆盖范围的大小,有时误差会超过一公里。前者定位精度较高。此外还有利用Wi-Fi在小范围内定位的方式。 - -基站定位一般应用于手机用户,手机基站定位服务又叫做移动位置服务(LBS,Location Based Service),它是通过电信移动运营商的网络(如GSM网)获取移动终端用户的位置信息(经纬度坐标),在电子地图平台的支持下,为用户提供相应服务的一种增值业务,例如目前中国移动动感地带提供的动感位置查询服务等。在物联网设备中也支持此类的操作。 - -基站定位的大致原理为:移动电话测量不同基站的下行导频信号,得到不同基站下行导频的TOA(Time of Arrival,到达时刻)或TDOA(Time Difference of Arrival,到达时间差),根据该测量结果并结合基站的坐标,一般采用三角公式估计算法,就能够计算出移动电话的位置。实际的位置估计算法需要考虑多基站(3个或3个以上)定位的情况,因此算法要复杂很多。一般而言,移动台测量的基站数目越多,测量精度越高,定位性能改善越明显。 - -### 快速开始 - -#### 交互实验 - -进行本次实验, 需要先确定SIM卡状态。 具体请参考SIM模块的文档。 - -我们使用交互命令来获取当前的坐标信息。 - -```python ->>> import cellLocator ->>> cellLocator.getLocation("www.queclocator.com", 80, "1111111122222222", 8, 1) -(117.1138, 31.82279, 550) -# 上面使用的密钥仅为测试密钥 -``` - -#### 代码实验 - -计算当前位置到北京首都的距离, - -```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/?id=celllocator-基站定位) - -### 配套代码 - - - 下载代码 - -## QuecPython SIM卡功能开发 - -本文主要简介QuecPython SIM卡模块的使用。 - -其包含的API有 - -- **sim.getImsi()** -- **sim.getIccid()** -- **sim.getPhoneNumber()** -- **sim.getStatus()** -- **sim.enablePin(pin)** -- **sim.disablePin(pin)** -- **sim.verifyPin(pin)** -- **sim.unblockPin(puk, newPin)** -- **sim.changePin(oldPin, newPin)** -- **sim.readPhonebook(storage, start, end, username)** -- **sim.writePhonebook(storage, index, username, number)** - -具体的API 详解请参考[Quecpython sim - SIM卡库](https://python.quectel.com/wiki/api/#sim-sim) - -适用模块: - -- EC100Y-CN -- EC600S-CN - -### SIM卡基本概述 - -SIM 分为手机卡和物联网卡。区别就是物联网卡没有电话号码不能收发短信,手机可以发短信。 常见的是手机卡。 - -第二代标准的Mini卡,国内用户俗称的大卡。 - -第三代标准的Micro卡,俗称小卡。 - -第四代标准的Nano卡。 - -![image-20210113215601231](media/image-20210113215601231.png) - -EC600S-CN 需要的是第四代标准的 Nano 卡。 - -### 常见SIM术语解释 - -#### IMSI - -IMSI全称为 Internation Mobile Subscriber Identity,即国际移动用户识别码。 - -- 前三位数字代表移动国家代码(MCC)。 -- 接下来的两位或三位数字代表移动网络代码(MNC)。E.212允许使用三位数的MNC代码,但主要在美国和加拿大使用。 -- 接下来的数字代表移动用户识别号(MSIN)。 - -#### ICCID - -ICCID全称为Integrated Circuit Card Identifier,即集成电路卡识别码。 - -- 可以简单理解为SIM卡的卡号(身份证号)。 - -- 编码格式为:XXXXXX 0MFSS YYGXX XXXX。 - -- 前六位运营商代码: - - 中国移动的为:898600;898602;898604;898607 , - - 中国联通的为:898601、898606、898609, - - 中国电信898603、898611。 - - -#### Phonebook Memory Storage - -Phonebook Memory Storage即为SIM卡电话薄存储区域。详情可参考 [ts_127007v100300p.pdf](https://www.etsi.org/deliver/etsi_ts/127000_127099/127007/10.03.00_60/ts_127007v100300p.pdf) 。 - -![image-20210113220623353](media/image-20210113220623353.png) - -### 快速开始 - -#### 交互实验 - -```python ->>> import sim ->>> sim.getStatus() -1 ->>> sim.getImsi() -'460110847679419' ->>> sim.getIccid() -'89860319747555431000' -# 写电话薄, ->>> sim.writePhonebook(9, 1, 'Tom', '18144786859') -0 ->>> sim.writePhonebook(9, 2, 'z', '18144786859') -0 ->>> sim.readPhonebook(9, 1, 4, "") -(1, [(1, 'Tom', '18144786859')]) ->>> sim.readPhonebook(9, 2, 4, "") -(1, [(2, 'z', '18144786859')]) -``` - -#### 代码实验 - -使用命令行随机写SIM卡中的Phonebook。 - - -```python -# 参考文档 -# https://python.quectel.com/wiki/#/zh-cn/api/?id=sim-sim%e5%8d%a1 -import sim -import utime as time -import urandom as random -# 打印所有通讯录 - - -def print_sim_phonebook(): - for i in range(1, 1000): - # 一次读一个 - info = sim.readPhonebook(9, i, i+1, "") - if info == -1: - print("read has error") - break - else: - print(info) - time.sleep_ms(5) - -# 生成随机名字 - - -def CreatRandomStr(length): - # The limit for the extended ASCII Character set - MAX_LENGTH = 16 - random_string = '' - if length > MAX_LENGTH: - length = length % MAX_LENGTH - if length == 0: - length = random.randint(1, MAX_LENGTH) - for _ in range(length): - # 0 ~ z - random_integer = random.randint(48, 122) - # Keep appending random characters using chr(x) - random_string += (chr(random_integer)) - return random_string - - -def CreatRandomPhoneNum(count=8): - pre_lst = ["130", "131", "132", "133", "134", "135", "136", "137", "138", "139", "147", "150", - "151", "152", "153", "155", "156", "157", "158", "159", "186", "187", "188"] - # 生成8个随机数个位数 - tail_str = [str(random.randint(0, 9)) for i in range(count)] - # 将其转化为字符串 - tail_str = ''.join(tail_str) - return random.choice(pre_lst) + tail_str - pass - - -def write_random_sim_phonebook(): - for i in range(1, 10): - # 一次写一个 - name = CreatRandomStr(random.randint(4, 6)) - number = CreatRandomPhoneNum() - sim.writePhonebook(9, i, name, number) - - -def test_sim_base(): - # check sim statsu - ret = sim.getStatus() - if ret == 1: - write_random_sim_phonebook() - print_sim_phonebook() - else: - # 状态不对 - print("sim status has error , value is {0}".format(ret)) - print("test_sim_base has exited") - - -if __name__ == "__main__": - test_sim_base() - -``` - -### 参考资料 - -**[ts_127007v100300p.pdf](https://www.etsi.org/deliver/etsi_ts/127000_127099/127007/10.03.00_60/ts_127007v100300p.pdf)** - -**[Quecpython sim - SIM卡库](https://python.quectel.com/wiki/api/#sim-sim)** - -### 配套代码 - - - 下载代码 \ No newline at end of file diff --git a/docs/Advanced_development/zh/config.json b/docs/Advanced_development/zh/config.json index 10c2a1cc1964035be8ce534c1a708e32e4094fcc..ce6a268419a108000c778cc44f25708a46325fe8 100644 --- a/docs/Advanced_development/zh/config.json +++ b/docs/Advanced_development/zh/config.json @@ -1,92 +1,21 @@ { - "class": "language_zh", + "import": "config_zh", "navbar": { - "title": "QuecPython", - "logo": { - "alt": "teedoc logo", - "src": "/static/image/quectel.png" - }, - "home_url": "/", "items": [ { - "url": "https://python.quectel.com/wiki/#/", - "label": "wiki", - "position": "left" - }, - { - "label": "    文档    ", - "position": "left", - "items": [ - { - "url": "/doc/Quecpython_intro/zh/index.html", - "label": "产品介绍" - }, - { - "url": "/doc/Quick_start/zh/index.html", - "label": "快速开始" - }, - { - "url": "/doc/sbs/zh/index.html", - "label": "手把手教程" - }, - { - "url": "/doc/Advanced_development/zh/index.html", - "label": "开发进阶" - }, - { - "url": "/doc/little_demo/zh/index.html", - "label": "小实验" - }, - { - "url": "/doc/Product_case/zh/index.html", - "label": "产品案例" - }, - { - "url": "/doc/Mass_production/zh/index.html", - "label": "产品量产" - }, - { - "url": "/doc/FAQ/zh/index.html", - "label": "常见问题" - } - ] - }, - { - "label": "GitHub", + "id": "language", + "label": "Language: ", "position": "right", - "url": "https://github.com/quecpython/Community-document" - } - ] - }, - "footer": { - "top": [ - { - "label": "链接", - "items": [ - { - "label": "使用 teedoc 构建", - "url": "https://github.com/neutree/teedoc", - "target": "_blank" - }, - { - "label": "Copyright © 2021 Neucrack", - "url": "https://neucrack.com", - "target": "_blank" - } - ] - }, - { - "label": "源码", "items": [ { - "label": "github", - "url": "https://github.com/neutree/teedoc", - "target": "_blank" + "id": "zh", + "url": "/doc/Advanced_development/zh/", + "label": "中文" }, { - "label": "本网站源文件", - "url": "https://github.com/quecpython/Community-document", - "target": "_blank" + "id": "en", + "url": "/doc/Advanced_development/en/", + "label": "English" } ] } diff --git a/docs/Advanced_development/zh/sidebar.yaml b/docs/Advanced_development/zh/sidebar.yaml index 9e6b74553ea693467b7efd3e0851b87c4d92f795..bb84a91c405ba3a6239f57614377539334f4e1ff 100644 --- a/docs/Advanced_development/zh/sidebar.yaml +++ b/docs/Advanced_development/zh/sidebar.yaml @@ -1,20 +1,4 @@ items: - - label: 开发进阶 - file: README.md - - label: 总线接口 - items: - - label: UART开发 - file: QuecPythonSub/UART.md - - label: GPIO及IO中断开发 - file: QuecPythonSub/GPIO.md - - label: I2C总线开发 - file: QuecPythonSub/IIC.md - - label: PWM开发 - file: QuecPythonSub/PWM.md - - label: ADC采样开发 - file: QuecPythonSub/ADC.md - - label: SPI总线开发 - file: QuecPythonSub/SPI.md - label: 云平台 items: - label: 接入阿里云 @@ -27,34 +11,79 @@ items: file: QuecPythonCloud/HuaweiCloud.md - label: 接入亚马逊云 file: QuecPythonCloud/AmazonCloud.md - - label: 驱动子系统 - items: - - label: 平台驱动 - items: - - label: RTC开发 - file: QuecPythonSub/RTC.md - - label: Timer定时器开发 - file: QuecPythonSub/Timer.md - - label: Watchdog开发 - file: QuecPythonSub/WDT.md - - label: Power开关机 - file: QuecPythonSub/Power.md - - label: 低功耗管理 - file: QuecPythonSub/PM.md - # - label: 充电管理 - - label: 音频 - items: - - label: 音频播放 - file: QuecPythonSub/Audio.md - # - label: 录制音频 - - label: TTS开发 - file: QuecPythonSub/TTS.md - - label: 外设调试 - items: - - label: LCD 调试流程 - file: QuecPythonSub/LCD.md - # - label: SPI Nor Flash 调试流程 - - label: Sensor 调试流程 - file: QuecPythonSub/Sensor.md - # - label: 摄像头调试流程 - # - label: SD卡调试流程 + - label: 基础外设 + items: + - label: LCD开发 + file: QuecPythonSub/LCD.md + - label: 摄像头调试开发 + file: QuecPythonSub/camera.md + - label: 数码管开发 + file: QuecPythonSub/Digital_tube.md + - label: 温湿度传感器开发 + file: QuecPythonSub/i2c_aht.md + - label: 光敏传感器开发 + file: QuecPythonSub/Photoresistor.md + - label: 加速度传感器开发 + file: QuecPythonSub/i2c_lis2dh.md + - label: 步进电机驱动开发 + file: QuecPythonSub/ebf_smd4805.md + - label: 总线 + items: + - label: 跑马灯开发 + file: QuecPythonBus/LED.md + - label: 蜂鸣器开发 + file: QuecPythonBus/buzzer.md + - label: 按键输入开发 + file: QuecPythonBus/button.md + - label: 串口进阶开发 + file: QuecPythonBus/uart.md + - label: 外部中断开发 + file: QuecPythonBus/External_interrupt.md + - label: 独立看门狗开发 + file: QuecPythonBus/WDT.md + - label: 第三方组件 + items: + - label: ModBus开发 + file: QuecPythonThird/modbus.md + - label: asyncio开发 + file: QuecPythonThird/asyncio.md + - label: Blinker开发 + file: QuecPythonThird/blinker.md + - label: HLS开发 + file: QuecPythonThird/HLS.md + - label: LVGL开发 + file: QuecPythonThird/LVGL.md + - label: BLE开发 + file: QuecPythonThird/BLE.md + - label: 高级组件 + items: + - label: Wi-Fi开发 + file: QuecPythonAdvance/wifi.md + - label: SGMII开发 + file: QuecPythonAdvance/sgmii.md + - label: HeliosService + items: + - label: HeliosService入门 + file: HeliosService/HeliosService1.md + - label: HeliosService进阶 + file: HeliosService/HeliosService2.md + - label: HeliosService高级 + file: HeliosService/HeliosService3.md + - label: 量产 + items: + - label: 量产工具使用指导 + file: Mass_production/README.md + - label: 代码加密保护 + file: Mass_production/CodeEncryption.md + - label: 数据加密保护 + file: Mass_production/DataEncryption.md + - label: 备份还原机制 + file: Mass_production/QuecPythonBack.md + - label: HeliosSDK + items: + - label: HeliosSDK入门 + file: HeliosSDK/HeliosSDK1.md + - label: HeliosSDK进阶 + file: HeliosSDK/HeliosSDK2.md + - label: HeliosSDK高级 + file: HeliosSDK/HeliosSDK3.md \ No newline at end of file diff --git a/docs/Development_env_tools/zh/README.md b/docs/Development_env_tools/zh/README.md deleted file mode 100644 index b3d8c45d02d0761a3d5ba77450c5d12a64aa2bcb..0000000000000000000000000000000000000000 --- a/docs/Development_env_tools/zh/README.md +++ /dev/null @@ -1 +0,0 @@ -## 开发环境和工具 diff --git a/docs/FAQ/en/Format_String/Format_String.md b/docs/FAQ/en/Format_String/Format_String.md new file mode 100644 index 0000000000000000000000000000000000000000..25ed16ce094abeca6b9902fe2889f180793defb6 --- /dev/null +++ b/docs/FAQ/en/Format_String/Format_String.md @@ -0,0 +1,177 @@ +## Revision history + +|Version | date | author | change statement| +| ---- | --------- | ----- | ------------------------------------------------------------ | +|1.0 | 2021-4-07 | first written by David | including bit operation, string and hexadecimal conversion, and description of struct| + +For the conversion requirements between string and hexadecimal, this document is written to introduce the relevant knowledge in detail. + +## Bit operation + +First of all, bit operation is introduced. All numbers in the computer are stored in binary. Bit operation is the operation of binary bits. In Python, it mainly includes bitwise and operator, bitwise OR operator, bitwise XOR operator, bitwise negation operator, left move operator and right move operator. For specific introduction, please refer to: [bit operation](https://blog.csdn.net/csdn_edition/article/details/109402978) + +### Bitwise and operator + + Bitwise and operator &: two values participating in the operation. If both corresponding bits are 1, the result of this bit is 1, otherwise it is 0. Examples are as follows: + +```python +>>> a= 60 +>>> b= 13 +>>> a & b +12 +``` + +### Bitwise OR operator + +Bitwise OR operator |: as long as one of the corresponding two binary bits is 1, the result bit is 1. + +```python +>>> a=60 +>>> b= 13 +>>> a | b +61 +``` + +### Bitwise exclusive or operator + +Bitwise exclusive or operator: when two corresponding binary bits are different, the result is 1 + +```python +>>> a=60 +>>> b= 13 +>>> a ^ b +49 +``` + +### Bitwise negation operator + + Bitwise negation operator: negates each binary bit of data, that is, changes 1 to 0 and 0 to 1**~ X ** similar to ** - X-1** + +```python +>>> a=60 +>>> ~a +-61 +``` + +### Move left operator + +Move left operator: all binary bits of the operand are shifted to the left by several bits. The number of bits to be moved is specified by the number on the right of ** < < ** the high bit is discarded and the low bit is supplemented by 0. + +```python +>>> a=60 +>>> a << 2 +240 +``` + +### Move right operator + +Move right operator: shift all binary bits of the operand on the left of "> >" to the right by several bits, and the number on the right of ** > > ** specifies the number of bits to be moved + +```python +>>> a=60 +>>> a >> 2 +15 +``` + +There are also bit operations and the use of struct, so it is necessary to write a demo. This is a test of the reliability of the machine and welding parts by placing the equipment in a rapidly changing environment from high temperature to low temperature or vice versa + +## String and hex + +### Encapsulation of string and hexadecimal conversion + +For the conversion between string and hexadecimal, since Python has no corresponding encapsulation, a class is encapsulated here for everyone to use: + +```python +str_test = 'Quectel build a smarter world' +class String: + def to_hex(a, b=""): #Realizable function: convert to hex format, and optionally add the required separator + Hex = ''.join([hex(ord(c)).replace('0x', b) for c in a]) + return Hex,len(a) + + def from_hex(a,b=''): #Realizable function: convert to str. if there is a delimiter, you can add a delimiter parameter conversion + Str = ''.join([chr(int(c.replace(b, ''), 16)) for c in [a[i:i+2+len(b)] for i in range(0, len(a), 2+len(b))]]) + return Str + +hex_test = String.to_hex(str_test) +print(type(hex_test[0])) +print(hex_test[1]) +print(hex_test) + +hex_test = str(hex_test[0]) +str_test = String.from_hex(hex_test) +print(str_test) +``` + +### Application of string and hexadecimal conversion (to be improved) + +Of course, the converted hex cannot receive and analyze directly through the serial port, so it still needs some conversion. Here is a simple experiment based on ec600scnlb module + +```python +str_test = 'Quectel build a smarter world' +def str_to_hex(s): + list_hex = ' '.join([hex(ord(c)) for c in s]).split() + list = [int(i,16) for i in list_hex] + bytearr = bytearray(list) + return bytearr +hex_test = str_to_hex(str_test) +``` + +​ 1. Write the following code and name it str_ hex_ test.py。 + +```python +from machine import UART +uart0 = UART(UART.UART0, 115200, 8, 0, 1, 0) +str_test = 'Quectel build a smarter world' +def str_to_hex(s): + list_hex = ' '.join([hex(ord(c)) for c in s]).split() + list = [int(i,16) for i in list_hex] + bytearr = bytearray(list) + return bytearr +hex_test = str_to_hex(str_test) +uart0.write(hex_test) +``` + +​ 2. Download the above files to run in the module, and open the serial port debugging tool (uartassist is used here) + +image-20210407143228884 + +image-20210407144219267 + +3. Run the program and view the results in the serial port tool + +image-20210407144126291 + +**Tips:** + +If ASCII reception is used, the string form will be displayed + +​ 4. Serial port reception of the module: no matter whether the serial port tool sends ASCII or hex data, the serial port reads byte data + +![image-20210407151559820](media/uart_read.png) + +## Codec + +For encoding and decoding, common ones include ASCII, UTF-8, GBK, etc. Python already has corresponding encapsulation. Here is a brief introduction. You can also refer to [encode and decode](https://blog.csdn.net/qq_26442553/article/details/94440502): + +```python +import ubinascii as binascii +import ustruct as struct + +def example(express, result=None): + if result == None: + result = eval(express) + print(express, ' ==> ', result) +if __name__ == '__main__': +Print ('codec: ') + print("str to utf-8", end=': '); +Example ("U 'Xiaoming'. Encode ('utf-8 ')) + print("utf-8 to str", end=': '); + s_utf = b'\xe5\xb0\x8f\xe6\x98\x8e' + example("s_utf.decode('utf-8')") +Print ("similarly, encode ('gbk '), decode ('gbk'), encode ('gb2312 '), decode ('gb2312')) + +``` + +## Binary and ASCII conversion, packaging and decompression + +For [binary to ASCII conversion](https://python.quectel.com/wiki/#/zh-cn/api/pythonStdlib?id=ubinascii-二进制与ascii转换)和[ustruct - 打包和解压原始数据类型](https://python.quectel.com/wiki/#/zh-cn/api/pythonStdlib?id=ustruct-打包和解压原始数据类型),在模组的固件中已经有了封装。 diff --git a/docs/FAQ/en/Format_String/media/UartAssist.png b/docs/FAQ/en/Format_String/media/UartAssist.png new file mode 100644 index 0000000000000000000000000000000000000000..95d51c3d8dd3f9035688e5ac945519459011680c Binary files /dev/null and b/docs/FAQ/en/Format_String/media/UartAssist.png differ diff --git a/docs/FAQ/en/Format_String/media/dirver_setup.png b/docs/FAQ/en/Format_String/media/dirver_setup.png new file mode 100644 index 0000000000000000000000000000000000000000..5c64e95704bd913477136297efdd237de67afbe6 Binary files /dev/null and b/docs/FAQ/en/Format_String/media/dirver_setup.png differ diff --git a/docs/FAQ/en/Format_String/media/file_download.png b/docs/FAQ/en/Format_String/media/file_download.png new file mode 100644 index 0000000000000000000000000000000000000000..ae3d1ab20339489871623fa38631d5efd5af0a2b Binary files /dev/null and b/docs/FAQ/en/Format_String/media/file_download.png differ diff --git a/docs/FAQ/en/Format_String/media/str_hex_result.png b/docs/FAQ/en/Format_String/media/str_hex_result.png new file mode 100644 index 0000000000000000000000000000000000000000..41442a593cd957cf457af1b69ebc9ccba27e2a2f Binary files /dev/null and b/docs/FAQ/en/Format_String/media/str_hex_result.png differ diff --git a/docs/FAQ/en/Format_String/media/uart_read.png b/docs/FAQ/en/Format_String/media/uart_read.png new file mode 100644 index 0000000000000000000000000000000000000000..f17f3bfd40c75334b617219016d39a22c6fe657c Binary files /dev/null and b/docs/FAQ/en/Format_String/media/uart_read.png differ diff --git a/docs/FAQ/en/QP_common_question01/QP_common_question01.md b/docs/FAQ/en/QP_common_question01/QP_common_question01.md new file mode 100644 index 0000000000000000000000000000000000000000..8150714925b81ae9e5df08d9e8e9b79e2d431bf0 --- /dev/null +++ b/docs/FAQ/en/QP_common_question01/QP_common_question01.md @@ -0,0 +1,189 @@ +## The device manager has only two ports + +Cause analysis: it is right to select a compressed package for firmware download. However, the firmware package downloaded from the official website generally needs to be decompressed, which contains firmware (in the form of compressed package) and changelog + +Solution: decompress the compression downloaded from the official website, and ensure that the firmware meets the following points when burning: + +1. The selected firmware is a compressed package +2. The next level directories of the firmware are all. Bin, etc., that is, there are no additional compressed packages in the firmware( There may be firmware downloaded from the official website, which needs to be decompressed before proceeding to the next step) + +## Where is the API interface document for GPS + +For GPS, it is actually the read-write configuration of the serial port. There is no corresponding API document. You can download the corresponding data in the group file + +![image-20210412165603072](media/GPS_file.png) + +## Corresponding diagram of ec100y development board and module serial port + +The serial port location of ec100y development board (little bear pie) is shown in the figure below: + +![image-20210312134000186](media/EC100Y_UART.png) + +For the serial port position of ec100y module, refer to quectel_ EC100Y-CN_ Quecopen hardware design manual v1.0 (can be downloaded from the group file of the mobile quecpthon Development Exchange Group). + +## Corresponding diagram of ec600s development board and module serial port + +Ec600s development board (ec600s)_ QuecPython_ EVB_ The serial port location of V1. X development board) is shown in the figure below: + + ![image-20210312134025628](media/EC600SV1.1_UART.png) + +For the serial port position of ec600s module, refer to quectel_ EC600S-CN_ Quecopen hardware design manual v1.0.0_ Preliminary_ 20200927 (you can download it from the group file of the mobile quecpthon Development Exchange Group): + +## GPIO correspondence description + +### Find the specific location on the development board according to the schematic diagram + +Step 1: look at the correspondence between the GPIO and the pin pin (located in the pin module of the API library, the GPIO name of quecpthon is on the left, and the pin pin number of the module is on the right). For example, if you want to use the gpio6 of quecpthon, look at this figure. What you know is that the gpio6 corresponds to the pin15 of the module; + img + +The second step is to look at the schematic diagram of ec600sv1.1 (the black part needs no attention, only the part in the red circle). For the quecpthon gpio6 (pin15) just mentioned, here we focus on the gpio77 corresponding to pin15 (in fact, gpio77 has no special meaning, but only represents a connection relationship, that is, the gpio77 here corresponds to the gpio77 in the figure below). + img + img + Step 3: gpio77 in the last figure above corresponds to gpio77 (J6 of the development board) exported from the development board. + Summary: configure gpio6 of quecpthon and check whether the configuration is effective at gpio77 on the development board. + +### Find out the corresponding GPIO port according to the screen printing of the development board + +For example, I want to find the GPIO port of quecpthon corresponding to g81 on the development board (if the corresponding GPIO is not found according to the following method, it indicates that it has not been opened yet). + +The first step is to look at the schematic diagram. The schematic diagram corresponding to g81 of the development board is gpio81. As shown in the figure below, gpio81 corresponds to pin16 (please ignore the GPIO ID in the blue box and remember pin16) + +![img](media/GPIO04.jpg)![img](media/GPIO05.jpg) + +The second step is to look at the schematic diagram. The schematic diagram corresponding to g81 of the development board is gpio81. As shown in the figure below, gpio81 corresponds to pin16 ** (please ignore the GPIO ID in the blue box and remember pin16)** + +Step 3: go to the official website of quecpthon and find the API library of pin( https://python.quectel.com/wiki/#/zh -cn/api/QuecPythonClasslib?id=pin) + +As shown in the figure below, ** if you want to control g81, you need to configure gpio7 **. + +![img](media/GPIO06.jpg) + + + + + +## Usocket usage + +Usocket module provides access to BSD socket interface and supports communication methods such as address binding, listening, connection, data receiving and sending of socket. For details, see the quecpthon API class library documentation and the use of the usocket module. + +Code example: + +```python +#Import usocket module +import usocket +import log + +#Set log output level +log.basicConfig(level=log.INFO) +socket_log = log.getLogger("SOCKET") + +#Create a socket instance +sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) +#Resolve domain name +sockaddr = usocket.getaddrinfo('www.tongxinmao.com', 80)[0][-1] +#Establish connection +sock.connect(sockaddr) +#Send message to server +ret = sock.send('GET /News HTTP/1.1\r\nHost: www.tongxinmao.com\r\nAccept-Encoding: deflate\r\nConnection: keep-alive\r\n\r\n') +socket_log.info('send %d bytes' % ret) +#Receive server messages +data = sock.recv(256) +socket_log.info('recv %s bytes:' % len(data)) +socket_log.info(data.decode()) + +#Close connection +sock.close() +``` + +Example of operation results: + + ![image-20210312135703298](media/usocket.png) + +## Does quecpthon support queues + +​ Queue is a first in first out data structure. The main operations include entering and leaving the queue. Join the elements of the team to the tail, and take out the elements of the team from the head of the team. In quecpthon, we can use the list operation to simulate the queue: + +```python +class queue: + def __init__(self): + self.__alist = [] + + def push(self, value): + self.__alist.insert(0, value) + + def pop(self): + return self.__alist.pop() + + def size(self): + return len(self.__alist) + + def clean(self): + self.__alist.clear() + + def isEmpty(self): + return self.__alist == [] + + def showQueue(self): + print(self.__alist) +``` + +function: + +```python +if __name__ == '__main__': + q = queue() + q.push(1) + q.push("123") + q.push("456") + q.push(2) + q.showQueue() + print(q.pop()) + print(q.pop()) + print(q.pop()) + print(q.pop()) + q.showQueue() +``` + +## Socket parsing IP failed + +![image-20210312135803677](media/socket_IP.png) + +When using socket, mqtt and other related network connection APIs, IP resolution failure will occur, resulting in the above exception. + +Locate the problem direction: check whether the SIM card is successfully registered and the validity of the address, and try again. + +The at command to query whether the network is successfully stationed, [** at + cops** [query whether the network is resident] + +## Syntax error when executing script file + + ![image-20210312135817816](media/syntax_error.png) + +Cause: probably because Python syntax indentation error (4 spaces indentation) + +Troubleshooting method: check whether the code format indentation is standard + +It is recommended to use pycharm or vscode for development. The IDE will prompt syntax indentation and basic syntax errors. + +## Network request failed after SIM card plugging + +At present, ec100y does not support the hot plug function of SIM card, so if our SIM card needs to be re plugged, we need to manually restart the module to re inject the network. + +## Is the source file of quecpthon safe + +Qpycom download tool has code obfuscation encryption function to ensure that user programs are not directly exposed. + +## There is no response in qpycom operation + +Check whether the selected serial port is correct and open. + +## What tools are used to write Python code + +It is recommended to use pycharm or vscode, two popular ides with automatic completion function. + +## The serial port connected to the board cannot communicate + +Pay attention to whether the interface is 1.8V or 3.3V. Only when the level is matched can the communication be normal. + +## Connect the USB cable and the light is not on + +Check the module voltage, ensure that the 3.8V voltage of the module is stable, and supply power with battery if necessary. diff --git a/docs/FAQ/en/QP_common_question01/media/EC100Y_UART.png b/docs/FAQ/en/QP_common_question01/media/EC100Y_UART.png new file mode 100644 index 0000000000000000000000000000000000000000..4f5048d5699ba70e60d494609bffea847ba435a9 Binary files /dev/null and b/docs/FAQ/en/QP_common_question01/media/EC100Y_UART.png differ diff --git a/docs/FAQ/en/QP_common_question01/media/EC600SV1.1_UART.png b/docs/FAQ/en/QP_common_question01/media/EC600SV1.1_UART.png new file mode 100644 index 0000000000000000000000000000000000000000..7b700cbbda72524f9ad959c6ead9bc4793dc57d8 Binary files /dev/null and b/docs/FAQ/en/QP_common_question01/media/EC600SV1.1_UART.png differ diff --git a/docs/FAQ/en/QP_common_question01/media/GPIO01.jpg b/docs/FAQ/en/QP_common_question01/media/GPIO01.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bfaa7745cb2083b52b3f7cb912e82f2c5cad7ed0 Binary files /dev/null and b/docs/FAQ/en/QP_common_question01/media/GPIO01.jpg differ diff --git a/docs/FAQ/en/QP_common_question01/media/GPIO02.jpg b/docs/FAQ/en/QP_common_question01/media/GPIO02.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ae599847ff28ea44278d011564f8ea6f68ee4425 Binary files /dev/null and b/docs/FAQ/en/QP_common_question01/media/GPIO02.jpg differ diff --git a/docs/FAQ/en/QP_common_question01/media/GPIO03.jpg b/docs/FAQ/en/QP_common_question01/media/GPIO03.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4465058efe9c6888f9b54aea72b2ce048294623e Binary files /dev/null and b/docs/FAQ/en/QP_common_question01/media/GPIO03.jpg differ diff --git a/docs/FAQ/en/QP_common_question01/media/GPIO04.jpg b/docs/FAQ/en/QP_common_question01/media/GPIO04.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b5a4631fc16244eb6a9edae717daaaed8ced61a4 Binary files /dev/null and b/docs/FAQ/en/QP_common_question01/media/GPIO04.jpg differ diff --git a/docs/FAQ/en/QP_common_question01/media/GPIO05.jpg b/docs/FAQ/en/QP_common_question01/media/GPIO05.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f368c332062aeadbd5f0089a51ed07e75555d5cb Binary files /dev/null and b/docs/FAQ/en/QP_common_question01/media/GPIO05.jpg differ diff --git a/docs/FAQ/en/QP_common_question01/media/GPIO06.jpg b/docs/FAQ/en/QP_common_question01/media/GPIO06.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dcf75a760f986dccbd0ed06a4b057381755586c0 Binary files /dev/null and b/docs/FAQ/en/QP_common_question01/media/GPIO06.jpg differ diff --git a/docs/FAQ/en/QP_common_question01/media/GPS_file.png b/docs/FAQ/en/QP_common_question01/media/GPS_file.png new file mode 100644 index 0000000000000000000000000000000000000000..95ceb17fb12a393311064e02b4987633d5e3f4a9 Binary files /dev/null and b/docs/FAQ/en/QP_common_question01/media/GPS_file.png differ diff --git a/docs/FAQ/en/QP_common_question01/media/socket_IP.png b/docs/FAQ/en/QP_common_question01/media/socket_IP.png new file mode 100644 index 0000000000000000000000000000000000000000..0f7d4b0b96301b5651f321bfd57d85f2239e454e Binary files /dev/null and b/docs/FAQ/en/QP_common_question01/media/socket_IP.png differ diff --git a/docs/FAQ/en/QP_common_question01/media/syntax_error.png b/docs/FAQ/en/QP_common_question01/media/syntax_error.png new file mode 100644 index 0000000000000000000000000000000000000000..408a19251112775c9b8a4682701b6a4a4079eb0c Binary files /dev/null and b/docs/FAQ/en/QP_common_question01/media/syntax_error.png differ diff --git a/docs/FAQ/en/QP_common_question01/media/usocket.png b/docs/FAQ/en/QP_common_question01/media/usocket.png new file mode 100644 index 0000000000000000000000000000000000000000..4a83bc67936d660f08718183998fe308e4d4dcbf Binary files /dev/null and b/docs/FAQ/en/QP_common_question01/media/usocket.png differ diff --git a/docs/FAQ/en/QP_common_question02/QP_common_question02.md b/docs/FAQ/en/QP_common_question02/QP_common_question02.md new file mode 100644 index 0000000000000000000000000000000000000000..60a6f81c5874e1b61a1c721050a8e6d950c7670b --- /dev/null +++ b/docs/FAQ/en/QP_common_question02/QP_common_question02.md @@ -0,0 +1,123 @@ +## apn_ What's in cfg.json + +The built-in APN list cannot be deleted + +## Syntax error dragging file to module + +Please check the syntax of ". Py" file (mostly indentation) + +## Explanation of socket's [0] [- 1] + +```python +>>> import usocket +>>> client = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) +>>> sockaddr = usocket.getaddrinfo('www.tongxinmao.com',80)[0][-1] + +>>> print(sockaddr) +('120.76.100.197', 80) +>>> sockaddr = usocket.getaddrinfo('www.tongxinmao.com',80) +>>> print(sockaddr) +[(2, 1, 0, 'www.tongxinmao.com', ('120.76.100.197', 80))] +``` + +For example: + +```python +a = ((A,B,C),(2),(3)) +a[0] = (A,B,C) +a[0][-1] = C +``` + +## "Failed to execute script PYI" appears when win7 runs qpycom_ rth_ multiprocessing” + +Symptom: after Python is packaged by pyinstaller, it fails to run "failed to execute script PYI" on other computers_ rth_ Multiprocessing ": this problem occurs when running on a lower version of Windows 7. There is no problem porting programs on win10. + +Fault analysis: it is suspected that the version of some DLL files in windows is too low and does not support exe generated by higher version. The simplest method is to type an EXE separately on win7 machine, then run it on win7 and transplant it. + +The recommended method for customers is to upgrade win7 version to Sp1 + +## Net. Nitztime() + +After the network is successfully attached, the base station sends it once (only once) + +## For quecpthon board of ec600sv1.1, precautions for testing TTS function + +The peripheral is connected to the speaker, but the "microphone" is configured in the TTS + +Since a power amplifier is added to v1.1, it is necessary to pull up the pin58 (enable pin of power amplifier) of the socket of the module (hardware) or command to enable "audio"_ EN = Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_ PD, 1)” + +The power of external horn is limited, and it is recommended to be less than 8R 2W + +### If at configuration is required, + +**at+qaudmod=0 //spk** + +**at+qaudmod=1 //hs** + +**at+qaudmod=2 //loudspeaker** + +The following needs to be understood later + +AT+QAUDPATH=0 + +AT+QAUDDCH=0 + +## Calls to multiple. Py files + +For the two files under the usr directory, a.py and b.py, if you want to call b.py in a.py again, you need to add the following code in a.py. + +```python +#Method 1 +from usr import b +#Method 2 +import sys +sys.path.append('/usr/') #Enter the usr directory +import b +``` + +## Is there a limit on the number of threads? + +Up to 16 + +## How to operate the file system + +The root directory / is unreadable and writable, / usr is the user area, / bak is the backup area + +## How many bytes can the serial port accept at a time? + +2000 bytes actually received is OK; The maximum sending is 512, exceeding the automatic subcontracting; Socket and mqtt can send and receive 2000 bytes + +## Will the data listening of socket, mqtt and serial port block other threads + +Socket and mqtt are blocking functions and will not block other threads. + +The serial port itself is a 'non blocking function' and will not block other threads. + +## Explanation of parameters returned by base station location + +```python +>>> cellLocator.getLocation("www.queclocator.com", 80, "1111111122222222", 8, 1) +(117.1138, 31.82279, 550) +``` + +What does the returned result mean + +Positioning accuracy in M + +## Does the depth of the quecpthon queue have a maximum value? For example, if the callback happens all the time, will it be lost? + +Automatic growth with memory + +## Does the pin of the module have a description document of the default level + +We open out that IO is currently the default output low level + +## How about RTC time of ec600s module? Power off endurance + +There is no way to maintain battery life after power failure, because ec600s has no RTC pin + + + + + + diff --git a/docs/FAQ/en/QP_download/QP_download.md b/docs/FAQ/en/QP_download/QP_download.md new file mode 100644 index 0000000000000000000000000000000000000000..1db2c6a7294920ab4357ac582b3f9fe4b393c51b --- /dev/null +++ b/docs/FAQ/en/QP_download/QP_download.md @@ -0,0 +1,56 @@ +## Driver download and installation + +For driver download, please note the following: + +1. For specific steps, please refer to the instructions for use of the development board, for example: [instructions for use of ec600x development board](http://127.0.0.1:2333/doc/doc/Quecpython_intro/zh/Qp_Hw_EC600X/Hardware_Support_EC600X.html#usb) +2. For "quecpthon driver installation failure", see "[quecpthon driver installation failure solution](../QP_driver_failed/QP_driver_failed.html)”章节 + +3. Before installation, please back up your important files and save your work progress to avoid accidents and file loss + +4. After successful installation, there is no need to restart the computer + +5. To repair or uninstall the driver, run the driver installer again and select repair or uninstall + + +## Firmware download and burning + +For firmware burning, note the following: + +1. For specific steps, please refer to the instructions for use of the development board, for example: [instructions for use of ec600x development board](http://127.0.0.1:2333/doc/doc/Quecpython_intro/zh/Qp_Hw_EC600X/Hardware_Support_EC600X.html#-17) +2. For all modules, most of the firmware produced is at standard firmware. If you need to develop python, you need to burn Python firmware. Refer to the previous article for specific burning +3. Qpycom tool supports burning Python firmware, but does not support burning C firmware or at standard firmware +4. For "quecpthon firmware installation failure", see "[quecpthon brick rescue processing](../QP_recovery/QP_recovery.html)”章节 +5. Before installation, please back up your important files and save your work progress to avoid accidents and file loss +6. After successful installation, there is no need to restart the computer + +## Script Download + +For script download, note the following: + +1. In order to facilitate script download, qpycom has made the function of script drag and drop download. You are welcome to use it. If you have any problems, please refer to quectel quecpthon_ Qpycom tool instructions (this file can be obtained from qpycom compressed package, path: \ qpycom_ Vx.x.x\docs) + +2. If you want to download all your scripts at once and clear the original scripts (see the explanation below for which scripts to clear), you can follow the script download steps below + +3. Explanation of which scripts will be deleted in the following script download steps: for the root directory, except JSON, it will be deleted, while for the subfolder (create a new folder yourself), script download will not affect this folder. + +Script download steps: + +(1) After the user selects "USB serial device", open the serial port and click the "download" button to create a project (the project name is optional). + +jioaben_start + +(2) Click "select firmware" (for script download, you need to select firmware temporarily, but firmware will not be downloaded. This step can be omitted later). + +jioaben_choosefirmware + +(3) Select the script to download + +jioaben_choosejiaoben + +(4) Download the script and wait for it to complete + +jioaben_downloadstart + +(5) Complete the interface display + +jioaben_downloadsuccess diff --git a/docs/FAQ/en/QP_download/media/jioaben_choosefirmware.png b/docs/FAQ/en/QP_download/media/jioaben_choosefirmware.png new file mode 100644 index 0000000000000000000000000000000000000000..125048b1d08aa1b36fede9e5aa821a3b0e740a62 Binary files /dev/null and b/docs/FAQ/en/QP_download/media/jioaben_choosefirmware.png differ diff --git a/docs/FAQ/en/QP_download/media/jioaben_choosejiaoben.png b/docs/FAQ/en/QP_download/media/jioaben_choosejiaoben.png new file mode 100644 index 0000000000000000000000000000000000000000..2b1b479b7e6b44ea01340869b1b2d4373beb3b57 Binary files /dev/null and b/docs/FAQ/en/QP_download/media/jioaben_choosejiaoben.png differ diff --git a/docs/FAQ/en/QP_download/media/jioaben_downloadstart.png b/docs/FAQ/en/QP_download/media/jioaben_downloadstart.png new file mode 100644 index 0000000000000000000000000000000000000000..419ecf09c8305f1f144cd5a755f7e33ba2c91280 Binary files /dev/null and b/docs/FAQ/en/QP_download/media/jioaben_downloadstart.png differ diff --git a/docs/FAQ/en/QP_download/media/jioaben_downloadsuccess.png b/docs/FAQ/en/QP_download/media/jioaben_downloadsuccess.png new file mode 100644 index 0000000000000000000000000000000000000000..dd256ff53cf967f9e221d194205eb3bf3f372587 Binary files /dev/null and b/docs/FAQ/en/QP_download/media/jioaben_downloadsuccess.png differ diff --git a/docs/FAQ/en/QP_download/media/jioaben_start.png b/docs/FAQ/en/QP_download/media/jioaben_start.png new file mode 100644 index 0000000000000000000000000000000000000000..7dca2571afbb1a4165c61e28320924ae5ac0a0af Binary files /dev/null and b/docs/FAQ/en/QP_download/media/jioaben_start.png differ diff --git a/docs/FAQ/en/QP_driver_failed/QP_driver_failed.md b/docs/FAQ/en/QP_driver_failed/QP_driver_failed.md new file mode 100644 index 0000000000000000000000000000000000000000..465cbde4a71bdce372702a567d3e721ad4342fff --- /dev/null +++ b/docs/FAQ/en/QP_driver_failed/QP_driver_failed.md @@ -0,0 +1,11 @@ +**If the USB enumeration fails after the driver is installed, the solution is:** + +1. Ensure that the latest corresponding drivers are downloaded from the official website (** win7 and win10 are different, and the corresponding drivers of different chip platforms are also different **) + + Refer to your computer system and module chip platform ([hardware support]( https://python.quectel.com/doc/doc/Quecpython_ intro/zh/Qp_ Product_ intro/Hardware_ Support. HTML) view the chip platform) and download the corresponding driver + +2. In "control panel" - "uninstaller", check whether the driver is successfully installed. The screenshot shows the successful installation + + ![dirver](../QP_recovery/media/dirver.png) + +3. If there is still a driver installation problem, please join our QQ group 445121768, and the engineer will answer your questions online diff --git a/docs/FAQ/en/QP_recovery/QP_recovery.md b/docs/FAQ/en/QP_recovery/QP_recovery.md new file mode 100644 index 0000000000000000000000000000000000000000..60559ee8ecf5a7922e9b6ce129c445a88596bee6 --- /dev/null +++ b/docs/FAQ/en/QP_recovery/QP_recovery.md @@ -0,0 +1,163 @@ +When you fail to download firmware using qpycom tool, don't worry about the brick. Let's help you save the brick. + +## The serial port can be displayed normally + +1. Open the computer task manager (you can open it with the shortcut "Ctrl + Alt + delete"), find qpycom.exe and force the end of the background task. + +2. For the development board: press and hold the reset button on the board to restart the board; For bare modules, you can directly power off and then power on, and then pull down powkey to start up + +3. Check whether a normal number of serial ports are displayed in the serial port list of the device manager. If the original firmware is Python firmware, three serial ports (at, diag and USB serial device ports) will be displayed normally. The screenshot on the left side of the table below. If the original firmware is non Python firmware, two serial ports (at and Diag ports) will be displayed normally. The screenshot on the right side of the table below. The following screenshots belong to normal display. For modules that can be displayed normally, please proceed to step 4; For modules with abnormal display, refer to method 2 or method 3. + +|Device manager corresponding to Python firmware module | device manager corresponding to non Python firmware module| +| ------------------------------- | -------------------------------- | +| ![img](media/clip_image002.jpg) | ![img](media/clip_image004.jpg) | + +4. If the serial port is displayed normally, reopen qpycom.exe tool and refer to quectel quecpthon_ Download the firmware again according to qpycom tool instructions. + + + +## Qpycom brick rescue + +If the upgrade fails in qpycom or the connection is disconnected during the upgrade process, please follow the following steps: + +1. Power off the module and short circuit VDD_ Ext and USB_ Boot, the pin pin pin position corresponding to the module is shown in the figure below + +![img](media/clip_image006.jpg) + +Or it can be directly short circuited to ec600s_ QuecPython_ EVB_ Boot and 1v8 of V1. X development board (as shown below); For other development boards, find the corresponding location yourself + +img + +img + +2. Check whether the download port appears in the device management, as shown in the following figure: + +img + +3. If it is not the download port shown in the figure above, the ASR download port appears, as shown in the figure below: + +img + +​ There are two solutions: + +(1) Ignore and continue with "step 4" below, but if it fails, follow method 3 + +(2) Adjust the download port (see Chapter "download port adjustment" for specific steps) + +4. Open qpycom without opening the serial port and directly create the project (** for modules without Python firmware, do not open the serial port **). + +img + +5. Click "select firmware". + +**Precautions:** + +(1) The selected firmware is a compressed package + +(2) The next level directories of the firmware are all. Bin and so on, that is, there are no additional compressed packages in the firmware( There may be firmware downloaded from the official website, which needs to be decompressed before proceeding to the next step) + +img + +6. Click "download firmware" + +img + +7. Wait about 20 seconds and the download progress bar will appear + +img + +8. Wait for the download to complete, and the following interface will appear, indicating "download succeeded" + +img + + + +9. For the module that will restart automatically after the above download is successful (if not, restart manually), check the device manager and the correct display is as follows: + +img + + + +## Qflash brick rescue + + + +1. Download the qflash tool compressed package, unzip it, and double-click to run the software; + +img + +2. Click [load FW files] to select the firmware upgrade package. + +**Firmware package considerations:** + +(1) The selected firmware is a compressed package + +(2) The next level directory of the firmware is all. Bin files, etc., that is, there is no additional compressed package in the firmware( There may be firmware downloaded from the official website, which needs to be decompressed before proceeding to the next step) + +3. For ec100y and ec600s, it is not necessary to select COM port and baudrate, so the "COM port and baudrate" in the figure can be ignored, that is, even if there is no normal port, qflash can be used to download firmware + +4. Short circuit VDD_ Ext and USB_ Boot (short circuit before power on, see method 2 for the short circuit position), then power on, and click start of qflash at the same time. + +![img](media/clip_image030.jpg) + +matters needing attention: + +​ Due to the time limit for qflash to detect the download port, it can be considered to put the short circuit in the first step, and then power on directly for step 4; Or fast operation is required for short circuit power on in step 4 + +5. After downloading, refer to the following screenshot: + +![img](media/clip_image032.jpg) + +6. Qcom query is shown in the figure below + +![img](media/clip_image034.jpg) + +Displaying the end of Py indicates that the PY firmware was successfully burned + +For the problems that may be encountered in method 2, the following suggestions are made: + +(1) In case of any failure in qflash download, please close qflash and restart (how to effectively close the qflash process, you can open "device manager" through "Ctrl + Alt + delete" to completely kill qflash, as shown in the screenshot below). Then return to the first step to download the firmware. + +img + +(2) After the short circuit is powered on, the computer port will be displayed as shown in the figure below (other ports are disabled and the download port appears), which can be viewed and confirmed. + +img + + + + + + + +## Download port adjustment + +1. First, confirm whether the download port is as shown in the screenshot below. If so, continue to perform "step 2". Otherwise, consult the group (move away from quecpthon development communication group: 445121768) + +img + +2. Select the download port of the above screenshot and right-click "update driver" + +img + +3. Select browse my computer for drivers + +img + +4. Select let me select from the list of available drivers on my computer + +img + + + +5. Select "quectel download port" (if not, please download and install the driver first) and click "next" + +img + +6. Select close + +img + +7. The final interface is shown in the figure below, indicating that "download port adjustment" is completed. + +img diff --git a/docs/FAQ/en/QP_recovery/media/clip_image002.jpg b/docs/FAQ/en/QP_recovery/media/clip_image002.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c62422b5054daa92952399ea919da6a714f79184 Binary files /dev/null and b/docs/FAQ/en/QP_recovery/media/clip_image002.jpg differ diff --git a/docs/FAQ/en/QP_recovery/media/clip_image004.jpg b/docs/FAQ/en/QP_recovery/media/clip_image004.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5d6d63552b1294cd6a8782466232024bf153d3cd Binary files /dev/null and b/docs/FAQ/en/QP_recovery/media/clip_image004.jpg differ diff --git a/docs/FAQ/en/QP_recovery/media/clip_image006.jpg b/docs/FAQ/en/QP_recovery/media/clip_image006.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4f7ec97b7474a3eeba7463d6730cd2d3e7d37f99 Binary files /dev/null and b/docs/FAQ/en/QP_recovery/media/clip_image006.jpg differ diff --git a/docs/FAQ/en/QP_recovery/media/clip_image008.jpg b/docs/FAQ/en/QP_recovery/media/clip_image008.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9340907998031eb3d5cccca63fae050665dcafcc Binary files /dev/null and b/docs/FAQ/en/QP_recovery/media/clip_image008.jpg differ diff --git a/docs/FAQ/en/QP_recovery/media/clip_image010.jpg b/docs/FAQ/en/QP_recovery/media/clip_image010.jpg new file mode 100644 index 0000000000000000000000000000000000000000..be55fd5de013def23feeaa2eb398a801ab9f79e5 Binary files /dev/null and b/docs/FAQ/en/QP_recovery/media/clip_image010.jpg differ diff --git a/docs/FAQ/en/QP_recovery/media/clip_image012.jpg b/docs/FAQ/en/QP_recovery/media/clip_image012.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4f85c873908b4a9ad928c09a95eeed0fac7c2514 Binary files /dev/null and b/docs/FAQ/en/QP_recovery/media/clip_image012.jpg differ diff --git a/docs/FAQ/en/QP_recovery/media/clip_image014.jpg b/docs/FAQ/en/QP_recovery/media/clip_image014.jpg new file mode 100644 index 0000000000000000000000000000000000000000..785afbceb1320d644427958f1f40b93a73989f0d Binary files /dev/null and b/docs/FAQ/en/QP_recovery/media/clip_image014.jpg differ diff --git a/docs/FAQ/en/QP_recovery/media/clip_image016.jpg b/docs/FAQ/en/QP_recovery/media/clip_image016.jpg new file mode 100644 index 0000000000000000000000000000000000000000..da7e9035a948134a4d4e2d4414a9810306ba9c14 Binary files /dev/null and b/docs/FAQ/en/QP_recovery/media/clip_image016.jpg differ diff --git a/docs/FAQ/en/QP_recovery/media/clip_image018.jpg b/docs/FAQ/en/QP_recovery/media/clip_image018.jpg new file mode 100644 index 0000000000000000000000000000000000000000..086431c17c77177a4223a569e20094527f237acf Binary files /dev/null and b/docs/FAQ/en/QP_recovery/media/clip_image018.jpg differ diff --git a/docs/FAQ/en/QP_recovery/media/clip_image020.jpg b/docs/FAQ/en/QP_recovery/media/clip_image020.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b71a41b97c5bae5534cd550e55357f1fc25d3963 Binary files /dev/null and b/docs/FAQ/en/QP_recovery/media/clip_image020.jpg differ diff --git a/docs/FAQ/en/QP_recovery/media/clip_image022.jpg b/docs/FAQ/en/QP_recovery/media/clip_image022.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c4757d18cb45adb2c1ca40541261be64f3d0adac Binary files /dev/null and b/docs/FAQ/en/QP_recovery/media/clip_image022.jpg differ diff --git a/docs/FAQ/en/QP_recovery/media/clip_image024.jpg b/docs/FAQ/en/QP_recovery/media/clip_image024.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e3b8ed03436804b68d24cc5a68b349d291e0952c Binary files /dev/null and b/docs/FAQ/en/QP_recovery/media/clip_image024.jpg differ diff --git a/docs/FAQ/en/QP_recovery/media/clip_image026.jpg b/docs/FAQ/en/QP_recovery/media/clip_image026.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9cbc3645fdbfecfe7de43d7eec54e2b1fcfe25f9 Binary files /dev/null and b/docs/FAQ/en/QP_recovery/media/clip_image026.jpg differ diff --git a/docs/FAQ/en/QP_recovery/media/clip_image028.jpg b/docs/FAQ/en/QP_recovery/media/clip_image028.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b36875b58785b2ed7bf13f332cda4159f3f53107 Binary files /dev/null and b/docs/FAQ/en/QP_recovery/media/clip_image028.jpg differ diff --git a/docs/FAQ/en/QP_recovery/media/clip_image030.jpg b/docs/FAQ/en/QP_recovery/media/clip_image030.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a0388365a83427245727e3a8ace96c8dfcb47495 Binary files /dev/null and b/docs/FAQ/en/QP_recovery/media/clip_image030.jpg differ diff --git a/docs/FAQ/en/QP_recovery/media/clip_image032.jpg b/docs/FAQ/en/QP_recovery/media/clip_image032.jpg new file mode 100644 index 0000000000000000000000000000000000000000..df7c78202aa7e7f958a0317669795f4f71de921a Binary files /dev/null and b/docs/FAQ/en/QP_recovery/media/clip_image032.jpg differ diff --git a/docs/FAQ/en/QP_recovery/media/clip_image034.jpg b/docs/FAQ/en/QP_recovery/media/clip_image034.jpg new file mode 100644 index 0000000000000000000000000000000000000000..315ef007b4ecced814894a76e832cddc55a63873 Binary files /dev/null and b/docs/FAQ/en/QP_recovery/media/clip_image034.jpg differ diff --git a/docs/FAQ/en/QP_recovery/media/clip_image036.jpg b/docs/FAQ/en/QP_recovery/media/clip_image036.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b2be3d1cf6d6c822b2a9e3978347cd5905160593 Binary files /dev/null and b/docs/FAQ/en/QP_recovery/media/clip_image036.jpg differ diff --git a/docs/FAQ/en/QP_recovery/media/clip_image038.jpg b/docs/FAQ/en/QP_recovery/media/clip_image038.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6a5ce692d9ca4ae20778c6bf6c3943d00de84ab0 Binary files /dev/null and b/docs/FAQ/en/QP_recovery/media/clip_image038.jpg differ diff --git a/docs/FAQ/en/QP_recovery/media/clip_image040.jpg b/docs/FAQ/en/QP_recovery/media/clip_image040.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4f3c23c2449b495132e2f0fe068907634f84b7b0 Binary files /dev/null and b/docs/FAQ/en/QP_recovery/media/clip_image040.jpg differ diff --git a/docs/FAQ/en/QP_recovery/media/clip_image042.jpg b/docs/FAQ/en/QP_recovery/media/clip_image042.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c93ff5888e19b845ec84f921eff0e11a756085a9 Binary files /dev/null and b/docs/FAQ/en/QP_recovery/media/clip_image042.jpg differ diff --git a/docs/FAQ/en/QP_recovery/media/clip_image044.jpg b/docs/FAQ/en/QP_recovery/media/clip_image044.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f274709d4219fbd8788975dd52f5bc7ecc7f9104 Binary files /dev/null and b/docs/FAQ/en/QP_recovery/media/clip_image044.jpg differ diff --git a/docs/FAQ/en/QP_recovery/media/clip_image046.jpg b/docs/FAQ/en/QP_recovery/media/clip_image046.jpg new file mode 100644 index 0000000000000000000000000000000000000000..be4865f3ba188c1223ef9907aea92f3d350806b4 Binary files /dev/null and b/docs/FAQ/en/QP_recovery/media/clip_image046.jpg differ diff --git a/docs/FAQ/en/QP_recovery/media/clip_image048.jpg b/docs/FAQ/en/QP_recovery/media/clip_image048.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0bcef91799bbb22b5c8760bf13458f302e925b08 Binary files /dev/null and b/docs/FAQ/en/QP_recovery/media/clip_image048.jpg differ diff --git a/docs/FAQ/en/QP_recovery/media/clip_image050.jpg b/docs/FAQ/en/QP_recovery/media/clip_image050.jpg new file mode 100644 index 0000000000000000000000000000000000000000..38cc326e6c74c7fede94c7b5538ee791a8ea57f8 Binary files /dev/null and b/docs/FAQ/en/QP_recovery/media/clip_image050.jpg differ diff --git a/docs/FAQ/en/QP_recovery/media/dirver.png b/docs/FAQ/en/QP_recovery/media/dirver.png new file mode 100644 index 0000000000000000000000000000000000000000..1e9699c614b5fb9e818dc025b9b5531724f514bc Binary files /dev/null and b/docs/FAQ/en/QP_recovery/media/dirver.png differ diff --git a/docs/FAQ/en/QP_recovery/media/image-20210412165538789.png b/docs/FAQ/en/QP_recovery/media/image-20210412165538789.png new file mode 100644 index 0000000000000000000000000000000000000000..95ceb17fb12a393311064e02b4987633d5e3f4a9 Binary files /dev/null and b/docs/FAQ/en/QP_recovery/media/image-20210412165538789.png differ diff --git a/docs/FAQ/en/QP_test/QP_test.md b/docs/FAQ/en/QP_test/QP_test.md new file mode 100644 index 0000000000000000000000000000000000000000..b7bbceb70c941061648922ec9e03e8d4fa0c666d --- /dev/null +++ b/docs/FAQ/en/QP_test/QP_test.md @@ -0,0 +1,271 @@ +## The quecpthon main.py file uses + +Suggestions for main.py: + +(1) For the initial debugging, it is recommended not to name the program: main.py. It is recommended to use other names, such as start.py, etc. If there is an endless loop, it cannot be interrupted when the program is running. In this case, it can only be solved by re brushing the firmware for the time being. + +(2) If you really want to use the main.py program and need to use the dead loop at the same time, remember to add an interruptible condition to the dead loop, for example (1. The following example is that an dead loop is added to a thread and an interrupt exit condition is added to the dead loop. When it is always output, it can be output by pressing the key corresponding to gpio2; 2. The following example is based on ec600s_ QuecPython_ EVB_ For v1. X development board, please configure the key interrupt for other development boards): + +```python +import log +import _thread +from machine import Pin +import utime +log.basicConfig(level=log.NOTSET) +KEY_log = log.getLogger("KEY") +gpio2 = Pin(Pin.GPIO2, Pin.IN, Pin.PULL_DISABLE, 0) +def in_capture(): + KEY_log.debug("in_capture start!") + while True: + KEY_log.info("1111") + utime.sleep(1) + if gpio2.read() == 0: + KEY_log.info("in_capture thread end") + break + else: + pass +if __name__ == "__main__": + _thread.start_new_thread(in_capture, ()) + +``` + +(3) For self running without log output, please refer to the solution of phenomenon 2 below. + +**Phenomenon 1: after uploading the PY file and the file name is main.py to the module, no instructions can be executed (including uploading the file). A similar phenomenon is shown in the screenshot below** + +img + +Cause: the module will automatically look for the script file named main.py after startup. If there are loop statements such as while and for in main.py, the program will be blocked, the serial port will be occupied, and other operations cannot be performed + +**Solution: the current version can only be solved by re brushing the firmware **. + + + +**Phenomenon 2: when you manually run the main.py program, you can see the print output and log printing information connected to the "USB serial device" through qpycom. However, after running the main.py program, you can't see anything in the interactive interface of qpycom** + +**Solution: serial port printing can be added** + +(1) Software code can refer to: + +```python +from machine import UART #Import UART module +uart = UART(UART.UART2, 115200, 8, 0, 1, 0) #Configured as UART2 output (hardware connection) +count = 50 +while count: + uart.write('main_py_UART_msg:{}\r\n'.format(count)) + count -= 1 +``` + +explain: + +​ Serial port printing needs to import UART module and write output code according to UART API library + +(2) For hardware connection, refer to: + +For the hardware connection (UART2) mentioned in the code, type-C is used to supply power to the module. The connection between UART and TTL to USB module is shown in the table below. TTL to USB module is directly inserted into PC: + +|Module UART_ Pin | TTL to USB module| +| -------------- | ------------ | +| RX1 | Tx | +| TX1 | Rx | +| GND | GND | + +Use qcom to connect the serial port corresponding to "TTL to USB module", as shown in the following figure: + +img + +In view of the above software and hardware configuration, when running the main.py program, you will see the corresponding print in qcom, as shown in the following figure: + +img + +## Test flow of sending and receiving data of serial port + +Environment setup (this test only tests the serial port encapsulation of API): + +(1) USB to ec600s_ QuecPython_ EVB_ V1. X power supply, TX1 and rx1 of the main serial port are correspondingly connected to the 3.3V terminal of the level conversion chip (after level conversion to 5V, a level converter is used), and the serial port tool GND is grounded + +(2) Software: one end uses qpycom to connect ec600s_ QuecPython_ EVB_ "USB serial device" port of V1. X (used to send quecpthon instruction during debugging); The other end uses qcom to connect the port corresponding to "level converter device" (for receiving ec600s_ QuecPython_ EVB_ Data sent by v1. X (write function of the test module), and data sent to the module (read function of the test module)). + +```python +#Send data (write): +>>> from machine import UART +>>>UART = UART (UART. Uart2115200,8,0,1,0) / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / +>>>UART. Write ("12345678") / / / / after the data is received, you can see the data through qcom (as shown in the screenshot below) +8 / / / / / / / / / / / "8" indicates the number of bytes sent +``` + +![image-20210311201822427](media/image-20210311201822427.png) + + + +```python +#Data received (read): +>>> from machine import UART +>>>UART = UART (UART. Uart2115200,8,0,1,0) / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / +>>>UART. Any() / / / / / / / / displays cached data (unread data will be displayed here only when qcom sends data) +32 +>>>Msglen = UART. Any() / / / / / / / / assign the length of cached data bytes to msglen +>>>MSG = UART. Read (msglen) / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / +>>> utf8_ Mmmm = MSG. Decode() / / / / / / / / / / / / / convert byte type data to unicode type +>>> print(utf8_ Mmmm) / / / / / / / output data as Unicode type +555555 +555555 +555555 +555555 +``` + + + +## Socket test (customer feedback: no error will be reported if the connection fails) + +The problem is: using the connect command, success and failure are not displayed + +```python +>>> import usocket +>>> client = usocket.socket(usocket.AF_ INET, usocket.SOCK_ Stream) / / / must be defined before each connection +>>>SOCKADDR = usocket. Getaddrinfo ('www.tongxinmao. Com ', 80) [0] [- 1] / / / correct port, socket +>>> client.connect(sockaddr) +>>>Client. Close() / / //////////////////////// +>>> client = usocket.socket(usocket.AF_ INET, usocket.SOCK_ Stream) / / / must be defined before each connection +>>>SOCKADDR = usocket. Getaddrinfo ('www.tongxinmao. Com ', 82) [0] [- 1] / / / error port, socket +>>> client.connect(sockaddr) +Traceback (most recent call last): + File "", line 1, in +OSError: 104 +>>>Client. Close() / / //////////////////////// +>>> client = usocket.socket(usocket.AF_ INET, usocket.SOCK_ Stream) / / / must be defined before each connection +>>>SOCKADDR = usocket. Getaddrinfo ('www.tongxinmao. Com ', 80) [0] [- 1] / / / correct port, socket + +>>> client.connect(sockaddr) +>>>Client. Close() / / //////////////////////// +``` + +## Ec600s bare module startup burning test + +Hardware connection of ec600s: + +|Module end | USB| +| ----------------- | --------------------- | +| USB_ DP (pin26) | green - USB data cable (positive)| +| USB_ DM (pin27) | white - USB data cable (negative)| +| USB_ VBUS (pin28) | red - USB power supply| +|GND (pin30) | black - ground wire| + +|Module end | power end| +| ---------------- | ---------- | +| VBAT_ BB (pin29) | positive pole of power supply| +| VBAT_ RF (pin36) | positive pole of power supply| +| VBAT_ RF (pin37) | positive pole of power supply| +|GND (pin38) | negative pole of power supply| + +Physical drawing: + +![image-20210312101407043](media/image-20210312101407043.png) ![image-20210312102149061](media/image-20210312102149061.png) + + Powkey pulls down the DM without burning firmware after startup + +image-20210312102450245 + +After burning, restart the DM + +image-20210312102517370 + +Pre and Post version query + +image-20210312132017231 + + + +## QuecPython mqtt connection exception handling + +### Umqtt use + +The umqtt module provides the ability to create publish subscriptions for mqtt clients. This module can publish or subscribe messages to the server, send Ping packets to the server, detect and maintain connectivity, and establish or disconnect connections with the server. Note mqttclient.check_ Msg() and mqttclient.wait_ ** wait is recommended in msg() method_ MSG **. + +### Use mqtt to connect Alibaba cloud, Tencent cloud, etc + +Please refer to the wiki community ([ https://python.quectel.com/wiki/ ](https://python.quectel.com/wiki/))的QuecPython云服务。 + +### The cloud service running demo appears, and there is no subscription and other information + +Phenomenon: similar to the screenshot below + +![image-20210312132446192](media/image-20210312132446192.png) + +Cause analysis: (1) network injection failure( 2) The topics you subscribed to and published were not created on the cloud server + +(1) For network injection failure, the solution steps are as follows: + +​ Use qcom to connect at port and query the command "at + CSQ"+ CREG?; + CEREG? ;+ CGREG? ; + CPIN?;+ COPS?”, The screenshot below shows that your network status is normal. + +![image-20210312132458172](media/image-20210312132458172.png) + +​ Common solutions for exceptions are: + +For at + cpin? Check the hardware problem of SIM card holder; + +For CREG, cgreg and cereg, it is recommended to check whether the mobile phone card is in arrears, that is, to confirm whether the mobile phone card is normal + +For CSQ, check the surrounding environment for interference that leads to poor signal. It is recommended to test outdoors or add an antenna indoors. + +(2) For "the topic of subscription and publication is not created on the cloud server", it is recommended to check the following two points: + +Check whether the topics you subscribe to are also subscribable on the cloud service + +Check whether the topic you publish is also publishable on the cloud service + +### The mqtt connection was disconnected abnormally for a period of time + +Cause: the mqtt server will have a heartbeat detection mechanism. If there is no communication activity between the device and the cloud for a period of time, it will actively disconnect + +Direction of trying to solve: disconnection is based on the timeout value of mqtt configuration. After the activity time is exceeded, the connection will be disconnected actively. We can use the timer according to the set keepalive activity time to actively send Ping packets to the cloud before the activity time exceeds. The data packets returned by the server do not need to be processed by the customer. + +![image-20210312132735642](media/image-20210312132735642.png) + +## Mqtt test + +Customer question: mqtt disconnection is obtained by capturing exceptions, but after disconnection, exceptions cannot be captured + +Question answer: an exception will be thrown. Umqtt has handled it. The upper level try cannot catch the following exception. For reconnection after disconnection, there will be log output, and no exception will be thrown directly. The following are some logs of the test (I have been sending and receiving before, and then try to reconnect after pulling out the card) + +The specific test code is: + +```python +from umqtt import MQTTClient +import utime +import log +import checkNet + +PROJECT_NAME = "QuecPython_MQTT_example" +PROJECT_VERSION = "1.0.0" + +checknet = checkNet.CheckNetwork(PROJECT_NAME, PROJECT_VERSION) + +#Set log output level +log.basicConfig(level=log.INFO) +mqtt_log = log.getLogger("MQTT") + +state = 0 +def sub_cb(topic, msg): + global state + mqtt_log.info("Subscribe Recv: Topic={},Msg={}".format(topic.decode(), msg.decode())) + +if __name__ == '__main__': + utime.sleep(5) + checknet.poweron_print_once() + checknet.wait_network_connected() + c = MQTTClient("umqtt_client", "mq.tongxinmao.com", 18830) + c.set_callback(sub_cb) + c.connect() + while True: + c.subscribe(b"/public/TEST/quecpython") + mqtt_log.info("Connected to mq.tongxinmao.com, subscribed to /public/TEST/quecpython topic") + #Release news + c.publish(b"/public/TEST/quecpython", b"my name is Quecpython!") + mqtt_log.info("Publish topic: /public/TEST/quecpython, msg: my name is Quecpython") + c.wait_msg() #Blocking function, listening for messages + if state == 1: + break + c.disconnect() +``` + diff --git a/docs/FAQ/en/QP_test/media/EC600SV1.1_UART.png b/docs/FAQ/en/QP_test/media/EC600SV1.1_UART.png new file mode 100644 index 0000000000000000000000000000000000000000..7b700cbbda72524f9ad959c6ead9bc4793dc57d8 Binary files /dev/null and b/docs/FAQ/en/QP_test/media/EC600SV1.1_UART.png differ diff --git a/docs/FAQ/en/QP_test/media/clip_image004-1615461735615.jpg b/docs/FAQ/en/QP_test/media/clip_image004-1615461735615.jpg new file mode 100644 index 0000000000000000000000000000000000000000..df8984d78a986f8caf0756b63fe194c934c2e9d9 Binary files /dev/null and b/docs/FAQ/en/QP_test/media/clip_image004-1615461735615.jpg differ diff --git a/docs/FAQ/en/QP_test/media/clip_image006-1615461735616.jpg b/docs/FAQ/en/QP_test/media/clip_image006-1615461735616.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1dd67f3203b423fd642adfdcf5f1e6d4398cd28f Binary files /dev/null and b/docs/FAQ/en/QP_test/media/clip_image006-1615461735616.jpg differ diff --git a/docs/FAQ/en/QP_test/media/clip_image008-1615527701161.jpg b/docs/FAQ/en/QP_test/media/clip_image008-1615527701161.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b5a4631fc16244eb6a9edae717daaaed8ced61a4 Binary files /dev/null and b/docs/FAQ/en/QP_test/media/clip_image008-1615527701161.jpg differ diff --git a/docs/FAQ/en/QP_test/media/clip_image010-1615527701161.jpg b/docs/FAQ/en/QP_test/media/clip_image010-1615527701161.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f368c332062aeadbd5f0089a51ed07e75555d5cb Binary files /dev/null and b/docs/FAQ/en/QP_test/media/clip_image010-1615527701161.jpg differ diff --git a/docs/FAQ/en/QP_test/media/clip_image012-1615527701161.jpg b/docs/FAQ/en/QP_test/media/clip_image012-1615527701161.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dcf75a760f986dccbd0ed06a4b057381755586c0 Binary files /dev/null and b/docs/FAQ/en/QP_test/media/clip_image012-1615527701161.jpg differ diff --git a/docs/FAQ/en/QP_test/media/image-20210311201822427.png b/docs/FAQ/en/QP_test/media/image-20210311201822427.png new file mode 100644 index 0000000000000000000000000000000000000000..dfd2dbf09483689d6fa80e3b07fa611840dcb041 Binary files /dev/null and b/docs/FAQ/en/QP_test/media/image-20210311201822427.png differ diff --git a/docs/FAQ/en/QP_test/media/image-20210312101407043.png b/docs/FAQ/en/QP_test/media/image-20210312101407043.png new file mode 100644 index 0000000000000000000000000000000000000000..07aa3ada32cfd8352b5466c2c4ae595be1e3529e Binary files /dev/null and b/docs/FAQ/en/QP_test/media/image-20210312101407043.png differ diff --git a/docs/FAQ/en/QP_test/media/image-20210312102149061.png b/docs/FAQ/en/QP_test/media/image-20210312102149061.png new file mode 100644 index 0000000000000000000000000000000000000000..61b0c4e5c2104fdcd5fdbfb76ef624b36ad6b8ed Binary files /dev/null and b/docs/FAQ/en/QP_test/media/image-20210312102149061.png differ diff --git a/docs/FAQ/en/QP_test/media/image-20210312102450245.png b/docs/FAQ/en/QP_test/media/image-20210312102450245.png new file mode 100644 index 0000000000000000000000000000000000000000..1d1f291345f99b3a2a45c0eb988b83802530a096 Binary files /dev/null and b/docs/FAQ/en/QP_test/media/image-20210312102450245.png differ diff --git a/docs/FAQ/en/QP_test/media/image-20210312102517370.png b/docs/FAQ/en/QP_test/media/image-20210312102517370.png new file mode 100644 index 0000000000000000000000000000000000000000..f17ab6dc6c9fbd56a907ec9101a8b6b81a2010c9 Binary files /dev/null and b/docs/FAQ/en/QP_test/media/image-20210312102517370.png differ diff --git a/docs/FAQ/en/QP_test/media/image-20210312132017231.png b/docs/FAQ/en/QP_test/media/image-20210312132017231.png new file mode 100644 index 0000000000000000000000000000000000000000..1bc216678facc9e4b596aea1d0935564fe03eed5 Binary files /dev/null and b/docs/FAQ/en/QP_test/media/image-20210312132017231.png differ diff --git a/docs/FAQ/en/QP_test/media/image-20210312132446192.png b/docs/FAQ/en/QP_test/media/image-20210312132446192.png new file mode 100644 index 0000000000000000000000000000000000000000..df0ccc00f3b37e23daf51c0258f9288973efcba1 Binary files /dev/null and b/docs/FAQ/en/QP_test/media/image-20210312132446192.png differ diff --git a/docs/FAQ/en/QP_test/media/image-20210312132458172.png b/docs/FAQ/en/QP_test/media/image-20210312132458172.png new file mode 100644 index 0000000000000000000000000000000000000000..6e666713160348d38305ca0b5299d60f23f69c2a Binary files /dev/null and b/docs/FAQ/en/QP_test/media/image-20210312132458172.png differ diff --git a/docs/FAQ/en/QP_test/media/image-20210312132735642.png b/docs/FAQ/en/QP_test/media/image-20210312132735642.png new file mode 100644 index 0000000000000000000000000000000000000000..6e2a63139ea716f3a8f3b59ccef75a05f38745c5 Binary files /dev/null and b/docs/FAQ/en/QP_test/media/image-20210312132735642.png differ diff --git a/docs/FAQ/en/QP_test/media/image-20210312134000186.png b/docs/FAQ/en/QP_test/media/image-20210312134000186.png new file mode 100644 index 0000000000000000000000000000000000000000..4f5048d5699ba70e60d494609bffea847ba435a9 Binary files /dev/null and b/docs/FAQ/en/QP_test/media/image-20210312134000186.png differ diff --git a/docs/FAQ/en/QP_test/media/image-20210312134025628.png b/docs/FAQ/en/QP_test/media/image-20210312134025628.png new file mode 100644 index 0000000000000000000000000000000000000000..7b700cbbda72524f9ad959c6ead9bc4793dc57d8 Binary files /dev/null and b/docs/FAQ/en/QP_test/media/image-20210312134025628.png differ diff --git a/docs/FAQ/en/QP_test/media/image-20210312135703298.png b/docs/FAQ/en/QP_test/media/image-20210312135703298.png new file mode 100644 index 0000000000000000000000000000000000000000..4a83bc67936d660f08718183998fe308e4d4dcbf Binary files /dev/null and b/docs/FAQ/en/QP_test/media/image-20210312135703298.png differ diff --git a/docs/FAQ/en/QP_test/media/image-20210312135803677.png b/docs/FAQ/en/QP_test/media/image-20210312135803677.png new file mode 100644 index 0000000000000000000000000000000000000000..0f7d4b0b96301b5651f321bfd57d85f2239e454e Binary files /dev/null and b/docs/FAQ/en/QP_test/media/image-20210312135803677.png differ diff --git a/docs/FAQ/en/QP_test/media/image-20210312135817816.png b/docs/FAQ/en/QP_test/media/image-20210312135817816.png new file mode 100644 index 0000000000000000000000000000000000000000..408a19251112775c9b8a4682701b6a4a4079eb0c Binary files /dev/null and b/docs/FAQ/en/QP_test/media/image-20210312135817816.png differ diff --git a/docs/FAQ/en/QP_test/media/main_problem.jpg b/docs/FAQ/en/QP_test/media/main_problem.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bb46f3eadf4b10eda865ebb8aa516125c2908f8d Binary files /dev/null and b/docs/FAQ/en/QP_test/media/main_problem.jpg differ diff --git a/docs/FAQ/en/QuecPython_FAQ/QuecPython_FAQ.md b/docs/FAQ/en/QuecPython_FAQ/QuecPython_FAQ.md new file mode 100644 index 0000000000000000000000000000000000000000..42728b35934f06f4d81291ce248d08013d80fcc9 --- /dev/null +++ b/docs/FAQ/en/QuecPython_FAQ/QuecPython_FAQ.md @@ -0,0 +1,133 @@ + + +## The serial port connected to the board cannot communicate + +Pay attention to whether the interface is 1.8V or 3.3V. Only when the level is matched can the communication be normal. + +## Connect the USB cable and the light is not on + +Check the module voltage, ensure that the 3.8V voltage of the module is stable, and supply power with battery if necessary. + +## apn_ What's in cfg.json + +The built-in APN list cannot be deleted + +## Syntax error dragging file to module + +Please check the syntax of ". Py" file (mostly indentation) + +## Explanation of socket's [0] [- 1] + +```python +>>> import usocket +>>> client = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) +>>> sockaddr = usocket.getaddrinfo('www.tongxinmao.com',80)[0][-1] + +>>> print(sockaddr) +('120.76.100.197', 80) +>>> sockaddr = usocket.getaddrinfo('www.tongxinmao.com',80) +>>> print(sockaddr) +[(2, 1, 0, 'www.tongxinmao.com', ('120.76.100.197', 80))] +``` + +For example: + +```python +a = ((A,B,C),(2),(3)) +a[0] = (A,B,C) +a[0][-1] = C +``` + +## "Failed to execute script PYI" appears when win7 runs qpycom_ rth_ multiprocessing” + +Symptom: after Python is packaged by pyinstaller, it fails to run "failed to execute script PYI" on other computers_ rth_ Multiprocessing ": this problem occurs when running on a lower version of Windows 7. There is no problem porting programs on win10. + +Fault analysis: it is suspected that the version of some DLL files in windows is too low and does not support exe generated by higher version. The simplest method is to type an EXE separately on win7 machine, then run it on win7 and transplant it. + +The recommended method for customers is to upgrade win7 version to Sp1 + +## Net. Nitztime() + +After the network is successfully attached, the base station sends it once (only once) + +## For quecpthon board of ec600sv1.1, precautions for testing TTS function + +The peripheral is connected to the speaker, but the "microphone" is configured in the TTS + +Since a power amplifier is added to v1.1, it is necessary to pull up the pin58 (enable pin of power amplifier) of the socket of the module (hardware) or command to enable "audio"_ EN = Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_ PD, 1)” + +The power of external horn is limited, and it is recommended to be less than 8R 2W + +### If at configuration is required, + +**at+qaudmod=0 //spk** + +**at+qaudmod=1 //hs** + +**at+qaudmod=2 //loudspeaker** + +The following needs to be understood later + +AT+QAUDPATH=0 + +AT+QAUDDCH=0 + +## Calls to multiple. Py files + +For the two files under the usr directory, a.py and b.py, if you want to call b.py in a.py again, you need to add the following code in a.py. + +```python +#Method 1 +from usr import b +#Method 2 +import sys +sys.path.append('/usr/') #Enter the usr directory +import b +``` + +## Is there a limit on the number of threads? + +Up to 16 + +## How to operate the file system + +The root directory / is unreadable and writable, / usr is the user area, / bak is the backup area + +## How many bytes can the serial port accept at a time? + +2000 bytes actually received is OK; The maximum sending is 512, exceeding the automatic subcontracting; Socket and mqtt can send and receive 2000 bytes + +## Will the data listening of socket, mqtt and serial port block other threads + +Socket and mqtt are blocking functions and will not block other threads. + +The serial port itself is a 'non blocking function' and will not block other threads. + +## Explanation of parameters returned by base station location + +```python +>>> cellLocator.getLocation("www.queclocator.com", 80, "1111111122222222", 8, 1) +(117.1138, 31.82279, 550) +``` + +What does the returned result mean + +Positioning accuracy in M + +## Does the depth of the quecpthon queue have a maximum value? For example, if the callback happens all the time, will it be lost? + +Automatic growth with memory + +## Does the pin of the module have a description document of the default level + +We open out that IO is currently the default output low level + +## How about RTC time of ec600s module? Power off endurance + +There is no way to maintain battery life after power failure, because ec600s has no RTC pin + + + + + + diff --git a/docs/FAQ/en/QuecPython_FAQ/media/BreaPi.png b/docs/FAQ/en/QuecPython_FAQ/media/BreaPi.png new file mode 100644 index 0000000000000000000000000000000000000000..ac7067bb17e2b2189e833fd861c44dcd5d484a7d Binary files /dev/null and b/docs/FAQ/en/QuecPython_FAQ/media/BreaPi.png differ diff --git a/docs/FAQ/en/QuecPython_FAQ/media/EC600S_QuecPython_EVB_V1.x.png b/docs/FAQ/en/QuecPython_FAQ/media/EC600S_QuecPython_EVB_V1.x.png new file mode 100644 index 0000000000000000000000000000000000000000..b643d42a418e58e8fc4bd5875cefd925c5201da5 Binary files /dev/null and b/docs/FAQ/en/QuecPython_FAQ/media/EC600S_QuecPython_EVB_V1.x.png differ diff --git a/docs/FAQ/en/QuecPython_FAQ/media/clip_image030.jpg b/docs/FAQ/en/QuecPython_FAQ/media/clip_image030.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a0388365a83427245727e3a8ace96c8dfcb47495 Binary files /dev/null and b/docs/FAQ/en/QuecPython_FAQ/media/clip_image030.jpg differ diff --git a/docs/FAQ/en/QuecPython_FAQ/media/clip_image032.jpg b/docs/FAQ/en/QuecPython_FAQ/media/clip_image032.jpg new file mode 100644 index 0000000000000000000000000000000000000000..df7c78202aa7e7f958a0317669795f4f71de921a Binary files /dev/null and b/docs/FAQ/en/QuecPython_FAQ/media/clip_image032.jpg differ diff --git a/docs/FAQ/en/QuecPython_FAQ/media/clip_image034.jpg b/docs/FAQ/en/QuecPython_FAQ/media/clip_image034.jpg new file mode 100644 index 0000000000000000000000000000000000000000..315ef007b4ecced814894a76e832cddc55a63873 Binary files /dev/null and b/docs/FAQ/en/QuecPython_FAQ/media/clip_image034.jpg differ diff --git a/docs/FAQ/en/QuecPython_FAQ/media/dirver.png b/docs/FAQ/en/QuecPython_FAQ/media/dirver.png new file mode 100644 index 0000000000000000000000000000000000000000..1e9699c614b5fb9e818dc025b9b5531724f514bc Binary files /dev/null and b/docs/FAQ/en/QuecPython_FAQ/media/dirver.png differ diff --git a/docs/FAQ/en/QuecPython_FAQ/media/dirver_c.png b/docs/FAQ/en/QuecPython_FAQ/media/dirver_c.png new file mode 100644 index 0000000000000000000000000000000000000000..e805108c87e2f14b99e185dbf6df5bf23f96e924 Binary files /dev/null and b/docs/FAQ/en/QuecPython_FAQ/media/dirver_c.png differ diff --git a/docs/FAQ/en/QuecPython_FAQ/media/dirver_finish.png b/docs/FAQ/en/QuecPython_FAQ/media/dirver_finish.png new file mode 100644 index 0000000000000000000000000000000000000000..20d8a419b223029db318c7df318e5fafbac743ab Binary files /dev/null and b/docs/FAQ/en/QuecPython_FAQ/media/dirver_finish.png differ diff --git a/docs/FAQ/en/QuecPython_FAQ/media/dirver_installing.png b/docs/FAQ/en/QuecPython_FAQ/media/dirver_installing.png new file mode 100644 index 0000000000000000000000000000000000000000..59de57ac31cb5ea6c41bc998424e497ead8c1b20 Binary files /dev/null and b/docs/FAQ/en/QuecPython_FAQ/media/dirver_installing.png differ diff --git a/docs/FAQ/en/QuecPython_FAQ/media/dirver_python.png b/docs/FAQ/en/QuecPython_FAQ/media/dirver_python.png new file mode 100644 index 0000000000000000000000000000000000000000..44f24275daa1c55b664072c86ea14d54951d6347 Binary files /dev/null and b/docs/FAQ/en/QuecPython_FAQ/media/dirver_python.png differ diff --git a/docs/FAQ/en/QuecPython_FAQ/media/dirver_setup.png b/docs/FAQ/en/QuecPython_FAQ/media/dirver_setup.png new file mode 100644 index 0000000000000000000000000000000000000000..5c64e95704bd913477136297efdd237de67afbe6 Binary files /dev/null and b/docs/FAQ/en/QuecPython_FAQ/media/dirver_setup.png differ diff --git a/docs/FAQ/en/QuecPython_FAQ/media/firmware_ATI.png b/docs/FAQ/en/QuecPython_FAQ/media/firmware_ATI.png new file mode 100644 index 0000000000000000000000000000000000000000..0612afcf35e2cd2b906ac4e7d3f025382826bf54 Binary files /dev/null and b/docs/FAQ/en/QuecPython_FAQ/media/firmware_ATI.png differ diff --git a/docs/FAQ/en/QuecPython_FAQ/media/firmware_ATI02.png b/docs/FAQ/en/QuecPython_FAQ/media/firmware_ATI02.png new file mode 100644 index 0000000000000000000000000000000000000000..803607f436f352e95983c590d944f9da3396ed95 Binary files /dev/null and b/docs/FAQ/en/QuecPython_FAQ/media/firmware_ATI02.png differ diff --git a/docs/FAQ/en/QuecPython_FAQ/media/firmware_choosefirmware.png b/docs/FAQ/en/QuecPython_FAQ/media/firmware_choosefirmware.png new file mode 100644 index 0000000000000000000000000000000000000000..125048b1d08aa1b36fede9e5aa821a3b0e740a62 Binary files /dev/null and b/docs/FAQ/en/QuecPython_FAQ/media/firmware_choosefirmware.png differ diff --git a/docs/FAQ/en/QuecPython_FAQ/media/firmware_downloadfirmware.png b/docs/FAQ/en/QuecPython_FAQ/media/firmware_downloadfirmware.png new file mode 100644 index 0000000000000000000000000000000000000000..989e3d5945ae2f060203c102f6abe2a7f31f5c4d Binary files /dev/null and b/docs/FAQ/en/QuecPython_FAQ/media/firmware_downloadfirmware.png differ diff --git a/docs/FAQ/en/QuecPython_FAQ/media/firmware_downloadsuccess.png b/docs/FAQ/en/QuecPython_FAQ/media/firmware_downloadsuccess.png new file mode 100644 index 0000000000000000000000000000000000000000..b48a17326747550ad734661e158793a262413db1 Binary files /dev/null and b/docs/FAQ/en/QuecPython_FAQ/media/firmware_downloadsuccess.png differ diff --git a/docs/FAQ/en/QuecPython_FAQ/media/firmware_downloadwaiting.png b/docs/FAQ/en/QuecPython_FAQ/media/firmware_downloadwaiting.png new file mode 100644 index 0000000000000000000000000000000000000000..f82b2630fb8dc1f8fda596a5eeb14e7d970889e0 Binary files /dev/null and b/docs/FAQ/en/QuecPython_FAQ/media/firmware_downloadwaiting.png differ diff --git a/docs/FAQ/en/QuecPython_FAQ/media/firmware_notopen.png b/docs/FAQ/en/QuecPython_FAQ/media/firmware_notopen.png new file mode 100644 index 0000000000000000000000000000000000000000..dd6f74336081725d3d9da528b8c74b2ee53a4e05 Binary files /dev/null and b/docs/FAQ/en/QuecPython_FAQ/media/firmware_notopen.png differ diff --git a/docs/FAQ/en/QuecPython_FAQ/media/image-20210312101407043.png b/docs/FAQ/en/QuecPython_FAQ/media/image-20210312101407043.png new file mode 100644 index 0000000000000000000000000000000000000000..07aa3ada32cfd8352b5466c2c4ae595be1e3529e Binary files /dev/null and b/docs/FAQ/en/QuecPython_FAQ/media/image-20210312101407043.png differ diff --git a/docs/FAQ/en/QuecPython_FAQ/media/image-20210312101415590.png b/docs/FAQ/en/QuecPython_FAQ/media/image-20210312101415590.png new file mode 100644 index 0000000000000000000000000000000000000000..61b0c4e5c2104fdcd5fdbfb76ef624b36ad6b8ed Binary files /dev/null and b/docs/FAQ/en/QuecPython_FAQ/media/image-20210312101415590.png differ diff --git a/docs/FAQ/en/QuecPython_FAQ/media/image-20210312101450518.png b/docs/FAQ/en/QuecPython_FAQ/media/image-20210312101450518.png new file mode 100644 index 0000000000000000000000000000000000000000..ba91f136b4e816f62dd08c9216781b22029edf2b Binary files /dev/null and b/docs/FAQ/en/QuecPython_FAQ/media/image-20210312101450518.png differ diff --git a/docs/FAQ/en/QuecPython_FAQ/media/image-20210312101454417.png b/docs/FAQ/en/QuecPython_FAQ/media/image-20210312101454417.png new file mode 100644 index 0000000000000000000000000000000000000000..99b338b49e780adae03ddefd55389f3f13668c41 Binary files /dev/null and b/docs/FAQ/en/QuecPython_FAQ/media/image-20210312101454417.png differ diff --git a/docs/FAQ/en/QuecPython_FAQ/media/image-20210312102005627.png b/docs/FAQ/en/QuecPython_FAQ/media/image-20210312102005627.png new file mode 100644 index 0000000000000000000000000000000000000000..d53a6e5c2a2c1dc8fd9b4106d437a32dd4b12a28 Binary files /dev/null and b/docs/FAQ/en/QuecPython_FAQ/media/image-20210312102005627.png differ diff --git a/docs/FAQ/en/QuecPython_FAQ/media/image-20210312102149061.png b/docs/FAQ/en/QuecPython_FAQ/media/image-20210312102149061.png new file mode 100644 index 0000000000000000000000000000000000000000..61b0c4e5c2104fdcd5fdbfb76ef624b36ad6b8ed Binary files /dev/null and b/docs/FAQ/en/QuecPython_FAQ/media/image-20210312102149061.png differ diff --git a/docs/FAQ/en/QuecPython_FAQ/media/image-20210312102326265.png b/docs/FAQ/en/QuecPython_FAQ/media/image-20210312102326265.png new file mode 100644 index 0000000000000000000000000000000000000000..99b338b49e780adae03ddefd55389f3f13668c41 Binary files /dev/null and b/docs/FAQ/en/QuecPython_FAQ/media/image-20210312102326265.png differ diff --git a/docs/FAQ/en/QuecPython_FAQ/media/image-20210312102439534.png b/docs/FAQ/en/QuecPython_FAQ/media/image-20210312102439534.png new file mode 100644 index 0000000000000000000000000000000000000000..1d1f291345f99b3a2a45c0eb988b83802530a096 Binary files /dev/null and b/docs/FAQ/en/QuecPython_FAQ/media/image-20210312102439534.png differ diff --git a/docs/FAQ/en/QuecPython_FAQ/media/image-20210312102538767.png b/docs/FAQ/en/QuecPython_FAQ/media/image-20210312102538767.png new file mode 100644 index 0000000000000000000000000000000000000000..d53a6e5c2a2c1dc8fd9b4106d437a32dd4b12a28 Binary files /dev/null and b/docs/FAQ/en/QuecPython_FAQ/media/image-20210312102538767.png differ diff --git a/docs/FAQ/en/QuecPython_FAQ/media/image-20210312132446192.png b/docs/FAQ/en/QuecPython_FAQ/media/image-20210312132446192.png new file mode 100644 index 0000000000000000000000000000000000000000..df0ccc00f3b37e23daf51c0258f9288973efcba1 Binary files /dev/null and b/docs/FAQ/en/QuecPython_FAQ/media/image-20210312132446192.png differ diff --git a/docs/FAQ/en/QuecPython_FAQ/media/image-20210312132458172.png b/docs/FAQ/en/QuecPython_FAQ/media/image-20210312132458172.png new file mode 100644 index 0000000000000000000000000000000000000000..6e666713160348d38305ca0b5299d60f23f69c2a Binary files /dev/null and b/docs/FAQ/en/QuecPython_FAQ/media/image-20210312132458172.png differ diff --git a/docs/FAQ/en/QuecPython_FAQ/media/image-20210312132735642.png b/docs/FAQ/en/QuecPython_FAQ/media/image-20210312132735642.png new file mode 100644 index 0000000000000000000000000000000000000000..6e2a63139ea716f3a8f3b59ccef75a05f38745c5 Binary files /dev/null and b/docs/FAQ/en/QuecPython_FAQ/media/image-20210312132735642.png differ diff --git a/docs/FAQ/en/README.md b/docs/FAQ/en/README.md new file mode 100644 index 0000000000000000000000000000000000000000..c6065462663ba71b43c268350b6c9c21c2b87447 --- /dev/null +++ b/docs/FAQ/en/README.md @@ -0,0 +1,352 @@ +## Foreword + +This article mainly introduces how to participate in the contribution of ** quecpthon document website system ** and ** qecpthon document writing specification **. +-Using git to pull the warehouse +-Modify local MD document +-Deploy preview locally +-Submit the modification to the main warehouse and wait for consolidation. + + +### ** recommended information** + +- [Git - Book (git-scm.com)](https://git-scm.com/book/zh/v2) +- [Learn Git Branching](https://learngitbranching.js.org/?locale=zh_CN) +-[git submission flowchart\_ 50. Super blog - CSDN blog](https://blog.csdn.net/weixin_45765795/article/details/110730753) + +### What needs to be installed + +- git [git-for-windows Mirror(taobao.org)](http://npm.taobao.org/mirrors/git-for-windows/) +- sourcetree [Sourcetree \| Free Git GUI for Mac and Windows(sourcetreeapp.com)](https://www.sourcetreeapp.com/) +-Python 3 and the need to add Python 3 to the path. For details, please refer to [how to add Python to the path in Windows 10](https://www.py.cn/faq/python/18228.html) + +For the sourcetree installation tutorial, please refer to [sourcetree installation and uninstall - Love Code Network (likecs. Com)](http://www.likecs.com/show-118323.html) + +### Video recording screen + +1. ** first, please download the video to see some basic usage** + +Link: https://pan.baidu.com/s/1-TIYEdloBS1uWs1AZpT8TQ + +Extraction code: 219x + +The GIT command used in this communication. + +```bash +git clone + +git commit + +git rebase +``` + +## Git submission process + +### !!! matters needing attention: + +Try to create a new branch for local modification. You can choose any name. + +Do not use the three branches of development release main. + +#### Gitee account registration and fork code. + +First, please refer to the registered gitee account + +Warehouse address to be operated. +[QuecPython/Community-document(gitee.com)](https://gitee.com/quecpython/Community-document) +![](media/2402ce33f46407a306dbbc808a61c9dc.png) + +#### Clone code + +Your own warehouse code, do not need to copy the following URL, copy the path of your own warehouse. + +![](media/07e84b72f40480b3d47215bba25b991d.png) + +![](media/348a8cd3a03f723bbebd7c75d7318a77.png) + +Remember: the path needs to be modified to become your own URL path. + +![](media/a0bf255b7e26a6da128a9a6bfef9a98f.png) + +#### Use the command line to add user names and accounts + +Reference< https://blog.csdn.net/autoliuweijie/article/details/52230165 >Article. + +First, open the command line to see if you have set the user name. + +![](media/346efc8943131e0cb6fb676aa2ae78f7.png) + +If there is no name, use the following command to configure the name and mail. + +```bash +Git config -- global user.name "your name (please use English)" + +Git config -- global user.email "email account" +``` + +If the following error message appears + +could not lock config file z://config: Permission denied + +Please confirm whether you have selected the correct git path during the installation of souretree. + +![Souretree 安装过程中指定的GIT路径错误的问题](media/Qp_Faq_join_us_051.png) + +#### Adding a local warehouse using souretree + +![](media/ac16302f7af83590b20ddbfc851f5489.png) + +That's it. + +#### Use souretree to add an upstream warehouse. + +![](media/816606baf28959a11f18c6e24458e9e6.png) + +Open souretree status and have a look. You can find the status of origin and upstream remote warehouses. + +![](media/a5d1460f83ea10904febaaf1b6fa83eb.png) + +## Local compilation preview site + +After we pull the remote warehouse, we can test the local compilation to generate web page preview. + +![](media/7c729ff347d8b0b71ef1e4ddc1fb3ab6.png) + +Use ** PowerShell ** to enter the corresponding path ** e: \ \ work \ \ temp \ \ community document **. + +```bash +PS E:\\work\\temp\\Community-document\> git status + +On branch develop + +Your branch is ahead of 'origin/develop' by 1 commit. + +(use "git push" to publish your local commits) + +nothing to commit, working tree clean +``` + +Use PIP3 to install teedoc. If PIP3 is not installed, please refer to [win10] +Installing Python 3 and PIP3 on a 64 bit system_ Working. +Playing. - CSDN blog](https://blog.csdn.net/menc15/article/details/65631380) +```bash +# Installing teedoc + +PS E:\\work\\temp\\Community-document\> pip3 install teedoc + +# Installing the teedoc plug-in + +PS E:\\work\\temp\\Community-document\> teedoc install + +# Compile MD and convert MD into HTML + +**Compile** + +# Compile MD and convert MD into HTML + +PS E:\\work\\temp\\Community-document\> teedoc build +``` +If the following error occurs, + +![](media/d28b6c5e33fffd309bde68093f212313.png) + +Please continue to execute ** teedoc build. This is a teedoc bug. Until the following message appears** + +**![](media/119d57a4919443d8f3a9e0a5bb5ac64a.png)** + +After compiling, we can deploy the website locally. +```bash +PS E:\\work\\temp\\Community-document\> teedoc serve + +2021-03-18 17:37:34 - [INFO] - [Thread-50]: root dir: +E:/work/temp/Community-document/out + +2021-03-18 17:37:34 - [INFO] - [Thread-50]: Starting server at 0.0.0.0:2333 .... +``` + +After the above information appears, you can access it< http://127.0.0.1:2333/doc/doc >, +View the corresponding article. + +http://127.0.0.1:2333/doc/doc + +### Add document + +#### Create a new MD file and add content + +Let's demonstrate how to add an article under the FAQ folder. + +##### !!( (important) synchronization code + +It is recommended to synchronize the code once before each modification of the document. + +![](media/d33aa45f8dc99af2409bddef280519fc.png) + +Then create a new local branch + +![](media/9069cf02cdb7489443c5c9719012399f.png) + +New loacl_ write_ Doc branch + +![](media/6c6cb269476d4a0b82b0039a59520ae4.png) + +![](media/232112373152af2c0ecdba8f867ad965.png) + +>Suppose we need to create a new article under the docs / zh folder + +>Then create a new MD file named others.md + +> ![](media/b2aeef716dd0341ef9af3ab630117d21.png) + +Then we can use typora - a markdown editor, markdown reader +The software opens to modify and edit the document. You can also use vscode. You can also use other markdwon +Editing tools, + +##### Modify sidebar directory sidebar.yaml file + +![](media/ec285c9fb0731355ce3b2f99aed57e20.png) + +Then modify the sidebar.yaml file and add the following two sentences +```bash +- label: other questions +file: others/others.md +``` +![](media/03bd99c2741d455894dde05a7efa76df.png) + +After the above modifications are completed, you can refer to the local compilation preview website to preview the effect locally. + +![](media/2e3623754f881f6509c9bfe83add627d.png) + +## Modify and submit local content + +#### Use sourcetree to modify locally and temporarily modify locally + +###### Staging area, unmodified file area + +![](media/28b4959b7c0fcebcc5473a1a92a7f55f.png) + +###### Submit a commit and store the file in the cache + +![](media/549111123c867b49d5866a1888a87139.png) + +###### Push to your own warehouse + +![](media/20d86071c46c8ac071d40b69c5391538.png) + +###### When gitee is pushed to the main warehouse, pull requst is used to submit to the main warehouse. + +![](media/36649f7f072179c5f66469faa8cb5c90.png) + +![](media/915236af05ccce877ff89c16bc8c6d9e.png) + +###### Fill in the details and notify the main warehouse to merge. + +![](media/d6b7b0ca15c429c0deec153a1b8a7f51.png) + +###### After the primary warehouse is merged, synchronize the primary warehouse + +![](media/32ad741bdff696c303ddee76eeb88677.png) + +#### When the local modification is not submitted, pull the latest branch. Then commit the local branch + +![](media/3cd17618606dfc34f8b1a2f5966c7e91.png) + +![](media/2737bff4059f30ffbdbddb60c37980a6.png) + +![](media/e20c84d0e318efc0e1bb90c1ec2eb44b.png) + +![](media/3ecb9425d13ffaf2eca140785cb1a2c9.png) + +![](media/748690654f71e0217ec7f8ac9b9f373f.png) + +![](media/2c7b59fe3c8411f610b1c2da72e60416.png) + +### Resolve cloud submission conflicts + +When the submitted PR displayed in the cloud conflicts, it can be handled through ** web ide **. +![显示云端冲突的解决方法](media/Qp_Faq_join_us_052.png) + +Please refer to for more details +[gitee online code conflict resolution function is online, and conflicts can be easily resolved without manual modification](https://blog.gitee.com/2020/06/17/code-conflict/) +## Document modification + +### Format problem + +##### Picture name format + +```bash +![温湿度传感器](media/Qp_Advanced_development_QuecPythonSub_i2c_bus_02.png) +``` + +##### Use - to represent a list. + +```bash +- A +- B +- C +``` + +Do not use + +```bash +1.A +2.B +3.C +``` + +![](media/85156b64ef3e6223d65775b6ba68979e.png) + +### Keywords that cannot be used +Keywords that cannot be used +![请不到使用关键词](media/Qp_Faq_join_us_050.png) + + + +### How to reference relative paths +####   Compiled path +**README.md**   The file is special and will be compiled into   index.html +other   For MD files, the file name is reserved and only the suffix is modified. +such as  ** Applicable_ Scenarios.md**   Will be compiled into  ** Applicable_ Scenarios.html**。 +```python +$ find . -name Applicable_Scenarios.*  +#  html   Is a compiled file +./out/doc/doc/Quecpython_intro/zh/Qp_Product_intro/Applicable_Scenarios.html +#  md   Is the source file +./docs/Quecpython_intro/zh/Qp_Product_intro/Applicable_Scenarios.md +``` + +If you want to reference a document in the same directory in this document. For example, you want to refer to "quecpthon test questions" under the document "participation and contribution": + +image-20210413133312774 + +1. First select "hyperlink" in "format" in MD editing tool. + + + +image-20210413140651563 + + + +2. After the hyperlink is selected, the display name and relative connection of the hyperlink to be edited are displayed. The specific location is shown in the figure below + +![image-20210414100547601](media/image-20210414100547601.png) + +(1) For the "quec Python test" referenced by the box, you need to fill in the "quec Python test name" on the left + +(2) For the relative hyperlink address, you need to ensure that you find the common address of the articles you write and the cited articles + +-For example, the address of this article is:. \ community document \ documents \ FAQ \ zh \ readme.md +-The address of the article to be referenced is:. \ community document \ documents \ FAQ \ zh \ QP_ test\QP_ test.md + +The description of common address is shown in the figure below: + +![image-20210414101442749](media/image-20210414101442749.png) + +Then the referenced relative hyperlink address needs to ensure that the reference address contains at least one layer of relative address, that is, at least "the penultimate layer of the common address" + +To sum up, the relative hyperlinks actually written are: + +![image-20210414101825132](media/image-20210414101825132.png) + +3. Since the teedoc build command compiles the MD file into an HTML file, if you need to hyperlink a document, it is actually the HTML file compiled from the MD file, that is, write the hyperlink as follows: + +![image-20210414102003409](media/image-20210414102003409.png) + diff --git a/docs/FAQ/en/config.json b/docs/FAQ/en/config.json new file mode 100644 index 0000000000000000000000000000000000000000..5bf747e8ef2824027ab5cc38009254f8fdcf284a --- /dev/null +++ b/docs/FAQ/en/config.json @@ -0,0 +1,24 @@ +{ + "import": "config_en", + "navbar": { + "items": [ + { + "id": "language", + "label": "Language: ", + "position": "right", + "items": [ + { + "id": "zh", + "url": "/doc/FQA/zh/", + "label": "中文" + }, + { + "id": "en", + "url": "/doc/FQA/en/", + "label": "English" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/docs/FAQ/en/gitee_issue/gitee_issue.md b/docs/FAQ/en/gitee_issue/gitee_issue.md new file mode 100644 index 0000000000000000000000000000000000000000..e5128e66c63d7a007dae0880eaed0fa48e0b091d --- /dev/null +++ b/docs/FAQ/en/gitee_issue/gitee_issue.md @@ -0,0 +1,62 @@ +## Document history + + +|** version ** date ** author ** change statement **| +| -------- | ---------- | -------- | ---------------------------------- | +|1.0 | April 13, 2021 | Zhou Chengzhu | initial version| + + +## Gitee issue document system management +This article mainly shares the tips for using gitee issue. And the problem of system error in submitting documents. + +![gitee issue 管理系统](media/Qp_gitee_issue_01.png) + +## New issue + +### Issue classification + -Website format requirements + - Duplicate document + - Document content error + -Document code replication error + -Document picture error + + +If it is a document you want to modify, please remember to add ** network path ** of the following documents to reduce the cost of finding documents by others. + +### Add reminder +Enter @, add reminder in the comment. +![gitee issue 添加提醒人](media/Qp_gitee_issue_02.png) +### Add responsible person +slightly +### Add issue category +slightly +### Add priority +slightly + +## Close issue +### Manual shutdown +Use Kanban, close +1. Choose your own responsibility +![gitee issue 看板](media/Qp_gitee_issue_03.png) +Slide the corresponding tab left and right to close it + +### Submit PR and close association +one First, determine the issue number to be closed. For example, I need to close ** #i3iaco ** issue here +![gitee issue 详细信息](media/Qp_gitee_issue_04.png) + +two Add the issue number to be closed in the PR comment +When submitting PR, enter ** # ** and issues will pop up automatically. Select. +Of course, you can also enter the issue number manually. +![gitee 提交pr、关联issue](media/Qp_gitee_issue_05.png) + +## Issue - task assignment +It is divided into pre and post. +one If the specific owner of the task cannot be determined in the early stage, it is uniformly assigned to the administrator account quecpthon. Then, the administrator assigns the corresponding person in charge to complete the task. +two In the early practice iteration process, improve the general document responsibility division. Form each article and have a corresponding person in charge. Specific responsibilities and intra group communication. + +## Familiar with mailstone process specification +### What is mailstone? +Milestone, reach the current node. It means we need to complete those tasks. + +### How to manage milestones +We designed small milestones. Try to complete all tasks at each time node. diff --git a/docs/FAQ/en/gitee_issue/media/Qp_gitee_issue_01.png b/docs/FAQ/en/gitee_issue/media/Qp_gitee_issue_01.png new file mode 100644 index 0000000000000000000000000000000000000000..65420d1c0d2c6a163d71d6bfebeeb9082a4147f1 Binary files /dev/null and b/docs/FAQ/en/gitee_issue/media/Qp_gitee_issue_01.png differ diff --git a/docs/FAQ/en/gitee_issue/media/Qp_gitee_issue_02.png b/docs/FAQ/en/gitee_issue/media/Qp_gitee_issue_02.png new file mode 100644 index 0000000000000000000000000000000000000000..a99a8e216d1a0109015541a451b729b75bc7d041 Binary files /dev/null and b/docs/FAQ/en/gitee_issue/media/Qp_gitee_issue_02.png differ diff --git a/docs/FAQ/en/gitee_issue/media/Qp_gitee_issue_03.png b/docs/FAQ/en/gitee_issue/media/Qp_gitee_issue_03.png new file mode 100644 index 0000000000000000000000000000000000000000..0d7bbbd51fb2a6cd30e0263e8947b98bf14c8faa Binary files /dev/null and b/docs/FAQ/en/gitee_issue/media/Qp_gitee_issue_03.png differ diff --git a/docs/FAQ/en/gitee_issue/media/Qp_gitee_issue_04.png b/docs/FAQ/en/gitee_issue/media/Qp_gitee_issue_04.png new file mode 100644 index 0000000000000000000000000000000000000000..f27f4b22fe57cca37ac46baf61b6a5929b5fa37b Binary files /dev/null and b/docs/FAQ/en/gitee_issue/media/Qp_gitee_issue_04.png differ diff --git a/docs/FAQ/en/gitee_issue/media/Qp_gitee_issue_05.png b/docs/FAQ/en/gitee_issue/media/Qp_gitee_issue_05.png new file mode 100644 index 0000000000000000000000000000000000000000..71ae69208fa42de67af694e99876d7ba699e5df0 Binary files /dev/null and b/docs/FAQ/en/gitee_issue/media/Qp_gitee_issue_05.png differ diff --git a/docs/FAQ/en/media/03bd99c2741d455894dde05a7efa76df.png b/docs/FAQ/en/media/03bd99c2741d455894dde05a7efa76df.png new file mode 100644 index 0000000000000000000000000000000000000000..62b10c4749690ab9e3a7f2d3fe52b8bc092cc91b Binary files /dev/null and b/docs/FAQ/en/media/03bd99c2741d455894dde05a7efa76df.png differ diff --git a/docs/FAQ/en/media/07e84b72f40480b3d47215bba25b991d.png b/docs/FAQ/en/media/07e84b72f40480b3d47215bba25b991d.png new file mode 100644 index 0000000000000000000000000000000000000000..51d589c497636fe346263e5c073041d609ddca05 Binary files /dev/null and b/docs/FAQ/en/media/07e84b72f40480b3d47215bba25b991d.png differ diff --git a/docs/FAQ/en/media/119d57a4919443d8f3a9e0a5bb5ac64a.png b/docs/FAQ/en/media/119d57a4919443d8f3a9e0a5bb5ac64a.png new file mode 100644 index 0000000000000000000000000000000000000000..5e3b4d81e36cfcfda33c52d0559d688be134532c Binary files /dev/null and b/docs/FAQ/en/media/119d57a4919443d8f3a9e0a5bb5ac64a.png differ diff --git a/docs/FAQ/en/media/20d86071c46c8ac071d40b69c5391538.png b/docs/FAQ/en/media/20d86071c46c8ac071d40b69c5391538.png new file mode 100644 index 0000000000000000000000000000000000000000..a7421df26a5b96d6b6dbde53ae987b7c58113c8a Binary files /dev/null and b/docs/FAQ/en/media/20d86071c46c8ac071d40b69c5391538.png differ diff --git a/docs/FAQ/en/media/232112373152af2c0ecdba8f867ad965.png b/docs/FAQ/en/media/232112373152af2c0ecdba8f867ad965.png new file mode 100644 index 0000000000000000000000000000000000000000..6665c746fe6d4802f934e5db973b6b8dd1de27f6 Binary files /dev/null and b/docs/FAQ/en/media/232112373152af2c0ecdba8f867ad965.png differ diff --git a/docs/FAQ/en/media/2402ce33f46407a306dbbc808a61c9dc.png b/docs/FAQ/en/media/2402ce33f46407a306dbbc808a61c9dc.png new file mode 100644 index 0000000000000000000000000000000000000000..0afe65daec2bf9fe064f93aff24a6fbe299b0cf3 Binary files /dev/null and b/docs/FAQ/en/media/2402ce33f46407a306dbbc808a61c9dc.png differ diff --git a/docs/FAQ/en/media/2737bff4059f30ffbdbddb60c37980a6.png b/docs/FAQ/en/media/2737bff4059f30ffbdbddb60c37980a6.png new file mode 100644 index 0000000000000000000000000000000000000000..c3c43df72bcead7bc09cde2cf1a22d3daa75e7dc Binary files /dev/null and b/docs/FAQ/en/media/2737bff4059f30ffbdbddb60c37980a6.png differ diff --git a/docs/FAQ/en/media/28b4959b7c0fcebcc5473a1a92a7f55f.png b/docs/FAQ/en/media/28b4959b7c0fcebcc5473a1a92a7f55f.png new file mode 100644 index 0000000000000000000000000000000000000000..c74c62f499e76b0650e22ebfc55ff5f64b372d7a Binary files /dev/null and b/docs/FAQ/en/media/28b4959b7c0fcebcc5473a1a92a7f55f.png differ diff --git a/docs/FAQ/en/media/2c7b59fe3c8411f610b1c2da72e60416.png b/docs/FAQ/en/media/2c7b59fe3c8411f610b1c2da72e60416.png new file mode 100644 index 0000000000000000000000000000000000000000..42569bfeea2b36f831bb07d648c177e5ae1a1263 Binary files /dev/null and b/docs/FAQ/en/media/2c7b59fe3c8411f610b1c2da72e60416.png differ diff --git a/docs/FAQ/en/media/2e3623754f881f6509c9bfe83add627d.png b/docs/FAQ/en/media/2e3623754f881f6509c9bfe83add627d.png new file mode 100644 index 0000000000000000000000000000000000000000..3969641c807d3a0f6d9ec5da9bf9150406f01ae3 Binary files /dev/null and b/docs/FAQ/en/media/2e3623754f881f6509c9bfe83add627d.png differ diff --git a/docs/FAQ/en/media/32ad741bdff696c303ddee76eeb88677.png b/docs/FAQ/en/media/32ad741bdff696c303ddee76eeb88677.png new file mode 100644 index 0000000000000000000000000000000000000000..5854529fbead2618a23da5158fcb976a12f4ef8a Binary files /dev/null and b/docs/FAQ/en/media/32ad741bdff696c303ddee76eeb88677.png differ diff --git a/docs/FAQ/en/media/346efc8943131e0cb6fb676aa2ae78f7.png b/docs/FAQ/en/media/346efc8943131e0cb6fb676aa2ae78f7.png new file mode 100644 index 0000000000000000000000000000000000000000..83465f37b318e6c5ae3c1304ef30a15340bf3581 Binary files /dev/null and b/docs/FAQ/en/media/346efc8943131e0cb6fb676aa2ae78f7.png differ diff --git a/docs/FAQ/en/media/348a8cd3a03f723bbebd7c75d7318a77.png b/docs/FAQ/en/media/348a8cd3a03f723bbebd7c75d7318a77.png new file mode 100644 index 0000000000000000000000000000000000000000..b89593a88074a4b9b6e5e613baf4f6caf5361676 Binary files /dev/null and b/docs/FAQ/en/media/348a8cd3a03f723bbebd7c75d7318a77.png differ diff --git a/docs/FAQ/en/media/36649f7f072179c5f66469faa8cb5c90.png b/docs/FAQ/en/media/36649f7f072179c5f66469faa8cb5c90.png new file mode 100644 index 0000000000000000000000000000000000000000..7195395d44d9a27927e1d607aabfccaf2d788440 Binary files /dev/null and b/docs/FAQ/en/media/36649f7f072179c5f66469faa8cb5c90.png differ diff --git a/docs/FAQ/en/media/3cd17618606dfc34f8b1a2f5966c7e91.png b/docs/FAQ/en/media/3cd17618606dfc34f8b1a2f5966c7e91.png new file mode 100644 index 0000000000000000000000000000000000000000..a4157ade56143e7ac866a080de95873de2db36db Binary files /dev/null and b/docs/FAQ/en/media/3cd17618606dfc34f8b1a2f5966c7e91.png differ diff --git a/docs/FAQ/en/media/3ecb9425d13ffaf2eca140785cb1a2c9.png b/docs/FAQ/en/media/3ecb9425d13ffaf2eca140785cb1a2c9.png new file mode 100644 index 0000000000000000000000000000000000000000..08e1e8f9105d480cf5eb9e525aa6b86861d3bfbe Binary files /dev/null and b/docs/FAQ/en/media/3ecb9425d13ffaf2eca140785cb1a2c9.png differ diff --git a/docs/FAQ/en/media/549111123c867b49d5866a1888a87139.png b/docs/FAQ/en/media/549111123c867b49d5866a1888a87139.png new file mode 100644 index 0000000000000000000000000000000000000000..6b3779271711555a7f04c98e0d1a92650bb4f7e8 Binary files /dev/null and b/docs/FAQ/en/media/549111123c867b49d5866a1888a87139.png differ diff --git a/docs/FAQ/en/media/6c6cb269476d4a0b82b0039a59520ae4.png b/docs/FAQ/en/media/6c6cb269476d4a0b82b0039a59520ae4.png new file mode 100644 index 0000000000000000000000000000000000000000..598fb955ac1ed766bb71577411446da09ab598e8 Binary files /dev/null and b/docs/FAQ/en/media/6c6cb269476d4a0b82b0039a59520ae4.png differ diff --git a/docs/FAQ/en/media/748690654f71e0217ec7f8ac9b9f373f.png b/docs/FAQ/en/media/748690654f71e0217ec7f8ac9b9f373f.png new file mode 100644 index 0000000000000000000000000000000000000000..0918f245f79073bc56f413680e5113af53fe53dc Binary files /dev/null and b/docs/FAQ/en/media/748690654f71e0217ec7f8ac9b9f373f.png differ diff --git a/docs/FAQ/en/media/7c729ff347d8b0b71ef1e4ddc1fb3ab6.png b/docs/FAQ/en/media/7c729ff347d8b0b71ef1e4ddc1fb3ab6.png new file mode 100644 index 0000000000000000000000000000000000000000..99f7658eb27472e32280936b2bf4ca8df5b42103 Binary files /dev/null and b/docs/FAQ/en/media/7c729ff347d8b0b71ef1e4ddc1fb3ab6.png differ diff --git a/docs/FAQ/en/media/816606baf28959a11f18c6e24458e9e6.png b/docs/FAQ/en/media/816606baf28959a11f18c6e24458e9e6.png new file mode 100644 index 0000000000000000000000000000000000000000..7461a9a75a1411a3dc69eba97cc9ceec6d35b2cb Binary files /dev/null and b/docs/FAQ/en/media/816606baf28959a11f18c6e24458e9e6.png differ diff --git a/docs/FAQ/en/media/85156b64ef3e6223d65775b6ba68979e.png b/docs/FAQ/en/media/85156b64ef3e6223d65775b6ba68979e.png new file mode 100644 index 0000000000000000000000000000000000000000..ce35dc4618a7b8169e0fe28911b8a52ba26ff36d Binary files /dev/null and b/docs/FAQ/en/media/85156b64ef3e6223d65775b6ba68979e.png differ diff --git a/docs/FAQ/en/media/9069cf02cdb7489443c5c9719012399f.png b/docs/FAQ/en/media/9069cf02cdb7489443c5c9719012399f.png new file mode 100644 index 0000000000000000000000000000000000000000..a61ff733b788742a1a4aeccfc2b7a4bd60dbf357 Binary files /dev/null and b/docs/FAQ/en/media/9069cf02cdb7489443c5c9719012399f.png differ diff --git a/docs/FAQ/en/media/915236af05ccce877ff89c16bc8c6d9e.png b/docs/FAQ/en/media/915236af05ccce877ff89c16bc8c6d9e.png new file mode 100644 index 0000000000000000000000000000000000000000..d6cc5e1339852c719e344d02d26cc7b9e6ccc98d Binary files /dev/null and b/docs/FAQ/en/media/915236af05ccce877ff89c16bc8c6d9e.png differ diff --git a/docs/FAQ/en/media/Qp_Faq_join_us_050.png b/docs/FAQ/en/media/Qp_Faq_join_us_050.png new file mode 100644 index 0000000000000000000000000000000000000000..4f71b2b1695561d7ea8e1cbd9e22feaa76eda20c Binary files /dev/null and b/docs/FAQ/en/media/Qp_Faq_join_us_050.png differ diff --git a/docs/FAQ/en/media/Qp_Faq_join_us_051.png b/docs/FAQ/en/media/Qp_Faq_join_us_051.png new file mode 100644 index 0000000000000000000000000000000000000000..0ae6d928f7082edd4d1a5b6056f144e2362bcaab Binary files /dev/null and b/docs/FAQ/en/media/Qp_Faq_join_us_051.png differ diff --git a/docs/FAQ/en/media/Qp_Faq_join_us_052.png b/docs/FAQ/en/media/Qp_Faq_join_us_052.png new file mode 100644 index 0000000000000000000000000000000000000000..18c0f2f2a32ebdd5bc09b529df512e42a1d55112 Binary files /dev/null and b/docs/FAQ/en/media/Qp_Faq_join_us_052.png differ diff --git a/docs/FAQ/en/media/Qp_Faq_join_us_053.png b/docs/FAQ/en/media/Qp_Faq_join_us_053.png new file mode 100644 index 0000000000000000000000000000000000000000..4a4119a49b197cd150df94697bd73dc2912ca413 Binary files /dev/null and b/docs/FAQ/en/media/Qp_Faq_join_us_053.png differ diff --git a/docs/FAQ/en/media/Qp_Faq_join_us_054.png b/docs/FAQ/en/media/Qp_Faq_join_us_054.png new file mode 100644 index 0000000000000000000000000000000000000000..52671136e3502da3c816c947317688cabffaf10d Binary files /dev/null and b/docs/FAQ/en/media/Qp_Faq_join_us_054.png differ diff --git a/docs/FAQ/en/media/a0bf255b7e26a6da128a9a6bfef9a98f.png b/docs/FAQ/en/media/a0bf255b7e26a6da128a9a6bfef9a98f.png new file mode 100644 index 0000000000000000000000000000000000000000..c3838e42c6db983577e7f9fae3fa80afaea063a3 Binary files /dev/null and b/docs/FAQ/en/media/a0bf255b7e26a6da128a9a6bfef9a98f.png differ diff --git a/docs/FAQ/en/media/a5d1460f83ea10904febaaf1b6fa83eb.png b/docs/FAQ/en/media/a5d1460f83ea10904febaaf1b6fa83eb.png new file mode 100644 index 0000000000000000000000000000000000000000..4ff76ed9a119ab043f4d2653d6b8ae45c78af484 Binary files /dev/null and b/docs/FAQ/en/media/a5d1460f83ea10904febaaf1b6fa83eb.png differ diff --git a/docs/FAQ/en/media/ac16302f7af83590b20ddbfc851f5489.png b/docs/FAQ/en/media/ac16302f7af83590b20ddbfc851f5489.png new file mode 100644 index 0000000000000000000000000000000000000000..7529a7b3f0f39f7a3042bb746a4e95443d051349 Binary files /dev/null and b/docs/FAQ/en/media/ac16302f7af83590b20ddbfc851f5489.png differ diff --git a/docs/FAQ/en/media/b2aeef716dd0341ef9af3ab630117d21.png b/docs/FAQ/en/media/b2aeef716dd0341ef9af3ab630117d21.png new file mode 100644 index 0000000000000000000000000000000000000000..c2636a30990c81485d3ea941723dbc15ca057edb Binary files /dev/null and b/docs/FAQ/en/media/b2aeef716dd0341ef9af3ab630117d21.png differ diff --git a/docs/FAQ/en/media/d28b6c5e33fffd309bde68093f212313.png b/docs/FAQ/en/media/d28b6c5e33fffd309bde68093f212313.png new file mode 100644 index 0000000000000000000000000000000000000000..b47cf5f60567a24ee4eaf92c03232576f50a0938 Binary files /dev/null and b/docs/FAQ/en/media/d28b6c5e33fffd309bde68093f212313.png differ diff --git a/docs/FAQ/en/media/d33aa45f8dc99af2409bddef280519fc.png b/docs/FAQ/en/media/d33aa45f8dc99af2409bddef280519fc.png new file mode 100644 index 0000000000000000000000000000000000000000..6c24752858e338a4aef69c6bfdff7c7cfd80708d Binary files /dev/null and b/docs/FAQ/en/media/d33aa45f8dc99af2409bddef280519fc.png differ diff --git a/docs/FAQ/en/media/d6b7b0ca15c429c0deec153a1b8a7f51.png b/docs/FAQ/en/media/d6b7b0ca15c429c0deec153a1b8a7f51.png new file mode 100644 index 0000000000000000000000000000000000000000..957cd27e444aab9632ada7f0d74e27d9ee8b0eea Binary files /dev/null and b/docs/FAQ/en/media/d6b7b0ca15c429c0deec153a1b8a7f51.png differ diff --git a/docs/FAQ/en/media/e20c84d0e318efc0e1bb90c1ec2eb44b.png b/docs/FAQ/en/media/e20c84d0e318efc0e1bb90c1ec2eb44b.png new file mode 100644 index 0000000000000000000000000000000000000000..afe7ec4d878dc7f595fddb18aac8daf19df6fbf7 Binary files /dev/null and b/docs/FAQ/en/media/e20c84d0e318efc0e1bb90c1ec2eb44b.png differ diff --git a/docs/FAQ/en/media/ec285c9fb0731355ce3b2f99aed57e20.png b/docs/FAQ/en/media/ec285c9fb0731355ce3b2f99aed57e20.png new file mode 100644 index 0000000000000000000000000000000000000000..09469d7d1a0ac0723185dc7f6851785eaf73f89a Binary files /dev/null and b/docs/FAQ/en/media/ec285c9fb0731355ce3b2f99aed57e20.png differ diff --git a/docs/FAQ/en/media/image-20210413140504427.png b/docs/FAQ/en/media/image-20210413140504427.png new file mode 100644 index 0000000000000000000000000000000000000000..aacdde2cf3177fba839098854e1126777262e000 Binary files /dev/null and b/docs/FAQ/en/media/image-20210413140504427.png differ diff --git a/docs/FAQ/en/media/image-20210414100029064.png b/docs/FAQ/en/media/image-20210414100029064.png new file mode 100644 index 0000000000000000000000000000000000000000..b9e9b7a0aec91a6068c0c5ac346344755e87b6fc Binary files /dev/null and b/docs/FAQ/en/media/image-20210414100029064.png differ diff --git a/docs/FAQ/en/media/image-20210414100547601.png b/docs/FAQ/en/media/image-20210414100547601.png new file mode 100644 index 0000000000000000000000000000000000000000..eae3f0a1f76c13fcb2568e77b4aa2585009e8bcb Binary files /dev/null and b/docs/FAQ/en/media/image-20210414100547601.png differ diff --git a/docs/FAQ/en/media/image-20210414101442749.png b/docs/FAQ/en/media/image-20210414101442749.png new file mode 100644 index 0000000000000000000000000000000000000000..202275e662a07c5649d82b0d8363345898a03b7f Binary files /dev/null and b/docs/FAQ/en/media/image-20210414101442749.png differ diff --git a/docs/FAQ/en/media/image-20210414101510601.png b/docs/FAQ/en/media/image-20210414101510601.png new file mode 100644 index 0000000000000000000000000000000000000000..202275e662a07c5649d82b0d8363345898a03b7f Binary files /dev/null and b/docs/FAQ/en/media/image-20210414101510601.png differ diff --git a/docs/FAQ/en/media/image-20210414101825132.png b/docs/FAQ/en/media/image-20210414101825132.png new file mode 100644 index 0000000000000000000000000000000000000000..d6f2afd482adf963894d33621471410afc5d4d10 Binary files /dev/null and b/docs/FAQ/en/media/image-20210414101825132.png differ diff --git a/docs/FAQ/en/media/image-20210414102003409.png b/docs/FAQ/en/media/image-20210414102003409.png new file mode 100644 index 0000000000000000000000000000000000000000..5750094c3d62a6e0cdfbba4c46576ef0640e1344 Binary files /dev/null and b/docs/FAQ/en/media/image-20210414102003409.png differ diff --git a/docs/FAQ/en/media/image-20210417094546127.png b/docs/FAQ/en/media/image-20210417094546127.png new file mode 100644 index 0000000000000000000000000000000000000000..bab15af5508fce5acf2f9d8b639a3ba83d7fed2f Binary files /dev/null and b/docs/FAQ/en/media/image-20210417094546127.png differ diff --git a/docs/FAQ/en/others/media/BreaPi.png b/docs/FAQ/en/others/media/BreaPi.png new file mode 100644 index 0000000000000000000000000000000000000000..ac7067bb17e2b2189e833fd861c44dcd5d484a7d Binary files /dev/null and b/docs/FAQ/en/others/media/BreaPi.png differ diff --git a/docs/FAQ/en/others/media/EC600S_QuecPython_EVB_V1.x.png b/docs/FAQ/en/others/media/EC600S_QuecPython_EVB_V1.x.png new file mode 100644 index 0000000000000000000000000000000000000000..b643d42a418e58e8fc4bd5875cefd925c5201da5 Binary files /dev/null and b/docs/FAQ/en/others/media/EC600S_QuecPython_EVB_V1.x.png differ diff --git a/docs/FAQ/en/others/media/clip_image002-1615461735616.jpg b/docs/FAQ/en/others/media/clip_image002-1615461735616.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bb46f3eadf4b10eda865ebb8aa516125c2908f8d Binary files /dev/null and b/docs/FAQ/en/others/media/clip_image002-1615461735616.jpg differ diff --git a/docs/FAQ/en/others/media/clip_image002-1615527701161.jpg b/docs/FAQ/en/others/media/clip_image002-1615527701161.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bfaa7745cb2083b52b3f7cb912e82f2c5cad7ed0 Binary files /dev/null and b/docs/FAQ/en/others/media/clip_image002-1615527701161.jpg differ diff --git a/docs/FAQ/en/others/media/clip_image002.jpg b/docs/FAQ/en/others/media/clip_image002.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c62422b5054daa92952399ea919da6a714f79184 Binary files /dev/null and b/docs/FAQ/en/others/media/clip_image002.jpg differ diff --git a/docs/FAQ/en/others/media/clip_image004-1615461735615.jpg b/docs/FAQ/en/others/media/clip_image004-1615461735615.jpg new file mode 100644 index 0000000000000000000000000000000000000000..df8984d78a986f8caf0756b63fe194c934c2e9d9 Binary files /dev/null and b/docs/FAQ/en/others/media/clip_image004-1615461735615.jpg differ diff --git a/docs/FAQ/en/others/media/clip_image004-1615527701161.jpg b/docs/FAQ/en/others/media/clip_image004-1615527701161.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ae599847ff28ea44278d011564f8ea6f68ee4425 Binary files /dev/null and b/docs/FAQ/en/others/media/clip_image004-1615527701161.jpg differ diff --git a/docs/FAQ/en/others/media/clip_image004.jpg b/docs/FAQ/en/others/media/clip_image004.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5d6d63552b1294cd6a8782466232024bf153d3cd Binary files /dev/null and b/docs/FAQ/en/others/media/clip_image004.jpg differ diff --git a/docs/FAQ/en/others/media/clip_image006-1615461735616.jpg b/docs/FAQ/en/others/media/clip_image006-1615461735616.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1dd67f3203b423fd642adfdcf5f1e6d4398cd28f Binary files /dev/null and b/docs/FAQ/en/others/media/clip_image006-1615461735616.jpg differ diff --git a/docs/FAQ/en/others/media/clip_image006-1615527701161.jpg b/docs/FAQ/en/others/media/clip_image006-1615527701161.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4465058efe9c6888f9b54aea72b2ce048294623e Binary files /dev/null and b/docs/FAQ/en/others/media/clip_image006-1615527701161.jpg differ diff --git a/docs/FAQ/en/others/media/clip_image006.jpg b/docs/FAQ/en/others/media/clip_image006.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4f7ec97b7474a3eeba7463d6730cd2d3e7d37f99 Binary files /dev/null and b/docs/FAQ/en/others/media/clip_image006.jpg differ diff --git a/docs/FAQ/en/others/media/clip_image008-1615527701161.jpg b/docs/FAQ/en/others/media/clip_image008-1615527701161.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b5a4631fc16244eb6a9edae717daaaed8ced61a4 Binary files /dev/null and b/docs/FAQ/en/others/media/clip_image008-1615527701161.jpg differ diff --git a/docs/FAQ/en/others/media/clip_image008.jpg b/docs/FAQ/en/others/media/clip_image008.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9340907998031eb3d5cccca63fae050665dcafcc Binary files /dev/null and b/docs/FAQ/en/others/media/clip_image008.jpg differ diff --git a/docs/FAQ/en/others/media/clip_image010-1615527701161.jpg b/docs/FAQ/en/others/media/clip_image010-1615527701161.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f368c332062aeadbd5f0089a51ed07e75555d5cb Binary files /dev/null and b/docs/FAQ/en/others/media/clip_image010-1615527701161.jpg differ diff --git a/docs/FAQ/en/others/media/clip_image010.jpg b/docs/FAQ/en/others/media/clip_image010.jpg new file mode 100644 index 0000000000000000000000000000000000000000..be55fd5de013def23feeaa2eb398a801ab9f79e5 Binary files /dev/null and b/docs/FAQ/en/others/media/clip_image010.jpg differ diff --git a/docs/FAQ/en/others/media/clip_image012-1615527701161.jpg b/docs/FAQ/en/others/media/clip_image012-1615527701161.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dcf75a760f986dccbd0ed06a4b057381755586c0 Binary files /dev/null and b/docs/FAQ/en/others/media/clip_image012-1615527701161.jpg differ diff --git a/docs/FAQ/en/others/media/clip_image012.jpg b/docs/FAQ/en/others/media/clip_image012.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4f85c873908b4a9ad928c09a95eeed0fac7c2514 Binary files /dev/null and b/docs/FAQ/en/others/media/clip_image012.jpg differ diff --git a/docs/FAQ/en/others/media/clip_image014.jpg b/docs/FAQ/en/others/media/clip_image014.jpg new file mode 100644 index 0000000000000000000000000000000000000000..785afbceb1320d644427958f1f40b93a73989f0d Binary files /dev/null and b/docs/FAQ/en/others/media/clip_image014.jpg differ diff --git a/docs/FAQ/en/others/media/clip_image016.jpg b/docs/FAQ/en/others/media/clip_image016.jpg new file mode 100644 index 0000000000000000000000000000000000000000..da7e9035a948134a4d4e2d4414a9810306ba9c14 Binary files /dev/null and b/docs/FAQ/en/others/media/clip_image016.jpg differ diff --git a/docs/FAQ/en/others/media/clip_image018.jpg b/docs/FAQ/en/others/media/clip_image018.jpg new file mode 100644 index 0000000000000000000000000000000000000000..086431c17c77177a4223a569e20094527f237acf Binary files /dev/null and b/docs/FAQ/en/others/media/clip_image018.jpg differ diff --git a/docs/FAQ/en/others/media/clip_image020.jpg b/docs/FAQ/en/others/media/clip_image020.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b71a41b97c5bae5534cd550e55357f1fc25d3963 Binary files /dev/null and b/docs/FAQ/en/others/media/clip_image020.jpg differ diff --git a/docs/FAQ/en/others/media/clip_image022.jpg b/docs/FAQ/en/others/media/clip_image022.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c4757d18cb45adb2c1ca40541261be64f3d0adac Binary files /dev/null and b/docs/FAQ/en/others/media/clip_image022.jpg differ diff --git a/docs/FAQ/en/others/media/clip_image024.jpg b/docs/FAQ/en/others/media/clip_image024.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e3b8ed03436804b68d24cc5a68b349d291e0952c Binary files /dev/null and b/docs/FAQ/en/others/media/clip_image024.jpg differ diff --git a/docs/FAQ/en/others/media/clip_image026.jpg b/docs/FAQ/en/others/media/clip_image026.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9cbc3645fdbfecfe7de43d7eec54e2b1fcfe25f9 Binary files /dev/null and b/docs/FAQ/en/others/media/clip_image026.jpg differ diff --git a/docs/FAQ/en/others/media/clip_image028.jpg b/docs/FAQ/en/others/media/clip_image028.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b36875b58785b2ed7bf13f332cda4159f3f53107 Binary files /dev/null and b/docs/FAQ/en/others/media/clip_image028.jpg differ diff --git a/docs/FAQ/en/others/media/clip_image030.jpg b/docs/FAQ/en/others/media/clip_image030.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a0388365a83427245727e3a8ace96c8dfcb47495 Binary files /dev/null and b/docs/FAQ/en/others/media/clip_image030.jpg differ diff --git a/docs/FAQ/en/others/media/clip_image032.jpg b/docs/FAQ/en/others/media/clip_image032.jpg new file mode 100644 index 0000000000000000000000000000000000000000..df7c78202aa7e7f958a0317669795f4f71de921a Binary files /dev/null and b/docs/FAQ/en/others/media/clip_image032.jpg differ diff --git a/docs/FAQ/en/others/media/clip_image034.jpg b/docs/FAQ/en/others/media/clip_image034.jpg new file mode 100644 index 0000000000000000000000000000000000000000..315ef007b4ecced814894a76e832cddc55a63873 Binary files /dev/null and b/docs/FAQ/en/others/media/clip_image034.jpg differ diff --git a/docs/FAQ/en/others/media/clip_image036.jpg b/docs/FAQ/en/others/media/clip_image036.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b2be3d1cf6d6c822b2a9e3978347cd5905160593 Binary files /dev/null and b/docs/FAQ/en/others/media/clip_image036.jpg differ diff --git a/docs/FAQ/en/others/media/clip_image038.jpg b/docs/FAQ/en/others/media/clip_image038.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6a5ce692d9ca4ae20778c6bf6c3943d00de84ab0 Binary files /dev/null and b/docs/FAQ/en/others/media/clip_image038.jpg differ diff --git a/docs/FAQ/en/others/media/clip_image040.jpg b/docs/FAQ/en/others/media/clip_image040.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4f3c23c2449b495132e2f0fe068907634f84b7b0 Binary files /dev/null and b/docs/FAQ/en/others/media/clip_image040.jpg differ diff --git a/docs/FAQ/en/others/media/clip_image042.jpg b/docs/FAQ/en/others/media/clip_image042.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c93ff5888e19b845ec84f921eff0e11a756085a9 Binary files /dev/null and b/docs/FAQ/en/others/media/clip_image042.jpg differ diff --git a/docs/FAQ/en/others/media/clip_image044.jpg b/docs/FAQ/en/others/media/clip_image044.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f274709d4219fbd8788975dd52f5bc7ecc7f9104 Binary files /dev/null and b/docs/FAQ/en/others/media/clip_image044.jpg differ diff --git a/docs/FAQ/en/others/media/clip_image046.jpg b/docs/FAQ/en/others/media/clip_image046.jpg new file mode 100644 index 0000000000000000000000000000000000000000..be4865f3ba188c1223ef9907aea92f3d350806b4 Binary files /dev/null and b/docs/FAQ/en/others/media/clip_image046.jpg differ diff --git a/docs/FAQ/en/others/media/clip_image048.jpg b/docs/FAQ/en/others/media/clip_image048.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0bcef91799bbb22b5c8760bf13458f302e925b08 Binary files /dev/null and b/docs/FAQ/en/others/media/clip_image048.jpg differ diff --git a/docs/FAQ/en/others/media/clip_image050.jpg b/docs/FAQ/en/others/media/clip_image050.jpg new file mode 100644 index 0000000000000000000000000000000000000000..38cc326e6c74c7fede94c7b5538ee791a8ea57f8 Binary files /dev/null and b/docs/FAQ/en/others/media/clip_image050.jpg differ diff --git a/docs/FAQ/en/others/media/dirver.png b/docs/FAQ/en/others/media/dirver.png new file mode 100644 index 0000000000000000000000000000000000000000..1e9699c614b5fb9e818dc025b9b5531724f514bc Binary files /dev/null and b/docs/FAQ/en/others/media/dirver.png differ diff --git a/docs/FAQ/en/others/media/dirver_c.png b/docs/FAQ/en/others/media/dirver_c.png new file mode 100644 index 0000000000000000000000000000000000000000..e805108c87e2f14b99e185dbf6df5bf23f96e924 Binary files /dev/null and b/docs/FAQ/en/others/media/dirver_c.png differ diff --git a/docs/FAQ/en/others/media/dirver_finish.png b/docs/FAQ/en/others/media/dirver_finish.png new file mode 100644 index 0000000000000000000000000000000000000000..20d8a419b223029db318c7df318e5fafbac743ab Binary files /dev/null and b/docs/FAQ/en/others/media/dirver_finish.png differ diff --git a/docs/FAQ/en/others/media/dirver_installing.png b/docs/FAQ/en/others/media/dirver_installing.png new file mode 100644 index 0000000000000000000000000000000000000000..59de57ac31cb5ea6c41bc998424e497ead8c1b20 Binary files /dev/null and b/docs/FAQ/en/others/media/dirver_installing.png differ diff --git a/docs/FAQ/en/others/media/dirver_python.png b/docs/FAQ/en/others/media/dirver_python.png new file mode 100644 index 0000000000000000000000000000000000000000..44f24275daa1c55b664072c86ea14d54951d6347 Binary files /dev/null and b/docs/FAQ/en/others/media/dirver_python.png differ diff --git a/docs/FAQ/en/others/media/dirver_setup.png b/docs/FAQ/en/others/media/dirver_setup.png new file mode 100644 index 0000000000000000000000000000000000000000..5c64e95704bd913477136297efdd237de67afbe6 Binary files /dev/null and b/docs/FAQ/en/others/media/dirver_setup.png differ diff --git a/docs/FAQ/en/others/media/firmware_ATI.png b/docs/FAQ/en/others/media/firmware_ATI.png new file mode 100644 index 0000000000000000000000000000000000000000..0612afcf35e2cd2b906ac4e7d3f025382826bf54 Binary files /dev/null and b/docs/FAQ/en/others/media/firmware_ATI.png differ diff --git a/docs/FAQ/en/others/media/firmware_ATI02.png b/docs/FAQ/en/others/media/firmware_ATI02.png new file mode 100644 index 0000000000000000000000000000000000000000..803607f436f352e95983c590d944f9da3396ed95 Binary files /dev/null and b/docs/FAQ/en/others/media/firmware_ATI02.png differ diff --git a/docs/FAQ/en/others/media/firmware_choosefirmware.png b/docs/FAQ/en/others/media/firmware_choosefirmware.png new file mode 100644 index 0000000000000000000000000000000000000000..125048b1d08aa1b36fede9e5aa821a3b0e740a62 Binary files /dev/null and b/docs/FAQ/en/others/media/firmware_choosefirmware.png differ diff --git a/docs/FAQ/en/others/media/firmware_downloadfirmware.png b/docs/FAQ/en/others/media/firmware_downloadfirmware.png new file mode 100644 index 0000000000000000000000000000000000000000..989e3d5945ae2f060203c102f6abe2a7f31f5c4d Binary files /dev/null and b/docs/FAQ/en/others/media/firmware_downloadfirmware.png differ diff --git a/docs/FAQ/en/others/media/firmware_downloadsuccess.png b/docs/FAQ/en/others/media/firmware_downloadsuccess.png new file mode 100644 index 0000000000000000000000000000000000000000..b48a17326747550ad734661e158793a262413db1 Binary files /dev/null and b/docs/FAQ/en/others/media/firmware_downloadsuccess.png differ diff --git a/docs/FAQ/en/others/media/firmware_downloadwaiting.png b/docs/FAQ/en/others/media/firmware_downloadwaiting.png new file mode 100644 index 0000000000000000000000000000000000000000..f82b2630fb8dc1f8fda596a5eeb14e7d970889e0 Binary files /dev/null and b/docs/FAQ/en/others/media/firmware_downloadwaiting.png differ diff --git a/docs/FAQ/en/others/media/firmware_notopen.png b/docs/FAQ/en/others/media/firmware_notopen.png new file mode 100644 index 0000000000000000000000000000000000000000..dd6f74336081725d3d9da528b8c74b2ee53a4e05 Binary files /dev/null and b/docs/FAQ/en/others/media/firmware_notopen.png differ diff --git a/docs/FAQ/en/others/media/image-20210311201822427.png b/docs/FAQ/en/others/media/image-20210311201822427.png new file mode 100644 index 0000000000000000000000000000000000000000..dfd2dbf09483689d6fa80e3b07fa611840dcb041 Binary files /dev/null and b/docs/FAQ/en/others/media/image-20210311201822427.png differ diff --git a/docs/FAQ/en/others/media/image-20210312101407043.png b/docs/FAQ/en/others/media/image-20210312101407043.png new file mode 100644 index 0000000000000000000000000000000000000000..07aa3ada32cfd8352b5466c2c4ae595be1e3529e Binary files /dev/null and b/docs/FAQ/en/others/media/image-20210312101407043.png differ diff --git a/docs/FAQ/en/others/media/image-20210312101415590.png b/docs/FAQ/en/others/media/image-20210312101415590.png new file mode 100644 index 0000000000000000000000000000000000000000..61b0c4e5c2104fdcd5fdbfb76ef624b36ad6b8ed Binary files /dev/null and b/docs/FAQ/en/others/media/image-20210312101415590.png differ diff --git a/docs/FAQ/en/others/media/image-20210312101450518.png b/docs/FAQ/en/others/media/image-20210312101450518.png new file mode 100644 index 0000000000000000000000000000000000000000..ba91f136b4e816f62dd08c9216781b22029edf2b Binary files /dev/null and b/docs/FAQ/en/others/media/image-20210312101450518.png differ diff --git a/docs/FAQ/en/others/media/image-20210312101454417.png b/docs/FAQ/en/others/media/image-20210312101454417.png new file mode 100644 index 0000000000000000000000000000000000000000..99b338b49e780adae03ddefd55389f3f13668c41 Binary files /dev/null and b/docs/FAQ/en/others/media/image-20210312101454417.png differ diff --git a/docs/FAQ/en/others/media/image-20210312102005627.png b/docs/FAQ/en/others/media/image-20210312102005627.png new file mode 100644 index 0000000000000000000000000000000000000000..d53a6e5c2a2c1dc8fd9b4106d437a32dd4b12a28 Binary files /dev/null and b/docs/FAQ/en/others/media/image-20210312102005627.png differ diff --git a/docs/FAQ/en/others/media/image-20210312102149061.png b/docs/FAQ/en/others/media/image-20210312102149061.png new file mode 100644 index 0000000000000000000000000000000000000000..61b0c4e5c2104fdcd5fdbfb76ef624b36ad6b8ed Binary files /dev/null and b/docs/FAQ/en/others/media/image-20210312102149061.png differ diff --git a/docs/FAQ/en/others/media/image-20210312102326265.png b/docs/FAQ/en/others/media/image-20210312102326265.png new file mode 100644 index 0000000000000000000000000000000000000000..99b338b49e780adae03ddefd55389f3f13668c41 Binary files /dev/null and b/docs/FAQ/en/others/media/image-20210312102326265.png differ diff --git a/docs/FAQ/en/others/media/image-20210312102439534.png b/docs/FAQ/en/others/media/image-20210312102439534.png new file mode 100644 index 0000000000000000000000000000000000000000..1d1f291345f99b3a2a45c0eb988b83802530a096 Binary files /dev/null and b/docs/FAQ/en/others/media/image-20210312102439534.png differ diff --git a/docs/FAQ/en/others/media/image-20210312102450245.png b/docs/FAQ/en/others/media/image-20210312102450245.png new file mode 100644 index 0000000000000000000000000000000000000000..1d1f291345f99b3a2a45c0eb988b83802530a096 Binary files /dev/null and b/docs/FAQ/en/others/media/image-20210312102450245.png differ diff --git a/docs/FAQ/en/others/media/image-20210312102517370.png b/docs/FAQ/en/others/media/image-20210312102517370.png new file mode 100644 index 0000000000000000000000000000000000000000..f17ab6dc6c9fbd56a907ec9101a8b6b81a2010c9 Binary files /dev/null and b/docs/FAQ/en/others/media/image-20210312102517370.png differ diff --git a/docs/FAQ/en/others/media/image-20210312102538767.png b/docs/FAQ/en/others/media/image-20210312102538767.png new file mode 100644 index 0000000000000000000000000000000000000000..d53a6e5c2a2c1dc8fd9b4106d437a32dd4b12a28 Binary files /dev/null and b/docs/FAQ/en/others/media/image-20210312102538767.png differ diff --git a/docs/FAQ/en/others/media/image-20210312132017231.png b/docs/FAQ/en/others/media/image-20210312132017231.png new file mode 100644 index 0000000000000000000000000000000000000000..1bc216678facc9e4b596aea1d0935564fe03eed5 Binary files /dev/null and b/docs/FAQ/en/others/media/image-20210312132017231.png differ diff --git a/docs/FAQ/en/others/media/image-20210312132446192.png b/docs/FAQ/en/others/media/image-20210312132446192.png new file mode 100644 index 0000000000000000000000000000000000000000..df0ccc00f3b37e23daf51c0258f9288973efcba1 Binary files /dev/null and b/docs/FAQ/en/others/media/image-20210312132446192.png differ diff --git a/docs/FAQ/en/others/media/image-20210312132458172.png b/docs/FAQ/en/others/media/image-20210312132458172.png new file mode 100644 index 0000000000000000000000000000000000000000..6e666713160348d38305ca0b5299d60f23f69c2a Binary files /dev/null and b/docs/FAQ/en/others/media/image-20210312132458172.png differ diff --git a/docs/FAQ/en/others/media/image-20210312132735642.png b/docs/FAQ/en/others/media/image-20210312132735642.png new file mode 100644 index 0000000000000000000000000000000000000000..6e2a63139ea716f3a8f3b59ccef75a05f38745c5 Binary files /dev/null and b/docs/FAQ/en/others/media/image-20210312132735642.png differ diff --git a/docs/FAQ/en/others/media/image-20210312134000186.png b/docs/FAQ/en/others/media/image-20210312134000186.png new file mode 100644 index 0000000000000000000000000000000000000000..4f5048d5699ba70e60d494609bffea847ba435a9 Binary files /dev/null and b/docs/FAQ/en/others/media/image-20210312134000186.png differ diff --git a/docs/FAQ/en/others/media/image-20210312134025628.png b/docs/FAQ/en/others/media/image-20210312134025628.png new file mode 100644 index 0000000000000000000000000000000000000000..7b700cbbda72524f9ad959c6ead9bc4793dc57d8 Binary files /dev/null and b/docs/FAQ/en/others/media/image-20210312134025628.png differ diff --git a/docs/FAQ/en/others/media/image-20210312135703298.png b/docs/FAQ/en/others/media/image-20210312135703298.png new file mode 100644 index 0000000000000000000000000000000000000000..4a83bc67936d660f08718183998fe308e4d4dcbf Binary files /dev/null and b/docs/FAQ/en/others/media/image-20210312135703298.png differ diff --git a/docs/FAQ/en/others/media/image-20210312135803677.png b/docs/FAQ/en/others/media/image-20210312135803677.png new file mode 100644 index 0000000000000000000000000000000000000000..0f7d4b0b96301b5651f321bfd57d85f2239e454e Binary files /dev/null and b/docs/FAQ/en/others/media/image-20210312135803677.png differ diff --git a/docs/FAQ/en/others/media/image-20210312135817816.png b/docs/FAQ/en/others/media/image-20210312135817816.png new file mode 100644 index 0000000000000000000000000000000000000000..408a19251112775c9b8a4682701b6a4a4079eb0c Binary files /dev/null and b/docs/FAQ/en/others/media/image-20210312135817816.png differ diff --git a/docs/FAQ/en/others/media/jioaben_choosefirmware.png b/docs/FAQ/en/others/media/jioaben_choosefirmware.png new file mode 100644 index 0000000000000000000000000000000000000000..125048b1d08aa1b36fede9e5aa821a3b0e740a62 Binary files /dev/null and b/docs/FAQ/en/others/media/jioaben_choosefirmware.png differ diff --git a/docs/FAQ/en/others/media/jioaben_choosejiaoben.png b/docs/FAQ/en/others/media/jioaben_choosejiaoben.png new file mode 100644 index 0000000000000000000000000000000000000000..2b1b479b7e6b44ea01340869b1b2d4373beb3b57 Binary files /dev/null and b/docs/FAQ/en/others/media/jioaben_choosejiaoben.png differ diff --git a/docs/FAQ/en/others/media/jioaben_downloadstart.png b/docs/FAQ/en/others/media/jioaben_downloadstart.png new file mode 100644 index 0000000000000000000000000000000000000000..419ecf09c8305f1f144cd5a755f7e33ba2c91280 Binary files /dev/null and b/docs/FAQ/en/others/media/jioaben_downloadstart.png differ diff --git a/docs/FAQ/en/others/media/jioaben_downloadsuccess.png b/docs/FAQ/en/others/media/jioaben_downloadsuccess.png new file mode 100644 index 0000000000000000000000000000000000000000..dd256ff53cf967f9e221d194205eb3bf3f372587 Binary files /dev/null and b/docs/FAQ/en/others/media/jioaben_downloadsuccess.png differ diff --git a/docs/FAQ/en/others/media/jioaben_start.png b/docs/FAQ/en/others/media/jioaben_start.png new file mode 100644 index 0000000000000000000000000000000000000000..7dca2571afbb1a4165c61e28320924ae5ac0a0af Binary files /dev/null and b/docs/FAQ/en/others/media/jioaben_start.png differ diff --git a/docs/FAQ/en/others/others.md b/docs/FAQ/en/others/others.md new file mode 100644 index 0000000000000000000000000000000000000000..083c6aab43e0089e04266280e80f7f041b2178cf --- /dev/null +++ b/docs/FAQ/en/others/others.md @@ -0,0 +1,920 @@ +## QuecPython supports group addresses + +Mobile quecpthon development exchange group: 445121768 + +## QuecPython related preparations + +### Development board + +Currently recommended development boards: + +(1) Little bear pie + +![](media/BreaPi.png) + +(2)EC600S_ QuecPython_ EVB_ V1. X development board + +![EC600S_QuecPython_EVB_V1.x](media/EC600S_QuecPython_EVB_V1.x.png) + +### Driver download and installation + +1. Before using the development board, you need to install a USB driver on the computer. After correct installation, the computer can recognize the development board. + +|Driver name | quectel_ ASR_ Series_ UMTS<E_ Windows_ USB_ Driver_ Customer | +| ---------------- | ------------------------------------------------------------ | +|Driver download address |[ https://python.quectel.com/download.html ](https://python.quectel.com/download.html) | + +2. After the developer downloads the compressed package of the driver, completely decompress the compressed package to any directory, and double-click to run setup.exe: + +![dirver_setup](media/dirver_setup.png) + +3. Follow the prompts and click Install: + +dirver_installing + +4. After successful installation, click "finish" to finish: + +dirver_finish + +5. At this point, the USB driver installation is completed. + +6. For the python firmware module, the device manager installed by the driver is: + +dirver_python + +For non Python firmware modules, the device manager installed by the driver is: + +dirver_c + + + +**TIPS** + +(1) For "quecpthon driver installation failure", see the chapter "quecpthon driver installation failure solution" + +(2) Before installation, please back up your important files and save your work progress to avoid accidents and file loss + +(3) After successful installation, there is no need to restart the computer + +(4) To repair or uninstall the driver, run the driver installer again and select repair or uninstall + + + +### Firmware download and installation + +**Description:** +(1) In order to interactively adapt the python application of the client, you need to download the quecpthon firmware to the development board. After the download is completed, you can do the underlying adaptation processing for the python application. Firmware download website:[ https://python.quectel.com/download.html ](https://python.quectel.com/download.html) +(2) Qpycom tool supports burning py firmware, not C firmware +(3) The specific steps are as follows + +1. First confirm your own module version, use qcom to view, and send at command 'at + GMR', as shown below: + +firmware_ATI + +Version Description: if it is a python version of firmware (the firmware number ends with py), skip this step directly; If it is not a python version, download the corresponding firmware according to the first half of the version (if it is the firmware shown in the figure below, please download the corresponding Python firmware of ec600scnaa on the official website) + +firmware_ATI02 + +2. Do not open the serial port and directly create the project (** for non Python firmware modules, do not open any serial port, including at serial port **). + +firmware_notopen + +3. Click "select firmware". + +firmware_choosefirmware + +**Precautions:** +(1) The selected firmware is a compressed package +(2) The next level directories of the firmware are all. Bin and so on, that is, there are no additional compressed packages in the firmware( There may be firmware downloaded from the official website, which needs to be decompressed before proceeding to the next step) + +4. Click "download firmware" + +firmware_downloadfirmware + +5. Wait about 20 seconds and the download progress bar will appear + +firmware_downloadwaiting + +6. Wait for the download to complete, and the following interface will appear, indicating "download succeeded" + +firmware_downloadsuccess + + + +TIPS: +(1) "QuecPython firmware installation failure" see the chapter "quecpthon brick rescue processing" +(2) Before installation, please back up your important files and save your work progress to avoid accidents and file loss +(3) After successful installation, there is no need to restart the computer + +### Script Download + +​ Suggestions for downloading scripts: + +(1) In order to facilitate script download, qpycom has made the function of script drag and drop download. You are welcome to use it. If you have any problems, please refer to quectel quecpthon_ Qpycom tool instructions + +(2) If you want to download all your scripts at once and clear the original scripts (see the explanation below for which scripts to clear), you can follow the script download steps below + +​ Explanation of which scripts will be deleted in the following script download steps: for the root directory, except JSON, it will be deleted, while for the subfolder (create a new folder yourself), script download will not affect this folder. + +1. After the user selects "USB serial device", open the serial port, click the "download" button to create a project (the project name is optional). + +jioaben_start + +2. Click "select firmware" (for script download, you need to select firmware temporarily, but firmware will not be downloaded, which can be omitted later). + +jioaben_choosefirmware + +3. Select the script to download + +jioaben_choosejiaoben + +4. Download the script and wait for completion + +jioaben_downloadstart + +5. Complete the interface display + +jioaben_downloadsuccess + +## QuecPython driver installation failed. Problem solving + +If the USB enumeration fails after the driver is installed, the solution is: + +(1) Ensure that the latest corresponding driver is downloaded from the official website (win7 and win10 are different) + +(2) In "control panel" - "uninstaller", check whether the driver is successfully installed. The screenshot shows the successful installation + +![dirver](media/dirver.png) + +(3) If there is still a driver installation problem, please join our QQ group 445121768, and the engineer will answer your questions online + + + +## QuecPython brick rescue processing + +When you fail to download firmware using qpycom tool, don't worry about the brick. Let's help you save the brick. + +### Method 1 + +1. Open the computer task manager (you can open it with the shortcut "Ctrl + Alt + delete"), find qpycom.exe and force the end of the background task. + +2. For the development board: press and hold the reset button on the board to restart the board; For bare modules, you can directly power off and then power on, and then pull down powkey to start up + +3. Check whether a normal number of serial ports are displayed in the serial port list of the device manager. If the original firmware is Python firmware, three serial ports (at, diag and USB serial device ports) will be displayed normally. The screenshot on the left side of the table below. If the original firmware is non Python firmware, two serial ports (at and Diag ports) will be displayed normally. The screenshot on the right side of the table below. The following screenshots belong to normal display. For modules that can be displayed normally, please proceed to step 4; For modules with abnormal display, refer to method 2 or method 3. + +|Device manager corresponding to Python firmware module | device manager corresponding to non Python firmware module| +| ------------------------------- | -------------------------------- | +| ![img](media/clip_image002.jpg) | ![img](media/clip_image004.jpg) | + +4. If the serial port is displayed normally, reopen qpycom.exe tool and refer to quectel quecpthon_ Download the firmware again according to qpycom tool instructions. + + + +### Method 2 + +If the upgrade fails in qpycom or the connection is disconnected during the upgrade process, please follow the following steps: + +1. Power off the module and short circuit VDD_ Ext and USB_ Boot, the pin pin pin position corresponding to the module is shown in the figure below + +![img](media/clip_image006.jpg) + +Or it can be directly short circuited to ec600s_ QuecPython_ EVB_ Boot and 1v8 of V1. X development board (as shown below); For other development boards, find the corresponding location yourself + +img + +img + +2. Check whether the download port appears in the device management, as shown in the following figure: + +img + +3. If it is not the download port shown in the figure above, the ASR download port appears, as shown in the figure below: + +img + +​ There are two solutions: + +(1) Ignore and continue with "step 4" below, but if it fails, follow method 3 + +(2) Adjust the download port (see Chapter "download port adjustment" for specific steps) + +4. Open qpycom without opening the serial port and directly create the project (** for modules without Python firmware, do not open the serial port **). + +img + +5. Click "select firmware". + +**Precautions:** + +(1) The selected firmware is a compressed package + +(2) The next level directories of the firmware are all. Bin and so on, that is, there are no additional compressed packages in the firmware( There may be firmware downloaded from the official website, which needs to be decompressed before proceeding to the next step) + +img + +6. Click "download firmware" + +img + +7. Wait about 20 seconds and the download progress bar will appear + +img + +8. Wait for the download to complete, and the following interface will appear, indicating "download succeeded" + +img + + + +9. For the module that will restart automatically after the above download is successful (if not, restart manually), check the device manager and the correct display is as follows: + +img + + + +### Method 3 + + + +1. Download the qflash tool compressed package, unzip it, and double-click to run the software; + +img + +2. Click [load FW files] to select the firmware upgrade package. + +**Firmware package considerations:** + +(1) The selected firmware is a compressed package + +(2) The next level directory of the firmware is all. Bin files, etc., that is, there is no additional compressed package in the firmware( There may be firmware downloaded from the official website, which needs to be decompressed before proceeding to the next step) + +3. For ec100y and ec600s, it is not necessary to select COM port and baudrate, so the "COM port and baudrate" in the figure can be ignored, that is, even if there is no normal port, qflash can be used to download firmware + +4. Short circuit VDD_ Ext and USB_ Boot (short circuit before power on, see method 2 for the short circuit position), then power on, and click start of qflash at the same time. + +![img](media/clip_image030.jpg) + +matters needing attention: + +​ Due to the time limit for qflash to detect the download port, it can be considered to put the short circuit in the first step, and then power on directly for step 4; Or fast operation is required for short circuit power on in step 4 + +5. After downloading, refer to the following screenshot: + +![img](media/clip_image032.jpg) + +6. Qcom query is shown in the figure below + +![img](media/clip_image034.jpg) + +Displaying the end of Py indicates that the PY firmware was successfully burned + +For the problems that may be encountered in method 2, the following suggestions are made: + +(1) In case of any failure in qflash download, please close qflash and restart (how to effectively close the qflash process, you can open "device manager" through "Ctrl + Alt + delete" to completely kill qflash, as shown in the screenshot below). Then return to the first step to download the firmware. + +img + +(2) After the short circuit is powered on, the computer port will be displayed as shown in the figure below (other ports are disabled and the download port appears), which can be viewed and confirmed. + +img + + + + + + + +### Download port adjustment + +1. First, confirm whether the download port is as shown in the screenshot below. If so, continue to perform "step 2". Otherwise, consult the group (move away from quecpthon development communication group: 445121768) + +img + +2. Select the download port of the above screenshot and right-click "update driver" + +img + +3. Select browse my computer for drivers + +img + +4. Select let me select from the list of available drivers on my computer + +img + + + +5. Select "quectel download port" (if not, please download and install the driver first) and click "next" + +img + +6. Select close + +img + +7. The final interface is shown in the figure below, indicating that "download port adjustment" is completed. + +img + + + + + +## QuecPython test problem + +### The quecpthon main.py file uses + +Suggestions for main.py: + +(1) For the initial debugging, it is recommended not to name the program: main.py. It is recommended to use other names, such as start.py, etc. If there is an endless loop, it cannot be interrupted when the program is running. In this case, it can only be solved by re brushing the firmware for the time being. + +(2) If you really want to use the main.py program and need to use the dead loop at the same time, remember to add an interruptible condition to the dead loop, for example (1. The following example is that an dead loop is added to a thread and an interrupt exit condition is added to the dead loop. When it is always output, it can be output by pressing the key corresponding to gpio2; 2. The following example is based on ec600s_ QuecPython_ EVB_ For v1. X development board, please configure the key interrupt for other development boards): + +```python +import log +import _thread +from machine import Pin +import utime +log.basicConfig(level=log.NOTSET) +KEY_log = log.getLogger("KEY") +gpio2 = Pin(Pin.GPIO2, Pin.IN, Pin.PULL_DISABLE, 0) +def in_capture(): + KEY_log.debug("in_capture start!") + while True: + KEY_log.info("1111") + utime.sleep(1) + if gpio2.read() == 0: + KEY_log.info("in_capture thread end") + break + else: + pass +if __name__ == "__main__": + _thread.start_new_thread(in_capture, ()) + +``` + +(3) For self running without log output, please refer to the solution of phenomenon 2 below. + +**Phenomenon 1: after uploading the PY file and the file name is main.py to the module, no instructions can be executed (including uploading the file). A similar phenomenon is shown in the screenshot below** + +img + +Cause: the module will automatically look for the script file named main.py after startup. If there are loop statements such as while and for in main.py, the program will be blocked, the serial port will be occupied, and other operations cannot be performed + +**Solution: the current version can only be solved by re brushing the firmware **. + + + +**Phenomenon 2: when you manually run the main.py program, you can see the print output and log printing information connected to the "USB serial device" through qpycom. However, after running the main.py program, you can't see anything in the interactive interface of qpycom** + +**Solution: serial port printing can be added** + +(1) Software code can refer to: + +```python +from machine import UART #Import UART module +uart = UART(UART.UART2, 115200, 8, 0, 1, 0) #Configured as UART2 output (hardware connection) +count = 50 +while count: + uart.write('main_py_UART_msg:{}\r\n'.format(count)) + count -= 1 +``` + +explain: + +​ Serial port printing needs to import UART module and write output code according to UART API library + +(2) For hardware connection, refer to: + +For the hardware connection (UART2) mentioned in the code, type-C is used to supply power to the module. The connection between UART and TTL to USB module is shown in the table below. TTL to USB module is directly inserted into PC: + +|Module UART_ Pin | TTL to USB module| +| -------------- | ------------ | +| RX1 | Tx | +| TX1 | Rx | +| GND | GND | + +Use qcom to connect the serial port corresponding to "TTL to USB module", as shown in the following figure: + +img + +In view of the above software and hardware configuration, when running the main.py program, you will see the corresponding print in qcom, as shown in the following figure: + +img + +### Test flow of sending and receiving data of serial port + +Environment setup (this test only tests the serial port encapsulation of API): + +(1) USB to ec600s_ QuecPython_ EVB_ V1. X power supply, TX1 and rx1 of the main serial port are correspondingly connected to the 3.3V terminal of the level conversion chip (after level conversion to 5V, a level converter is used), and the serial port tool GND is grounded + +(2) Software: one end uses qpycom to connect ec600s_ QuecPython_ EVB_ "USB serial device" port of V1. X (used to send quecpthon instruction during debugging); The other end uses qcom to connect the port corresponding to "level converter device" (for receiving ec600s_ QuecPython_ EVB_ Data sent by v1. X (write function of the test module), and data sent to the module (read function of the test module)). + +```python +#Send data (write): +>>> from machine import UART +>>>UART = UART (UART. Uart2115200,8,0,1,0) / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / +>>>UART. Write ("12345678") / / / / after the data is received, you can see the data through qcom (as shown in the screenshot below) +8 / / / / / / / / / / / "8" indicates the number of bytes sent +``` + +![image-20210311201822427](media/image-20210311201822427.png) + + + +```python +#Data received (read): +>>> from machine import UART +>>>UART = UART (UART. Uart2115200,8,0,1,0) / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / +>>>UART. Any() / / / / / / / / displays cached data (unread data will be displayed here only when qcom sends data) +32 +>>>Msglen = UART. Any() / / / / / / / / assign the length of cached data bytes to msglen +>>>MSG = UART. Read (msglen) / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / +>>> utf8_ Mmmm = MSG. Decode() / / / / / / / / / / / / / convert byte type data to unicode type +>>> print(utf8_ Mmmm) / / / / / / / output data as Unicode type +555555 +555555 +555555 +555555 +``` + + + +### Socket test (customer feedback: no error will be reported if the connection fails) + +The problem is: using the connect command, success and failure are not displayed + +```python +>>> import usocket +>>> client = usocket.socket(usocket.AF_ INET, usocket.SOCK_ Stream) / / / must be defined before each connection +>>>SOCKADDR = usocket. Getaddrinfo ('www.tongxinmao. Com ', 80) [0] [- 1] / / / correct port, socket +>>> client.connect(sockaddr) +>>>Client. Close() / / //////////////////////// +>>> client = usocket.socket(usocket.AF_ INET, usocket.SOCK_ Stream) / / / must be defined before each connection +>>>SOCKADDR = usocket. Getaddrinfo ('www.tongxinmao. Com ', 82) [0] [- 1] / / / error port, socket +>>> client.connect(sockaddr) +Traceback (most recent call last): + File "", line 1, in +OSError: 104 +>>>Client. Close() / / //////////////////////// +>>> client = usocket.socket(usocket.AF_ INET, usocket.SOCK_ Stream) / / / must be defined before each connection +>>>SOCKADDR = usocket. Getaddrinfo ('www.tongxinmao. Com ', 80) [0] [- 1] / / / correct port, socket + +>>> client.connect(sockaddr) +>>>Client. Close() / / //////////////////////// +``` + +### Ec600s bare module startup burning test + +Hardware connection of ec600s: + +|Module end | USB| +| ----------------- | --------------------- | +| USB_ DP (pin26) | green - USB data cable (positive)| +| USB_ DM (pin27) | white - USB data cable (negative)| +| USB_ VBUS (pin28) | red - USB power supply| +|GND (pin30) | black - ground wire| + +|Module end | power end| +| ---------------- | ---------- | +| VBAT_ BB (pin29) | positive pole of power supply| +| VBAT_ RF (pin36) | positive pole of power supply| +| VBAT_ RF (pin37) | positive pole of power supply| +|GND (pin38) | negative pole of power supply| + +Physical drawing: + +![image-20210312101407043](media/image-20210312101407043.png) ![image-20210312102149061](media/image-20210312102149061.png) + + Powkey pulls down the DM without burning firmware after startup + +image-20210312102450245 + +After burning, restart the DM + +image-20210312102517370 + +Pre and Post version query + +image-20210312132017231 + + + +### QuecPython mqtt connection exception handling + +#### Umqtt use + +The umqtt module provides the ability to create publish subscriptions for mqtt clients. This module can publish or subscribe messages to the server, send Ping packets to the server, detect and maintain connectivity, and establish or disconnect connections with the server. Note mqttclient.check_ Msg() and mqttclient.wait_ ** wait is recommended in msg() method_ MSG **. + +#### Use mqtt to connect Alibaba cloud, Tencent cloud, etc + +Please refer to the wiki community ([ https://python.quectel.com/wiki/ ](https://python.quectel.com/wiki/))的QuecPython云服务。 + +#### The cloud service running demo appears, and there is no subscription and other information + +Phenomenon: similar to the screenshot below + +![image-20210312132446192](media/image-20210312132446192.png) + +Cause analysis: (1) network injection failure( 2) The topics you subscribed to and published were not created on the cloud server + +(1) For network injection failure, the solution steps are as follows: + +​ Use qcom to connect at port and query the command "at + CSQ"+ CREG?; + CEREG? ;+ CGREG? ; + CPIN?;+ COPS?”, The screenshot below shows that your network status is normal. + +![image-20210312132458172](media/image-20210312132458172.png) + +​ Common solutions for exceptions are: + +For at + cpin? Check the hardware problem of SIM card holder; + +For CREG, cgreg and cereg, it is recommended to check whether the mobile phone card is in arrears, that is, to confirm whether the mobile phone card is normal + +For CSQ, check the surrounding environment for interference that leads to poor signal. It is recommended to test outdoors or add an antenna indoors. + +(2) For "the topic of subscription and publication is not created on the cloud server", it is recommended to check the following two points: + +Check whether the topics you subscribe to are also subscribable on the cloud service + +Check whether the topic you publish is also publishable on the cloud service + +#### The mqtt connection was disconnected abnormally for a period of time + +Cause: the mqtt server will have a heartbeat detection mechanism. If there is no communication activity between the device and the cloud for a period of time, it will actively disconnect + +Direction of trying to solve: disconnection is based on the timeout value of mqtt configuration. After the activity time is exceeded, the connection will be disconnected actively. We can use the timer according to the set keepalive activity time to actively send Ping packets to the cloud before the activity time exceeds. The data packets returned by the server do not need to be processed by the customer. + +![image-20210312132735642](media/image-20210312132735642.png) + +### Mqtt test + +Customer question: mqtt disconnection is obtained by capturing exceptions, but after disconnection, exceptions cannot be captured + +Question answer: an exception will be thrown. Umqtt has handled it. The upper level try cannot catch the following exception. For reconnection after disconnection, there will be log output, and no exception will be thrown directly. The following are some logs of the test (I have been sending and receiving before, and then try to reconnect after pulling out the card) + +The specific test code is: + +```python +from umqtt import MQTTClient +import utime +import log +import checkNet + +PROJECT_NAME = "QuecPython_MQTT_example" +PROJECT_VERSION = "1.0.0" + +checknet = checkNet.CheckNetwork(PROJECT_NAME, PROJECT_VERSION) + +#Set log output level +log.basicConfig(level=log.INFO) +mqtt_log = log.getLogger("MQTT") + +state = 0 +def sub_cb(topic, msg): + global state + mqtt_log.info("Subscribe Recv: Topic={},Msg={}".format(topic.decode(), msg.decode())) + +if __name__ == '__main__': + utime.sleep(5) + checknet.poweron_print_once() + checknet.wait_network_connected() + c = MQTTClient("umqtt_client", "mq.tongxinmao.com", 18830) + c.set_callback(sub_cb) + c.connect() + while True: + c.subscribe(b"/public/TEST/quecpython") + mqtt_log.info("Connected to mq.tongxinmao.com, subscribed to /public/TEST/quecpython topic") + #Release news + c.publish(b"/public/TEST/quecpython", b"my name is Quecpython!") + mqtt_log.info("Publish topic: /public/TEST/quecpython, msg: my name is Quecpython") + c.wait_msg() #Blocking function, listening for messages + if state == 1: + break + c.disconnect() +``` + +## Other frequently asked questions about quecpthon part I + +### After getting the development board, I don't know how to use it + +Refer to the instruction document of the corresponding development board at the download address:[ https://python.quectel.com/download.html ](https://python.quectel.com/download.html)。 + +### Serial port position of ec100y development board and ec100y module + +The serial port location of ec100y development board (little bear pie) is shown in the figure below: + +![image-20210312134000186](media/image-20210312134000186.png) + +For the serial port position of ec100y module, refer to quectel_ EC100Y-CN_ Quecopen hardware design manual v1.0 (can be downloaded from the group file of the mobile quecpthon Development Exchange Group). + +### Serial port position of ec600s development board and ec600s module + +Ec600s development board (ec600s)_ QuecPython_ EVB_ The serial port location of V1. X development board) is shown in the figure below: + + ![image-20210312134025628](media/image-20210312134025628.png) + +For the serial port position of ec600s module, refer to quectel_ EC600S-CN_ Quecopen hardware design manual v1.0.0_ Preliminary_ 20200927 (you can download it from the group file of the mobile quecpthon Development Exchange Group): + +### Description of GPIO correspondence of quecpython + +#### Find the specific location on the development board according to the schematic diagram + +Step 1: look at the correspondence between the GPIO and the pin pin (located in the pin module of the API library, the GPIO name of quecpthon is on the left, and the pin pin number of the module is on the right). For example, if you want to use the gpio6 of quecpthon, look at this figure. What you know is that the gpio6 corresponds to the pin15 of the module; + img + +The second step is to look at the schematic diagram of ec600sv1.1 (the black part needs no attention, only the part in the red circle). For the quecpthon gpio6 (pin15) just mentioned, here we focus on the gpio77 corresponding to pin15 (in fact, gpio77 has no special meaning, but only represents a connection relationship, that is, the gpio77 here corresponds to the gpio77 in the figure below). + img + img + Step 3: gpio77 in the last figure above corresponds to gpio77 (J6 of the development board) exported from the development board. + Summary: configure gpio6 of quecpthon and check whether the configuration is effective at gpio77 on the development board. + +#### Find out the corresponding GPIO port according to the screen printing of the development board + +For example, I want to find the GPIO port of quecpthon corresponding to g81 on the development board (if the corresponding GPIO is not found according to the following method, it indicates that it has not been opened yet). + +The first step is to look at the schematic diagram. The schematic diagram corresponding to g81 of the development board is gpio81. As shown in the figure below, gpio81 corresponds to pin16 (please ignore the GPIO ID in the blue box and remember pin16) + +![img](media/clip_image008-1615527701161.jpg)![img](media/clip_image010-1615527701161.jpg) + +The second step is to look at the schematic diagram. The schematic diagram corresponding to g81 of the development board is gpio81. As shown in the figure below, gpio81 corresponds to pin16 ** (please ignore the GPIO ID in the blue box and remember pin16)** + +Step 3: go to the official website of quecpthon and find the API library of pin( https://python.quectel.com/wiki/#/zh -cn/api/QuecPythonClasslib?id=pin) + +As shown in the figure below, ** if you want to control g81, you need to configure gpio7 **. + +![img](media/clip_image012-1615527701161.jpg) + + + + + +### Usocket usage + +Usocket module provides access to BSD socket interface and supports communication methods such as address binding, listening, connection, data receiving and sending of socket. For details, see the quecpthon API class library documentation and the use of the usocket module. + +Code example: + +```python +#Import usocket module +import usocket +import log + +#Set log output level +log.basicConfig(level=log.INFO) +socket_log = log.getLogger("SOCKET") + +#Create a socket instance +sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) +#Resolve domain name +sockaddr = usocket.getaddrinfo('www.tongxinmao.com', 80)[0][-1] +#Establish connection +sock.connect(sockaddr) +#Send message to server +ret = sock.send('GET /News HTTP/1.1\r\nHost: www.tongxinmao.com\r\nAccept-Encoding: deflate\r\nConnection: keep-alive\r\n\r\n') +socket_log.info('send %d bytes' % ret) +#Receive server messages +data = sock.recv(256) +socket_log.info('recv %s bytes:' % len(data)) +socket_log.info(data.decode()) + +#Close connection +sock.close() +``` + +Example of operation results: + + ![image-20210312135703298](media/image-20210312135703298.png) + +### Does quecpthon support queues + +​ Queue is a first in first out data structure. The main operations include entering and leaving the queue. Join the elements of the team to the tail, and take out the elements of the team from the head of the team. In quecpthon, we can use the list operation to simulate the queue: + +```python +class queue: + def __init__(self): + self.__alist = [] + + def push(self, value): + self.__alist.insert(0, value) + + def pop(self): + return self.__alist.pop() + + def size(self): + return len(self.__alist) + + def clean(self): + self.__alist.clear() + + def isEmpty(self): + return self.__alist == [] + + def showQueue(self): + print(self.__alist) +``` + +function: + +```python +if __name__ == '__main__': + q = queue() + q.push(1) + q.push("123") + q.push("456") + q.push(2) + q.showQueue() + print(q.pop()) + print(q.pop()) + print(q.pop()) + print(q.pop()) + q.showQueue() +``` + +### Socket parsing IP failed + +![image-20210312135803677](media/image-20210312135803677.png) + +When using socket, mqtt and other related network connection APIs, IP resolution failure will occur, resulting in the above exception. + +Locate the problem direction: check whether the SIM card is successfully registered and the validity of the address, and try again. + +The at command to query whether the network is successfully stationed, [** at + cops** [query whether the network is resident] + +### Syntax error when executing script file + + ![image-20210312135817816](media/image-20210312135817816.png) + +Cause: probably because Python syntax indentation error (4 spaces indentation) + +Troubleshooting method: check whether the code format indentation is standard + +It is recommended to use pycharm or vscode for development. The IDE will prompt syntax indentation and basic syntax errors. + +### Network request failure after SIM card plugging + +At present, ec100y does not support the hot plug function of SIM card, so if our SIM card needs to be re plugged, we need to manually restart the module to re inject the network. + +### Is the source file of quecpthon safe + +Qpycom download tool has code obfuscation encryption function to ensure that user programs are not directly exposed. + +### There is no response in qpycom operation + +Check whether the selected serial port is correct and open. + +### Can the flow cards sent by the development board be mixed + +The machine card is bound, and the network injection is bound at the first startup. + +### What tools are used to write Python code + +It is recommended to use pycharm or vscode, two popular ides with automatic completion function. + +### The serial port connected to the board cannot communicate + +Pay attention to whether the interface is 1.8V or 3.3V. Only when the level is matched can the communication be normal. + +### Connect the USB cable and the light is not on + +Check the module voltage, ensure that the 3.8V voltage of the module is stable, and supply power with battery if necessary. + +### The upper right LED of the little bear pie lights up + +```python +>>> from machine import Pin +>>> gpio = Pin(Pin.GPIO15, Pin.OUT, Pin.PULL_DISABLE, 0) +>>> gpio.write(1) +0 +>>> gpio.read() +1 +``` + +### Differences between ec600s CNAA and cnlb + +CNAA is 4G + 2G, flash is larger, cnlb is 4G, flash is smaller + +### apn_ What's in cfg.json + +The built-in APN list cannot be deleted + +### Syntax error dragging file to module + +Please check the syntax of ". Py" file (mostly indentation) + +### Explanation of socket's [0] [- 1] + +```python +>>> import usocket +>>> client = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) +>>> sockaddr = usocket.getaddrinfo('www.tongxinmao.com',80)[0][-1] + +>>> print(sockaddr) +('120.76.100.197', 80) +>>> sockaddr = usocket.getaddrinfo('www.tongxinmao.com',80) +>>> print(sockaddr) +[(2, 1, 0, 'www.tongxinmao.com', ('120.76.100.197', 80))] +``` + +For example: + +```python +a = ((A,B,C),(2),(3)) +a[0] = (A,B,C) +a[0][-1] = C +``` + +## QuecPython other frequently asked questions Part 2 + +### "Failed to execute script PYI" appears when win7 runs qpycom_ rth_ multiprocessing” + +Symptom: after Python is packaged by pyinstaller, it fails to run "failed to execute script PYI" on other computers_ rth_ Multiprocessing ": this problem occurs when running on a lower version of Windows 7. There is no problem porting programs on win10. + +Fault analysis: it is suspected that the version of some DLL files in windows is too low and does not support exe generated by higher version. The simplest method is to type an EXE separately on win7 machine, then run it on win7 and transplant it. + +The recommended method for customers is to upgrade win7 version to Sp1 + +### Net. Nitztime() + +After the network is successfully attached, the base station sends it once (only once) + +### For quecpthon board of ec600sv1.1, precautions for testing TTS function + +The peripheral is connected to the speaker, but the "microphone" is configured in the TTS + +Since a power amplifier is added to v1.1, it is necessary to pull up the pin58 (enable pin of power amplifier) of the socket of the module (hardware) or command to enable "audio"_ EN = Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_ PD, 1)” + +The power of external horn is limited, and it is recommended to be less than 8R 2W + +### If at configuration is required, + +**at+qaudmod=0 //spk** + +**at+qaudmod=1 //hs** + +**at+qaudmod=2 //loudspeaker** + +The following needs to be understood later + +AT+QAUDPATH=0 + +AT+QAUDDCH=0 + +### Calls to multiple. Py files + +For the two files under the usr directory, a.py and b.py, if you want to call b.py in a.py again, you need to add the following code in a.py. + +```python +#Method 1 +from usr import b +#Method 2 +import sys +sys.path.append('/usr/') #Enter the usr directory +import b +``` + +### Is there a limit on the number of threads? + +Up to 16 + +### How to operate the file system + +The root directory / is unreadable and writable, / usr is the user area, / bak is the backup area + +### How many bytes can the serial port accept at a time? + +2000 bytes actually received is OK; The maximum sending is 512, exceeding the automatic subcontracting; Socket and mqtt can send and receive 2000 bytes + +### Will the data listening of socket, mqtt and serial port block other threads + +Socket and mqtt are blocking functions and will not block other threads. + +The serial port itself is a 'non blocking function' and will not block other threads. + +### Explanation of parameters returned by base station location + +```python +>>> cellLocator.getLocation("www.queclocator.com", 80, "1111111122222222", 8, 1) +(117.1138, 31.82279, 550) +``` + +What does the returned result mean + +Positioning accuracy in M + +### Does the depth of the quecpthon queue have a maximum value? For example, if the callback happens all the time, will it be lost? + +Automatic growth with memory + +### Does the pin of the module have a description document of the default level + +We open out that IO is currently the default output low level + +### How about RTC time of ec600s module? Power off endurance + +There is no way to maintain the battery life in case of power failure, because RTC is led out + + + + + + diff --git a/docs/FAQ/en/sidebar.yaml b/docs/FAQ/en/sidebar.yaml new file mode 100644 index 0000000000000000000000000000000000000000..1d4b3d82a226fa45d03f5b88a70fc5244a2dabec --- /dev/null +++ b/docs/FAQ/en/sidebar.yaml @@ -0,0 +1,24 @@ +# FAQ frequently asked questions +items: + - label: participation and contribution + items: + - label: gitee submission code and document editing process + file: README.md + - label: gitee issue tutorial + file: gitee_issue/gitee_issue.md + - label: QuecPython_FAQ + items: + - label: quecpthon FAQ Part 1 + file: QP_common_question01/QP_common_question01.md + - label: quecpthon FAQ Part 2 + file: QP_common_question02/QP_common_question02.md + - label: quecpthon driver firmware script Download + file: QP_download/QP_download.md + - label: quecpthon driver installation failed. Problem solving + file: QP_driver_failed/QP_driver_failed.md + - label: quecpthon brick rescue treatment + file: QP_recovery/QP_recovery.md + - label: quecpthon test problem + file: QP_test/QP_test.md + - label: Format_String + file: Format_String/Format_String.md diff --git a/docs/FAQ/zh/Format_String/Format_String.md b/docs/FAQ/zh/Format_String/Format_String.md new file mode 100644 index 0000000000000000000000000000000000000000..656aa4ef2b986cb39f01a20708c057b1542ed57b --- /dev/null +++ b/docs/FAQ/zh/Format_String/Format_String.md @@ -0,0 +1,177 @@ +## 修订历史 + +| 版本 | 日期 | 作者 | 变更表述 | +| ---- | --------- | ----- | ------------------------------------------------------------ | +| 1.0 | 2021-4-07 | David | 首次编写,包括位运算、字符串与十六进制转换、以及Struct的说明 | + +对于字符串与十六进制之间的转换需求,特编写这篇文档,详细介绍相关知识。 + +## 位运算 + +首先介绍位运算,计算机内所有的数都以二进制存储,位运算就是对二进制位的操作。在python中主要包括:按位与运算符、按位或运算符、 按位异或运算符、按位取反运算符、左移动运算符、右移动运算符。具体的介绍可参考:[位运算](https://blog.csdn.net/csdn_edition/article/details/109402978) + +### 按位与运算符 + + 按位与运算符&:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0。举例说明如下: + +```python +>>> a= 60 +>>> b= 13 +>>> a & b +12 +``` + +### 按位或运算符 + +按位或运算符|:只要对应的二个二进位有一个为1时,结果位就为1。 + +```python +>>> a=60 +>>> b= 13 +>>> a | b +61 +``` + +### 按位异或运算符 + +按位异或运算符:当两对应的二进位相异时,结果为1 + +```python +>>> a=60 +>>> b= 13 +>>> a ^ b +49 +``` + +### 按位取反运算符 + + 按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1 。**~x** 类似于 **-x-1** + +```python +>>> a=60 +>>> ~a +-61 +``` + +### 左移动运算符 + +左移动运算符:运算数的各二进位全部左移若干位,由 **<<** 右边的数字指定了移动的位数,高位丢弃,低位补0。 + +```python +>>> a=60 +>>> a << 2 +240 +``` + +### 右移动运算符 + +右移动运算符:把">>"左边的运算数的各二进位全部右移若干位,**>>** 右边的数字指定了移动的位数 + +```python +>>> a=60 +>>> a >> 2 +15 +``` + +还有位运算,struct的用法,所以写个demo还是有必要的哦。这是一项通过将设备置于从高温到低温的快速改变环境中或反之变换来测试机器和焊接部分的可靠性 + +## 字符串与十六进制 + +### 字符串与十六进制转换的封装 + +对于字符串与十六进制之间的相互转换,由于python没有对应的封装,这里封装一个类供大家使用: + +```python +str_test = 'Quectel build a smarter world' +class String: + def to_hex(a, b=""): # 可实现的功能:转成HEX格式,可选择加上需要的分隔符 + Hex = ''.join([hex(ord(c)).replace('0x', b) for c in a]) + return Hex,len(a) + + def from_hex(a,b=''): # 可实现的功能:转成STR,如果有分隔符,可以添加分割符参数转换 + Str = ''.join([chr(int(c.replace(b, ''), 16)) for c in [a[i:i+2+len(b)] for i in range(0, len(a), 2+len(b))]]) + return Str + +hex_test = String.to_hex(str_test) +print(type(hex_test[0])) +print(hex_test[1]) +print(hex_test) + +hex_test = str(hex_test[0]) +str_test = String.from_hex(hex_test) +print(str_test) +``` + +### 字符串与十六进制转换的应用(待完善) + +当然转换后的HEX无法串口直接接收解析,仍需要一定的转换,下面基于EC600SCNLB模组做个简单的实验 + +```python +str_test = 'Quectel build a smarter world' +def str_to_hex(s): + list_hex = ' '.join([hex(ord(c)) for c in s]).split() + list = [int(i,16) for i in list_hex] + bytearr = bytearray(list) + return bytearr +hex_test = str_to_hex(str_test) +``` + +​ 1.编写如下代码并命名为str_hex_test.py。 + +```python +from machine import UART +uart0 = UART(UART.UART0, 115200, 8, 0, 1, 0) +str_test = 'Quectel build a smarter world' +def str_to_hex(s): + list_hex = ' '.join([hex(ord(c)) for c in s]).split() + list = [int(i,16) for i in list_hex] + bytearr = bytearray(list) + return bytearr +hex_test = str_to_hex(str_test) +uart0.write(hex_test) +``` + +​ 2.下载上述文件到模组中运行,并打开串口调试工具(此处使用UartAssist) + +image-20210407143228884 + +image-20210407144219267 + +3.运行程序,在串口工具中查看结果 + +image-20210407144126291 + +**Tips:** + +如果使用ASCII接收的话,就会显示字符串形式 + +​ 4.对于模组的串口接收:无论串口工具发送ASCII或者HEX数据,串口读取都是bytes型数据 + +![image-20210407151559820](media/uart_read.png) + +## 编解码 + +对于编解码,常见的有ASCII、UTF-8、GBK等等,python已经有了对应的封装,这里简单的介绍一下,也可以参考 [encode and decode](https://blog.csdn.net/qq_26442553/article/details/94440502): + +```python +import ubinascii as binascii +import ustruct as struct + +def example(express, result=None): + if result == None: + result = eval(express) + print(express, ' ==> ', result) +if __name__ == '__main__': + print('编解码:') + print("str to utf-8", end=': '); + example("u'小明'.encode('utf-8')") + print("utf-8 to str", end=': '); + s_utf = b'\xe5\xb0\x8f\xe6\x98\x8e' + example("s_utf.decode('utf-8')") + print("类似的还有encode('gbk'),decode('gbk'),encode('gb2312'),decode('gb2312')") + +``` + +## 二进制与ASCII转换、打包与解压 + +对于[二进制与ASCII转换](https://python.quectel.com/wiki/#/zh-cn/api/pythonStdlib?id=ubinascii-二进制与ascii转换)和[ustruct - 打包和解压原始数据类型](https://python.quectel.com/wiki/#/zh-cn/api/pythonStdlib?id=ustruct-打包和解压原始数据类型),在模组的固件中已经有了封装。 \ No newline at end of file diff --git a/docs/FAQ/zh/Format_String/media/UartAssist.png b/docs/FAQ/zh/Format_String/media/UartAssist.png new file mode 100644 index 0000000000000000000000000000000000000000..95d51c3d8dd3f9035688e5ac945519459011680c Binary files /dev/null and b/docs/FAQ/zh/Format_String/media/UartAssist.png differ diff --git a/docs/FAQ/zh/Format_String/media/dirver_setup.png b/docs/FAQ/zh/Format_String/media/dirver_setup.png new file mode 100644 index 0000000000000000000000000000000000000000..5c64e95704bd913477136297efdd237de67afbe6 Binary files /dev/null and b/docs/FAQ/zh/Format_String/media/dirver_setup.png differ diff --git a/docs/FAQ/zh/Format_String/media/file_download.png b/docs/FAQ/zh/Format_String/media/file_download.png new file mode 100644 index 0000000000000000000000000000000000000000..ae3d1ab20339489871623fa38631d5efd5af0a2b Binary files /dev/null and b/docs/FAQ/zh/Format_String/media/file_download.png differ diff --git a/docs/FAQ/zh/Format_String/media/str_hex_result.png b/docs/FAQ/zh/Format_String/media/str_hex_result.png new file mode 100644 index 0000000000000000000000000000000000000000..41442a593cd957cf457af1b69ebc9ccba27e2a2f Binary files /dev/null and b/docs/FAQ/zh/Format_String/media/str_hex_result.png differ diff --git a/docs/FAQ/zh/Format_String/media/uart_read.png b/docs/FAQ/zh/Format_String/media/uart_read.png new file mode 100644 index 0000000000000000000000000000000000000000..f17f3bfd40c75334b617219016d39a22c6fe657c Binary files /dev/null and b/docs/FAQ/zh/Format_String/media/uart_read.png differ diff --git a/docs/FAQ/zh/QP_common_question01/QP_common_question01.md b/docs/FAQ/zh/QP_common_question01/QP_common_question01.md new file mode 100644 index 0000000000000000000000000000000000000000..20ab054647032d0f02b7e3c1dd4a78746a84c707 --- /dev/null +++ b/docs/FAQ/zh/QP_common_question01/QP_common_question01.md @@ -0,0 +1,189 @@ +## 设备管理器只有两个口 + +原因分析:固件下载是需要选择压缩包,这是没错的。但是官网下载的固件包一般都是需要解压的,里面包含固件(压缩包形式)和changelog + +解决方法:对于官网下载的压缩进行解压,烧录时确保固件满足下面几点: + +1. 选择的固件是一个压缩包 +2. 固件的下一级目录全部是.bin等等,也就是说固件里面无额外的压缩包。(可能存在官网下载的固件需要解压再进行下一步) + +## GPS的API接口文档在哪 + +对于GPS,实际上是串口的读写配置等等,是没有对应的API文档的,可以在群文件下载对应的资料 + +![image-20210412165603072](media/GPS_file.png) + +## EC100Y开发板与模组串口对应图 + +EC100Y开发板(小熊派)的串口位置如下图: + +![image-20210312134000186](media/EC100Y_UART.png) + +EC100Y模组的串口位置可参考《Quectel_EC100Y-CN_QuecOpen硬件设计手册V1.0》(可在移远QuecPython开发交流群的群文件自行下载)。 + +## EC600S开发板与模组串口对应图 + +EC600S开发板(EC600S_QuecPython_EVB_V1.x 开发板)的串口位置如下图: + + ![image-20210312134025628](media/EC600SV1.1_UART.png) + +EC600S模组的串口位置可参考《Quectel_EC600S-CN_QuecOpen硬件设计手册V1.0.0_Preliminary_20200927》(可在移远QuecPython开发交流群的群文件自行下载): + +## GPIO对应关系说明 + +### 对照原理图,在开发板找到具体位置 + +第一步,看这个GPIO与PIN脚的对应关系(位置在API库的PIN模块,左侧是QuecPython的GPIO命名,右侧是模组的PIN脚号),例如你想使用QuecPython的GPIO6,那么看了这个图,你知道的是GPIO6对应的是模组的PIN15; + img + +第二步看,EC600SV1.1的原理图,(黑色部分无需关注,只需要关注红色圈的部分),对于刚刚说的QuecPython的GPIO6(PIN15),这里关注的是PIN15对应的GPIO77(实际上GPIO77没有特别的含义,只是表示一个连接关系,也就是此处的GPIO77对应于下图中的GPIO77)。 + img + img + 第三步,上方最后一个图的GPIO77,也就对应开发板引出的GPIO77(开发板的J6处)。 + 总结:配置QuecPython的GPIO6,在开发板的GPIO77处查看配置是否生效。 + +### 对照开发板丝印,找出对应的GPIO口 + +例如我想找开发板上的G81对应QuecPython的哪个GPIO口(如果按照下面方法没有找到对应的GPIO,那说明暂时还未开放)。 + +第一步,看原理图,开发板的G81对应原理图就是GPIO81。如下图所示,GPIO81对应的是PIN16(请忽略蓝色框的GPIO标识,记住PIN16) + +![img](media/GPIO04.jpg)![img](media/GPIO05.jpg) + +第二步,看原理图,开发板的G81对应原理图就是GPIO81。如下图所示,GPIO81对应的是PIN16**(请忽略蓝色框的GPIO标识,记住PIN16)** + +第三步,进入QuecPython的官网,找到PIN的API库(https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=pin) + +如下图所示,**如果你要控制G81,就需要配置GPIO7**。 + +![img](media/GPIO06.jpg) + + + + + +## usocket使用 + +usocket 模块提供对BSD套接字接口的访问,支持对socket的地址绑定、监听、连接、数据接收和发送等通信方法。详细可参见:QuecPython API类库文档usocket模块的使用。 + +代码示例: + +```python +# 导入usocket模块 +import usocket +import log + +# 设置日志输出级别 +log.basicConfig(level=log.INFO) +socket_log = log.getLogger("SOCKET") + +# 创建一个socket实例 +sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) +# 解析域名 +sockaddr = usocket.getaddrinfo('www.tongxinmao.com', 80)[0][-1] +# 建立连接 +sock.connect(sockaddr) +# 向服务端发送消息 +ret = sock.send('GET /News HTTP/1.1\r\nHost: www.tongxinmao.com\r\nAccept-Encoding: deflate\r\nConnection: keep-alive\r\n\r\n') +socket_log.info('send %d bytes' % ret) +# 接收服务端消息 +data = sock.recv(256) +socket_log.info('recv %s bytes:' % len(data)) +socket_log.info(data.decode()) + +# 关闭连接 +sock.close() +``` + +运行结果示例: + + ![image-20210312135703298](media/usocket.png) + +## QuecPython是否支持队列 + +​ 队列是一种先进先出的数据结构,主要操作包括入队,出队。入队的元素加入到对尾,从队头取出出队的元素。在QuecPython中我们可以使用list操作来模拟队列: + +```python +class queue: + def __init__(self): + self.__alist = [] + + def push(self, value): + self.__alist.insert(0, value) + + def pop(self): + return self.__alist.pop() + + def size(self): + return len(self.__alist) + + def clean(self): + self.__alist.clear() + + def isEmpty(self): + return self.__alist == [] + + def showQueue(self): + print(self.__alist) +``` + +运行: + +```python +if __name__ == '__main__': + q = queue() + q.push(1) + q.push("123") + q.push("456") + q.push(2) + q.showQueue() + print(q.pop()) + print(q.pop()) + print(q.pop()) + print(q.pop()) + q.showQueue() +``` + +## socket解析IP失败 + +![image-20210312135803677](media/socket_IP.png) + +使用socket、mqtt等相关网络连接的API时会出现IP解析失败导致出现上图异常。 + +定位问题方向:检查SIM卡是否注网成功以及检查该地址的有效性再次进行尝试。 + +查询驻网是否成功的AT指令,【**AT+cops?** 查询是否驻网】 + +## 执行脚本文件提示语法错误 + + ![image-20210312135817816](media/syntax_error.png) + +导致原因:大概率是因为Python语法缩进错误(4个空格缩进) + +排查方法:检查代码格式缩进是否规范 + +推荐使用:PyCharm或VsCode来进行开发,IDE会提示语法缩进与基本语法上的错误。 + +## SIM卡进行插拔后网络请求失败 + +因为目前EC100Y暂不支持SIM卡热插拔功能,所以如果我们的SIM卡在重新插拔后需要手动重启模块才能重新注网。 + +## QuecPython的源码文件安全吗 + +QPYcom下载工具有代码混淆加密功能,确保用户程序不被直接暴露。 + +## 在QPYcom操作没有任何反应 + +检查选择的串口是否正确并已打开。 + +## 编写python代码用什么工具 + +推荐使用pycharm或VScode,两款比较流行的IDE,自带自动补全功能。 + +## 板子接出的串口无法通信 + +要注意接口是1.8V还是3.3V,电平匹配才能正常通信。 + +## 接上USB线灯不亮 + +检查模块电压,保证模组的3.8V电压稳定,必要时用电池供电。 \ No newline at end of file diff --git a/docs/FAQ/zh/QP_common_question01/media/EC100Y_UART.png b/docs/FAQ/zh/QP_common_question01/media/EC100Y_UART.png new file mode 100644 index 0000000000000000000000000000000000000000..4f5048d5699ba70e60d494609bffea847ba435a9 Binary files /dev/null and b/docs/FAQ/zh/QP_common_question01/media/EC100Y_UART.png differ diff --git a/docs/FAQ/zh/QP_common_question01/media/EC600SV1.1_UART.png b/docs/FAQ/zh/QP_common_question01/media/EC600SV1.1_UART.png new file mode 100644 index 0000000000000000000000000000000000000000..7b700cbbda72524f9ad959c6ead9bc4793dc57d8 Binary files /dev/null and b/docs/FAQ/zh/QP_common_question01/media/EC600SV1.1_UART.png differ diff --git a/docs/FAQ/zh/QP_common_question01/media/GPIO01.jpg b/docs/FAQ/zh/QP_common_question01/media/GPIO01.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bfaa7745cb2083b52b3f7cb912e82f2c5cad7ed0 Binary files /dev/null and b/docs/FAQ/zh/QP_common_question01/media/GPIO01.jpg differ diff --git a/docs/FAQ/zh/QP_common_question01/media/GPIO02.jpg b/docs/FAQ/zh/QP_common_question01/media/GPIO02.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ae599847ff28ea44278d011564f8ea6f68ee4425 Binary files /dev/null and b/docs/FAQ/zh/QP_common_question01/media/GPIO02.jpg differ diff --git a/docs/FAQ/zh/QP_common_question01/media/GPIO03.jpg b/docs/FAQ/zh/QP_common_question01/media/GPIO03.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4465058efe9c6888f9b54aea72b2ce048294623e Binary files /dev/null and b/docs/FAQ/zh/QP_common_question01/media/GPIO03.jpg differ diff --git a/docs/FAQ/zh/QP_common_question01/media/GPIO04.jpg b/docs/FAQ/zh/QP_common_question01/media/GPIO04.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b5a4631fc16244eb6a9edae717daaaed8ced61a4 Binary files /dev/null and b/docs/FAQ/zh/QP_common_question01/media/GPIO04.jpg differ diff --git a/docs/FAQ/zh/QP_common_question01/media/GPIO05.jpg b/docs/FAQ/zh/QP_common_question01/media/GPIO05.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f368c332062aeadbd5f0089a51ed07e75555d5cb Binary files /dev/null and b/docs/FAQ/zh/QP_common_question01/media/GPIO05.jpg differ diff --git a/docs/FAQ/zh/QP_common_question01/media/GPIO06.jpg b/docs/FAQ/zh/QP_common_question01/media/GPIO06.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dcf75a760f986dccbd0ed06a4b057381755586c0 Binary files /dev/null and b/docs/FAQ/zh/QP_common_question01/media/GPIO06.jpg differ diff --git a/docs/FAQ/zh/QP_common_question01/media/GPS_file.png b/docs/FAQ/zh/QP_common_question01/media/GPS_file.png new file mode 100644 index 0000000000000000000000000000000000000000..95ceb17fb12a393311064e02b4987633d5e3f4a9 Binary files /dev/null and b/docs/FAQ/zh/QP_common_question01/media/GPS_file.png differ diff --git a/docs/FAQ/zh/QP_common_question01/media/socket_IP.png b/docs/FAQ/zh/QP_common_question01/media/socket_IP.png new file mode 100644 index 0000000000000000000000000000000000000000..0f7d4b0b96301b5651f321bfd57d85f2239e454e Binary files /dev/null and b/docs/FAQ/zh/QP_common_question01/media/socket_IP.png differ diff --git a/docs/FAQ/zh/QP_common_question01/media/syntax_error.png b/docs/FAQ/zh/QP_common_question01/media/syntax_error.png new file mode 100644 index 0000000000000000000000000000000000000000..408a19251112775c9b8a4682701b6a4a4079eb0c Binary files /dev/null and b/docs/FAQ/zh/QP_common_question01/media/syntax_error.png differ diff --git a/docs/FAQ/zh/QP_common_question01/media/usocket.png b/docs/FAQ/zh/QP_common_question01/media/usocket.png new file mode 100644 index 0000000000000000000000000000000000000000..4a83bc67936d660f08718183998fe308e4d4dcbf Binary files /dev/null and b/docs/FAQ/zh/QP_common_question01/media/usocket.png differ diff --git a/docs/FAQ/zh/QP_common_question02/QP_common_question02.md b/docs/FAQ/zh/QP_common_question02/QP_common_question02.md new file mode 100644 index 0000000000000000000000000000000000000000..cdbdb5674095b4b87aa817211ccc15ad75f8f2db --- /dev/null +++ b/docs/FAQ/zh/QP_common_question02/QP_common_question02.md @@ -0,0 +1,123 @@ +## apn_cfg.json里面是什么 + +内置的apn列表,不可删除 + +## 拖动文件到模组出现语法错误 + +请检查“.py”文件的语法问题(多数是缩进问题) + +## 对Socket的[0] [-1]的解释 + +```python +>>> import usocket +>>> client = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) +>>> sockaddr = usocket.getaddrinfo('www.tongxinmao.com',80)[0][-1] + +>>> print(sockaddr) +('120.76.100.197', 80) +>>> sockaddr = usocket.getaddrinfo('www.tongxinmao.com',80) +>>> print(sockaddr) +[(2, 1, 0, 'www.tongxinmao.com', ('120.76.100.197', 80))] +``` + +举例说明: + +```python +a = ((A,B,C),(2),(3)) +a[0] = (A,B,C) +a[0][-1] = C +``` + +## win7运行QPYcom出现“failed to execute script pyi_rth_multiprocessing” + +故障现象:python通过pyinstaller打包后,在别的电脑运行失败“failed to execute script pyi_rth_multiprocessing”:在低版本windows7上运行会出现这个问题,在win10上面移植程序没问题。 + +故障分析:怀疑是windows某些dll文件版本过低,不支持高版本生成的exe,最简单的方法是:在win7机器上单独打个exe,然后在win7运行,移植。 + +建议客户的方法是:升级win7版本到sp1 + +## net.nitzTime()的获取 + +成功附着网络之后,基站下发一次(仅此一次) + +## 对于EC600SV1.1的QuecPython板子,测试TTS功能注意事项 + +外设是接的喇叭,但是在TTS中配置的是“话筒” + +由于V1.1上面加了一个功放,此时需要拉高模组(硬件拉高)socket的pin58(功放的使能脚),或者指令使能“audio_EN = Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1)” + +外接的喇叭是功率是有限制的,建议小于8R 2W + +### 如果需要AT配置的话, + +**at+qaudmod=0 //spk** + +**at+qaudmod=1 //hs** + +**at+qaudmod=2 //loudspeaker** + +下面需要后面加以理解 + +AT+QAUDPATH=0 + +AT+QAUDDCH=0 + +## 对于多.py文件的调用 + +对于usr目录下的两个文件a.py和b.py,如果想再a.py中调用b.py的话:需要在a.py里面加上下面代码 + +```python +#方法1 +from usr import b +#方法2 +import sys +sys.path.append('/usr/') # 进入usr目录下 +import b +``` + +## 线程有个数限制? + +最多16个 + +## 如何对文件系统进行操作 + +根目录/是不可读不可写的,/usr是用户区,/bak是备份区 + +## 串口一次最多可以接受多少字节? + +实测接收2000字节也行;发送最大512,超过自动分包;socket、MQTT收发2000字节也行 + +## Socket、MQTT、串口的数据监听会不会阻塞其他线程 + +Socket、MQTT本身是‘阻塞函数’,不会阻塞其他线程。 + +串口本身是‘非阻塞函数’,不会阻塞其他线程。 + +## 基站定位返回的参数解释 + +```python +>>> cellLocator.getLocation("www.queclocator.com", 80, "1111111122222222", 8, 1) +(117.1138, 31.82279, 550) +``` + +返回的550结果是什么意思 + +定位精度,单位m + +## QuecPython队列的深度有最大值吗?比如一直发生回调,会不会丢失? + +随内存自动增长 + +## 模块的Pin有没有默认电平的说明文档 + +我们开放出来IO目前是 默认输出低电平 + +## EC600S的模块RTC时间怎么样断电续航 + +断电没有办法续航,因为EC600S没有RTC引脚 + + + + + + \ No newline at end of file diff --git a/docs/FAQ/zh/QP_download/QP_download.md b/docs/FAQ/zh/QP_download/QP_download.md new file mode 100644 index 0000000000000000000000000000000000000000..af8897d21042a8ae5aa9ed661da05a9616a15a4e --- /dev/null +++ b/docs/FAQ/zh/QP_download/QP_download.md @@ -0,0 +1,56 @@ +## 驱动下载安装 + +对于驱动下载,注意以下几点说明: + +1. 具体的步骤可参考开发板的使用说明,例如:[EC600X开发板使用说明](http://127.0.0.1:2333/doc/doc/Quecpython_intro/zh/Qp_Hw_EC600X/Hardware_Support_EC600X.html#usb) +2. “QuecPython驱动安装失败问题”见“[QuecPython驱动安装失败问题解决](../QP_driver_failed/QP_driver_failed.html)”章节 + +3. 安装前,请备份您的重要文件,并保存您的工作进度,以免发生意外情况,导致文件丢失 + +4. 安装成功后,无需重启电脑 + +5. 如需修复或者卸载驱动程序,再次运行该驱动安装程序,选择“修复”或“卸载” 即可 + + +## 固件下载烧录 + +对于固件烧录,注意以下几点说明: + +1. 具体的步骤可参考开发板的使用说明,例如:[EC600X开发板使用说明](http://127.0.0.1:2333/doc/doc/Quecpython_intro/zh/Qp_Hw_EC600X/Hardware_Support_EC600X.html#-17) +2. 对于所有模组,出产的固件多数是AT标准固件,如果您需要进行python开发,则需要烧录python固件,具体的烧录参考上一条 +3. QPYcom工具支持烧录pythonn固件,不支持烧C固件或者AT标准固件 +4. “QuecPython固件安装失败问题”见“[QuecPython救砖处理](../QP_recovery/QP_recovery.html)”章节 +5. 安装前,请备份您的重要文件,并保存您的工作进度,以免发生意外情况,导致文件丢失 +6. 安装成功后,无需重启电脑 + +## 脚本下载 + +对于脚本下载,注意以下几点说明: + +1. 为了方便脚本下载,QPYcom已经做了脚本拖拽下载的功能,欢迎大家使用,如您有使用问题,可参考《Quectel QuecPython_QPYcom工具使用说明》(此文件可从QPYcom压缩包中获取,路径:\QPYcom_Vx.x.x\docs) + +2. 如果你想一次性下载您的所有脚本,并清除原来的脚本(具体清除哪些脚本,见下面解释),可以按照下面的脚本下载步骤操作 + +3. 对于使用如下脚本下载的步骤,哪些脚本会被删除的解释:对于根目录除了json都会删除,而对于子文件夹(自己新建一个文件夹),脚本下载不会影响这个文件夹。 + +脚本下载步骤: + +(1)用户选择“USB串行设备”后,“打开串口”,点击“下载”按钮,创建项目(项目名称随意)。 + +jioaben_start + +(2)点击“选择固件”(脚本下载暂时是需要选择固件,但是不会下载固件,这一步后面可以省略)。 + +jioaben_choosefirmware + +(3)选择需要下载的脚本 + +jioaben_choosejiaoben + +(4)下载脚本,等待完成 + +jioaben_downloadstart + +(5)完成界面展示 + +jioaben_downloadsuccess \ No newline at end of file diff --git a/docs/FAQ/zh/QP_download/media/jioaben_choosefirmware.png b/docs/FAQ/zh/QP_download/media/jioaben_choosefirmware.png new file mode 100644 index 0000000000000000000000000000000000000000..125048b1d08aa1b36fede9e5aa821a3b0e740a62 Binary files /dev/null and b/docs/FAQ/zh/QP_download/media/jioaben_choosefirmware.png differ diff --git a/docs/FAQ/zh/QP_download/media/jioaben_choosejiaoben.png b/docs/FAQ/zh/QP_download/media/jioaben_choosejiaoben.png new file mode 100644 index 0000000000000000000000000000000000000000..2b1b479b7e6b44ea01340869b1b2d4373beb3b57 Binary files /dev/null and b/docs/FAQ/zh/QP_download/media/jioaben_choosejiaoben.png differ diff --git a/docs/FAQ/zh/QP_download/media/jioaben_downloadstart.png b/docs/FAQ/zh/QP_download/media/jioaben_downloadstart.png new file mode 100644 index 0000000000000000000000000000000000000000..419ecf09c8305f1f144cd5a755f7e33ba2c91280 Binary files /dev/null and b/docs/FAQ/zh/QP_download/media/jioaben_downloadstart.png differ diff --git a/docs/FAQ/zh/QP_download/media/jioaben_downloadsuccess.png b/docs/FAQ/zh/QP_download/media/jioaben_downloadsuccess.png new file mode 100644 index 0000000000000000000000000000000000000000..dd256ff53cf967f9e221d194205eb3bf3f372587 Binary files /dev/null and b/docs/FAQ/zh/QP_download/media/jioaben_downloadsuccess.png differ diff --git a/docs/FAQ/zh/QP_download/media/jioaben_start.png b/docs/FAQ/zh/QP_download/media/jioaben_start.png new file mode 100644 index 0000000000000000000000000000000000000000..7dca2571afbb1a4165c61e28320924ae5ac0a0af Binary files /dev/null and b/docs/FAQ/zh/QP_download/media/jioaben_start.png differ diff --git a/docs/FAQ/zh/QP_driver_failed/QP_driver_failed.md b/docs/FAQ/zh/QP_driver_failed/QP_driver_failed.md new file mode 100644 index 0000000000000000000000000000000000000000..1a928c0444cb0aaddcd1701ecc4b5673dd73eb74 --- /dev/null +++ b/docs/FAQ/zh/QP_driver_failed/QP_driver_failed.md @@ -0,0 +1,11 @@ +**如遇安装好了驱动,但是出现USB枚举失败,解决方式是:** + +1. 确保是官网下载最新的对应的驱动(**win7和win10是不同的,不同芯片平台对应的驱动也不同**) + + 可以参考你的电脑系统和模组芯片平台([硬件支持](https://python.quectel.com/doc/doc/Quecpython_intro/zh/Qp_Product_intro/Hardware_Support.html) 查看芯片平台)下载对应的驱动 + +2. 在“控制面板”——“卸载程序”中,查看驱动是否安装成功,截图是显示安装成功的 + + ![dirver](../QP_recovery/media/dirver.png) + +3. 如果仍存在驱动安装问题,请加入我们的QQ 群 445121768,工程师在线为您答疑解惑 \ No newline at end of file diff --git a/docs/FAQ/zh/QP_helios/HeliosService.md b/docs/FAQ/zh/QP_helios/HeliosService.md new file mode 100644 index 0000000000000000000000000000000000000000..2750c085212d4876ff8fed89bbd3f984f1e1478c --- /dev/null +++ b/docs/FAQ/zh/QP_helios/HeliosService.md @@ -0,0 +1,53 @@ +# HeliosService部分 + +## Q: 怎么获取使用文档和对应的代码资源? + +A: **HeliosService** 现已上传git,地址:[https://gitee.com/quecpython/helios-service](https://gitee.com/quecpython/helios-service),包含api文档、代码、框架使用文档等,后续api会上传官网wiki,代码会上传官网下载中心方便查阅和下载 + +## Q: 新框架支持的平台有哪些? + +A : 新框架基于QuecPython开发,目前支持QuecPython的所有硬件平台上均可运行新框架。 + +## Q: 如何启动容器? + +A : + +1. [OK]为服务启动成功 +2. [FAILED]为服务启动失败 +3. s ![](RackMultipart20210909-4-1h7gwkk_html_ecad561aaded1d02.jpg) ys 和 app 代表服务所属的分区,sys是系统级别的, app是用户级别的 +4. 启动成功的服务我们就可以调用了, 我们也可以查看所有启动成功的服务 + +## Q: 网络服务如何使用? + +A : + +1. 可以直接获取到sim、net、dataCall对象且无需导入库 +2. 可以通过订阅网络服务来监测网络状态等 + +![](RackMultipart20210909-4-1h7gwkk_html_9b5553a09a98b550.jpg)以下代码需先初始化容器后执行,具体用法参考API文档,其他服务也可参考这个示例,如日志服务、媒体服务、异常服务等。 + +## Q: sys\_bus模块是否可以直接使用? + +A: 该模块是公版固件默认有的组件,可以直接通过import sys\_bus来使用,同样可以直接import使用的模块还有queue模块,详细用法参见wiki + +## Q: 三方组件的用法和用处? + +A: 目前三方组件主要有gpio, 中断, 定时器, 看门狗的封装, 还有安全组件, 断传的封装等,后续也在更新中,用法参见api文档 + +## Q: 初始化服务时报错怎么解决? + +![](RackMultipart20210909-4-1h7gwkk_html_cadfbae19fcddad5.jpg)A: 移远云服务初始化错误由配置引起,按照下图指定格式配置config.json文件后即可正常启动,任意服务启动失败并不影响其他服务的正常运行。 + +## Q: 需要连接云服务时怎么配置config.json配置文件? + +A: 移远cloud服务config.json的内容示例,配置文件的内容读取参见API文档 + +![](RackMultipart20210909-4-1h7gwkk_html_273d4e8d07fc1879.jpg) + +## Q: 有些服务不需要是否可以删除节省模块空间? + +A: service结尾的py文件如果无需使用都可以裁剪,如果不想用此服务,删除即可 + +## Q: ![](RackMultipart20210909-4-1h7gwkk_html_80ef0753e04df68a.jpg)框架的代码怎么在模块中进行调试? + +A: 通过QPYcom\_V1.7版本可以直接将整个框架代码下载到模块中,下载方法参考框架使用文档,修改代码后重新上传运行即可,无需重启模块。 \ No newline at end of file diff --git "a/docs/FAQ/zh/QP_helios/\346\226\260\345\273\272 Microsoft Word \346\226\207\346\241\243.docx" "b/docs/FAQ/zh/QP_helios/\346\226\260\345\273\272 Microsoft Word \346\226\207\346\241\243.docx" new file mode 100644 index 0000000000000000000000000000000000000000..427a86019e9a172461ab5f233dd2987266442b0a Binary files /dev/null and "b/docs/FAQ/zh/QP_helios/\346\226\260\345\273\272 Microsoft Word \346\226\207\346\241\243.docx" differ diff --git a/docs/FAQ/zh/QP_recovery/QP_recovery.md b/docs/FAQ/zh/QP_recovery/QP_recovery.md new file mode 100644 index 0000000000000000000000000000000000000000..7cf5c74d52ce422d79a5e75ae9dbe4c1049d6730 --- /dev/null +++ b/docs/FAQ/zh/QP_recovery/QP_recovery.md @@ -0,0 +1,163 @@ +当使用QPYcom工具下载固件失败后,不用担心板子成砖,我们来帮你救砖。 + +## 可正常显示串口救砖 + +1.打开电脑任务管理器(可快捷键“Ctrl+Alt+Delete”打开),找到QPYcom.exe,强制结束后台任务。 + +2.对于开发板:按住板子上的reset按键,重启板子;对于裸模块,可直接断电再上电,然后拉低POWKEY开机 + +3.看设备管理器的串口列表中是否显示出正常数目的串口,如果原固件是python固件,会正常显示三个串口(AT、DIAG以及USB串行设备口),如下表格左侧截图,如果原固件是非python固件,会正常显示两个串口(AT和DIAG口),如下表格右侧截图。以下的截图都属于正常显示,对于可正常显示的模组,请进行第4步;对于非正常显示的模组,则参考方法2或者方法3。 + +| python固件模组对应的设备管理器 | 非python固件模组对应的设备管理器 | +| ------------------------------- | -------------------------------- | +| ![img](media/clip_image002.jpg) | ![img](media/clip_image004.jpg) | + +4.如果正常显示出串口则重新打开QPYcom.exe工具,参照《Quectel QuecPython_QPYcom工具使用说明》重新下载固件。 + + + +## QPYcom救砖 + +如果在QPYcom里面升级失败或者升级过程中断开连接,请按照如下步骤执行: + +1.模组断电,短接VDD_EXT 和USB_BOOT,模组对应的PIN脚位置如下图 + +![img](media/clip_image006.jpg) + +或者可以是直接短接EC600S_QuecPython_EVB_V1.x 开发板的BOOT和1V8(如下图);对于其他开发板,自己找到对应的位置 + +img + +img + +2.查看设备管理是否会出现DOWNLOAD口,如下图所示: + +img + +3.如果不是上图所示的下载口,出现ASR下载口,如下图所示: + +img + +​ 有两种解决方案: + +(1)忽略,继续执行下面“步骤4”,但是如果失败,则按照方法3操作 + +(2)调整下载口(具体步骤见章节“下载口调整”) + +4.打开QPYcom,不要打开串口,直接创建项目(**对于非python固件的模块,一定不要打开串口**)。 + +img + +5.点击“选择固件”。 + +**注意事项:** + +(1)选择的固件是一个压缩包 + +(2)固件的下一级目录全部是.bin等等,也就是说固件里面无额外的压缩包。(可能存在官网下载的固件需要解压再进行下一步) + +img + +6.点击“下载固件” + +img + +7.等待20秒左右会出现下载进度条 + +img + +8.等待下载结束出现下方界面表示“下载成功” + +img + + + +9.对于上面下载成功后会自动重启模组(若未重启,手动重启即可),检查设备管理器,正确显示如下: + +img + + + +## Qflash救砖 + + + +1.下载 QFlash 工具压缩包,解压后,双击运行该软件; + +img + +2.点击【Load FW Files】 选择固件升级包。 + +**固件包注意事项:** + +(1)选择的固件是一个压缩包 + +(2)固件的下一级目录全部是.bin文件等等,也就是说固件里面无额外的压缩包。(可能存在官网下载的固件需要解压再进行下一步) + +3.对于EC100Y和EC600S都无需选择COM port 和 Baudrate,所以对于图中的“COM port和Baudrate”可忽略,也就是说,即使没有正常端口,也可以使用Qflash来固件下载 + +4.短接VDD_EXT和USB_BOOT(上电前短接,短接位置见方法2),然后上电,同时点击Qflash的start。 + +![img](media/clip_image030.jpg) + +注意事项: + +​ 由于Qflash检测下载口有时间限制,可以考虑把短接放在第一步,然后对于第4步,直接上电即可;或者对于第4步的短接上电需要快速操作 + +5.下载结束,参考如下截图: + +![img](media/clip_image032.jpg) + +6.QCOM查询如下图 + +![img](media/clip_image034.jpg) + +显示py结尾表示烧录py固件成功 + +对于方法2中可能遇到的问题有以下几点建议: + +(1)如遇Qflash下载任何失败的问题,请关闭Qflash重新启动(如何有效的关闭Qflash进程,可以通过“Ctrl+Alt+Delete”打开“设备管理器”,彻底杀死Qflash,具体如下截图)。然后重新回到第一步进行固件下载操作。 + +img + +(2)短接上电后计算机端口会显示如下图(禁用其他端口,出现下载口),可查看确认。 + +img + + + + + + + +## 下载口调整 + +1.首先确认,下载口是否如下截图,如果是,继续执行“第2步”,否则的话,可群里(移远QuecPython开发交流群:445121768)咨询 + +img + +2.选中上述截图的下载口,右击“更新驱动程序” + +img + +3. 选择“浏览我的电脑以查找驱动程序” + +img + +4.选择“让我从计算机上的可用驱动程序列表中选取” + +img + + + +5.选择“Quectel Download Port”(如果没有,请先下载安装驱动)后,点击“下一步” + +img + +6.选择“关闭” + +img + +7.最后界面如下图,表示“下载口调整”完成。 + +img \ No newline at end of file diff --git a/docs/FAQ/zh/QP_recovery/media/clip_image002.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image002.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c62422b5054daa92952399ea919da6a714f79184 Binary files /dev/null and b/docs/FAQ/zh/QP_recovery/media/clip_image002.jpg differ diff --git a/docs/FAQ/zh/QP_recovery/media/clip_image004.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image004.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5d6d63552b1294cd6a8782466232024bf153d3cd Binary files /dev/null and b/docs/FAQ/zh/QP_recovery/media/clip_image004.jpg differ diff --git a/docs/FAQ/zh/QP_recovery/media/clip_image006.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image006.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4f7ec97b7474a3eeba7463d6730cd2d3e7d37f99 Binary files /dev/null and b/docs/FAQ/zh/QP_recovery/media/clip_image006.jpg differ diff --git a/docs/FAQ/zh/QP_recovery/media/clip_image008.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image008.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9340907998031eb3d5cccca63fae050665dcafcc Binary files /dev/null and b/docs/FAQ/zh/QP_recovery/media/clip_image008.jpg differ diff --git a/docs/FAQ/zh/QP_recovery/media/clip_image010.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image010.jpg new file mode 100644 index 0000000000000000000000000000000000000000..be55fd5de013def23feeaa2eb398a801ab9f79e5 Binary files /dev/null and b/docs/FAQ/zh/QP_recovery/media/clip_image010.jpg differ diff --git a/docs/FAQ/zh/QP_recovery/media/clip_image012.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image012.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4f85c873908b4a9ad928c09a95eeed0fac7c2514 Binary files /dev/null and b/docs/FAQ/zh/QP_recovery/media/clip_image012.jpg differ diff --git a/docs/FAQ/zh/QP_recovery/media/clip_image014.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image014.jpg new file mode 100644 index 0000000000000000000000000000000000000000..785afbceb1320d644427958f1f40b93a73989f0d Binary files /dev/null and b/docs/FAQ/zh/QP_recovery/media/clip_image014.jpg differ diff --git a/docs/FAQ/zh/QP_recovery/media/clip_image016.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image016.jpg new file mode 100644 index 0000000000000000000000000000000000000000..da7e9035a948134a4d4e2d4414a9810306ba9c14 Binary files /dev/null and b/docs/FAQ/zh/QP_recovery/media/clip_image016.jpg differ diff --git a/docs/FAQ/zh/QP_recovery/media/clip_image018.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image018.jpg new file mode 100644 index 0000000000000000000000000000000000000000..086431c17c77177a4223a569e20094527f237acf Binary files /dev/null and b/docs/FAQ/zh/QP_recovery/media/clip_image018.jpg differ diff --git a/docs/FAQ/zh/QP_recovery/media/clip_image020.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image020.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b71a41b97c5bae5534cd550e55357f1fc25d3963 Binary files /dev/null and b/docs/FAQ/zh/QP_recovery/media/clip_image020.jpg differ diff --git a/docs/FAQ/zh/QP_recovery/media/clip_image022.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image022.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c4757d18cb45adb2c1ca40541261be64f3d0adac Binary files /dev/null and b/docs/FAQ/zh/QP_recovery/media/clip_image022.jpg differ diff --git a/docs/FAQ/zh/QP_recovery/media/clip_image024.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image024.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e3b8ed03436804b68d24cc5a68b349d291e0952c Binary files /dev/null and b/docs/FAQ/zh/QP_recovery/media/clip_image024.jpg differ diff --git a/docs/FAQ/zh/QP_recovery/media/clip_image026.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image026.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9cbc3645fdbfecfe7de43d7eec54e2b1fcfe25f9 Binary files /dev/null and b/docs/FAQ/zh/QP_recovery/media/clip_image026.jpg differ diff --git a/docs/FAQ/zh/QP_recovery/media/clip_image028.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image028.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b36875b58785b2ed7bf13f332cda4159f3f53107 Binary files /dev/null and b/docs/FAQ/zh/QP_recovery/media/clip_image028.jpg differ diff --git a/docs/FAQ/zh/QP_recovery/media/clip_image030.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image030.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a0388365a83427245727e3a8ace96c8dfcb47495 Binary files /dev/null and b/docs/FAQ/zh/QP_recovery/media/clip_image030.jpg differ diff --git a/docs/FAQ/zh/QP_recovery/media/clip_image032.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image032.jpg new file mode 100644 index 0000000000000000000000000000000000000000..df7c78202aa7e7f958a0317669795f4f71de921a Binary files /dev/null and b/docs/FAQ/zh/QP_recovery/media/clip_image032.jpg differ diff --git a/docs/FAQ/zh/QP_recovery/media/clip_image034.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image034.jpg new file mode 100644 index 0000000000000000000000000000000000000000..315ef007b4ecced814894a76e832cddc55a63873 Binary files /dev/null and b/docs/FAQ/zh/QP_recovery/media/clip_image034.jpg differ diff --git a/docs/FAQ/zh/QP_recovery/media/clip_image036.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image036.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b2be3d1cf6d6c822b2a9e3978347cd5905160593 Binary files /dev/null and b/docs/FAQ/zh/QP_recovery/media/clip_image036.jpg differ diff --git a/docs/FAQ/zh/QP_recovery/media/clip_image038.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image038.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6a5ce692d9ca4ae20778c6bf6c3943d00de84ab0 Binary files /dev/null and b/docs/FAQ/zh/QP_recovery/media/clip_image038.jpg differ diff --git a/docs/FAQ/zh/QP_recovery/media/clip_image040.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image040.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4f3c23c2449b495132e2f0fe068907634f84b7b0 Binary files /dev/null and b/docs/FAQ/zh/QP_recovery/media/clip_image040.jpg differ diff --git a/docs/FAQ/zh/QP_recovery/media/clip_image042.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image042.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c93ff5888e19b845ec84f921eff0e11a756085a9 Binary files /dev/null and b/docs/FAQ/zh/QP_recovery/media/clip_image042.jpg differ diff --git a/docs/FAQ/zh/QP_recovery/media/clip_image044.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image044.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f274709d4219fbd8788975dd52f5bc7ecc7f9104 Binary files /dev/null and b/docs/FAQ/zh/QP_recovery/media/clip_image044.jpg differ diff --git a/docs/FAQ/zh/QP_recovery/media/clip_image046.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image046.jpg new file mode 100644 index 0000000000000000000000000000000000000000..be4865f3ba188c1223ef9907aea92f3d350806b4 Binary files /dev/null and b/docs/FAQ/zh/QP_recovery/media/clip_image046.jpg differ diff --git a/docs/FAQ/zh/QP_recovery/media/clip_image048.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image048.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0bcef91799bbb22b5c8760bf13458f302e925b08 Binary files /dev/null and b/docs/FAQ/zh/QP_recovery/media/clip_image048.jpg differ diff --git a/docs/FAQ/zh/QP_recovery/media/clip_image050.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image050.jpg new file mode 100644 index 0000000000000000000000000000000000000000..38cc326e6c74c7fede94c7b5538ee791a8ea57f8 Binary files /dev/null and b/docs/FAQ/zh/QP_recovery/media/clip_image050.jpg differ diff --git a/docs/FAQ/zh/QP_recovery/media/dirver.png b/docs/FAQ/zh/QP_recovery/media/dirver.png new file mode 100644 index 0000000000000000000000000000000000000000..1e9699c614b5fb9e818dc025b9b5531724f514bc Binary files /dev/null and b/docs/FAQ/zh/QP_recovery/media/dirver.png differ diff --git a/docs/FAQ/zh/QP_recovery/media/image-20210412165538789.png b/docs/FAQ/zh/QP_recovery/media/image-20210412165538789.png new file mode 100644 index 0000000000000000000000000000000000000000..95ceb17fb12a393311064e02b4987633d5e3f4a9 Binary files /dev/null and b/docs/FAQ/zh/QP_recovery/media/image-20210412165538789.png differ diff --git a/docs/FAQ/zh/QP_test/QP_test.md b/docs/FAQ/zh/QP_test/QP_test.md new file mode 100644 index 0000000000000000000000000000000000000000..e1cebd13ac7ad98cad252457615460b417e45a50 --- /dev/null +++ b/docs/FAQ/zh/QP_test/QP_test.md @@ -0,0 +1,271 @@ +## QuecPython main.py文件使用 + +对于main.py的几点建议: + +(1)对于开始的调试,建议不要将程序命名为:main.py,建议使用其他名字,例如:start.py等等。如果里面存在死循环,那么在程序运行时无法中断,对于此情况,暂时只能通过重刷固件解决。 + +(2)如果真的想使用main.py程序,同时又需要使用死循环,记得在死循环里面加一个可中断的条件,例如(1.如下的例子是在一个线程里面加入了死循环,同时在这个死循环里面加入了中断退出的条件,当一直输出时,可通过GPIO2对应的按键中断输出;2.下面的例子是基于EC600S_QuecPython_EVB_V1.x 开发板的,其他开发板请自行配置按键中断): + +```python +import log +import _thread +from machine import Pin +import utime +log.basicConfig(level=log.NOTSET) +KEY_log = log.getLogger("KEY") +gpio2 = Pin(Pin.GPIO2, Pin.IN, Pin.PULL_DISABLE, 0) +def in_capture(): + KEY_log.debug("in_capture start!") + while True: + KEY_log.info("1111") + utime.sleep(1) + if gpio2.read() == 0: + KEY_log.info("in_capture thread end") + break + else: + pass +if __name__ == "__main__": + _thread.start_new_thread(in_capture, ()) + +``` + +(3)对于自运行没有log输出,可以参考下面现象2的解决方法。 + +**现象1:上传py文件且文件名为main.py到模块后无法任何执行指令(包括上传文件等),类似现象如下截图** + +img + +导致原因:模块在开机后会自动寻找运行文件名为main.py的脚本文件,如果main.py中存在while,for这种循环语句,会导致程序阻塞,串口被占用,无法进行其他操作 + +**解决方案:目前版本只能通过重刷固件解决**。 + + + +**现象2:手动运行main.py程序,可以看到通过QPYcom连接“USB串行设备”看到print输出和LOG打印信息,但是自运行main.py程序后,在QPYcom的交互界面,什么都看不到。** + +**解决方法:可以加入串口打印** + +(1) 软件代码可参考: + +```python +from machine import UART # 导入UART模块 +uart = UART(UART.UART2, 115200, 8, 0, 1, 0) #配置成UART2输出(硬件的连接) +count = 50 +while count: + uart.write('main_py_UART_msg:{}\r\n'.format(count)) + count -= 1 +``` + +说明: + +​ 串口打印是需要导入UART模块,按照UART的API库来书写输出代码 + +(2) 硬件连接可参考: + +对于代码中提到的硬件连接(UART2),是使用type-c给模块供电,UART与TTL转USB模块的连接如下表,TTL转USB模块直接插PC上: + +| 模块UART_pin脚 | TTL转USB模块 | +| -------------- | ------------ | +| RX1 | Tx | +| TX1 | Rx | +| GND | GND | + +使用QCOM连接“TTL转USB模块”对应的串口,如下图: + +img + +鉴于上述的软硬件配置后,在自运行main.py程序时,就会在QCOM看到对应的打印,如下图: + +img + +## 串口的收发数据测试流程 + +环境搭建(这个测试仅测试 API 对串口的封装): + +(1) USB 给EC600S_QuecPython_EVB_V1.x供电,main 串口的TX1和RX1对应接到电平转换芯片的3.3V端(经电平转换成5V,是使用一个电平转换器件),串口工具GND 接地 + +(2) 软件方面:一端使用 QPYcom 连接EC600S_QuecPython_EVB_V1.x的“USB串行设备”口(用于调试时发送QuecPython指令);另一端使用QCOM 连接“电平转换器件”对应的端口(用于接收EC600S_QuecPython_EVB_V1.x发送的数据(测试模块的write 功能),以及发送数据给模块(测试模块的read 功能))。 + +```python +# 发数据(write): +>>> from machine import UART +>>> uart = UART(UART.UART2,115200,8,0,1,0) /////////////////// 定义发数据的端口,必须要严格按照硬件的接线来配置 +>>> uart.write("12345678") //////////// wite数据后,可以通过QCOM 看到数据(如下截图) +8 ////////////“8”表示发送的字节数 +``` + +![image-20210311201822427](media/image-20210311201822427.png) + + + +```python +# 收数据(read): +>>> from machine import UART +>>> uart = UART(UART.UART2,115200,8,0,1,0) /////////////////// 定义接收数据的端口,必须要严格按照硬件的接线来配置 +>>> uart.any() ////////////// 显示缓存的数据(只有在QCOM发送数据,这里才会显示未读的数据) +32 +>>> msglen = uart.any() ////////////////// 将缓存的数据字节长度数赋值给msglen +>>> msg = uart.read(msglen) /////////////////// 读取缓存字节数对应的数据 +>>> utf8_mmmm = msg.decode() ////////////////// 将byte类型的数据转换成unicode类型 +>>> print(utf8_mmmm) //////////// 以unicode类型输出数据 +555555 +555555 +555555 +555555 +``` + + + +## Socket的测试(客户反馈连接失败不报错) + +问题是:使用connect命令,成功和失败都不显示 + +```python +>>> import usocket +>>> client = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) ////每次连接连接前必须定义 +>>> sockaddr = usocket.getaddrinfo('www.tongxinmao.com',80)[0][-1] ////正确端口,socket +>>> client.connect(sockaddr) +>>> client.close() ////////////// 每次连接后想重新连接必须关闭 +>>> client = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) ////每次连接连接前必须定义 +>>> sockaddr = usocket.getaddrinfo('www.tongxinmao.com',82)[0][-1] ////错误端口,socket +>>> client.connect(sockaddr) +Traceback (most recent call last): + File "", line 1, in +OSError: 104 +>>> client.close() //////////////每次连接后想重新连接必须关闭 +>>> client = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) ////每次连接连接前必须定义 +>>> sockaddr = usocket.getaddrinfo('www.tongxinmao.com',80)[0][-1] ////正确端口,socket + +>>> client.connect(sockaddr) +>>> client.close() //////////////每次连接后想重新连接必须关闭 +``` + +## EC600S裸模块开机烧录测试 + +EC600S的硬件连接: + +| 模块端 | USB | +| ----------------- | --------------------- | +| USB_DP(PIN26) | 绿色-USB数据线(正) | +| USB_DM(PIN27) | 白色-USB数据线(负) | +| USB_VBUS(PIN28) | 红色-USB电源 | +| GND(PIN30) | 黑色-地线 | + +| 模块端 | 电源端 | +| ---------------- | ---------- | +| VBAT_BB(PIN29) | 电源的正极 | +| VBAT_RF(PIN36) | 电源的正极 | +| VBAT_RF(PIN37) | 电源的正极 | +| GND(PIN38) | 电源的负极 | + +实物图: + +![image-20210312101407043](media/image-20210312101407043.png) ![image-20210312102149061](media/image-20210312102149061.png) + + POWKEY拉低开机后,未烧录固件的DM + +image-20210312102450245 + +烧录后,重启的DM + +image-20210312102517370 + +前后版本查询 + +image-20210312132017231 + + + +## QuecPython MQTT连接异常处理 + +### umqtt使用 + +umqtt模块提供创建MQTT客户端的发布订阅功能。该模块可以向服务端发布或者订阅消息,向服务器发送ping包,检测保持连通性,与服务器建立或者断开连接,需要注意的是MQTTClient.check_msg()和MQTTClient.wait_msg()方法中推荐使用**wait_msg**的方法。 + +### 使用MQTT连接阿里云、腾讯云等 + +使用MQTT连接阿里云、腾讯云的步骤可以详细参见官网上的wiki社区([https://python.quectel.com/wiki/](https://python.quectel.com/wiki/))的QuecPython云服务。 + +### 云服务运行demo出现,未订阅等信息 + +现象:类似下面截图 + +![image-20210312132446192](media/image-20210312132446192.png) + +原因分析:(1)注网失败;(2)您订阅与发布的主题,在云服务端没有创建 + +(1)对于注网失败,解决步骤如下: + +​ 使用QCOM,连接AT口,查询命令“AT+CSQ; +CREG?; +CEREG? ;+CGREG? ; +CPIN?;+COPS?”,如下截图,类似下面情况说明您的网络状态是正常的。 + +![image-20210312132458172](media/image-20210312132458172.png) + +​ 如有异常的常见解决方案是: + +对于AT+CPIN?的异常处理,检查SIM卡座硬件问题; + +对于CREG,CGREG,CEREG的,建议检查手机卡是否存在欠费等情况,也就是确认手机卡是否正常 + +对于CSQ的话,检查周围环境,是否存在导致信号不好的干扰,建议室外测试,或者室内加天线。 + +(2) 对于“订阅与发布的主题,在云服务端没有创建”,建议检查以下两点: + +检查您订阅的主题,在云服务上对应的主题是不是也是可订阅的状态 + +检查您发布的主题,在云服务上对应的主题是不是也是可发布的状态 + +### MQTT连接一段时间异常断开 + +导致原因: MQTT服务端会有心跳检测机制,一段时间内设备与云端没有通信活动会主动断开连接 + +尝试解决方向:连接断开是依据配置mqtt时的超时值keepalive,在超出活动时间后会主动断开连接,我们可以根据设置keepalive活动时间使用定时器在活动时间超出前主动向云端发送ping包,服务端返回的数据包无需客户处理。 + +![image-20210312132735642](media/image-20210312132735642.png) + +## MQTT测试 + +客户疑问:MQTT断线通过捕获异常获取,但是断线后,异常捕获不到 + +疑问解答:会抛出异常,umqtt已经做了处理,上层的try捕捉不到下面的异常,对于断线后会尝试重连,有log输出,不会直接抛出异常。下面是测试的部分LOG(之前一直收发,后面拔卡后尝试重连) + +具体的测试代码是: + +```python +from umqtt import MQTTClient +import utime +import log +import checkNet + +PROJECT_NAME = "QuecPython_MQTT_example" +PROJECT_VERSION = "1.0.0" + +checknet = checkNet.CheckNetwork(PROJECT_NAME, PROJECT_VERSION) + +# 设置日志输出级别 +log.basicConfig(level=log.INFO) +mqtt_log = log.getLogger("MQTT") + +state = 0 +def sub_cb(topic, msg): + global state + mqtt_log.info("Subscribe Recv: Topic={},Msg={}".format(topic.decode(), msg.decode())) + +if __name__ == '__main__': + utime.sleep(5) + checknet.poweron_print_once() + checknet.wait_network_connected() + c = MQTTClient("umqtt_client", "mq.tongxinmao.com", 18830) + c.set_callback(sub_cb) + c.connect() + while True: + c.subscribe(b"/public/TEST/quecpython") + mqtt_log.info("Connected to mq.tongxinmao.com, subscribed to /public/TEST/quecpython topic") + # 发布消息 + c.publish(b"/public/TEST/quecpython", b"my name is Quecpython!") + mqtt_log.info("Publish topic: /public/TEST/quecpython, msg: my name is Quecpython") + c.wait_msg() # 阻塞函数,监听消息 + if state == 1: + break + c.disconnect() +``` + diff --git a/docs/FAQ/zh/QP_test/media/EC600SV1.1_UART.png b/docs/FAQ/zh/QP_test/media/EC600SV1.1_UART.png new file mode 100644 index 0000000000000000000000000000000000000000..7b700cbbda72524f9ad959c6ead9bc4793dc57d8 Binary files /dev/null and b/docs/FAQ/zh/QP_test/media/EC600SV1.1_UART.png differ diff --git a/docs/FAQ/zh/QP_test/media/clip_image004-1615461735615.jpg b/docs/FAQ/zh/QP_test/media/clip_image004-1615461735615.jpg new file mode 100644 index 0000000000000000000000000000000000000000..df8984d78a986f8caf0756b63fe194c934c2e9d9 Binary files /dev/null and b/docs/FAQ/zh/QP_test/media/clip_image004-1615461735615.jpg differ diff --git a/docs/FAQ/zh/QP_test/media/clip_image006-1615461735616.jpg b/docs/FAQ/zh/QP_test/media/clip_image006-1615461735616.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1dd67f3203b423fd642adfdcf5f1e6d4398cd28f Binary files /dev/null and b/docs/FAQ/zh/QP_test/media/clip_image006-1615461735616.jpg differ diff --git a/docs/FAQ/zh/QP_test/media/clip_image008-1615527701161.jpg b/docs/FAQ/zh/QP_test/media/clip_image008-1615527701161.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b5a4631fc16244eb6a9edae717daaaed8ced61a4 Binary files /dev/null and b/docs/FAQ/zh/QP_test/media/clip_image008-1615527701161.jpg differ diff --git a/docs/FAQ/zh/QP_test/media/clip_image010-1615527701161.jpg b/docs/FAQ/zh/QP_test/media/clip_image010-1615527701161.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f368c332062aeadbd5f0089a51ed07e75555d5cb Binary files /dev/null and b/docs/FAQ/zh/QP_test/media/clip_image010-1615527701161.jpg differ diff --git a/docs/FAQ/zh/QP_test/media/clip_image012-1615527701161.jpg b/docs/FAQ/zh/QP_test/media/clip_image012-1615527701161.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dcf75a760f986dccbd0ed06a4b057381755586c0 Binary files /dev/null and b/docs/FAQ/zh/QP_test/media/clip_image012-1615527701161.jpg differ diff --git a/docs/FAQ/zh/QP_test/media/image-20210311201822427.png b/docs/FAQ/zh/QP_test/media/image-20210311201822427.png new file mode 100644 index 0000000000000000000000000000000000000000..dfd2dbf09483689d6fa80e3b07fa611840dcb041 Binary files /dev/null and b/docs/FAQ/zh/QP_test/media/image-20210311201822427.png differ diff --git a/docs/FAQ/zh/QP_test/media/image-20210312101407043.png b/docs/FAQ/zh/QP_test/media/image-20210312101407043.png new file mode 100644 index 0000000000000000000000000000000000000000..07aa3ada32cfd8352b5466c2c4ae595be1e3529e Binary files /dev/null and b/docs/FAQ/zh/QP_test/media/image-20210312101407043.png differ diff --git a/docs/FAQ/zh/QP_test/media/image-20210312102149061.png b/docs/FAQ/zh/QP_test/media/image-20210312102149061.png new file mode 100644 index 0000000000000000000000000000000000000000..61b0c4e5c2104fdcd5fdbfb76ef624b36ad6b8ed Binary files /dev/null and b/docs/FAQ/zh/QP_test/media/image-20210312102149061.png differ diff --git a/docs/FAQ/zh/QP_test/media/image-20210312102450245.png b/docs/FAQ/zh/QP_test/media/image-20210312102450245.png new file mode 100644 index 0000000000000000000000000000000000000000..1d1f291345f99b3a2a45c0eb988b83802530a096 Binary files /dev/null and b/docs/FAQ/zh/QP_test/media/image-20210312102450245.png differ diff --git a/docs/FAQ/zh/QP_test/media/image-20210312102517370.png b/docs/FAQ/zh/QP_test/media/image-20210312102517370.png new file mode 100644 index 0000000000000000000000000000000000000000..f17ab6dc6c9fbd56a907ec9101a8b6b81a2010c9 Binary files /dev/null and b/docs/FAQ/zh/QP_test/media/image-20210312102517370.png differ diff --git a/docs/FAQ/zh/QP_test/media/image-20210312132017231.png b/docs/FAQ/zh/QP_test/media/image-20210312132017231.png new file mode 100644 index 0000000000000000000000000000000000000000..1bc216678facc9e4b596aea1d0935564fe03eed5 Binary files /dev/null and b/docs/FAQ/zh/QP_test/media/image-20210312132017231.png differ diff --git a/docs/FAQ/zh/QP_test/media/image-20210312132446192.png b/docs/FAQ/zh/QP_test/media/image-20210312132446192.png new file mode 100644 index 0000000000000000000000000000000000000000..df0ccc00f3b37e23daf51c0258f9288973efcba1 Binary files /dev/null and b/docs/FAQ/zh/QP_test/media/image-20210312132446192.png differ diff --git a/docs/FAQ/zh/QP_test/media/image-20210312132458172.png b/docs/FAQ/zh/QP_test/media/image-20210312132458172.png new file mode 100644 index 0000000000000000000000000000000000000000..6e666713160348d38305ca0b5299d60f23f69c2a Binary files /dev/null and b/docs/FAQ/zh/QP_test/media/image-20210312132458172.png differ diff --git a/docs/FAQ/zh/QP_test/media/image-20210312132735642.png b/docs/FAQ/zh/QP_test/media/image-20210312132735642.png new file mode 100644 index 0000000000000000000000000000000000000000..6e2a63139ea716f3a8f3b59ccef75a05f38745c5 Binary files /dev/null and b/docs/FAQ/zh/QP_test/media/image-20210312132735642.png differ diff --git a/docs/FAQ/zh/QP_test/media/image-20210312134000186.png b/docs/FAQ/zh/QP_test/media/image-20210312134000186.png new file mode 100644 index 0000000000000000000000000000000000000000..4f5048d5699ba70e60d494609bffea847ba435a9 Binary files /dev/null and b/docs/FAQ/zh/QP_test/media/image-20210312134000186.png differ diff --git a/docs/FAQ/zh/QP_test/media/image-20210312134025628.png b/docs/FAQ/zh/QP_test/media/image-20210312134025628.png new file mode 100644 index 0000000000000000000000000000000000000000..7b700cbbda72524f9ad959c6ead9bc4793dc57d8 Binary files /dev/null and b/docs/FAQ/zh/QP_test/media/image-20210312134025628.png differ diff --git a/docs/FAQ/zh/QP_test/media/image-20210312135703298.png b/docs/FAQ/zh/QP_test/media/image-20210312135703298.png new file mode 100644 index 0000000000000000000000000000000000000000..4a83bc67936d660f08718183998fe308e4d4dcbf Binary files /dev/null and b/docs/FAQ/zh/QP_test/media/image-20210312135703298.png differ diff --git a/docs/FAQ/zh/QP_test/media/image-20210312135803677.png b/docs/FAQ/zh/QP_test/media/image-20210312135803677.png new file mode 100644 index 0000000000000000000000000000000000000000..0f7d4b0b96301b5651f321bfd57d85f2239e454e Binary files /dev/null and b/docs/FAQ/zh/QP_test/media/image-20210312135803677.png differ diff --git a/docs/FAQ/zh/QP_test/media/image-20210312135817816.png b/docs/FAQ/zh/QP_test/media/image-20210312135817816.png new file mode 100644 index 0000000000000000000000000000000000000000..408a19251112775c9b8a4682701b6a4a4079eb0c Binary files /dev/null and b/docs/FAQ/zh/QP_test/media/image-20210312135817816.png differ diff --git a/docs/FAQ/zh/QP_test/media/main_problem.jpg b/docs/FAQ/zh/QP_test/media/main_problem.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bb46f3eadf4b10eda865ebb8aa516125c2908f8d Binary files /dev/null and b/docs/FAQ/zh/QP_test/media/main_problem.jpg differ diff --git a/docs/FAQ/zh/QuecPython_FAQ/QuecPython_FAQ.md b/docs/FAQ/zh/QuecPython_FAQ/QuecPython_FAQ.md new file mode 100644 index 0000000000000000000000000000000000000000..4f5e663558d3d307e5656b8aa7961d3f34f979db --- /dev/null +++ b/docs/FAQ/zh/QuecPython_FAQ/QuecPython_FAQ.md @@ -0,0 +1,133 @@ + + +## 板子接出的串口无法通信 + +要注意接口是1.8V还是3.3V,电平匹配才能正常通信。 + +## 接上USB线灯不亮 + +检查模块电压,保证模组的3.8V电压稳定,必要时用电池供电。 + +## apn_cfg.json里面是什么 + +内置的apn列表,不可删除 + +## 拖动文件到模组出现语法错误 + +请检查“.py”文件的语法问题(多数是缩进问题) + +## 对Socket的[0] [-1]的解释 + +```python +>>> import usocket +>>> client = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) +>>> sockaddr = usocket.getaddrinfo('www.tongxinmao.com',80)[0][-1] + +>>> print(sockaddr) +('120.76.100.197', 80) +>>> sockaddr = usocket.getaddrinfo('www.tongxinmao.com',80) +>>> print(sockaddr) +[(2, 1, 0, 'www.tongxinmao.com', ('120.76.100.197', 80))] +``` + +举例说明: + +```python +a = ((A,B,C),(2),(3)) +a[0] = (A,B,C) +a[0][-1] = C +``` + +## win7运行QPYcom出现“failed to execute script pyi_rth_multiprocessing” + +故障现象:python通过pyinstaller打包后,在别的电脑运行失败“failed to execute script pyi_rth_multiprocessing”:在低版本windows7上运行会出现这个问题,在win10上面移植程序没问题。 + +故障分析:怀疑是windows某些dll文件版本过低,不支持高版本生成的exe,最简单的方法是:在win7机器上单独打个exe,然后在win7运行,移植。 + +建议客户的方法是:升级win7版本到sp1 + +## net.nitzTime()的获取 + +成功附着网络之后,基站下发一次(仅此一次) + +## 对于EC600SV1.1的QuecPython板子,测试TTS功能注意事项 + +外设是接的喇叭,但是在TTS中配置的是“话筒” + +由于V1.1上面加了一个功放,此时需要拉高模组(硬件拉高)socket的pin58(功放的使能脚),或者指令使能“audio_EN = Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1)” + +外接的喇叭是功率是有限制的,建议小于8R 2W + +### 如果需要AT配置的话, + +**at+qaudmod=0 //spk** + +**at+qaudmod=1 //hs** + +**at+qaudmod=2 //loudspeaker** + +下面需要后面加以理解 + +AT+QAUDPATH=0 + +AT+QAUDDCH=0 + +## 对于多.py文件的调用 + +对于usr目录下的两个文件a.py和b.py,如果想再a.py中调用b.py的话:需要在a.py里面加上下面代码 + +```python +#方法1 +from usr import b +#方法2 +import sys +sys.path.append('/usr/') # 进入usr目录下 +import b +``` + +## 线程有个数限制? + +最多16个 + +## 如何对文件系统进行操作 + +根目录/是不可读不可写的,/usr是用户区,/bak是备份区 + +## 串口一次最多可以接受多少字节? + +实测接收2000字节也行;发送最大512,超过自动分包;socket、MQTT收发2000字节也行 + +## Socket、MQTT、串口的数据监听会不会阻塞其他线程 + +Socket、MQTT本身是‘阻塞函数’,不会阻塞其他线程。 + +串口本身是‘非阻塞函数’,不会阻塞其他线程。 + +## 基站定位返回的参数解释 + +```python +>>> cellLocator.getLocation("www.queclocator.com", 80, "1111111122222222", 8, 1) +(117.1138, 31.82279, 550) +``` + +返回的550结果是什么意思 + +定位精度,单位m + +## QuecPython队列的深度有最大值吗?比如一直发生回调,会不会丢失? + +随内存自动增长 + +## 模块的Pin有没有默认电平的说明文档 + +我们开放出来IO目前是 默认输出低电平 + +## EC600S的模块RTC时间怎么样断电续航 + +断电没有办法续航,因为EC600S没有RTC引脚 + + + + + + \ No newline at end of file diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/BreaPi.png b/docs/FAQ/zh/QuecPython_FAQ/media/BreaPi.png new file mode 100644 index 0000000000000000000000000000000000000000..ac7067bb17e2b2189e833fd861c44dcd5d484a7d Binary files /dev/null and b/docs/FAQ/zh/QuecPython_FAQ/media/BreaPi.png differ diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/EC600S_QuecPython_EVB_V1.x.png b/docs/FAQ/zh/QuecPython_FAQ/media/EC600S_QuecPython_EVB_V1.x.png new file mode 100644 index 0000000000000000000000000000000000000000..b643d42a418e58e8fc4bd5875cefd925c5201da5 Binary files /dev/null and b/docs/FAQ/zh/QuecPython_FAQ/media/EC600S_QuecPython_EVB_V1.x.png differ diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/clip_image030.jpg b/docs/FAQ/zh/QuecPython_FAQ/media/clip_image030.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a0388365a83427245727e3a8ace96c8dfcb47495 Binary files /dev/null and b/docs/FAQ/zh/QuecPython_FAQ/media/clip_image030.jpg differ diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/clip_image032.jpg b/docs/FAQ/zh/QuecPython_FAQ/media/clip_image032.jpg new file mode 100644 index 0000000000000000000000000000000000000000..df7c78202aa7e7f958a0317669795f4f71de921a Binary files /dev/null and b/docs/FAQ/zh/QuecPython_FAQ/media/clip_image032.jpg differ diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/clip_image034.jpg b/docs/FAQ/zh/QuecPython_FAQ/media/clip_image034.jpg new file mode 100644 index 0000000000000000000000000000000000000000..315ef007b4ecced814894a76e832cddc55a63873 Binary files /dev/null and b/docs/FAQ/zh/QuecPython_FAQ/media/clip_image034.jpg differ diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/dirver.png b/docs/FAQ/zh/QuecPython_FAQ/media/dirver.png new file mode 100644 index 0000000000000000000000000000000000000000..1e9699c614b5fb9e818dc025b9b5531724f514bc Binary files /dev/null and b/docs/FAQ/zh/QuecPython_FAQ/media/dirver.png differ diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/dirver_c.png b/docs/FAQ/zh/QuecPython_FAQ/media/dirver_c.png new file mode 100644 index 0000000000000000000000000000000000000000..e805108c87e2f14b99e185dbf6df5bf23f96e924 Binary files /dev/null and b/docs/FAQ/zh/QuecPython_FAQ/media/dirver_c.png differ diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/dirver_finish.png b/docs/FAQ/zh/QuecPython_FAQ/media/dirver_finish.png new file mode 100644 index 0000000000000000000000000000000000000000..20d8a419b223029db318c7df318e5fafbac743ab Binary files /dev/null and b/docs/FAQ/zh/QuecPython_FAQ/media/dirver_finish.png differ diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/dirver_installing.png b/docs/FAQ/zh/QuecPython_FAQ/media/dirver_installing.png new file mode 100644 index 0000000000000000000000000000000000000000..59de57ac31cb5ea6c41bc998424e497ead8c1b20 Binary files /dev/null and b/docs/FAQ/zh/QuecPython_FAQ/media/dirver_installing.png differ diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/dirver_python.png b/docs/FAQ/zh/QuecPython_FAQ/media/dirver_python.png new file mode 100644 index 0000000000000000000000000000000000000000..44f24275daa1c55b664072c86ea14d54951d6347 Binary files /dev/null and b/docs/FAQ/zh/QuecPython_FAQ/media/dirver_python.png differ diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/dirver_setup.png b/docs/FAQ/zh/QuecPython_FAQ/media/dirver_setup.png new file mode 100644 index 0000000000000000000000000000000000000000..5c64e95704bd913477136297efdd237de67afbe6 Binary files /dev/null and b/docs/FAQ/zh/QuecPython_FAQ/media/dirver_setup.png differ diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/firmware_ATI.png b/docs/FAQ/zh/QuecPython_FAQ/media/firmware_ATI.png new file mode 100644 index 0000000000000000000000000000000000000000..0612afcf35e2cd2b906ac4e7d3f025382826bf54 Binary files /dev/null and b/docs/FAQ/zh/QuecPython_FAQ/media/firmware_ATI.png differ diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/firmware_ATI02.png b/docs/FAQ/zh/QuecPython_FAQ/media/firmware_ATI02.png new file mode 100644 index 0000000000000000000000000000000000000000..803607f436f352e95983c590d944f9da3396ed95 Binary files /dev/null and b/docs/FAQ/zh/QuecPython_FAQ/media/firmware_ATI02.png differ diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/firmware_choosefirmware.png b/docs/FAQ/zh/QuecPython_FAQ/media/firmware_choosefirmware.png new file mode 100644 index 0000000000000000000000000000000000000000..125048b1d08aa1b36fede9e5aa821a3b0e740a62 Binary files /dev/null and b/docs/FAQ/zh/QuecPython_FAQ/media/firmware_choosefirmware.png differ diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/firmware_downloadfirmware.png b/docs/FAQ/zh/QuecPython_FAQ/media/firmware_downloadfirmware.png new file mode 100644 index 0000000000000000000000000000000000000000..989e3d5945ae2f060203c102f6abe2a7f31f5c4d Binary files /dev/null and b/docs/FAQ/zh/QuecPython_FAQ/media/firmware_downloadfirmware.png differ diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/firmware_downloadsuccess.png b/docs/FAQ/zh/QuecPython_FAQ/media/firmware_downloadsuccess.png new file mode 100644 index 0000000000000000000000000000000000000000..b48a17326747550ad734661e158793a262413db1 Binary files /dev/null and b/docs/FAQ/zh/QuecPython_FAQ/media/firmware_downloadsuccess.png differ diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/firmware_downloadwaiting.png b/docs/FAQ/zh/QuecPython_FAQ/media/firmware_downloadwaiting.png new file mode 100644 index 0000000000000000000000000000000000000000..f82b2630fb8dc1f8fda596a5eeb14e7d970889e0 Binary files /dev/null and b/docs/FAQ/zh/QuecPython_FAQ/media/firmware_downloadwaiting.png differ diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/firmware_notopen.png b/docs/FAQ/zh/QuecPython_FAQ/media/firmware_notopen.png new file mode 100644 index 0000000000000000000000000000000000000000..dd6f74336081725d3d9da528b8c74b2ee53a4e05 Binary files /dev/null and b/docs/FAQ/zh/QuecPython_FAQ/media/firmware_notopen.png differ diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312101407043.png b/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312101407043.png new file mode 100644 index 0000000000000000000000000000000000000000..07aa3ada32cfd8352b5466c2c4ae595be1e3529e Binary files /dev/null and b/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312101407043.png differ diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312101415590.png b/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312101415590.png new file mode 100644 index 0000000000000000000000000000000000000000..61b0c4e5c2104fdcd5fdbfb76ef624b36ad6b8ed Binary files /dev/null and b/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312101415590.png differ diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312101450518.png b/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312101450518.png new file mode 100644 index 0000000000000000000000000000000000000000..ba91f136b4e816f62dd08c9216781b22029edf2b Binary files /dev/null and b/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312101450518.png differ diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312101454417.png b/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312101454417.png new file mode 100644 index 0000000000000000000000000000000000000000..99b338b49e780adae03ddefd55389f3f13668c41 Binary files /dev/null and b/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312101454417.png differ diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312102005627.png b/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312102005627.png new file mode 100644 index 0000000000000000000000000000000000000000..d53a6e5c2a2c1dc8fd9b4106d437a32dd4b12a28 Binary files /dev/null and b/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312102005627.png differ diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312102149061.png b/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312102149061.png new file mode 100644 index 0000000000000000000000000000000000000000..61b0c4e5c2104fdcd5fdbfb76ef624b36ad6b8ed Binary files /dev/null and b/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312102149061.png differ diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312102326265.png b/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312102326265.png new file mode 100644 index 0000000000000000000000000000000000000000..99b338b49e780adae03ddefd55389f3f13668c41 Binary files /dev/null and b/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312102326265.png differ diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312102439534.png b/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312102439534.png new file mode 100644 index 0000000000000000000000000000000000000000..1d1f291345f99b3a2a45c0eb988b83802530a096 Binary files /dev/null and b/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312102439534.png differ diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312102538767.png b/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312102538767.png new file mode 100644 index 0000000000000000000000000000000000000000..d53a6e5c2a2c1dc8fd9b4106d437a32dd4b12a28 Binary files /dev/null and b/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312102538767.png differ diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312132446192.png b/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312132446192.png new file mode 100644 index 0000000000000000000000000000000000000000..df0ccc00f3b37e23daf51c0258f9288973efcba1 Binary files /dev/null and b/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312132446192.png differ diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312132458172.png b/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312132458172.png new file mode 100644 index 0000000000000000000000000000000000000000..6e666713160348d38305ca0b5299d60f23f69c2a Binary files /dev/null and b/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312132458172.png differ diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312132735642.png b/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312132735642.png new file mode 100644 index 0000000000000000000000000000000000000000..6e2a63139ea716f3a8f3b59ccef75a05f38745c5 Binary files /dev/null and b/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312132735642.png differ diff --git a/docs/FAQ/zh/README.md b/docs/FAQ/zh/README.md index 6bd1fc5e6037214d7c4e0707fcd7d0390b62fb66..c2522204d40fa17d27834516618e8ec82f0a649d 100644 --- a/docs/FAQ/zh/README.md +++ b/docs/FAQ/zh/README.md @@ -1,3 +1,352 @@ -## FAQ&常见问题 +## 前言 + +本片文章主要是简介怎样参与到 **QuecPython 文档网站系统的贡献** 以及**QecPython 文档编写的规范**。 +- 使用git拉取仓库 +- 修改本地md文档 +- 在本地部署预览 +- 提交修改到主仓库,等待合并。 + + +### **推荐资料** + +- [Git - Book (git-scm.com)](https://git-scm.com/book/zh/v2) +- [Learn Git Branching](https://learngitbranching.js.org/?locale=zh_CN) +- [Git提交流程图\_L.超的博客-CSDN博客](https://blog.csdn.net/weixin_45765795/article/details/110730753) + +### 需要安装的东西 + +- git [git-for-windows Mirror(taobao.org)](http://npm.taobao.org/mirrors/git-for-windows/) +- sourcetree [Sourcetree \| Free Git GUI for Mac and Windows(sourcetreeapp.com)](https://www.sourcetreeapp.com/) +- python3 以及需要将python3 添加到 PATH 路径, 具体请参考 [windows10怎么把python添加到路径](https://www.py.cn/faq/python/18228.html) + +sourcetree 安装教程可以参考 [SourceTree安装及卸载 - 爱码网(likecs.com)](http://www.likecs.com/show-118323.html) + +### 视频录屏 + +1. **首先请下载视频查看一些基础的用法。** + +链接:https://pan.baidu.com/s/1-TIYEdloBS1uWs1AZpT8TQ + +提取码:219x + +本次交流使用到的 git 命令。 + +```bash +git clone + +git commit + +git rebase +``` + +## git 提交流程 + +### !!!注意事项: + +尽量本地修改的时候,新建一个分支修改, 名字可以随便取。 + +不要使用 develop release main 三个分支就行。 + +#### gitee 账号注册与 fork 代码。 + +首先请参考 注册gitee账号 + +需要操作的仓库地址。 +[QuecPython/Community-document(gitee.com)](https://gitee.com/quecpython/Community-document) +![](media/2402ce33f46407a306dbbc808a61c9dc.png) + +#### clone 代码 + +你自己仓库的代码, 不需要复制下面的网址, 复制你自己仓库的路径。 + +![](media/07e84b72f40480b3d47215bba25b991d.png) + +![](media/348a8cd3a03f723bbebd7c75d7318a77.png) + +记住: 路径需要修改成为自己的网址 路径。 + +![](media/a0bf255b7e26a6da128a9a6bfef9a98f.png) + +#### 使用命令行添加用户名和账号 + +参考 文章。 + +首先打开命令行,查看是你是否设置了用户名。 + +![](media/346efc8943131e0cb6fb676aa2ae78f7.png) + +如果没有名字,使用下下面的命令配置一下名字 和邮件。 + +```bash +git config --global user.name "你的名字(请使用英文)" + +git config --global user.email "邮箱账号" +``` + +如果出现了下面的错误信息 + +could not lock config file z://config: Permission denied + +请确认你在安装souretree的过程中,是否选择了正确的git 路径。 + +![Souretree 安装过程中指定的GIT路径错误的问题](media/Qp_Faq_join_us_051.png) + +#### 使用souretree添加本地仓库 + +![](media/ac16302f7af83590b20ddbfc851f5489.png) + +如此即可。 + +#### 使用souretree 添加 upstream仓库。 + +![](media/816606baf28959a11f18c6e24458e9e6.png) + +打开souretree 状态看一看。 可以发现 origin 以及 upstream 两个远程仓库的状态。 + +![](media/a5d1460f83ea10904febaaf1b6fa83eb.png) + +## 本地编译预览网站 + +上面我们拉取了远程仓库以后,我们可以测试在本地编译生成网页预览。 + +![](media/7c729ff347d8b0b71ef1e4ddc1fb3ab6.png) + +使用**powershell**进入对应的路径 **E:\\work\\temp\\Community-document**。 + +```bash +PS E:\\work\\temp\\Community-document\> git status + +On branch develop + +Your branch is ahead of 'origin/develop' by 1 commit. + +(use "git push" to publish your local commits) + +nothing to commit, working tree clean +``` + +使用pip3 安装teedoc,如果pip3 没有安装的可以参考 [Win10 +64位系统下安装Python3及pip3_Working. +Playing.-CSDN博客](https://blog.csdn.net/menc15/article/details/65631380) +```bash +# 安装teedoc + +PS E:\\work\\temp\\Community-document\> pip3 install teedoc + +# 安装teedoc插件 + +PS E:\\work\\temp\\Community-document\> teedoc install + +# 编译md, 将md转化成为 html + +**编译** + +# 编译md, 将md转化成为 html + +PS E:\\work\\temp\\Community-document\> teedoc build +``` +如果出现了下面的错误, + +![](media/d28b6c5e33fffd309bde68093f212313.png) + +请持续执行 **teedoc build,这是一个teedoc 的bug 。 直到出现下面的信息为止。** + +**![](media/119d57a4919443d8f3a9e0a5bb5ac64a.png)** + +编译完成以后,我们可以在本地部署网站了。 +```bash +PS E:\\work\\temp\\Community-document\> teedoc serve + +2021-03-18 17:37:34 - [INFO] - [Thread-50]: root dir: +E:/work/temp/Community-document/out + +2021-03-18 17:37:34 - [INFO] - [Thread-50]: Starting server at 0.0.0.0:2333 .... +``` + +出现了上面的信息以后, 就可以访问 , +查看对应的文章了。 + +http://127.0.0.1:2333/doc/doc + +### 新增添加文档 + +#### 新建一个md文件,然后添加内容 + +下面我们演示一下,怎样在FAQ文件夹下面新增一篇文章。 + +##### !!(重要)同步代码 + +每一次修改文档之前,都建议同步一次代码。 + +![](media/d33aa45f8dc99af2409bddef280519fc.png) + +然后新建一个本地分支 + +![](media/9069cf02cdb7489443c5c9719012399f.png) + +新建loacl_write_doc分支 + +![](media/6c6cb269476d4a0b82b0039a59520ae4.png) + +![](media/232112373152af2c0ecdba8f867ad965.png) + +> 假设我们需要在 docs/zh 文件夹下面新建一个文章 + +> 然后新建一个 md文件命名为 others.md + +> ![](media/b2aeef716dd0341ef9af3ab630117d21.png) + +然后我们可以使用Typora — a markdown editor, markdown reader. +软件打开,修改编辑文档。也可以使用vscode。 你也可以使用其他的 markdwon +编辑工具, + +##### 修改侧边栏目录 sidebar.yaml 文件 + +![](media/ec285c9fb0731355ce3b2f99aed57e20.png) + +然后修改sidebar.yaml 文件, 添加下面两句 +```bash +- label: 其他问题 +file: others/others.md +``` +![](media/03bd99c2741d455894dde05a7efa76df.png) + +上面修改完成以后, 可以参考《本地编译预览网站》 在本地预览效果。 + +![](media/2e3623754f881f6509c9bfe83add627d.png) + +## 修改提交本地内容 + +#### 使用 Sourcetree 在本地修改,暂存本地修改 + +###### 暂存区, 未存区, 文件详细修改的区域 + +![](media/28b4959b7c0fcebcc5473a1a92a7f55f.png) + +###### 提交 commit ,讲文件存入缓存区 + +![](media/549111123c867b49d5866a1888a87139.png) + +###### 推送到自己的仓库 + +![](media/20d86071c46c8ac071d40b69c5391538.png) + +###### 在gitee推送到主仓库, 使用pull requst 提交到主仓库。 + +![](media/36649f7f072179c5f66469faa8cb5c90.png) + +![](media/915236af05ccce877ff89c16bc8c6d9e.png) + +###### 填写详细信息,通知主仓库合并。 + +![](media/d6b7b0ca15c429c0deec153a1b8a7f51.png) + +###### 主仓库合并以后,同步主仓库 + +![](media/32ad741bdff696c303ddee76eeb88677.png) + +#### 在本地修改未提交的情况下, 拉取最新分支。然后提交本地分支 + +![](media/3cd17618606dfc34f8b1a2f5966c7e91.png) + +![](media/2737bff4059f30ffbdbddb60c37980a6.png) + +![](media/e20c84d0e318efc0e1bb90c1ec2eb44b.png) + +![](media/3ecb9425d13ffaf2eca140785cb1a2c9.png) + +![](media/748690654f71e0217ec7f8ac9b9f373f.png) + +![](media/2c7b59fe3c8411f610b1c2da72e60416.png) + +### 解决云端提交冲突 + +云端显示提交的pr存在冲突的时候,可以通过**web IDE**进行处理。 +![显示云端冲突的解决方法](media/Qp_Faq_join_us_052.png) + +更多详细信息请参考 +[Gitee在线解决代码冲突功能上线,无需手动修改轻松解决冲突](https://blog.gitee.com/2020/06/17/code-conflict/) +## 文档修改 + +### 格式问题 + +##### 图片名字格式 + +```bash +![温湿度传感器](media/Qp_Advanced_development_QuecPythonSub_i2c_bus_02.png) +``` + +##### 使用 - 表示list。 + +```bash +- A +- B +- C +``` + +不要使用 + +```bash +1.A +2.B +3.C +``` + +![](media/85156b64ef3e6223d65775b6ba68979e.png) + +### 不能使用的关键字 +不能使用的关键词 +![请不到使用关键词](media/Qp_Faq_join_us_050.png) + + + +### 如何引用相对路径 +#### 编译产生后的路径 +**README.md** 文件比较特殊、会被编译成为 index.html +其他的 md文件、则是保留文件名、仅仅修改后缀。 +比如 **Applicable_Scenarios.md** 会被编译成为 **Applicable_Scenarios.html**。 +```python +$ find . -name Applicable_Scenarios.*  +# html 是编译产生后的文件 +./out/doc/doc/Quecpython_intro/zh/Qp_Product_intro/Applicable_Scenarios.html +# md 是源文件 +./docs/Quecpython_intro/zh/Qp_Product_intro/Applicable_Scenarios.md +``` + +如果你想在此文档下中引用同目录下的某一篇文档。例如,想在“参与贡献”这篇文档下引用“QuecPython测试问题”: + +image-20210413133312774 + +1.先选择md编辑工具中“格式”的“超链接”。 + + + +image-20210413140651563 + + + +2.选中超链接后,是需要编辑的超链接的显示名以及相对连接。具体位置如下图 + +![image-20210414100547601](media/image-20210414100547601.png) + +(1)对于超链接的显示名,无所多说,这里需要引用“QuecPython测试问题”,那么就在左侧方框填入“QuecPython测试问题” + +(2)对于相对的超链接地址,需要确保一点,就是找到你书写的这边文章与引用文章的共同地址 + +- 例如本篇文章的地址是:..\Community-document\docs\FAQ\zh\README.md +- 需要引用的文章地址是:..\Community-document\docs\FAQ\zh\QP_test\QP_test.md + +共同地址说明如下图: + +![image-20210414101442749](media/image-20210414101442749.png) + +那么引用的相对超连接地址需要确保引用地址至少包含一层相对地址,即至少保证“共同地址的倒数第一层” + +综上所述,实际上编写的相对超链接是: + +![image-20210414101825132](media/image-20210414101825132.png) + +3.由于teedoc build 命令是将 md文件编译成为 html 文件,所以如果你需要超链接一个文档,实际上是超链接这个md文件编译后的html文件,即编写超连接如下: + +![image-20210414102003409](media/image-20210414102003409.png) -等待补充 \ No newline at end of file diff --git a/docs/FAQ/zh/config.json b/docs/FAQ/zh/config.json index 10c2a1cc1964035be8ce534c1a708e32e4094fcc..e4774598aadad1ddb81270078b2f24592283fa40 100644 --- a/docs/FAQ/zh/config.json +++ b/docs/FAQ/zh/config.json @@ -1,92 +1,21 @@ { - "class": "language_zh", + "import": "config_zh", "navbar": { - "title": "QuecPython", - "logo": { - "alt": "teedoc logo", - "src": "/static/image/quectel.png" - }, - "home_url": "/", "items": [ { - "url": "https://python.quectel.com/wiki/#/", - "label": "wiki", - "position": "left" - }, - { - "label": "    文档    ", - "position": "left", - "items": [ - { - "url": "/doc/Quecpython_intro/zh/index.html", - "label": "产品介绍" - }, - { - "url": "/doc/Quick_start/zh/index.html", - "label": "快速开始" - }, - { - "url": "/doc/sbs/zh/index.html", - "label": "手把手教程" - }, - { - "url": "/doc/Advanced_development/zh/index.html", - "label": "开发进阶" - }, - { - "url": "/doc/little_demo/zh/index.html", - "label": "小实验" - }, - { - "url": "/doc/Product_case/zh/index.html", - "label": "产品案例" - }, - { - "url": "/doc/Mass_production/zh/index.html", - "label": "产品量产" - }, - { - "url": "/doc/FAQ/zh/index.html", - "label": "常见问题" - } - ] - }, - { - "label": "GitHub", + "id": "language", + "label": "Language: ", "position": "right", - "url": "https://github.com/quecpython/Community-document" - } - ] - }, - "footer": { - "top": [ - { - "label": "链接", - "items": [ - { - "label": "使用 teedoc 构建", - "url": "https://github.com/neutree/teedoc", - "target": "_blank" - }, - { - "label": "Copyright © 2021 Neucrack", - "url": "https://neucrack.com", - "target": "_blank" - } - ] - }, - { - "label": "源码", "items": [ { - "label": "github", - "url": "https://github.com/neutree/teedoc", - "target": "_blank" + "id": "zh", + "url": "/doc/FQA/zh/", + "label": "中文" }, { - "label": "本网站源文件", - "url": "https://github.com/quecpython/Community-document", - "target": "_blank" + "id": "en", + "url": "/doc/FQA/en/", + "label": "English" } ] } diff --git a/docs/FAQ/zh/gitee_issue/gitee_issue.md b/docs/FAQ/zh/gitee_issue/gitee_issue.md new file mode 100644 index 0000000000000000000000000000000000000000..0cf83fcbd342440a8aff8ddce20dd64c0595043a --- /dev/null +++ b/docs/FAQ/zh/gitee_issue/gitee_issue.md @@ -0,0 +1,62 @@ +## 文档历史 + + +| **版本** | **日期** | **作者** | **变更表述** | +| -------- | ---------- | -------- | ---------------------------------- | +| 1.0 | 2021-4-13 | 周成柱 | 初始版本 | + + +## gitee issue 文档系统管理 +本篇文章主要是分享 gitee issue 的使用技巧。以及 提交 文档系统 错误的问题。 + +![gitee issue 管理系统](media/Qp_gitee_issue_01.png) + +## 新建issue + +### issue 分类 + - 网站格式需求 + - 文档重复 + - 文档内容错误 + - 文档代码复现错误 + - 文档图片错误 + + +如果是想要修改的文档、 请记住添加以下 文档的**网络路径**、减少别人查找文档的成本。 + +### 添加提醒人 +在 注释中 输入 @ 、 添加提醒人。 +![gitee issue 添加提醒人](media/Qp_gitee_issue_02.png) +### 添加责任人 +略 +### 添加issue 类别 +略 +### 添加优先级 +略 + +## 关闭issue +### 手动关闭 +使用看板、 关闭 +1. 选择自己负责的 +![gitee issue 看板](media/Qp_gitee_issue_03.png) +左右滑动对应的选项卡、即可关闭 + +### 提交pr、关联关闭 +1. 首先确定需要关闭的 issue 号 ,比如我这里需要关闭 **#I3IACO** issue +![gitee issue 详细信息](media/Qp_gitee_issue_04.png) + +2. 在 pr 注释里面 添加 需要关闭的 issue 号 +在提交 Pr 的时候、 输入 **#** 、 会自动的弹出issues。 选择即可。 +当然你也可以手动输入 issue号。 +![gitee 提交pr、关联issue](media/Qp_gitee_issue_05.png) + +## issue - 任务分配 +分为 前后期。 +1. 前期确定不了任务具体归属人的、 统一分配给管理员账号 QuecPython 。 然后由管理员具体分配对应的负责人完成任务。 +2. 在前期实践迭代过程中、完善大概的文档责任划分。 形成每一篇文章、有一个对应的负责人。具体的责任划分、组内沟通进行划分。 + +## 熟悉mailstone 的流程规范 +### 什么是 mailstone ? +里程碑、 达到当前节点。 表示我们需要完成那些任务。 + +### 怎样管理里程碑 +我们设计一个个小的里程碑。 尽量在每个时间节点上面, 完成所有的任务。 \ No newline at end of file diff --git a/docs/FAQ/zh/gitee_issue/media/Qp_gitee_issue_01.png b/docs/FAQ/zh/gitee_issue/media/Qp_gitee_issue_01.png new file mode 100755 index 0000000000000000000000000000000000000000..65420d1c0d2c6a163d71d6bfebeeb9082a4147f1 Binary files /dev/null and b/docs/FAQ/zh/gitee_issue/media/Qp_gitee_issue_01.png differ diff --git a/docs/FAQ/zh/gitee_issue/media/Qp_gitee_issue_02.png b/docs/FAQ/zh/gitee_issue/media/Qp_gitee_issue_02.png new file mode 100755 index 0000000000000000000000000000000000000000..a99a8e216d1a0109015541a451b729b75bc7d041 Binary files /dev/null and b/docs/FAQ/zh/gitee_issue/media/Qp_gitee_issue_02.png differ diff --git a/docs/FAQ/zh/gitee_issue/media/Qp_gitee_issue_03.png b/docs/FAQ/zh/gitee_issue/media/Qp_gitee_issue_03.png new file mode 100755 index 0000000000000000000000000000000000000000..0d7bbbd51fb2a6cd30e0263e8947b98bf14c8faa Binary files /dev/null and b/docs/FAQ/zh/gitee_issue/media/Qp_gitee_issue_03.png differ diff --git a/docs/FAQ/zh/gitee_issue/media/Qp_gitee_issue_04.png b/docs/FAQ/zh/gitee_issue/media/Qp_gitee_issue_04.png new file mode 100755 index 0000000000000000000000000000000000000000..f27f4b22fe57cca37ac46baf61b6a5929b5fa37b Binary files /dev/null and b/docs/FAQ/zh/gitee_issue/media/Qp_gitee_issue_04.png differ diff --git a/docs/FAQ/zh/gitee_issue/media/Qp_gitee_issue_05.png b/docs/FAQ/zh/gitee_issue/media/Qp_gitee_issue_05.png new file mode 100755 index 0000000000000000000000000000000000000000..71ae69208fa42de67af694e99876d7ba699e5df0 Binary files /dev/null and b/docs/FAQ/zh/gitee_issue/media/Qp_gitee_issue_05.png differ diff --git a/docs/FAQ/zh/join_us/README.md b/docs/FAQ/zh/join_us/README.md deleted file mode 100755 index 015a8e5096af2b01568039dce0155e4a9c34174a..0000000000000000000000000000000000000000 --- a/docs/FAQ/zh/join_us/README.md +++ /dev/null @@ -1,297 +0,0 @@ -## 参与贡献 -知识共享许可协议 -您可以自由地: - -分享 — 在任何媒介以任何形式复制、发行本文档。 - -演绎 — 修改、转换或以本文档为基础进行创作。 - -只要你遵守许可协议条款,许可人就无法收回你的这些权利。 - -惟须遵守下列条件: - -署名 — 您必须提供适当的证书,提供一个链接到许可证,并指示是否作出更改。您可以以任何合理的方式这样做,但不是以任何方式表明,许可方赞同您或您的使用。 - -非商业性使用 — 您不得将本文档用于商业目的。 - -相同方式共享 — 如果您的修改、转换,或以本文档为基础进行创作,仅得依本素材的授权条款来散布您的贡献作品。 - -没有附加限制 — 您不能增设法律条款或科技措施,来限制别人依授权条款本已许可的作为。 - -声明: - -当您使用本素材中属于公众领域的元素,或当法律有例外或限制条款允许您的使用,则您不需要遵守本授权条款。 - -未提供保证。本授权条款未必能完全提供您预期用途所需要的所有许可。例如:形象权、隐私权、著作人格权等其他权利,可能限制您如何使用本素材。 - -## 文档写作规范 -Quecpython 欢迎开发者参与到开源社区的贡献中来,本文主要介绍参与Quecpython文档贡献的写作规范,如果贡献者提交文档的修改或提交新的文档,请参照此规范。 - -### **目录结构** - - -**teedoc 不建议使用一级标题**,对应文档名称,其他标题名称内容不做限制,**标题不用加序号,** -注意子级标题不要太多。理论上目录支持到六级标题,但是建议到四级标题就ok了。 - -### **代码块规范** - -编码代码的时候请选择高亮语法. 具体请参考 [Markdown 语法说明 (简体中文版)](https://link.zhihu.com/?target=http%3A//www.appinn.com/markdown/) - - - -### **代码链接&图片链接** - -下载代码链接相对路径为code/代码名称,图片链接为media/图片名称,代码名称最好下划线组合一下 -防止重复,图片名称长一点,可以用生成的图片,也可以用文件名称+序号也是为了防止重复 -请不要使用中文作为文件名 - -```c - ``` - ![图片标注](address) - ![图片标注](media/9351c08c142de93cfa88095688ab7535.png) - ``` -``` - -图片标注可以为中文, 但是 **address** 必须使用全英文. -## 使用SourceTree拉取代码 - -想要参加文档的贡献,需要首先安装下面的工具 -1. [淘宝-git镜像库](https://npm.taobao.org/mirrors/git-for-windows/) -2. [Sourcetree | Free Git GUI for Mac and Windows (建议)](https://www.sourcetreeapp.com/) - -当然你如果熟悉 **git** 的使用,就可以不用安装 **Sourcetree**了。 如果开始学习,建议使用 **sourcetree** 管理版本。 - - - - -我们使用的是[github](https://github.com/)提交存储代码, 首先需要安装[git](https://git-scm.com/), -不过官网的下载速度比较感人,建议到[淘宝-git镜像库](https://npm.taobao.org/mirrors/git-for-windows/)下载最新git客户端, -更多关于git的使用可以参考[廖雪峰的Git教程](https://www.liaoxuefeng.com/wiki/896043488029600/) - -**到这里,认为你已经可以安装好了git** - -git 属于命令行工具, 不宜使用。 推荐使用git 的gui工具 **SourceTree**。 - -关于 SourceTree 更多的内容可以在 [Sourcetree | Free Git GUI for Mac and Windows (sourcetreeapp.com)](https://www.sourcetreeapp.com/) 处查看。 - - - -### SourceTree 安装 - -关于 SourceTree 的安装请参考 [SourceTree安装及卸载 - 爱码网 (likecs.com)](http://www.likecs.com/show-118323.html) - -### FORK & 拉取代码 - -文档仓库地址为 - -```bash -https://github.com/quecpython/Community-document -``` - -1. 首先请使用**邮箱**注册[GitHub](https://github.com/)账号。 -2. 然后请使用注册的账号,fork [quecpython/Community-document (github.com)](https://github.com/quecpython/Community-document)仓库。 - 具体请参考 [Fork 一个仓库 - 简书 (jianshu.com)](https://www.jianshu.com/p/7935afee30e8) - -### **注意事项** - -仓库的 **clone** 路径是你自己账户的名称。 比我的账户名称是 **youtao-cQ** 。 -那么我的克隆地址就是如下。 - -```c -https://github.com/youtao-cQ/Community-document -``` - -![](media/sourcetree_clone_01.png) - - - -拉取代码以后我们可以看到下面的情形。 - -![](media/sourcetree_clone_02.png) - - - -### teedoc 部署& 预览 - -使用 cmd 或者 powershell 进入 **E:\work\temp**。 当前目录有一个 .git 的隐藏文件夹 - -```bash -PS E:\work\temp> dir - - - 目录: E:\work\temp - - -Mode LastWriteTime Length Name ----- ------------- ------ ---- -d----- 2021/3/8 22:04 .github -d----- 2021/3/9 9:41 .vscode -d----- 2021/3/8 22:04 docs -d----- 2021/3/8 22:04 pages -d----- 2021/3/8 22:04 static --a---- 2021/3/8 22:04 120 .gitignore --a---- 2021/3/8 22:04 3223 auto_creat_toc.py - -``` - -首先请使用 pip3 安装 teedoc. - -```bash -pip3 install teedoc -``` - - - -- **安装 teedoc** 插件 - -```python -PS E:\work\temp\Community-document> teedoc install -``` - -- **build , 将md 转化成为 html** - -```bash -PS E:\work\temp\Community-document> teedoc build -``` - -- **部署 ** - -``` -PS E:\work\temp\Community-document> teedoc serve -2021-03-08 20:42:01 - [INFO] - [Thread-26]: Starting server at 0.0.0.0:2333 .... -``` - -- **预览** - -我们可以看到映射的端口为2333. 在浏览器中输入 http://127.0.0.1:2333/ 。 就可以访问预览网站了。 - -``` -http://127.0.0.1:2333/ -``` - - - -![](media/Quecpython_main_html.png) - - - -### 小技巧 - -​ 如果仅仅只需要修改 md内容文件, 我们使用 **teedoc serve**部署以后。 修改md文件, 可以实时显示在网页上面,不用重新build。 修改了其他的文件,就需要重新编译。 - -## quick start - -### 新建一个md文件,然后添加内容 - -下面我们演示一下,怎样在FAQ文件夹下面新增一篇文章。 - -#### !!(重要)**同步代码** - - - -![](media/sourcetree_rebase_00.png) - -代码同步完成以后, - -#### 新建本地分支,继续新分支修改文档 - -![](media/sourcetree_creat_branch_01.png) - - - -![](media/sourcetree_creat_branch_02.png) - -![](media/sourcetree_creat_branch_03.png) - -#### **在docs/zh 新建文件夹 以及 md文件** - -**`请确认当前是基于刚才新建的本地分支,而不是 develop 分支。`** - -在**docs/zh** 中新建others 文件夹 - -然后新建一个 md文件命名为 others.md - -![创建others文件夹](media/creat_others_dir.png) - - - - - -然后我们可以使用[Typora — a markdown editor, markdown reader.](https://www.typora.io/) 软件打开,修改编辑文档。 - -也可以使用vscode。 - - - -#### **修改侧边栏目录 sidebar.yaml 文件** - -![](media/sidebar_file.png) - -然后修改sidebar.yaml 文件, 添加下面两句 - -``` - - label: 其他问题 - file: others/others.md -``` - - - -![](media/change_sidebar_file_obj.png) - - - -#### 预览 - -修改完成以后,参考 《本文 teedoc 部署& 预览 章节》,测试查看效果。 - -最终我们可以在浏览器中看到如下效果 - -![](media/Quecpyton_webpage_others_pages.png) - -我们修改完成了以后,需要提交代码。 - -![](media/sourcetree_push_01.png) - -![](media/sourcetree_push_02.png) - -然后点击提交即可。 - -最后我们可以在history 状态中看到我们提交的代码 - -![](media/sourcetree_push_03.png) - - - -最后我们需要将代码push 我们自己本身的fork 以后的仓库,最后提交到 [quecpython/Community-document (github.com)](https://github.com/quecpython/Community-document) - -![](media/sourcetree_push_05.png) - - - -### 提交pull request - -我们在上一节看到提交了本地的commit 到自己的仓库以后。下面我们需要在云端操作,将commit pull 到[quecpython/Community-document (github.com)](https://github.com/quecpython/Community-document) - -主仓库, - - - -1. 切换到我们新建的分支。 - -![](media/sourcetree_pull_request_01.png) - - - -2. 选择 pull request 分支。 - -![](media/sourcetree_pull_request_02.png) - - - -3. 填写评论,提交pull request . - -![](media/sourcetree_pull_request_03.png) - - - -4。 等待主仓库合并 diff --git a/docs/FAQ/zh/join_us/media/Quecpython_main_html.png b/docs/FAQ/zh/join_us/media/Quecpython_main_html.png deleted file mode 100755 index 9826d5a7d22db272c4055bbc30ef80d596ae15e3..0000000000000000000000000000000000000000 Binary files a/docs/FAQ/zh/join_us/media/Quecpython_main_html.png and /dev/null differ diff --git a/docs/FAQ/zh/join_us/media/Quecpyton_webpage_others_pages.png b/docs/FAQ/zh/join_us/media/Quecpyton_webpage_others_pages.png deleted file mode 100755 index 731f1a5c7b48ee5234316f38a8d4e13b409fed51..0000000000000000000000000000000000000000 Binary files a/docs/FAQ/zh/join_us/media/Quecpyton_webpage_others_pages.png and /dev/null differ diff --git a/docs/FAQ/zh/join_us/media/change_sidebar_file_obj.png b/docs/FAQ/zh/join_us/media/change_sidebar_file_obj.png deleted file mode 100755 index f964af1c900312e8dcdb7e311305794a8cd4924a..0000000000000000000000000000000000000000 Binary files a/docs/FAQ/zh/join_us/media/change_sidebar_file_obj.png and /dev/null differ diff --git a/docs/FAQ/zh/join_us/media/creat_others_dir.png b/docs/FAQ/zh/join_us/media/creat_others_dir.png deleted file mode 100755 index 59597e1383a514a6ea9a275b855bc497117900f8..0000000000000000000000000000000000000000 Binary files a/docs/FAQ/zh/join_us/media/creat_others_dir.png and /dev/null differ diff --git a/docs/FAQ/zh/join_us/media/install_sourcetree_01.png b/docs/FAQ/zh/join_us/media/install_sourcetree_01.png deleted file mode 100755 index 837550511da6b06fe30b50c7e30feb8c8f0d3a17..0000000000000000000000000000000000000000 Binary files a/docs/FAQ/zh/join_us/media/install_sourcetree_01.png and /dev/null differ diff --git a/docs/FAQ/zh/join_us/media/install_sourcetree_02.png b/docs/FAQ/zh/join_us/media/install_sourcetree_02.png deleted file mode 100755 index 9cc706f9cf4810cce3c3cf5b6637f8dc6134ecae..0000000000000000000000000000000000000000 Binary files a/docs/FAQ/zh/join_us/media/install_sourcetree_02.png and /dev/null differ diff --git a/docs/FAQ/zh/join_us/media/open-git-bash.png b/docs/FAQ/zh/join_us/media/open-git-bash.png deleted file mode 100755 index 08c501fe8d9cc43b3779b96596e24e6aaa6e5971..0000000000000000000000000000000000000000 Binary files a/docs/FAQ/zh/join_us/media/open-git-bash.png and /dev/null differ diff --git a/docs/FAQ/zh/join_us/media/sidebar_file.png b/docs/FAQ/zh/join_us/media/sidebar_file.png deleted file mode 100755 index 5438515bfce65f513ff59c580156eec3d8d900c4..0000000000000000000000000000000000000000 Binary files a/docs/FAQ/zh/join_us/media/sidebar_file.png and /dev/null differ diff --git a/docs/FAQ/zh/join_us/media/sourcetree_clone_01.png b/docs/FAQ/zh/join_us/media/sourcetree_clone_01.png deleted file mode 100755 index e7ca44c2c96000801d433615ff257d959eff610f..0000000000000000000000000000000000000000 Binary files a/docs/FAQ/zh/join_us/media/sourcetree_clone_01.png and /dev/null differ diff --git a/docs/FAQ/zh/join_us/media/sourcetree_clone_02.png b/docs/FAQ/zh/join_us/media/sourcetree_clone_02.png deleted file mode 100755 index 99480b28ddbc1a92639057a05a307632f2188983..0000000000000000000000000000000000000000 Binary files a/docs/FAQ/zh/join_us/media/sourcetree_clone_02.png and /dev/null differ diff --git a/docs/FAQ/zh/join_us/media/sourcetree_creat_branch_01.png b/docs/FAQ/zh/join_us/media/sourcetree_creat_branch_01.png deleted file mode 100755 index eee60479549e9082afd36bdf3d6740f51faad03e..0000000000000000000000000000000000000000 Binary files a/docs/FAQ/zh/join_us/media/sourcetree_creat_branch_01.png and /dev/null differ diff --git a/docs/FAQ/zh/join_us/media/sourcetree_creat_branch_02.png b/docs/FAQ/zh/join_us/media/sourcetree_creat_branch_02.png deleted file mode 100755 index e1a2350f690724c9b93d4844939178647f40b7f7..0000000000000000000000000000000000000000 Binary files a/docs/FAQ/zh/join_us/media/sourcetree_creat_branch_02.png and /dev/null differ diff --git a/docs/FAQ/zh/join_us/media/sourcetree_creat_branch_03.png b/docs/FAQ/zh/join_us/media/sourcetree_creat_branch_03.png deleted file mode 100755 index bb0a7f5d5ce5416d2924dbe582b9063167b85bbb..0000000000000000000000000000000000000000 Binary files a/docs/FAQ/zh/join_us/media/sourcetree_creat_branch_03.png and /dev/null differ diff --git a/docs/FAQ/zh/join_us/media/sourcetree_fork_02.png b/docs/FAQ/zh/join_us/media/sourcetree_fork_02.png deleted file mode 100755 index e25acde0f93ef375472cf6ab710786832b06d6a7..0000000000000000000000000000000000000000 Binary files a/docs/FAQ/zh/join_us/media/sourcetree_fork_02.png and /dev/null differ diff --git a/docs/FAQ/zh/join_us/media/sourcetree_pull_request_01.png b/docs/FAQ/zh/join_us/media/sourcetree_pull_request_01.png deleted file mode 100755 index 62a0052e45a21f69742875909797a9ed29da8bf8..0000000000000000000000000000000000000000 Binary files a/docs/FAQ/zh/join_us/media/sourcetree_pull_request_01.png and /dev/null differ diff --git a/docs/FAQ/zh/join_us/media/sourcetree_pull_request_02.png b/docs/FAQ/zh/join_us/media/sourcetree_pull_request_02.png deleted file mode 100755 index 775c63b99ddf9c65b493a88b3cc69ec5d1cc1106..0000000000000000000000000000000000000000 Binary files a/docs/FAQ/zh/join_us/media/sourcetree_pull_request_02.png and /dev/null differ diff --git a/docs/FAQ/zh/join_us/media/sourcetree_pull_request_03.png b/docs/FAQ/zh/join_us/media/sourcetree_pull_request_03.png deleted file mode 100755 index 9b187e617f59e7a4568befaf07c8f6f2d1ea7273..0000000000000000000000000000000000000000 Binary files a/docs/FAQ/zh/join_us/media/sourcetree_pull_request_03.png and /dev/null differ diff --git a/docs/FAQ/zh/join_us/media/sourcetree_push_01.png b/docs/FAQ/zh/join_us/media/sourcetree_push_01.png deleted file mode 100755 index b99bd1a9f802aa9bfd79a7371f5bd23192e05547..0000000000000000000000000000000000000000 Binary files a/docs/FAQ/zh/join_us/media/sourcetree_push_01.png and /dev/null differ diff --git a/docs/FAQ/zh/join_us/media/sourcetree_push_02.png b/docs/FAQ/zh/join_us/media/sourcetree_push_02.png deleted file mode 100755 index 9a018fbdaf7861124fc6aadf8977a5cacf8e6432..0000000000000000000000000000000000000000 Binary files a/docs/FAQ/zh/join_us/media/sourcetree_push_02.png and /dev/null differ diff --git a/docs/FAQ/zh/join_us/media/sourcetree_push_03.png b/docs/FAQ/zh/join_us/media/sourcetree_push_03.png deleted file mode 100755 index 77a3130813eb0c681657c4d2aa58e1b80803122b..0000000000000000000000000000000000000000 Binary files a/docs/FAQ/zh/join_us/media/sourcetree_push_03.png and /dev/null differ diff --git a/docs/FAQ/zh/join_us/media/sourcetree_push_04.png b/docs/FAQ/zh/join_us/media/sourcetree_push_04.png deleted file mode 100755 index 4bbd0151e258d5e4214e75da6c318a329afbda35..0000000000000000000000000000000000000000 Binary files a/docs/FAQ/zh/join_us/media/sourcetree_push_04.png and /dev/null differ diff --git a/docs/FAQ/zh/join_us/media/sourcetree_push_05.png b/docs/FAQ/zh/join_us/media/sourcetree_push_05.png deleted file mode 100755 index 1cd67c5cc26f4f92806663d2269c0a189ec80676..0000000000000000000000000000000000000000 Binary files a/docs/FAQ/zh/join_us/media/sourcetree_push_05.png and /dev/null differ diff --git a/docs/FAQ/zh/join_us/media/sourcetree_rebase_00.png b/docs/FAQ/zh/join_us/media/sourcetree_rebase_00.png deleted file mode 100755 index 4f39435110bd585248e162f1a7e33ff0717464e9..0000000000000000000000000000000000000000 Binary files a/docs/FAQ/zh/join_us/media/sourcetree_rebase_00.png and /dev/null differ diff --git a/docs/FAQ/zh/media/03bd99c2741d455894dde05a7efa76df.png b/docs/FAQ/zh/media/03bd99c2741d455894dde05a7efa76df.png new file mode 100644 index 0000000000000000000000000000000000000000..62b10c4749690ab9e3a7f2d3fe52b8bc092cc91b Binary files /dev/null and b/docs/FAQ/zh/media/03bd99c2741d455894dde05a7efa76df.png differ diff --git a/docs/FAQ/zh/media/07e84b72f40480b3d47215bba25b991d.png b/docs/FAQ/zh/media/07e84b72f40480b3d47215bba25b991d.png new file mode 100644 index 0000000000000000000000000000000000000000..51d589c497636fe346263e5c073041d609ddca05 Binary files /dev/null and b/docs/FAQ/zh/media/07e84b72f40480b3d47215bba25b991d.png differ diff --git a/docs/FAQ/zh/media/119d57a4919443d8f3a9e0a5bb5ac64a.png b/docs/FAQ/zh/media/119d57a4919443d8f3a9e0a5bb5ac64a.png new file mode 100644 index 0000000000000000000000000000000000000000..5e3b4d81e36cfcfda33c52d0559d688be134532c Binary files /dev/null and b/docs/FAQ/zh/media/119d57a4919443d8f3a9e0a5bb5ac64a.png differ diff --git a/docs/FAQ/zh/media/20d86071c46c8ac071d40b69c5391538.png b/docs/FAQ/zh/media/20d86071c46c8ac071d40b69c5391538.png new file mode 100644 index 0000000000000000000000000000000000000000..a7421df26a5b96d6b6dbde53ae987b7c58113c8a Binary files /dev/null and b/docs/FAQ/zh/media/20d86071c46c8ac071d40b69c5391538.png differ diff --git a/docs/FAQ/zh/media/232112373152af2c0ecdba8f867ad965.png b/docs/FAQ/zh/media/232112373152af2c0ecdba8f867ad965.png new file mode 100644 index 0000000000000000000000000000000000000000..6665c746fe6d4802f934e5db973b6b8dd1de27f6 Binary files /dev/null and b/docs/FAQ/zh/media/232112373152af2c0ecdba8f867ad965.png differ diff --git a/docs/FAQ/zh/media/2402ce33f46407a306dbbc808a61c9dc.png b/docs/FAQ/zh/media/2402ce33f46407a306dbbc808a61c9dc.png new file mode 100644 index 0000000000000000000000000000000000000000..0afe65daec2bf9fe064f93aff24a6fbe299b0cf3 Binary files /dev/null and b/docs/FAQ/zh/media/2402ce33f46407a306dbbc808a61c9dc.png differ diff --git a/docs/FAQ/zh/media/2737bff4059f30ffbdbddb60c37980a6.png b/docs/FAQ/zh/media/2737bff4059f30ffbdbddb60c37980a6.png new file mode 100644 index 0000000000000000000000000000000000000000..c3c43df72bcead7bc09cde2cf1a22d3daa75e7dc Binary files /dev/null and b/docs/FAQ/zh/media/2737bff4059f30ffbdbddb60c37980a6.png differ diff --git a/docs/FAQ/zh/media/28b4959b7c0fcebcc5473a1a92a7f55f.png b/docs/FAQ/zh/media/28b4959b7c0fcebcc5473a1a92a7f55f.png new file mode 100644 index 0000000000000000000000000000000000000000..c74c62f499e76b0650e22ebfc55ff5f64b372d7a Binary files /dev/null and b/docs/FAQ/zh/media/28b4959b7c0fcebcc5473a1a92a7f55f.png differ diff --git a/docs/FAQ/zh/media/2c7b59fe3c8411f610b1c2da72e60416.png b/docs/FAQ/zh/media/2c7b59fe3c8411f610b1c2da72e60416.png new file mode 100644 index 0000000000000000000000000000000000000000..42569bfeea2b36f831bb07d648c177e5ae1a1263 Binary files /dev/null and b/docs/FAQ/zh/media/2c7b59fe3c8411f610b1c2da72e60416.png differ diff --git a/docs/FAQ/zh/media/2e3623754f881f6509c9bfe83add627d.png b/docs/FAQ/zh/media/2e3623754f881f6509c9bfe83add627d.png new file mode 100644 index 0000000000000000000000000000000000000000..3969641c807d3a0f6d9ec5da9bf9150406f01ae3 Binary files /dev/null and b/docs/FAQ/zh/media/2e3623754f881f6509c9bfe83add627d.png differ diff --git a/docs/FAQ/zh/media/32ad741bdff696c303ddee76eeb88677.png b/docs/FAQ/zh/media/32ad741bdff696c303ddee76eeb88677.png new file mode 100644 index 0000000000000000000000000000000000000000..5854529fbead2618a23da5158fcb976a12f4ef8a Binary files /dev/null and b/docs/FAQ/zh/media/32ad741bdff696c303ddee76eeb88677.png differ diff --git a/docs/FAQ/zh/media/346efc8943131e0cb6fb676aa2ae78f7.png b/docs/FAQ/zh/media/346efc8943131e0cb6fb676aa2ae78f7.png new file mode 100644 index 0000000000000000000000000000000000000000..83465f37b318e6c5ae3c1304ef30a15340bf3581 Binary files /dev/null and b/docs/FAQ/zh/media/346efc8943131e0cb6fb676aa2ae78f7.png differ diff --git a/docs/FAQ/zh/media/348a8cd3a03f723bbebd7c75d7318a77.png b/docs/FAQ/zh/media/348a8cd3a03f723bbebd7c75d7318a77.png new file mode 100644 index 0000000000000000000000000000000000000000..b89593a88074a4b9b6e5e613baf4f6caf5361676 Binary files /dev/null and b/docs/FAQ/zh/media/348a8cd3a03f723bbebd7c75d7318a77.png differ diff --git a/docs/FAQ/zh/media/36649f7f072179c5f66469faa8cb5c90.png b/docs/FAQ/zh/media/36649f7f072179c5f66469faa8cb5c90.png new file mode 100644 index 0000000000000000000000000000000000000000..7195395d44d9a27927e1d607aabfccaf2d788440 Binary files /dev/null and b/docs/FAQ/zh/media/36649f7f072179c5f66469faa8cb5c90.png differ diff --git a/docs/FAQ/zh/media/3cd17618606dfc34f8b1a2f5966c7e91.png b/docs/FAQ/zh/media/3cd17618606dfc34f8b1a2f5966c7e91.png new file mode 100644 index 0000000000000000000000000000000000000000..a4157ade56143e7ac866a080de95873de2db36db Binary files /dev/null and b/docs/FAQ/zh/media/3cd17618606dfc34f8b1a2f5966c7e91.png differ diff --git a/docs/FAQ/zh/media/3ecb9425d13ffaf2eca140785cb1a2c9.png b/docs/FAQ/zh/media/3ecb9425d13ffaf2eca140785cb1a2c9.png new file mode 100644 index 0000000000000000000000000000000000000000..08e1e8f9105d480cf5eb9e525aa6b86861d3bfbe Binary files /dev/null and b/docs/FAQ/zh/media/3ecb9425d13ffaf2eca140785cb1a2c9.png differ diff --git a/docs/FAQ/zh/media/549111123c867b49d5866a1888a87139.png b/docs/FAQ/zh/media/549111123c867b49d5866a1888a87139.png new file mode 100644 index 0000000000000000000000000000000000000000..6b3779271711555a7f04c98e0d1a92650bb4f7e8 Binary files /dev/null and b/docs/FAQ/zh/media/549111123c867b49d5866a1888a87139.png differ diff --git a/docs/FAQ/zh/media/6c6cb269476d4a0b82b0039a59520ae4.png b/docs/FAQ/zh/media/6c6cb269476d4a0b82b0039a59520ae4.png new file mode 100644 index 0000000000000000000000000000000000000000..598fb955ac1ed766bb71577411446da09ab598e8 Binary files /dev/null and b/docs/FAQ/zh/media/6c6cb269476d4a0b82b0039a59520ae4.png differ diff --git a/docs/FAQ/zh/media/748690654f71e0217ec7f8ac9b9f373f.png b/docs/FAQ/zh/media/748690654f71e0217ec7f8ac9b9f373f.png new file mode 100644 index 0000000000000000000000000000000000000000..0918f245f79073bc56f413680e5113af53fe53dc Binary files /dev/null and b/docs/FAQ/zh/media/748690654f71e0217ec7f8ac9b9f373f.png differ diff --git a/docs/FAQ/zh/media/7c729ff347d8b0b71ef1e4ddc1fb3ab6.png b/docs/FAQ/zh/media/7c729ff347d8b0b71ef1e4ddc1fb3ab6.png new file mode 100644 index 0000000000000000000000000000000000000000..99f7658eb27472e32280936b2bf4ca8df5b42103 Binary files /dev/null and b/docs/FAQ/zh/media/7c729ff347d8b0b71ef1e4ddc1fb3ab6.png differ diff --git a/docs/FAQ/zh/media/816606baf28959a11f18c6e24458e9e6.png b/docs/FAQ/zh/media/816606baf28959a11f18c6e24458e9e6.png new file mode 100644 index 0000000000000000000000000000000000000000..7461a9a75a1411a3dc69eba97cc9ceec6d35b2cb Binary files /dev/null and b/docs/FAQ/zh/media/816606baf28959a11f18c6e24458e9e6.png differ diff --git a/docs/FAQ/zh/media/85156b64ef3e6223d65775b6ba68979e.png b/docs/FAQ/zh/media/85156b64ef3e6223d65775b6ba68979e.png new file mode 100644 index 0000000000000000000000000000000000000000..ce35dc4618a7b8169e0fe28911b8a52ba26ff36d Binary files /dev/null and b/docs/FAQ/zh/media/85156b64ef3e6223d65775b6ba68979e.png differ diff --git a/docs/FAQ/zh/media/9069cf02cdb7489443c5c9719012399f.png b/docs/FAQ/zh/media/9069cf02cdb7489443c5c9719012399f.png new file mode 100644 index 0000000000000000000000000000000000000000..a61ff733b788742a1a4aeccfc2b7a4bd60dbf357 Binary files /dev/null and b/docs/FAQ/zh/media/9069cf02cdb7489443c5c9719012399f.png differ diff --git a/docs/FAQ/zh/media/915236af05ccce877ff89c16bc8c6d9e.png b/docs/FAQ/zh/media/915236af05ccce877ff89c16bc8c6d9e.png new file mode 100644 index 0000000000000000000000000000000000000000..d6cc5e1339852c719e344d02d26cc7b9e6ccc98d Binary files /dev/null and b/docs/FAQ/zh/media/915236af05ccce877ff89c16bc8c6d9e.png differ diff --git a/docs/FAQ/zh/media/Qp_Faq_join_us_050.png b/docs/FAQ/zh/media/Qp_Faq_join_us_050.png new file mode 100644 index 0000000000000000000000000000000000000000..4f71b2b1695561d7ea8e1cbd9e22feaa76eda20c Binary files /dev/null and b/docs/FAQ/zh/media/Qp_Faq_join_us_050.png differ diff --git a/docs/FAQ/zh/media/Qp_Faq_join_us_051.png b/docs/FAQ/zh/media/Qp_Faq_join_us_051.png new file mode 100644 index 0000000000000000000000000000000000000000..0ae6d928f7082edd4d1a5b6056f144e2362bcaab Binary files /dev/null and b/docs/FAQ/zh/media/Qp_Faq_join_us_051.png differ diff --git a/docs/FAQ/zh/media/Qp_Faq_join_us_052.png b/docs/FAQ/zh/media/Qp_Faq_join_us_052.png new file mode 100644 index 0000000000000000000000000000000000000000..18c0f2f2a32ebdd5bc09b529df512e42a1d55112 Binary files /dev/null and b/docs/FAQ/zh/media/Qp_Faq_join_us_052.png differ diff --git a/docs/FAQ/zh/media/Qp_Faq_join_us_053.png b/docs/FAQ/zh/media/Qp_Faq_join_us_053.png new file mode 100644 index 0000000000000000000000000000000000000000..4a4119a49b197cd150df94697bd73dc2912ca413 Binary files /dev/null and b/docs/FAQ/zh/media/Qp_Faq_join_us_053.png differ diff --git a/docs/FAQ/zh/media/Qp_Faq_join_us_054.png b/docs/FAQ/zh/media/Qp_Faq_join_us_054.png new file mode 100644 index 0000000000000000000000000000000000000000..52671136e3502da3c816c947317688cabffaf10d Binary files /dev/null and b/docs/FAQ/zh/media/Qp_Faq_join_us_054.png differ diff --git a/docs/FAQ/zh/media/a0bf255b7e26a6da128a9a6bfef9a98f.png b/docs/FAQ/zh/media/a0bf255b7e26a6da128a9a6bfef9a98f.png new file mode 100644 index 0000000000000000000000000000000000000000..c3838e42c6db983577e7f9fae3fa80afaea063a3 Binary files /dev/null and b/docs/FAQ/zh/media/a0bf255b7e26a6da128a9a6bfef9a98f.png differ diff --git a/docs/FAQ/zh/media/a5d1460f83ea10904febaaf1b6fa83eb.png b/docs/FAQ/zh/media/a5d1460f83ea10904febaaf1b6fa83eb.png new file mode 100644 index 0000000000000000000000000000000000000000..4ff76ed9a119ab043f4d2653d6b8ae45c78af484 Binary files /dev/null and b/docs/FAQ/zh/media/a5d1460f83ea10904febaaf1b6fa83eb.png differ diff --git a/docs/FAQ/zh/media/ac16302f7af83590b20ddbfc851f5489.png b/docs/FAQ/zh/media/ac16302f7af83590b20ddbfc851f5489.png new file mode 100644 index 0000000000000000000000000000000000000000..7529a7b3f0f39f7a3042bb746a4e95443d051349 Binary files /dev/null and b/docs/FAQ/zh/media/ac16302f7af83590b20ddbfc851f5489.png differ diff --git a/docs/FAQ/zh/media/b2aeef716dd0341ef9af3ab630117d21.png b/docs/FAQ/zh/media/b2aeef716dd0341ef9af3ab630117d21.png new file mode 100644 index 0000000000000000000000000000000000000000..c2636a30990c81485d3ea941723dbc15ca057edb Binary files /dev/null and b/docs/FAQ/zh/media/b2aeef716dd0341ef9af3ab630117d21.png differ diff --git a/docs/FAQ/zh/media/d28b6c5e33fffd309bde68093f212313.png b/docs/FAQ/zh/media/d28b6c5e33fffd309bde68093f212313.png new file mode 100644 index 0000000000000000000000000000000000000000..b47cf5f60567a24ee4eaf92c03232576f50a0938 Binary files /dev/null and b/docs/FAQ/zh/media/d28b6c5e33fffd309bde68093f212313.png differ diff --git a/docs/FAQ/zh/media/d33aa45f8dc99af2409bddef280519fc.png b/docs/FAQ/zh/media/d33aa45f8dc99af2409bddef280519fc.png new file mode 100644 index 0000000000000000000000000000000000000000..6c24752858e338a4aef69c6bfdff7c7cfd80708d Binary files /dev/null and b/docs/FAQ/zh/media/d33aa45f8dc99af2409bddef280519fc.png differ diff --git a/docs/FAQ/zh/media/d6b7b0ca15c429c0deec153a1b8a7f51.png b/docs/FAQ/zh/media/d6b7b0ca15c429c0deec153a1b8a7f51.png new file mode 100644 index 0000000000000000000000000000000000000000..957cd27e444aab9632ada7f0d74e27d9ee8b0eea Binary files /dev/null and b/docs/FAQ/zh/media/d6b7b0ca15c429c0deec153a1b8a7f51.png differ diff --git a/docs/FAQ/zh/media/e20c84d0e318efc0e1bb90c1ec2eb44b.png b/docs/FAQ/zh/media/e20c84d0e318efc0e1bb90c1ec2eb44b.png new file mode 100644 index 0000000000000000000000000000000000000000..afe7ec4d878dc7f595fddb18aac8daf19df6fbf7 Binary files /dev/null and b/docs/FAQ/zh/media/e20c84d0e318efc0e1bb90c1ec2eb44b.png differ diff --git a/docs/FAQ/zh/media/ec285c9fb0731355ce3b2f99aed57e20.png b/docs/FAQ/zh/media/ec285c9fb0731355ce3b2f99aed57e20.png new file mode 100644 index 0000000000000000000000000000000000000000..09469d7d1a0ac0723185dc7f6851785eaf73f89a Binary files /dev/null and b/docs/FAQ/zh/media/ec285c9fb0731355ce3b2f99aed57e20.png differ diff --git a/docs/FAQ/zh/media/image-20210413140504427.png b/docs/FAQ/zh/media/image-20210413140504427.png new file mode 100644 index 0000000000000000000000000000000000000000..aacdde2cf3177fba839098854e1126777262e000 Binary files /dev/null and b/docs/FAQ/zh/media/image-20210413140504427.png differ diff --git a/docs/FAQ/zh/media/image-20210414100029064.png b/docs/FAQ/zh/media/image-20210414100029064.png new file mode 100644 index 0000000000000000000000000000000000000000..b9e9b7a0aec91a6068c0c5ac346344755e87b6fc Binary files /dev/null and b/docs/FAQ/zh/media/image-20210414100029064.png differ diff --git a/docs/FAQ/zh/media/image-20210414100547601.png b/docs/FAQ/zh/media/image-20210414100547601.png new file mode 100644 index 0000000000000000000000000000000000000000..eae3f0a1f76c13fcb2568e77b4aa2585009e8bcb Binary files /dev/null and b/docs/FAQ/zh/media/image-20210414100547601.png differ diff --git a/docs/FAQ/zh/media/image-20210414101442749.png b/docs/FAQ/zh/media/image-20210414101442749.png new file mode 100644 index 0000000000000000000000000000000000000000..202275e662a07c5649d82b0d8363345898a03b7f Binary files /dev/null and b/docs/FAQ/zh/media/image-20210414101442749.png differ diff --git a/docs/FAQ/zh/media/image-20210414101510601.png b/docs/FAQ/zh/media/image-20210414101510601.png new file mode 100644 index 0000000000000000000000000000000000000000..202275e662a07c5649d82b0d8363345898a03b7f Binary files /dev/null and b/docs/FAQ/zh/media/image-20210414101510601.png differ diff --git a/docs/FAQ/zh/media/image-20210414101825132.png b/docs/FAQ/zh/media/image-20210414101825132.png new file mode 100644 index 0000000000000000000000000000000000000000..d6f2afd482adf963894d33621471410afc5d4d10 Binary files /dev/null and b/docs/FAQ/zh/media/image-20210414101825132.png differ diff --git a/docs/FAQ/zh/media/image-20210414102003409.png b/docs/FAQ/zh/media/image-20210414102003409.png new file mode 100644 index 0000000000000000000000000000000000000000..5750094c3d62a6e0cdfbba4c46576ef0640e1344 Binary files /dev/null and b/docs/FAQ/zh/media/image-20210414102003409.png differ diff --git a/docs/FAQ/zh/media/image-20210417094546127.png b/docs/FAQ/zh/media/image-20210417094546127.png new file mode 100644 index 0000000000000000000000000000000000000000..bab15af5508fce5acf2f9d8b639a3ba83d7fed2f Binary files /dev/null and b/docs/FAQ/zh/media/image-20210417094546127.png differ diff --git a/docs/FAQ/zh/sidebar.yaml b/docs/FAQ/zh/sidebar.yaml index 4ac49db8ae5e7b9c6feefa5c89ba52e9ce264d77..c4694f13131605e35de093a42df41ada976eac4e 100644 --- a/docs/FAQ/zh/sidebar.yaml +++ b/docs/FAQ/zh/sidebar.yaml @@ -1,8 +1,24 @@ -# FAQ 常见问题 +# FAQ常见问题 items: - - label: FAQ&常见问题 - file: README.md - label: 参与贡献 - file: join_us/README.md - - label: 其他问题 - file: others/others.md + items: + - label: gitee 提交代码以及文档编辑流程 + file: README.md + - label: gitee issue 使用教程 + file: gitee_issue/gitee_issue.md + - label: QuecPython_FAQ + items: + - label: QuecPython常见问题第一部分 + file: QP_common_question01/QP_common_question01.md + - label: QuecPython常见问题第二部分 + file: QP_common_question02/QP_common_question02.md + - label: QuecPython驱动固件脚本下载 + file: QP_download/QP_download.md + - label: QuecPython驱动安装失败问题解决 + file: QP_driver_failed/QP_driver_failed.md + - label: QuecPython救砖处理 + file: QP_recovery/QP_recovery.md + - label: QuecPython测试问题 + file: QP_test/QP_test.md + - label: QuecPython HeliosService问题 + file: QP_helios/HeliosService.md diff --git a/docs/Mass_production/zh/README.md b/docs/Mass_production/zh/README.md deleted file mode 100755 index c55238dde0d93f64eeb76181f140bee69e74f3f8..0000000000000000000000000000000000000000 --- a/docs/Mass_production/zh/README.md +++ /dev/null @@ -1,181 +0,0 @@ -# QuecPython 产品开发及量产方案 - -本文档主要介绍QuecPython 产品开发及量产方案。 - -本文档适用于移远通信如下模块: - -- EC100Y-CN - -- EC600S-CN - - -## 代码保护 - -登录官方网站“[资源下载](https://python.quectel.com/download)”,在**“工具”**栏中找到【QPYcom 图形化工具】 - -![3](media/mp3.png) - -打开QPYcom工具后,在**“下载”**选项中有【加密】【备份】的选项。加密功能用于保护用户的APP代码,解密后使源代码被掩盖;备份功能用于投入市场后,若APP意外丢失、被改写等,可从备份区恢复。 - -## 使用QPYcom生成量产固件包 - -合并源码后,用户在生产时,只需烧录一次固件即可完成生产,在合并时已经将用户的APP文件嵌入到固件中,因此烧录合并后的固件已经包含了用户的APP文件。 - -### 合并条件 - -1、合并的*.py*文件中必须包含*main.py*代码。 - -2、*main.py*代码中必须包含以下两行语句: - -​ PROJECT_NAME = 'QUEC_TEST' # 必须要有这行代码才能合并 - -​ PROJECT_VERSION = '1.0.0' # 必须要有这行代码才能合并 - -**注意:** - -在合并的所有*.py*文件中,*main.py*作为程序入口文件,工具自动不对其加密,故写代码时,从*main.py*调用其他文件的接口更加安全。 - -### 示例工程 - -*main.py*文件: - -```python -from usr import user_file # 用户的.py文件放在usr路径下,要用 from usr 导入APP -import utime - - -PROJECT_NAME = 'QUEC_TEST' # 必须要有这行代码才能合并 -PROJECT_VERSION = '1.0.0' # 必须要有这行代码才能合并 - - -if __name__ == "__main__": # 标准写法,从main.py开始执行 - while True: - user_file.Qprint() - user_file.Qlistdir() - utime.sleep_ms(300) - -``` - -*user_file.py*文件: - -```python -import uos - - -def Qprint(): - print('Hello World !') - - -def Qlistdir(): - print(uos.listdir('/usr')) - -``` - -将以上*main.py* 和*user_file.py*两个文件添加到要合并的*.py*中。固件建议使用官网发布的最新版本:“资源下载”---“资源”---“下载”中找到对应的固件 。 - -合并后的固件存放在用户指定的路径下,如《QUEC_TEST_1.0.0.zip》文件,文件名由*mian.py*中的变量**PROJECT_NAME**、**PROJECT_VERSION**组合而成。 - -**注意:** - -合并要和模组交互操作,故合并时需要连接模块,打开QuecPython的交互串口,并保证没有程序在运行,即能正常交互,方能合并: - -![4](media/mp4.png) - -仅需几秒钟,即可完成合并: - -![6](media/mp6.png) - -合并完成后的文件名是由*mian.py*中的变量**PROJECT_NAME**、**PROJECT_VERSION**组合而成 - -![6](media/mp5A.png) - -烧录合并后的固件,开机自动运行*main.py*: - -![5](media/mp5.png) - -## 量产工具 - -登录官方网站“[资源下载](https://python.quectel.com/download)”,在**“工具”**栏目中找到【QMulti 批量下载工具】 - -打开软件后,在**“Load FW Files”**中选择上面合并后的固件,点击**“Auto ALL”**后,即自动检测8个通道直至烧录完毕。 - -![7](media/mp7.png) - -1、夹具通过USB先接入电脑。 - -2、在电脑打开QMulti 批量下载工具,并选择要烧录的固件,随后软件会自动检测烧录。 - -3、只要夹具中的任意一个通信有模块接通电源,就会自动烧录。 - -**注意:** - -烧录失败,意外终止时,只需要模块重新上电即可继续烧录。 - -## 下载配套代码 - - 下载配套代码模板 - - 下载差分包生成教程和工具 - - - -## 失败问题处理 - -### AT口与USB串口未识别 - -检查串口驱动是否安装。若安装了驱动,设备管理器界面将显示如下: - -![](media/8.png) - -### Windows 7安装USB驱动命令交互串口未识别 - -**现象**: - -安装EC100Y-CN模块所需SDK包中的驱动Quectel_ASR_Series_UMTS<E_Windows_USB_Driver_Customer_V1.0.3.zip后,出现Windows7下未正常识别出模块的命令交互串口。 - -**原因**: - -Windows7下无法使用Microsoft的USB串行设备驱动程序。 - -**解决方案**: - -详见文档《EC100Y-CN\_Windows7安装USB驱动指令交互串口未识别解决方法》。 - -### 模块中有脚本文件运行 - -**现象**: - -合并失败,QPYcom烧录固件没有反应 - -上传py文件且文件名为*main.py*到模块后,无法任何执行指令(包括上传文件等) - -**原因**: - -模块在开机后会自动寻找运行文件名为*main.py*的脚本文件,如果*main.py*中存在*while*、*for(,,)*这种循环语句,会导致程序阻塞,串口被占用,无法进行其他操作。 - -**解决方案**: - -目前版本只能通过重刷固件解决此问题,建议在测试阶段尽量不要使用*main.py文件,可使用*start.py或其它命名来手动拉起项目,避免重刷固件。 - - - - - -## 附录A参考文档及术语缩写 - -表1:参考文档 - -| **序号** | **文档名称** | **备注** | -| -------- | ------------------------------------------------------- | --------------------------------------------- | -| [1] | Quectel QuecPython_QPYcom_用户指导 | QPYcom工具使用说明 | -| [2] | Quectel_QMulti_DL_用户指导 | QMulti_DL工具使用说明 | -| [3] | EC100Y-CN_Windows7安装USB驱动指令交互串口未识别解决方法 | Windows7安装USB驱动指令交互串口未识别解决方法 | - -表2:术语缩写 - -| **术语** | **英文全称** | **中文全称** | -| -------- | ------------------------ | -------------- | -| USB | Universal Serial Bus | 通用串行总线 | -| SDK | Software Development Kit | 软件开发工具包 | - -# \ No newline at end of file diff --git a/docs/Mass_production/zh/sidebar.yaml b/docs/Mass_production/zh/sidebar.yaml deleted file mode 100755 index 8dd85d9bace794d269979cd3dcea552b484ef9c7..0000000000000000000000000000000000000000 --- a/docs/Mass_production/zh/sidebar.yaml +++ /dev/null @@ -1,4 +0,0 @@ -# 产品量产 -items: - - label: 量产工具 - file: README.md \ No newline at end of file diff --git a/docs/Product_case/en/README.md b/docs/Product_case/en/README.md new file mode 100644 index 0000000000000000000000000000000000000000..4b644ba86ad2948cbf0f27897128ab06491b5413 --- /dev/null +++ b/docs/Product_case/en/README.md @@ -0,0 +1,4 @@ + +## Mass production case + +To be added diff --git a/docs/Product_case/en/config.json b/docs/Product_case/en/config.json new file mode 100644 index 0000000000000000000000000000000000000000..c10df20945131cb903d90817c186b9465cada08e --- /dev/null +++ b/docs/Product_case/en/config.json @@ -0,0 +1,24 @@ +{ + "import": "config_en", + "navbar": { + "items": [ + { + "id": "language", + "label": "Language: ", + "position": "right", + "items": [ + { + "id": "zh", + "url": "/doc/Product_case/zh/", + "label": "中文" + }, + { + "id": "en", + "url": "/doc/Product_case/en/", + "label": "English" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/docs/Development_env_tools/zh/sidebar.yaml b/docs/Product_case/en/sidebar.yaml similarity index 45% rename from docs/Development_env_tools/zh/sidebar.yaml rename to docs/Product_case/en/sidebar.yaml index 65ef4b77b0dfd21f40c2c32415fbe7835bc7a85f..96088a5aa978936de21ef7a06249641158799fed 100644 --- a/docs/Development_env_tools/zh/sidebar.yaml +++ b/docs/Product_case/en/sidebar.yaml @@ -1,3 +1,3 @@ items: - - label: 开发环境和工具 + - label: mass production case file: README.md diff --git a/docs/Product_case/zh/Yunlaba/README.md b/docs/Product_case/zh/Yunlaba/README.md new file mode 100644 index 0000000000000000000000000000000000000000..6732e5a46cece1c1f147be5d707c35b1b7316c8e --- /dev/null +++ b/docs/Product_case/zh/Yunlaba/README.md @@ -0,0 +1,121 @@ + + +## 文档历史 + +**修订记录** + +| **版本** | **日期** | **作者** | **变更表述** | +| -------- | ---------- | -------- | ------------ | +| 1.0 | 2021-09-15 | 许润杰 | 初始版本 | + +## 功能介绍 + +1. 开机联网检测, 网络指示灯切换 + +2. 服务器连接, 和定时检测服务器状态 +3. gpio控制音量加减 +4. tts语音播放 +5. 查询历史记录 +6. 自动注网, 自动重连 + +## 使用 + +### 代码获取 + +- [从我们官网找到云喇叭连接]([下载 (quectel.com)](https://python.quectel.com/download)) + +- 然后解压, 将`main.txt`转换为`main.py` + + + +### 需要更改的项目代码 + +#### 设置阿里云服务器参数 + +- 连接服务器参数 + - 设置项目key + - 设置秘钥 + - 设备名称 + - 设备秘钥 +- 设置topic + - 订单topic + +![image-20210914223320531](./images/image-20210914223320531.png) + +#### 设置按键加减音量 + +- 模式 + - 默认是音量模式 + +![image-20210914224724208](./images/image-20210914224724208.png) + +- 音量模式 key_mode = 0 + - 设置音量+健的gpio, 当gpio有上下边沿事件触发时会音量+模式 + - 设置音量-键的gpio, 当gpio有上下边沿事件触发时会音量-模式 +- 历史记录模式 key_mode = 1 + - key_fun有上下边沿事件触发切换时, 会从音量模式切换到历史信息模式 + - 会播报上一比的历史订单记录 + +![image-20210914224421915](./images/image-20210914224421915.png) + +#### 设置网络指示灯的GPIO + +- 设置网络指示灯的gpio + +![image-20210914225109516](./images/image-20210914225109516.png) + +#### 运行代码 + +在模块中运行main.py代码块 + + + +### 云服务器设置 + +地址[物联网平台 (aliyun.com)](https://iot.console.aliyun.com/product) + +#### 创建产品 + +![image-20210914225451079](./images/image-20210914225451079.png) + +#### 添加设备到对应产品下 + +![image-20210914225516280](./images/image-20210914225516280.png) + + + +#### 自定义topic + +- 查看 + +![image-20210914225532791](./images/image-20210914225532791.png) + +- 自定义topic + +![image-20210914225643670](./images/image-20210914225643670.png) + +- 编辑 + +![image-20210914230407256](./images/image-20210914230407256.png) + +- 权限选择 + - 发布和订阅 + +![image-20210914230433534](./images/image-20210914230433534.png) + +#### 连接成功 + +![image-20210914230801511](./images/image-20210914230801511.png) + +#### 发布消息 + +- 点击发布 + +![image-20210914230820600](./images/image-20210914230820600.png) + +- 下发消息 + - 消息格式 + - {"orderID": 1,"productID": 11111111,"msg": "支付宝到账1000元","PayStatus": 1,"createTime": "2020/10/31 13:45:52"} + +![image-20210914230846915](./images/image-20210914230846915.png) + diff --git a/docs/Product_case/zh/Yunlaba/images/image-20210914223320531.png b/docs/Product_case/zh/Yunlaba/images/image-20210914223320531.png new file mode 100644 index 0000000000000000000000000000000000000000..2dc8fea8b80b4cf693a4d3ec45eb6209365d887c Binary files /dev/null and b/docs/Product_case/zh/Yunlaba/images/image-20210914223320531.png differ diff --git a/docs/Product_case/zh/Yunlaba/images/image-20210914224421915.png b/docs/Product_case/zh/Yunlaba/images/image-20210914224421915.png new file mode 100644 index 0000000000000000000000000000000000000000..0736f7adb1ff45df3e5c9baaaa090129fc3219be Binary files /dev/null and b/docs/Product_case/zh/Yunlaba/images/image-20210914224421915.png differ diff --git a/docs/Product_case/zh/Yunlaba/images/image-20210914224724208.png b/docs/Product_case/zh/Yunlaba/images/image-20210914224724208.png new file mode 100644 index 0000000000000000000000000000000000000000..5c73e5b7f1588aa55af2a7764eb83804be7e95f8 Binary files /dev/null and b/docs/Product_case/zh/Yunlaba/images/image-20210914224724208.png differ diff --git a/docs/Product_case/zh/Yunlaba/images/image-20210914225109516.png b/docs/Product_case/zh/Yunlaba/images/image-20210914225109516.png new file mode 100644 index 0000000000000000000000000000000000000000..fb2f9b230d7341823d78bfe24b4283efe39f2455 Binary files /dev/null and b/docs/Product_case/zh/Yunlaba/images/image-20210914225109516.png differ diff --git a/docs/Product_case/zh/Yunlaba/images/image-20210914225451079.png b/docs/Product_case/zh/Yunlaba/images/image-20210914225451079.png new file mode 100644 index 0000000000000000000000000000000000000000..c48aef3418f95cc3f92682251747088d27b5d2e2 Binary files /dev/null and b/docs/Product_case/zh/Yunlaba/images/image-20210914225451079.png differ diff --git a/docs/Product_case/zh/Yunlaba/images/image-20210914225516280.png b/docs/Product_case/zh/Yunlaba/images/image-20210914225516280.png new file mode 100644 index 0000000000000000000000000000000000000000..51f5ee3fdfd08c17eed6db65239431777f6001af Binary files /dev/null and b/docs/Product_case/zh/Yunlaba/images/image-20210914225516280.png differ diff --git a/docs/Product_case/zh/Yunlaba/images/image-20210914225532791.png b/docs/Product_case/zh/Yunlaba/images/image-20210914225532791.png new file mode 100644 index 0000000000000000000000000000000000000000..b0c186c9d0e7adefc91f848305be140f2228972a Binary files /dev/null and b/docs/Product_case/zh/Yunlaba/images/image-20210914225532791.png differ diff --git a/docs/Product_case/zh/Yunlaba/images/image-20210914225643670.png b/docs/Product_case/zh/Yunlaba/images/image-20210914225643670.png new file mode 100644 index 0000000000000000000000000000000000000000..d12e01d7786740043cc8516249af56e8c57dfbe6 Binary files /dev/null and b/docs/Product_case/zh/Yunlaba/images/image-20210914225643670.png differ diff --git a/docs/Product_case/zh/Yunlaba/images/image-20210914230407256.png b/docs/Product_case/zh/Yunlaba/images/image-20210914230407256.png new file mode 100644 index 0000000000000000000000000000000000000000..1327c503e32d811e22044a3f9eb5bf9f47c1fed0 Binary files /dev/null and b/docs/Product_case/zh/Yunlaba/images/image-20210914230407256.png differ diff --git a/docs/Product_case/zh/Yunlaba/images/image-20210914230433534.png b/docs/Product_case/zh/Yunlaba/images/image-20210914230433534.png new file mode 100644 index 0000000000000000000000000000000000000000..da55192d2adce53616339fc14d57275455d05f72 Binary files /dev/null and b/docs/Product_case/zh/Yunlaba/images/image-20210914230433534.png differ diff --git a/docs/Product_case/zh/Yunlaba/images/image-20210914230801511.png b/docs/Product_case/zh/Yunlaba/images/image-20210914230801511.png new file mode 100644 index 0000000000000000000000000000000000000000..ef8117a2b6b6f7c6d231dfae12c9e94b50e470d2 Binary files /dev/null and b/docs/Product_case/zh/Yunlaba/images/image-20210914230801511.png differ diff --git a/docs/Product_case/zh/Yunlaba/images/image-20210914230820600.png b/docs/Product_case/zh/Yunlaba/images/image-20210914230820600.png new file mode 100644 index 0000000000000000000000000000000000000000..8ef2b72857d042a427cdf92dd9da39792285cefb Binary files /dev/null and b/docs/Product_case/zh/Yunlaba/images/image-20210914230820600.png differ diff --git a/docs/Product_case/zh/Yunlaba/images/image-20210914230846915.png b/docs/Product_case/zh/Yunlaba/images/image-20210914230846915.png new file mode 100644 index 0000000000000000000000000000000000000000..2d17c2c69a33a07d9a92e2d0b59de7e9aa5b95d7 Binary files /dev/null and b/docs/Product_case/zh/Yunlaba/images/image-20210914230846915.png differ diff --git a/docs/Product_case/zh/config.json b/docs/Product_case/zh/config.json index 10c2a1cc1964035be8ce534c1a708e32e4094fcc..c0777abb2b018b2dad051362fa44a4ff66f62e83 100644 --- a/docs/Product_case/zh/config.json +++ b/docs/Product_case/zh/config.json @@ -1,92 +1,21 @@ { - "class": "language_zh", + "import": "config_zh", "navbar": { - "title": "QuecPython", - "logo": { - "alt": "teedoc logo", - "src": "/static/image/quectel.png" - }, - "home_url": "/", "items": [ { - "url": "https://python.quectel.com/wiki/#/", - "label": "wiki", - "position": "left" - }, - { - "label": "    文档    ", - "position": "left", - "items": [ - { - "url": "/doc/Quecpython_intro/zh/index.html", - "label": "产品介绍" - }, - { - "url": "/doc/Quick_start/zh/index.html", - "label": "快速开始" - }, - { - "url": "/doc/sbs/zh/index.html", - "label": "手把手教程" - }, - { - "url": "/doc/Advanced_development/zh/index.html", - "label": "开发进阶" - }, - { - "url": "/doc/little_demo/zh/index.html", - "label": "小实验" - }, - { - "url": "/doc/Product_case/zh/index.html", - "label": "产品案例" - }, - { - "url": "/doc/Mass_production/zh/index.html", - "label": "产品量产" - }, - { - "url": "/doc/FAQ/zh/index.html", - "label": "常见问题" - } - ] - }, - { - "label": "GitHub", + "id": "language", + "label": "Language: ", "position": "right", - "url": "https://github.com/quecpython/Community-document" - } - ] - }, - "footer": { - "top": [ - { - "label": "链接", - "items": [ - { - "label": "使用 teedoc 构建", - "url": "https://github.com/neutree/teedoc", - "target": "_blank" - }, - { - "label": "Copyright © 2021 Neucrack", - "url": "https://neucrack.com", - "target": "_blank" - } - ] - }, - { - "label": "源码", "items": [ { - "label": "github", - "url": "https://github.com/neutree/teedoc", - "target": "_blank" + "id": "zh", + "url": "/doc/Product_case/zh/", + "label": "中文" }, { - "label": "本网站源文件", - "url": "https://github.com/quecpython/Community-document", - "target": "_blank" + "id": "en", + "url": "/doc/Product_case/en/", + "label": "English" } ] } diff --git a/docs/Product_case/zh/sidebar.yaml b/docs/Product_case/zh/sidebar.yaml index e8fd6f07564817ff0de7ac99ad50d3444e2baf77..7bb1f408640f249b4777d2a006761bfcb24ab734 100644 --- a/docs/Product_case/zh/sidebar.yaml +++ b/docs/Product_case/zh/sidebar.yaml @@ -1,3 +1,11 @@ items: - - label: 量产案例 - file: README.md +- label: 量产案例介绍 + file: README.md +- label: 对讲机 + file: Poc/README.md +- label: 云喇叭 + file: Yunlaba/README.md +- label: tracker + file: tracker/README.md +- label: DTU + file: Dtu/README.md \ No newline at end of file diff --git a/docs/Product_case/zh/tracker/README.md b/docs/Product_case/zh/tracker/README.md new file mode 100644 index 0000000000000000000000000000000000000000..e4efc273dd361fddbdd8056c636f2bec005c7c30 --- /dev/null +++ b/docs/Product_case/zh/tracker/README.md @@ -0,0 +1,208 @@ +## 修订历史 + +| Version | **Date** | **Author** | **Change expression** | +| ------- | ---------- | ---------- | ----------------------- | +| 1.0 | 2021-01-08 | Pawn | 初始版本 | +| 1.1 | 2021-09-14 | Pawn | 更新代码存放路径(SDK) | + +## 引言 + +当客户购买我们的QuecPython,EC600S开发板(携带温湿度传感器版本)时,通过本系统可以更直观在PC端查看设备上报数据。 +系统地址: + +系统会定期维护更新,本说明仅供参考,不排除后期有功能改动不符合本说明内容描述。 + +## 运行环境及外设介绍 + +### 模块型号 + +此文档中描述的实验基于EC600S运行。模块外形展示如下图: + + + + + +#### 适配传感器型号介绍 + +BMA250E: 加速度传感器 + +HDC2080: 温湿度传感器 + +OPT3001: 光照传感器 + +#### 固件版本 + +请使用EC600S V0003及以上版本进行调试开发。 + +## 平台操作说明 + +### 注册登录 + +#### 进入注册页面 + +首先在浏览器中打开http://quectracker.quectel.com:8080/, 点击【立即注册】按钮,进入注册页面 + + + +#### 填写注册信息 + + + +### 功能介绍 + +登录后默认菜单为设备列表页面,在这个页面上可以查看自己的设备列表、根据条件查询具体设备、查看具体的设备上报数据。 + + + +#### 添加设备 + +在这个页面上客户可以点击【添加】按钮,将自己购买的设备维护到系统里,添加设备需要输入设备的IMEI号,和设备名称、ICCID。 + +其中: + +1. IMEI为15位的通信模组唯一标示,镭雕在通信模组上,如868681048629412; + +2. 设备名称客户自定义,方便区分不同的设备,不填写默认为IMEI号; + +3. ICCID为模组里插入的SIM卡的20位卡号,一般会印在SIM卡表面,如89860445041990085958。 + +**注:每个免费客户可添加设备数上限为5个。** + + + + + +#### 设备上报信息查看 + +点击列表页面上某一条数据操作列的放大镜图标,可查看具体的设备信息,包括设备信息、移动轨迹、纠偏轨迹、实时定位、温度变化、湿度变化、上报历史。 + +1. 设备信息:主要展示了设备最近一次上报的各种参数信息,如温度、湿度、物联网接入号(插入sim卡对应的手机号)、ICCID(维护的数据,如上报不一致以上报为准)、电量、软件版本等;参数较多,如果有部分参数未上报则无法正常显示。 + + + +2\. 移动轨迹:根据筛选的定位信息在地图上描绘出设备的历史形式轨迹,可以播放。 + + + +3\. 纠偏轨迹:对轨迹点进行修正,将所有轨迹点修正到最近的道路上的位置 + + + +4.实时定位:显示设备最后定位地点,及温湿度信息,并根据地图坐标推断定具体定位地址 + + + +5\. 温度变化:根据设备历史上报数据点绘制温度变化曲线,方便观察温度异常点 + + + +6\. 湿度变化:根据设备历史上报数据点绘制温度变化曲线,方便观察温度异常点 + + + +7\. 上报历史:显示设备历史上报过的未解析的报文原文记录。 + + + +### 系统管理 + +系统提供了系统管理菜单,主要包含两个功能,客户管理和用户管理 + +#### 客户管理 + +对于注册用户,如果还有下层多级客户需要管理时,可以使用此功能。 + +用户注册此系统后会默认生成一条自己的客户记录,公司名称为注册时填写的信息,可以添加自己客户公司名称。具体功能如图上标注。 + + + +#### 用户管理 + +如果同一客户需要有多个登录账户登录系统使用时,可使用此菜单创建多个登录账户。也可以为自己的下级客户创建登录账户。具体功能说明见图所示。 + + + + + +### 设备注册及认证 + +#### 下载代码 + +[下载代码](code/conde.zip) + +#### 设备注册流程 + +通过提供的平台注册及认证设备的实例代码完成设备注册流程; + +1\. 下载代码,找到QuecThing.mpy与quecth.py文件。 + + + +2\. 使用Qpycom工具将QuecThing.mpy与quecth.py文件上传到模块内执行,执行过程与结果展示: + + + + + +**PS:同一imei号的设备重复注册会失败,注册成功返回的登录密钥只作用于该imei号的设备,建议做持久化保存,方便测试使用。** + +#### quecth.py文件说明 + + + +### 设备信息上报 + +#### 代码展示及说明 + +1. 三轴数据采集 + + + + + + + +1. 温湿度数据采集 + + + + + +1. 光照数据采集 + + + + + +#### 代码执行步骤 + +1. 代码执行前先更改mqtt连接参数,将设备登录密钥配置在Connect连接参数中与云端建立连接,mqtt数据初始化时传入连接的参数,描述见下图的连接示例。 + + + + device与mqttServer获取参照设备注册及认证, 如下图: + + + +2. 配置好参数后使用Qpycom工具将ec600s_tracker.py上传到模块内执行。 + + + +#### 平台查看上报的属性 + + + + + + + +## 常见问题处理 + + + +1. 设备注册时返回注册失败,产品信息查询不到时请检查配置的产品ID以及产品密钥是否匹配。 +2. 数据采集为空或者失败应检查对应的传感器参数是否配置正确,传感器的型号不同导致的配置参数可能会有差异。 +3. MQTT在尝试与云端进行连接时出现MQTTEXException:4时请检查连接参数是否正确配置,mqtt服务地址是否正确。如遇到域名解析失败时可尝试使用usocket.getaddrinfo()方法先尝试解析再进行连接。 +4. 代码中存在{xxxx}类似字符是需要配置参数的占位符,也可理解为格式化输出,例如{imei},我们需要将其替换为对应的imei号。 +5. 查看代码中遇到存在疑惑的API时可查看我们的类库文档API说明,里面有详细的方法介绍。 +6. 请确保在mqtt连接时模块注网成功。 diff --git a/docs/Product_case/zh/tracker/code/code.zip b/docs/Product_case/zh/tracker/code/code.zip new file mode 100644 index 0000000000000000000000000000000000000000..5040c899df3f67aba77c0410ca7049cd836d4493 Binary files /dev/null and b/docs/Product_case/zh/tracker/code/code.zip differ diff --git a/docs/Product_case/zh/tracker/media/tracker_01.png b/docs/Product_case/zh/tracker/media/tracker_01.png new file mode 100644 index 0000000000000000000000000000000000000000..1baf246edd8f6fcecea4478df871d6b9f8cb733e Binary files /dev/null and b/docs/Product_case/zh/tracker/media/tracker_01.png differ diff --git a/docs/Product_case/zh/tracker/media/tracker_02.png b/docs/Product_case/zh/tracker/media/tracker_02.png new file mode 100644 index 0000000000000000000000000000000000000000..7ca3028670a49fa21afacd6184db736e2cf643ed Binary files /dev/null and b/docs/Product_case/zh/tracker/media/tracker_02.png differ diff --git a/docs/Product_case/zh/tracker/media/tracker_03.png b/docs/Product_case/zh/tracker/media/tracker_03.png new file mode 100644 index 0000000000000000000000000000000000000000..6a28cea07d6ddd92c61faddcece1df82d799a320 Binary files /dev/null and b/docs/Product_case/zh/tracker/media/tracker_03.png differ diff --git a/docs/Product_case/zh/tracker/media/tracker_04.png b/docs/Product_case/zh/tracker/media/tracker_04.png new file mode 100644 index 0000000000000000000000000000000000000000..89582d1c1b6a61d77e096c98ba5a83a45732a4aa Binary files /dev/null and b/docs/Product_case/zh/tracker/media/tracker_04.png differ diff --git a/docs/Product_case/zh/tracker/media/tracker_05.png b/docs/Product_case/zh/tracker/media/tracker_05.png new file mode 100644 index 0000000000000000000000000000000000000000..62cec2bb8c278f01490c6769c44ae1ec90879b23 Binary files /dev/null and b/docs/Product_case/zh/tracker/media/tracker_05.png differ diff --git a/docs/Product_case/zh/tracker/media/tracker_06.png b/docs/Product_case/zh/tracker/media/tracker_06.png new file mode 100644 index 0000000000000000000000000000000000000000..49ffc60ad322c649c03974e0674ae83ae4789481 Binary files /dev/null and b/docs/Product_case/zh/tracker/media/tracker_06.png differ diff --git a/docs/Product_case/zh/tracker/media/tracker_07.png b/docs/Product_case/zh/tracker/media/tracker_07.png new file mode 100644 index 0000000000000000000000000000000000000000..5c8d98e482cebe2aa870a322247a586e6d2b1d82 Binary files /dev/null and b/docs/Product_case/zh/tracker/media/tracker_07.png differ diff --git a/docs/Product_case/zh/tracker/media/tracker_08.png b/docs/Product_case/zh/tracker/media/tracker_08.png new file mode 100644 index 0000000000000000000000000000000000000000..475274c83c2840afc57b2e6e84afe8fbbb4d92b7 Binary files /dev/null and b/docs/Product_case/zh/tracker/media/tracker_08.png differ diff --git a/docs/Product_case/zh/tracker/media/tracker_09.png b/docs/Product_case/zh/tracker/media/tracker_09.png new file mode 100644 index 0000000000000000000000000000000000000000..30d0046a91c1ffd901f118af300ad7e13d865a6a Binary files /dev/null and b/docs/Product_case/zh/tracker/media/tracker_09.png differ diff --git a/docs/Product_case/zh/tracker/media/tracker_10.png b/docs/Product_case/zh/tracker/media/tracker_10.png new file mode 100644 index 0000000000000000000000000000000000000000..4667b4d89e51ea569a656a81d20dfa874f7d0868 Binary files /dev/null and b/docs/Product_case/zh/tracker/media/tracker_10.png differ diff --git a/docs/Product_case/zh/tracker/media/tracker_11.png b/docs/Product_case/zh/tracker/media/tracker_11.png new file mode 100644 index 0000000000000000000000000000000000000000..a4320932da2ac87dfd2383351c8b08a33f0a9612 Binary files /dev/null and b/docs/Product_case/zh/tracker/media/tracker_11.png differ diff --git a/docs/Product_case/zh/tracker/media/tracker_12.png b/docs/Product_case/zh/tracker/media/tracker_12.png new file mode 100644 index 0000000000000000000000000000000000000000..8675ca04fde06c444e308faec6f9793c851f8472 Binary files /dev/null and b/docs/Product_case/zh/tracker/media/tracker_12.png differ diff --git a/docs/Product_case/zh/tracker/media/tracker_13.png b/docs/Product_case/zh/tracker/media/tracker_13.png new file mode 100644 index 0000000000000000000000000000000000000000..4a4211713e581a7b3904718a203a8a8b7d694b6a Binary files /dev/null and b/docs/Product_case/zh/tracker/media/tracker_13.png differ diff --git a/docs/Product_case/zh/tracker/media/tracker_14.png b/docs/Product_case/zh/tracker/media/tracker_14.png new file mode 100644 index 0000000000000000000000000000000000000000..f939fdb8f86b61f06ebe49219c1ffad6932dd786 Binary files /dev/null and b/docs/Product_case/zh/tracker/media/tracker_14.png differ diff --git a/docs/Product_case/zh/tracker/media/tracker_15.png b/docs/Product_case/zh/tracker/media/tracker_15.png new file mode 100644 index 0000000000000000000000000000000000000000..d7c991a6b0a1f52c9b50b436d6c92242666ef9fd Binary files /dev/null and b/docs/Product_case/zh/tracker/media/tracker_15.png differ diff --git a/docs/Product_case/zh/tracker/media/tracker_16.png b/docs/Product_case/zh/tracker/media/tracker_16.png new file mode 100644 index 0000000000000000000000000000000000000000..a0c945bd10fac97244bb1aa6640d7761a67b2e21 Binary files /dev/null and b/docs/Product_case/zh/tracker/media/tracker_16.png differ diff --git a/docs/Product_case/zh/tracker/media/tracker_17.png b/docs/Product_case/zh/tracker/media/tracker_17.png new file mode 100644 index 0000000000000000000000000000000000000000..c1c7b9f5e66bd2d86fce13d7acbbbfb225ad5d68 Binary files /dev/null and b/docs/Product_case/zh/tracker/media/tracker_17.png differ diff --git a/docs/Product_case/zh/tracker/media/tracker_18.png b/docs/Product_case/zh/tracker/media/tracker_18.png new file mode 100644 index 0000000000000000000000000000000000000000..f59452ac4996b5ee8a86813b204e361078079ce3 Binary files /dev/null and b/docs/Product_case/zh/tracker/media/tracker_18.png differ diff --git a/docs/Product_case/zh/tracker/media/tracker_19.png b/docs/Product_case/zh/tracker/media/tracker_19.png new file mode 100644 index 0000000000000000000000000000000000000000..fdf56459c5c1e932946d01e20b86dbda04bd453b Binary files /dev/null and b/docs/Product_case/zh/tracker/media/tracker_19.png differ diff --git a/docs/Product_case/zh/tracker/media/tracker_20.png b/docs/Product_case/zh/tracker/media/tracker_20.png new file mode 100644 index 0000000000000000000000000000000000000000..35d49c44f115e09482175acb3c82d033354409a6 Binary files /dev/null and b/docs/Product_case/zh/tracker/media/tracker_20.png differ diff --git a/docs/Product_case/zh/tracker/media/tracker_21.png b/docs/Product_case/zh/tracker/media/tracker_21.png new file mode 100644 index 0000000000000000000000000000000000000000..e8e8e0937f6f94b97659be6edd6efe11993c3934 Binary files /dev/null and b/docs/Product_case/zh/tracker/media/tracker_21.png differ diff --git a/docs/Product_case/zh/tracker/media/tracker_22.png b/docs/Product_case/zh/tracker/media/tracker_22.png new file mode 100644 index 0000000000000000000000000000000000000000..ad619b0616f3760520bf902f6089635db6f74eab Binary files /dev/null and b/docs/Product_case/zh/tracker/media/tracker_22.png differ diff --git a/docs/Product_case/zh/tracker/media/tracker_23.png b/docs/Product_case/zh/tracker/media/tracker_23.png new file mode 100644 index 0000000000000000000000000000000000000000..27904e1e1e0123bdd80341333db7107b29923ec9 Binary files /dev/null and b/docs/Product_case/zh/tracker/media/tracker_23.png differ diff --git a/docs/Product_case/zh/tracker/media/tracker_24.png b/docs/Product_case/zh/tracker/media/tracker_24.png new file mode 100644 index 0000000000000000000000000000000000000000..67b2b0a5a0e96c8008dd7973fe2f03fe8e55737b Binary files /dev/null and b/docs/Product_case/zh/tracker/media/tracker_24.png differ diff --git a/docs/Product_case/zh/tracker/media/tracker_25.png b/docs/Product_case/zh/tracker/media/tracker_25.png new file mode 100644 index 0000000000000000000000000000000000000000..2fad98046aa12b85151eaeba11cfd9748bd360b5 Binary files /dev/null and b/docs/Product_case/zh/tracker/media/tracker_25.png differ diff --git a/docs/Product_case/zh/tracker/media/tracker_26.png b/docs/Product_case/zh/tracker/media/tracker_26.png new file mode 100644 index 0000000000000000000000000000000000000000..c6824768cb4cbc7b635306a97ef7a2c952bda2af Binary files /dev/null and b/docs/Product_case/zh/tracker/media/tracker_26.png differ diff --git a/docs/Product_case/zh/tracker/media/tracker_27.png b/docs/Product_case/zh/tracker/media/tracker_27.png new file mode 100644 index 0000000000000000000000000000000000000000..ef7306d70036e5ea32c82777bde993f5991a5afa Binary files /dev/null and b/docs/Product_case/zh/tracker/media/tracker_27.png differ diff --git a/docs/Product_case/zh/tracker/media/tracker_28.png b/docs/Product_case/zh/tracker/media/tracker_28.png new file mode 100644 index 0000000000000000000000000000000000000000..466a7ec62f46142f739663a1d2578f7aa4bed0c1 Binary files /dev/null and b/docs/Product_case/zh/tracker/media/tracker_28.png differ diff --git a/docs/Product_case/zh/tracker/media/tracker_29.png b/docs/Product_case/zh/tracker/media/tracker_29.png new file mode 100644 index 0000000000000000000000000000000000000000..66701a273ea427dc85e575cf5420a112a33d5af8 Binary files /dev/null and b/docs/Product_case/zh/tracker/media/tracker_29.png differ diff --git a/docs/Product_case/zh/tracker/media/tracker_30.png b/docs/Product_case/zh/tracker/media/tracker_30.png new file mode 100644 index 0000000000000000000000000000000000000000..0c0ced95254f9f2a1c4a536b3773fa2ea41629c3 Binary files /dev/null and b/docs/Product_case/zh/tracker/media/tracker_30.png differ diff --git a/docs/Product_case/zh/tracker/media/tracker_31.png b/docs/Product_case/zh/tracker/media/tracker_31.png new file mode 100644 index 0000000000000000000000000000000000000000..2119f5ae07e052ef429190d7926d3191a3542318 Binary files /dev/null and b/docs/Product_case/zh/tracker/media/tracker_31.png differ diff --git a/docs/Product_case/zh/tracker/media/tracker_32.png b/docs/Product_case/zh/tracker/media/tracker_32.png new file mode 100644 index 0000000000000000000000000000000000000000..6a9b61872bb86e31688bef3ebb7b0cee85aea556 Binary files /dev/null and b/docs/Product_case/zh/tracker/media/tracker_32.png differ diff --git a/docs/Product_case/zh/tracker/media/tracker_33.png b/docs/Product_case/zh/tracker/media/tracker_33.png new file mode 100644 index 0000000000000000000000000000000000000000..b6ffa4e7fe92e7c30e0c29171305b341eaf10ea2 Binary files /dev/null and b/docs/Product_case/zh/tracker/media/tracker_33.png differ diff --git a/docs/Product_case/zh/tracker/media/tracker_34.png b/docs/Product_case/zh/tracker/media/tracker_34.png new file mode 100644 index 0000000000000000000000000000000000000000..103c2c56bd54dd920554c19cec22f6b9b17ee0ce Binary files /dev/null and b/docs/Product_case/zh/tracker/media/tracker_34.png differ diff --git a/docs/Quecpython_intro/en/Qp_Hw_EC600X/Hardware_Support_EC600X.md b/docs/Quecpython_intro/en/Qp_Hw_EC600X/Hardware_Support_EC600X.md new file mode 100644 index 0000000000000000000000000000000000000000..7b8d20950911a4f399be692d3a3c858255306b76 --- /dev/null +++ b/docs/Quecpython_intro/en/Qp_Hw_EC600X/Hardware_Support_EC600X.md @@ -0,0 +1,597 @@ +## Document history + +**Revision record** + +|** version ** date ** author ** change statement **| +| -------- | ---------- | -------- | ---------------------------------- | +|1.0 | 2020-12-14 | yuan Shuai | initial version| +|1.1 | 2020-12-20 | Josh | hardware version 1.1 adds audio power amplifier circuit| +|1.1.1 | Dec. 28, 2020 | chic | document added [project promotion]| +|1.1.2 | 2021-01-06 | chic | modify the description of LED| +|1.2 | January 20, 2021 | Jorma | modification| +|1.2.1 | March 31, 2021 | David | added the content of v1.2 development board; Add chart title| +|1.2.2 | 2021-04-02 | Chengzhu | word is converted to MD, and subsequent updates are based on MD updates| +|1.2.3 format modification of pictures and directories under | 2021-04-06 | David | MD document| + +## Basic overview + +### Description + +EC600X_ QuecPython_ EVB_ V1. X development board is a cat. 1 communication module development board equipped with multiple sensors. This paper will introduce the use methods and precautions of this development board. + +EC600X\_ QuecPython_ EVB_ The naming rules of V1. X are as follows: + +image-20210406102449288 + +EC600S_ QuecPython_ EVB_ V1. X (x = 0,1) development board (hereinafter referred to as "v1.1 development board") is specially manufactured for ec600s. It is a small and portable "pocket" development board. Although it is small, it has rich functions, including temperature and humidity sensor, SIM card holder, onboard antenna, LCD interface, photosensitive resistor, MIC, etc. + +In order to meet the development needs of multi module, ec600x is developed_ QuecPython_ EVB_ V1.2 (hereinafter referred to as "v1.2 development board"). Compared with the first two models, GNSS module: l76k is mainly added to the components. + +Developers can easily play the development board with only one USB type-C data cable. + +### V1.1 development board resources + +-Quectel moved away from ec600s_ CNAA cat. 1 communication module +-PCB antenna +-Nano SIM card holder +-Retain SMA antenna base pad +-USB type-C data interface +-One pwrkey key and one RST key +-Two custom function keys +-Audio power amplifier, supporting up to 4 Ω 2W speakers +-Temperature and humidity sensor +-G-sensor triaxial acceleration sensor +-(not supported) led lights +-(to be welded) electret mic +-(welding required) speaker audio output +-Photoresistor (to be welded) +-(to be welded) GPIO row pin +-(to be welded) LCD pin + +### V1.2 development board resources + +-Quectel moves away from ec600x cat. 1 communication module +-Nano SIM card holder +-GPS, LTE, WiFi / BT antenna interface +-USB type-C data interface +-Pwrkey key, RST key, forced download key +-Two custom function keys +-Audio power amplifier, supporting up to 4 Ω 2W speakers +-Temperature and humidity sensor +-G-sensor triaxial acceleration sensor +-Monochrome lamp +-Electret mic +-Speaker audio output +-Photosensitive resistance +-GPIO row needle +-LCD pin + +### What development boards can do + +#### Small experiment + +The development board contains many interfaces and peripherals to facilitate developers' development and debugging. Many small experiments are provided in the document center of quecpthon's official website. + +See [quecpthon experiment] for the specific address(https://python.quectel.com/doc/doc/little_demo/zh/index.html) + +#### Implement product prototype + +Based on the many sensors, keys, LCD and other peripherals of the development board, developers can even quickly make product prototypes based on the development board. Next, let's give a few examples of some product prototypes that can be made based on the development of onboard sensors: + +-** anti theft device** + +**Background **: unattended equipment, such as express cabinets, charging stations, charging piles, etc., may be stolen or damaged. It is necessary to realize remote control, anti-theft, abnormal status reporting, etc + +**Device **: quectel communication module + acceleration sensor + GPIO (with vibration sensor, microswitch, relay, led, etc.) + horn + +**Method **: connect the quectel communication module to the cloud and save the parameters sent by the cloud. Read the parameters reported by the sensor, judge whether the current attitude and vibration state exceed the threshold, the LED flashes and alarms, and report to the cloud through the network + +-** Micro Weather Service Station** + +**Background **: in the field, it is assumed that the unattended Micro Weather Service Station will regularly report temperature, humidity, wind and other data through the network for recording, analysis and prediction + +**Device **: quectel communication module + temperature and humidity sensor + ADC (wind detection, battery voltage detection) +\+GPIO (battery charge and discharge state detection) + +**Method **: connect the quectel communication module to the cloud and save the parameters sent by the cloud. Synchronize the internal clock through NTP; Read the parameters reported by the temperature and humidity sensor and ADC, serialize the data and report it to the cloud through the network according to the requirements of the cloud. When the network is poor, store data offline and report the data to the cloud after the network is smooth + +-** micro vending machine** + +**Background **: minibars in many hotels can't meet the needs of customers, and micro vending machines in guest rooms can make up for this defect. Sell small commodities such as snacks, chewing gum and charging line, and provide mobile phone charging services at the same time + +**Device **: quectel communication module + GPIO (with stepper motor, relay / MOS tube) + light sensor+ +LCD + gsensor + horn + +**Methods **: the quectel communication module connects to the cloud, registers and authenticates, receives the data sent from the cloud, and the LCD screen displays the corresponding QR code; Users use WeChat or Alipay to scan the two-dimensional code displayed by LCD and enter the small program to purchase. After the purchase is completed and paid, the cloud sends a control command, the communication module receives the command, analyzes the command content, controls GPIO to realize the rotation and shipment of stepping motor, and confirms the completion of shipment through the light sensor; Or control relay / MOS tube to realize mobile phone charging function; After shipment, you can use TTS voice to read the corresponding information, such as "* after shipment, welcome to buy again *". When G-sensor detects dumping or violent destruction, it can automatically report information to the cloud for operation and maintenance processing + +-** code scanning gun** + +**Background **: in daily scenes, you can use a gun to enter barcode and QR code in batches. However, the traditional gun can not be used without the computer, and using the mobile phone to scan the code is quite cumbersome, with poor stability and high power consumption. Using the wireless code scanning gun, remote code scanning, wireless code scanning, continuous code scanning, etc. can be realized + +**Device **: quectel communication module + SPI camera + LCD + GPIO (with matrix keyboard) + +Methods: after the quectel communication module is powered on, it is connected to the cloud, the LCD displays the corresponding information, and the user confirms it by pressing the key, and then turns it on +Camera +Scan barcode or QR code (single scan, continuous scan and other operations are optional), and the module identifies the information of barcode or QR code and reports it to the cloud + +-** intelligent control** + +**Background **: the cloud sends operation parameters, and the module realizes automatic monitoring equipment and control, saving labor cost. + +**Device **: quectel communication module + SPI camera + SPI + I2C + LCD + GPIO (with keys, relays, etc.) + +**Methods **: after the quectel communication module is powered on, connect to the cloud, obtain the operation parameters and save them. Display corresponding control contents and operation status on LCD; When it is detected that the value of the sensor exceeds the threshold, perform corresponding actions according to the saved parameters and report to the cloud (if the humidity exceeds 80%, open the relay and control the dehumidifier to start), so as to realize automatic control. + +-** equipment positioning** + +**Background: ** shared bicycles are developing rapidly. Due to the remoteness of parking location, consumers can not find the location of bicycles effectively and accurately, which affects customers' consumption experience. At the same time, it consumes a lot of resources, and the real-time performance can not be guaranteed. + +**Device: ** quectel communication module + l76k + +**Methods: ** use l76k to obtain location information, output NEMA statements, then read NEMA through the serial port of the module, output location information, and finally send the data to the cloud (e.g. Alibaba cloud) when connected to the network to realize real-time sharing. + +## Introduction to development board + +The development board is designed to facilitate developers to use quecpthon. It is based on ec600x +The development board of cat. 1 communication module integrates common development configurations, which can meet the development needs of developers. + +### V1.1 development board + +#### V1.1 development board front interface + +image-20210406102743063 + + + +#### V1.1 back interface of development board + +EC600XV1.1_otherside + +**TIPS:** + +For the silk screen printing of the development board, please refer to the appendix of this manual. For more information about the development board, please visit< https://python.quectel.com/download > + +#### V1.1 development board configuration + +The development board is equipped with a variety of sensors and other peripherals. Details are as follows: + +|Serial number | name | model | whether it supports | interface type| +| ---- | ---------------------------- | ------------- | -------- | -------- | +|1 | triaxial acceleration sensor | lis2dh12tr | is | SPI| +|2 | temperature and humidity sensor | aht10 | SPI| +|3 | photoresistor | gl5528 | ADC| +|4 | micro key | - | yes | GPIO| +|5 | microphone | gmi6050p-66db | yes | SPK| +|6 | power amplifier chip | aw8733atqr | yes | SPK| +|7 | LED color light | ws2812b-mini | no | PWM| +|8 | LCD display (select package with screen) | st7789 | yes | SPI| + +### V1.2 development board + +#### V1.2 development board front interface + +image-20210406104035040 + +#### V1.2 back interface of development board + +image-20210406104055313 + +|Tips| +| ------------------------------------------------------------------------------------------------- | +|For the silk screen printing of the development board, please refer to the appendix of this manual. For more information about the development board, please visit< https://python.quectel.com/download > | + +#### V1.2 development board configuration + +The development board is equipped with a variety of sensors and other peripherals. Details are as follows: + +|Serial number | name | model | whether it supports | interface type| +| ---- | ---------------------------- | ------------- | -------- | -------- | +|1 | triaxial acceleration sensor | lis2dh12tr | is | SPI| +|2 | temperature and humidity sensor | aht10 | SPI| +|3 | photoresistor | gl5528 | ADC| +|4 | micro key | - | yes | GPIO| +|5 | microphone | gmi6050p-66db | yes | SPK| +|6 | power amplifier chip | aw8733atqr | yes | SPK| +|7 | led | green | yes | PWM| +|8 | LCD display (select package with screen) | st7789 | yes | SPI| +|9 | GNSS module | l76k | UART| + +## Function explanation + +### LCD interface + +The development board integrates the LCD interface, through which developers can light up the LCD screen and display pictures and text. It can also display more interesting content with lvgl (click here to learn about the small experiment of "LCD"). + +Currently, quecpthon supports the following screens: + +- GC9305 + +- HX8347 + +- ST7789 + +- ST7735 + +-More screens, adapting + +![](media/EC600X_LCD.png) + +|Please note| +| ------------------------------------------------------------ | +|For LCD slot, v1.0 and v1.1 development boards without CS, please select the screen without CS or ground the CS of the screen. For details, please refer to the schematic diagram of v1.1| + +### Acceleration sensor + +Lis2dh12tr triaxial acceleration sensor is integrated in v1.2 development board. The three-axis acceleration sensor has the characteristics of small volume, low power consumption and high sensitivity. Through the acceleration sensor, developers can collect the motion state, attitude and other data of the development board. + +Click here to understand: [small experiment of "acceleration sensor](https://python.quectel.com/doc/doc/little_demo/zh/QuecPythonTest/i2c_lis2dh.html) + +![](media/EC600X_LIS2DH12TR.png) + +### Photosensitive resistance + +The development board integrates gl5528 high sensitivity photoresist. The photoresist is very sensitive to light. When there is no light, it shows a high resistance state, and the dark resistance can generally reach 1.5m Ω; Under illumination, the resistance can be as small as 1K Ω. Using the photoresist, developers can collect ambient illumination information. + +Click here to understand: [photosensitive sensor experiment](https://python.quectel.com/doc/doc/little_demo/zh/QuecPythonTest/Photoresistor.html) + +![](media/EC600X_GL5528.png) + +### Temperature and humidity sensor + +The development board integrates aht10 temperature and humidity sensor. The sensor has the characteristics of low power consumption, small volume and accurate measurement. Developers can use the sensor to collect information such as ambient temperature and humidity. Click here to understand: [temperature and humidity sensor experiment](https://python.quectel.com/wiki/study/zh-cn/study/QuecPythonTest/i2c_aht/) + +![](media/EC600X_AHT10.png) + +### Audio power amplifier (power amplifier chip) + +The development board integrates audio power amplifier. V1.1 integrates aw8733atqr. The power amplifier chip is a class k audio power amplifier, which has the characteristics of super TDD suppression, super large volume, anti breaking sound, ultra-low EMI and output power of 2.0W. V1.2 integrates ns4160, a scientific and technological product with class AB / class D working mode switching function, ultra-low EMI, no filter and 5W mono audio power amplifier. Click here to learn: [audio module development](https://python.quectel.com/doc/doc/Advanced_development/zh/QuecPythonSub/Audio.html) + +![](media/EC600X_PA.png) + + + +|Please note| +| ------------------------------------------------------------ | +|The v1.0 development board does not have a power amplifier chip, and playback may fail < br > the v1.1 development board has a power amplifier chip, which needs to be enabled by pulling up pin58: < br > audio_ EN = Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_ PD, 1) < br > there is a problem with the recording of v1.1 development board. R28 needs to be removed| + +### Custom keys + +The development board integrates two user-defined micro buttons, and developers can define their own functions. + +Click here to understand: [key input experiment](https://python.quectel.com/doc/doc/little_demo/zh/QuecPythonTest/button.html) + +![KEY](media/EC600X_kEY.png) + +|Please note| +| ---------------------------------------------------- | +|The silk screen printing of v1.1 development board is wrong. The microswitch is actually connected to gpio1 and gpio2| + +### GNSS module: l76k + +The v1.2 development board integrates a GNSS module l76k, and customers can obtain positioning information without networking. + +![](media/EC600X_L76K.png) + +|Please note| +| ------------------------------------------ | +|The GNSS module is not configured on the development board before v1.1| + +## Preparatory work + +### Development board startup + +For modules, the startup conditions are similar, but due to different hardware designs, the startup operations of different development boards are slightly different, < font color ='Red '> the following table strongly recommends viewing ** < / font > + +|Development board | startup operation| +| -------------------------- | -------------------------------------------------------- | +| EC600S_ QuecPython_ EVB_ V1.0 | plug in and start up| +| EC600S_ QuecPython_ EVB_ V1.1 | long press the bowky on the side of the development board and release it for two seconds, and the module will start| +| EC600S_ QuecPython_ EVB_ V1.2 | PWK on development board_ If the on jump cap is short circuited, it is not necessary to press PWK for a long time. On the contrary, it is necessary to press PWK for a long time| + +### Install USB driver + +Before using the development board, you need to install a USB driver on the computer. After correct installation, the computer can recognize the development board. + +Driver download address:< https://python.quectel.com/download > + +< font color ='Red '> notes ** < / font > + +**1. The drive can be divided into two categories:** + +**First, platform classification based on module support: ASR platform (ec600scnaa, ec600scnla, ec600scnlb, ec600n, ec100y) and RDA platform (ec600u). More module platform information can be seen: [hardware support](https://python.quectel.com/doc/doc/Quecpython_intro/zh/Qp_Product_intro/Hardware_Support.html)** + +**I believe you also have a question about what platform ec600x is. In fact, "X" in ec600x is an unknown number, which can refer to ec600s, ec600u, etc., and does not represent the actual platform** + +**Second, PC based system classification: Windows 7 system, please download the corresponding driver of Windows 7; For windows 10 system, please download the driver corresponding to windows 10** + +**2. For ec600scnla and ec600scnlb, the latest version of the driver must be downloaded, and the driver version must be at least v1.0.8** + +The installation steps of the drive are as follows: + +-Please select the corresponding driver. Please refer to the above precautions for which driver to install + +-After the developer downloads the compressed package of the driver, completely unzip the compressed package to any directory, and double-click to run setup.exe: + +![](media/setup.png) + +-Follow the prompts and click Install: + +![](media/install.png) + +-After successful installation, click "finish" to finish: + +![](media/finish.png) + +-At this point, the USB driver installation is completed. + +|Tips| +| ------------------------------------------------------------ | +|(1) Before installation, please back up your important files and save your work progress to avoid accidental loss of files < br / > (2) after successful installation, there is no need to restart the computer < br / > (3) if you need to repair or uninstall the driver, run the driver installation program again and select repair or uninstall < br / > (4) if the installation fails, Please contact our online support: QQ group 445121768| + +### Verify driver installation + +After the driver is successfully installed, use the USB typea-typec data cable to connect the development board to the computer and turn it on (refer to the chapter "startup of development board" above for specific startup reference). + +Open "device manager" on the computer, enter the device manager of the computer, expand ** "port (COM and LPT)" **, and three serial port devices should appear: + +- **Quectel USB AT Port (COMx)** + +- **Quectel USB DIAG Port (COMx)** + +- **Quectel USB MI05 COM Port (COMx)** + +|Tips| +| ---------------------------------------------------------------------------- | +|How do I open device manager? Very simple, please follow me: my computer - "this computer" - properties - Device Manager| + +If your computer does not recognize any serial devices, check: + +-Whether the development board is correctly connected to the computer (data cable is damaged, or socket is damaged, power supply is insufficient, etc.) + +-Is the development board started correctly + +-Is the USB driver installed correctly + +-Whether the motherboard driver is installed correctly. + +If it cannot be ruled out, please contact our online support: QQ group 445121768 + +If your computer recognizes only two serial devices (no "USB serial device"), it may be because quecpthon firmware is not brushed in. Don't worry, please read the next chapter and brush in the quecpthon firmware. + +![image-20210417105022954](media/DM_not_Quecpython.png) + +If your computer correctly identifies three serial devices, congratulations. Everything is ready to start the journey of quecpthon \ ~! + +![image-20210417104910841](media/DM_Quecpython.png) + +### Verify firmware version + +Use the serial port tool to open the serial port corresponding to "quectel USB at port" (the baud rate is 115200, the stop bit is 1 bit, there is no parity, 8 data bits, and there is no hardware control flow). Check "send with enter" and send the command "at + GMR" to view the information returned by the module, that is, the current firmware version: + + + +If it is the firmware of quecpthon, it usually ends with py or python. + +Using the official graphical tool qpycom, you can also verify whether the current firmware version is quecpthon firmware. + +Qpycom download address:< https://python.quectel.com/download > + +The specific location is shown in the screenshot below: + +QPYcom_position + +The steps to view the firmware version using qpycom tool are as follows: + +1. After downloading the qpycom tool, completely unzip it to any directory, and double-click qpycom.exe to run it + +2. Connect the development board to the computer and turn it on; + +3. Select "USB serial device" serial port, default baud rate, and open the serial port + +4. Click the "** interactive **" tab to enter the interactive page + +5. Type the following command, and then view the contents returned by the module: + + *import uos* + + *uos.uname()* + + + +As shown in the figure, if the content can be returned normally, it proves that the quecpthon firmware is currently running. + +If there is no "USB serial device" serial port, or the input cannot be input, and the input does not return, the quecpthon firmware is not running in the module, and the quecpthon firmware needs to be downloaded. + +### Download firmware + +What is quecpthon firmware (hereinafter referred to as "firmware")? Why download it? Firmware is a binary program containing driver, BL, FS, VM and other resources. A module without firmware is like Turkey noodles without pepper. After downloading the firmware, the module can "run". Generally speaking, "firmware is relative to quectel communication module", which is similar to "operating system is relative to computer" The user script is relative to the quecpthon firmware, which is similar to the application relative to the operating system. Only when the operating system is installed on the computer (download firmware), and then the application program is installed (download user script), can the computer play the corresponding functions and execute the corresponding operations and instructions. + +< font color ='Red '> notes ** < / font > + +1. ** where can I get the quecpthon firmware? Please go to the official website of quecpthon to download:< https://python.quectel.com/download >
** +2. ** different modules correspond to different firmware, and cross burning is not supported. If you burn by mistake, you must correct the burning to the corresponding firmware, otherwise it cannot be used normally. For example, ec600s is divided into ec600scnaa, ec600scnla, ec600scnlb, etc. cross burning is not supported between these modules**** +3. ** about the description of the firmware package, since the firmware compressed file downloaded from the official website contains the firmware package and change log, the firmware compressed file downloaded from the official website needs to be decompressed for one layer to obtain the burnable firmware package. Later, it will be evaluated and changed that the suffix of the firmware package is. Bin (in the plan, if the update is completed later, remember to select the compressed file with the suffix of. Bin when burning)** +4. ** before downloading firmware, it is recommended to confirm the firmware version first to avoid degradation or wrong version. After downloading the firmware, the contents of all user areas will be cleared** + +The steps to download firmware using qpycom tool are as follows: + +1. After downloading the qpycom tool, completely unzip it to any directory, and double-click qpycom.exe to run it + +2. Connect the development board to the computer and turn it on; + +3. Click the "** Download **" tab to enter the download page + +4. Create an item in the navigation bar on the left side of the download page, and then click "** select firmware **" to select the firmware package + +5. Left click the inverted triangle in the lower right corner of the page, select the "** Download firmware **" menu in the pop-up menu, and click the "** Download firmware **" button. The tool will automatically start firmware download + +|Tips| +| ------------------------------------------------------------ | +|When downloading firmware, there is no need to select the serial port, and the tool will automatically select and start downloading < br / > do not insert two or more development boards at the same time, so as to avoid the tool being unrecognized and causing download errors| + +|Please note| +| ------------------------------------------------------------ | +|During the firmware download process, do not exit the tool or unplug the serial port, which may cause the module to turn brick. If the module is indeed bricked, see "[quecpthon brick rescue](https://python.quectel.com/doc/doc/FAQ/zh/QP_recovery/QP_recovery.html)”章节 | + + + + + +choose_download + + + + + + + + + + + +After downloading, you can use the methods in the previous chapter to send at instructions, or use the "interaction" page to test whether the firmware is downloaded correctly. + +### Download the helloworld.py program to the development board + +Using the qpycom tool, we can download our Python script files to the module. + +Hello world.py file content: + +```python +import utime +while True: +print(“hello world”) +utime.sleep(1) +``` + +The specific operation steps are as follows: + +1. After downloading the qpycom tool, completely unzip it to any directory, and double-click qpycom.exe to run it +2. Connect the development board to the computer and turn it on +3. Select "USB serial device" serial port, default baud rate, and open the serial port +4. Click the "** file **" tab to enter the file page (the left side is the local file of the computer; On the right is the file on the module side) +5. Browse the computer file on the left and select the corresponding. Py file, drag the file to the "root" root node on the right, release the left mouse button to automatically download the file to the module (or click the "** + **" button in the right column to browse and select the file and download the file to the module) +6. In the process of file download, the status bar at the bottom of the page has the download progress. When the progress reaches 100%, the file download is successful. + + + +As shown in the figure, the Hello world.py file has been downloaded to the module home directory. You can view it through the "interaction" of qpycom tool. The operations are as follows: + + + +|Tips| +| ------------------------------------------------------------ | +|The new version of firmware uses a dual file system, and the root directory is readable and writable< Br > the backup partition / bak cannot be read or written< Br > user partition / usr is readable and writable< Br > all file IO operations should be performed in / usr| + +### Run the Hello world.py program + +There are two ways to run Python scripts in the module: + +-Manual operation + + +1. After downloading the qpycom tool, completely unzip it to any directory, and double-click qpycom.exe to run it + +2. Connect the development board to the computer and turn it on + +3. Select "USB serial device" serial port, default baud rate, and open the serial port + +4. Click the "file" tab to enter the file page (the left side is the local file of the computer; On the right is the file on the module side) + +5. Browse the files in the module on the right, select the PY file to run, and click the "triangle" button! [](media/start.png),QPYcom将自动跳转到“**交互**”页,并运行该脚本文件 + +6. You can also import the example module and run the python script using the exec method: + +```python +import example +example.exec(‘hello world.py’) +``` + +|Tips| +| ------------------------------------------------------------ | +|If it is a dual file system, execute the following command: import example. Exec ('usr / Hello world. Py ')| + +The operation results are shown in the figure below: + + + + + +-Automatic operation after startup + + +QuecPython supports automatic execution of user code when powered on. After the quectel communication module is powered on and running, quecpthon will find the program file named main.py under the user partition and automatically execute the file. Therefore, if users want to run their own code automatically after power on, they need to name their own program main.py and download it into the module together with its dependencies and other files. + +|Tips| +| -------------------------------------------------------------------------------------------------------------------------------------- | +|The file name must be main.py (the case is exactly the same) and must be placed in the user area to realize automatic operation after startup. If main.py calls other py and MPY files, they need to be downloaded to the user together| + +Take helloworld.py as an example to illustrate: provide helloworld.py file with method 2s to periodically print "Hello world!" character string; The method in Hello world.py is called in the main.py file. + +```python +#Helloworld.py code +import utime +def prtHelloworld(): +while True: +print("hello world") +utime.sleep(1) +``` + +```python +# main.py: +#Call the helloworld.py file +import helloworld +#Call the PRT helloworld() function of the helloworld.py file +helloworld.prtHelloworld() +``` + +|Tips| +| ------------------------------------------------------------ | +|(1) The file name that needs to be imported is not recommended to contain special characters such as spaces. It is recommended to name it in pure English< Br > (2) if it is a dual file system and the user's py file, you need to use the following method to import: < br > method 1: from usr import HelloWorld #helloworld represents the PY file name < br > HelloWorld. PRT helloworld() < br / > method 2: import usr.helloworld # means the helloworld.py file in the usr directory < br / > usr.helloworld. PRT helloworld() # note, This method must be prefixed with usr < br / > (3) the above two methods are combined, which can be extended to: < br / > from usr. HelloWorld import * < br / > PRT helloworld() # because it has been imported *, you can call the function name directly here| + +Download both of the above files into the module. + +![file_position](media/file_position.png) + +Press the reset button on the development board. After the system starts, reconnect the main serial port, press the Enter key on the computer keyboard, and enter the interactive interface to see the automatic operation results: + +file_running + + + +|Tips| +| ---------------------------------------------------------- | +|Automatic operation failed. Please check the PY file for syntax errors and call errors| + +|Please note| +| ---------------------------------------------------------------------------------------------------------------------------- | +|Scripts that run automatically or output circularly cannot be stopped using Ctrl + C; The interactive module is locked, and the script cannot be terminated; The only way is to re brush the firmware| + +### Common problem solving + +**Q: Where is the firmware of the module** + +A: Please go to the quecpthon website to download:< http://python.quectel.com/download > + +**Q: Where are development boards and other commonly used materials** + +A: Please go to the quecpthon website to download:< http://python.quectel.com/download > + +P. S. if you encounter any problems, please contact our online support: QQ group 445121768 + +## Appendix 1 v1.1 silk screen drawing of development board + +V1.1_silk_print01 + +V1.1_silk_print02 + + + + + +## Appendix 2 v1.2 silk screen drawing of development board + +V1.2_silk_print01 + +V1.2_silk_print02 + diff --git a/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/Create_project.png b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/Create_project.png new file mode 100644 index 0000000000000000000000000000000000000000..2155f5661248eaea4678c715d1daccbe9fbddd5d Binary files /dev/null and b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/Create_project.png differ diff --git a/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/DM_Quecpython.png b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/DM_Quecpython.png new file mode 100644 index 0000000000000000000000000000000000000000..5206d0512beab4dfb59b0eb522bd697a9cffe178 Binary files /dev/null and b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/DM_Quecpython.png differ diff --git a/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/DM_not_Quecpython.png b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/DM_not_Quecpython.png new file mode 100644 index 0000000000000000000000000000000000000000..ee6775860106c0d0b2aa52143f85c6041fb1ebf0 Binary files /dev/null and b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/DM_not_Quecpython.png differ diff --git a/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/Divers.png b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/Divers.png new file mode 100644 index 0000000000000000000000000000000000000000..a622a0f85f3b80b97e3a3650d88b751583b2b8a1 Binary files /dev/null and b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/Divers.png differ diff --git a/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/EC600XV1.1_otherside.png b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/EC600XV1.1_otherside.png new file mode 100644 index 0000000000000000000000000000000000000000..b39c9112296fa245473b4c0fa7cadb8655075fc2 Binary files /dev/null and b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/EC600XV1.1_otherside.png differ diff --git a/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/EC600XV1.1_positive.png b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/EC600XV1.1_positive.png new file mode 100644 index 0000000000000000000000000000000000000000..cc6f696da8d6e99f2ee7c1e201bb6c07c6bb33d1 Binary files /dev/null and b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/EC600XV1.1_positive.png differ diff --git a/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/EC600XV1.2_otherside.png b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/EC600XV1.2_otherside.png new file mode 100644 index 0000000000000000000000000000000000000000..ab77bcd2d0e5ffd8e5c3d2c571c45516724e292a Binary files /dev/null and b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/EC600XV1.2_otherside.png differ diff --git a/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/EC600XV1.2_positive.png b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/EC600XV1.2_positive.png new file mode 100644 index 0000000000000000000000000000000000000000..935d7bad97fa21f016282c52c5330922d6111c2d Binary files /dev/null and b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/EC600XV1.2_positive.png differ diff --git a/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/EC600X_AHT10.png b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/EC600X_AHT10.png new file mode 100644 index 0000000000000000000000000000000000000000..3c09b18e2fc17c506d1d65738bbcf904927f3e69 Binary files /dev/null and b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/EC600X_AHT10.png differ diff --git a/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/EC600X_GL5528.png b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/EC600X_GL5528.png new file mode 100644 index 0000000000000000000000000000000000000000..cc3b5e28d5e42d89b7e6e6f122a27109996d7335 Binary files /dev/null and b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/EC600X_GL5528.png differ diff --git a/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/EC600X_KEY.png b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/EC600X_KEY.png new file mode 100644 index 0000000000000000000000000000000000000000..d65705a95c747e628522fd64ad3fb0eaafd3b434 Binary files /dev/null and b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/EC600X_KEY.png differ diff --git a/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/EC600X_L76K.png b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/EC600X_L76K.png new file mode 100644 index 0000000000000000000000000000000000000000..ca872e4026308318f21bc6c46eca0e460c514abb Binary files /dev/null and b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/EC600X_L76K.png differ diff --git a/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/EC600X_LCD.png b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/EC600X_LCD.png new file mode 100644 index 0000000000000000000000000000000000000000..104481c45caaa9a460631ec24a4b3f0e85e341b2 Binary files /dev/null and b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/EC600X_LCD.png differ diff --git a/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/EC600X_LIS2DH12TR.png b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/EC600X_LIS2DH12TR.png new file mode 100644 index 0000000000000000000000000000000000000000..8362ac794db7759b2ca9d16b993bde29b5f370c3 Binary files /dev/null and b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/EC600X_LIS2DH12TR.png differ diff --git a/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/EC600X_PA.png b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/EC600X_PA.png new file mode 100644 index 0000000000000000000000000000000000000000..c24cc25ebdcfe06a86bcdc6e2870f1f38206db8d Binary files /dev/null and b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/EC600X_PA.png differ diff --git a/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/EC600X_name_rules.png b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/EC600X_name_rules.png new file mode 100644 index 0000000000000000000000000000000000000000..76930a4ff60636877f134d7ae2a2d16250312a23 Binary files /dev/null and b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/EC600X_name_rules.png differ diff --git a/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/QPYcom_position.png b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/QPYcom_position.png new file mode 100644 index 0000000000000000000000000000000000000000..cd8bec444ce80ccb4c1112af96c47ca16c939d77 Binary files /dev/null and b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/QPYcom_position.png differ diff --git a/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/Running_results.png b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/Running_results.png new file mode 100644 index 0000000000000000000000000000000000000000..7ca1e2e119ad41f990156d9dc6bdee14cf6ae930 Binary files /dev/null and b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/Running_results.png differ diff --git a/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/V1.1_silk_print01.png b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/V1.1_silk_print01.png new file mode 100644 index 0000000000000000000000000000000000000000..aa177c5f1bccdd3295a95dcf690490b64d60c7a4 Binary files /dev/null and b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/V1.1_silk_print01.png differ diff --git a/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/V1.1_silk_print02.png b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/V1.1_silk_print02.png new file mode 100644 index 0000000000000000000000000000000000000000..c2816cf95750aef29636e1640e7870e4dde67dcb Binary files /dev/null and b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/V1.1_silk_print02.png differ diff --git a/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/V1.2_silk_print01.png b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/V1.2_silk_print01.png new file mode 100644 index 0000000000000000000000000000000000000000..34b518961f2ada38a6e8891975d524f9016b3ae4 Binary files /dev/null and b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/V1.2_silk_print01.png differ diff --git a/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/V1.2_silk_print02.png b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/V1.2_silk_print02.png new file mode 100644 index 0000000000000000000000000000000000000000..0feae7fd3437641324286c39ac8a4d7106167263 Binary files /dev/null and b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/V1.2_silk_print02.png differ diff --git a/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/choose_download.png b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/choose_download.png new file mode 100644 index 0000000000000000000000000000000000000000..e20fefec63dcfbf7f59bd67057789644d578fe0d Binary files /dev/null and b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/choose_download.png differ diff --git a/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/download_finish.png b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/download_finish.png new file mode 100644 index 0000000000000000000000000000000000000000..ab3cb1fe7cfdec6c3f0b09cacbadd0affed098cf Binary files /dev/null and b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/download_finish.png differ diff --git a/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/downloading.png b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/downloading.png new file mode 100644 index 0000000000000000000000000000000000000000..00af387139bdba65b950744c92dc2a0273af392c Binary files /dev/null and b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/downloading.png differ diff --git a/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/file_check.png b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/file_check.png new file mode 100644 index 0000000000000000000000000000000000000000..e6d3b17df97a044ede82968d9e097c2abf0633c8 Binary files /dev/null and b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/file_check.png differ diff --git a/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/file_position.png b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/file_position.png new file mode 100644 index 0000000000000000000000000000000000000000..958aaa77b19d5e4f5e9b7a004ef4e237aad1237a Binary files /dev/null and b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/file_position.png differ diff --git a/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/file_running.png b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/file_running.png new file mode 100644 index 0000000000000000000000000000000000000000..69061da40db2b6bac5ab6bcb32198d9a217c929d Binary files /dev/null and b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/file_running.png differ diff --git a/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/file_upload.png b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/file_upload.png new file mode 100644 index 0000000000000000000000000000000000000000..b6ace6806c9b292705ee6c8bd3796432c53e758c Binary files /dev/null and b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/file_upload.png differ diff --git a/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/finish.png b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/finish.png new file mode 100644 index 0000000000000000000000000000000000000000..5791c3ca8ec39a88b90bd39322cd73d96a09408a Binary files /dev/null and b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/finish.png differ diff --git a/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/firmware_check01.png b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/firmware_check01.png new file mode 100644 index 0000000000000000000000000000000000000000..d5ba15e0c4218e0f51c253539e5682762d938e29 Binary files /dev/null and b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/firmware_check01.png differ diff --git a/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/firmware_check02.png b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/firmware_check02.png new file mode 100644 index 0000000000000000000000000000000000000000..3bbd1d074ad2f6962e5f566a56075a2a7e3b5ed0 Binary files /dev/null and b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/firmware_check02.png differ diff --git a/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/image-20210407143154984.png b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/image-20210407143154984.png new file mode 100644 index 0000000000000000000000000000000000000000..ae3d1ab20339489871623fa38631d5efd5af0a2b Binary files /dev/null and b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/image-20210407143154984.png differ diff --git a/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/image-20210417151615729.png b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/image-20210417151615729.png new file mode 100644 index 0000000000000000000000000000000000000000..dd94d41a3218a9d4053bb5408c54e272998bca1e Binary files /dev/null and b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/image-20210417151615729.png differ diff --git a/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/install.png b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/install.png new file mode 100644 index 0000000000000000000000000000000000000000..e308bd4fd972a04e1964339592bfd99568d957c3 Binary files /dev/null and b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/install.png differ diff --git a/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/setup.png b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/setup.png new file mode 100644 index 0000000000000000000000000000000000000000..7ee8e851c58192f83dcf2d69e8807d37c863d63a Binary files /dev/null and b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/setup.png differ diff --git a/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/start.png b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/start.png new file mode 100644 index 0000000000000000000000000000000000000000..51766ffc669601b96eceb9fe88653986ed23ddb0 Binary files /dev/null and b/docs/Quecpython_intro/en/Qp_Hw_EC600X/media/start.png differ diff --git a/docs/Quecpython_intro/en/Qp_Product_intro/Applicable_Scenarios.md b/docs/Quecpython_intro/en/Qp_Product_intro/Applicable_Scenarios.md new file mode 100644 index 0000000000000000000000000000000000000000..55c562af2243bb68dfd4b4cb5fc0664a3a9628fc --- /dev/null +++ b/docs/Quecpython_intro/en/Qp_Product_intro/Applicable_Scenarios.md @@ -0,0 +1,33 @@ + +## Applicable scenarios for quecpthon + +### Technical characteristics + +-** efficiency **: Python development is efficient and convenient, easy to get started, quick to start, no compilation, write and test. +-** rich API interfaces **: the API interfaces provided by mobile communication cover the commonly used MCU and mobile networking module development libraries to ensure the stability and rich functions of the interface to the greatest extent. + +-** compatible with micropthon **: the quecpthon interface is consistent with micropthon in both directory structure and interface application, so as to be consistent with the official for update and iteration. +-** data security **: both source code and data transmission have been encrypted to ensure the security and privacy of users to the greatest extent. +-** development language **: the development language has the advantages of low difficulty, quick start, strong popularity, easy to learn, stability and reliability. +-** strong portability **: the design architecture of quecpthon can quickly migrate and adapt to different application platforms. During the migration process, users only need to develop the platform adaptation layer interface provided by mobile communication, and other app logical applications do not need to pay attention. + +-** rich technical support **: mobile communication provides hand-in-hand introduction documents, teaching documents, teaching videos and official technical support groups. Users can learn the use of quecpthon from 0. At the same time, rich technical support provides services for user development throughout the process. For details, please visit the official website of quecpthon or join the official QQ technology development exchange group of mobile communication. See Chapter ** 2.3 ** for details. + +## Applicable scenario + +QuecPython uses Python language to control MCU or mobile communication module, so what MCU can do can basically reflect what it can do. The applicable scenarios for quecpthon are: + +-Intelligent instrument +-Industrial control +-Household appliances +-Network and communication, remote control +-Modular system +-Automotive electronics +-Medical field +-Mobile payment field +-Youth programming education + +........ + +At present, mobile communication can provide solutions including source code for trader, smart student card, cloud speaker, payment box and industrial DTU. + diff --git a/docs/Quecpython_intro/en/Qp_Product_intro/Arch_features.md b/docs/Quecpython_intro/en/Qp_Product_intro/Arch_features.md new file mode 100644 index 0000000000000000000000000000000000000000..79296dec3b7aba7c8785a43f97d646db443fb6be --- /dev/null +++ b/docs/Quecpython_intro/en/Qp_Product_intro/Arch_features.md @@ -0,0 +1,51 @@ +## Exploring the technical architecture of quecpthon + +### Introduction to system architecture + +![](media/Quectel_Qp_Intro_sys_Arch.png) + +From the system architecture diagram, you can intuitively see the architecture layers from the platform bottom layer to the user interface layer, which are hardware platform hardware layer, platform OS layer, quecpthon adapter layer, quecpthon VM virtual machine layer, quecpthon compiler layer and quecpythonmodules user interface layer. + +Of which: + +-** c-sdk **: hardware platform hardware layer and platform OS layer; + +-** quecpthon complete structure layer **: quecpthon adapter layer, quecpthon VM virtual machine layer, quecpthon compiler layer and quecpthon modules user interface layer. + +Users only need to pay attention to the quecpthon modules user interface layer, which provides a large number of API interfaces, including I2C / SPI / GPIO / audio / PWM / power / ADC / FOTA / datacall / aliyun and other modules. + +### Directory structure + +![](media/Quectel_Qp_Intro_dir_tpc.png.png) + +Catalog Description: + +-** microprython - \ > docs - \ > quectel **: this directory mainly contains the introduction tutorial documents on quecpathon, such as driver installation, development board introduction, etc. + +-** microprython - \ > examples - \ > quectel **: this directory mainly contains quecpthon demo routines. + +-** microprython --- \ > ports --- \ > quectel --- \ > boards **: this directory mainly contains the adaptation layer interfaces for transplanting quecpthon to different platforms. + +-** microprython --- \ > ports --- \ > quectel --- \ > core **: this directory mainly contains logic processing of user interface layer of quecpthon modules. + +-** microprython - \ > tools - \ > quectel **: this directory mainly contains tools related to quecpthon. + +#### Appendix + +Abbreviations: Glossary 1 + +|** term ** full English name ** full Chinese name **| +| -------- | --------------------------------- | ---------------- | +|SDK software development kit| +|VM | virtual machine | virtual machine| +|OS | operating system | operating system| +|DTU | data transfer uni | data transfer unit| +|API Application Programming Interface| +|App | application | application| + +***Continuous update, more wonderful, please pay attention*** + + + +> ​ ***For full documentation visit [http://python.quectel.com/.](http://python.quectel.com/.)*** + diff --git a/docs/Quecpython_intro/en/Qp_Product_intro/Data_Acquisition.md b/docs/Quecpython_intro/en/Qp_Product_intro/Data_Acquisition.md new file mode 100644 index 0000000000000000000000000000000000000000..b6db0b62ed125eea2cb334ce22cb60aba5fbeb0f --- /dev/null +++ b/docs/Quecpython_intro/en/Qp_Product_intro/Data_Acquisition.md @@ -0,0 +1,18 @@ + + + +**Get the firmware developed by quecpthon and join the official communication group** + + + +>Official website homepage: https://python.quectel.com/index.html +> +>Download of official website files (various materials and tools): https://python.quectel.com/download +> +>Official website wiki (commonly used for video tutorial, hand-held tutorial download and API library): https://python.quectel.com/wiki/#/zh -cn/api/ +> +>Work order system: https://workorder.quectel.com/ +> +>QuecPython official QQ development exchange group: 445121768 +> +> WeChat official account: QuecPython diff --git a/docs/Quecpython_intro/en/Qp_Product_intro/Hardware_Support.md b/docs/Quecpython_intro/en/Qp_Product_intro/Hardware_Support.md new file mode 100644 index 0000000000000000000000000000000000000000..106a7c1b4fbcf73b3bbe2beeaefa6daa26352066 --- /dev/null +++ b/docs/Quecpython_intro/en/Qp_Product_intro/Hardware_Support.md @@ -0,0 +1,84 @@ + + +## Document history + +**Revision record** + +|** version ** date ** author ** change statement **| +| -------- | ---------- | -------- | ------------ | +|1.0 | 2021-04-07 | chic | initial version| +|1.1 | 2021-07-08 | chic | add ec200u| + + + +## Hardware support + +Current key support: + +EC200U_CNLB,EUAB + +EC600U-CNLB,CNLC + +EC600N-CNLA,CNLC + +EC600S-CNLA,CNLB + + + + + +Ec200u: u stands for zhanrui 8910 platform + +Ec600u: u stands for zhanrui 8910 platform + +Ec600n: n stands for asr1603 platform + +Ec600s: s stands for asr1601 platform + + + +Ec100y: y stands for asr3601 platform + +The kernel is asr3601, and the system is ThreadX hard real-time embedded source code operating system. + + ![Qp_Product_intro_Hardware_Support_01](media\Qp_Product_intro_Hardware_Support_01.png) + + + +## Details + +|** part number ** band | CPU | flash size (Kbytes) | ** ram size ** (Kbytes) | GPIO | UART | SPI | IIC | ADC | timer | volt | LCD | camera | POC | SD | WiFi | BT | FOTA | supply voltage (V) | maximum operating temperature range (° C)| +| :-------------- | ------------------------------------------------------------ | ------ | ------------------------- | --------------------- | ---- | ---- | ---- | ---- | ---- | ----- | ----- | ---- | ------ | ---- | ---- | ---- | ---- | ---- | ------------------ | ---------------------------------------- | +| EC200UCNLB | LTE-FDD: B1/B3/B5/B8
LTE-TDD: B34/B38/B39/B40/B41
| 624MHz | total:8M free:≈0.3M | free:≈450K | 16 | 3 | 1 | 1 | 3 | 4 | * | * | * | * | * | * | Y | Y | 3.4 to 4.3 | -40 to +105 | +| EC200UEUAB | LTE-FDD: B1/B3/B5/B8
LTE-TDD: B34/B38/B39/B40/B41
GSM: 900/1800 MHz | 624MHz | total:8M free:≈0.3M | free:≈450K | 16 | 3 | 1 | 1 | 3 | 4 | * | * | * | * | * | * | Y | Y | 3.4 to 4.3 | -40 to +105 | +| EC600UCNLB | FDD B1/B3/B5/B8
TDD B34/B38/B39/B40/B41 | 624MHz | total:8M free:≈0.3M | free:≈450K | 16 | 3 | 1 | 1 | 4 | 4 | * | N | N | N | N | * | Y | Y | 3.4 to 4.3 | -40 to +105 | +| EC600UEUAB | FDD B1/B3/B5/B7/B8/B20/B28
TDD B38/B40/B41
GSM B2/B3/B5/B8 | 624MHz | total:8M free:≈0.3M | free:≈450K | 16 | 3 | 1 | 1 | 4 | 4 | | | | | | * | Y | Y | 3.4 to 4.3 | -40 to +105 | +| EC600NCNLC | FDD B1/B3/B5/B8
TDD B34/B38/B39/B40/B41 | 624MHz | total:16M free:≈1M | free:≈450K | 29 | 3 | 1 | 1 | 2 | 4 | * | * | * | * | * | * | N | Y | 3.4 to 4.3 | -40 to +105 | +| EC600NCNLA | FDD B1/B3/B5/B8
TDD B34/B38/B39/B40/B41 | 624MHz | total:8M free:≈0.3M | free:≈450K | 29 | 3 | 1 | 1 | 2 | 4 | N | N | N | N | N | * | N | Y | 3.4 to 4.3 | -40 to +105 | +| EC600SCNLA | FDD B1/B3/B5/B8
TDD B34/B38/B39/B40/B41 | 624MHz | total:16M free:≈1M | free:≈450K | 29 | 3 | 1 | 1 | 2 | 4 | * | * | * | * | * | * | N | Y | 3.4 to 4.3 | -40 to +105 | +| EC600SCNLB | FDD B1/B3/B5/B8
TDD B34/B38/B39/B40/B41 | 624MHz | total:8M free:≈0.3M | free:≈350K | 29 | 3 | 1 | 1 | 2 | 4 | N | N | N | N | N | * | N | Y | 3.4 to 4.3 | -40 to +105 | + +The mark * indicates that it is under development + +Mark y indicates: support + +Mark n indicates: not supported + + + +Directly supported external sensors: + +|Part number | illumination | triaxial | temperature and humidity | power amplifier| +| ----------- | ----------------------- | ------------------ | -------------- | ---------- | +| EC600SCNLA | GL5528、GL5516、OPT3001 | LIS2DH12TR、BMA250 | AHT10、HDC2080 | AW8733ATQR | +| EC600SCNLB | GL5528、GL5516、OPT3001 | LIS2DH12TR、BMA250 | AHT10、HDC2080 | AW8733ATQR | +| EC600UCNLB | GL5528、GL5516、OPT3001 | LIS2DH12TR、BMA250 | AHT10、HDC2080 | AW8733ATQR | +| EC600UEUAB | GL5528、GL5516、OPT3001 | LIS2DH12TR、BMA250 | AHT10、HDC2080 | AW8733ATQR | +| EC600NCNLA | GL5528、GL5516、OPT3001 | LIS2DH12TR、BMA250 | AHT10、HDC2080 | AW8733ATQR | +| EC600NCNLC | GL5528、GL5516、OPT3001 | LIS2DH12TR、BMA250 | AHT10、HDC2080 | AW8733ATQR | + + + +## Module package size + +![Qp_Product_intro_Hardware_Support_03](media\Qp_Product_intro_Hardware_Support_03.png) diff --git a/docs/Quecpython_intro/en/Qp_Product_intro/media/Qp_Product_intro_Hardware_Support_01.png b/docs/Quecpython_intro/en/Qp_Product_intro/media/Qp_Product_intro_Hardware_Support_01.png new file mode 100644 index 0000000000000000000000000000000000000000..da0257df936117f2de15536d26bc81ac6fafc706 Binary files /dev/null and b/docs/Quecpython_intro/en/Qp_Product_intro/media/Qp_Product_intro_Hardware_Support_01.png differ diff --git a/docs/Quecpython_intro/en/Qp_Product_intro/media/Qp_Product_intro_Hardware_Support_02.png b/docs/Quecpython_intro/en/Qp_Product_intro/media/Qp_Product_intro_Hardware_Support_02.png new file mode 100644 index 0000000000000000000000000000000000000000..4233e9750b4883a26fa3bacab9528f0c53780e81 Binary files /dev/null and b/docs/Quecpython_intro/en/Qp_Product_intro/media/Qp_Product_intro_Hardware_Support_02.png differ diff --git a/docs/Quecpython_intro/en/Qp_Product_intro/media/Qp_Product_intro_Hardware_Support_03.png b/docs/Quecpython_intro/en/Qp_Product_intro/media/Qp_Product_intro_Hardware_Support_03.png new file mode 100644 index 0000000000000000000000000000000000000000..2f24fd234b2d8ef3395d1ef0a3c2abc68e9f8285 Binary files /dev/null and b/docs/Quecpython_intro/en/Qp_Product_intro/media/Qp_Product_intro_Hardware_Support_03.png differ diff --git a/docs/Quecpython_intro/en/Qp_Product_intro/media/Quectel_Qp_Intro_dir_tpc.png b/docs/Quecpython_intro/en/Qp_Product_intro/media/Quectel_Qp_Intro_dir_tpc.png new file mode 100644 index 0000000000000000000000000000000000000000..ba1fc4a80189d38f686b39beb5109fd18b3330cb Binary files /dev/null and b/docs/Quecpython_intro/en/Qp_Product_intro/media/Quectel_Qp_Intro_dir_tpc.png differ diff --git a/docs/Quecpython_intro/en/Qp_Product_intro/media/Quectel_Qp_Intro_sys_Arch.png b/docs/Quecpython_intro/en/Qp_Product_intro/media/Quectel_Qp_Intro_sys_Arch.png new file mode 100644 index 0000000000000000000000000000000000000000..dfd443e7910bcb1723f3bcd2d0278ddab9adb0ba Binary files /dev/null and b/docs/Quecpython_intro/en/Qp_Product_intro/media/Quectel_Qp_Intro_sys_Arch.png differ diff --git a/docs/Quecpython_intro/en/README.md b/docs/Quecpython_intro/en/README.md new file mode 100644 index 0000000000000000000000000000000000000000..940036a0079116791a4c15876970914f332ab588 --- /dev/null +++ b/docs/Quecpython_intro/en/README.md @@ -0,0 +1,76 @@ +## QuecPython overview + +This document mainly explains the technical features of quecpthon. + +This document is applicable to the following LTE standard modules of mobile communication: + +- EC100Y-CN +- EC600S-CN +## Origin of quecpthon + +Python is a cross platform computer programming language. It is a high-level scripting language that combines interpretability, compilation, interactivity and object-oriented. Python was originally designed to write automated scripts (shells). With the continuous updating of the version and the addition of new language functions, it is increasingly used in the development of independent large-scale projects. Python's design philosophy is elegant, clear and simple. Python developers' philosophy is "one way, preferably only one way to do one thing", so they usually can't stand the idea of "there are always multiple ways to do the same thing" in Perl language. When designing a python language, if faced with multiple choices, python developers will generally reject fancy syntax and choose explicit syntax with no or little ambiguity. These guidelines are also known as Python maxims. Due to this difference in design concepts, python source code is generally considered to have better readability than Perl and can support large-scale software development. Python is a completely object-oriented language, and fully supports inheritance, overloading, derivation and multi inheritance, which is beneficial to enhance the reusability of source code. Functions, modules, numbers, and strings are objects. Python itself is designed to be extensible. Since not all features and functions are integrated into the language core, python provides rich APIs and tools so that programmers can easily write expansion modules in C language, C + +, and python. The python compiler itself can also be integrated into other programs that need scripting language, so Python is also used as a "glue language" to integrate and encapsulate programs written in other languages. + +Python is often used in the following scenarios: + +-Web and Internet development +-Scientific computing and statistics +-Artificial intelligence +-Desktop interface development +-Software development +-Back end development +-Web crawler +-Embedded development + +**What happens when mobile communication is combined with Python** + +QuecPython is a running environment for executing Python code. It is a new way of Internet of things development. Quec is taken from quectel (mobile communication) and is an Internet of things module based on mobile communication. Python (Chinese name python, common name crawler, alias glue language) is a cross platform computer programming language. It is a script language with easy entry, simple and fast writing, convenient debugging and high development efficiency. It has become one of the most popular programming languages at present. QuecPython is ported to the micropthon open source library. Developers can call the module software functions and external hardware interfaces for secondary development by using micropthon on the mobile communication module. QuecPython facilitates users to carry out secondary development on the Internet of things module more quickly. It is an embedded operating system tailored for users. + + +## Relationship between quecpthon and microprython + +### Introduction to micro Python + +In terms of word composition, microphoton is composed of micro and python. Micro means tiny, while Python is a programming language. The literal meaning of the two is micro python. In fact, micro Python is Python used in embedded system, which can be programmed in embedded system and used for various applications. + +Micropathon is a streamlined and efficient implementation of Python 3 language, including a small part of Python standard library, which is optimized to run in microcontrollers and restricted environments. It contains advanced functions such as interactive prompt, arbitrary precision integer, close, list parsing, generator, exception handling and so on. Micro Python is thin enough to run on only 256 +K code space and 16K ram on the chip, and is designed to be compatible with ordinary Python as much as possible, so that customers can easily transfer code from the desktop to microcontroller or embedded system. At present, micropathon can run not only on the initially developed pyboard microcontroller, but also on a large number of arm based embedded systems, such as Arduino, so that it is very convenient to develop automatic control, robot and other applications through python. + +Micropathon is characterized by its simplicity, portability and easy maintenance. However, the operation efficiency of programs developed by micropathon or other scripting languages (such as JavaScript) is certainly not as high as that of programs compiled by C, C + +, assembly and other tools. Micropathon will not replace the traditional C and C + + languages, but in many cases, the performance of hardware is surplus, and reducing the operation efficiency will not have much impact, and the improvement of the overall development efficiency brought by micropathon is the biggest benefit. If Arduino brings general electronics enthusiasts, DIYer and makers into the embedded field, they will no longer be afraid of hardware development and use; Then micropthon can be used as a tool to develop real products, so that ordinary engineers and enthusiasts can quickly develop embedded programs, and make embedded development and transplantation easy and simple. + +Microphoton uses a very loose MIT licensing method instead of the GPL licensing commonly used by large companies. This means that anyone can use, modify and distribute it, and can apply it to commercial products for free. Get the relevant source code address of micropathon:* https://github.com/micropython/micropython *。 + +### Relationship between quecpthon and micropthon + +1. QuecPython is transplanted to micropthon, and it is highly consistent with micropthon in terms of function interface definition and directory structure. + +2. Both are also applied to embedded scene development. The light Python development language makes developers get started faster and greatly reduces the development threshold. + +3. Both run on resource constrained microcontrollers, with a minimum volume of 256K and only 16K memory. + + + + + +## Relationship between quecpthon and c-sdk + +![Quecpython_intro_1](media/Quecpython_intro_1.png) + +As can be seen from the system architecture diagram, the architecture layers from the platform bottom layer to the user interface layer are very clear, including hardware platform hardware layer, platform OS layer, quecphon adapter layer, quecphon VM virtual machine layer, quecphon compiler layer and quecphon modules user interface layer. + +The hardware platform hardware layer and the platform OS layer belong to the c-sdk part; The quecpthon adapter layer, the platform adaptation layer, the quecpthon VM virtual machine layer, the quecpthon compiler layer and the quecpthon modules user interface layer belong to the complete quecpthon structure layer. + +QuecPython is transplanted and adapted on the basis of c-sdk. + + +## QuecPython technical features + +The main features of quecpthon technology are as follows: + +1. ** efficiency **: Python development is efficient and convenient, easy to get started, quick to start, no compilation, write and test at any time. +2. ** rich API interfaces **: the API interfaces provided by mobile communication cover the commonly used MCU and mobile networking module development libraries to ensure the stability and rich functions of the interface to the greatest extent. +3. ** compatible with micropthon **: the quecpthon interface is consistent with micropthon in terms of directory structure and interface application, so as to be consistent with the official for update and iteration. +4. ** data security **: both source code and data transmission have been encrypted to ensure the security and privacy of users to the greatest extent. +5. ** development language **: the development language has the advantages of low difficulty, quick start, strong popularity, easy to learn, stability and reliability. +6. ** strong portability **: the design architecture of quecpthon can quickly migrate and adapt to different application platforms. During the migration process, users only need to develop the platform adaptation layer interface provided by mobile communication, and other app logical applications do not need to pay attention. +7. ** rich technical support **: mobile communication provides hand-in-hand introduction documents, teaching documents and teaching videos, and establishes an official technical support group. Users can learn the use of quecpthon from scratch. At the same time, rich technical support provides services for user development in the whole process. + diff --git a/docs/Quecpython_intro/en/config.json b/docs/Quecpython_intro/en/config.json new file mode 100644 index 0000000000000000000000000000000000000000..c078588621dc22f53eeded166caa5688a6f5ef83 --- /dev/null +++ b/docs/Quecpython_intro/en/config.json @@ -0,0 +1,24 @@ +{ + "import": "config_en", + "navbar": { + "items": [ + { + "id": "language", + "label": "Language: ", + "position": "right", + "items": [ + { + "id": "zh", + "url": "/doc/Quecpython_intro/zh/", + "label": "中文" + }, + { + "id": "en", + "url": "/doc/Quecpython_intro/en/", + "label": "English" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/docs/Quecpython_intro/en/media/Quecpython_intro_1.png b/docs/Quecpython_intro/en/media/Quecpython_intro_1.png new file mode 100644 index 0000000000000000000000000000000000000000..fcac848052a1d19bca17550311b885dfee98d4ec Binary files /dev/null and b/docs/Quecpython_intro/en/media/Quecpython_intro_1.png differ diff --git a/docs/Quecpython_intro/en/sidebar.yaml b/docs/Quecpython_intro/en/sidebar.yaml new file mode 100644 index 0000000000000000000000000000000000000000..ca2875d9341ad411be52515599d7de4db059b4c9 --- /dev/null +++ b/docs/Quecpython_intro/en/sidebar.yaml @@ -0,0 +1,16 @@ +# Quecpyton data sheet +items: + - label: Introduction + file: README.md + - label: Architecture properties + file: Qp_Product_intro/Arch_features.md + - label: hardware data + items: + - label: hardware support + file: Qp_Product_intro/Hardware_Support.md + - label: ec600x development board + file: Qp_Hw_EC600X/Hardware_Support_EC600X.md + - label: Data Acquisition + file: Qp_Product_intro/Data_Acquisition.md + - label: applicable scenario + file: Qp_Product_intro/Applicable_Scenarios.md diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/Hardware_Support_EC600X.md b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/Hardware_Support_EC600X.md new file mode 100644 index 0000000000000000000000000000000000000000..4c2047212e9d18f7cd6fab72e15635d63867a30f --- /dev/null +++ b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/Hardware_Support_EC600X.md @@ -0,0 +1,718 @@ +## **修订记录** + +| **版本** | **日期** | **作者** | **变更表述** | +| -------- | ---------- | -------- | -------------------------------------- | +| 1.0 | 2020-12-14 | 袁帅 | 初始版本 | +| 1.1 | 2020-12-20 | Josh | 硬件1.1版本增加音频功放电路 | +| 1.1.1 | 2020-12-28 | Chic | 文档增加【项目推介】 | +| 1.1.2 | 2021-01-06 | Chic | 修改关于LED的描述 | +| 1.2 | 2021-01-20 | Jorma | 修改部分内容 | +| 1.2.1 | 2021-03-31 | David | 增加V1.2开发板的内容;增加图表标题 | +| 1.2.2 | 2021-04-02 | chengzhu | word转换成md,后续更新基于md更新 | +| 1.2.3 | 2021-04-06 | David | md文档下,图片和目录的格式修改 | +| 1.3 | 2021-09-06 | Kayden | 增加V1.3开发板的内容,修改增添部分内容 | + +## 基本概述 + +### 描述 + +EC600X_QuecPython_EVB_V1.x开发板是一款搭载多款传感器的Cat.1通信模块开发板,本文将介绍这款开发板的使用方法和注意事项。 + +EC600X\_QuecPython_EVB_V1.x的命名规则如下: + +image-20210406102449288 + +EC600S_QuecPython_EVB_V1.x(x=0,1)开发板(本文简称“V1.1开发板”)是专门针对EC600S制造,是一款小巧便携的“口袋型”开发板。体型虽小,但是功能丰富,拥有温湿度传感器、SIM卡座、板载天线、LCD接口、光敏电阻、MIC、等元件。 + +为了满足多模组的开发需求,开发了EC600X_QuecPython_EVB_V1.2(本文简称“V1.2开发板”)。相比较前两款,在元件上主要增加了GNSS模组:L76K。 + +为了方便用户选择开发板供电方式,开发了EC600X_QuecPython_EVB_V1.3(本文简称“V1.3开发板”)。相比较上一个版本主要增加了一个电源选择开关。 + +开发者仅需一条USB Type-C 数据线即可轻松玩转开发板。 + + + +### V1.1开发板资源 + +- Quectel移远 EC600S_CNAA Cat.1 通信模组 +- PCB天线 +- NANO SIM自弹卡座 +- 保留SMA天线座焊盘 +- USB Type-C数据接口 +- 一个开机按键,一个复位按键 +- 两个自定义功能按键 +- 音频功放,支持最高4Ω3W喇叭 +- 温湿度传感器 +- G-Sensor 三轴加速度传感器 +- (不支持)LED彩灯 +- (需焊接)驻极体MIC +- (需焊接)Speaker 音频输出 +- (需焊接)光敏电阻 +- (需焊接)GPIO排针 +- (需焊接)LCD排针 + +### V1.2开发板资源 + +- Quectel移远 EC600X Cat.1 通信模组 +- NANO SIM自弹卡座 +- GPS、LTE、WIFI/BT天线接口 +- USB Type-C数据接口 +- 开机按键,复位按键,强制下载按键 +- 两个自定义功能按键 +- 音频功放,支持最高4Ω3W喇叭 +- 温湿度传感器 +- G-Sensor 三轴加速度传感器 +- 单色灯 +- 驻极体MIC +- Speaker 音频输出 +- 光敏电阻 +- GPIO排针 +- LCD排针 +- CAMERA接口 + +### V1.3开发板资源 + +- Quectel移远 EC600X Cat.1 通信模组 +- NANO SIM自弹卡座 +- GPS、LTE、WIFI/BT天线接口 +- USB Type-C数据接口 +- 开机按键,复位按键,强制下载按键 +- 两个自定义功能按键 +- 音频功放,支持最高4Ω3W喇叭 +- 温湿度传感器 +- 单色灯 +- 驻极体MIC +- Speaker 音频输出 +- 光敏电阻 +- GPIO排针 +- LCD排针 +- CAMERA接口 +- 电源选择开关 + +### 开发板能做的事情 + +#### 小实验 + +开发板包含诸多接口、外设,方便开发者开发调试。在QuecPython官网的文档中心提供了众多小实验。 + +具体地址见:[QuecPython小实验](https://python.quectel.com/doc/doc/little_demo/zh/index.html) + +#### 实现产品原型 + +基于开发板自带的众多传感器、按键、液晶屏等外设,开发者甚至可以直接以开发板为基础,快速做出产品原型。接下来试举几例以开发板板载的传感器为基础,可以做的某些产品原型: + +- **防盗损装置** + +**背景**:无人值守的设备如快递柜、充电站、充电桩等,存在被盗或破坏的风险。需要实现远程控制、防盗、异常状态上报等。 + +**装置**:Quectel通信模组+加速度传感器+GPIO(搭配振动传感器、微动开关、继电器、LED等)+喇叭。 + +**方法**:Quectel通信模组连接云端,保存云端下发的参数。读取传感器上报的参数,判断当前姿态、震动状态是否超过阈值,LED闪烁、报警,并通过网络上报到云端。 + +- **微型天气服务站** + +**背景**:在野外架设无人值守的微型天气服务站,通过网络定时上报温湿度、风力等数据,以供记录、分析、预报。 + +**装置**:Quectel通信模组+温湿度传感器+ADC(风力检测、电池电压检测)+GPIO(电池充放电状态检测)。 + +**方法**:Quectel通信模组连接云端,保存云端下发的参数。通过NTP同步内部时钟;读取温湿度传感器、ADC器上报的参数,并按照云端的要求,将数据序列化通过网络上报到云端。网络不佳情况下,离线存储数据,待网络通畅再上报数据到云端。 + +- **微型自动售货机** + +**背景**:很多酒店的miniBar不能满足客户的需求,而客房内的微型自动售货机则可以很好地弥补这个缺陷。售卖如零食、口香糖、充电线等小件商品,同时提供手机充电等服务。 + +**装置**:Quectel通信模组+GPIO(搭配步进电机、继电器/MOS管)+光照传感器+LCD+GSensor+喇叭。 + +**方法**:Quectel通信模组连接到云端,注册并鉴权,收到云端下发的数据,LCD屏幕显示对应的二维码;用户使用微信或者支付宝扫描LCD显示的二维码,进入小程序选购。选购完成并支付后,云端下发控制指令,通信模组接到指令,解析指令内容,控制GPIO实现步进电机旋转出货,并通过光照传感器确认出货完毕;或控制继电器/MOS管,实现手机充电功能;出货完毕后,可使用TTS语音朗读相应的信息如“*出货完毕,欢迎再次选购*”。当G-Sensor检测到倾倒或者暴力破坏时,可自动上报信息到云端,以便运维处理。 + +- **扫码把枪** + +**背景**:日常场景,可以使用把枪实现批量录入条形码、二维码。但是传统把枪无法脱离电脑使用,而使用手机扫码颇为繁琐,且稳定性差、耗电量高。使用无线扫码把枪,可以实现远程扫码、无线扫码、连续扫码等。 + +**装置**:Quectel通信模组+SPI Camera+LCD+GPIO(搭配矩阵键盘)。 + +方法:Quectel通信模组开机后连接云端,LCD显示对应信息,使用者通过按键确认,然后开启 +Camera扫描条形码或二维码(可选单次扫描、连扫等操作),模块识别条形码或二维码的信息,并上报到云端。 + +- **智能控制** + +**背景**:云端下发运行参数,模块实现自动化监测设备、控制,节省人工成本。 + +**装置**:Quectel通信模组+SPI Camera+SPI+I2C+LCD+GPIO(搭配按键、继电器等)。 + +**方法**:Quectel通信模组开机后连接云端,获取运行参数并保存。在LCD显示相应的控制内容和运行状态;当检测到传感器的数值超过阈值,则根据保存的参数执行对应动作,并上报云端(例如湿度超过80%则打开继电器,控制除湿机开启),实现自动化控制。 + +- **设备定位** + +**背景:**共享单车快速发展,部分单车由于停车位置的偏僻性,消费者在寻找时无法有效准确的找到单车的位置,影响客户的消费体验,同时耗费大量的资源,而且实时性无法保证。 + +**装置:**Quectel通信模组+ L76K。 + +**方法:**使用L76K获取定位信息,输出NEMA语句,然后通过模组的串口读取NEMA,输出定位信息,最后在连接网络的情况下,将数据发送到云端(例如:阿里云)实现实时共享。 + +## 开发板介绍 + +开发板是为方便开发者使用QuecPython,而设计的一款基于EC600X +Cat.1通信模块的开发板,其上集成了开发常用的配置,可以满足开发者的开发需求。 + +### V1.1开发板 + +#### V1.1开发板正面接口 + +image-20210406102743063 + + + +#### V1.1开发板背面接口 + +EC600XV1.1_otherside + +**TIPS:** + +开发板的丝印请参考本手册的附录内容开发板的更多资料,请访问 + +#### V1.1开发板配置 + +开发板配备了多种传感器,以及其他外设。明细如下: + +| 序号 | 名称 | 型号 | 是否支持 | 接口类型 | +| ---- | ---------------------------- | ------------- | -------- | -------- | +| 1 | 三轴加速度传感器 | LIS2DH12TR | 是 | I2C | +| 2 | 温湿度传感器 | AHT10 | 是 | I2C | +| 3 | 光敏电阻 | GL5528 | 是 | ADC | +| 4 | 微动按键 | - | 是 | GPIO | +| 5 | 麦克风 | GMI6050P-66DB | 是 | SPK | +| 6 | 功放芯片 | AW8733ATQR | 是 | SPK | +| 7 | LED彩灯 | WS2812B-MINI | 否 | PWM | +| 8 | LCD 显示屏(需选择含屏套餐) | ST7789 | 是 | SPI | + +### V1.2开发板 + +#### V1.2开发板正面接口 + +image-20210406104035040 + +#### V1.2开发板背面接口 + +image-20210406104055313 + +| 小提示 | +| ------------------------------------------------------------------------------------------------- | +| 开发板的丝印请参考本手册的附录内容 开发板的更多资料,请访问 | + +#### V1.2开发板配置 + +开发板配备了多种传感器,以及其他外设。明细如下: + +| 序号 | 名称 | 型号 | 是否支持 | 接口类型 | +| ---- | ---------------------------- | ------------- | -------- | --------- | +| 1 | 三轴加速度传感器 | LIS2DH12TR | 是 | I2C | +| 2 | 温湿度传感器 | AHT10 | 是 | I2C | +| 3 | 光敏电阻 | GL5528 | 是 | ADC | +| 4 | 微动按键 | - | 是 | GPIO | +| 5 | 麦克风 | GMI6050P-66DB | 是 | SPK | +| 6 | 功放芯片 | NS4160 | 是 | SPK | +| 7 | LED | Green | 是 | PWM、GPIO | +| 8 | LCD 显示屏(需选择含屏套餐) | ST7789 | 是 | SPI | +| 9 | GNSS模组 | L76K | 是 | UART | + +### V1.3开发板 + +#### V1.3开发板正面接口 + +image-2021081200 + +#### V1.3开发板正面接口 + +image-2021081301 + +| 小提示 | +| ------------------------------------------------------------ | +| 开发板的丝印请参考本手册的附录内容 开发板的更多资料,请访问 | + +#### V1.3开发板配置 + +开发板配备了多种传感器,以及其他外设。明细如下: + +| 序号 | 名称 | 型号 | 是否支持 | 接口类型 | +| ---- | ---------------------------- | ------------- | -------- | --------- | +| 1 | 温湿度传感器 | AHT10 | 是 | I2C | +| 2 | 光敏电阻 | GL5528 | 是 | ADC | +| 3 | 微动按键 | - | 是 | GPIO | +| 4 | 麦克风 | GMI6050P-66DB | 是 | SPK | +| 5 | 功放芯片 | NS4160 | 是 | SPK | +| 6 | LED | Green | 是 | PWM、GPIO | +| 7 | LCD 显示屏(需选择含屏套餐) | ST7789 | 是 | SPI | +| 8 | GNSS模组 | L76K | 是 | UART | + +## 功能详解 + +| 注意:此部分电路原理图并非适用所有版本开发板,对应版本原理图请在官网下载或QQ群445121768群文件获取! | +| ------------------------------------------------------------ | + +### LCD接口 + +开发板集成了LCD接口,开发者可以通过该接口点亮LCD屏幕,显示图片文字等内容。搭配LVGL还能显示更多有趣内容哦(点此了解“[LCD](https://python.quectel.com/doc/doc/sbs/zh/sbs/lcd.html)”的小实验)。 + +目前,QuecPython支持的屏幕: + +- GC9305 + +- HX8347 + +- ST7789 + +- ST7735 + +- 更多屏幕,正在适配中… + +![](media/EC600X_LCD.png) + +| 请注意 | +| ------------------------------------------------------------ | +| 对于LCD Slot, V1.0和V1.1的开发板没有CS, 请选择没有CS的屏, 或者将屏的CS接地, 具体可参考V1.1的原理图 | + +### 加速度传感器 + +V1.2开发板集成了LIS2DH12TR三轴加速度传感器,V1.3开发板没有此传感器,但是预留了焊接空间。该三轴加速度传感器是具有体积小巧、耗电低、灵敏度高的特点。开发者通过该加速度传感器,可以采集开发板的运动状态,姿态等数据。 + +点此了解:[“加速度传感器”小实验](https://python.quectel.com/doc/doc/little_demo/zh/QuecPythonTest/i2c_lis2dh.html) + +![](media/EC600X_LIS2DH12TR.png) + +### 光敏电阻 + +开发板集成了GL5528高灵敏度光敏电阻。光敏电阻对光线十分敏感,其在无光照时,呈高阻状态,暗电阻一般可达1.5MΩ;而在光照时,阻值可小至1KΩ以下。使用该光敏电阻,开发者可以采集环境光照度信息。 + +点此了解:[光敏传感器实验](https://python.quectel.com/doc/doc/little_demo/zh/QuecPythonTest/Photoresistor.html) + +![](media/EC600X_GL5528.png) + +| 请注意 | +| ------------------------------------------ | +| EC600N后缀为UNNSA模组ADC功能才能正常使用。 | + +### 温湿度传感器 + +开发板集成了AHT10温湿度传感器。该传感器具有低功耗、体积小、计量准确的特点。开发者可以使用该传感器采集环境温度、湿度等信息。点此了解:[温湿度传感器实验](https://python.quectel.com/wiki/study/zh-cn/study/QuecPythonTest/i2c_aht/) + +![](media/EC600X_AHT10.png) + +### 音响功率放大器(功放芯片) + +开发板集成了音响功率放大器。V1.1集成的是AW8733ATQR,该功放芯片是K类音响功率放大器,具有超强 TDD 抑制、超大音量、防破音、超低 EMI、输出功率2.0W的特点。V1.2和V1.3集成的是NS4160,一款带AB类/D类工作模式切换功能、超低EMI、无需滤波器、5W单声道音频功放的一种科技产品。点此了解:[Audio模块开发](https://python.quectel.com/doc/doc/Advanced_development/zh/QuecPythonSub/Audio.html) + +![](media/EC600X_PA.png) + + + +| 请注意 | +| ------------------------------------------------------------ | +| V1.0版开发板没有功放芯片,放音可能失败 | +| V1.1版开发板有功放芯片,需要拉高PIN58使能:audio_EN = Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) | +| V1.1版开发板录音存在问题,需要拿掉R28 | +| V1.2、V1.3开发板均需要使能功放芯片,拉高引脚参见原理图。 | + +### 自定义按键 + +开发板集成了2个自定义微动按键,开发者可以自行定义其功能。 + +点此了解:[按键输入实验](https://python.quectel.com/doc/doc/little_demo/zh/QuecPythonTest/button.html) + +![KEY](media/EC600X_kEY.png) + +| 请注意 | +| ---------------------------------------------------- | +| V1.1开发板丝印错误,微动开关实际连接的是GPIO1、GPIO2 | + +### GNSS模组:L76K + +V1.2和V1.3开发板集成了一个GNSS模组L76K,客户无需联网即可获取定位信息。 + +![](media/EC600X_L76K.png) + +| 请注意 | +| ------------------------------------------ | +| 对于V1.1之前开发板是没有配置此GNSS模组的。 | + +## 准备工作 + +### 开发板开机 + +对于模组来说,开机条件都是类似的,但是由于硬件设计的不同,不同开发板的开机操作略有区别, **如下表格强烈建议查看** + +| 开发板 | 开机操作 | +| -------------------------- | ------------------------------------------------------------ | +| EC600S_QuecPython_EVB_V1.0 | 插电即开机 | +| EC600S_QuecPython_EVB_V1.1 | 长按开发板侧边的POWKY两秒松开,模组便会开机 | +| EC600X_QuecPython_EVB_V1.2 | 开发板上的PWK_ON跳帽短接,则无需长按PWK,反之需要长按PWK | +| EC600X_QuecPython_EVB_V1.3 | 供电后先拨动电源选择开关选择供电方式,再长按PWK开机,或把开发板上的PWK_ON跳帽短接,则无需长按PWK | + +### 安装USB驱动 + +使用开发板前,需要在电脑上安装USB驱动。正确安装后,电脑可以识别开发板。 + +驱动程序下载地址: + + **注意事项** + +**1.驱动的分类主要分为两大类:** + +**第一、基于模组支持的平台分类:ASR平台(EC600S、EC600N、EC100Y)和RDA平台(EC600U、EC200U)更多模组的平台信息可见:[硬件支持](https://python.quectel.com/doc/doc/Quecpython_intro/zh/Qp_Product_intro/Hardware_Support.html)** + +**相信大家也有一个疑问EC600X是什么平台,实际上EC600X中“X”是一个未知数,可指EC600S、EC600U等,并不代表实际的平台。** + +**第二、基于PC的系统分类:Windows7系统请下载Windows7对应的驱动;Windows10系统请下载Windows10对应的驱动。** + +**2.对于EC600SCNLA和EC600SCNLB,必须下载最新版本的驱动,驱动版本至少在V1.0.8以上** + +**ASR平台驱动安装步骤如下:** + +- 请选择对应的驱动,具体安装哪个驱动参考上述注意事项 + +- 开发者下载驱动程序的压缩包后,完整解压该压缩包到任意目录,双击运行setup.exe: + +![](media/setup.png) + +- 按照提示,点击Install即可: + +![](media/install.png) + +- 安装成功后,点击“Finish”结束: + +![](media/finish.png) + +- 至此,ASR平台USB 驱动安装结束。 + +**RDA平台驱动安装步骤如下:** + +- 开发者下载驱动程序的压缩包后,完整解压该压缩包到任意目录,双击运行setup.bat: +- 等待安装成功即可。 + +| 小提示 | +| ------------------------------------------------------------ | +| (1)安装前,请备份您的重要文件,并保存您的工作进度,以免发生意外情况,导致文件丢失 | +| (2)安装成功后,无需重启电脑 | +| (3)如需修复或者卸载驱动程序,再次运行该驱动安装程序,选择“修复”或“卸载” 即可 | +| (4)如若安装失败,请联系我们的在线支持:QQ群 445121768 | + +### 验证驱动安装 + +驱动安装成功后,使用USB TypeA-TypeC数据线,将开发板连接到电脑上,并开机(具体开机参考可参考上述“开发板开机”章节)。 + +在电脑上打开“设备管理器”,进入电脑的设备管理器,展开**“端口(COM 和LPT)”**,若是EC600S和EC600N且固件为QuecPython固件应出现三个串口设备: + +- **Quectel USB AT Port (COMx)** +- **Quectel USB DIAG Port (COMx)** +- **Quectel USB MI05 COM Port (COMx)** + +若是EC200U和EC600U应出现八个串口设备: + +- **Quectel USB AT Port (COMx)** +- **Quectel USB AP Log Port (COMx)** +- **Quectel USB CP Log Port (COMx)** +- **Quectel USB Diag Port (COMx)** +- **Quectel USB MOS Port (COMx)** +- **Quectel Modem (COMx)** +- **Quectel USB Serial-1 Port (COMx)** +- **Quectel USB Serial-2 Port (COMx)** + +| 小提示 | +| ------------------------------------------------------------ | +| EC200U和EC600U在下载QuecPython固件前后端口数量和名称没有变化。 | +| 如何打开“设备管理器”呢? 很简单,请跟我来:我的电脑—“此电脑”—属性—设备管理器 | + +如果您的电脑没有识别到任何串口设备,请检查: + +- 开发板是否正确连接到电脑(数据线损坏,或者插口损坏、供电不足等) + +- 开发板是否正确开机 + +- USB驱动是否正确安装 + +- 电脑是否正确安装主板驱动。 + +如果无法排除,请联系我们的在线支持:QQ群 445121768 + +**如果您的电脑只识别了两个串口设备(没有“Quectel USB MI05 COM Port”),那么可能是因为没有刷入QuecPython固件的缘故。别着急,请阅读下一章节,刷入QuecPython固件就可以啦。** + +![image-20210417105022954](media/DM_not_Quecpython.png) + +如果您的电脑正确识别了三个串口设备,那么恭喜您,一切准备就绪,可以开始QuecPython之旅啦 + +![image-20210417104910841](media/DM_Quecpython.png) + +### 验证固件版本 + +使用串口工具,打开“Quectel USB AT Port”对应的串口(波特率选择 115200,停止位 1位,无奇偶校验,8 位数据位,无硬件控制流)。勾选“发送新行”(Send With Enter),发送指令“AT+GMR”,查看模块返回的信息,即当前固件版本: + + + +如果是QuecPython的固件,查询结果通常包含PY或QPY等和Python相关字符。 + +使用官方的图形化工具——QPYcom,同样也可以验证当前固件版本是否为QuecPython固件。 + +QPYcom下载地址: + +具体位置如下截图: + +QPYcom_position + +使用QPYcom工具查看固件版本的步骤如下: + +1. 下载QPYcom工具后,完整解压到任意目录,双击QPYcom.exe运行; + +2. 将开发板连接到电脑并开机; + +3. 选择代码交互串口,默认波特率115200,打开串口; + + | 模块型号 | 选择交互串口名称 | + | -------- | ------------------------- | + | EC600U | Quectel USB Serial-1 Port | + | EC600S | Quectel USB MI05 COM Port | + | EC600N | Quectel USB MI05 COM Port | + +4. 点击“**交互**”标签,进入交互页; + +5. 键入如下命令,然后查看模块返回的内容: + + *import uos* + + *uos.uname()* + + + +如图所示,如果可以正常返回内容,则证明当前运行的是QuecPython固件。 + +如果没有代码交互串口,或者无法输入,输入无返回等情况,则模组内运行的都不是QuecPython固件,需要下载QuecPython固件。 + +### 下载固件 + +什么是QuecPython 固件(下简称“固件”)?为什么要下载它呢? 固件是包含驱动、BL、FS、VM等资源的一个二进制程序,没有固件的模块,就像没有辣椒的火鸡面,寡淡无味。下载固件后,模块就可以“跑起来”啦。 通俗来讲,“固件相对于Quectel通信模组”,类似于“操作系统相对于电脑”;”用户脚本相对于QuecPython固件”,类似于”应用程序相对于操作系统”。 只有把操作系统安装到电脑上(下载固件),再把应用程序安装好(下载用户脚本),才能让电脑发挥相应的功能,执行相应的操作和指令。 + + **注意事项** + +1. **哪里可以获取到QuecPython 固件? 请到QuecPython官方网站下载: ** +2. **不同模组对应不同的固件,不支持交叉烧录,如果误烧,一定要纠正烧录成对应固件,否则无法正常使用。例如:EC600S分为EC600SCNAA、EC600SCNLA、EC600SCNLB等等,这些模组之间都不支持交叉烧录。** +3. **关于固件包的说明,由于官网下载的固件压缩文件包含固件包与change log,所以官网下载的固件压缩文件需要解压一层,才可以得到可烧录的固件包,EC600S和EC600N固件包的后缀为.bin,EC200U和EC600U固件包的后缀为.pac。** +4. **下载固件前,建议优先需要确认固件版本,以免降级或者下错版本。 下载固件后,所有用户区的内容都将被清空(支持保留用户重要参数的版本正在开发)。** + +使用QPYcom工具下载固件的步骤如下: + +1. 下载QPYcom工具后,完整解压到任意目录,双击QPYcom.exe运行; + +2. 将开发板连接到电脑并开机; + +3. 点击“**下载**”标签,进入下载页; + +4. 在下载页面左侧导航栏创建项目,然后点击“**选择固件**”选择固件包; + +5. 左键点击页面右下角倒三角形,在弹出的菜单中选择“**下载固件**”菜单,点击“**下载固件**”按钮,工具自动开始固件下载。 + +| 小提示 | +| ------------------------------------------------------------ | +| 下载固件时,无需选择串口,工具将自动选择并开始下载 | +| 请勿同时插入两个或两个以上的开发板,以免工具无法识别,导致下载出错 | + +| 请注意 | +| ------------------------------------------------------------ | +| 下载固件过程中,请勿退出工具,或者拔掉串口,可能致使模块变砖。 如果模块确已变砖,可见“[QuecPython救砖处理](https://python.quectel.com/doc/doc/FAQ/zh/QP_recovery/QP_recovery.html)”章节 | + + + + + +choose_download + + + + + + + + + + + +下载完成后,可以使用上一章的方法,发送AT指令,或者使用“交互”页测试,固件是否正确下载。 + +### 下载helloworld.py程序到开发板 + +使用QPYcom工具,我们可以将自己的 Python 脚本文件下载到模块中。 + +hello world.py 文件内容( 代码下载): + +```python +import utime +while True: + print(“hello world”) + utime.sleep(1) +``` + +具体的操作步骤如下: + +1. 下载QPYcom工具后,完整解压到任意目录,双击QPYcom.exe运行 + +2. 将开发板连接到电脑并开机 + +3. 选择代码交互串口,默认波特率,打开串口 + +4. 点击“**文件**”标签,进入文件页(左侧为电脑本地的文件;右侧为模块端的文件) + +5. 左侧浏览电脑的文件,并选择对应的.py文件,拖动该文件到右侧的“Root”根节点或“usr”目录,松开鼠标左键,即可自动下载文件到模块(也可以点击右侧栏的“**+**”按钮,浏览并选择文件,将文件下载到模块内) + +6. 文件下载过程中,页面底部状态栏有下载进度,进度到100%表示文件下载成功。 + + 旧版文件系统下载到“Root”根节点: + + + +​ 新版双文件系统下载到“usr”目录: + + + +如图所示,此时 hello world.py文件已经下载到模块主目录下,可以通过QPYcom工具的“交互”查看,操作如下: + +旧版文件系统查询操作: + + + +新版双文件系统查询操作: + + + +| 小提示 | +| ------------------------------------------- | +| 新版固件使用双文件系统,根目录 / 可读不可写 | +| 备份分区 /bak 不可读不可写 | +| 用户分区 /usr 可读可写 | +| 用户的所有file io 操作,都应在 /usr 进行 | + +### 运行hello world.py程序 + +运行模块内的python脚本,有两个方式: + +- 手动运行 + + +1. 下载QPYcom工具后,完整解压到任意目录,双击QPYcom.exe运行 + +2. 将开发板连接到电脑并开机 + +3. 选择代码交互串口,默认波特率,打开串口 + +4. 点击“文件”标签,进入文件页(左侧为电脑本地的文件;右侧为模块端的文件) + +5. 右侧浏览模块内的文件,选中需要运行的py文件,点击“三角”按钮![](media/start.png),QPYcom将自动跳转到“**交互**”页,并运行该脚本文件 + +6. 也可以导入 example 模块,并使用exec方法运行 python 脚本程序: + +```python +import example +example.exec(‘hello world.py’) +``` + +| 小提示 | +| ------------------------------------------------------------ | +| 如果是双文件系统,则应执行如下命令: import example example.exec(‘usr/hello world.py’) | + +运行结果如下图所示: + + + + + +- 开机后自动运行 + + +QuecPython支持上电自动执行用户代码。Quectel 通信模组上电运行后,QuecPython会查找用户分区下名成为 main.py的程序文件并自动执行该文件。所以如果用户希望能上电后自动运行自己的代码,需要将自己的程序命名为main.py,连同它的依赖等文件,一起下载到模块内。 + +| 小提示 | +| ------------------------------------------------------------ | +| 文件名必须是main.py(大小写完全一致),必须放在用户区内,才能实现开机后自动运行。 如果main.py调用其他py、mpy文件,需要一同下载到用户区。 | + +以helloworld.py 为例说明:将helloworld.py 文件提供方法 1s 周期性打印“hello world!”字符串; main.py 文件中调用 hello world.py 中的方法。 + +```python +#helloworld.py代码 +import utime +def prtHelloworld(): + while True: + print("hello world") + utime.sleep(1) +``` + +```python +# main.py: +# 调用helloworld.py文件 +import helloworld +# 调用helloworld.py 文件的 prtHelloworld() 函数 +helloworld.prtHelloworld() +``` + + **小提示** + +(1)需要import的文件名,不建议包含空格等特殊字符,建议以纯英文命名。 +(2)如果是双文件系统,用户的py文件,则需要使用如下方法import: +方法1:from usr import helloworld #helloworld表示py文件名 +helloworld.prtHelloworld() +方法2:import usr.helloworld #意为usr目录下的helloworld.py 文件 +usr.helloworld.prtHelloworld() #注意,此方式一定要带上usr的前缀 + (3)上边两种方法结合,可以引申为: +from usr.helloworld import * +prtHelloworld() #因为已经import *,所以此处直接调用函数名即可 + +将上面两个文件都下载到模块中。 + +![file_position](media/file_position.png) + +按一下开发板上的 RESET 按键,系统启动后,重新连接主串口,电脑键盘按下 Enter键,进入交互界面即可看到自动运行结果: + +file_running + + + +| 小提示 | +| ---------------------------------------------------------- | +| 自动运行失败,请检查py文件是否存在语法错误、调用错误的情况 | + +| 请注意 | +| ---------------------------------------------------------------------------------------------------------------------------- | +| 自动运行的脚本,或者循环输出的脚本,将无法使用Ctrl+C停止运行; 锁死交互的模块,也无法终止脚本运行; 唯一的方法是:重刷固件。 | + +### 常见问题解决 + +**Q:模块的固件在哪?** + +A:请登录QuecPython网站下载: + +**Q:哪里有开发板和其他常用资料?** + +A:请登录QuecPython网站下载: + +P.S. 如果您遇到任何问题,请参照本官网在线文档进行解决或访问QuecPython社区进行搜索、交流、提问:[QuecPython社区](https://forumschinese.quectel.com/c/function-subjects/quectpython/43) + +或者联系我们的在线支持:QQ群 445121768 + +## 附录1 V1.1开发板丝印图 + +V1.1_silk_print01 + +V1.1_silk_print02 + + + + + +## 附录2 V1.2开发板丝印图 + +V1.2_silk_print01 + +V1.2_silk_print02 + +## 附录3 V1.3开发板丝印图 + + + + + diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/code/helloworld.py b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/code/helloworld.py new file mode 100644 index 0000000000000000000000000000000000000000..359e0f8ae0fef7c9a8f9588f596c28a040bd8953 --- /dev/null +++ b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/code/helloworld.py @@ -0,0 +1,4 @@ +import utime +while True: + print("hello world") + utime.sleep(1) diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/Create_project.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/Create_project.png new file mode 100755 index 0000000000000000000000000000000000000000..2155f5661248eaea4678c715d1daccbe9fbddd5d Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/Create_project.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/DM_Quecpython.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/DM_Quecpython.png new file mode 100755 index 0000000000000000000000000000000000000000..5206d0512beab4dfb59b0eb522bd697a9cffe178 Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/DM_Quecpython.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/DM_not_Quecpython.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/DM_not_Quecpython.png new file mode 100755 index 0000000000000000000000000000000000000000..ee6775860106c0d0b2aa52143f85c6041fb1ebf0 Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/DM_not_Quecpython.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/Divers.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/Divers.png new file mode 100755 index 0000000000000000000000000000000000000000..a622a0f85f3b80b97e3a3650d88b751583b2b8a1 Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/Divers.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600XV1.1_otherside.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600XV1.1_otherside.png new file mode 100644 index 0000000000000000000000000000000000000000..b39c9112296fa245473b4c0fa7cadb8655075fc2 Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600XV1.1_otherside.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600XV1.1_positive.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600XV1.1_positive.png new file mode 100644 index 0000000000000000000000000000000000000000..cc6f696da8d6e99f2ee7c1e201bb6c07c6bb33d1 Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600XV1.1_positive.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600XV1.2_otherside.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600XV1.2_otherside.png new file mode 100644 index 0000000000000000000000000000000000000000..ab77bcd2d0e5ffd8e5c3d2c571c45516724e292a Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600XV1.2_otherside.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600XV1.2_positive.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600XV1.2_positive.png new file mode 100644 index 0000000000000000000000000000000000000000..935d7bad97fa21f016282c52c5330922d6111c2d Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600XV1.2_positive.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600X_AHT10.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600X_AHT10.png new file mode 100755 index 0000000000000000000000000000000000000000..3c09b18e2fc17c506d1d65738bbcf904927f3e69 Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600X_AHT10.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600X_GL5528.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600X_GL5528.png new file mode 100755 index 0000000000000000000000000000000000000000..cc3b5e28d5e42d89b7e6e6f122a27109996d7335 Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600X_GL5528.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600X_KEY.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600X_KEY.png new file mode 100755 index 0000000000000000000000000000000000000000..d65705a95c747e628522fd64ad3fb0eaafd3b434 Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600X_KEY.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600X_L76K.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600X_L76K.png new file mode 100755 index 0000000000000000000000000000000000000000..ca872e4026308318f21bc6c46eca0e460c514abb Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600X_L76K.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600X_LCD.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600X_LCD.png new file mode 100755 index 0000000000000000000000000000000000000000..104481c45caaa9a460631ec24a4b3f0e85e341b2 Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600X_LCD.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600X_LIS2DH12TR.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600X_LIS2DH12TR.png new file mode 100755 index 0000000000000000000000000000000000000000..8362ac794db7759b2ca9d16b993bde29b5f370c3 Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600X_LIS2DH12TR.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600X_PA.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600X_PA.png new file mode 100755 index 0000000000000000000000000000000000000000..c24cc25ebdcfe06a86bcdc6e2870f1f38206db8d Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600X_PA.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600X_name_rules.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600X_name_rules.png new file mode 100644 index 0000000000000000000000000000000000000000..76930a4ff60636877f134d7ae2a2d16250312a23 Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600X_name_rules.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/QPYcom_position.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/QPYcom_position.png new file mode 100755 index 0000000000000000000000000000000000000000..cd8bec444ce80ccb4c1112af96c47ca16c939d77 Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/QPYcom_position.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/Running_results.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/Running_results.png new file mode 100755 index 0000000000000000000000000000000000000000..7ca1e2e119ad41f990156d9dc6bdee14cf6ae930 Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/Running_results.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/V1.1_silk_print01.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/V1.1_silk_print01.png new file mode 100755 index 0000000000000000000000000000000000000000..aa177c5f1bccdd3295a95dcf690490b64d60c7a4 Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/V1.1_silk_print01.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/V1.1_silk_print02.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/V1.1_silk_print02.png new file mode 100755 index 0000000000000000000000000000000000000000..c2816cf95750aef29636e1640e7870e4dde67dcb Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/V1.1_silk_print02.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/V1.2_silk_print01.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/V1.2_silk_print01.png new file mode 100644 index 0000000000000000000000000000000000000000..34b518961f2ada38a6e8891975d524f9016b3ae4 Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/V1.2_silk_print01.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/V1.2_silk_print02.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/V1.2_silk_print02.png new file mode 100644 index 0000000000000000000000000000000000000000..0feae7fd3437641324286c39ac8a4d7106167263 Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/V1.2_silk_print02.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/V1.3_front.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/V1.3_front.png new file mode 100644 index 0000000000000000000000000000000000000000..4e7b2ab83966511051716b365f856ae6a3b81748 Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/V1.3_front.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/V1.3_print_1.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/V1.3_print_1.png new file mode 100644 index 0000000000000000000000000000000000000000..d6857d87c1d55f1a66a7f6ea3a885849e93ca204 Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/V1.3_print_1.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/V1.3_print_2.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/V1.3_print_2.png new file mode 100644 index 0000000000000000000000000000000000000000..23e815c3277287c4b3087df6d53eeefef52aa524 Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/V1.3_print_2.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/V1.3_rear.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/V1.3_rear.png new file mode 100644 index 0000000000000000000000000000000000000000..2a0c5e05d694103231ead012bf02f757f8215877 Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/V1.3_rear.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/choose_download.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/choose_download.png new file mode 100755 index 0000000000000000000000000000000000000000..e20fefec63dcfbf7f59bd67057789644d578fe0d Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/choose_download.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/download_finish.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/download_finish.png new file mode 100755 index 0000000000000000000000000000000000000000..ab3cb1fe7cfdec6c3f0b09cacbadd0affed098cf Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/download_finish.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/downloading.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/downloading.png new file mode 100755 index 0000000000000000000000000000000000000000..00af387139bdba65b950744c92dc2a0273af392c Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/downloading.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/file_check.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/file_check.png new file mode 100755 index 0000000000000000000000000000000000000000..e6d3b17df97a044ede82968d9e097c2abf0633c8 Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/file_check.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/file_check_1.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/file_check_1.png new file mode 100644 index 0000000000000000000000000000000000000000..73b99433166e8d1566cc72e8bca5c074c358f652 Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/file_check_1.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/file_position.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/file_position.png new file mode 100755 index 0000000000000000000000000000000000000000..958aaa77b19d5e4f5e9b7a004ef4e237aad1237a Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/file_position.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/file_running.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/file_running.png new file mode 100755 index 0000000000000000000000000000000000000000..69061da40db2b6bac5ab6bcb32198d9a217c929d Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/file_running.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/file_upload.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/file_upload.png new file mode 100755 index 0000000000000000000000000000000000000000..b6ace6806c9b292705ee6c8bd3796432c53e758c Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/file_upload.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/file_upload_1.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/file_upload_1.png new file mode 100644 index 0000000000000000000000000000000000000000..1b281bcc8b528ee2b12d339c0c2b2e710e13a29c Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/file_upload_1.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/finish.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/finish.png new file mode 100755 index 0000000000000000000000000000000000000000..5791c3ca8ec39a88b90bd39322cd73d96a09408a Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/finish.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/firmware_check01.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/firmware_check01.png new file mode 100755 index 0000000000000000000000000000000000000000..d5ba15e0c4218e0f51c253539e5682762d938e29 Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/firmware_check01.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/firmware_check02.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/firmware_check02.png new file mode 100755 index 0000000000000000000000000000000000000000..3bbd1d074ad2f6962e5f566a56075a2a7e3b5ed0 Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/firmware_check02.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/image-20210407143154984.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/image-20210407143154984.png new file mode 100644 index 0000000000000000000000000000000000000000..ae3d1ab20339489871623fa38631d5efd5af0a2b Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/image-20210407143154984.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/image-20210417151615729.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/image-20210417151615729.png new file mode 100644 index 0000000000000000000000000000000000000000..dd94d41a3218a9d4053bb5408c54e272998bca1e Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/image-20210417151615729.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/install.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/install.png new file mode 100755 index 0000000000000000000000000000000000000000..e308bd4fd972a04e1964339592bfd99568d957c3 Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/install.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/setup.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/setup.png new file mode 100755 index 0000000000000000000000000000000000000000..7ee8e851c58192f83dcf2d69e8807d37c863d63a Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/setup.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/start.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/start.png new file mode 100755 index 0000000000000000000000000000000000000000..51766ffc669601b96eceb9fe88653986ed23ddb0 Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/start.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Product_intro/Applicable_Scenarios.md b/docs/Quecpython_intro/zh/Qp_Product_intro/Applicable_Scenarios.md index ca0ace6a333a1f352fed564268676eea6446919e..03c55cb29db203301a311ca1461ec682af5eb7fc 100644 --- a/docs/Quecpython_intro/zh/Qp_Product_intro/Applicable_Scenarios.md +++ b/docs/Quecpython_intro/zh/Qp_Product_intro/Applicable_Scenarios.md @@ -1,11 +1,15 @@ ## QuecPython的适用场景 +**修订记录** + +| **版本** | **日期** | **作者** | **变更表述** | +| -------- | ---------- | -------- | ---------------------------------- | +| 1.0 | 2021-09-31 | 袁帅 | 初始版本修订 | ### 技术特性 - **高效性** :Python 开发高效便捷 , 轻松入门,快速上手 , 无需编译,随写随测 。 - **API接口丰富** : 移远通信 提供的 API 接口涵盖了常用的单片机及移动联网模块开发库,最大程度地保证接口的稳定,功能丰富。 - - **兼容MicroPython**:QuecPython 接口与 MicroPython 无论在目录结构还是接口应用上均保持一致,便于与官方保持一致进行更新迭代。 - **数据安全** :无论是在源码方面还是数据传输方面都做了对应的加密处理,最大限度地保证用户使用的安全性及私密性。 - **开发语言** :开发语言难度低、上手快、普及性强,简单易学且稳定可靠。 @@ -13,9 +17,9 @@ - **丰富的技术支持** :移远通信提供了手把手的入门文档、教学文档、教学视频、官方的技术支持群,用户可以从 0 入手 学习 QuecPython 的使用,同时丰富的技术支撑全程为用户开发提供服务。 详 细资料请访问 QuecPython 官网 或 加入 移远通信 官方 QQ 技术开发交流群,详见 第 ***2.3*** 章 。 -## 适用场景 +### 适用场景 -QuecPython 使用 Python 语言来控制单片机 或者移动通信模块 , 因此单片机能做什么基本能反映出它能做什么。 QuecPython 的适用场景有: +QuecPython 使用 Python 语言来控制单片机或者移动通信模块 ,因此单片机能做什么基本能反映出它能做什么。 QuecPython 的适用场景有: - 智能仪器 - 工业控制 @@ -29,5 +33,5 @@ QuecPython 使用 Python 语言来控制单片机 或者移动通信模块 , ........ -目前移远通信已经可以 为 Traker、智能学生卡 、云喇叭 、支付盒子 、工业 DTU 提供包含源码的 解决方案 。 +目前移远通信已经可以 为 Traker、智能学生卡 、云喇叭 、支付盒子 、工业 DTU 、对讲机等提供包含源码的 解决方案 。 diff --git a/docs/Quecpython_intro/zh/Qp_Product_intro/Arch_features.md b/docs/Quecpython_intro/zh/Qp_Product_intro/Arch_features.md index 2f893728ae990729d01563a07b995adcc9542c78..6302d966c343b8e7a27366e5ad646a4bb392c3d5 100644 --- a/docs/Quecpython_intro/zh/Qp_Product_intro/Arch_features.md +++ b/docs/Quecpython_intro/zh/Qp_Product_intro/Arch_features.md @@ -1,4 +1,9 @@ ## 探秘QuecPython技术架构 +**修订记录** + +| **版本** | **日期** | **作者** | **变更表述** | +| -------- | ---------- | -------- | ---------------------------------- | +| 1.0 | 2021-09-31 | 袁帅 | 初始版本修订 | ### 系统架构介绍 @@ -12,11 +17,13 @@ - **QuecPython完整结构层**:QuecPython Adapter Layer平台适配层、QuecPython VM虚拟机层,QuecPython编译器层和QuecPython Modules用户接口层。 -用户仅需关注QuecPython Modules用户接口层,该层提供了大量的API接口,包括I2C/SPI/GPIO/AUDIO/PWM/POWER/ADC/FOTA/Datacall/Aliyun等模块。 +用户仅需关注QuecPython Modules用户接口层, + +该层提供了大量的API接口,包括I2C/SPI/GPIO/AUDIO/PWM/POWER/ADC/FOTA/Datacall/Aliyun等模块。 ### 目录结构 -![](media/Quectel_Qp_Intro_dir_tpc.png.png) +![](media/Quectel_Qp_Intro_dir_tpc.png) 目录说明: @@ -30,7 +37,7 @@ - **Micropython----\>tools----\>quectel**:该目录下主要包含QuecPython相关使用工具。 -#### 附录 +### 附录 表1:术语缩写 diff --git a/docs/Quecpython_intro/zh/Qp_Product_intro/Data_Acquisition.md b/docs/Quecpython_intro/zh/Qp_Product_intro/Data_Acquisition.md index c0324fd3ebb0caa6d961906f7afed7914fa9f5f6..b268158b62f708a40c6f7b571f47f20145038c23 100644 --- a/docs/Quecpython_intro/zh/Qp_Product_intro/Data_Acquisition.md +++ b/docs/Quecpython_intro/zh/Qp_Product_intro/Data_Acquisition.md @@ -1,6 +1,30 @@ +## **修订记录** -**获取QuecPython 开发固件及加入官方交流群** +| **版本** | **日期** | **作者** | **变更表述** | +| -------- | ---------- | -------- | ---------------------------------- | +| 1.0 | 2021-09-31 | 袁帅 | 初始版本修订 | -> QuecPython官方网站:*http://python.quectel.com/*。 +## **获取QuecPython 开发固件及加入官方交流群** + +> 官网主页:https://python.quectel.com +> +> 官网文件下载(各类资料、工具):https://python.quectel.com/download +> +> 官网wiki(常用于视频教程、手把手教程下载、API库):https://python.quectel.com/wiki/#/ +> +> 官网文档中心(拥有从入门到精通的各种文档介绍、必看):https://python.quectel.com/doc/ +> +> 工单系统:https://workorder.quectel.com/ +> +> QuecPython社区:https://forumschinese.quectel.com/c/function-subjects/quectpython/43 > -> QuecPython官方QQ开发交流群:445121768。 +> QuecPython官方QQ开发交流群:445121768 +> +> 微信公众号:QuecPython +> +> 移远OTA升级平台: https://cloudota.quectel.com/ +> +> 移远IoT管理平台:https://python.quectel.com/doc/doc/Advanced_development/zh/QuecPythonCloud/QuecCloud.html + + + diff --git a/docs/Quecpython_intro/zh/Qp_Product_intro/Hardware_Support.md b/docs/Quecpython_intro/zh/Qp_Product_intro/Hardware_Support.md index 19b610b301662e2cc7e474a71cce5998697b0837..23b94f0836d90ba7280424b72ec1c8aad94b7bae 100644 --- a/docs/Quecpython_intro/zh/Qp_Product_intro/Hardware_Support.md +++ b/docs/Quecpython_intro/zh/Qp_Product_intro/Hardware_Support.md @@ -1,4 +1,86 @@ + +## 文档历史 + +**修订记录** + +| **版本** | **日期** | **作者** | **变更表述** | +| -------- | ---------- | -------- | ---------------- | +| 1.0 | 2021-04-07 | Chic | 初始版本 | +| 1.1 | 2021-07-08 | Chic | 增加EC200U | +| 1.2 | 2021-08-10 | Chic | 表格增加网络制式 | +| 1.3 | 2021-09-8 | Chic | 更改图片 | + + + ## 硬件支持 -待补充 \ No newline at end of file +目前重点支持: + +EC200U_CNLB,EUAB + +EC600U-CNLB,CNLC + +EC600N-CNLA,CNLC + +EC600S-CNLA,CNLB + + + +EC200U:U代表展锐8910平台 + +EC600U:U代表展锐8910平台 + +EC600N:N代表ASR1603平台 + +EC600S:S代表ASR1601平台 + + + +EC100Y:Y代表ASR3601平台 + +内核是ASR3601,系统为ThreadX硬实时嵌入式源代码操作系统。 + + ![Qp_Product_intro_Hardware_Support_01](media\Qp_Product_intro_Hardware_Support_01.png) + + + +## 详细信息 + +| **Part number** | 网络制式 | 频段 | CPU | Flash size (Kbytes) | **RAM size** (Kbytes) | GPIO | UART | SPI | IIC | ADC | Timer | Volte | LCD | Camera | POC | SD | WIFI | BT | FOTA | Supply voltage (V) | Maximum operating temperature range (°C) | +| :-------------- | -------------------------------------------------------- | ------------------------------------------------------------ | ------ | ------------------------- | --------------------- | ---- | ---- | ---- | ---- | ---- | ----- | ----- | ---- | ------ | ---- | ---- | ---- | ---- | ---- | ------------------ | ---------------------------------------- | +| EC200U_CNLB | 全网通,移动4G,联通4G,电信4G | LTE-FDD: B1/B3/B5/B8
LTE-TDD: B34/B38/B39/B40/B41
| 624MHz | total:8M free:≈0.3M | free:≈450K | 16 | 3 | 1 | 1 | 3 | 4 | * | Y | Y | Y | * | * | Y | Y | 3.4 to 4.3 | -40 to +105 | +| EC200U_EUAB | 全网通,移动4G,联通4G,电信4G,移动2G,联通2G,电信2G, | LTE-FDD: B1/B3/B5/B8
LTE-TDD: B34/B38/B39/B40/B41
GSM: 900/1800 MHz | 624MHz | total:8M free:≈0.3M | free:≈450K | 16 | 3 | 1 | 1 | 3 | 4 | * | Y | Y | Y | * | * | Y | Y | 3.4 to 4.3 | -40 to +105 | +| EC600U_CNLB | 全网通,移动4G,联通4G,电信4G | FDD B1/B3/B5/B8
TDD B34/B38/B39/B40/B41 | 624MHz | total:8M free:≈0.3M | free:≈450K | 16 | 3 | 1 | 1 | 4 | 4 | * | Y | Y | Y | * | * | Y | Y | 3.4 to 4.3 | -40 to +105 | +| EC600U_EUAB | 全网通,移动4G,联通4G,电信4G | FDD B1/B3/B5/B7/B8/B20/B28
TDD B38/B40/B41
GSM B2/B3/B5/B8 | 624MHz | total:8M free:≈0.3M | free:≈450K | 16 | 3 | 1 | 1 | 4 | 4 | * | Y | Y | Y | * | * | Y | Y | 3.4 to 4.3 | -40 to +105 | +| EC600N_CNLC | 全网通,移动4G,联通4G,电信4G | FDD B1/B3/B5/B8
TDD B34/B38/B39/B40/B41 | 624MHz | total:16M free:≈1M | free:≈450K | 29 | 3 | 1 | 1 | 1 | 4 | Y | Y | N | * | * | * | N | Y | 3.4 to 4.3 | -40 to +105 | +| EC600N_CNLA | 全网通,移动4G,联通4G,电信4G | FDD B1/B3/B5/B8
TDD B34/B38/B39/B40/B41 | 624MHz | total:8M free:≈0.3M | free:≈450K | 29 | 3 | 1 | 1 | 1 | 4 | N | Y | N | N | N | * | N | Y | 3.4 to 4.3 | -40 to +105 | +| EC600S_CNLA | 全网通,移动4G,联通4G,电信4G | FDD B1/B3/B5/B8
TDD B34/B38/B39/B40/B41 | 624MHz | total:16M free:≈1M | free:≈450K | 29 | 3 | 1 | 1 | 2 | 4 | N | Y | N | N | N | * | N | Y | 3.4 to 4.3 | -40 to +105 | +| EC600S_CNLB | 全网通,移动4G,联通4G,电信4G | FDD B1/B3/B5/B8
TDD B34/B38/B39/B40/B41 | 624MHz | total:8M free:≈0.3M | free:≈350K | 29 | 3 | 1 | 1 | 2 | 4 | N | Y | Y | N | N | * | N | Y | 3.4 to 4.3 | -40 to +105 | + +标*号表示:正在开发中 + +标Y号表示:支持 + +标N号表示:不支持 + + + +直接支持的外部传感器: + +| Part number | 光照 | 三轴 | 温湿度 | 功放 | +| ----------- | ----------------------- | ------------------ | -------------- | ---------- | +| EC200U_EUAB | GL5528、GL5516、OPT3001 | LIS2DH12TR、BMA250 | AHT10、HDC2080 | AW8733ATQR | +| EC200U_CNLB | GL5528、GL5516、OPT3001 | LIS2DH12TR、BMA250 | AHT10、HDC2080 | AW8733ATQR | +| EC600U_CNLB | GL5528、GL5516、OPT3001 | LIS2DH12TR、BMA250 | AHT10、HDC2080 | AW8733ATQR | +| EC600U_EUAB | GL5528、GL5516、OPT3001 | LIS2DH12TR、BMA250 | AHT10、HDC2080 | AW8733ATQR | +| EC600N_CNLA | GL5528、GL5516、OPT3001 | LIS2DH12TR、BMA250 | AHT10、HDC2080 | AW8733ATQR | +| EC600N_CNLC | GL5528、GL5516、OPT3001 | LIS2DH12TR、BMA250 | AHT10、HDC2080 | AW8733ATQR | +| EC600S_CNLA | GL5528、GL5516、OPT3001 | LIS2DH12TR、BMA250 | AHT10、HDC2080 | AW8733ATQR | +| EC600S_CNLB | GL5528、GL5516、OPT3001 | LIS2DH12TR、BMA250 | AHT10、HDC2080 | AW8733ATQR | + + + +## 模组封装尺寸 + +image-20210908113407540 \ No newline at end of file diff --git a/docs/Quecpython_intro/zh/Qp_Product_intro/media/Qp_Product_intro_Hardware_Support_01.png b/docs/Quecpython_intro/zh/Qp_Product_intro/media/Qp_Product_intro_Hardware_Support_01.png new file mode 100644 index 0000000000000000000000000000000000000000..da0257df936117f2de15536d26bc81ac6fafc706 Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Product_intro/media/Qp_Product_intro_Hardware_Support_01.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Product_intro/media/Qp_Product_intro_Hardware_Support_02.png b/docs/Quecpython_intro/zh/Qp_Product_intro/media/Qp_Product_intro_Hardware_Support_02.png new file mode 100644 index 0000000000000000000000000000000000000000..4233e9750b4883a26fa3bacab9528f0c53780e81 Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Product_intro/media/Qp_Product_intro_Hardware_Support_02.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Product_intro/media/Qp_Product_intro_Hardware_Support_03.png b/docs/Quecpython_intro/zh/Qp_Product_intro/media/Qp_Product_intro_Hardware_Support_03.png new file mode 100644 index 0000000000000000000000000000000000000000..8228fc06b3e6e0ad7ade433ef52ff9a5d47a23ad Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Product_intro/media/Qp_Product_intro_Hardware_Support_03.png differ diff --git a/docs/Quecpython_intro/zh/README.md b/docs/Quecpython_intro/zh/README.md index 8a43dbc7fc00cce18a03a472c51a02ec472f3055..1c9b0fdf5c919f92e4e7a72fdfd435cbf92d0ca5 100644 --- a/docs/Quecpython_intro/zh/README.md +++ b/docs/Quecpython_intro/zh/README.md @@ -1,11 +1,14 @@ ## QuecPython概述 +**修订记录** + +| **版本** | **日期** | **作者** | **变更表述** | +| -------- | ---------- | -------- | ---------------------------------- | +| 1.0 | 2021-09-31 | 袁帅 | 初始版本修订&适用模块调整 | + 本文档主要讲解QuecPython的技术特性。 -本文档适用以下移远通信LTE Standard模块: -- EC100Y-CN -- EC600S-CN ## QuecPython的由来 Python 是一种跨平台的计算机程序设计语言 , 是一个结合了解释性、编译性、互动性和面向对象的 高 层次 脚本语言。 Python 最初被设计用于编写自动化脚本 (shell) ,随着版本的不断更新和语言新功能的添加,越 来越 多 地 被 应 用于独立大型项目的开发。Python 的设计哲学是优雅、明确、简单 。Python 开发者的哲学是“用一种方法,最好是只有一种方法来做一件事”, 因此 他们通常难以忍受 Perl 语言中“总是有多种方法来做同一件事”的理念。在设计 Python 语言时,如果面临多种选择, Python 开发者一般会拒绝花俏的语法,而选择明确的没有或者很少有歧义的语法。 这些准则也被称为 Python 格言。 由于这种设计观念的差异, Python 源代码通常被认为比 Perl 具备 更好的可读性,并且能够支撑大规模的软件开发。Python 是完全面向对象的语言 ,并且完全支持继承、重载、派生、多继承,有益于增强源代码的复用 性。 函数、模块、数字、字符串都是对象。Python 本身被设计为可扩充的。 由于 并非所有的特性和功能都集成到语言核心 ,Python 提供了丰富API 和工具,以便程序员能够轻松地使用 C 语言、 C++、Cython 来编写扩充模块。 Python 编译器本身也可 以被集成到其它需要脚本语言的程序内 ,因此 Python 也被 作为一种“胶水语言”( glue language)用于将 其他语言编写的程序进行集成和封装。 diff --git a/docs/Quecpython_intro/zh/config.json b/docs/Quecpython_intro/zh/config.json index 10c2a1cc1964035be8ce534c1a708e32e4094fcc..02bdc1004a34362942ec6e65121230bcd6330f8a 100644 --- a/docs/Quecpython_intro/zh/config.json +++ b/docs/Quecpython_intro/zh/config.json @@ -1,92 +1,21 @@ { - "class": "language_zh", + "import": "config_zh", "navbar": { - "title": "QuecPython", - "logo": { - "alt": "teedoc logo", - "src": "/static/image/quectel.png" - }, - "home_url": "/", "items": [ { - "url": "https://python.quectel.com/wiki/#/", - "label": "wiki", - "position": "left" - }, - { - "label": "    文档    ", - "position": "left", - "items": [ - { - "url": "/doc/Quecpython_intro/zh/index.html", - "label": "产品介绍" - }, - { - "url": "/doc/Quick_start/zh/index.html", - "label": "快速开始" - }, - { - "url": "/doc/sbs/zh/index.html", - "label": "手把手教程" - }, - { - "url": "/doc/Advanced_development/zh/index.html", - "label": "开发进阶" - }, - { - "url": "/doc/little_demo/zh/index.html", - "label": "小实验" - }, - { - "url": "/doc/Product_case/zh/index.html", - "label": "产品案例" - }, - { - "url": "/doc/Mass_production/zh/index.html", - "label": "产品量产" - }, - { - "url": "/doc/FAQ/zh/index.html", - "label": "常见问题" - } - ] - }, - { - "label": "GitHub", + "id": "language", + "label": "Language: ", "position": "right", - "url": "https://github.com/quecpython/Community-document" - } - ] - }, - "footer": { - "top": [ - { - "label": "链接", - "items": [ - { - "label": "使用 teedoc 构建", - "url": "https://github.com/neutree/teedoc", - "target": "_blank" - }, - { - "label": "Copyright © 2021 Neucrack", - "url": "https://neucrack.com", - "target": "_blank" - } - ] - }, - { - "label": "源码", "items": [ { - "label": "github", - "url": "https://github.com/neutree/teedoc", - "target": "_blank" + "id": "zh", + "url": "/doc/Quecpython_intro/zh/", + "label": "中文" }, { - "label": "本网站源文件", - "url": "https://github.com/quecpython/Community-document", - "target": "_blank" + "id": "en", + "url": "/doc/Quecpython_intro/en/", + "label": "English" } ] } diff --git a/docs/Quecpython_intro/zh/sidebar.yaml b/docs/Quecpython_intro/zh/sidebar.yaml index 54f95baf71219ba2eb4274124fed0e36bce8ef80..27da0f1bd980dc015a964d69fc57b363c4fae4b5 100644 --- a/docs/Quecpython_intro/zh/sidebar.yaml +++ b/docs/Quecpython_intro/zh/sidebar.yaml @@ -4,9 +4,13 @@ items: file: README.md - label: 架构特性 file: Qp_Product_intro/Arch_features.md - - label: 硬件支持 - file: Qp_Product_intro/Hardware_Support.md + - label: 硬件资料 + items: + - label: 硬件支持 + file: Qp_Product_intro/Hardware_Support.md + - label: EC600X开发板 + file: Qp_Hw_EC600X/Hardware_Support_EC600X.md - label: 资料获取 file: Qp_Product_intro/Data_Acquisition.md - label: 适用场景 - file: Qp_Product_intro/Applicable_Scenarios.md \ No newline at end of file + file: Qp_Product_intro/Applicable_Scenarios.md diff --git a/docs/Quick_start/en/QuecPythonHelloWord/README.md b/docs/Quick_start/en/QuecPythonHelloWord/README.md new file mode 100644 index 0000000000000000000000000000000000000000..9c6fd674566ecbb46aba5e33cb43bf589f7269d0 --- /dev/null +++ b/docs/Quick_start/en/QuecPythonHelloWord/README.md @@ -0,0 +1,104 @@ +# Quick start to quecpthon + +This document mainly describes the quick start of quecpthon, which mainly includes three aspects: printing Hello world; Turn on the LED lamp; HTTP get web page source code. + +Applicable modules: + +- EC100Y-CN +- EC600S-CN + +## Hello World Print + +1. When the development board is connected to the computer, the driver and burning module firmware need to be installed. Refer to quectel quecpthon for specific operation methods_ Qpycom tool instructions + +2. Hello World Print + + +(1) Interactive window printing + +As shown in the figure below, use qpycom tool, connect "USB serial device" through port, select "interactive" interface, and perform the following interactive printing. + +```python +>>> print('hello world') +hello world +>>> print("hello world") +hello world +``` + +(2) Write * test_ HelloWorld. Py * file printing + +Create * test_ HelloWorld. Py * file, and the script is as follows: + +```python +import utime #Import timing module +print_num = 5 #Define printing times +while print_num: + print("hello world") + print_num -= 1 #Self subtraction + utime.sleep(2) #Delay 2 seconds +``` + +The operation results are as follows: + +![helloworld_print](media/helloworld_print.png) + + +## Turn on the LED and HTTP to get the web page source code + +This chapter combines the LED light and HTTP to obtain the web page source code. The purpose is to light the LED light while obtaining the web page source code after networking; If not available, the light goes out. + +### Hardware connection + +1. Prepare one LED lamp and two DuPont wires + +2. Connect the section of LED lamp (flat section) to GND through DuPont line (specific optional) + +3. Connect the other end of the LED lamp to a GPIO port through DuPont line (take ec600s-cn as an example, connect pin16 of the module, corresponding to g81 of the development board). + +The physical connection is shown below. + +![LED_connect](media/LED_connect.jpg) + + + +### Software code + +```python +import utime #Import utime module +import request #Import request module +from machine import Pin #Import pin module +import log #Import log module +g7 = Pin(Pin.GPIO7, Pin.OUT, Pin.PULL_DISABLE, 0) #Gpio7 is configured as output mode, and the default output is 0 +log.basicConfig(level=log.INFO) #The log level is info +QuecPython = log.getLogger("QuecPython") #Specify the log object name +account = 30 +while account: + try: + address = "www.baidu.com" + response = request.get(address) #Send get request + QuecPython.info("response_content: {}".format(response.content)) + #Log print "generator object of response content" (see related API introduction for details on how to print) + g7.write(1) #Write 1 (output high level) + QuecPython.info("GPIO7_state: {}".format(g7.read())) #Log print gpio7 level + except: + g7.write(0) #Write 0 (output low level) + QuecPython.info("GPIO7_state: {}".format(g7.read())) #Log print gpio7 level + account -= 1 #Self subtraction + utime.sleep(2) #Delay 2S +``` + +### Operation effect + +1. Open qpycom and run * LED_ Net. Py *, as shown in the figure below. + +![Click_Run](media/Click_Run.jpg) + +2. During operation, when you see that the request is successfully obtained, unplug the SIM card (simulate the state that network injection cannot be performed), and some logs are as follows: + +![Operation_effect](media/Operation_effect.jpg) + +explain: + +(1) After pulling out the SIM card, it is normal to obtain that the GPIO status is 1 several times, because there will be a certain cache for request acquisition; + +(2) For the "113" and so on in operation, it is the error code of HTTP. For details, please refer to the error code table of HTTP (you can baidu by yourself). diff --git a/docs/Quick_start/zh/QuecPythonHelloWord/media/Click_Run.jpg b/docs/Quick_start/en/QuecPythonHelloWord/media/Click_Run.jpg old mode 100755 new mode 100644 similarity index 100% rename from docs/Quick_start/zh/QuecPythonHelloWord/media/Click_Run.jpg rename to docs/Quick_start/en/QuecPythonHelloWord/media/Click_Run.jpg diff --git a/docs/Quick_start/zh/QuecPythonHelloWord/media/LED_connect.jpg b/docs/Quick_start/en/QuecPythonHelloWord/media/LED_connect.jpg old mode 100755 new mode 100644 similarity index 100% rename from docs/Quick_start/zh/QuecPythonHelloWord/media/LED_connect.jpg rename to docs/Quick_start/en/QuecPythonHelloWord/media/LED_connect.jpg diff --git a/docs/Quick_start/zh/QuecPythonHelloWord/media/Operation_effect.jpg b/docs/Quick_start/en/QuecPythonHelloWord/media/Operation_effect.jpg old mode 100755 new mode 100644 similarity index 100% rename from docs/Quick_start/zh/QuecPythonHelloWord/media/Operation_effect.jpg rename to docs/Quick_start/en/QuecPythonHelloWord/media/Operation_effect.jpg diff --git a/docs/Quick_start/zh/QuecPythonHelloWord/media/helloworld_print.png b/docs/Quick_start/en/QuecPythonHelloWord/media/helloworld_print.png old mode 100755 new mode 100644 similarity index 100% rename from docs/Quick_start/zh/QuecPythonHelloWord/media/helloworld_print.png rename to docs/Quick_start/en/QuecPythonHelloWord/media/helloworld_print.png diff --git a/docs/Quick_start/en/Quick_start.md b/docs/Quick_start/en/Quick_start.md new file mode 100644 index 0000000000000000000000000000000000000000..e702764b9fdca0b8bf4201eac0ae73c58bdd13ce --- /dev/null +++ b/docs/Quick_start/en/Quick_start.md @@ -0,0 +1,64 @@ +## Revision history + +|Version | date | author | change statement| +| ---- | --------- | ----- | -------------------------- | +|1.0 | 2021-4-17 | first written by David | to guide customers' rapid development| + +## Foreword + +This article may be boring, but after reading it carefully, I believe you can play quecpthon development board smoothly + +## Common web sites for quecpthon development + +**Homepage address of official website:[ https://python.quectel.com/ ](https://python.quectel.com/)** + +**Official website wiki address:[ https://python.quectel.com/wiki/#/ ](https://python.quectel.com/wiki/#/)**,对于模组支持的API都可以在此查找。 + +**Document Center Address:[ https://python.quectel.com/doc/ ](https://python.quectel.com/doc/)**,主要包括快速入门,常用接口开发,开发进阶,小实验等。 + +**Download address of development resources:[ https://python.quectel.com/download ](https://python.quectel.com/download)**,主要包括开发工具、驱动、固件、硬件参考设计等的下载。 + +## Construction of quecpthon development environment + +For each development board, there are corresponding development board instructions, for example: [ec600x series development board instructions](https://python.quectel.com/doc/doc/Quecpython_intro/zh/Qp_Hw_EC600X/Hardware_Support_EC600X.html),详细的使用说明,这里不做赘述, **不过强烈建议大家看一下[EC600X系列的开发板使用说明](https://python.quectel.com/doc/doc/Quecpython_intro/zh/Qp_Hw_EC600X/Hardware_Support_EC600X.html)文档的第五章节“准备工作”(熟悉驱动安装、固件烧录、脚本下载等基本开发技能),尤其是此章节中的注意事项**。为了防止大家入坑,这里简单做个总结。 + +### How to turn on + +|Development board | startup operation| +| -------------------------- | -------------------------------------------------------- | +| EC600S_ QuecPython_ EVB_ V1.0 | plug in and start up| +| EC600S_ QuecPython_ EVB_ V1.1 | long press the bowky on the side of the development board and release it for two seconds, and the module will start| +| EC600S_ QuecPython_ EVB_ V1.2 | PWK on development board_ If the on jump cap is short circuited, it is not necessary to press PWK for a long time. On the contrary, it is necessary to press PWK for a long time| + +### Precautions for drive installation + +1. ** drive is mainly divided into two categories:** + + **First, platform classification based on module support: ASR platform (ec600scnaa, ec600scnla, ec600scnlb, ec600n, ec100y) and RDA platform (ec600u). More module platform information can be seen: [hardware support]( https://python.quectel.com/doc/doc/Quecpython_ intro/zh/Qp_ Product_ intro/Hardware_ Support. HTML), I believe you also have a question about what platform ec600x is. In fact, "X" in ec600x is an unknown number, which can refer to ec600s, ec600u, etc., and does not represent the actual platform** + + **Second, PC based system classification: Windows 7 system, please download the corresponding driver of Windows 7; For windows 10 system, please download the driver corresponding to windows 10** + +2. ** for ec600scnla and ec600scnlb, the latest version of the driver must be downloaded, and the driver version must be at least v1.0.8** + +### Precautions for firmware burning + +1. ** different modules correspond to different firmware and do not support cross burning. If you burn by mistake, you must correct the burning to the corresponding firmware, otherwise it cannot be used normally. For example, ec600s is divided into ec600scnaa, ec600scnla, ec600scnlb, etc. cross burning is not supported between these modules** +2. ** about the description of the firmware package, since the firmware compressed file downloaded from the official website contains the firmware package and change log, the firmware compressed file downloaded from the official website needs to be decompressed for one layer to obtain the burnable firmware package. Later, it will be evaluated and changed that the suffix of the firmware package is. Bin (in the plan, if the update is completed later, remember to select the compressed file with the suffix of. Bin when burning)** +3. ** before downloading firmware, it is recommended to confirm the firmware version first to avoid degradation or wrong version. After downloading the firmware, the contents of all user areas will be cleared** +4. ** when downloading firmware, there is no need to select serial port, and the tool will automatically select and start downloading** +5. ** Please do not insert two or more development boards at the same time, so that the tools cannot be recognized, resulting in download errors** +6. ** qpycom tool supports burning Python firmware, not C firmware or at standard firmware** +7. ** during firmware downloading, do not exit the tool or unplug the serial port, which may cause the module to become brick. If the module is indeed bricked, see "[quecpthon brick rescue](https://python.quectel.com/doc/doc/FAQ/zh/QP_recovery/QP_recovery.html)”章节** + +## QuecPython code writing data address + +The quecpthon code writing materials are mainly divided into three parts + +1. [demo routine](https://python.quectel.com/download):在左侧超链接中,找到如下的文件,demo里面中的每个例子都可以单独运行。 + + ![image-20210417151635408](media/demo.png) + +2. [wiki_ API library](https://python.quectel.com/wiki/#/):此网站会详细介绍模组支持的API接口,以及API接口的使用说明,如果你开始不熟悉某个API接口的使用方法,可以在此连接找到对应的说明,例如:不熟悉UART的使用,可以点击[UART](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=uart)。 + +3. [document center](https://python.quectel.com/doc/):文档中心的内容比较丰富,主要分为:产品介绍、快速开始、手把手教学、小实验、开发进阶、产品案例、产品量产、常见问题。建议花点时间了解每个部分主要包括哪些,保证会有意想不到的效果。 + diff --git a/docs/Quick_start/en/README.md b/docs/Quick_start/en/README.md new file mode 100644 index 0000000000000000000000000000000000000000..3eb901a5852c476601077899319d978add92264f --- /dev/null +++ b/docs/Quick_start/en/README.md @@ -0,0 +1,324 @@ +## QuecPython development preparation + +### Introduction to the official website + +**Official website address: https://python.quectel.com/ ** + +![](media/1.png) + +**Official website wiki address: https://python.quectel.com/wiki/#/ ** + +![](media/2.png) + +### Development resources download + +Get the download address of development resources: https://python.quectel.com/download + +![](media/SDK.png) + +## First acquaintance with quecpthon development board + +### Platforms currently supported by quecpthon + +**CAT1/CATM/NB** + +![](media/image-20210115135054415.png) + +In this paper, ec600s_ QuecPython_ EVB is introduced as an example. + +### Introduction to development board + +EC600S_ QuecPython_ EVB_ V1.1 is a development board specially designed for the development of ec600s quecpthon. It integrates ec600s-cn module, on-board PCB antenna, audio interface, typec interface, nano SIM card holder, user-defined key, LED lamp, LCD interface, acceleration sensor, temperature and humidity sensor, photosensitive resistance and other common development configurations, which can meet the general development needs of developers. + +### Front of development board hardware interface + +![](media/image-20210115140053879.png) + +------ + +### Back of development board hardware interface + +![](media/image-20210115140225664.png) + +------ + +### Peripheral resource library + +#### LCD interface + +EC600S_ QuecPython_ EVB_ V1.1 development board integrates LCD interface and can light LCD screen through SPI protocol. Its circuit diagram is shown in the figure below. QuecPython has been adapted to color_ lcd_ spi_ gc9305 、color_ lcd_ spi_ hx8347、color_ std_ spi_ 7789 and mono_ lcd_ spi_ ST7567, when purchasing the development board, you can select a 1.4-inch color screen adapter board driven by st7789. + +![](media/image-20210115140354788.png) + +#### Acceleration sensor + +EC600S_ QuecPython_ EVB_ V1.1 development board integrates three-axis acceleration sensor, and the model is lis2dh12tr of ST company. The three-axis acceleration sensor is based on the basic principle of acceleration. It has the characteristics of small volume and light weight. The circuit diagram is shown in the figure below: + +![](media/image-20210115140731212.png) + +#### Photosensitive resistance + +EC600S_ QuecPython_ EVB_ V1.1 development board integrates photoresist, gl5516 of jchl. Photosensitive resistor is a special resistor made of semiconductor materials such as cadmium sulfide or cadmium selenide. Its working principle is based on internal photoelectric effect. The stronger the illumination, the lower the resistance value. With the increase of illumination intensity, the resistance value decreases rapidly, and the bright resistance value can be as small as 1K Ω. Photosensitive resistance is very sensitive to light. When there is no light, it is in high resistance state, and the dark resistance can generally reach 1.5m Ω. The circuit diagram is shown in the figure below: + +![](media/image-20210115140929120.png) + + + +#### ** temperature and humidity sensor** + +EC600S_ QuecPython_ EVB_ V1.1 development board integrates temperature and humidity sensor, and the model is asair aht10. The temperature and humidity sensors mostly use the temperature and humidity integrated probe as the temperature measuring element to collect the temperature and humidity signals, which are converted into current signals or voltage signals that have a linear relationship with temperature and humidity after being processed by circuits such as voltage stabilizing filter, operation amplification, nonlinear correction, V / I conversion, constant current and reverse protection, It can also output 485 or 232 interfaces directly through the main control chip. The circuit diagram is shown in the figure below: + +![](media/image-20210115141023596.png) + + + +#### Speaker power amplifier + +EC600S_ QuecPython_ EVB_ In order to meet the needs of some developers, v1.1 development board integrates audio power amplifier with aw8733atqr of awinc. Aw8733atqr is a class k audio power amplifier with super TDD suppression, super large volume, anti breaking sound, ultra-low EMI and output power of 2.0W. + +![](media/image-20210115141119300.png) + +#### Custom keys + +EC600S_ QuecPython_ EVB_ The v1.1 development board integrates two user-defined keys, and developers can develop and define functions by themselves. + +![](media/image-20210115141203426.png) + + + +## Construction of quecpthon development environment + +### In kind + +I don't know how to start when I get the board. It's right to see this article. + +![](media/C01.png) + +The long-awaited board is finally in hand. Plug the USB port on the side of the development board for power supply, and connect the computer USB port on the other end. + +The powerful development board supports switching on and off like a mobile phone, so we start it first after power supply. + +Press and hold the bowky on the side for two seconds to release it, and the module will start automatically. + +![](media/C02.png) + +Start playing quecpthon. + + + +### Driver download and installation + +The full name of the device driver is "device driver". It is a special program that can make the computer communicate with the device. It can be said that it is equivalent to the hardware interface. The operating system can only control the work of the hardware device through this interface. If the driver of a device is not installed correctly, it will not work normally. + + + +In order to enable the ec600s development board to communicate with the computer normally, we go to the official website to download an ec600s driver and install it on the computer. + +Download link: https://python.quectel.com/download + +Open the link, select the driver matching your computer, [click download] + +![](media/C03.png) + +Open [my computer] - [management] - [device manager] + +Before installing the drive: + +![](media/C04.png) + +After installing the drive: + +![](media/C05.png) + +After downloading, open the compressed package, double-click and run "setup.exe" until the installation is completed. After the installation, you can see that the exclamation mark of the port in [device manager] disappears, indicating that the installation is successful and normal communication can be achieved. + +![](media/C06.png) + +![](media/C07.png) + +![](media/C08.png) + + + +### Using qpycom.exe + +The official provides a Windows interface tool to develop the code of debugging module for users. + +Download link: https://python.quectel.com/download + +Find the qpycom graphical tool + +![](media/C09.png) + +The green version of qpycom software does not need to be installed. After downloading and decompressing it directly, open qpycom.exe application for use. + +![](media/C10.png) + +![](media/C11.png) + +The following describes the main contents of qpycom tool, including but not limited to: interactive interface, file operation and download function. + +Interactive interface: it is used to communicate between the computer and the device, issue commands to make the device work according to the user's ideas, and the device can return information to the computer. The user can see the internal operation of the device in the interactive interface. + +![](media/C12.png) + +File operation: it is used to transfer files to the device on the computer. The code files written by the user are sent to the device on this interface, so that the device can run the user code. + +![](media/C13.png) + +Download function: it is used for the user to burn firmware. The user's. Py file is executed on the firmware. To enable the device to execute quecpthon code, burn py firmware first. + +![](media/C14.png) + +### Working principle + +Here's how the whole process is executed. + +![](media/C15.png) + +![](media/C16.png) + +The module has a built-in quecpthon syntax interpreter, which interprets the quecpthon statement and returns the execution result. + +Example explanation: + +print(‘Hello world! QuecPython’) + +Print () is a function, which is usually used to make the device output some information internally, and the user can understand the device status on the computer side. + +Print () can print strings, variables, and so on. + +In quecpthon, strings are represented by a pair of single quotes. Such as' hello world! QuecPython’。 + + + +### Actual operation + +![](media/C17.png) + +After opening qpycom software, we can see that three ports in "select serial port" are module related, including: + +"Quectel USB at port" is used to send at commands, + +"Quectel USB diag prot" is used to view the debugging information of the module, + +These two users can hardly use it. We focus on "** \ * USB serial device \ ***". We can debug the code only with this port. + + + +Click the drop-down box, select "** \ * USB serial device \ ***", and click "open serial port" + +In the interactive interface, enter print ('Hello world! Quercpthon '), and press enter. + +Interface information seen + +```python +>>> print('Hello World! QuecPython') + +Hello World! QuecPython + +>>> +``` + +![](media/C18.png) + +See the returned value of the module and successfully output Hello world! QuecPython + +### Other API interfaces + +For other functions, you can visit the official website: https://python.quectel.com/wiki/#/zh -cn/api/?id=pin + +Relevant tools, routines, drivers and documents can be downloaded from the official website: https://python.quectel.com/download + + + +For more information, please note the wonderful content of this official account. + + + +## QuecPython app development process + +This document mainly introduces how to use quecpthon to develop a complete app. + +Applicable modules: + +- EC100Y-CN + +- EC600S-CN + +### Development process + +Through the study in the previous section, we have mastered the communication between computers and modules. How do we usually develop products, write code and manage files? At this time, we need to install tools. + +-Installation code editing vscode; + +-Download the script to the. Yqpy module through the debugging tool. + +-Refer to API description for debugging function code: https://python.quectel.com/wiki/#/zh -cn/api/?id=pin + +-For quick experience function effect, please refer to the demo: https://python.quectel.com/download + + + +### Install editing tool vscode + +### Installing Python 3.9 + +Python installation package download address: https://www.python.org/downloads/ + +Go to the next step until the installation is completed. The default path is C: \ users \ chic. Ye \ appdata \ local \ programs \ python\ + +After installation, use the CMD command window to enter: Python -- version + +![](media/C50.png) + +When you see Python 3.9.1 returned, it indicates that the python development environment has been correctly installed + +### Vscode + +Recommended reference +[vscode builds Python development environment (including Python environment construction)](https://zhuanlan.zhihu.com/p/165379391) + +### Run code files in modules + +Add the code edited in the previous step to the qpycom tool according to the steps below, click "download script", and the file will be downloaded to the module. + +![](media/C59.png) + +Select the script file in the [file] tab of qpycom tool and click "run" + +![](media/C60.png) + +Automatically jump to the [interaction] interface to see the execution results of the module. + +![](media/C61.png) + +Readers will find that the execution result of qpycom is the same as that of the module. Usually, when we write code, we can also verify the business logic or syntax on the computer, and then put it into the module for execution. In this way, the development efficiency is greatly improved. + + + +### Skillfully using Wiki to help development + +If you don't understand the function development, you can refer to the API on the wiki for details, which contains the interface description and parameter description of all functions. + +![](media/C62.png) + +Click the corresponding column to see the detailed introduction of API + +![](media/C63.png) + +### Quick development with demo + +Demo download address: https://python.quectel.com/download + +![](media/C65.png) + +After downloading, unzip the folder and add it to the pycarm project. You can easily view and edit the code in the demo + +![](media/C64.png) + +Each code has comments + +![](media/C66.png) + +The demo provided on the official website is very rich and perfect to help customers develop products quickly. diff --git a/docs/Quick_start/en/config.json b/docs/Quick_start/en/config.json new file mode 100644 index 0000000000000000000000000000000000000000..57c39040ddfe66cf15c0b69670ff0453c18c8475 --- /dev/null +++ b/docs/Quick_start/en/config.json @@ -0,0 +1,24 @@ +{ + "import": "config_en", + "navbar": { + "items": [ + { + "id": "language", + "label": "Language: ", + "position": "right", + "items": [ + { + "id": "zh", + "url": "/doc/Quick_start/zh/", + "label": "中文" + }, + { + "id": "en", + "url": "/doc/Quick_start/en/", + "label": "English" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/docs/Quick_start/zh/media/1.png b/docs/Quick_start/en/media/1.png old mode 100755 new mode 100644 similarity index 100% rename from docs/Quick_start/zh/media/1.png rename to docs/Quick_start/en/media/1.png diff --git a/docs/Quick_start/zh/media/2.png b/docs/Quick_start/en/media/2.png old mode 100755 new mode 100644 similarity index 100% rename from docs/Quick_start/zh/media/2.png rename to docs/Quick_start/en/media/2.png diff --git a/docs/Quick_start/zh/media/C01.png b/docs/Quick_start/en/media/C01.png old mode 100755 new mode 100644 similarity index 100% rename from docs/Quick_start/zh/media/C01.png rename to docs/Quick_start/en/media/C01.png diff --git a/docs/Quick_start/zh/media/C02.png b/docs/Quick_start/en/media/C02.png old mode 100755 new mode 100644 similarity index 100% rename from docs/Quick_start/zh/media/C02.png rename to docs/Quick_start/en/media/C02.png diff --git a/docs/Quick_start/zh/media/C03.png b/docs/Quick_start/en/media/C03.png old mode 100755 new mode 100644 similarity index 100% rename from docs/Quick_start/zh/media/C03.png rename to docs/Quick_start/en/media/C03.png diff --git a/docs/Quick_start/zh/media/C04.png b/docs/Quick_start/en/media/C04.png old mode 100755 new mode 100644 similarity index 100% rename from docs/Quick_start/zh/media/C04.png rename to docs/Quick_start/en/media/C04.png diff --git a/docs/Quick_start/zh/media/C05.png b/docs/Quick_start/en/media/C05.png old mode 100755 new mode 100644 similarity index 100% rename from docs/Quick_start/zh/media/C05.png rename to docs/Quick_start/en/media/C05.png diff --git a/docs/Quick_start/zh/media/C06.png b/docs/Quick_start/en/media/C06.png old mode 100755 new mode 100644 similarity index 100% rename from docs/Quick_start/zh/media/C06.png rename to docs/Quick_start/en/media/C06.png diff --git a/docs/Quick_start/zh/media/C07.png b/docs/Quick_start/en/media/C07.png old mode 100755 new mode 100644 similarity index 100% rename from docs/Quick_start/zh/media/C07.png rename to docs/Quick_start/en/media/C07.png diff --git a/docs/Quick_start/zh/media/C08.png b/docs/Quick_start/en/media/C08.png old mode 100755 new mode 100644 similarity index 100% rename from docs/Quick_start/zh/media/C08.png rename to docs/Quick_start/en/media/C08.png diff --git a/docs/Quick_start/zh/media/C09.png b/docs/Quick_start/en/media/C09.png old mode 100755 new mode 100644 similarity index 100% rename from docs/Quick_start/zh/media/C09.png rename to docs/Quick_start/en/media/C09.png diff --git a/docs/Quick_start/zh/media/C10.png b/docs/Quick_start/en/media/C10.png old mode 100755 new mode 100644 similarity index 100% rename from docs/Quick_start/zh/media/C10.png rename to docs/Quick_start/en/media/C10.png diff --git a/docs/Quick_start/zh/media/C11.png b/docs/Quick_start/en/media/C11.png old mode 100755 new mode 100644 similarity index 100% rename from docs/Quick_start/zh/media/C11.png rename to docs/Quick_start/en/media/C11.png diff --git a/docs/Quick_start/zh/media/C12.png b/docs/Quick_start/en/media/C12.png old mode 100755 new mode 100644 similarity index 100% rename from docs/Quick_start/zh/media/C12.png rename to docs/Quick_start/en/media/C12.png diff --git a/docs/Quick_start/zh/media/C13.png b/docs/Quick_start/en/media/C13.png old mode 100755 new mode 100644 similarity index 100% rename from docs/Quick_start/zh/media/C13.png rename to docs/Quick_start/en/media/C13.png diff --git a/docs/Quick_start/zh/media/C14.png b/docs/Quick_start/en/media/C14.png old mode 100755 new mode 100644 similarity index 100% rename from docs/Quick_start/zh/media/C14.png rename to docs/Quick_start/en/media/C14.png diff --git a/docs/Quick_start/zh/media/C15.png b/docs/Quick_start/en/media/C15.png old mode 100755 new mode 100644 similarity index 100% rename from docs/Quick_start/zh/media/C15.png rename to docs/Quick_start/en/media/C15.png diff --git a/docs/Quick_start/zh/media/C16.png b/docs/Quick_start/en/media/C16.png old mode 100755 new mode 100644 similarity index 100% rename from docs/Quick_start/zh/media/C16.png rename to docs/Quick_start/en/media/C16.png diff --git a/docs/Quick_start/zh/media/C17.png b/docs/Quick_start/en/media/C17.png old mode 100755 new mode 100644 similarity index 100% rename from docs/Quick_start/zh/media/C17.png rename to docs/Quick_start/en/media/C17.png diff --git a/docs/Quick_start/zh/media/C18.png b/docs/Quick_start/en/media/C18.png old mode 100755 new mode 100644 similarity index 100% rename from docs/Quick_start/zh/media/C18.png rename to docs/Quick_start/en/media/C18.png diff --git a/docs/Quick_start/en/media/C60.png b/docs/Quick_start/en/media/C60.png new file mode 100644 index 0000000000000000000000000000000000000000..34ec28ff9be071a55a84e46b34969e3b771b671a Binary files /dev/null and b/docs/Quick_start/en/media/C60.png differ diff --git a/docs/Quick_start/en/media/C61.png b/docs/Quick_start/en/media/C61.png new file mode 100644 index 0000000000000000000000000000000000000000..4004bfb4deac611d258595bd72e248ef650f6b33 Binary files /dev/null and b/docs/Quick_start/en/media/C61.png differ diff --git a/docs/Quick_start/en/media/Document_Center.png b/docs/Quick_start/en/media/Document_Center.png new file mode 100644 index 0000000000000000000000000000000000000000..9adb7443cbea1e2be4c7492b46126ef7b07bed63 Binary files /dev/null and b/docs/Quick_start/en/media/Document_Center.png differ diff --git a/docs/Quick_start/en/media/QuecPython_dev_tool_1.png b/docs/Quick_start/en/media/QuecPython_dev_tool_1.png new file mode 100644 index 0000000000000000000000000000000000000000..5658f168cdb7b4ea1eead564255c86d04b38592f Binary files /dev/null and b/docs/Quick_start/en/media/QuecPython_dev_tool_1.png differ diff --git a/docs/Quick_start/en/media/QuecPython_dev_tool_2.png b/docs/Quick_start/en/media/QuecPython_dev_tool_2.png new file mode 100644 index 0000000000000000000000000000000000000000..c7102ff710f6eba63fa6e5873f1b1fffb1b2d63f Binary files /dev/null and b/docs/Quick_start/en/media/QuecPython_dev_tool_2.png differ diff --git a/docs/Quick_start/en/media/QuecPython_dev_tool_3.png b/docs/Quick_start/en/media/QuecPython_dev_tool_3.png new file mode 100644 index 0000000000000000000000000000000000000000..a2be94cbb65a6e16bdd1abafb714979a9bd37548 Binary files /dev/null and b/docs/Quick_start/en/media/QuecPython_dev_tool_3.png differ diff --git a/docs/Quick_start/en/media/SDK.png b/docs/Quick_start/en/media/SDK.png new file mode 100644 index 0000000000000000000000000000000000000000..0ce2d100130443abd0a9803331b826c26163d3af Binary files /dev/null and b/docs/Quick_start/en/media/SDK.png differ diff --git a/docs/Quick_start/en/media/c62.png b/docs/Quick_start/en/media/c62.png new file mode 100644 index 0000000000000000000000000000000000000000..229c81a208685581810df2806df9f9bf38837c11 Binary files /dev/null and b/docs/Quick_start/en/media/c62.png differ diff --git a/docs/Quick_start/en/media/c63.png b/docs/Quick_start/en/media/c63.png new file mode 100644 index 0000000000000000000000000000000000000000..acff3bde0a35cad34cad857651675fa7eba94da5 Binary files /dev/null and b/docs/Quick_start/en/media/c63.png differ diff --git a/docs/Quick_start/en/media/c64.png b/docs/Quick_start/en/media/c64.png new file mode 100644 index 0000000000000000000000000000000000000000..30a51d2aab5c545540a13f938227e70459143db7 Binary files /dev/null and b/docs/Quick_start/en/media/c64.png differ diff --git a/docs/Quick_start/en/media/c65.png b/docs/Quick_start/en/media/c65.png new file mode 100644 index 0000000000000000000000000000000000000000..5f6c575df62ee9e01e58971b6aa7884de0a716da Binary files /dev/null and b/docs/Quick_start/en/media/c65.png differ diff --git a/docs/Quick_start/en/media/c66.png b/docs/Quick_start/en/media/c66.png new file mode 100644 index 0000000000000000000000000000000000000000..72f70519bc0ef8ae61dead705782d714c78de6c1 Binary files /dev/null and b/docs/Quick_start/en/media/c66.png differ diff --git a/docs/Quick_start/en/media/demo.png b/docs/Quick_start/en/media/demo.png new file mode 100644 index 0000000000000000000000000000000000000000..dd94d41a3218a9d4053bb5408c54e272998bca1e Binary files /dev/null and b/docs/Quick_start/en/media/demo.png differ diff --git a/docs/Quick_start/en/media/image-20210115135054415.png b/docs/Quick_start/en/media/image-20210115135054415.png new file mode 100644 index 0000000000000000000000000000000000000000..42fb7fad5ef04d1173f14474b661223ee9b60e1d Binary files /dev/null and b/docs/Quick_start/en/media/image-20210115135054415.png differ diff --git a/docs/Quick_start/en/media/image-20210115140053879.png b/docs/Quick_start/en/media/image-20210115140053879.png new file mode 100644 index 0000000000000000000000000000000000000000..5ec0c9ee1ce7bf67ced945b7f1db1b23eff2e827 Binary files /dev/null and b/docs/Quick_start/en/media/image-20210115140053879.png differ diff --git a/docs/Quick_start/en/media/image-20210115140225664.png b/docs/Quick_start/en/media/image-20210115140225664.png new file mode 100644 index 0000000000000000000000000000000000000000..91a9201c6ae99da34881a3815a400eb54c5ee4da Binary files /dev/null and b/docs/Quick_start/en/media/image-20210115140225664.png differ diff --git a/docs/Quick_start/en/media/image-20210115140354788.png b/docs/Quick_start/en/media/image-20210115140354788.png new file mode 100644 index 0000000000000000000000000000000000000000..4cde6f8553cc97d01629295ad2dc28dcad666eb4 Binary files /dev/null and b/docs/Quick_start/en/media/image-20210115140354788.png differ diff --git a/docs/Quick_start/en/media/image-20210115140731212.png b/docs/Quick_start/en/media/image-20210115140731212.png new file mode 100644 index 0000000000000000000000000000000000000000..8e2533ba214c3fb7440e14274d0b0d4ad9b1d99e Binary files /dev/null and b/docs/Quick_start/en/media/image-20210115140731212.png differ diff --git a/docs/Quick_start/en/media/image-20210115140929120-1610695582844.png b/docs/Quick_start/en/media/image-20210115140929120-1610695582844.png new file mode 100644 index 0000000000000000000000000000000000000000..450cf83cc3b50ade295ddec376505e0cfabe3983 Binary files /dev/null and b/docs/Quick_start/en/media/image-20210115140929120-1610695582844.png differ diff --git a/docs/Quick_start/en/media/image-20210115140929120.png b/docs/Quick_start/en/media/image-20210115140929120.png new file mode 100644 index 0000000000000000000000000000000000000000..450cf83cc3b50ade295ddec376505e0cfabe3983 Binary files /dev/null and b/docs/Quick_start/en/media/image-20210115140929120.png differ diff --git a/docs/Quick_start/en/media/image-20210115141023596.png b/docs/Quick_start/en/media/image-20210115141023596.png new file mode 100644 index 0000000000000000000000000000000000000000..a990810bb32383662f1fdb3075582eddf1995d09 Binary files /dev/null and b/docs/Quick_start/en/media/image-20210115141023596.png differ diff --git a/docs/Quick_start/en/media/image-20210115141119300.png b/docs/Quick_start/en/media/image-20210115141119300.png new file mode 100644 index 0000000000000000000000000000000000000000..e914781540f501bb6e5503ec3d7bf2d3311f3388 Binary files /dev/null and b/docs/Quick_start/en/media/image-20210115141119300.png differ diff --git a/docs/Quick_start/en/media/image-20210115141203426.png b/docs/Quick_start/en/media/image-20210115141203426.png new file mode 100644 index 0000000000000000000000000000000000000000..9a127b9d16c7e37be0c8ead20fd3e1da92b5c83e Binary files /dev/null and b/docs/Quick_start/en/media/image-20210115141203426.png differ diff --git a/docs/Quick_start/en/media/image-20210417104838076.png b/docs/Quick_start/en/media/image-20210417104838076.png new file mode 100644 index 0000000000000000000000000000000000000000..5206d0512beab4dfb59b0eb522bd697a9cffe178 Binary files /dev/null and b/docs/Quick_start/en/media/image-20210417104838076.png differ diff --git a/docs/Quick_start/en/sidebar.yaml b/docs/Quick_start/en/sidebar.yaml new file mode 100644 index 0000000000000000000000000000000000000000..fadabe44ed2af51982998b55bb84662d91fb6f2c --- /dev/null +++ b/docs/Quick_start/en/sidebar.yaml @@ -0,0 +1,8 @@ +# Quecpython quick start +items: + - label: Construction of quecpthon development environment + file: README.md + - label: quick start for quecpthon + file: Quick_start.md + - label: quick start to quecpthon (changed later) + file: QuecPythonHelloWord/README.md diff --git a/docs/little_demo/zh/QuecPythonTest/GPIO.md b/docs/Quick_start/zh/GPIO.md similarity index 94% rename from docs/little_demo/zh/QuecPythonTest/GPIO.md rename to docs/Quick_start/zh/GPIO.md index 6337d0c3c6aeae2fae321fabfdbe999c4bc891dd..46f70ff3fa0b1164d82e8ae0000dfe260ec25b80 100644 --- a/docs/little_demo/zh/QuecPythonTest/GPIO.md +++ b/docs/Quick_start/zh/GPIO.md @@ -1,303 +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 +## 输入捕获实验 + +文档主要基于 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/README.md b/docs/Quick_start/zh/README.md index 0c020cd5c661026492e4d55ea4de67f4b8d9c8d6..368baed73e5177346193b438def2cab558251755 100755 --- a/docs/Quick_start/zh/README.md +++ b/docs/Quick_start/zh/README.md @@ -1,92 +1,29 @@ -# QuecPython 开发准备 +## 修订历史 -## QuecPython官网介绍及开发资源获取 +| 版本 | 日期 | 作者 | 变更表述 | +| ---- | ---------- | ------ | -------------------------- | +| 1.0 | 2021-09-02 | Kayden | 首次编写,指导客户快速开发 | +| 1.1 | 2021-09-10 | David | 增加环境搭建的注意事项 | -### 官网介绍 +## 前言 -**官网地址: https://python.quectel.com/** +本篇可能比较枯燥,但是仔细看完,相信你可以顺利玩转QuecPython开发板 -![](media/1.png) +## 官网介绍 -**官网wiki地址:https://python.quectel.com/wiki/#/** +**官网首页地址: [https://python.quectel.com/](https://python.quectel.com/)** -![](media/2.png) +**官网wiki地址:[https://python.quectel.com/wiki/#/](https://python.quectel.com/wiki/#/)**,对于模组支持的API都可以在此查找。 -### 开发资源下载 +**文档中心地址:[https://python.quectel.com/doc/](https://python.quectel.com/doc/)**,主要包括快速入门,常用接口开发,开发进阶,小实验等。 -获取开发资源下载地址:https://python.quectel.com/download +**开发资源下载地址:[https://python.quectel.com/download](https://python.quectel.com/download)**,主要包括开发工具、驱动、固件、硬件参考设计等的下载。 -![](media/SDK.png) - -## 初识QuecPython开发板 - -### QuecPython目前支持的平台 - -**CAT1/CATM/NB** - -![](media/image-20210115135054415.png) - -本文以EC600S_QuecPython_EVB为例进行介绍。 - -### 开发板介绍 - -EC600S_QuecPython_EVB_V1.1是专为 EC600S QuecPython开发而设计的一款开发板,其上集成了EC600S-CN 模块、板载 PCB 天线、音频接口、TypeC 接口、NANO SIM 卡座、自定义 KEY、LED 灯、LCD 接口,加速度传感器、温湿度传感器、光敏电阻等开发常用的配置,可以满足开发者的一般开发需求。 - -### 开发板硬件接口正面 - -![](media/image-20210115140053879.png) - ------- - -### 开发板硬件接口背面 - -![](media/image-20210115140225664.png) - ------- - -### 外设资源库 - -#### LCD 接口 - -EC600S_QuecPython_EVB_V1.1开发板集成了 LCD 接口,可以通过 SPI 协议来点亮 LCD 屏幕,其电 路 图 如 下 图 所 示 。QuecPython已 经 适 配 过color_lcd_spi_gc9305 、color_lcd_spi_hx8347、color_std_spi_st7789 和 mono_lcd_spi_st7567,购买开发板时可以选配一块 ST7789 驱动的 1.4 寸彩屏转接板。 - -![](media/image-20210115140354788.png) - -#### 加速度传感器 - -EC600S_QuecPython_EVB_V1.1 开发板集成了三轴加速度传感器,型号为 ST 公司的 LIS2DH12TR。 三轴加速度传感器是基于加速度的基本原理实现工作,具有体积小和重量轻特点。其电路图如下图所示: - -![](media/image-20210115140731212.png) - -#### 光敏电阻 - -EC600S_QuecPython_EVB_V1.1开发板集成了光敏电阻,型号为 JCHL的GL5516。光敏电阻是用硫化镉或硒化镉等半导体材料制成的特殊电阻器,其工作原理是基于内光电效应。光照愈强,阻值就愈低,随着光照强度的升高,电阻值迅速降低,亮电阻值可小至 1KΩ以下。光敏电阻对光线十分敏感,其在无光照时,高阻状态,暗电阻一般可达1.5MΩ。其电路图如下图所示: - -![](media/image-20210115140929120.png) - - - -#### **温湿度传感器** - -EC600S_QuecPython_EVB_V1.1 开发板集成了温湿度传感器,型号为ASAIR的AHT10。温湿度传感器多以温湿度一体式的探头作为测温元件,将温度和湿度信号采集出来,经过稳压滤波、运算放大、非线性校正、V/I 转换、恒流及反向保护等电路处理后,转换成与温度和湿度成线性关系的电流信号或电压信号输出, 也可以直接通过主控芯片进行 485 或 232 等接口输出。其电路图如下图所示: - -![](media/image-20210115141023596.png) - - - -#### 音箱功率放大器 - -EC600S_QuecPython_EVB_V1.1 开发板为了满足部分开发者的需求,集成了音响功率放大器,型号为 AWINIC 公司 AW8733ATQR。AW8733ATQR 是一款具有超强 TDD 抑制、超大音量、防破音、超低 EMI、K 类音响功率放大器,输出功率 2.0W。 - -![](media/image-20210115141119300.png) - -#### 自定义按键 - -EC600S_QuecPython_EVB_V1.1 开发板集成了 2 个自定义 KEY,开发者可以自行开发定义功能。 - -![](media/image-20210115141203426.png) +**Quecpython社区链接:[https://forumschinese.quectel.com/c/function-subjects/quectpython/43](https://forumschinese.quectel.com/c/function-subjects/quectpython/43)** + +可以在右上角的放大镜快速搜索您想要的问题和答案,如没有想要的问题和答案欢迎提问。 ## QuecPython 开发环境搭建 @@ -94,91 +31,85 @@ EC600S_QuecPython_EVB_V1.1 开发板集成了 2 个自定义 KEY,开发者可 拿到板子不知道怎么开始,看到这篇文章就对了。 -![](media/C01.png) - -期待已久的板子,终于拿到手了,在开发板侧边插上USB口供电,另一端接电脑USB口。 - -功能强大的开发板像手机一样支持开关机,所以供电后,我们首先开机。 +本部分内容详细操作可以结合EC600X开发板介绍进行学习,链接:[EC600X开发板介绍](https://python.quectel.com/doc/doc/Quecpython_intro/zh/Qp_Hw_EC600X/Hardware_Support_EC600X.html ) -长按侧边的POWKY两秒松开,模组便会自动开机。 +本文以EC600S_QuecPython_EVB_V1.1为例,V1.2、V1.3类同,具体差异可查看上文EC600X开发板介绍链接。 -![](media/C02.png) + -开始玩转QuecPython啦。 +期待已久的板子,终于拿到手了,在开发板侧边插上USB口供电,另一端接电脑USB口。功能强大的开发板像手机一样支持开关机,**所以供电后,我们考虑如何开机**。 +### 如何开机 +| 开发板 | 开机操作 | +| ----------------------------------------------------------- | ------------------------------------------------------------ | +| EC600S_QuecPython_EVB_V1.0 | 插电即开机 | +| EC600S_QuecPython_EVB_V1.1 | (1)USB和DC的电源选择开关拨到USB处
(2)长按开发板侧边的POWKY两秒松开,模组便会开机 | +| EC600S_QuecPython_EVB_V1.2/V1.3
BC25_QuecPython_EVB_V1.0 | (1)USB和DC的电源选择开关拨到USB处
(2)开发板上的PWK_ON跳帽短接,则无需长按PWK,反之需要长按PWK | ### 驱动下载安装 驱动程序(device driver)全称为“设备驱动程序”,是一种可以使计算机和设备通信的特殊程序,可以说相当于硬件的接口,操作系统只能通过这个接口,才能控制硬件设备的工作,假如某设备的驱动程序未能正确安装,便不能正常工作。 - +打开[驱动下载链接](https://python.quectel.com/download),如图选择自己电脑匹配的驱动,向右拖动箭头位置会出现下载按钮,点击下载即可。 -为了能让EC600S开发板和电脑正常通信,我们去官网下载一个EC600S的驱动程序,安装在电脑上。 +驱动安装注意事项 -下载链接:https://python.quectel.com/download +1. **驱动的分类主要分为两大类:** -打开链接,选择自己电脑匹配的驱动,【点击下载】 + **第一、基于模组支持的平台分类:ASR平台(EC600SCNAA、EC600SCNLA、EC600SCNLB、EC600N、EC100Y)和RDA平台(EC600U)更多模组的平台信息可见:[硬件支持](https://python.quectel.com/doc/doc/Quecpython_intro/zh/Qp_Product_intro/Hardware_Support.html),相信大家也有一个疑问EC600X是什么平台,实际上EC600X中“X”是一个未知数,可指EC600S、EC600U等,并不代表实际的平台。** -![](media/C03.png) + **第二、基于PC的系统分类:Windows7系统请下载Windows7对应的驱动;Windows10系统请下载Windows10对应的驱动。** -打开【我的电脑】——【管理】——【设备管理器】 +2. **对于EC600SCNLA和EC600SCNLB,必须下载最新版本的驱动,驱动版本至少在V1.0.8以上** -安装驱动前: - -![](media/C04.png) - -安装驱动后: - -![](media/C05.png) - -下载后打开压缩包,双击运行“setup.exe”,一直“下一步”直到安装完成,安装完之后就可以看到【设备管理器】中端口的感叹号消失了,说明安装成功,能够正常通信。 - -![](media/C06.png) - -![](media/C07.png) - -![](media/C08.png) +3. **RDA USB驱动下载后压缩包里包含Windows7和Windows10的驱动。** + +打开【我的电脑】——【管理】——【设备管理器】 -### QPYcom.exe使用 +安装驱动前: -官方提供一个Windows的界面工具给用户开发调试模组的代码。 + -下载链接:https://python.quectel.com/download +安装驱动后: -找到QPYcom图形化工具 +![](media/readme_5.png) -![](media/C09.png) +下载后打开压缩包,双击运行“setup.exe”,一直“下一步”直到安装完成,安装完之后就可以看到【设备管理器】中端口的感叹号消失了,说明安装成功,能够正常通信。**上图中可见仍然有个端口有感叹号,不用在意,用不上。** -绿色版QPYcom软件无需安装,直接下载解压后,打开QPYcom.exe应用程序使用。 +![](media/readme_6.png) -![](media/C10.png) +![](media/readme_7.png) -![](media/C11.png) +![](media/readme_8.png) -下面介绍一下QPYcom工具的主要内容包括不限于:交互界面、文件操作、下载功能。 -交互界面:用于在电脑端与设备端通信,下发命令让设备按照用户的想法去工作,同时设备可以返回信息给电脑,用户在交互界面可以看到设备内部的运作情况。 -![](media/C12.png) +### 固件烧录注意事项 -文件操作:用于在电脑端给设备传输文件,用户自己写的代码文件,在这个界面送入到设备,这样设备就能运行用户代码啦。 +1. **不同模组对应不同的固件,不支持交叉烧录,如果误烧,一定要纠正烧录成对应固件,否则无法正常使用。例如:EC600S分为EC600SCNAA、EC600SCNLA、EC600SCNLB等等,这些模组之间都不支持交叉烧录。** +2. **关于固件包的说明,由于官网下载的固件压缩文件包含固件包与change log,所以官网下载的固件压缩文件需要解压一层,才可以得到可烧录的固件包,后面会评估更改固件包的后缀为.bin(计划中,如果后面更新完成,记得烧录时选择后缀为.bin的压缩文件)。** +3. **下载固件前,建议优先需要确认固件版本,以免降级或者下错版本。 下载固件后,所有用户区的内容都将被清空。** +4. **下载固件时,无需选择串口,工具将自动选择并开始下载** +5. **请勿同时插入两个或两个以上的开发板,以免工具无法识别,导致下载出错** +6. **QPYcom工具支持烧录python固件,不支持烧C固件或者AT标准固件** +7. **下载固件过程中,请勿退出工具,或者拔掉串口,可能致使模块变砖。 如果模块确已变砖,可见“[QuecPython救砖处理](https://python.quectel.com/doc/doc/FAQ/zh/QP_recovery/QP_recovery.html)”章节** -![](media/C13.png) +### QPYcom.exe使用 -下载功能:用于用户烧录固件,用户的.py文件执行于固件之上,要让设备执行QuecPython代码,就先烧录PY固件。 +官方提供一个Windows的界面工具给用户开发调试模组的代码。下载链接:https://python.quectel.com/download -![](media/C14.png) +关于QPYcom工具见“工具同目录下的docs文件夹”,里面有对应的工具说明。 ### 工作原理 这里先了解一下整个过程是如何执行的。 -![](media/C15.png) +![](media/readme_9.png) -![](media/C16.png) +![](media/readme_10.png) 模组内置一个QuecPython语法解释器,对QuecPython语句解释后,返回执行结果。 @@ -192,23 +123,21 @@ print()可以打印字符串、变量等等信息。 在QuecPython里字符串用一对单引号表示。如‘Hello world! QuecPython’。 - - ### 实战操作 -![](media/C17.png) +![](media/readme_11.png) -打开QPYcom软件后,我们看到有“选择串口”中有三个端口是模组相关的,其中: +打开QPYcom软件后,我们看到“选择串口”中有三个端口是模组相关的,其中: “Quectel USB AT Port”是用于发送AT指令, “Quectel USB DIAG Prot”用于查看模组的调试信息, -这两个用户几乎用不到,我们重点留意“***\*USB 串行设备\****”,我们仅用这个端口就可以完成代码的调试工作。 +这两个用户几乎用不到,我们重点留意“***Quectel USB MI05 COM Port***”,我们仅用这个端口就可以完成代码的调试工作。 -点击下拉框,选中“***\*USB串行设备\****”,点击“打开串口” +点击下拉框,选中“***Quectel USB MI05 COM Port***”,点击“打开串口” 在交互界面输入print(‘Hello world! QuecPython’),然后按回车。 @@ -222,7 +151,7 @@ Hello World! QuecPython >>> ``` -![](media/C18.png) +![image-20210910111634969](media/readme_12.png) 看到模组返回值了,成功输出Hello world! QuecPython @@ -232,9 +161,7 @@ Hello World! QuecPython 相关工具、例程、驱动、文档可以在官方网站下载:https://python.quectel.com/download - - -了解更多,敬请留意本公众号的精彩内容。 + 了解更多,敬请留意本公众号的精彩内容。 @@ -244,27 +171,34 @@ Hello World! QuecPython 适用模块: -- EC100Y-CN - -- EC600S-CN +- EC100Y-CNAA +- EC600S-CNAA +- EC600S-CNLA +- EC600S-CNLB +- EC600N-CNLA +- EC600N-CNLC +- EC600N-CNLD +- EC600U-CNLB +- EC600U-CNLC +- EC600U-EUAB +- EC200U-CNLB +- EC200U-EUAB ### 开发流程 通过上一节的学习,已经掌握了电脑和模组的通信工作,那么我们平时是如何开发产品的呢,如何写代码、管理文件呢,这个时候就要安装工具了。 -- 安装代码编辑Pycharm; +- 安装代码编辑Vscode; - 通过QPYcom工具下载.py脚本文件到模块中运行、调试。 - 调试功能代码参考API说明:https://python.quectel.com/wiki/#/zh-cn/api/?id=pin -- 快速体验功能效果可参考demo:https://python.quectel.com/download +- 快速体验功能效果可下载参考demo:https://python.quectel.com/download -### 安装编辑工具 - -接下来介绍如何安装PC端的Python开发环境和pycharm工具 +### 安装编辑工具 VsCode或PyCharm ### 安装Python3.9 @@ -274,60 +208,26 @@ Python安装包下载地址:https://www.python.org/downloads/ 安装完成后,使用cmd命令窗口输入:python --version -![](media/C50.png) - 看到返回 Python 3.9.1,说明已经正确安装Python的开发环境 -### 安装Pycharm - -pycharm安装包在百度网盘下载 - -链接:https://pan.baidu.com/s/15p1c16UvVOYzhXUzyp7mYg -提取码:1111 - -![](media/C52.png) +### Vscode -安装完成后双击打开桌面图片,在菜单栏进入“文件”---“默认设置”---设置开发环境 +推荐参考 +[VSCode搭建Python开发环境(含Python环境搭建)](https://zhuanlan.zhihu.com/p/165379391) -在【Python interpreter】栏目选择python.exe解释器 +### 编写代码 -![](media/C53.png) +以PyCharm为例: - - -### 设置字体大小 - -在菜单栏进入“文件”---“设置”---“编辑器”---“颜色和字体”---【Font】和【Console Font】中设置 - -![](media/C54.png) - - - -### 使用方法 - -在菜单栏进入“文件”---“新项目”,然后选中一个文件夹,可以自行在文件夹里新建文件。 - -![](media/C55.png) - -文件或文件内容发生变化之后,pycharm左侧栏目的文件列表随即更新。 - -![](media/C56.png) - -之后就可以在这个文件夹中管理自己的.py文件了。 - -![](media/C57.png) - -点击项目中的“三角形”,程序便运行起来,在下方有个输出窗口,可以看到print()函数的打印结果。 - -![](media/C58.png) +![](media/PyCharm_1.png) ### 在模组中运行代码文件 -把上一步编辑好的代码,按照下图步骤,添加到QPYcom工具中,点击“下载脚本”,文件就下载到模组里面了。 +把上一步编辑好的代码,点击加号选择文件(或者直接从左边拖到右边),文件就下载到模组里面了。 ![](media/C59.png) -在QPYcom工具的【文件】选项卡中选中脚本文件,点击“运行” +如下图:在QPYcom工具的【文件】选项卡中选中脚本文件,点击“运行” ![](media/C60.png) @@ -337,11 +237,20 @@ pycharm安装包在百度网盘下载 读者会发现在QPYcom的执行结果和模组是一样的,通常我们编写代码是,同样可以在电脑验证业务逻辑或语法,然后再放到模组中执行,这样开发效率就大大提高了。 +| 小提示 | +| ------------------------------------------------------------ | +| 若要作为控制器可从点灯开始,参考链接:https://mp.weixin.qq.com/s/wrE2LXuE35UtKqaCV74zAg | +| 开发板上有LED灯可供点亮哦,详情请查看开发板原理图 | + ### 巧用wiki助力开发 -遇到不懂的功能开发,可以参考wiki上的API详细介绍,里面有所有功能的接口说明、参数说明。 +遇到不懂的功能开发或者想看看有没有想要的功能,可以参考wiki上的API详细介绍,里面有所有功能的接口说明、参数说明,**只需要在左上角搜索关键字就可以找到你想要的API**。 + +wiki中文API介绍链接:https://python.quectel.com/wiki/#/zh-cn/api/ + +wiki英文API介绍链接:https://python.quectel.com/wiki/#/en-us/api/ ![](media/C62.png) @@ -349,12 +258,14 @@ pycharm安装包在百度网盘下载 ![](media/C63.png) - +**特别注意:如果要控制GPIO一定查询上图中的硬件相关功能里的Pin,里面介绍了API中的GPIO对应的各个模组物理引脚号,所有支持GPIO操作的引脚已经列出。** 可以在左上角搜索Pin或者GPIO快速找到。 ### 巧用demo快速开发 demo下载地址:https://python.quectel.com/download +更多实用demo可在QQ群:445121768,群文件搜索关键词进行下载。 + ![](media/C65.png) 下载后,解压出来的文件夹,添加到pycarm项目里面,可以很方便的查看和编辑demo里面的代码了 @@ -365,4 +276,5 @@ demo下载地址:https://python.quectel.com/download ![](media/C66.png) -官网提供的demo非常丰富和完善,帮助客户快速开发产品。 \ No newline at end of file +官网提供的demo非常丰富和完善,帮助客户快速开发产品。 + diff --git a/docs/Quick_start/zh/QuecPythonHelloWord/README.md b/docs/Quick_start/zh/Start_to_abandon.md old mode 100755 new mode 100644 similarity index 85% rename from docs/Quick_start/zh/QuecPythonHelloWord/README.md rename to docs/Quick_start/zh/Start_to_abandon.md index 043a8c80a35311e2e138fcb01407fbfa10d6e16a..f1d1d68fbe50b4bbc8931ce8b4dcc43ced4ee455 --- a/docs/Quick_start/zh/QuecPythonHelloWord/README.md +++ b/docs/Quick_start/zh/Start_to_abandon.md @@ -2,11 +2,6 @@ 本文档主要说明 QuecPython快速入门,主要包括三个方面:打印Hello World;点亮LED灯;HTTP获取网页源代码。 -适用模块: - -- EC100Y-CN -- EC600S-CN - ## Hello World打印 1.开发板接入电脑,需要安装驱动和烧录模块固件,具体的操作方法参照《Quectel QuecPython_QPYcom工具使用说明》 @@ -16,7 +11,7 @@ (1)交互窗口打印 -如下图所示,使用QPYcom工具,端口连接”USB串行设备”,选择“交互”界面,进行如下交互打印。 +如下图所示,使用QPYcom工具,端口连接“QuecPython的交互端口”,选择“交互”界面,进行如下交互打印。 ```python >>> print('hello world') @@ -38,10 +33,6 @@ while print_num: utime.sleep(2) # 延迟2秒 ``` -运行结果如下: - -![helloworld_print](media/helloworld_print.png) - ## 点亮LED灯与HTTP获取网页源代码 @@ -57,7 +48,7 @@ while print_num: 实物连接如下所示。 -![LED_connect](media/LED_connect.jpg) +LED_connect @@ -91,14 +82,14 @@ while account: 1.打开QPYcom运行*led_net.py*,如下图所示。 -![Click_Run](media/Click_Run.jpg) +![Start_to_abandon_02](media/Start_to_abandon_02.png) 2.运行中,看到request获取成功后,拔掉SIM卡(模拟无法注网的状态),部分LOG如下: -![Operation_effect](media/Operation_effect.jpg) +![Operation_effect](media/Start_to_abandon_03.jpg) 说明: (1)在拔出SIM卡后,仍有几次获取到GPIO状态是1的,这是正常的,因为request获取会有存在一定的缓存; -(2)对于运行中出现的"113"等,是HTTP的错误码,具体可参考HTTP的错误码表(可自行百度)。 \ No newline at end of file +(2)对于运行中出现的"113"等,是HTTP的错误码,具体可参考[HTTP的错误码表](https://python.quectel.com/wiki/#/zh-cn/faq/?id=quecpython%e9%94%99%e8%af%af%e7%a0%81%e6%b1%87%e6%80%bb),或者google。 \ No newline at end of file diff --git a/docs/Quick_start/zh/code/get_rom_ram.py b/docs/Quick_start/zh/code/get_rom_ram.py new file mode 100644 index 0000000000000000000000000000000000000000..efd17a5c8897acddaf205ad8a3faeb65bd30d74f --- /dev/null +++ b/docs/Quick_start/zh/code/get_rom_ram.py @@ -0,0 +1,13 @@ +import gc +import uos + +res = uos.statvfs("/usr") +res = list(res) +print('获取文件系统状态信息:', res) +print('f_bsize – 文件系统块大小,单位字节:', res[0]) +print('f_bfree – 可用块数:', res[3]) +print('剩下总空间 {} 字节'.format(res[0] * res[3])) +print('剩下总空间 {} MB'.format((res[0] * res[3]) / 1024 / 1024)) + +mem = gc.mem_free() +print('剩余RAM空间:{}KB'.format(mem / 1024)) diff --git a/docs/little_demo/zh/QuecPythonTest/code/gpio_check.py b/docs/Quick_start/zh/code/gpio_check.py similarity index 96% rename from docs/little_demo/zh/QuecPythonTest/code/gpio_check.py rename to docs/Quick_start/zh/code/gpio_check.py index ced078b5c02b194ed452d066a5265a67d76bb598..ee7553fd40be00965a839a1018decb6a5a5bd923 100644 --- a/docs/little_demo/zh/QuecPythonTest/code/gpio_check.py +++ b/docs/Quick_start/zh/code/gpio_check.py @@ -1,69 +1,69 @@ -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: +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 \ No newline at end of file diff --git a/docs/Quick_start/zh/code/test_a.py b/docs/Quick_start/zh/code/test_a.py new file mode 100644 index 0000000000000000000000000000000000000000..6ea4cdf191d05180a6c510da1d8d6cd881e32dcc --- /dev/null +++ b/docs/Quick_start/zh/code/test_a.py @@ -0,0 +1,16 @@ +import uio + +# 以追加方式打开 test_a.txt 文件 +fd = uio.open("usr/test_a.txt", mode='a') +# 向文件追加写内容 +fd.write("Hello Quectel") +# 关闭文件 +fd.close() + +# 以只读方式打开看追加的结果 +fd = uio.open("usr/test_a.txt", mode='r') +# 读取文件内容 +text = fd.read() +print(text) +# 关闭文件 +fd.close() diff --git a/docs/Quick_start/zh/code/test_a.txt b/docs/Quick_start/zh/code/test_a.txt new file mode 100644 index 0000000000000000000000000000000000000000..0a3cfff13f034a58c591a7638bd587f5234c8aa1 --- /dev/null +++ b/docs/Quick_start/zh/code/test_a.txt @@ -0,0 +1 @@ +hello python \ No newline at end of file diff --git a/docs/Quick_start/zh/code/test_r.py b/docs/Quick_start/zh/code/test_r.py new file mode 100644 index 0000000000000000000000000000000000000000..9cfb58e911c53587c208992917cf099d2c958cdd --- /dev/null +++ b/docs/Quick_start/zh/code/test_r.py @@ -0,0 +1,9 @@ +import uio + +# 以只读方式打开 test_r.txt 文件 +fd = uio.open("usr/test_r.txt", mode='r') +# 读取文件内容 +text = fd.read() +print(text) +# 关闭文件 +fd.close() diff --git a/docs/Quick_start/zh/code/test_r.txt b/docs/Quick_start/zh/code/test_r.txt new file mode 100644 index 0000000000000000000000000000000000000000..7d266c2323b952a0dd484e8cad9d773eb1e635a1 --- /dev/null +++ b/docs/Quick_start/zh/code/test_r.txt @@ -0,0 +1 @@ +Hello Python \ No newline at end of file diff --git a/docs/Quick_start/zh/code/test_w.py b/docs/Quick_start/zh/code/test_w.py new file mode 100644 index 0000000000000000000000000000000000000000..78177b27024892152fc918e4190bdce095496a0a --- /dev/null +++ b/docs/Quick_start/zh/code/test_w.py @@ -0,0 +1,8 @@ +import uio + +# 以只写方式打开 test_w.txt 文件 +fd = uio.open("usr/test_w.txt", mode='w') +# 向文件写内容 +fd.write("HELLO PYTHON") +# 关闭文件 +fd.close() diff --git a/docs/Quick_start/zh/code/test_w.txt b/docs/Quick_start/zh/code/test_w.txt new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/docs/Quick_start/zh/code/test_w_r.py b/docs/Quick_start/zh/code/test_w_r.py new file mode 100644 index 0000000000000000000000000000000000000000..82e8ba7cef0ed9ddd720a26e80972b1a4404c7ff --- /dev/null +++ b/docs/Quick_start/zh/code/test_w_r.py @@ -0,0 +1,9 @@ +import uio + +# 以只读方式打开 test_w.txt 文件 +fd = uio.open("usr/test_w.txt", mode='r') +# 读取文件内容 +text = fd.read() +print(text) +# 关闭文件 +fd.close() 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/config.json b/docs/Quick_start/zh/config.json index 10c2a1cc1964035be8ce534c1a708e32e4094fcc..667b3e61a97747ee57cd4ac047b4c418e50b09fd 100755 --- a/docs/Quick_start/zh/config.json +++ b/docs/Quick_start/zh/config.json @@ -1,92 +1,21 @@ { - "class": "language_zh", + "import": "config_zh", "navbar": { - "title": "QuecPython", - "logo": { - "alt": "teedoc logo", - "src": "/static/image/quectel.png" - }, - "home_url": "/", "items": [ { - "url": "https://python.quectel.com/wiki/#/", - "label": "wiki", - "position": "left" - }, - { - "label": "    文档    ", - "position": "left", - "items": [ - { - "url": "/doc/Quecpython_intro/zh/index.html", - "label": "产品介绍" - }, - { - "url": "/doc/Quick_start/zh/index.html", - "label": "快速开始" - }, - { - "url": "/doc/sbs/zh/index.html", - "label": "手把手教程" - }, - { - "url": "/doc/Advanced_development/zh/index.html", - "label": "开发进阶" - }, - { - "url": "/doc/little_demo/zh/index.html", - "label": "小实验" - }, - { - "url": "/doc/Product_case/zh/index.html", - "label": "产品案例" - }, - { - "url": "/doc/Mass_production/zh/index.html", - "label": "产品量产" - }, - { - "url": "/doc/FAQ/zh/index.html", - "label": "常见问题" - } - ] - }, - { - "label": "GitHub", + "id": "language", + "label": "Language: ", "position": "right", - "url": "https://github.com/quecpython/Community-document" - } - ] - }, - "footer": { - "top": [ - { - "label": "链接", - "items": [ - { - "label": "使用 teedoc 构建", - "url": "https://github.com/neutree/teedoc", - "target": "_blank" - }, - { - "label": "Copyright © 2021 Neucrack", - "url": "https://neucrack.com", - "target": "_blank" - } - ] - }, - { - "label": "源码", "items": [ { - "label": "github", - "url": "https://github.com/neutree/teedoc", - "target": "_blank" + "id": "zh", + "url": "/doc/Quick_start/zh/", + "label": "中文" }, { - "label": "本网站源文件", - "url": "https://github.com/quecpython/Community-document", - "target": "_blank" + "id": "en", + "url": "/doc/Quick_start/en/", + "label": "English" } ] } diff --git a/docs/Quick_start/zh/file.md b/docs/Quick_start/zh/file.md new file mode 100644 index 0000000000000000000000000000000000000000..980dc3a377f807f8faea04e52cad7920e8b40a2d --- /dev/null +++ b/docs/Quick_start/zh/file.md @@ -0,0 +1,233 @@ +## 修订历史 +| 版本 | 日期 | 作者 | 变更表述 | +|------|------|------|------| +| 1.0 | 2021-3-31 | gary.zhou | 初版 | +| 1.1 | 2021-9-9 | Kayden | 新增示例代码下载链接,修改部分文件命名、文字描述和图片 | + +## 文件读写说明 + +本文主要介绍QuecPython文件读写的几种方式,适用于所有支持QuecPython开发模组。 + +## 文件基本概念 + +文件将数据保存并存储在某种长期存储设备上,存储设备主要包括硬盘 、U 盘 、移动硬盘、光盘等。 + +## 文件存储方式 + +文件主要以文本及二进制的方式进行储存。 + +### 文本文件 , 例如 Python 的源程序: + +- 可以使用文本编辑软件查看 ; + +- 本质上还是二进制文件 。 + +### 二进制文件,例如图片文件、音频文件、视频文件: + +- 保存的内容无法直接阅读 ,而是提供给其他软件使用的 ; +- 二进制文件不能使用文本编辑软件查看 。 + +## 文件的基本操作 + +具体的API 详解请参考[QuecPython-标准库-uio](https://python.quectel.com/wiki/#/zh-cn/api/pythonStdlib?id=uio-输入输出流)。 + +## 文件操作函数 + +文件操作函数 + +| 函数 | 说明 | 方法 | +| ----- | ------------------------------ | ------------------------------ | +| Open | 打开文件,并且返回文件操作对象 | 负责打开文件,并且返回文件对象 | +| Read | 将文件内容读取到内存 | 需要通过文件对象来调用 | +| Write | 将指定内容写入文件 | 需要通过文件对象来调用 | +| Close | 关闭文件 | 需要通过文件对象来调用 | + +## 操作文件及目录 + +将QuecPython开发板连接至电脑(默认为已进行完所有入门操作),接入后的操作方法详见[《Quectel_QuecPython_基础操作说明》](https://python.quectel.com/doc/doc/sbs/zh/index.html)。 + +![QuecPytgon_sbs_file_01.png](media/QuecPytgon_sbs_file_01.png) + +图 **1**: **QuecPython** 开发板与电脑连接。 + +### 以只读方式打开文件 + +步骤一 : 创建 *test_r.py*、*test_r.txt* 文件, 并 在 *test_r.py* 文件中写入以下代码,在 *test_r.txt* 文件输入 "hello python"。 + +点击下载test_r.py代码 + +点击下载test_r.txt文件 + +- 在 *test_r.py* 文件中导入 **QuecPython** 中的 *uio* 模块并写入代码: + +```python +import uio + +# 以只读方式打开 test_r.txt 文件 +fd = uio.open("usr/test_r.txt", mode='r') +# 读取文件内容 +text = fd.read() +print(text) +# 关闭文件 +fd.close() +``` + +- 在 *test_r.txt* 文件输入 "Hello Python": + +![QuecPytgon_sbs_file_02.png](media/QuecPytgon_sbs_file_02.png) + +图 **2**: 在 **test_r.txt** 文件输入 **"Hello Python"** + +步骤 二 : 将 *test_r.py* 文件和 *test_r.txt* 文件分别上传到**QuecPython** 开发板内,上传方法详见[《Quectel_QuecPython_基础操作说明》](https://python.quectel.com/doc/doc/sbs/zh/index.html)。 + +步骤 三 : 读取文件运行结果 + +![QuecPytgon_sbs_file_03.png](media/QuecPytgon_sbs_file_03.png) + +图 **3**: 读取文件数据运行结果 + +### 以只写方式打开文件 + +步骤一 : 创建 *test_w.py* 文件及内容为空白的 *test_w.txt* 文件,在 *test_w.py* 文件中导入 QuecPython 中的 uio 模块,并编写如下代码: + +点击下载test_w.py代码 + +点击下载test_w.txt文件 + +```python +import uio + +# 以只写方式打开 test_w.txt 文件 +fd = uio.open("usr/test_w.txt", mode='w') +# 向文件写内容 +fd.write("HELLO PYTHON") +# 关闭文件 +fd.close() +``` + +步骤 二 : 参照上一个例子以只读方式打开文件的方法和代码创建一个*test_w_r.py*文件,可得到写入结果,参考代码如下。 + +点击下载代码test_w_r.py + +```python +import uio + +# 以只读方式打开 test_w.txt 文件 +fd = uio.open("usr/test_w.txt", mode='r') +# 读取文件内容 +text = fd.read() +print(text) +# 关闭文件 +fd.close() +``` + +步骤 三: 将 *test_w.py* 文件和、*test_w.txt* 文件*test_w_r.py*文件分别上传到 **QuecPython** 开发板内,先运行*test_w.py* 写入数据,再运行test_w_r.py文件读取出写入的数据,运行结果如下。 + +![QuecPytgon_sbs_file_04.png](media/QuecPytgon_sbs_file_04.png) + +图 **4**: 写入文件数据并读取运行结果 + +### 以只写追加模式打开文件 + +步骤一 : 创建 *test_a.py*、*test_a.txt* 文件, 并 在 *test_a.py* 文件中导入 QuecPython 中的 *uio* 模块,在 *test_a.txt* 文件输入 "hello python"。 + +点击下载代码test_a.py + +点击下载test_a.txt文件 + +- 在 *test_a.py*文件中导入 QuecPython 中的 *uio* 模块: + +```python +import uio + +# 以追加方式打开 test_a.txt 文件 +fd = uio.open("usr/test_a.txt", mode='a') +# 向文件追加写内容 +fd.write("Hello Quectel") +# 关闭文件 +fd.close() + +# 以只读方式打开看追加的结果 +fd = uio.open("usr/test_a.txt", mode='r') +# 读取文件内容 +text = fd.read() +print(text) +# 关闭文件 +fd.close() +``` +- 在test_a.txt* 文件输入 "hello python": + +![QuecPytgon_sbs_file_08.png](media/QuecPytgon_sbs_file_08.png) +图 **5**: 在 **test_a.txt** 文件输入 **"hello python"** + +步骤 二 : 将 *test_a.py* 文件和 *test_a.txt* 文件分别上传到**QuecPython**开发板内。 + +步骤 三 : 运行代码获取追加结果如下。 + +![QuecPytgon_sbs_file_09.png](media/QuecPytgon_sbs_file_09.png) + +### 使用 uos 模块 +具体的API 详解请参考[QuecPython-标准库-uos](https://python.quectel.com/wiki/#/zh-cn/api/pythonStdlib?id=uos-基本系统服务)。 + +#### 列出当前文件列表 + +**注意:**不同模组参数填写格式略有不同,下图示例为EC600U模组,EC600N操作只需要uos.chdir('usr') + +![QuecPytgon_sbs_file_05.png](media/QuecPytgon_sbs_file_05.png) + +图 **6**: 列出当前文件列表 + +#### 新建目录 + +**注意:**不同模组参数填写格式略有不同,下图示例为EC600U模组,EC600N操作只需要uos.mkdir('testdir')。 + +![QuecPytgon_sbs_file_05.png](media/QuecPytgon_sbs_file_06.png) + +图 **7**: 新建目录 + +#### 删除目录 + +![QuecPytgon_sbs_file_06.png](media/QuecPytgon_sbs_file_07.png) + +图 **8**: 删除目录 + +**备注**: system_config.json 为默认脚本文件。 + +#### 获取模块ROM、RAM信息 + +- **示例代码** + +点击下载代码 + +```python +import gc +import uos + +res = uos.statvfs("/usr") +res = list(res) +print('获取文件系统状态信息:', res) +print('f_bsize – 文件系统块大小,单位字节:', res[0]) +print('f_bfree – 可用块数:', res[3]) +print('剩下总空间 {} 字节'.format(res[0] * res[3])) +print('剩下总空间 {} MB'.format((res[0] * res[3]) / 1024 / 1024)) + +mem = gc.mem_free() +print('剩余RAM空间:{}KB'.format(mem / 1024)) +``` +- **代码运行结果** + +![QuecPytgon_sbs_file_10.png](media/QuecPytgon_sbs_file_10.png) + + 图 **9**: 获取ROM、RAM信息 + +#### 获取文件读写速度 + +文件读写速度待内部调研补充,暂时无此数据。 + +### 附录术语缩写 + +表 **3**: 术语缩写 + +| 缩写 | 英文全称 | 中文全称 | +| ---- | --------------------------------- | ---------------- | +| API | Application Programming Interface | 应用程序编程接口 | \ No newline at end of file diff --git a/docs/Quick_start/zh/media/C50.png b/docs/Quick_start/zh/media/C50.png deleted file mode 100755 index 3dc8818faeee75b4f6b75a77f9b62d93a2b98e12..0000000000000000000000000000000000000000 Binary files a/docs/Quick_start/zh/media/C50.png and /dev/null differ diff --git a/docs/Quick_start/zh/media/C51.png b/docs/Quick_start/zh/media/C51.png deleted file mode 100755 index 40def7aa5b32b5f024114b89e758c5b5457098a0..0000000000000000000000000000000000000000 Binary files a/docs/Quick_start/zh/media/C51.png and /dev/null differ diff --git a/docs/Quick_start/zh/media/C52.png b/docs/Quick_start/zh/media/C52.png deleted file mode 100755 index 5848cea9c92a0e964d7febccf2290795cb3d14c3..0000000000000000000000000000000000000000 Binary files a/docs/Quick_start/zh/media/C52.png and /dev/null differ diff --git a/docs/Quick_start/zh/media/C53.png b/docs/Quick_start/zh/media/C53.png deleted file mode 100755 index 3bb14ab0713e9ccbba37ec7fd838d74a41218e5e..0000000000000000000000000000000000000000 Binary files a/docs/Quick_start/zh/media/C53.png and /dev/null differ diff --git a/docs/Quick_start/zh/media/C54.png b/docs/Quick_start/zh/media/C54.png deleted file mode 100755 index a593ef82bdbbdddd35638d0906c6b32783163819..0000000000000000000000000000000000000000 Binary files a/docs/Quick_start/zh/media/C54.png and /dev/null differ diff --git a/docs/Quick_start/zh/media/C55.png b/docs/Quick_start/zh/media/C55.png deleted file mode 100755 index 2c8411f7a9eb444b339ebd202b7bd0863a0db778..0000000000000000000000000000000000000000 Binary files a/docs/Quick_start/zh/media/C55.png and /dev/null differ diff --git a/docs/Quick_start/zh/media/C56.png b/docs/Quick_start/zh/media/C56.png deleted file mode 100755 index 2c144bc04e03d8f8fdf4e23ebf8c6b69427f72e7..0000000000000000000000000000000000000000 Binary files a/docs/Quick_start/zh/media/C56.png and /dev/null differ diff --git a/docs/Quick_start/zh/media/C57.png b/docs/Quick_start/zh/media/C57.png deleted file mode 100755 index 3986711edd9d5e510e1c0b84a50458ccea262b93..0000000000000000000000000000000000000000 Binary files a/docs/Quick_start/zh/media/C57.png and /dev/null differ diff --git a/docs/Quick_start/zh/media/C58.png b/docs/Quick_start/zh/media/C58.png deleted file mode 100755 index 25705606aa2e2edd60df2cb5b0fdf0371c6ddaa3..0000000000000000000000000000000000000000 Binary files a/docs/Quick_start/zh/media/C58.png and /dev/null differ diff --git a/docs/Quick_start/zh/media/C59.png b/docs/Quick_start/zh/media/C59.png new file mode 100644 index 0000000000000000000000000000000000000000..4a48d8867d37516fb3e77a6b693029ef3c2b933d Binary files /dev/null and b/docs/Quick_start/zh/media/C59.png differ diff --git a/docs/Quick_start/zh/media/C60.png b/docs/Quick_start/zh/media/C60.png index 34ec28ff9be071a55a84e46b34969e3b771b671a..10055841c98181681b5778f62852a658426d905b 100755 Binary files a/docs/Quick_start/zh/media/C60.png and b/docs/Quick_start/zh/media/C60.png differ diff --git a/docs/Quick_start/zh/media/C61.png b/docs/Quick_start/zh/media/C61.png index 4004bfb4deac611d258595bd72e248ef650f6b33..425216facdc92c607b9977efe5cdb85d9b154428 100755 Binary files a/docs/Quick_start/zh/media/C61.png and b/docs/Quick_start/zh/media/C61.png differ diff --git a/docs/Quick_start/zh/media/Document_Center.png b/docs/Quick_start/zh/media/Document_Center.png new file mode 100644 index 0000000000000000000000000000000000000000..9adb7443cbea1e2be4c7492b46126ef7b07bed63 Binary files /dev/null and b/docs/Quick_start/zh/media/Document_Center.png differ diff --git a/docs/Quick_start/zh/media/PyCharm_1.png b/docs/Quick_start/zh/media/PyCharm_1.png new file mode 100644 index 0000000000000000000000000000000000000000..000a1935cafafaa5e89a0655bcb4c97d1114b265 Binary files /dev/null and b/docs/Quick_start/zh/media/PyCharm_1.png differ diff --git a/docs/Quick_start/zh/media/QuecPytgon_sbs_file_01.png b/docs/Quick_start/zh/media/QuecPytgon_sbs_file_01.png new file mode 100644 index 0000000000000000000000000000000000000000..466b1f1fb45f3dfdf08323643c5f28dc903a14f8 Binary files /dev/null and b/docs/Quick_start/zh/media/QuecPytgon_sbs_file_01.png differ diff --git a/docs/Quick_start/zh/media/QuecPytgon_sbs_file_02.png b/docs/Quick_start/zh/media/QuecPytgon_sbs_file_02.png new file mode 100644 index 0000000000000000000000000000000000000000..2868e303c7ce1b0449da6ede66cc5356c354d674 Binary files /dev/null and b/docs/Quick_start/zh/media/QuecPytgon_sbs_file_02.png differ diff --git a/docs/Quick_start/zh/media/QuecPytgon_sbs_file_03.png b/docs/Quick_start/zh/media/QuecPytgon_sbs_file_03.png new file mode 100644 index 0000000000000000000000000000000000000000..e6fcbbfccacb82eb62ca3f6a599e96039c88cebe Binary files /dev/null and b/docs/Quick_start/zh/media/QuecPytgon_sbs_file_03.png differ diff --git a/docs/Quick_start/zh/media/QuecPytgon_sbs_file_04.png b/docs/Quick_start/zh/media/QuecPytgon_sbs_file_04.png new file mode 100644 index 0000000000000000000000000000000000000000..59c3914449b86438187224ce72994ab16fff3e79 Binary files /dev/null and b/docs/Quick_start/zh/media/QuecPytgon_sbs_file_04.png differ diff --git a/docs/Quick_start/zh/media/QuecPytgon_sbs_file_05.png b/docs/Quick_start/zh/media/QuecPytgon_sbs_file_05.png new file mode 100644 index 0000000000000000000000000000000000000000..64d17a03cdbdd0e8e85a726efe6639bc79c255c5 Binary files /dev/null and b/docs/Quick_start/zh/media/QuecPytgon_sbs_file_05.png differ diff --git a/docs/Quick_start/zh/media/QuecPytgon_sbs_file_06.png b/docs/Quick_start/zh/media/QuecPytgon_sbs_file_06.png new file mode 100644 index 0000000000000000000000000000000000000000..5dc87a6dbb42d6a5eef87b7afeab2192828976d7 Binary files /dev/null and b/docs/Quick_start/zh/media/QuecPytgon_sbs_file_06.png differ diff --git a/docs/Quick_start/zh/media/QuecPytgon_sbs_file_07.png b/docs/Quick_start/zh/media/QuecPytgon_sbs_file_07.png new file mode 100644 index 0000000000000000000000000000000000000000..f496e08fc9b36de7517538e1033d43a76a8fb185 Binary files /dev/null and b/docs/Quick_start/zh/media/QuecPytgon_sbs_file_07.png differ diff --git a/docs/Quick_start/zh/media/QuecPytgon_sbs_file_08.png b/docs/Quick_start/zh/media/QuecPytgon_sbs_file_08.png new file mode 100644 index 0000000000000000000000000000000000000000..84276166b760898edb6fdfb9355ff38be4b535bd Binary files /dev/null and b/docs/Quick_start/zh/media/QuecPytgon_sbs_file_08.png differ diff --git a/docs/Quick_start/zh/media/QuecPytgon_sbs_file_09.png b/docs/Quick_start/zh/media/QuecPytgon_sbs_file_09.png new file mode 100644 index 0000000000000000000000000000000000000000..0838311d68aeffa4894fec3b414462cab1b1b3c3 Binary files /dev/null and b/docs/Quick_start/zh/media/QuecPytgon_sbs_file_09.png differ diff --git a/docs/Quick_start/zh/media/QuecPytgon_sbs_file_10.png b/docs/Quick_start/zh/media/QuecPytgon_sbs_file_10.png new file mode 100644 index 0000000000000000000000000000000000000000..2ca722aac586bccabdd270dd2a254a768eb8e280 Binary files /dev/null and b/docs/Quick_start/zh/media/QuecPytgon_sbs_file_10.png differ diff --git "a/docs/little_demo/zh/QuecPythonTest/media/QuecPython_\350\276\223\345\205\245\346\215\225\350\216\267\345\260\217\345\256\236\351\252\214_01.png" "b/docs/Quick_start/zh/media/QuecPython_\350\276\223\345\205\245\346\215\225\350\216\267\345\260\217\345\256\236\351\252\214_01.png" similarity index 100% rename from "docs/little_demo/zh/QuecPythonTest/media/QuecPython_\350\276\223\345\205\245\346\215\225\350\216\267\345\260\217\345\256\236\351\252\214_01.png" rename to "docs/Quick_start/zh/media/QuecPython_\350\276\223\345\205\245\346\215\225\350\216\267\345\260\217\345\256\236\351\252\214_01.png" diff --git "a/docs/little_demo/zh/QuecPythonTest/media/QuecPython_\350\276\223\345\205\245\346\215\225\350\216\267\345\260\217\345\256\236\351\252\214_02.png" "b/docs/Quick_start/zh/media/QuecPython_\350\276\223\345\205\245\346\215\225\350\216\267\345\260\217\345\256\236\351\252\214_02.png" similarity index 100% rename from "docs/little_demo/zh/QuecPythonTest/media/QuecPython_\350\276\223\345\205\245\346\215\225\350\216\267\345\260\217\345\256\236\351\252\214_02.png" rename to "docs/Quick_start/zh/media/QuecPython_\350\276\223\345\205\245\346\215\225\350\216\267\345\260\217\345\256\236\351\252\214_02.png" diff --git "a/docs/little_demo/zh/QuecPythonTest/media/QuecPython_\350\276\223\345\205\245\346\215\225\350\216\267\345\260\217\345\256\236\351\252\214_03.png" "b/docs/Quick_start/zh/media/QuecPython_\350\276\223\345\205\245\346\215\225\350\216\267\345\260\217\345\256\236\351\252\214_03.png" similarity index 100% rename from "docs/little_demo/zh/QuecPythonTest/media/QuecPython_\350\276\223\345\205\245\346\215\225\350\216\267\345\260\217\345\256\236\351\252\214_03.png" rename to "docs/Quick_start/zh/media/QuecPython_\350\276\223\345\205\245\346\215\225\350\216\267\345\260\217\345\256\236\351\252\214_03.png" diff --git a/docs/Quick_start/zh/media/Quectel_sbs_Socket_course.png b/docs/Quick_start/zh/media/Quectel_sbs_Socket_course.png new file mode 100644 index 0000000000000000000000000000000000000000..45647602d435c7f31e6f6431ee862bad7f76fea9 Binary files /dev/null and b/docs/Quick_start/zh/media/Quectel_sbs_Socket_course.png differ diff --git a/docs/Quick_start/zh/media/Quectel_sbs_Socket_relation.png b/docs/Quick_start/zh/media/Quectel_sbs_Socket_relation.png new file mode 100644 index 0000000000000000000000000000000000000000..9ffe2a127ce0932449577fccf47b65099faeefdf Binary files /dev/null and b/docs/Quick_start/zh/media/Quectel_sbs_Socket_relation.png differ diff --git a/docs/Quick_start/zh/media/Start_to_abandon_01.jpg b/docs/Quick_start/zh/media/Start_to_abandon_01.jpg new file mode 100644 index 0000000000000000000000000000000000000000..98adaed786398a703feee8c663ce77bdf950d2cf Binary files /dev/null and b/docs/Quick_start/zh/media/Start_to_abandon_01.jpg differ diff --git a/docs/Quick_start/zh/media/Start_to_abandon_02.png b/docs/Quick_start/zh/media/Start_to_abandon_02.png new file mode 100644 index 0000000000000000000000000000000000000000..ae469d27a43852dca13558065c52fd2766f2ea39 Binary files /dev/null and b/docs/Quick_start/zh/media/Start_to_abandon_02.png differ diff --git a/docs/Quick_start/zh/media/Start_to_abandon_03.jpg b/docs/Quick_start/zh/media/Start_to_abandon_03.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ed4fe1432cffa71fd3121498f7d83e19ea3ecdf6 Binary files /dev/null and b/docs/Quick_start/zh/media/Start_to_abandon_03.jpg differ 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/media/c59.png b/docs/Quick_start/zh/media/c59.png deleted file mode 100755 index cd7546518a5eed93a62c504b936467997283b2c9..0000000000000000000000000000000000000000 Binary files a/docs/Quick_start/zh/media/c59.png and /dev/null differ diff --git a/docs/Quick_start/zh/media/c63.png b/docs/Quick_start/zh/media/c63.png index acff3bde0a35cad34cad857651675fa7eba94da5..0c2a8496510f468afa9dd58466b43904c981dc44 100755 Binary files a/docs/Quick_start/zh/media/c63.png and b/docs/Quick_start/zh/media/c63.png differ diff --git a/docs/Quick_start/zh/media/c65.png b/docs/Quick_start/zh/media/c65.png index 5f6c575df62ee9e01e58971b6aa7884de0a716da..c98202212282d578b2705c6238ceb8fa7ec2c18d 100755 Binary files a/docs/Quick_start/zh/media/c65.png and b/docs/Quick_start/zh/media/c65.png differ diff --git a/docs/Quick_start/zh/media/image-20210417104838076.png b/docs/Quick_start/zh/media/image-20210417104838076.png new file mode 100644 index 0000000000000000000000000000000000000000..5206d0512beab4dfb59b0eb522bd697a9cffe178 Binary files /dev/null and b/docs/Quick_start/zh/media/image-20210417104838076.png differ diff --git a/docs/Quick_start/zh/media/readme_1.png b/docs/Quick_start/zh/media/readme_1.png new file mode 100644 index 0000000000000000000000000000000000000000..51789476a6efc242259f33b2e7afb1432f2c89ab Binary files /dev/null and b/docs/Quick_start/zh/media/readme_1.png differ diff --git a/docs/Quick_start/zh/media/readme_10.png b/docs/Quick_start/zh/media/readme_10.png new file mode 100644 index 0000000000000000000000000000000000000000..68f76ccb4239962c24d7e6739046a63811d3151a Binary files /dev/null and b/docs/Quick_start/zh/media/readme_10.png differ diff --git a/docs/Quick_start/zh/media/readme_11.png b/docs/Quick_start/zh/media/readme_11.png new file mode 100644 index 0000000000000000000000000000000000000000..83209e323b8ca1a203265f2d5b98ddff4e09f00a Binary files /dev/null and b/docs/Quick_start/zh/media/readme_11.png differ diff --git a/docs/Quick_start/zh/media/readme_12.png b/docs/Quick_start/zh/media/readme_12.png new file mode 100644 index 0000000000000000000000000000000000000000..54c80c139e92f1ac825c2d06603eaa162eb92a87 Binary files /dev/null and b/docs/Quick_start/zh/media/readme_12.png differ diff --git a/docs/Quick_start/zh/media/readme_2.png b/docs/Quick_start/zh/media/readme_2.png new file mode 100644 index 0000000000000000000000000000000000000000..668a64649fc0861aab506b2ebb18c2f7e9a2af67 Binary files /dev/null and b/docs/Quick_start/zh/media/readme_2.png differ diff --git a/docs/Quick_start/zh/media/readme_3.png b/docs/Quick_start/zh/media/readme_3.png new file mode 100644 index 0000000000000000000000000000000000000000..07aecf4bad2c1dc03cc4ce0566cb1610158e027a Binary files /dev/null and b/docs/Quick_start/zh/media/readme_3.png differ diff --git a/docs/Quick_start/zh/media/readme_4.png b/docs/Quick_start/zh/media/readme_4.png new file mode 100644 index 0000000000000000000000000000000000000000..bd937d65808cf8de9ada02a5eef4783d3d3e209e Binary files /dev/null and b/docs/Quick_start/zh/media/readme_4.png differ diff --git a/docs/Quick_start/zh/media/readme_5.png b/docs/Quick_start/zh/media/readme_5.png new file mode 100644 index 0000000000000000000000000000000000000000..5bccaf329f8c622ae3b84928b6da717546e18905 Binary files /dev/null and b/docs/Quick_start/zh/media/readme_5.png differ diff --git a/docs/Quick_start/zh/media/readme_6.png b/docs/Quick_start/zh/media/readme_6.png new file mode 100644 index 0000000000000000000000000000000000000000..32c7e6d20c56de18fdb1611664fd75a920963b77 Binary files /dev/null and b/docs/Quick_start/zh/media/readme_6.png differ diff --git a/docs/Quick_start/zh/media/readme_7.png b/docs/Quick_start/zh/media/readme_7.png new file mode 100644 index 0000000000000000000000000000000000000000..a9994c317042f818fd1167f82f7444b3f765f35e Binary files /dev/null and b/docs/Quick_start/zh/media/readme_7.png differ diff --git a/docs/Quick_start/zh/media/readme_8.png b/docs/Quick_start/zh/media/readme_8.png new file mode 100644 index 0000000000000000000000000000000000000000..95bbe9b3d5d099e5cef199d0d40b800cc23265fe Binary files /dev/null and b/docs/Quick_start/zh/media/readme_8.png differ diff --git a/docs/Quick_start/zh/media/readme_9.png b/docs/Quick_start/zh/media/readme_9.png new file mode 100644 index 0000000000000000000000000000000000000000..8fbf4c08741337eeec98ec82f4a06017fb41a602 Binary files /dev/null and b/docs/Quick_start/zh/media/readme_9.png differ diff --git a/docs/Quick_start/zh/media/sbs_json_picture_1.png b/docs/Quick_start/zh/media/sbs_json_picture_1.png new file mode 100644 index 0000000000000000000000000000000000000000..9cd67d6d5297fa1639abcc81a6ddaccfffef1c21 Binary files /dev/null and b/docs/Quick_start/zh/media/sbs_json_picture_1.png differ diff --git a/docs/Quick_start/zh/media/sbs_json_picture_10.png b/docs/Quick_start/zh/media/sbs_json_picture_10.png new file mode 100644 index 0000000000000000000000000000000000000000..5604133ef3352c61a0b968dcee9761f2f7e7bc3a Binary files /dev/null and b/docs/Quick_start/zh/media/sbs_json_picture_10.png differ diff --git a/docs/Quick_start/zh/media/sbs_json_picture_2.png b/docs/Quick_start/zh/media/sbs_json_picture_2.png new file mode 100644 index 0000000000000000000000000000000000000000..df317173c3f1a7dad03f2d9d2a2da169a9840d77 Binary files /dev/null and b/docs/Quick_start/zh/media/sbs_json_picture_2.png differ diff --git a/docs/Quick_start/zh/media/sbs_json_picture_3.png b/docs/Quick_start/zh/media/sbs_json_picture_3.png new file mode 100644 index 0000000000000000000000000000000000000000..57e26aa96a7ee1b5f5b09314c6e2aed86f74fbba Binary files /dev/null and b/docs/Quick_start/zh/media/sbs_json_picture_3.png differ diff --git a/docs/Quick_start/zh/media/sbs_json_picture_4.png b/docs/Quick_start/zh/media/sbs_json_picture_4.png new file mode 100644 index 0000000000000000000000000000000000000000..9098be763e2becd22055e2f9cfb3099b647070c4 Binary files /dev/null and b/docs/Quick_start/zh/media/sbs_json_picture_4.png differ diff --git a/docs/Quick_start/zh/media/sbs_json_picture_5.png b/docs/Quick_start/zh/media/sbs_json_picture_5.png new file mode 100644 index 0000000000000000000000000000000000000000..12f9622180d5321748f1e4d4fc5dcfd21e5e625d Binary files /dev/null and b/docs/Quick_start/zh/media/sbs_json_picture_5.png differ diff --git a/docs/Quick_start/zh/media/sbs_json_picture_6.png b/docs/Quick_start/zh/media/sbs_json_picture_6.png new file mode 100644 index 0000000000000000000000000000000000000000..0df2069766be663bc7105bbe46d663ebc4b5b0ad Binary files /dev/null and b/docs/Quick_start/zh/media/sbs_json_picture_6.png differ diff --git a/docs/Quick_start/zh/media/sbs_json_picture_7.png b/docs/Quick_start/zh/media/sbs_json_picture_7.png new file mode 100644 index 0000000000000000000000000000000000000000..adb7828fa58fbedb678265e452059fb840cf6fc2 Binary files /dev/null and b/docs/Quick_start/zh/media/sbs_json_picture_7.png differ diff --git a/docs/Quick_start/zh/media/sbs_json_picture_8.png b/docs/Quick_start/zh/media/sbs_json_picture_8.png new file mode 100644 index 0000000000000000000000000000000000000000..6968b04a40787be856b302874a2f724b1c75cd76 Binary files /dev/null and b/docs/Quick_start/zh/media/sbs_json_picture_8.png differ diff --git a/docs/Quick_start/zh/media/sbs_json_picture_9.png b/docs/Quick_start/zh/media/sbs_json_picture_9.png new file mode 100644 index 0000000000000000000000000000000000000000..afb5724c7278216072d58b405bfff446b853c1d9 Binary files /dev/null and b/docs/Quick_start/zh/media/sbs_json_picture_9.png differ diff --git a/docs/Quick_start/zh/media/sbs_socket_picture_1.png b/docs/Quick_start/zh/media/sbs_socket_picture_1.png new file mode 100644 index 0000000000000000000000000000000000000000..513d870ad8946658bcedc2cdcb4bf096a42ef399 Binary files /dev/null and b/docs/Quick_start/zh/media/sbs_socket_picture_1.png differ diff --git a/docs/Quick_start/zh/media/sbs_socket_picture_10.png b/docs/Quick_start/zh/media/sbs_socket_picture_10.png new file mode 100644 index 0000000000000000000000000000000000000000..f44eabdd18c9a9d3e52a4fe0b59c14669fdd6352 Binary files /dev/null and b/docs/Quick_start/zh/media/sbs_socket_picture_10.png differ diff --git a/docs/Quick_start/zh/media/sbs_socket_picture_2.png b/docs/Quick_start/zh/media/sbs_socket_picture_2.png new file mode 100644 index 0000000000000000000000000000000000000000..0d93c15e64706c3f1fd6842c946253f9093d0d0c Binary files /dev/null and b/docs/Quick_start/zh/media/sbs_socket_picture_2.png differ diff --git a/docs/Quick_start/zh/media/sbs_socket_picture_3.png b/docs/Quick_start/zh/media/sbs_socket_picture_3.png new file mode 100644 index 0000000000000000000000000000000000000000..da9914445e775ab6aae8a3b2b38fcc3477ed393c Binary files /dev/null and b/docs/Quick_start/zh/media/sbs_socket_picture_3.png differ diff --git a/docs/Quick_start/zh/media/sbs_socket_picture_4.png b/docs/Quick_start/zh/media/sbs_socket_picture_4.png new file mode 100644 index 0000000000000000000000000000000000000000..20eacf5ea3837b5daafb5755eef6a459ad376be6 Binary files /dev/null and b/docs/Quick_start/zh/media/sbs_socket_picture_4.png differ diff --git a/docs/Quick_start/zh/media/sbs_socket_picture_5.png b/docs/Quick_start/zh/media/sbs_socket_picture_5.png new file mode 100644 index 0000000000000000000000000000000000000000..01b43cc768f6703d3b1e54f44b7cc3a1aa9cda33 Binary files /dev/null and b/docs/Quick_start/zh/media/sbs_socket_picture_5.png differ diff --git a/docs/Quick_start/zh/media/sbs_socket_picture_6.png b/docs/Quick_start/zh/media/sbs_socket_picture_6.png new file mode 100644 index 0000000000000000000000000000000000000000..ec4646739464a740ae9bf90c8fb7187cbec65db6 Binary files /dev/null and b/docs/Quick_start/zh/media/sbs_socket_picture_6.png differ diff --git a/docs/Quick_start/zh/media/sbs_socket_picture_7.png b/docs/Quick_start/zh/media/sbs_socket_picture_7.png new file mode 100644 index 0000000000000000000000000000000000000000..c524185af736bb2138c5ee76236883f91e93709b Binary files /dev/null and b/docs/Quick_start/zh/media/sbs_socket_picture_7.png differ diff --git a/docs/Quick_start/zh/media/sbs_socket_picture_8.png b/docs/Quick_start/zh/media/sbs_socket_picture_8.png new file mode 100644 index 0000000000000000000000000000000000000000..b3d41386fccd82b6641eb4c34bd99b01d4c8a564 Binary files /dev/null and b/docs/Quick_start/zh/media/sbs_socket_picture_8.png differ diff --git a/docs/Quick_start/zh/media/sbs_socket_picture_9.png b/docs/Quick_start/zh/media/sbs_socket_picture_9.png new file mode 100644 index 0000000000000000000000000000000000000000..884981ae1fb0ac2efb7ead8ebce1db6979001c3a Binary files /dev/null and b/docs/Quick_start/zh/media/sbs_socket_picture_9.png differ diff --git a/docs/Quick_start/zh/mqtt.md b/docs/Quick_start/zh/mqtt.md new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/docs/Quick_start/zh/repl.md b/docs/Quick_start/zh/repl.md new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/docs/Quick_start/zh/sidebar.yaml b/docs/Quick_start/zh/sidebar.yaml index 48b0cbbb882a0f0416ddf11d6fe8a4de612a386c..8fe45001eb01b793ea6bc60c00668966a612f2e7 100755 --- a/docs/Quick_start/zh/sidebar.yaml +++ b/docs/Quick_start/zh/sidebar.yaml @@ -1,6 +1,18 @@ # Quecpython 快速开始 items: - - label: QuecPython 开发环境搭建 + - label: QuecPython开发环境搭建 file: README.md - - label: QPYcom GUI工具使用 - file: QuecPythonHelloWord/README.md + - label: QuecPython快速入门 + file: Start_to_abandon.md + - label: repl&串口介绍 + file: repl.md + - label: GPIO操作说明 + file: GPIO.md + - label: socket操作说明 + file: socket.md + - label: mqtt连接阿里云ll + file: mqtt.md + - label: 定时器使用指导 + file: timer.md + - label: 文件读写使用指导 + file: file.md \ No newline at end of file diff --git a/docs/Quick_start/zh/socket.md b/docs/Quick_start/zh/socket.md new file mode 100644 index 0000000000000000000000000000000000000000..9321c58dec2f3ee0c26ca27ca1d6986e0c1d1ae4 --- /dev/null +++ b/docs/Quick_start/zh/socket.md @@ -0,0 +1,369 @@ +## 修订历史 + +| 版本 | 日期 | 作者 | 变更表述 | +| ----- | ---------- | ------- | -------------------------- | +| 1.0 | 2021-04-07 | Grey.Tu | 初版,Socket使用 | +| 1.1 | 2021-09-07 | Grey.Tu | 添加Socket_Json数据测试 | +| 1.1.2 | 2021-09-08 | Grey.Tu | 修改图片名称,删除冗余部分 | + + + +## Socket开发指导 + +本文主要介绍Socket套接字,读者通过对本文的了解,可以学习Socket套接字接口的基本操作。由于本文Socket通信涉及到JSON包发送接收与解析,本文也将简单介绍JSON格式。 + + + +## Socket概述 + +### Socket介绍 + +​ 所谓Socket(套接字),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个Socket就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,Socket上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口。 + +​ Socket可以看成是两个网络应用程序进行通信时,各自通信连接中的端点,这是一个逻辑上的概念。它是网络环境中进程间通信的API(应用程序编程接口),也是可以被命名和寻址的通信端点,使用中的每一个Socket都有其类型和一个与之相连进程。通信时其中一个网络应用程序将要传输的一段信息写入它所在主机的Socket中,该Socket通过与网络接口卡(NIC)相连的传输介质将这段信息送到另外一台主机的Socket中,使对方能够接收到这段信息。Socket是由IP地址和端口结合的,提供向应用层进程传送数据包的机制。 + +​ Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。 + +![Quectel_sbs_Socket_relation](media/Quectel_sbs_Socket_relation.png) + +### Socket过程 + +​ Socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开(open)→ +读写(write/read)→关闭(close)”模式来操作。在实现过程中服务端可以看作是web服务器,客户端可以看作是要访问web服务器的浏览器,访问过程就可以和打开→读写→关闭一一对应。 + +![Quectel_sbs_Socket_course](media/Quectel_sbs_Socket_course.png) + +### **Socket的应用** + +​ Socket可以使一个应用从网络中读取和写入数据,不同计算机上的两个应用可以通过连接发送和接受字节流,注意,当发送消息时,需要知道对方的IP和端口。在日常生活中有很多应用场景,当你浏览网页时,浏览器进程怎么与web服务器进程通信;当你用QQ聊天时,QQ进程怎么与服务器或好友所在的QQ进程通信,这些都是通过socket来实现的。 + + + +## JSON概述 + +### JSON介绍 + +JSON ( JavaScript Object Notation) ,是一种数据交互格式。 + +### 注意事项 + +- JSON 规定字符集是UTF-8,字符串必须使用"",Object 的键也必须使用"" +- 数组或对象的最后一个成员,不能加**逗号** + +### JSON 语法规则 + +JSON 语法是 JavaScript 对象表示法语法的子集。 + +- 数据在名称/值对中 +- 数据由逗号分隔 +- 花括号保存对象 +- 方括号保存数组 + +### JSON 名称/值对 + +JSON 数据的书写格式是:名称/值对。 + +名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值: + +```json +"firstName" : "John" +``` + +这很容易理解,等价于这条 JavaScript 语句: + +```json +firstName = "John" +``` + +### JSON 值 + +JSON 值可以是: + +- 数字(整数或浮点数) +- 字符串(在双引号中) +- 逻辑值(true 或 false) +- 数组(在方括号中) +- 对象(在花括号中) +- null + +### JSON 对象 + +JSON 对象在花括号中书写: + +对象可以包含多个名称/值对: + +```json +{ "firstName":"John" , "lastName":"Doe" } +``` + +这一点也容易理解,与这条 JavaScript 语句等价: + +```json +firstName = "John" +lastName = "Doe" +``` + +### JSON 数组 + +JSON 数组在方括号中书写: + +数组可包含多个对象: + +```json +{ +"employees": [ +{ "firstName":"John" , "lastName":"Doe" }, +{ "firstName":"Anna" , "lastName":"Smith" }, +{ "firstName":"Peter" , "lastName":"Jones" } +] +} +``` + +在上面的例子中,对象 "employees" 是包含三个对象的数组。每个对象代表一条关于某人(有姓和名)的记录。 + +### JS 内置两个Json方法 + +```json +JSON.stringify( {} , [ ] , "") +//参数一 :要序列化的数据(object) +//参数二 :控制对象的键值,只想输出指定的属性,传入一个数组 +//参数三 :序列化后,打印输出的格式(一个Tab ,可以更直观查看json) +``` + +任何把 JavaScript 变成 Json ,就是把这个对象序列化为Json字符串,然后才可以通过网络传递; + 收到一个Json格式的字符串, + +```json +JSON.parse( json.DATA ) //传入json字符串 +``` + +如果我们收到一个JSON格式的字符串,只需要把它反序列化成一个JavaScript对象,就可以在JavaScript中直接使用这个对象了。 + + + +## QuecPython Socket API介绍 + +具体的API详解请参考[usocket - socket模块](https://python.quectel.com/wiki/#/zh-cn/api/pythonStdlib?id=usocket-socket模块) + + + +## QuecPython Socket API介绍 + +具体的API详解请参考[ujson - JSON编码和解码](https://python.quectel.com/wiki/#/zh-cn/api/pythonStdlib?id=ujson-json编码和解码) + + + +## Socket功能实现 + +​ 在进行此功能测试之前需了解QuecPython基本操作,有关基本操作方法详见[《Quectel_QuecPython_基础操作说明》](https://python.quectel.com/doc/doc/sbs/zh/index.html)。本章节将通过介绍在QuecPython上创建一个TCP客户端连接服务器为例给大家介绍Socket功能。 + +​ 由于模块是作为TCP客户端去连接服务器,便需要在连接前有提供连接服务器。在此我们主要介绍模块的Socket功能,有关服务器部分内容大家另外了解。这边我们介绍较为简单的测试方式,使用网络资源:[安信可透传云 V1.0](http://tt.ai-thinker.com:8000/ttcloud);[谷雨云透传平台](https://cloud.iotxx.com/dashboard)或其他云透传平台进行测试。这些透传云平台提供了连接服务器;数据发送;数据接收;断开连接及通信显示等功能,比较适合前期通信测试。 + +### Socket基础交互实验 + +[安信可透传云 V1.0](http://tt.ai-thinker.com:8000/ttcloud)具有操作简单,不带其他任何协议的优点,本章便就[安信可透传云 V1.0](http://tt.ai-thinker.com:8000/ttcloud)来介绍Socket基础通信功能。在进行实验前请按照[《Quectel_QuecPython_基础操作说明》](https://python.quectel.com/doc/doc/sbs/zh/index.html)进入命令交互状态,然后进行以下操作。 + +#### 导入usocket模块,创建一个Socket实例: + +```python +import usocket +sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) +``` + +#### 打开[安信可透传云 V1.0](http://tt.ai-thinker.com:8000/ttcloud)查看需要连接的IP地址及端口号: + +![sbs_socket_picture_2](media/sbs_socket_picture_2.png) + +**注:**由于此服务器为网络共享资源,提供的IP地址与端口若三分钟没有设备建立连接会自动回收,固建立连接的过程需要在此时间内进行,不然将出现错误。 + +#### 建立与服务端的连接: + +```python +sock.connect(('122.114.122.174', 34187)) +``` + +**注:**1. API参数的IP地址与端口必须为服务器的IP地址与端口。 + +​ 2. 建立连接的API参数必须用“()”括起来,这是由于底层会将IP地址与端口号当一个参数传入。 + +![sbs_socket_picture_4](media/sbs_socket_picture_4.png) + +发送指令后可以在网址上看到模块已经上线,下面便可以进行数据交互了。 + +#### 模块上传数据: + +```python +>>> ret=sock.send('1234567890\r\n') +>>> print('send %d bytes' % ret) +send 12 bytes +``` + +![sbs_socket_picture_6](media/sbs_socket_picture_6.png) + +模块上传数据后可以在服务器上看到模块上传的数据。 + +#### 服务器下发数据: + +![sbs_socket_picture_7](media/sbs_socket_picture_7.png) + +服务器下发数据后模块端便可以读取数据,读取指令与读取效果如下: + +```python +>>> data=sock.recv(1024) +>>> print('recv %s bytes:' % len(data)) +recv 10 bytes: +>>> print(data.decode()) +0123456789 +``` + +#### 断开连接: + +```python +sock.close() +``` + +执行断开指令后服务器端的设备将会下线,如下图: + +![sbs_socket_picture_10](media/sbs_socket_picture_10.png) + +至此,模块做TCP客户端连接服务器完毕。 + +### Socket发送json代码实验 + +在Socket基础交互实验中我们介绍了Socket连接[安信可透传云 V1.0](http://tt.ai-thinker.com:8000/ttcloud)发送接收数据工程,相信大家已经有一定了解。下面我们使用代码的方式与[谷雨云透传平台](https://cloud.iotxx.com/dashboard)发送接收json数据并进行解析进行介绍。 + +#### [谷雨云透传平台](https://cloud.iotxx.com/dashboard)基础介绍 + +[谷雨云透传平台](https://cloud.iotxx.com/dashboard)略不同于[安信可透传云 V1.0](http://tt.ai-thinker.com:8000/ttcloud),设备需要先在平台新建后才可以使用,连接时需要进行简单的认证后才能真正连接。 + +##### 新建设备 + +![sbs_json_picture_1](media/sbs_json_picture_1.png) + +进入[谷雨云透传平台](https://cloud.iotxx.com/dashboard)网页后依次选择:谷雨直连 ==> 直连设备 ==> 创建直连设备,进入新建设备页面。 + +![sbs_json_picture_2](media/sbs_json_picture_2.png) + +进入新建设备页面后填写新建设备信息后点**提交**完成新建。**注:设备编号最好选择模块的IMEI号,需要确保唯一性。** + +![sbs_json_picture_3](media/sbs_json_picture_3.png) + +完成新建后可以在设备管理中看到新建的设备,如上图: + +##### 建立连接 + +[谷雨云透传平台](https://cloud.iotxx.com/dashboard)平台TCP连接的IP地址与端口号是固定的,不同于[安信可透传云 V1.0](http://tt.ai-thinker.com:8000/ttcloud)。所以在创建一个Socket实例后建立与服务端的连接时的语句也是固定的: + +![sbs_json_picture_4](media/sbs_json_picture_4.png) + +```python +sock.connect(('115.29.240.46', 9000)) +``` + +发送完连接命令后模块已经跟平台建立了联系,但还没连接上新建的设备。要连接上新建的设备需要通信的首条信息必须为**注册包**信息。由客户端发送给服务器进行验证。 + +![sbs_json_picture_5](media/sbs_json_picture_5.png) + +注册包指令可以通过设备页面查看到,如上图。 + +例如这个设备我们便可以发送下面指令与设备建立连接。 + +```python +sock.send('ep=868540051769632&pw=123456') +``` + +![sbs_json_picture_6](media/sbs_json_picture_6.png) + +建立连接后便可正常进行数据交互了。 + +#### Json发送实验代码 + +```python +# 导入模块 +import usocket +import ujson +import log +import utime +import checkNet + + +# 下面两个全局变量是必须有的,用户可以根据自己的实际项目修改下面两个全局变量的值, +# 在执行用户代码前,会先打印这两个变量的值。 +PROJECT_NAME = "QuecPython_Socket_example" +PROJECT_VERSION = "1.0.1" +checknet = checkNet.CheckNetwork(PROJECT_NAME, PROJECT_VERSION) + + +# | 参数 | 参数类型 | 说明 | +# | -------- | ------- | ------------------ | +# | CRITICAL | 常量 | 日志记录级别的数值 50 | +# | ERROR | 常量 | 日志记录级别的数值 40 | +# | WARNING | 常量 | 日志记录级别的数值 30 | +# | INFO | 常量 | 日志记录级别的数值 20 | +# | DEBUG | 常量 | 日志记录级别的数值 10 | +# | NOTSET | 常量 | 日志记录级别的数值 0 | +log.basicConfig(level=log.NOTSET) # 设置日志输出级别 +socket_log = log.getLogger("Socket") + + +if __name__ == '__main__': + # 手动运行本例程时,可以去掉该延时,如果将例程文件名改为main.py,希望开机自动运行时,需要加上该延时, + # 否则无法从CDC口看到下面的 poweron_print_once() 中打印的信息 + # utime.sleep(5) + checknet.poweron_print_once() + + # 如果用户程序包含网络相关代码,必须执行 wait_network_connected() 等待网络就绪(拨号成功); + # 如果是网络无关代码,可以屏蔽 wait_network_connected() + # 【本例程可以屏蔽下面这一行!】 + checknet.wait_network_connected() + socket_log.info('===============================================\r\n') + + sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) # 创建一个Socket实例 + sock.connect(('115.29.240.46', 9000)) # 连接平台 + sock.send('ep=868540051769632&pw=123456') # 发送注册包信息连接设备 + connect_data = sock.recv(1024) # 读取平台连接结果 + if connect_data.decode() == '[iotxx:ok]': + socket_log.info('Socket Connect OK\r\n') + + # 原始Dict数据 + socket_log.info('---------------Original Dict Data--------------') + inp = {'bar': ('baz', None, 1, 2)} + socket_log.info('Data: {} Type: {}\r\n'.format(inp, type(inp))) + + # 将Dict转换为json + socket_log.info('--------------Transform json Data--------------') + s = ujson.dumps(inp) + socket_log.info('Data: {} Type: {}'.format(s, type(s))) + ret = sock.send(s) # TCP发送Json数据 + socket_log.info('Socket Send %d bytes\r\n' % ret) + + while 1: + data = sock.recv(1024) + if len(data) > 0 and data.decode() != '[iotxx:ok]': + socket_log.info('----------------Socket Recv Data-----------------') + socket_log.info('Socket Recv Data: {} Len: {:03d}\r\n'.format(data.decode(), len(data))) + break + + sock.close() # 断开Socket连接 + socket_log.info('--------------------Socket end-------------------') + +``` + +#### 实验现象 + +运行代码,将Dict数据转换为json数据,发送json数据与服务器。 + +![sbs_json_picture_7](media/sbs_json_picture_7.png) + +服务器接收数据并显示。 + +![sbs_json_picture_8](media/sbs_json_picture_8.png) + +服务器发送数据给客户端,接收客户端断线指令。 + +![sbs_json_picture_9](media/sbs_json_picture_9.png) + +打印服务器下发的数据并关闭连接。 + +![sbs_json_picture_10](media/sbs_json_picture_10.png) + diff --git a/docs/Advanced_development/zh/QuecPythonSub/Timer.md b/docs/Quick_start/zh/timer.md similarity index 66% rename from docs/Advanced_development/zh/QuecPythonSub/Timer.md rename to docs/Quick_start/zh/timer.md index 07db42c1e9065fbae32502f5398183928735a805..3ce18df237a0ca4459e874c0f18ccf72a559fba1 100644 --- a/docs/Advanced_development/zh/QuecPythonSub/Timer.md +++ b/docs/Quick_start/zh/timer.md @@ -1,13 +1,23 @@ -# QuecPython Timer定时器开发 +## 修订历史 -文档主要基于EC600S介绍如何使用QuecPython\_Timer,定时器最常用的就是定时与计数,即可以作为精准延时处理,也可以在接通一个时钟源的前提下,统计总共有多少脉冲。通过本文你将了解到Timer的所有设置参数及使用方法。 +| 版本 | 日期 | 作者 | 变更表述 | +| ---- | ---------- | ------ | ---------------------------------------------------- | +| 1.0 | 2021-09-09 | Kayden | 增加修订历史,增加部分参考链接,更改代码下载链接位置 | + + + +## QuecPython Timer定时器开发 + +文档主要基于EC600S介绍如何使用QuecPython\_Timer,**其他模组操作类同**。定时器最常用的就是定时与计数,即可以作为精准延时处理,也可以在接通一个时钟源的前提下,统计总共有多少脉冲。通过本文你将了解到Timer的所有设置参数及使用方法。 ## 硬件描述 -目前开放共4个定时器 +目前开放共4个定时器,具体请参阅硬件支持文档进行确认:[硬件支持](https://python.quectel.com/doc/doc/Quecpython_intro/zh/Qp_Product_intro/Hardware_Support.html) ## 软件设计 +软件相关API介绍参考链接:https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=timer + ### 常量说明 | 常量 | 说明 | @@ -21,11 +31,11 @@ ### 创建Timer对象 -timer = Timer(Timern)。创建Timer对象接口参数介绍如下: +timer = Timer(Timer)。创建Timer对象接口参数介绍如下: -| 参数 | 类型 | 说明 | -|--------|------|------------------------------------------| -| Timern | int | 定时器号。EC600S支持定时器Timer0\~Timer3 | +| 参数 | 类型 | 说明 | +| ----- | ---- | ---------------------------------------- | +| Timer | int | 定时器号。EC600S支持定时器Timer0\~Timer3 | ### 启动定时器 @@ -50,23 +60,23 @@ timer.stop():关闭对应的定时器,无参数。 使用QPYcom工具和模组进行交互,下面实例是基于Timer0,Timer1。Timer2和Timer3配置类似。
-![](media/d255a2ca8359e29ec11c9302558c8730.png) +![](media/Timer_1.png) -
+
注意: 1. from machine import Timer即为让Timer模块在当前空间可见。 - 2. 只有from machine import Timer模块,才能使用Timer内的函数和变量。 +3. 上述操作没有连接任何外设,仅作为熟悉指令参考。 + -3. 上述操作没有连接任何外设,仅作为熟悉指令参考 ## 下载验证 ### 软件代码 -配套demo的参考代码为文档同目录下的timer_file.py文件。下载.py文件到模组运行,代码如下: +配套demo的参考代码为文档同目录下的timer_file.py文件。下载.py文件到模组运行,代码如下: 点击下载代码 ```python import log @@ -102,18 +112,13 @@ while state: 1. 打开QPYcom运行timer\_file.py,如下图: -
-![](media/d79a7e4c4f33637063273447996990c0.png) -
+ ![](media/Timer_2.png) + 2. 在QPYcom交互界面查看输出结果如下:
-![](media/7b7eed9267576d8033ab0fa72a075efb.png) +![](media/Timer_3.png) -
-## 配套代码 - - 下载代码 \ No newline at end of file diff --git a/docs/little_demo/zh/QuecPythonTest/ADC.md b/docs/little_demo/zh/QuecPythonTest/ADC.md deleted file mode 100644 index 5cb0d071848aaae948bc60f537a2b6222a68bc3a..0000000000000000000000000000000000000000 --- a/docs/little_demo/zh/QuecPythonTest/ADC.md +++ /dev/null @@ -1,111 +0,0 @@ -## ADC实验 - -文档主要基于 EC600S 介绍如何使用 QuecPython_ADC,Analog-to-Digital Converter的缩写。指的是模/数转换器或者模拟/数字转换器,可将连续变量的模拟信号转换为离散的数字信号的器件,简单地说就是将模拟电压值,转换成对应的肉眼可读数值。通过本文你将了解到EC600S_ADC 的所有设置参数及使用方法。 - -### 硬件描述 - -目前开放共 2 路 ADC。2 路 ADC 连接位置如下表所示: - -![](media/5c98f65b95739edcac696e1352614f0a.jpg) - -对应关系如下表: - -| 模组 PIN 脚编号 | 说明 | -| --------------- | ---------- | -| 19 | ADC 通道 0 | -| 20 | ADC 通道 1 | - -### 软件设计 - -#### 常量说明 - -| 常量 | 说明 | -| -------- | ---------- | -| ADC.ADC0 | ADC 通道 0 | -| ADC.ADC1 | ADC 通道 1 | - -#### 创建 **ADC** 对象 - -adc = ADC()。无参数,无返回值。 - -#### ADC功能初始化 - -adc.open(),无参数。 - -返回值:成功返回整型 0,失败返回整型-1。 - -#### 读取电压值 - -adc.read(ADCn):读取指定通道的电压值,单位 mV。 - -| 参数 | 参数类型 | 参数说明 | -| ---- | -------- | ------------------------------------------------------------ | -| ADCn | int | ADC 通道 注:EC600S 平台支持 ADC0,ADC1,对应引脚如下 ADC0 – 引脚号 19 ADC1 – 引脚号 20 | - -#### 关闭 ADC - -adc.close(),无参数。 - -返回值:成功返回整型 0,失败返回整型-1。 - -### 交互操作 - -使用 QPYcom 工具和模组进行交互,下面实例是基于 ADC0。 - -> ![](media/f2b300f1bfe287f568953e90440c2b31.jpg) -> -> 注意: - -1. from misc import ADC 即为让 ADC 模块在当前空间可见。 - -2. 只有 from misc import ADC 模块,才能使用 ADC 内的函数和变量。 - -3. 上述操作是在 ADC0 连接了光敏电阻(EC600S 开发板已外接)的情况下操作的,对于 - ADC1 需要自己连接外设进行相应操作。 - -### 下载验证 - -#### 软件代码 - -配套 demo 的参考代码为文档同目录下的 Timer.py 文件。下载.py文件到模组运行,代码如下: - -```python -from misc import ADC # 导入 ADC 模块 -import utime # 导入定时模块 -read_time = 5 # 设定读取次数 -adc = ADC() -while read_time: - adc.open() - read_data = adc.read(ADC.ADC0) - print(read_data) - adc.close() - read_time -= 1 - utime.sleep(1) # 延时 1S - -``` - - - -#### 硬件连接 - -无需另外的硬件连接,EC600S 的 ADC0接口已经外接光敏电阻,本文的下载验证就是利用光敏电阻进行辅助验证。 - -#### 运行效果 - -1. 打开 QPYcom 运行adc_file.py(运行同时保证光敏电阻接收不同程度的光照),如下图: - -
-![](media/c54638bf424884febcbbd9fd87cc4db4.jpg) -
- -1. 在 QPYcom 交互界面查看输出结果(数值会有所不同) - -
-![](media/31bd655eba27dc3311e3c628e942f1bb.jpg) -
- -### 下载代码 - - - 点击下载代码 - diff --git a/docs/little_demo/zh/QuecPythonTest/External_interrupt.md b/docs/little_demo/zh/QuecPythonTest/External_interrupt.md deleted file mode 100644 index 637b84a76a0899f2af11ab14d2d6b58473ad9be1..0000000000000000000000000000000000000000 --- a/docs/little_demo/zh/QuecPythonTest/External_interrupt.md +++ /dev/null @@ -1,143 +0,0 @@ -## 外部中断实验 - -### 概述 - -本文档主要基于EC600介绍如何使用QuecPython类库API来快速开发使用外部中断功能。 - -EC600 14个 外部中断引脚。 从GPIO1~GPIO14。 具体的映射看下后文函数的讲解。 - -### 使用说明 - -#### Exint创建对象 - -extint = ExtInt(GPIOn, mode, pull, callback) - -| 参数 | 类型 | 说明 | -| -------- | ---- | ------------------------------------------------------------ | -| GPIOn | int | 引脚号
EC100YCN平台引脚对应关系如下(引脚号为外部引脚编号):
GPIO1 – 引脚号22
GPIO2 – 引脚号23
GPIO3 – 引脚号38
GPIO4 – 引脚号53
GPIO5 – 引脚号54
GPIO6 – 引脚号104
GPIO7 – 引脚号105
GPIO8 – 引脚号106
GPIO9 – 引脚号107
GPIO10 – 引脚号178
GPIO11 – 引脚号195
GPIO12 – 引脚号196
GPIO13 – 引脚号197
GPIO14 – 引脚号198
GPIO15 – 引脚号199
GPIO16 – 引脚号203
GPIO17 – 引脚号204
GPIO18 – 引脚号214
GPIO19 – 引脚号215
EC600SCN平台引脚对应关系如下(引脚号为模块外部引脚编号):
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 | -| mode | int | 设置触发方式
IRQ_RISING – 上升沿触发
IRQ_FALLING – 下降沿触发
IRQ_RISING_FALLING – 上升和下降沿触发 | -| pull | int | PULL_DISABLE – 浮空模式
PULL_PU – 上拉模式
PULL_PD – 下拉模式 | -| callback | int | 中断触发回调函数 | - -#### enable 使能外部中断 - -使能extint对象外部中断,当中断引脚收到上升沿或者下降沿信号时,会调用callback执行。 - -参数:无 - -返回值:使能成功返回整型值0,使能失败返回整型值-1。 - -#### disable 禁止外部中断 - -禁用与extint对象关联的中断 。 - -参数:无 - -返回值:使能成功返回整型值0,使能失败返回整型值-1。 - -#### line 返回映射行号 - -返回引脚映射的行号。 - -参数:无 - -返回值:引脚映射的行号。 - -### 代码示例 - -将外部中断映射在GPIO71引脚上。 也就是S4按键.按下S4按键。 回调函数。 - -``` -''' - -File: External_interrupt.py - -Project: button - -File Created: Monday, 28th December 2020 3:03:43 pm - -Author: chengzhu.zhou - ------ - -Last Modified: Monday, 28th December 2020 3:03:47 pm - -Modified By: chengzhu.zhou - ------ - -Copyright 2020 - 2020 quectel - -''' - -from machine import ExtInt - -import utime as time - -''' - -EC600SCN平台引脚对应关系如下: - -GPIO1 – 引脚号71 - -GPIO2 – 引脚号72 - -GPIO3 – 引脚号73 - -GPIO4 – 引脚号74 - -GPIO5 – 引脚号75 - -GPIO6 – 引脚号76 - -GPIO7 – 引脚号77 - -''' - -# 参考自 http://qpy.quectel.com/wiki/#/zh-cn/api/?id=extint - -state = 2 - - - -def callBack(args): - - global state - - print("###interrupt %d ###" % args) - - state = state - 1 - - - -def main(): - - # 映射GPIO71的下降沿触发回调函数 - - extint = ExtInt(ExtInt.GPIO1, ExtInt.IRQ_FALLING, ExtInt.PULL_PU, callBack) - - # 等待按键按下,触发 - - while state: - - time.sleep_ms(10) - - pass - - # 停止映射外部中断 - - extint.disable() - - print("The main function has exited") - - - -if __name__ == "__main__": - - main() -``` - -### 配套代码 - - - 下载代码 \ No newline at end of file diff --git a/docs/little_demo/zh/QuecPythonTest/IIC.md b/docs/little_demo/zh/QuecPythonTest/IIC.md deleted file mode 100644 index b1bff6b53cd4b36287162e9003c8586e1145e9fa..0000000000000000000000000000000000000000 --- a/docs/little_demo/zh/QuecPythonTest/IIC.md +++ /dev/null @@ -1,109 +0,0 @@ -## IIC 实验 - -本文档主要基于 EC600 介绍如何使用 QuecPython 类库 API 来快速开发使用 I2C 功能。 EC600 拥有 1 个 I2C 板载 外设。连接着加速度传感器和温湿度传感器。 - -### 使用说明 - -#### I2C 创建对象 - -``` -from machine import I2C -i2c_obj = I2C(I2Cn, MODE) -``` - - - -| 参数 | 类型 | 说明 | -| ---- | ---- | ------------------------------------------------------------ | -| I2Cn | int | i2c 通路索引号 :
I2C.I2C0 : 0 (EC100Y)
I2C.I2C1 : 1 (EC600S) | -| MODE | int | i2c 的工作模式 :
I2C.STANDARD_MODE : 0 标准模式
I2C.FAST_MODE : 1 快速模式 | - - - -#### read 读取数据 - -``` -I2C.read(slaveaddress, addr,addr_len, r_data, datalen, delay) -``` - -| 参数 | 类型 | 说明 | -| ------------ | --------- | --------------------------------- | -| slaveaddress | int | i2c 设备地址 | -| addr | int | i2c 寄存器地址 | -| addr_len | int | 寄存器地址长度 | -| r_data | bytearray | 接收数据的字节数组 | -| datalen | int | 字节数组的长度 | -| delay | int | 延时,数据转换缓冲时间(单位 ms) | - - - -#### write 写数据 - -``` -I2C.write(slaveaddress, addr, addr_len, data, datalen) -``` - -| 参数 | 类型 | 说明 | -| ------------ | --------- | --------------- | -| slaveaddress | int | i2c 设备地址 | -| addr | int | i2c 寄存器地址 | -| addr_len | int | 寄存器地址长度 | -| data | bytearray | 写入的数据 | -| datalen | int | 写入数据的长度 | - - - -### 代码示例 - -写板载加速度传感器的寄存器, 并且回读。 - -```python -''' -File: i2c_base.py -Project: i2c -File Created: Wednesday, 30th December 2020 3:09:07 pm -Author: chengzhu.zhou ------ -Last Modified: Thursday, 7th January 2021 7:20:51 pm -Modified By: chengzhu.zhou ------ -Copyright 2021 - 2021 quectel -''' -from machine import I2C -''' -I2C使用示例 -''' - -# 参考 http://qpy.quectel.com/wiki/#/zh-cn/api/?id=i2c -# 设置日志输出级别 - - -def test_i2c(): - i2c_dev = I2C(I2C.I2C1, I2C.STANDARD_MODE) - addres = 0x19 - LIS2DH12_WHO_AM_I = 0x0F # 板载三轴加速度传感器 身份寄存器 - r_data = bytearray([0x00]) # 存储数据 - i2c_dev.read(addres, bytearray(LIS2DH12_WHO_AM_I), 1, - r_data, 1, 1) - print("read data lis2dh12 who_am_i reg 0x{0:02x}".format(list(r_data)[0])) - # 读写寄存器 - LIS2DH12_CTRL_REG2 = 0x21 # - w_data = [0x04] # 想要写的数据 - print("write 0x04 to 0x21") - i2c_dev.write(addres, bytearray(LIS2DH12_CTRL_REG2), 1, - bytearray(w_data), len(w_data)) - i2c_dev.read(addres, bytearray(LIS2DH12_CTRL_REG2), 1, - r_data, 1, 1) - print("read 0x{0:02x} from 0x{1:02x}".format( - list(r_data)[0], LIS2DH12_CTRL_REG2)) - print("test_i2c funcation has exited") - pass - -if __name__ == "__main__": - test_i2c() -``` - -### 配套代码 - - - 下载代码 \ No newline at end of file diff --git a/docs/little_demo/zh/QuecPythonTest/LCD.md b/docs/little_demo/zh/QuecPythonTest/LCD.md deleted file mode 100644 index b0d49129da9e7e1283056773bad2c793f4e6c6c7..0000000000000000000000000000000000000000 --- a/docs/little_demo/zh/QuecPythonTest/LCD.md +++ /dev/null @@ -1,476 +0,0 @@ -# 平台说明 - -​ 本实验例程基于 EC600S_QuecPython_EVB_V1.1 开发板完成。 - - - -## 开发板lcd接口说明 - -​ 本实验所使用的ST7789V lcd引脚定义与开发板的LCD接口是完全匹配的,可以直接插到开发板的LCD接口使用。开发板LCD接口如下: - -![Quectel_Qp_little_demo_lcd_01](media\Quectel_Qp_little_demo_lcd_01.png) - -| 开发板lcd引脚 | 引脚定义 | -| ------------- | ------------------------------ | -| GND | 电源地 | -| VCC_3V3 | 电源3.3V | -| LCD_SCL_3V3 | SPI总线时钟信号 | -| LCD_SDA_3V3 | SPI总线写数据信号 | -| LCD_RST_3V3 | 液晶屏复位控制信号,低电平复位 | -| LCD_DC_3V3 | 写寄存器/写数据控制信号 | -| LCD_BLK | 液晶屏背光控制信号 | - - - -## ST7789V lcd 接口说明 - -st7789v - - - -| lcd引脚 | 引脚定义 | -| ------- | ------------------------------ | -| GND | 电源地 | -| VCC | 电源3.3V | -| SCL | SPI总线时钟信号 | -| SDA | SPI总线写数据信号 | -| RES | 液晶屏复位控制信号,低电平复位 | -| DC | 写寄存器/写数据控制信号 | -| BLK | 液晶屏背光控制信号 | - -# 接线方式 - -​ 以下为1.14inch ST7789V液晶屏模块与 EC600S_QuecPython_EVB_V1.1 模块的接线对应关系。EC600S_QuecPython_EVB_V1.1 模块 LCD 接口定义请参考该开发板的模块原理图。 - -| 1.14inch ST7789V LCD模块引脚 | EC600S_QuecPython_EVB_V1.1 引脚 | -| ---------------------------- | ------------------------------- | -| GND | GND | -| VCC | VCC_3V3 | -| SCL | LCD_SCL_3V3 | -| SDA | LCD_SDA_3V3 | -| RES | LCD_RST_3V3 | -| DC | LCD_DC_3V3 | -| BLK | LCD_BLK | - - - -# 软件说明 - -​ 本示例中的接口是基于QuecPython 的machine.LCD库实现,具体可阅读示例程序的源码。 - -## 文件说明 - -| 文件 | 描述 | -| ------------------------ | ------------------------------------------------------------ | -| st7789v.py | 包含驱动IC为ST7789V的液晶屏驱动程序以及显示字符与图片等接口。 | -| fonts.py | 示例程序中用到的字库。 | -| image.py | 示例程序中用到的图片数据。 | -| example_display_image.py | 显示图片主程序,调用其它几个文件中的方法与数据。 | -| example_display_char.py | 显示字符主程序,调用其它几个文件中的方法与数据。 | - - - -## ST7789V LCD 驱动方法使用说明 - -### 创建st7789v对象 - -> **from usr import st7789v** -> -> **lcd_st7789v = st7789v.ST7789V(width, hight)** - -* 功能: - - 创建一个lcd对象,进行lcd初始化。 - -* 参数: - -| 参数 | 类型 | 说明 | -| ----- | ---- | ---------- | -| width | 整型 | 显示屏的宽 | -| hight | 整型 | 显示屏的高 | - -* 返回值: - - 返回一个lcd对象。 - -* 示例: - -```python -from usr import st7789v -lcd_st7789v = st7789v.ST7789V(240, 240) -``` - - - -### 显示单个字符 - -> **lcd_st7789v.lcd_show_char(x, y, xsize, ysize, ch_buf, fc, bc)** - -* 功能: - - 单个字符显示,可显示汉字和ASCII字符。 - -* 参数: - -| 参数 | 类型 | 说明 | -| ------ | ------------ | ----------------------------- | -| x | 整型 | x轴起点坐标 | -| y | 整型 | y轴起点坐标 | -| xsize | 整型 | 待显示字符的宽 | -| ysize | 整型 | 待显示字符的高 | -| ch_buf | 元组或列表 | 存放待显示字符的字模数据 | -| fc | 16位十六进制 | 字体颜色,如 0x0000 表示黑色 | -| bc | 16位十六进制 | 背景颜色,如 0xFFFF 表示白色 | - -* 返回值: - - 无 - - - -### 单个ASCII字符显示 - -> **lcd_st7789v.lcd_show_ascii(x, y, xsize, ysize, ch, fc, bc)** - -* 功能: - - ASCII字符显示,目前支持8x16、16x24的字体大小,如果需要其他字体大小需要自己增加对应大小的字库数据,并在该函数中增加这个对应字库的字典。 - -* 参数: - -| 参数 | 类型 | 说明 | -| ----- | ------------ | ----------------------------- | -| x | 整型 | x轴起点坐标 | -| y | 整型 | y轴起点坐标 | -| xsize | 整型 | 待显示字符的宽 | -| ysize | 整型 | 待显示字符的高 | -| ch | 字符 | 待显示的ASCII字符 | -| fc | 16位十六进制 | 字体颜色,如 0x0000 表示黑色 | -| bc | 16位十六进制 | 背景颜色,如 0xFFFF 表示白色 | - -* 返回值: - - 无 - - - -### ASCII字符串显示 - -> **lcd_st7789v.lcd_show_ascii_str(x, y, xsize, ysize, str, fc, bc)** - -* 功能: - - ASCII字符串显示,显示顺序,以设置的起始坐标开始自左向右显示。示例中只提供了8x16大小的ascii字符,如果用户需要其他大小的字符,需要自己重新制作字库,并在` lcd_st7789v.lcd_show_ascii(x, y, xsize, ysize, ch, fc, bc)` 接口中增加对新增字库的支持。 - - 注意,要确定传入的字符串能够在当前行显示完,即传入字符串总长度乘以单个字符宽度的值 ,加上起始坐标x的值不能超过屏宽,否则程序会直接报错,提示超过显示范围。 - -参数: - -| 参数 | 类型 | 说明 | -| ----- | ------------ | ----------------------------- | -| x | 整型 | x轴起点坐标 | -| y | 整型 | y轴起点坐标 | -| xsize | 整型 | 待显示字符的宽 | -| ysize | 整型 | 待显示字符的高 | -| str | 字符串 | 待显示的ASCII字符 | -| fc | 16位十六进制 | 字体颜色,如 0x0000 表示黑色 | -| bc | 16位十六进制 | 背景颜色,如 0xFFFF 表示白色 | - -* 返回值: - - 无。 - - - -### 单个汉字显示 - -> **lcd_st7789v.lcd_show_chinese(x, y, xsize, ysize, ch, fc, bc)** - -* 功能: - - 汉字显示,目前支持示例中几个汉字的16x16、16x24、24x24的字体大小,如果需要显示其他汉字以及其他字体大小需要自己增加对应大小的字库数据,并在该函数中增加这个对应字库的字典。 - -* 参数: - -| 参数 | 类型 | 说明 | -| ----- | ------------ | ----------------------------- | -| x | 整型 | x轴起点坐标 | -| y | 整型 | y轴起点坐标 | -| xsize | 整型 | 待显示字符的宽 | -| ysize | 整型 | 待显示字符的高 | -| ch | 字符 | 待显示的汉字 | -| fc | 16位十六进制 | 字体颜色,如 0x0000 表示黑色 | -| bc | 16位十六进制 | 背景颜色,如 0xFFFF 表示白色 | - -* 返回值: - - 无 - - - -### 汉字字符串显示 - -> **lcd_st7789v.lcd_show_chinese_str(x, y, xsize, ysize, str, fc, bc)** - -* 功能: - - 汉字字符串显示,显示顺序,以设置的起始坐标开始自左向右显示。示例中只提供了用到的几个汉字的16x16大小的字库,如果用户需要其他大小的字符,需要自己重新制作字库,并在 `lcd_st7789v.lcd_show_chinese(x, y, xsize, ysize, str, fc, bc)` 接口中增加对新增字库的支持。 - - 注意,要确定传入的字符串能够在当前行显示完,即传入汉字个数乘以单个汉字宽度的值 ,加上起始坐标x的值不能超过屏宽,否则程序会直接报错,提示超过显示范围。 - -* 参数: - -| 参数 | 类型 | 说明 | -| ----- | ------------ | ----------------------------------- | -| x | 整型 | x轴起点坐标 | -| y | 整型 | y轴起点坐标 | -| xsize | 整型 | 待显示字符的宽 | -| ysize | 整型 | 待显示字符的高 | -| str | 字符串 | 待显示的汉字字符串,比如 '移远通信' | -| fc | 16位十六进制 | 字体颜色,如 0x0000 表示黑色 | -| bc | 16位十六进制 | 背景颜色,如 0xFFFF 表示白色 | - -* 返回值: - - 无。 - - - -### 显示小尺寸图片 - -> **lcd_st7789v.lcd_show_image(image_data, x, y, width, heigth)** - -* 功能: - - 显示图片,该方法适合显示尺寸较小的图片,如果图片分辨率(宽高)小于80x80,可直接用该方法一次性将图片数据写入显示。 - -* 参数: - -| 参数 | 类型 | 说明 | -| ---------- | ---------- | ----------------------- | -| image_data | 元组或列表 | 存放待显示图片的RGB数据 | -| x | 整型 | x轴起点坐标 | -| y | 整型 | y轴起点坐标 | -| width | 整型 | 待显示图片的宽度 | -| heigth | 字符 | 待显示图片的高度 | - -* 返回值: - - 无 - - - -### 显示大尺寸图片 - -> **lcd_st7789v.lcd_show_image_file(path, x, y, width, heigth, h)** - -* 功能: - - 显示图片,该方法适合显示尺寸较大的图片,如果图片分辨率(宽高)大于80x80,需要使用该方法来显示。该方法从文件中读取图片数据分段写入。分段写入原理如下: - - 假如要显示图片的分辨率(宽高)为 width*heigth,将待显示的图片分成若干宽高为 width * h 大小的图片,最后一块高度不足h的按实际高度计算,h为分割后每个图片的高度,可由用户通过参数 h 指定,h的取值应该满足关系: `width * h * 2 < 4096` - -参数: - -| 参数 | 类型 | 说明 | -| ------ | ------ | ---------------------------------------------------------- | -| path | string | 存放图片数据的txt文件路径,包含文件名,如 '/usr/image.txt' | -| x | int | x轴显示起点 | -| y | int | y轴显示起点 | -| width | int | 图片宽度 | -| heigth | int | 图片高度 | -| h | int | 分割后每个图片的高度 | - -* 返回值: - - 无 - -示例: - -假如要显示一张240x240的图片,图片如下: - -![Quectel_Qp_little_demo_lcd_02](media\Quectel_Qp_little_demo_lcd_02.jpg) - -(1)使用Image2Lcd 软件获取图片色彩数据 - -![Quectel_Qp_little_demo_lcd_03](media\Quectel_Qp_little_demo_lcd_03.png) - -(2)得到数据如下图1、2,将该 .c 文件中头部和尾部多余部分都删除,只保留中间的数据部分,确保处理后的数据第一行就是数据,且最后没有多余行,每一行前面没有空格等多余字符 - -![Quectel_Qp_little_demo_lcd_04](media\Quectel_Qp_little_demo_lcd_04.png) - -![Quectel_Qp_little_demo_lcd_05](media\Quectel_Qp_little_demo_lcd_05.png) - -(3)将处理后的图片数据文件保存为txt格式文件,假设命名为image.txt - -(4)将image.txt文件上传到开发板模块中【注意,此时没有image.py文件,不需要 from usr import image】 - -(5)在主程序 example_display_image.py 中,使用如下代码来显示该图片 - -```python -# -*- coding: UTF-8 -*- - - -import utime -''' -如果用户使用的固件版本中没有checkNet库,请将checkNet.mpy文件上传到模块的usr目录, -并将 import checkNet 改为 from usr import checkNet -''' -import checkNet -from usr import st7789v -# from usr import image - -''' -下面两个全局变量是必须有的,用户可以根据自己的实际项目修改下面两个全局变量的值, -在执行用户代码前,会先打印这两个变量的值。 -''' -PROJECT_NAME = "QuecPython_ST7789V_LCD_Example" -PROJECT_VERSION = "1.0.0" - -checknet = checkNet.CheckNetwork(PROJECT_NAME, PROJECT_VERSION) -lcd_st7789v = st7789v.ST7789V(240, 240) - - -if __name__ == '__main__': - ''' - 手动运行本例程时,可以去掉该延时,如果将例程文件名改为main.py,希望开机自动运行时,需要加上该延时, - 否则无法从CDC口看到下面的 poweron_print_once() 中打印的信息 - ''' - # utime.sleep(5) - checknet.poweron_print_once() - - ''' - 如果用户程序包含网络相关代码,必须执行 wait_network_connected() 等待网络就绪(拨号成功); - 如果是网络无关代码,可以屏蔽 wait_network_connected() - ''' - # checknet.wait_network_connected() - - # 用户代码 - '''######################【User code star】#####################################''' - - # 显示一张240*240大小的图片 - lcd_st7789v.lcd_show_image_file("/usr/image.txt", 0, 0, 240, 240, 8) - - '''######################【User code end 】#####################################''' - -``` - -显示结果: - - -![Quectel_Qp_little_demo_lcd_06](media\Quectel_Qp_little_demo_lcd_06.jpg) - - - -# 实验操作 - - - -## 显示图片 - -​ 在实验例程的目录下,找到【显示图片】目录,进入该目录下,有如下几个源码文件: - -| 文件 | 说明 | -| ------------------------ | ------------------------------------------------------------ | -| st7789v.py | 包含 ST7789V lcd 驱动初始化、写ASCII字符、写汉字以及显示图片的方法接口。 | -| image.py | 示例图片的RGB数据 | -| example_display_image.py | 主程序,调用st7789v.py和image.py中接口及信息来实现图片显示 | -| fonts.py | 字库,提供常见ASCII字符的两种大小的字库,分别是8x16和16x24,同时包含了实验中用到汉字的几种不同大小的字库。用户可根据自己的需要制作字库,使用PCtoLCD2002软件,参照fonts.py中说明来制作。 | - - - -### 实验步骤 - -(1)将240*240的显示屏正确接到模块上; -(2)将本目录的4个py文件(st7789v.py、image.py、fonts.py、example_display_image.py)拷贝到模块的usr目录下; -(3)进入模块的命令行,执行如下指令即可看到显示屏显示图片: - -``` -import example -example.exec('usr/example_display_image.py') -``` - - - -### 实验结果 - -![Quectel_Qp_little_demo_lcd_07](media\Quectel_Qp_little_demo_lcd_07.png) - - - - - -## 显示字符 - -​ 在实验例程的目录下,找到【显示字符】目录,进入该目录下,有如下几个源码文件: - -| 文件 | 说明 | -| ----------------------- | ------------------------------------------------------------ | -| st7789v.py | 包含 ST7789V lcd 驱动初始化、写ASCII字符、写汉字以及显示图片的方法接口。 | -| fonts.py | 字库,提供常见ASCII字符的两种大小的字库,分别是8x16和16x24,同时包含了实验中用到汉字的几种不同大小的字库。用户可根据自己的需要制作字库,使用PCtoLCD2002软件,参照fonts.py中说明来制作。 | -| example_display_char.py | 主程序,调用st7789v.py和fonts.py中接口及信息来实现ASCII字符的显示与汉字的显示。 | - -### 实验步骤 - -(1)将240*240的显示屏正确接到模块上; -(2)将本目录的3个py文件(st7789v.py、fonts.py、example_display_char.py)拷贝到模块的usr目录下; -(3)进入模块的命令行,执行如下指令即可看到显示屏显示图片: - -``` -import example -example.exec('usr/example_display_char.py') -``` - - - -### 实验结果 - -![Quectel_Qp_little_demo_lcd_08](media\Quectel_Qp_little_demo_lcd_08.jpg) - - - -# 字符和图片取模工具使用 - -## 工具简介 - -(1)Image2Lcd - -Image2Lcd 软件用于图片取模,可以提取单色和彩色图片。 - -(2)PCtoLCD2002 - -PCtoLCD2002 是一款字符取模软件,可以生成汉字、英文以及标点符号的字模数据。 - - - -## 如何对图片取模 - -(1)打开 Image2Lcd 软件,点击【打开】按钮,选择要显示的图片; - -![Quectel_Qp_little_demo_lcd_09](media\Quectel_Qp_little_demo_lcd_09.png) - -(2)输出数据类型选择【C语言数组(*.c)】,扫描方式选择【水平扫描】,输出灰度一定要选择【16位真彩色】; - -(3)设置图片的最大宽度和高度,实际输出大小以上图中最下方的【输出图像:(xx, yy)】部分显示为准; - -(4)点击【保存】按钮,得到图片的取模数据,将其放到元组中保存即可。 - - - -## 如何对字符取模 - -(1)打开 PCtoLCD2002 软件,依次点击【模式】-【字符模式(W)】; - -(2)根据需要选择字体,设置字体大小等; - -![字符取模1](media\Quectel_Qp_little_demo_lcd_10.png) - -(3)点击齿轮图标,进入如下所示界面,选择 【阴码】、【逐行式】、【顺向】、【C51格式】,点击确定; - -![字符取模2](media\Quectel_Qp_little_demo_lcd_11.png) - -(4)输入要取模的字符后,点击【生成字模】,即可得到对应的字模数据,按照示例 fonts.py 文件中的格式,将字模数据保存到字典中。 - -# 配套代码 - - 下载实验材料 \ No newline at end of file diff --git a/docs/little_demo/zh/QuecPythonTest/PM.md b/docs/little_demo/zh/QuecPythonTest/PM.md deleted file mode 100644 index d6b52ff707d185e56d0eba1112a7237a0a062bcd..0000000000000000000000000000000000000000 --- a/docs/little_demo/zh/QuecPythonTest/PM.md +++ /dev/null @@ -1,55 +0,0 @@ -## 待机唤醒实验 - -文档主要介绍如何实现产品低功耗,许多便携式、手持式、移动式产品为拥有较长的续航能力,需要用低功耗设计,能在较低功耗的环境下正常工作。下面主要从软件设计方面讲解,通过阅读本文,您将了解到pm 模块的实现低功耗处理和验证实验理论。 - -### 硬件描述 - -模组内置自动低功耗功能,无需外置器件,仅用软件就可以实现低功耗。 - -### 软件设计 - -> 模组内置的低功耗模式,在无业务处理时使系统进入休眠状态,进入低功耗模式,具备自动休眠控制。 - -通俗点说,就是只要程序调用 utime.sleep()函数,系统就自动进入低功耗模式。 - -设计低功耗程序的时候,要考虑什么时候执行业务,什么时候进入休眠,休眠多长时间,执行业务时通常尽量在极短的时间完成,然后进入第一段较长的休眠时间,这样的程序领产品的续航时间更长。 - -以下示例代码,开启自动休眠模式控制,然后执行 utime.sleep()就可以休眠了。 - -```python -def main(): - lpm_fd = pm.create_wakelock("test_lock", len("test_lock")) # 创建 wake_lock 锁 - pm.autosleep(1) # 自动休眠模式控制 - while True: - print("sleep") - utime.sleep(5) # 延时 并 休眠 5 秒钟 - res = pm.wakelock_lock(lpm_fd) # 加锁 禁止进入休眠状态 - print(res) - print("ql_lpm_idlelock_lock, g_c1_axi_fd = %d" % lpm_fd) - print("not sleep") - utime.sleep(5) # 只延时,不休眠 - res = pm.wakelock_unlock(lpm_fd) # 解锁 继续 自动休眠模式 - print(res) - print("ql_lpm_idlelock_unlock, g_c1_axi_fd = %d" % lpm_fd) - num = pm.get_wakelock_num() # 获取已创建锁的数量 - print(num) # 打印已创建锁的数量 -``` - -接下来就可以下载验证了,python 代码不需要编译,直接通过 QPYcom 工具把.py -文件下载到模块中运行。 - -### 下载验证 - -下载.py 文件到模组运行: - -
-![](media/357a598b34f88d768af40348b0f25494.jpg) - -
- -下载之后,代码在延时的时候自动进入休眠,功耗降低。 - -### 配套代码 - - - 下载代码 \ No newline at end of file diff --git a/docs/little_demo/zh/QuecPythonTest/PWM.md b/docs/little_demo/zh/QuecPythonTest/PWM.md deleted file mode 100644 index 3c753dc44e8fd354794560db522e62f5011849c2..0000000000000000000000000000000000000000 --- a/docs/little_demo/zh/QuecPythonTest/PWM.md +++ /dev/null @@ -1,123 +0,0 @@ -## PWM输出实验 - -本文档主要基于 EC600 介绍如何使用 QuecPython 类库 API 来快速开开发使用 **pwm** 功能。 EC600 拥有 6 个 pwm 外设。 暂时还没有引脚重映射的功能。只能将外设固定对应的引脚使用。 - -1. PWM0 – 引脚号 52 - -1. PWM1 – 引脚号 53 - -1. PWM2 – 引脚号 57 - -1. PWM3 – 引脚号 56 - -1. PWM4 – 引脚号 70 - -1. PWM5 – 引脚号 69 - - - -### 使用说明 - -#### pwm 创建对象 - -示例代码参考以下代码清单: - -``` -from misc import PWM -pwm0 = PWM(PWM.PWMn,PWM.ABOVE_xx,highTime,cycleTime) -``` - -| 参数 | 参数类型 | 参数说明 | -| ------------ | ------------- | -------------------------------------- | -| PWM.PWMn | PWM.PWM0 | PWM0 | -| | PWM.PWM1 | PWM1 | -| | PWM.PWM2 | PWM2 | -| | PWM.PWM3 | PWM3 | -| PWM.ABOVE_xx | PWM.ABOVE_MS | ms 级 取值 (0,1023) | -| | PWM.ABOVE_1US | us 级 取值 (0,157) | -| | PWM.ABOVE_10U | Sus 级 取值 (1,1575) | -| highTime | int | ms 级时:单位 ms
us 级时:单位 us | -| cycleTime | int | ms 级时:单位 ms
us 级时:单位 us | - -#### pwm.open 打开设备 - -开启 PWM 输出。 - -参数 : 无 - -返回值 : 成功返回整型 0,失败返回整型 -1。 - -#### pwm.cloes 关闭设备 - -关闭 PWM 输出。 - -参数 : 无 - -返回值 : 成功返回整型 0,失败返回整型 -1。 - - - -### 代码示例 - -```python -''' -File: pwm_demo.py -Project: pwm -File Created: Wednesday, 23rd December 2020 11:21:14 am -Author: chengzhu.zhou ------ -Last Modified: Tuesday, 29th December 2020 4:38:49 pm -Modified By: chengzhu.zhou ------ -Copyright 2020 - 2020 quectel -''' - - -from misc import PWM -import utime as time -""" -PWM号 -注:EC100YCN平台,支持PWM0-PWM5,对应引脚如下: -PWM0 – 引脚号19 -PWM1 – 引脚号18 -PWM2 – 引脚号16 -PWM3 – 引脚号17 -PWM4 – 引脚号23 -PWM5 – 引脚号22 -注:EC600SCN平台,支持PWM0-PWM5,对应引脚如下: -PWM0 – 引脚号52 -PWM1 – 引脚号53 -PWM2 – 引脚号57 -PWM3 – 引脚号56 -PWM4 – 引脚号70 -PWM5 – 引脚号69 -""" - - -def main(): - # config cysle 200ms , config high voltage 100ms , - # in other words , config duty cycle as %50 - pwm_obj = PWM(PWM.PWM0, PWM.ABOVE_MS, 100, 200) - # - pwm_obj.open() - time.sleep(10) - pwm_obj.close() - print("pwm Demo run successfully") - pass - - -if __name__ == "__main__": - main() - -``` - - - -代码串讲: 将 PWM0 设备 设置为周期 200ms, 高电平为 100ms 的输出。 运行代码,使用示波器抓取 PWM 0 对应的 52 号引脚电压。可得到如下图案。 - -![Quectel-QuecPythonPwm输出小实验_01](media/Quectel-QuecPythonPwm输出小实验_01.png) - -### 配套代码 - - - 下载代码 \ No newline at end of file diff --git a/docs/little_demo/zh/QuecPythonTest/README.md b/docs/little_demo/zh/QuecPythonTest/README.md deleted file mode 100644 index 1b59284a7a434c2e9e97924ee0fe3bda09b2bcb2..0000000000000000000000000000000000000000 --- a/docs/little_demo/zh/QuecPythonTest/README.md +++ /dev/null @@ -1,43 +0,0 @@ -# QuecPython小实验 - -## 总线: - -[QuecPython 跑马灯实验](/zh-cn/QuecPythonTest/LED.md) - -[QuecPython 蜂鸣器实验](/zh-cn/QuecPythonTest/buzzer.md) - -[QuecPython 按键输入实验](/zh-cn/QuecPythonTest/button.md) - -[QuecPython 串口实验](/zh-cn/QuecPythonTest/uart.md) - -[QuecPython 外部中断实验](/zh-cn/QuecPythonTest/External_interrupt.md) - -[QuecPython 独立看门狗实验](/zh-cn/QuecPythonTest/WDT.md) - -[QuecPython PWM 输出实验](/zh-cn/QuecPythonTest/PWM.md) - -[QuecPython 待机唤醒实验](/zh-cn/QuecPythonTest/PM.md) - -[QuecPython RTC 实验](/zh-cn/QuecPythonTest/RTC.md) - -[QuecPython ADC 实验](/zh-cn/QuecPythonTest/ADC.md) - -[QuecPython IIC 实验](/zh-cn/QuecPythonTest/IIC.md) - -[QuecPython 录音实验](/zh-cn/QuecPythonTest/record.md) - -[QuecPython 输入捕获实验](/zh-cn/QuecPythonTest/GPIO.md) - -[QuecPython LCD 实验](/zh-cn/QuecPythonTest/LCD.md) - -## 传感器 - -[QuecPython 内部温度传感器实验](/zh-cn/QuecPythonTest/i2c_aht.md) - -[QuecPython 光敏传感器实验](/zh-cn/QuecPythonTest/Photoresistor.md) - -[QuecPython 加速度传感器](/zh-cn/QuecPythonTest/i2c_lis2dh.md) - -[QuecPython 步进电机驱动实验](/zh-cn/QuecPythonTest/ebf_smd4805.md) - -[QuecPython 继电器实验](/zh-cn/QuecPythonTest/relay.md) \ No newline at end of file diff --git a/docs/little_demo/zh/QuecPythonTest/RTC.md b/docs/little_demo/zh/QuecPythonTest/RTC.md deleted file mode 100644 index c76feb12fa4ed8a4acf15bb1e86d1a7021e9d11b..0000000000000000000000000000000000000000 --- a/docs/little_demo/zh/QuecPythonTest/RTC.md +++ /dev/null @@ -1,88 +0,0 @@ -## RTC实验 - -文档主要介绍 RTC,RTC 是实时时钟的英文缩写(Real_TimeClock),日常生活中,我们都习惯按时吃饭,按时约会,按时送货,可以实时时钟对我们是非常重要的,RTC就是模组内置的实时时钟功能。下面主要从软件设计方面讲解,通过阅读本文,您将了解到RTC 模块的使用方法。 - -### 硬件描述 - -模组内置 RTC 功能,无需外置器件。 - -### 软件设计 - -模组内置 RTC 可读可写,用户随时可以更改当前的时间,在打印 log的时候,需要伴随着时间一起记录,此时就可以读取 RTC+log一起打印,这样就清楚地知道问题所发生的时间点。 - -以下示例代码,定义时间的变量,方便后面读改写。 - -```python -from machine import RTC -rtc = None # 定义全局变量 -year = 0 # 定义全局变量 -month = 0 # 定义全局变量 -day = 0 # 定义全局变量 -week = 0 # 定义全局变量 -hour = 0 # 定义全局变量 -minute = 0 # 定义全局变量 -second = 0 # 定义全局变量 -``` - -读 RTC函数,把读出来的时间:年、月、日、星期、时、分、秒保存在上面的变量中。 - -```python -def readTime(): - global rtc # 声明全部变量 - if rtc is None: # 判断是否已经被创建 - rtc = RTC() # 创建一个 RTC 对象 - time = rtc.datetime() # 读 RTC 时间 - global year, month, day, week, hour, minute, second # 声明全部变量 - year = time[0] # 提取变量 - month = time[1] # 提取变量 - day = time[2] # 提取变量 - week = time[3] # 提取变量 - hour = time[4] # 提取变量 - minute = time[5] # 提取变量 - second = time[6] # 提取变量 -``` - -设置时间函数,把上面定义的变量带有时间的值写入到RTC 中,RTC 会从这个时间开始继续行走。 - -```python -def setTime(year, month, day, hour, minute, second): - global rtc # 声明全部变量 - if rtc is None: # 判断是否已经被创建 - rtc = RTC() # 创建一个 RTC 对象 - rtc.datetime([year, month, day, 0, hour, minute, second, 0]) # 设置 RTC 时间 -``` - -主函数,读-打印,写-打印,方便查看实验结果。 - -```python -def main(): - readTime() # 读时间 - print(year, month, day, week, hour, minute, second,) # 打印信息 - # 设置时间 - setTime(year - 1, month - 1, day - 1, hour - 1, minute - 1, second - 1) - readTime() # 读时间 - print(year, month, day, week, hour, minute, second, ) # 打印信息 -``` - -接下来就可以下载验证了,python 代码不需要编译,直接通过 QPYcom 工具把.py文件下载到模块中运行。 - -### 下载验证 - -下载.py 文件到模组运行: - -
-![](media/834b6f2ab93d7439d2a3b871e9fc1e3b.jpg) - -
- -
-![](media/cf43805ec64c98529fc4c909d372b5f7.jpg) - -
- -下载之后,运行代码看到两次打印的 RTC 时间。 - -### 配套代码 - - - 下载代码 \ No newline at end of file diff --git a/docs/little_demo/zh/QuecPythonTest/WDT.md b/docs/little_demo/zh/QuecPythonTest/WDT.md deleted file mode 100644 index c65ff7e0c2bc5dd792ab98a26aceb982936eab9e..0000000000000000000000000000000000000000 --- a/docs/little_demo/zh/QuecPythonTest/WDT.md +++ /dev/null @@ -1,88 +0,0 @@ -## 独立看门狗实验 - -文档主要介绍看门狗的用处和使用技巧,量产后生产的设备难免有个会有瑕疵,或者软件工程师做的代码有意想不到的地方,又或者硬件的寿命受自然条件所影响,导致产品死机,死机后不再运作可能会造成不可估量的后果,为了解决这样的问题,那么就要使用看门狗了,看门狗能够使产品死机后复位重新运作,本文里看门狗简称WDT。 - -### 硬件描述 - -模组内置 WDT 功能,无需外置器件,仅用软件就能解决死机复位功能。 - -### 软件设计 - -模组内置的 WDT 模式,在初始化 WDT 时要指定最长喂狗时间,使用 WDT后,就必须在指定内喂狗,否则将导致程序复位。我们利用 print打印函数,在喂狗时打印信息,不为狗超时导致程序复位自然就看不到打印信息。 - -```python -def Watchdog(): # 2 秒钟内调用喂狗函数,否则系统复位 - global wdt # 声明全部变量 - if wdt is None: - wdt = WDT(2) # 启动看门狗,间隔时长 单位 秒 - wdt.feed() # 喂狗 -def main(): - print('喂狗') - Watchdog() # 2 秒钟内调用喂狗函数 - func_1() # 用户程序 - print('喂狗') - Watchdog() # 2 秒钟内调用喂狗函数 - func_2() # 用户程序 - print('喂狗') - print('喂狗') # 2 秒钟内调用喂狗函数 - func_3() # 用户程序 - print('喂狗') - Watchdog() # 2 秒钟内调用喂狗函数 - func_4() # 用户程序 -``` - -一秒钟后打印信息,print 能正常输出,说明程序正常往下执行。 - -```python -def func_1(): - utime.sleep_ms(1000) # 延时 1 秒 - print('功能函数 1') -def func_2(): - utime.sleep_ms(1000) # 延时 1 秒 - print('功能函数 2') -``` - -如下面的函数,内部处理超过两秒,那么就需要在函数内也要喂狗一次,确保程序正常执行是不被复位。 - -```python -def func_3(): - utime.sleep_ms(1000) # 延时 1 秒 - print('功能函数 3') - Watchdog() # 2 秒钟内调用喂狗函数 - utime.sleep_ms(1000) # 延时 1 秒 - print('功能函数 3_2') -``` - -下面的函数有个utime.sleep_ms(5000)五秒钟的延时,明显超过两秒,执行到此处时模拟程序死机,就像设备在某个地方卡住不动,然后系统就会复位。 - -```python -def func_4(): - utime.sleep_ms(1000) - print('功能函数 4') - Watchdog() # 2 秒钟内调用喂狗函数 - print('尝试在 5s 后喂狗') - utime.sleep_ms(5000) # 延时 5 秒 - Watchdog() - print('来不及喂狗,系统已经复位') -``` - -接下来就可以下载验证了,python 代码不需要编译,直接通过 QPYcom 工具把.py文件下载到模块中运行。 - -### 下载验证 - -下载.py 文件到模组运行: - -
-![](media/20210115095814.png) -
- -
-![](media/b5ef6d654f81ae75d469cc32795760bc.jpg) -
- -下载之后,执行代码在延时 5 秒的时候,系统复位。 - -### 配套代码 - - - 下载代码 \ No newline at end of file diff --git a/docs/little_demo/zh/QuecPythonTest/button.md b/docs/little_demo/zh/QuecPythonTest/button.md deleted file mode 100644 index 34d6e9a27511ad12eac4a282e71ccba6197ff129..0000000000000000000000000000000000000000 --- a/docs/little_demo/zh/QuecPythonTest/button.md +++ /dev/null @@ -1,344 +0,0 @@ -## 按键输入实验 - -### 基本概述 - -本片文章主要简介 EC600S ADC 硬件资源, 介绍 quecpython ADC API,以及使用 ADC 来检 测当前光敏电阻的阻值。 - -### 硬件资源 - -EC600 引出了四个按键接口。参考 [EC600S_QuecPython_EVB_V1.0_SCH.pdf ](#_page11_x51.00_y610.92) 文档。 - -![Quectel-QuecPython按键输入小实验_01](media/Quectel-QuecPython按键输入小实验_01.png) - - - -| 按键 | 引脚 | -| ---- | ------ | -| S1 | - | -| S2 | - | -| S3 | GPIO72 | -| S4 | GPIO71 | - -当按键按下的时候, 我们可以检测到对应的引脚由 1 变为 0. - - - -### 实验设计 - -代码一直轮询检测引脚状态。 分别检测两个按键,单击,双击,以及长按。 - - - -### 代码实现 - -```python -''' -File: buttonclass.py -Project: button -File Created: Thursday, 24th December 2020 5:52:44 pm -Author: chengzhu.zhou - ------ -Last Modified: Friday, 25th December 2020 5:30:48 pm -Modified By: chengzhu.zhou ------ -Copyright 2020 - 2020 quectel -''' - -# copy from https://blog.csdn.net/qq997758497/article/details/80606710 -from machine import Pin -import _thread -import utime as time - -def Processing_button_fun(Alias, actionKey): - print("{0} has {1} action".format(Alias, actionKey)) - pass - -class ButtonClass(): - Alias = None - Gpio_obj = None - # check quiet click and long - Status2 = None - Status1 = None - callbackfun = None - timercount2 = None - timercount1 = None - # macro - # readonly - KEY_ACTION_QUIET = "quiet" - KEY_ACTION_CLICK = "click" - KEY_ACTION_DOUBLE = "double" - KEY_ACTION_LONG = "long" - # KEY_ACTION = {"quiet": "No key is generated ", "click": "Single key generation", - # "double": "Double click the event", "long": "There are long press events"} - - # KeyValue - KEY_VALUE = {"press": 0, "normal": 1} - - # - KEY_LONG_MAX_TIME = 2000 - - - def SetButtonStatu2(self, status="state0", time=0x00): - self.Status2 = status - self.timercount2 = time - - def SetButtonStatu1(self, status="state0", time=0x00): - self.Status1 = status - self.timercount1 = time - - def __nextstatus(self): - pass - - def init(self, pin, callbackfun, Alias="gpio0"): - self.Gpio_obj = Pin(pin, Pin.IN, Pin.PULL_DISABLE, 0) - self.Alias = Alias - self.callbackfun = callbackfun - self.SetButtonStatu2("state0", 0x0) - self.SetButtonStatu1("state0", 0x0) - pass - - # return quiet click and long - def __button_read_key(self): - _Status = self.Status2 - keyValue = self.Gpio_obj.read() - if _Status == "state0": - if keyValue == self.KEY_VALUE["press"]: - self.SetButtonStatu2("state1", 0x00) - return self.KEY_ACTION_QUIET - - # Software chattering elimination - if _Status == "state1": - if keyValue == self.KEY_VALUE["press"]: - self.SetButtonStatu2("state2", time.ticks_ms()) - else: - # reset status - self.SetButtonStatu2("state0", 0x00) - return self.KEY_ACTION_QUIET - elif _Status == "state2": - if keyValue == self.KEY_VALUE["normal"]: - # has click occur - self.SetButtonStatu2("state0", self.timercount2) - return self.KEY_ACTION_CLICK - else: - difftime = time.ticks_ms() - self.timercount2 - if difftime > self.KEY_LONG_MAX_TIME: - self.SetButtonStatu2("state0", 0x00) - return self.KEY_ACTION_LONG - elif _Status == "state3": - # Wait for the key to release - if keyValue == self.KEY_VALUE["normal"]: - self.SetButtonStatu2("state0", 0x00) - return self.KEY_ACTION_QUIET - - def polling(self): - # check has double click - _Status = self.Status1 - _KeyStatus = self.__button_read_key() - if _Status == "state0": - if _KeyStatus != self.KEY_ACTION_CLICK: - return _KeyStatus - else: - self.SetButtonStatu1("state1", time.ticks_ms()) - # No report - return self.KEY_ACTION_QUIET - elif _Status == "state1": - difftime = time.ticks_ms() - self.timercount1 - if _KeyStatus == self.KEY_ACTION_CLICK: - # Second time detected in a short time - self.SetButtonStatu1("state0", 0x00) - return self.KEY_ACTION_DOUBLE - elif difftime >= 500: - self.SetButtonStatu1("state0", 0x00) - return self.KEY_ACTION_CLICK - return _KeyStatus - -# -def button_polling_thread(delay, PinList): - ButtonList = [] - i = 0 - # init button - for _pin in PinList: - _temp = ButtonClass() - _temp.init(_pin, Processing_button_fun, "button{0}".format(i)) - ButtonList.append(_temp) - i = i + 1 - # Polling button - i = 10 - while i: - for button in ButtonList: - action = button.polling() - if action != ButtonClass.KEY_ACTION_QUIET: - # has press - button.callbackfun(button.Alias, action) - i = i - 1 - time.sleep_ms(10) - print("button thread has exited") - -if __name__ == "__main__": - # creat a thread Check key status - _thread.start_new_thread(button_polling_thread, - (1, [Pin.GPIO1, Pin.GPIO2])) - -``` - - - -### 实验操作 - -(1)将 buttonclass.py 烧录到 /usr 目录下。 - -(2)使用下面的命令执行脚本。 - -```python ->>> uos.getcwd() -'/' ->>> uos.listdir() -['usr', 'bak'] ->>> uos.chdir('usr') ->>> uos.listdir() -['apn_cfg.json', 'maonv.mp3', 'test.py', 'buttonclass.py'] ->>> import example ->>> example.exec('usr/buttonclass.py') -``` - -(3)按下板卡按键,查看打印日志。 - -最终我们可以在串口看到,阻值输出的变化如下: - -``` -button0 has double action - -button0 has click action - -button0 has click action - -button0 has long action - -button0 has long action - -button0 has click action - -button1 has click action - -button1 has double action - -button0 has double action - -button0 has double action -``` - - - -### 其他实验引用 buttonclass 脚本 - -#### 测试代码 - -```python -''' -File: test_buttonclass.py -Project: button -File Created: Friday, 25th December 2020 5:42:17 pm -Author: chengzhu.zhou ------ -Last Modified: Friday, 25th December 2020 5:42:41 pm -Modified By: chengzhu.zhou ------ -Copyright 2020 - 2020 quectel -''' -import utime as time -from buttonclass import ButtonClass -from machine import Pin -import _thread - -def Processing_button_fun(Alias, actionKey): - if actionKey == ButtonClass.KEY_ACTION_CLICK: - print("test: has click trigger") - pass - elif actionKey == ButtonClass.KEY_ACTION_DOUBLE: - print("test: has double click trigger") - pass - elif actionKey == ButtonClass.KEY_ACTION_LONG: - print("test: has long click trigger") - pass - pass - -def button_polling_thread(delay, PinList): - ButtonList = [] - i = 0 - # init button - for _pin in PinList: - _temp = ButtonClass() - _temp.init(_pin, Processing_button_fun, "button{0}".format(i)) - ButtonList.append(_temp) - i = i + 1 - # Polling button - i = 10 - while i: - for button in ButtonList: - action = button.polling() - if action != ButtonClass.KEY_ACTION_QUIET: - # has press - button.callbackfun(button.Alias, action) - i = i - 1 - time.sleep_ms(10) - print("button thread has exited") - -if __name__ == "__main__": - # creat a thread Check key status - _thread.start_new_thread(button_polling_thread, - (1, [Pin.GPIO1, Pin.GPIO2])) - -``` - - - -#### 测试步骤 - -(1)首先将 test_buttonclass.py 将 烧录到和 buttonclass.py 同级目录。 - -![Quectel-QuecPython按键输入小实验_02](media/Quectel-QuecPython按键输入小实验_02.png) - -(2)然后使用命令行的方式切换到对应目录。我这里是 /usr 目录。 - -```python ->>> uos.getcwd() -'/' ->>> uos.listdir() -['usr', 'bak'] ->>> uos.chdir('usr') ->>> uos.listdir() -['apn_cfg.json', 'maonv.mp3', 'test.py', 'buttonclass.py', 'test_buttonclass.py'] ->>> import example ->>> example.exec('usr/test_buttonclass.py') - -``` - -运行脚本以后,按下按键即可。下面是测试 log - -``` -test: has click trigger - -test: has click trigger - -test: has double click trigger - -test: has double click trigger - -test: has click trigger - -test: has long click trigger -test: has long click trigger - -test: has long click trigger - -test: has long click trigger - -test: has click trigger -button thread has exited -``` - -### 配套代码 - - - 下载代码 \ No newline at end of file diff --git a/docs/little_demo/zh/QuecPythonTest/code/03_pm.py b/docs/little_demo/zh/QuecPythonTest/code/03_pm.py deleted file mode 100644 index d037a9cd43adc1c617425e06dbb68f9eecba2fcd..0000000000000000000000000000000000000000 --- a/docs/little_demo/zh/QuecPythonTest/code/03_pm.py +++ /dev/null @@ -1,29 +0,0 @@ -# 实验1: 待机唤醒实验 -# API资料参考连接: -# https://python.quectel.com/wiki/#/zh-cn/api/?id=pm-%e4%bd%8e%e5%8a%9f%e8%80%97 - -import pm -import utime - - -def main(): - lpm_fd = pm.create_wakelock("test_lock", len("test_lock")) # 创建wake_lock锁 - pm.autosleep(1) # 自动休眠模式控制 - - while True: - print("sleep") - utime.sleep(5) # 延时 并 休眠5秒钟 - res = pm.wakelock_lock(lpm_fd) # 加锁 禁止进入休眠状态 - print(res) - print("ql_lpm_idlelock_lock, g_c1_axi_fd = %d" % lpm_fd) - print("not sleep") - utime.sleep(5) # 只延时,不休眠 - res = pm.wakelock_unlock(lpm_fd) # 解锁 继续 自动休眠模式 - print(res) - print("ql_lpm_idlelock_unlock, g_c1_axi_fd = %d" % lpm_fd) - num = pm.get_wakelock_num() # 获取已创建锁的数量 - print(num) # 打印已创建锁的数量 - - -if __name__ == "__main__": - main() diff --git a/docs/little_demo/zh/QuecPythonTest/code/04_WDT.py b/docs/little_demo/zh/QuecPythonTest/code/04_WDT.py deleted file mode 100644 index 94529a7728fb5cb9e1cd51ef1cadbb99494fb2ee..0000000000000000000000000000000000000000 --- a/docs/little_demo/zh/QuecPythonTest/code/04_WDT.py +++ /dev/null @@ -1,62 +0,0 @@ -# 实验1: 独立看门狗实验 -# API资料参考连接: https://python.quectel.com/wiki/#/zh-cn/api/?id=wdt - - -from machine import WDT -import utime - -wdt = None # 定义全部变量 - - -def Watchdog(): # 2秒钟内调用喂狗函数,否则系统复位 - global wdt # 声明全部变量 - if wdt is None: - wdt = WDT(2) # 启动看门狗,间隔时长 单位 秒 - wdt.feed() # 喂狗 - - -def func_1(): - utime.sleep_ms(1000) # 延时1秒 - print('功能函数 1') - - -def func_2(): - utime.sleep_ms(1000) # 延时1秒 - print('功能函数 2') - - -def func_3(): - utime.sleep_ms(1000) # 延时1秒 - print('功能函数 3') - Watchdog() # 2秒钟内调用喂狗函数 - utime.sleep_ms(1000) # 延时1秒 - print('功能函数 3_2') - - -def func_4(): - utime.sleep_ms(1000) - print('功能函数 4') - Watchdog() # 2秒钟内调用喂狗函数 - print('尝试在5s后喂狗') - utime.sleep_ms(5000) # 延时5秒 - Watchdog() - print('来不及喂狗,系统已经复位') - - -def main(): - print('喂狗') - Watchdog() # 2秒钟内调用喂狗函数 - func_1() # 用户程序 - print('喂狗') - Watchdog() # 2秒钟内调用喂狗函数 - func_2() # 用户程序 - print('喂狗') - Watchdog() # 2秒钟内调用喂狗函数 - func_3() # 用户程序 - print('喂狗') - Watchdog() # 2秒钟内调用喂狗函数 - func_4() # 用户程序 - - -if __name__ == "__main__": - main() diff --git a/docs/little_demo/zh/QuecPythonTest/code/05_RTC.py b/docs/little_demo/zh/QuecPythonTest/code/05_RTC.py deleted file mode 100644 index cadde00fbdc30167c1b287c97cd1155078b0cc82..0000000000000000000000000000000000000000 --- a/docs/little_demo/zh/QuecPythonTest/code/05_RTC.py +++ /dev/null @@ -1,50 +0,0 @@ -# 实验1: RTC实验 -# API资料参考连接: https://python.quectel.com/wiki/#/zh-cn/api/?id=rtc - - -from machine import RTC - -rtc = None # 定义全局变量 -year = 0 # 定义全局变量 -month = 0 # 定义全局变量 -day = 0 # 定义全局变量 -week = 0 # 定义全局变量 -hour = 0 # 定义全局变量 -minute = 0 # 定义全局变量 -second = 0 # 定义全局变量 - - -def readTime(): - global rtc # 声明全部变量 - if rtc is None: # 判断是否已经被创建 - rtc = RTC() # 创建一个RTC对象 - time = rtc.datetime() # 读RTC时间 - global year, month, day, week, hour, minute, second # 声明全部变量 - year = time[0] # 提取变量 - month = time[1] # 提取变量 - day = time[2] # 提取变量 - week = time[3] # 提取变量 - hour = time[4] # 提取变量 - minute = time[5] # 提取变量 - second = time[6] # 提取变量 - - -def setTime(year, month, day, hour, minute, second): - global rtc # 声明全部变量 - if rtc is None: # 判断是否已经被创建 - rtc = RTC() # 创建一个RTC对象 - rtc.datetime([year, month, day, 0, hour, minute, second, 0]) # 设置RTC时间 - - -def main(): - readTime() # 读时间 - print(year, month, day, week, hour, minute, second,) # 打印信息 - - # 设置时间 - setTime(year - 1, month - 1, day - 1, hour - 1, minute - 1, second - 1) - readTime() # 读时间 - print(year, month, day, week, hour, minute, second, ) # 打印信息 - - -if __name__ == "__main__": - main() diff --git a/docs/little_demo/zh/QuecPythonTest/code/06_relay.py b/docs/little_demo/zh/QuecPythonTest/code/06_relay.py deleted file mode 100644 index 743518a39ff63fcee06fae4be9e682377fa3c894..0000000000000000000000000000000000000000 --- a/docs/little_demo/zh/QuecPythonTest/code/06_relay.py +++ /dev/null @@ -1,72 +0,0 @@ -# 实验1: 继电器实验 -# API资料参考连接: https://python.quectel.com/wiki/#/zh-cn/api/?id=pin - - -from machine import Pin -import utime - - -IOdictRead = {} # 记录已经初始化的GPIO口 -IOdictWrite = {} # 记录已经初始化的GPIO口 - - -def GPIO_Read(gpioX, Pull=Pin.PULL_DISABLE, level=1): - if IOdictWrite.get(gpioX, None): - del IOdictWrite[gpioX] - gpioIO = IOdictRead.get(gpioX, None) - if gpioIO: - return gpioIO.read() - else: - IOdictRead[gpioX] = (Pin(gpioX, Pin.IN, Pull, level)) - gpioIO = IOdictRead.get(gpioX, None) - return gpioIO.read() - - -def GPIO_Write(gpioX, level, Pull=Pin.PULL_DISABLE): - if IOdictRead.get(gpioX, None): - del IOdictRead[gpioX] - gpioIO = IOdictWrite.get(gpioX, None) - if gpioIO: - gpioIO.write(level) - else: - IOdictWrite[gpioX] = (Pin(gpioX, Pin.OUT, Pull, level)) - gpioIO = IOdictWrite.get(gpioX, None) - gpioIO.write(level) - - -Relay_1 = Pin.GPIO3 # 定义 继电器 引脚 -Relay_2 = Pin.GPIO4 # 定义 继电器 引脚 - - -def relayIO_On(gpioX): # 某个引脚置0 - GPIO_Write(gpioX, 0) - - -def relayIO_Off(gpioX): # 某个引脚置1 - GPIO_Write(gpioX, 1) - - -KEY_1 = Pin.GPIO1 # 定义 按键 引脚 -KEY_2 = Pin.GPIO2 # 定义 按键 引脚 - - -def readKey(): # 读取按键,返回按键值 - if (GPIO_Read(KEY_1) == low): # 判断是否为低电平 - utime.sleep_ms(20) # 防抖 - if (GPIO_Read(KEY_1) == low): # 判断是否为低电平 - return KEY_1 # 返回按键值 - elif (GPIO_Read(KEY_2) == low): # 判断是否为低电平 - utime.sleep_ms(20) # 防抖 - if (GPIO_Read(KEY_2) == low): # 判断是否为低电平 - return KEY_2 # 返回按键值 - else: - return None # 返回 空 - - -while True: - if(readKey() == KEY_1): # 判断是否 KEY_1 被按下 - relayIO_On(Relay_1) # Relay_1 ON - relayIO_Off(Relay_2) # Relay_2 OFF - elif (readKey() == KEY_1): # 判断是否 KEY_1 被按下 - relayIO_Off(Relay_1) # Relay_1 OFF - relayIO_On(Relay_2) # Relay_2 ON diff --git a/docs/little_demo/zh/QuecPythonTest/code/External_interrupt.py b/docs/little_demo/zh/QuecPythonTest/code/External_interrupt.py deleted file mode 100644 index c940ff223b8f1d8f7c79914d2ac88e96a97dcbc1..0000000000000000000000000000000000000000 --- a/docs/little_demo/zh/QuecPythonTest/code/External_interrupt.py +++ /dev/null @@ -1,47 +0,0 @@ -''' -File: External_interrupt.py -Project: button -File Created: Monday, 28th December 2020 3:03:43 pm -Author: chengzhu.zhou ------ -Last Modified: Monday, 28th December 2020 3:03:47 pm -Modified By: chengzhu.zhou ------ -Copyright 2020 - 2020 quectel -''' -from machine import ExtInt -import utime as time -''' -EC600SCN平台引脚对应关系如下: -GPIO1 – 引脚号71 -GPIO2 – 引脚号72 -GPIO3 – 引脚号73 -GPIO4 – 引脚号74 -GPIO5 – 引脚号75 -GPIO6 – 引脚号76 -GPIO7 – 引脚号77 -''' -# 参考自 http://qpy.quectel.com/wiki/#/zh-cn/api/?id=extint -state = 2 - - -def callBack(args): - global state - print("###interrupt %d ###" % args) - state = state - 1 - - -def main(): - # 映射GPIO71的下降沿触发回调函数 - extint = ExtInt(ExtInt.GPIO1, ExtInt.IRQ_FALLING, ExtInt.PULL_PU, callBack) - # 等待按键按下,触发 - while state: - time.sleep_ms(10) - pass - # 停止映射外部中断 - extint.disable() - print("The main function has exited") - - -if __name__ == "__main__": - main() diff --git "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/st7789v\350\265\204\346\226\231/ST7789VW_datasheet.pdf" "b/docs/little_demo/zh/QuecPythonTest/code/LCD_file/st7789v\350\265\204\346\226\231/ST7789VW_datasheet.pdf" deleted file mode 100644 index ea8ef0f90e527d8e6df905336988371a3aa4f929..0000000000000000000000000000000000000000 Binary files "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/st7789v\350\265\204\346\226\231/ST7789VW_datasheet.pdf" and /dev/null differ diff --git "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\345\233\276\347\211\207\345\255\227\347\254\246\345\217\226\346\250\241\345\267\245\345\205\267/Image2Lcd.zip" "b/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\345\233\276\347\211\207\345\255\227\347\254\246\345\217\226\346\250\241\345\267\245\345\205\267/Image2Lcd.zip" deleted file mode 100644 index 852a7b0a6ebc0fefade2d44ffe98c4ef325fe964..0000000000000000000000000000000000000000 Binary files "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\345\233\276\347\211\207\345\255\227\347\254\246\345\217\226\346\250\241\345\267\245\345\205\267/Image2Lcd.zip" and /dev/null differ diff --git "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\345\233\276\347\211\207\345\255\227\347\254\246\345\217\226\346\250\241\345\267\245\345\205\267/PCtoLCD2002.zip" "b/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\345\233\276\347\211\207\345\255\227\347\254\246\345\217\226\346\250\241\345\267\245\345\205\267/PCtoLCD2002.zip" deleted file mode 100644 index ecaa2b87d263dfb7d6fb05f1e668b190fa1bde79..0000000000000000000000000000000000000000 Binary files "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\345\233\276\347\211\207\345\255\227\347\254\246\345\217\226\346\250\241\345\267\245\345\205\267/PCtoLCD2002.zip" and /dev/null differ diff --git "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\233\276\347\211\207/Quecpython.py" "b/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\233\276\347\211\207/Quecpython.py" deleted file mode 100644 index 5cac2c4d6811ee777edc9d3bfecf56b11ab879d0..0000000000000000000000000000000000000000 --- "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\233\276\347\211\207/Quecpython.py" +++ /dev/null @@ -1,391 +0,0 @@ -import sys -import time -import os - - -try: - stdout = sys.stdout.buffer -except AttributeError: - # Python2 doesn't have buffer attr - stdout = sys.stdout - - -def stdout_write_bytes(b): - b = b.replace(b"\x04", b"") - stdout.write(b) - stdout.flush() - -class QuecpythonError(Exception): - pass - - -class Quecpython: - def __init__(self, device, baudrate=115200, wait=0): - import serial - delayed = False - for attempt in range(wait + 1): - try: - self.serial = serial.Serial(device, baudrate=baudrate, interCharTimeout=1) - break - except (OSError, IOError): # Py2 and Py3 have different errors - if wait == 0: - continue - if attempt == 0: - sys.stdout.write("Waiting {} seconds for Quecpython ".format(wait)) - delayed = True - time.sleep(1) - sys.stdout.write(".") - sys.stdout.flush() - else: - if delayed: - print("") - raise QuecpythonError("failed to access " + device) - if delayed: - print("") - - def close(self): - self.serial.close() - - def read_until(self, min_num_bytes, ending, timeout=10, data_consumer=None): - # if data_consumer is used then data is not accumulated and the ending must be 1 byte long - assert data_consumer is None or len(ending) == 1 - - data = self.serial.read(min_num_bytes) - if data_consumer: - data_consumer(data) - timeout_count = 0 - while True: - if data.endswith(ending): - break - elif self.serial.inWaiting() > 0: - new_data = self.serial.read(1) - if data_consumer: - data_consumer(new_data) - data = new_data - else: - data = data + new_data - timeout_count = 0 - else: - timeout_count += 1 - if timeout is not None and timeout_count >= 100 * timeout: - break - time.sleep(0.01) - return data - - def enter_raw_repl(self): - self.serial.write(b"\r\x03\x03") # ctrl-C twice: interrupt any running program - - # flush input (without relying on serial.flushInput()) - n = self.serial.inWaiting() - while n > 0: - self.serial.read(n) - n = self.serial.inWaiting() - - self.serial.write(b"\r\x01") # ctrl-A: enter raw REPL - data = self.read_until(1, b"raw REPL; CTRL-B to exit\r\n>") - if not data.endswith(b"raw REPL; CTRL-B to exit\r\n>"): - print(data) - raise QuecpythonError("could not enter raw repl") - - self.serial.write(b"\x04") # ctrl-D: soft reset - data = self.read_until(1, b"soft reboot\r\n") - if not data.endswith(b"soft reboot\r\n"): - print(data) - raise QuecpythonError("could not enter raw repl") - # By splitting this into 2 reads, it allows boot.py to print stuff, - # which will show up after the soft reboot and before the raw REPL. - data = self.read_until(1, b"raw REPL; CTRL-B to exit\r\n") - if not data.endswith(b"raw REPL; CTRL-B to exit\r\n"): - print(data) - raise QuecpythonError("could not enter raw repl") - def exit_raw_repl(self): - self.serial.write(b"\r\x02") # ctrl-B: enter friendly REPL - - def follow(self, timeout, data_consumer=None): - # wait for normal output - data = self.read_until(1, b"\x04", timeout=timeout, data_consumer=data_consumer) - if not data.endswith(b"\x04"): - raise QuecpythonError("timeout waiting for first EOF reception") - data = data[:-1] - - # wait for error output - data_err = self.read_until(1, b"\x04", timeout=timeout) - if not data_err.endswith(b"\x04"): - raise QuecpythonError("timeout waiting for second EOF reception") - data_err = data_err[:-1] - - # return normal and error output - return data, data_err - - def exec_raw_no_follow(self, command): - if isinstance(command, bytes): - command_bytes = command - else: - command_bytes = bytes(command, encoding="utf8") - - # check we have a prompt - data = self.read_until(1, b">") - if not data.endswith(b">"): - raise QuecpythonError("could not enter raw repl") - - # write command - for i in range(0, len(command_bytes), 256): - self.serial.write(command_bytes[i : min(i + 256, len(command_bytes))]) - time.sleep(0.1) - self.serial.write(b"\x04") - - # check if we could exec command - data = self.serial.read(2) - if data != b"OK": - raise QuecpythonError("could not exec command (response: %r)" % data) - - def exec_raw(self, command, timeout=10, data_consumer=None): - self.exec_raw_no_follow(command) - return self.follow(timeout, data_consumer) - - def eval(self, expression): - ret = self.exec_("print({})".format(expression)) - ret = ret.strip() - return ret - - def exec_(self, command, data_consumer=None): - ret, ret_err = self.exec_raw(command, data_consumer=data_consumer) - if ret_err: - raise QuecpythonError("exception", ret, ret_err) - return ret - - def execfile(self, filename): - with open(filename, "rb") as f: - pyfile = f.read() - print(pyfile) - return self.exec_(pyfile) - def fs_ls(self, src): - cmd = ( - "import uos\nfor f in uos.ilistdir(%s):\n" - " print('{:12} {}{}'.format(f[3]if len(f)>3 else 0,f[0],'/'if f[1]&0x4000 else ''))" - % (("'%s'" % src) if src else "") - ) - self.exec_(cmd, data_consumer=stdout_write_bytes) - - def fs_cat(self, src, chunk_size=256): - cmd = ( - "with open('%s') as f:\n while 1:\n" - " b=f.read(%u)\n if not b:break\n print(b,end='')" % (src, chunk_size) - ) - self.exec_(cmd, data_consumer=stdout_write_bytes) - - def fs_get(self, src, dest, chunk_size=256): - self.exec_("f=open('%s','rb')\nr=f.read" % src) - with open(dest, "wb") as f: - while True: - data = bytearray() - self.exec_("print(r(%u))" % chunk_size, data_consumer=lambda d: data.extend(d)) - assert data.endswith(b"\r\n\x04") - data = eval(str(data[:-3], "ascii")) - if not data: - break - f.write(data) - self.exec_("f.close()") - - def fs_put(self, src, dest, chunk_size=256): - self.exec_("f=open('%s','wb')\nw=f.write" % dest) - with open(src, "rb") as f: - while True: - data = f.read(chunk_size) - if not data: - break - if sys.version_info < (3,): - self.exec_("w(b" + repr(data) + ")") - else: - self.exec_("w(" + repr(data) + ")") - self.exec_("f.close()") - - def fs_mkdir(self, dir): - self.exec_("import uos\nuos.mkdir('%s')" % dir) - - def fs_rmdir(self, dir): - self.exec_("import uos\nuos.rmdir('%s')" % dir) - - def fs_rm(self, src): - self.exec_("import uos\nuos.remove('%s')" % src) - -setattr(Quecpython, "exec", Quecpython.exec_) - -def execfile(filename, device="COM24", baudrate=115200): - qpy = Quecpython(device, baudrate) - qpy.enter_raw_repl() - output = qpy.execfile(filename) - stdout_write_bytes(output) - qpy.exit_raw_repl() - qpy.close() - -def filesystem_command(qpy, args): - def fname_remote(src): - if src.startswith(":"): - src = src[1:] - return src - - def fname_cp_dest(src, dest): - src = src.rsplit("/", 1)[-1] - if dest is None or dest == "": - dest = src - elif dest == ".": - dest = "./" + src - elif dest.endswith("/"): - dest += src - return dest - - cmd = args[0] - args = args[1:] - try: - if cmd == "cp": - srcs = args[:-1] - dest = args[-1] - if srcs[0].startswith("./") or dest.startswith(":"): - op = qpy.fs_put - fmt = "cp %s :%s" - dest = fname_remote(dest) - else: - op = qpy.fs_get - fmt = "cp :%s %s" - for src in srcs: - src = fname_remote(src) - dest2 = fname_cp_dest(src, dest) - print(fmt % (src, dest2)) - op(src, dest2) - else: - op = { - "ls": qpy.fs_ls, - "cat": qpy.fs_cat, - "mkdir": qpy.fs_mkdir, - "rmdir": qpy.fs_rmdir, - "rm": qpy.fs_rm, - }[cmd] - if cmd == "ls" and not args: - args = [""] - for src in args: - src = fname_remote(src) - print("%s :%s" % (cmd, src)) - op(src) - except QuecpythonError as er: - print(str(er.args[2], "ascii")) - qpy.exit_raw_repl() - qpy.close() - sys.exit(1) - -def main(): - import argparse - cmd_parser = argparse.ArgumentParser(description="Run scripts on the EC100Y.") - cmd_parser.add_argument( - "-d", - "--device", - default=os.environ.get("EC100Y_DEVICE", "COM24"), - help="the serial device of the EC100Y", - ) - cmd_parser.add_argument( - "-b", - "--baudrate", - default=os.environ.get("EC100Y_BAUDRATE", "115200"), - help="the baud rate of the serial device", - ) - cmd_parser.add_argument("-c", "--command", help="program passed in as string") - cmd_parser.add_argument( - "-w", - "--wait", - default=0, - type=int, - help="seconds to wait for USB connected board to become available", - ) - group = cmd_parser.add_mutually_exclusive_group() - group.add_argument( - "--follow", - action="store_true", - help="follow the output after running the scripts [default if no scripts given]", - ) - group.add_argument( - "--no-follow", - action="store_true", - help="Do not follow the output after running the scripts.", - ) - cmd_parser.add_argument( - "-f", "--filesystem", action="store_true", help="perform a filesystem action" - ) - cmd_parser.add_argument("files", nargs="*", help="input files") - args = cmd_parser.parse_args() - # open the connection to the qpyoard - try: - qpy = Quecpython(args.device, args.baudrate, args.wait) - except QuecpythonError as er: - print(er) - sys.exit(1) - - # run any command or file(s) - if args.command is not None or args.filesystem or len(args.files): - # we must enter raw-REPL mode to execute commands - # this will do a soft-reset of the board - try: - qpy.enter_raw_repl() - except QuecpythonError as er: - print(er) - qpy.close() - sys.exit(1) - - def execbuffer(buf): - try: - if args.no_follow: - qpy.exec_raw_no_follow(buf) - ret_err = None - else: - ret, ret_err = qpy.exec_raw( - buf, timeout=None, data_consumer=stdout_write_bytes - ) - except QuecpythonError as er: - print(er) - qpy.close() - sys.exit(1) - except KeyboardInterrupt: - sys.exit(1) - if ret_err: - qpy.exit_raw_repl() - qpy.close() - stdout_write_bytes(ret_err) - sys.exit(1) - - # do filesystem commands, if given - if args.filesystem: - filesystem_command(qpy, args.files) - del args.files[:] - - # run the command, if given - if args.command is not None: - execbuffer(args.command.encode("utf-8")) - - # run any files - for filename in args.files: - with open(filename, "rb") as f: - pyfile = f.read() - execbuffer(pyfile) - - # exiting raw-REPL just drops to friendly-REPL mode - qpy.exit_raw_repl() - - # if asked explicitly, or no files given, then follow the output - if args.follow or (args.command is None and not args.filesystem and len(args.files) == 0): - try: - ret, ret_err = qpy.follow(timeout=None, data_consumer=stdout_write_bytes) - except QuecpythonError as er: - print(er) - sys.exit(1) - except KeyboardInterrupt: - sys.exit(1) - if ret_err: - qpy.close() - stdout_write_bytes(ret_err) - sys.exit(1) - - # close the connection to the EC100Y - qpy.close() - - -if __name__ == "__main__": - main() \ No newline at end of file diff --git "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\233\276\347\211\207/fonts.py" "b/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\233\276\347\211\207/fonts.py" deleted file mode 100644 index 70c0fdcd45b884d64b680e39a194939da36162c2..0000000000000000000000000000000000000000 --- "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\233\276\347\211\207/fonts.py" +++ /dev/null @@ -1,462 +0,0 @@ - - -''' -16 x 16 汉字字库 -宋体、阴码,逐行式,顺向(高位在前) -''' -hanzi_16x16_dict = { - '移' : (0x08, 0x20, 0x1C, 0x20, 0xF0, 0x7C, 0x10, 0x84, 0x11, 0x48, 0xFC, 0x30, 0x10, 0x20, 0x30, 0x48, - 0x39, 0x90, 0x54, 0x3E, 0x54, 0x42, 0x91, 0xA4, 0x10, 0x18, 0x10, 0x10, 0x10, 0x60, 0x11, 0x80), - '远' : (0x00, 0x00, 0x23, 0xF8, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x07, 0xFC, 0xF1, 0x20, 0x11, 0x20, - 0x11, 0x20, 0x11, 0x20, 0x11, 0x24, 0x12, 0x24, 0x12, 0x24, 0x14, 0x1C, 0x28, 0x00, 0x47, 0xFE), - '通' : (0x00, 0x00, 0x47, 0xF8, 0x20, 0x10, 0x21, 0xA0, 0x00, 0x40, 0x07, 0xFC, 0xE4, 0x44, 0x24, 0x44, - 0x27, 0xFC, 0x24, 0x44, 0x24, 0x44, 0x27, 0xFC, 0x24, 0x44, 0x24, 0x54, 0x54, 0x08, 0x8F, 0xFE), - '信' : (0x08, 0x40, 0x08, 0x20, 0x0B, 0xFE, 0x10, 0x00, 0x10, 0x00, 0x31, 0xFC, 0x30, 0x00, 0x50, 0x00, - 0x91, 0xFC, 0x10, 0x00, 0x10, 0x00, 0x11, 0xFC, 0x11, 0x04, 0x11, 0x04, 0x11, 0xFC, 0x11, 0x04), -} - -''' -16 x 24 汉字字库 -宋体、阴码,逐行式,顺向(高位在前) -''' -hanzi_16x24_dict = { - '移' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x0E, 0x60, 0x38, 0x44, 0x08, 0x7C, 0x08, 0xCC, 0x09, 0x68, - 0x0A, 0x30, 0x7C, 0x10, 0x08, 0x20, 0x18, 0x50, 0x1C, 0xB0, 0x1B, 0x22, 0x2A, 0x5E, 0x28, 0x44, - 0x28, 0xC4, 0x49, 0x28, 0x08, 0x28, 0x08, 0x10, 0x08, 0x20, 0x08, 0xC0, 0x0F, 0x00, 0x00, 0x00,), - '远' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x13, 0xF8, 0x10, 0x00, 0x10, 0x00, 0x00, 0x04, - 0x03, 0x5C, 0x00, 0xA0, 0x70, 0xA0, 0x11, 0x20, 0x11, 0x20, 0x11, 0x20, 0x11, 0x20, 0x11, 0x24, - 0x12, 0x24, 0x12, 0x36, 0x14, 0x1C, 0x68, 0x00, 0x46, 0x00, 0x43, 0xFC, 0x00, 0x00, 0x00, 0x00,), - '通' : (0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x20, 0x08, 0x10, 0x90, 0x10, 0x60, 0x00, 0x44, 0x03, 0xFC, - 0x02, 0x44, 0x12, 0x44, 0x73, 0xFC, 0x12, 0x44, 0x12, 0x44, 0x12, 0x44, 0x13, 0xFC, 0x12, 0x44, - 0x12, 0x44, 0x12, 0x44, 0x12, 0x4C, 0x28, 0x00, 0x46, 0x00, 0x43, 0xFE, 0x00, 0x00, 0x00, 0x00,), - '信' : (0x00, 0x00, 0x08, 0x00, 0x0C, 0x40, 0x08, 0x40, 0x08, 0x20, 0x17, 0xFE, 0x10, 0x00, 0x10, 0x00, - 0x10, 0x08, 0x31, 0xF0, 0x30, 0x00, 0x50, 0x00, 0x53, 0xFC, 0x10, 0x00, 0x10, 0x00, 0x10, 0xFC, - 0x11, 0x04, 0x11, 0x04, 0x11, 0x04, 0x11, 0x04, 0x11, 0xF8, 0x11, 0x04, 0x10, 0x00, 0x00, 0x00,), -} - -''' -24 x 24 汉字字库 -宋体、阴码,逐行式,顺向(高位在前) -''' -hanzi_24x24_dict = { - '移' : (0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0xC3,0x00,0x1F,0x02,0x00,0x02, - 0x07,0xF8,0x02,0x04,0x18,0x02,0x0A,0x30,0x02,0x53,0x60,0x7F,0xE1,0xC0,0x06,0x01, - 0x80,0x06,0x03,0xC0,0x07,0x0D,0x80,0x0E,0xF3,0xFC,0x0A,0x46,0x0C,0x12,0x4C,0x08, - 0x12,0x12,0x10,0x22,0x21,0x30,0x42,0x01,0x60,0x02,0x00,0x80,0x02,0x03,0x00,0x02, - 0x1C,0x00,0x02,0xE0,0x00,0x00,0x00,0x00,), - '远' : (0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x20,0x08,0x7F,0xF0,0x0C,0x00,0x00,0x04, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x01,0xFF,0xFC,0x00,0x18,0x80,0x7E,0x18, - 0x80,0x04,0x18,0x80,0x04,0x10,0x80,0x04,0x10,0x80,0x04,0x10,0x88,0x04,0x20,0x88, - 0x04,0x60,0x8C,0x04,0xC0,0xFC,0x1B,0x00,0x00,0x31,0x00,0x00,0x60,0xFF,0xFE,0x00, - 0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,), - '通' : (0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xE0,0x10,0x00,0x30,0x08,0x08,0xC0,0x0C, - 0x07,0x00,0x0C,0x03,0x00,0x00,0x7F,0xF8,0x00,0x42,0x08,0x00,0x42,0x08,0x7C,0x7F, - 0xF8,0x04,0x42,0x08,0x04,0x42,0x08,0x04,0x42,0x08,0x04,0x7F,0xF8,0x04,0x42,0x08, - 0x04,0x42,0x08,0x04,0x42,0x08,0x04,0x42,0x18,0x1A,0x42,0x38,0x31,0x80,0x10,0x60, - 0xFF,0xFC,0x00,0x1F,0xF8,0x00,0x00,0x00,), - '信' : (0x00,0x00,0x00,0x00,0x04,0x00,0x03,0x02,0x00,0x02,0x03,0x00,0x02,0x03,0x08,0x04, - 0xFF,0xFC,0x04,0x00,0x00,0x08,0x00,0x10,0x0C,0x7F,0xF8,0x14,0x00,0x00,0x14,0x00, - 0x10,0x24,0x7F,0xF8,0x44,0x00,0x00,0x04,0x00,0x00,0x04,0x00,0x00,0x04,0x3F,0xF8, - 0x04,0x20,0x10,0x04,0x20,0x10,0x04,0x20,0x10,0x04,0x20,0x10,0x04,0x3F,0xF0,0x04, - 0x20,0x10,0x04,0x20,0x10,0x00,0x00,0x00,), -} - - -''' -常用ASCII字符集 -字宽:8 【实际取模时,字宽设置为16,对应英文字宽则为8】 -字高:16 -宋体、阴码,逐行式,顺向(高位在前) -''' -ascii_8x16_dict = { - ' ' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,), - '!' : (0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,), - '"' : (0x00, 0x12, 0x24, 0x24, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,), - "#" : (0x00, 0x00, 0x00, 0x12, 0x12, 0x12, 0x7E, 0x24, 0x24, 0x24, 0x7E, 0x24, 0x24, 0x24, 0x00, 0x00,), - '$' : (0x00, 0x00, 0x08, 0x3C, 0x4A, 0x4A, 0x48, 0x38, 0x0C, 0x0A, 0x0A, 0x4A, 0x4A, 0x3C, 0x08, 0x08,), - '%' : (0x00, 0x00, 0x00, 0x44, 0xA4, 0xA8, 0xA8, 0xB0, 0x54, 0x1A, 0x2A, 0x2A, 0x4A, 0x44, 0x00, 0x00,), - '&' : (0x00, 0x00, 0x00, 0x30, 0x48, 0x48, 0x48, 0x50, 0x6E, 0xA4, 0x94, 0x98, 0x89, 0x76, 0x00, 0x00,), - "'" : (0x00, 0x60, 0x20, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,), - '(' : (0x00, 0x02, 0x04, 0x08, 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x04, 0x02, 0x00,), - ')' : (0x00, 0x40, 0x20, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x10, 0x10, 0x20, 0x40, 0x00,), - '*' : (0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0xD6, 0x38, 0x38, 0xD6, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00,), - '+' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x7F, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00,), - ',' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x20, 0x20, 0x40,), - '-' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,), - '.' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00,), - '/' : (0x00, 0x00, 0x02, 0x04, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x00,), - '0' : (0x00, 0x00, 0x00, 0x18, 0x24, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x24, 0x18, 0x00, 0x00,), - '1' : (0x00, 0x00, 0x00, 0x08, 0x38, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x3E, 0x00, 0x00,), - '2' : (0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x02, 0x04, 0x08, 0x10, 0x20, 0x42, 0x7E, 0x00, 0x00,), - '3' : (0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x02, 0x04, 0x18, 0x04, 0x02, 0x42, 0x42, 0x3C, 0x00, 0x00,), - '4' : (0x00, 0x00, 0x00, 0x04, 0x0C, 0x0C, 0x14, 0x24, 0x24, 0x44, 0x7F, 0x04, 0x04, 0x1F, 0x00, 0x00,), - '5' : (0x00, 0x00, 0x00, 0x7E, 0x40, 0x40, 0x40, 0x78, 0x44, 0x02, 0x02, 0x42, 0x44, 0x38, 0x00, 0x00,), - '6' : (0x00, 0x00, 0x00, 0x18, 0x24, 0x40, 0x40, 0x5C, 0x62, 0x42, 0x42, 0x42, 0x22, 0x1C, 0x00, 0x00,), - '7' : (0x00, 0x00, 0x00, 0x7E, 0x42, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00,), - '8' : (0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x24, 0x18, 0x24, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00,), - '9' : (0x00, 0x00, 0x00, 0x38, 0x44, 0x42, 0x42, 0x42, 0x46, 0x3A, 0x02, 0x02, 0x24, 0x18, 0x00, 0x00,), - ':' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,), - ';' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10,), - '<' : (0x00, 0x00, 0x00, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x00, 0x00,), - '=' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,), - '>' : (0x00, 0x00, 0x00, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x00, 0x00,), - '?' : (0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x62, 0x04, 0x08, 0x08, 0x08, 0x00, 0x18, 0x18, 0x00, 0x00,), - '@' : (0x00, 0x00, 0x00, 0x38, 0x44, 0x5A, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x5C, 0x42, 0x3C, 0x00, 0x00,), - 'A' : (0x00, 0x00, 0x00, 0x10, 0x10, 0x18, 0x28, 0x28, 0x24, 0x3C, 0x44, 0x42, 0x42, 0xE7, 0x00, 0x00,), - 'B' : (0x00, 0x00, 0x00, 0xF8, 0x44, 0x44, 0x44, 0x78, 0x44, 0x42, 0x42, 0x42, 0x44, 0xF8, 0x00, 0x00,), - 'C' : (0x00, 0x00, 0x00, 0x3E, 0x42, 0x42, 0x80, 0x80, 0x80, 0x80, 0x80, 0x42, 0x44, 0x38, 0x00, 0x00,), - 'D' : (0x00, 0x00, 0x00, 0xF8, 0x44, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x44, 0xF8, 0x00, 0x00,), - 'E' : (0x00, 0x00, 0x00, 0xFC, 0x42, 0x48, 0x48, 0x78, 0x48, 0x48, 0x40, 0x42, 0x42, 0xFC, 0x00, 0x00,), - 'F' : (0x00, 0x00, 0x00, 0xFC, 0x42, 0x48, 0x48, 0x78, 0x48, 0x48, 0x40, 0x40, 0x40, 0xE0, 0x00, 0x00,), - 'G' : (0x00, 0x00, 0x00, 0x3C, 0x44, 0x44, 0x80, 0x80, 0x80, 0x8E, 0x84, 0x44, 0x44, 0x38, 0x00, 0x00,), - 'H' : (0x00, 0x00, 0x00, 0xE7, 0x42, 0x42, 0x42, 0x42, 0x7E, 0x42, 0x42, 0x42, 0x42, 0xE7, 0x00, 0x00,), - 'I' : (0x00, 0x00, 0x00, 0x7C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7C, 0x00, 0x00,), - 'J' : (0x00, 0x00, 0x00, 0x3E, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x88, 0xF0,), - 'K' : (0x00, 0x00, 0x00, 0xEE, 0x44, 0x48, 0x50, 0x70, 0x50, 0x48, 0x48, 0x44, 0x44, 0xEE, 0x00, 0x00,), - 'L' : (0x00, 0x00, 0x00, 0xE0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x42, 0xFE, 0x00, 0x00,), - 'M' : (0x00, 0x00, 0x00, 0xEE, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x54, 0x54, 0x54, 0x54, 0xD6, 0x00, 0x00,), - 'N' : (0x00, 0x00, 0x00, 0xC7, 0x62, 0x62, 0x52, 0x52, 0x4A, 0x4A, 0x4A, 0x46, 0x46, 0xE2, 0x00, 0x00,), - 'O' : (0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x44, 0x38, 0x00, 0x00,), - 'P' : (0x00, 0x00, 0x00, 0xFC, 0x42, 0x42, 0x42, 0x42, 0x7C, 0x40, 0x40, 0x40, 0x40, 0xE0, 0x00, 0x00,), - 'Q' : (0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0xB2, 0x4C, 0x38, 0x06, 0x00,), - 'R' : (0x00, 0x00, 0x00, 0xFC, 0x42, 0x42, 0x42, 0x7C, 0x48, 0x48, 0x44, 0x44, 0x42, 0xE3, 0x00, 0x00,), - 'S' : (0x00, 0x00, 0x00, 0x3E, 0x42, 0x42, 0x40, 0x20, 0x18, 0x04, 0x02, 0x42, 0x42, 0x7C, 0x00, 0x00,), - 'T' : (0x00, 0x00, 0x00, 0xFE, 0x92, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00, 0x00,), - 'U' : (0x00, 0x00, 0x00, 0xE7, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00,), - 'V' : (0x00, 0x00, 0x00, 0xE7, 0x42, 0x42, 0x44, 0x24, 0x24, 0x28, 0x28, 0x18, 0x10, 0x10, 0x00, 0x00,), - 'W' : (0x00, 0x00, 0x00, 0xD6, 0x54, 0x54, 0x54, 0x54, 0x54, 0x6C, 0x28, 0x28, 0x28, 0x28, 0x00, 0x00,), - 'X' : (0x00, 0x00, 0x00, 0xE7, 0x42, 0x24, 0x24, 0x18, 0x18, 0x18, 0x24, 0x24, 0x42, 0xE7, 0x00, 0x00,), - 'Y' : (0x00, 0x00, 0x00, 0xEE, 0x44, 0x44, 0x28, 0x28, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00, 0x00,), - 'Z' : (0x00, 0x00, 0x00, 0x7E, 0x84, 0x04, 0x08, 0x08, 0x10, 0x20, 0x20, 0x42, 0x42, 0xFC, 0x00, 0x00,), - '[' : (0x00, 0x1E, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1E, 0x00,), - '\\' : (0x00, 0x00, 0x40, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x08, 0x08, 0x04, 0x04, 0x04, 0x02, 0x02,), - ']' : (0x00, 0x78, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x78, 0x00,), - '^' : (0x00, 0x18, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,), - '_' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,), - '`' : (0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,), - 'a' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x44, 0x0C, 0x34, 0x44, 0x4C, 0x36, 0x00, 0x00,), - 'b' : (0x00, 0x00, 0x00, 0x00, 0xC0, 0x40, 0x40, 0x58, 0x64, 0x42, 0x42, 0x42, 0x64, 0x58, 0x00, 0x00,), - 'c' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x22, 0x40, 0x40, 0x40, 0x22, 0x1C, 0x00, 0x00,), - 'd' : (0x00, 0x00, 0x00, 0x00, 0x06, 0x02, 0x02, 0x3E, 0x42, 0x42, 0x42, 0x42, 0x46, 0x3B, 0x00, 0x00,), - 'e' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x7E, 0x40, 0x42, 0x3C, 0x00, 0x00,), - 'f' : (0x00, 0x00, 0x00, 0x00, 0x0C, 0x12, 0x10, 0x7C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7C, 0x00, 0x00,), - 'g' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x44, 0x44, 0x38, 0x40, 0x3C, 0x42, 0x42, 0x3C,), - 'h' : (0x00, 0x00, 0x00, 0x00, 0xC0, 0x40, 0x40, 0x5C, 0x62, 0x42, 0x42, 0x42, 0x42, 0xE7, 0x00, 0x00,), - 'i' : (0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x70, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7C, 0x00, 0x00,), - 'j' : (0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x1C, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x44, 0x78,), - 'k' : (0x00, 0x00, 0x00, 0x00, 0xC0, 0x40, 0x40, 0x4E, 0x48, 0x50, 0x70, 0x48, 0x44, 0xEE, 0x00, 0x00,), - 'l' : (0x00, 0x00, 0x00, 0x10, 0x70, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7C, 0x00, 0x00,), - 'm' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x49, 0x49, 0x49, 0x49, 0x49, 0xED, 0x00, 0x00,), - 'n' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x62, 0x42, 0x42, 0x42, 0x42, 0xE7, 0x00, 0x00,), - 'o' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00,), - 'p' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x64, 0x42, 0x42, 0x42, 0x64, 0x58, 0x40, 0xE0,), - 'q' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x26, 0x42, 0x42, 0x42, 0x26, 0x1A, 0x02, 0x07,), - 'r' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0x32, 0x20, 0x20, 0x20, 0x20, 0xF8, 0x00, 0x00,), - 's' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x42, 0x40, 0x3C, 0x02, 0x42, 0x7C, 0x00, 0x00,), - 't' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x7C, 0x10, 0x10, 0x10, 0x10, 0x12, 0x0C, 0x00, 0x00,), - 'u' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0x42, 0x42, 0x42, 0x42, 0x46, 0x3B, 0x00, 0x00,), - 'v' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0x44, 0x44, 0x28, 0x28, 0x10, 0x10, 0x00, 0x00,), - 'w' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDB, 0x89, 0x4A, 0x5A, 0x54, 0x24, 0x24, 0x00, 0x00,), - 'x' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x24, 0x18, 0x18, 0x18, 0x24, 0x6E, 0x00, 0x00,), - 'y' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0x42, 0x24, 0x24, 0x18, 0x18, 0x10, 0x10, 0x60,), - 'z' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x44, 0x08, 0x10, 0x10, 0x22, 0x7E, 0x00, 0x00,), - '{' : (0x00, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x00,), - '|' : (0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,), - '}' : (0x00, 0xC0, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x10, 0x20, 0x20, 0x20, 0x20, 0x20, 0xC0, 0x00,), - '~' : (0x20, 0x5A, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,), -} - - -''' -常用ASCII字符集 -字宽:16 【实际取模时,字宽设置为32,对应英文字宽则为16】 -字高:24 -宋体、阴码,逐行式,顺向(高位在前) -''' -ascii_16x24_dict = { - ' ' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '!' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x03, 0xC0, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '"' : (0x00, 0x00, 0x00, 0x00, 0x03, 0x18, 0x07, 0x38, 0x0E, 0x70, 0x18, 0xC0, 0x10, 0x80, 0x21, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '#' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x04, 0x08, 0x04, 0x18, 0x0C, 0x10, - 0x7F, 0xFE, 0x7F, 0xFE, 0x08, 0x10, 0x08, 0x10, 0x08, 0x10, 0x08, 0x10, 0x08, 0x10, 0x7F, 0xFE, - 0x7F, 0xFE, 0x18, 0x20, 0x10, 0x20, 0x10, 0x20, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '$' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x01, 0xC0, 0x07, 0xB0, 0x19, 0x98, 0x19, 0x98, - 0x19, 0xB8, 0x1D, 0x80, 0x0F, 0x80, 0x07, 0x80, 0x01, 0xC0, 0x01, 0xF0, 0x01, 0xB8, 0x01, 0x98, - 0x39, 0x98, 0x39, 0x98, 0x31, 0x98, 0x19, 0xB0, 0x07, 0xC0, 0x01, 0x80, 0x01, 0x80, 0x00, 0x00), - '%' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x64, 0x10, 0x46, 0x10, 0xC6, 0x20, - 0xC6, 0x40, 0xC6, 0x40, 0x46, 0x80, 0x44, 0x80, 0x3D, 0x18, 0x01, 0x64, 0x02, 0x46, 0x02, 0x42, - 0x04, 0x42, 0x04, 0x42, 0x08, 0x46, 0x10, 0x64, 0x10, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '&' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x08, 0x80, 0x10, 0xC0, 0x10, 0xC0, - 0x10, 0xC0, 0x19, 0x80, 0x19, 0x00, 0x1E, 0x20, 0x1C, 0x18, 0x2E, 0x10, 0x46, 0x10, 0x43, 0x10, - 0xC3, 0xA0, 0xC1, 0xE0, 0x60, 0xE1, 0x31, 0xF2, 0x1E, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - "'" : (0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '(' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x30, 0x00, 0x20, 0x00, 0x40, 0x00, 0xC0, - 0x00, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x00, 0xC0, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00), - ')' : (0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x06, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x06, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x60, 0x00, 0x00, 0x00), - '*' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x71, 0x8E, 0x79, 0xBC, 0x0F, 0x60, 0x01, 0x80, 0x0F, 0x70, 0x79, 0x9E, 0x61, 0x8E, - 0x01, 0x80, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '+' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, - 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x7F, 0xFE, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, - 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - ',' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x20, 0x00), - '-' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '.' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x3C, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '/' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, - 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x80, 0x01, 0x80, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00), - '0' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x06, 0x60, 0x1C, 0x18, 0x18, 0x18, - 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, - 0x30, 0x0C, 0x18, 0x18, 0x18, 0x18, 0x0C, 0x30, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '1' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x80, 0x07, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0xC0, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '2' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x0C, 0x30, 0x10, 0x18, 0x30, 0x0C, - 0x38, 0x0C, 0x38, 0x1C, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x02, 0x00, - 0x04, 0x00, 0x18, 0x04, 0x30, 0x0C, 0x3F, 0xF8, 0x3F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '3' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x08, 0x70, 0x10, 0x38, 0x38, 0x18, - 0x18, 0x18, 0x00, 0x18, 0x00, 0x30, 0x00, 0xE0, 0x01, 0xE0, 0x00, 0x18, 0x00, 0x18, 0x00, 0x0C, - 0x10, 0x0C, 0x38, 0x0C, 0x30, 0x18, 0x18, 0x30, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '4' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x70, 0x00, 0xF0, 0x00, 0xF0, - 0x01, 0x70, 0x02, 0x70, 0x04, 0x70, 0x08, 0x70, 0x18, 0x70, 0x10, 0x70, 0x20, 0x70, 0x7F, 0xFE, - 0x00, 0x70, 0x00, 0x70, 0x00, 0x70, 0x00, 0x70, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '5' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0x10, 0x00, 0x10, 0x00, - 0x10, 0x00, 0x10, 0x00, 0x13, 0xC0, 0x1C, 0x30, 0x10, 0x18, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, - 0x38, 0x0C, 0x38, 0x0C, 0x30, 0x18, 0x18, 0x30, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '6' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x06, 0x18, 0x08, 0x18, 0x18, 0x18, - 0x30, 0x00, 0x30, 0x00, 0x30, 0xC0, 0x37, 0x38, 0x38, 0x1C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, - 0x30, 0x0C, 0x30, 0x0C, 0x18, 0x08, 0x0C, 0x10, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '7' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x30, 0x08, 0x20, 0x10, - 0x20, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x80, 0x01, 0x80, 0x01, 0x80, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x80, 0x03, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '8' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x0C, 0x30, 0x30, 0x08, 0x30, 0x0C, - 0x30, 0x0C, 0x30, 0x0C, 0x1C, 0x18, 0x0F, 0x20, 0x07, 0xE0, 0x18, 0x70, 0x30, 0x18, 0x20, 0x0C, - 0x60, 0x0C, 0x60, 0x0C, 0x30, 0x0C, 0x18, 0x18, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '9' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x0C, 0x70, 0x30, 0x18, 0x30, 0x18, - 0x70, 0x0C, 0x70, 0x0C, 0x70, 0x0C, 0x30, 0x1C, 0x30, 0x3C, 0x1C, 0x6C, 0x07, 0x8C, 0x00, 0x1C, - 0x00, 0x18, 0x00, 0x18, 0x18, 0x30, 0x18, 0x60, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - ':' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x03, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x03, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - ';' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x03, 0x80, 0x01, 0x80, 0x01, 0x00, 0x00, 0x00), - '<' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x20, 0x00, 0xC0, - 0x01, 0x80, 0x02, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, 0x18, 0x00, 0x04, 0x00, 0x03, 0x00, - 0x01, 0x80, 0x00, 0x40, 0x00, 0x30, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '=' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '>' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x18, 0x00, 0x04, 0x00, 0x03, 0x00, - 0x01, 0x80, 0x00, 0x40, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x20, 0x00, 0xC0, - 0x01, 0x80, 0x02, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '?' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x18, 0x18, 0x30, 0x0C, 0x20, 0x0C, - 0x30, 0x0C, 0x38, 0x0C, 0x00, 0x1C, 0x00, 0x38, 0x00, 0xE0, 0x01, 0x80, 0x01, 0x00, 0x01, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x80, 0x03, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '@' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x06, 0x18, 0x08, 0x04, 0x10, 0x7E, - 0x31, 0x92, 0x23, 0x12, 0x62, 0x32, 0x66, 0x32, 0x66, 0x32, 0x64, 0x22, 0x64, 0x62, 0x24, 0x64, - 0x33, 0xB8, 0x30, 0x02, 0x18, 0x04, 0x0C, 0x18, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'A' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x80, 0x02, 0x80, 0x02, 0xC0, - 0x02, 0xC0, 0x04, 0x40, 0x04, 0x60, 0x04, 0x60, 0x08, 0x60, 0x08, 0x30, 0x0F, 0xF0, 0x10, 0x30, - 0x10, 0x18, 0x10, 0x18, 0x20, 0x18, 0x20, 0x1C, 0xF8, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'B' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xF0, 0x18, 0x18, 0x18, 0x0C, - 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x18, 0x18, 0x60, 0x1F, 0xB0, 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x0E, - 0x18, 0x0E, 0x18, 0x0E, 0x18, 0x0C, 0x18, 0x18, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'C' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x06, 0x1C, 0x18, 0x04, 0x18, 0x06, - 0x30, 0x02, 0x30, 0x00, 0x70, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x70, 0x00, - 0x30, 0x02, 0x30, 0x04, 0x18, 0x04, 0x0C, 0x18, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'D' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xE0, 0x18, 0x18, 0x18, 0x1C, - 0x18, 0x0C, 0x18, 0x0E, 0x18, 0x0E, 0x18, 0x0E, 0x18, 0x0E, 0x18, 0x0E, 0x18, 0x0E, 0x18, 0x0C, - 0x18, 0x0C, 0x18, 0x1C, 0x18, 0x18, 0x18, 0x60, 0x7F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'E' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x18, 0x04, 0x18, 0x02, - 0x18, 0x00, 0x18, 0x10, 0x18, 0x10, 0x18, 0x30, 0x1F, 0xF0, 0x18, 0x10, 0x18, 0x10, 0x18, 0x00, - 0x18, 0x00, 0x18, 0x02, 0x18, 0x04, 0x18, 0x0C, 0x7F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'F' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x18, 0x06, 0x18, 0x02, - 0x18, 0x00, 0x18, 0x00, 0x18, 0x10, 0x18, 0x10, 0x1F, 0xF0, 0x18, 0x10, 0x18, 0x10, 0x18, 0x00, - 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'G' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC8, 0x0E, 0x38, 0x18, 0x18, 0x30, 0x08, - 0x30, 0x04, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x20, 0x60, 0x1C, 0x60, 0x18, - 0x30, 0x18, 0x30, 0x18, 0x18, 0x18, 0x0C, 0x18, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'H' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1C, 0x30, 0x0C, 0x30, 0x0C, - 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x3F, 0xFC, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, - 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0xFC, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'I' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF0, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x1F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'J' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x70, 0x40, 0x71, 0x80, 0x1E, 0x00), - 'K' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x3C, 0x18, 0x30, 0x18, 0x20, - 0x18, 0x40, 0x18, 0x80, 0x19, 0x00, 0x1B, 0x80, 0x1D, 0x80, 0x18, 0xC0, 0x18, 0xC0, 0x18, 0x60, - 0x18, 0x30, 0x18, 0x30, 0x18, 0x18, 0x18, 0x1C, 0x7E, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'L' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x18, 0x00, 0x18, 0x00, - 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, - 0x18, 0x00, 0x18, 0x02, 0x18, 0x06, 0x18, 0x0C, 0x7F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'M' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x1E, 0x30, 0x1C, 0x38, 0x1C, - 0x38, 0x2C, 0x28, 0x2C, 0x2C, 0x2C, 0x2C, 0x4C, 0x2C, 0x4C, 0x24, 0x4C, 0x26, 0x8C, 0x26, 0x8C, - 0x22, 0x8C, 0x23, 0x0C, 0x23, 0x0C, 0x23, 0x0C, 0xF1, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'N' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0E, 0x38, 0x04, 0x2C, 0x04, - 0x26, 0x04, 0x27, 0x04, 0x23, 0x04, 0x21, 0x84, 0x21, 0xC4, 0x20, 0xC4, 0x20, 0x64, 0x20, 0x74, - 0x20, 0x34, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x0C, 0xF8, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'O' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x0C, 0x30, 0x18, 0x18, 0x30, 0x0C, - 0x30, 0x0C, 0x30, 0x0E, 0x70, 0x06, 0x70, 0x06, 0x70, 0x06, 0x70, 0x06, 0x70, 0x06, 0x30, 0x06, - 0x30, 0x0C, 0x30, 0x0C, 0x18, 0x08, 0x0C, 0x30, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'P' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xF8, 0x18, 0x0C, 0x18, 0x0E, - 0x18, 0x06, 0x18, 0x06, 0x18, 0x0C, 0x18, 0x0C, 0x1F, 0xF0, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, - 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'Q' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x0C, 0x30, 0x18, 0x18, 0x30, 0x0C, - 0x30, 0x0C, 0x70, 0x0E, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x70, 0x0E, - 0x37, 0x8C, 0x38, 0xCC, 0x18, 0x78, 0x0C, 0x70, 0x03, 0xF0, 0x00, 0x3C, 0x00, 0x18, 0x00, 0x00), - 'R' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xF8, 0x18, 0x1C, 0x18, 0x0C, - 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x18, 0x18, 0x30, 0x1F, 0xC0, 0x18, 0xC0, 0x18, 0x60, 0x18, 0x60, - 0x18, 0x30, 0x18, 0x30, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'S' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x18, 0x38, 0x30, 0x18, 0x20, 0x08, - 0x20, 0x00, 0x30, 0x00, 0x38, 0x00, 0x0F, 0x00, 0x03, 0xE0, 0x00, 0x78, 0x00, 0x18, 0x00, 0x0C, - 0x40, 0x0C, 0x20, 0x0C, 0x30, 0x08, 0x38, 0x18, 0x27, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'T' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x61, 0x84, 0x41, 0x82, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'U' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x30, 0x08, 0x30, 0x08, - 0x30, 0x08, 0x30, 0x08, 0x30, 0x08, 0x30, 0x08, 0x30, 0x08, 0x30, 0x08, 0x30, 0x08, 0x30, 0x08, - 0x30, 0x08, 0x30, 0x08, 0x18, 0x08, 0x18, 0x30, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'V' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x18, 0x08, 0x18, 0x08, - 0x18, 0x10, 0x1C, 0x10, 0x0C, 0x10, 0x0C, 0x20, 0x0E, 0x20, 0x06, 0x40, 0x06, 0x40, 0x06, 0x40, - 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'W' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x86, 0x21, 0x84, 0x31, 0x84, - 0x30, 0x84, 0x31, 0xC4, 0x31, 0xC8, 0x11, 0xC8, 0x1A, 0xC8, 0x1A, 0x48, 0x1A, 0x70, 0x1A, 0x70, - 0x0C, 0x70, 0x0C, 0x70, 0x0C, 0x20, 0x0C, 0x20, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'X' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1C, 0x18, 0x10, 0x0C, 0x10, - 0x06, 0x20, 0x06, 0x40, 0x03, 0x40, 0x03, 0x80, 0x01, 0x80, 0x01, 0xC0, 0x02, 0xC0, 0x02, 0x60, - 0x04, 0x70, 0x08, 0x30, 0x08, 0x18, 0x10, 0x1C, 0x7C, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'Y' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1C, 0x18, 0x08, 0x18, 0x10, - 0x0C, 0x10, 0x0C, 0x20, 0x06, 0x20, 0x06, 0x40, 0x03, 0x40, 0x03, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'Z' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x30, 0x18, 0x20, 0x38, - 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, 0x07, 0x00, 0x06, 0x00, - 0x0C, 0x00, 0x18, 0x04, 0x18, 0x04, 0x30, 0x1C, 0x7F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '[' : (0x00, 0x00, 0x00, 0x00, 0x03, 0xFC, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00), - '\\' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x18, 0x00, 0x08, 0x00, 0x0C, 0x00, - 0x06, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x01, 0x80, 0x00, 0x80, 0x00, 0xC0, 0x00, 0x40, - 0x00, 0x60, 0x00, 0x20, 0x00, 0x30, 0x00, 0x10, 0x00, 0x18, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x04), - ']' : (0x00, 0x00, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, - 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, - 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x3F, 0xC0, 0x00, 0x00), - '^' : (0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x0C, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '_' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF), - '`' : (0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'a' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0F, 0xE0, 0x30, 0x10, 0x30, 0x18, 0x00, 0x18, 0x03, 0xF8, 0x1C, 0x18, - 0x30, 0x18, 0x70, 0x18, 0x70, 0x18, 0x30, 0x7A, 0x0F, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'b' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x00, 0x10, 0x00, 0x10, 0x00, - 0x10, 0x00, 0x10, 0x00, 0x13, 0xF0, 0x14, 0x18, 0x18, 0x0C, 0x18, 0x0C, 0x10, 0x0C, 0x10, 0x0C, - 0x10, 0x0C, 0x10, 0x0C, 0x18, 0x08, 0x1C, 0x10, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'c' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x0C, 0x18, 0x18, 0x18, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, - 0x30, 0x00, 0x30, 0x04, 0x18, 0x08, 0x0C, 0x18, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'd' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, - 0x00, 0x18, 0x00, 0x18, 0x07, 0xD8, 0x0C, 0x38, 0x18, 0x18, 0x30, 0x18, 0x30, 0x18, 0x30, 0x18, - 0x30, 0x18, 0x30, 0x18, 0x18, 0x18, 0x0C, 0x7E, 0x03, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'e' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x08, 0x18, 0x18, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x3F, 0xF0, - 0x30, 0x00, 0x30, 0x00, 0x18, 0x08, 0x0C, 0x10, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'f' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFE, 0x03, 0x06, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x3F, 0xF8, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'g' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x08, 0x36, 0x18, 0x10, 0x10, 0x18, 0x18, 0x10, 0x08, 0x30, - 0x0F, 0xC0, 0x10, 0x00, 0x1F, 0x80, 0x0B, 0xF8, 0x30, 0x0C, 0x20, 0x0C, 0x30, 0x0C, 0x0F, 0xF0), - 'h' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, - 0x18, 0x00, 0x18, 0x00, 0x1B, 0xF0, 0x1C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7C, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'i' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x01, 0xC0, 0x01, 0x80, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x1F, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x1F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'j' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x38, 0x00, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, - 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x30, 0x38, 0x20, 0x1F, 0xC0), - 'k' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, - 0x18, 0x00, 0x18, 0x00, 0x18, 0x7C, 0x18, 0x20, 0x18, 0x40, 0x19, 0x80, 0x1B, 0x80, 0x1C, 0xC0, - 0x18, 0x60, 0x18, 0x60, 0x18, 0x30, 0x18, 0x18, 0x7C, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'l' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x1F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'm' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xEF, 0x3C, 0x31, 0xC6, 0x21, 0x86, 0x21, 0x86, 0x21, 0x86, 0x21, 0x86, - 0x21, 0x86, 0x21, 0x86, 0x21, 0x86, 0x21, 0x86, 0xFB, 0xCF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'n' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7B, 0xF0, 0x1C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7C, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'o' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x18, 0x18, 0x10, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, - 0x30, 0x0C, 0x30, 0x0C, 0x10, 0x08, 0x08, 0x10, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'p' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7B, 0xE0, 0x1C, 0x18, 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x0C, - 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x0C, 0x1C, 0x38, 0x1B, 0xC0, 0x18, 0x00, 0x18, 0x00, 0x3C, 0x00), - 'q' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0xC8, 0x18, 0x38, 0x30, 0x18, 0x30, 0x18, 0x30, 0x18, 0x30, 0x18, - 0x30, 0x18, 0x30, 0x18, 0x30, 0x18, 0x18, 0x38, 0x07, 0xD8, 0x00, 0x18, 0x00, 0x18, 0x00, 0x3C), - 'r' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7C, 0x7C, 0x04, 0x8E, 0x05, 0x00, 0x06, 0x00, 0x04, 0x00, 0x04, 0x00, - 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x7F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 's' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x08, 0x18, 0x18, 0x08, 0x18, 0x00, 0x0F, 0x00, 0x01, 0xF0, - 0x00, 0x38, 0x00, 0x0C, 0x10, 0x0C, 0x18, 0x18, 0x17, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 't' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x03, 0x00, 0x07, 0x00, 0x3F, 0xF8, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x04, 0x03, 0x18, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'u' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x70, 0x78, 0x10, 0x18, 0x10, 0x18, 0x10, 0x18, 0x10, 0x18, 0x10, 0x18, - 0x10, 0x18, 0x10, 0x18, 0x18, 0x18, 0x1C, 0x7E, 0x07, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'v' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7E, 0x3E, 0x18, 0x08, 0x08, 0x10, 0x0C, 0x10, 0x0C, 0x20, 0x06, 0x20, - 0x06, 0x40, 0x03, 0x40, 0x03, 0x80, 0x01, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'w' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xFB, 0xCF, 0x21, 0x84, 0x31, 0x84, 0x31, 0x88, 0x11, 0xC8, 0x1A, 0xC8, - 0x1A, 0x50, 0x0A, 0x70, 0x0C, 0x70, 0x0C, 0x20, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'x' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x0C, 0x10, 0x06, 0x20, 0x03, 0x40, 0x01, 0x80, 0x01, 0x80, - 0x02, 0xC0, 0x04, 0x60, 0x0C, 0x30, 0x18, 0x18, 0x7C, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'y' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7E, 0x3E, 0x18, 0x18, 0x0C, 0x10, 0x0C, 0x30, 0x06, 0x20, 0x06, 0x20, - 0x03, 0x40, 0x03, 0x40, 0x01, 0x80, 0x01, 0x80, 0x01, 0x00, 0x01, 0x00, 0x12, 0x00, 0x3C, 0x00), - 'z' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0x10, 0x30, 0x20, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, - 0x06, 0x00, 0x06, 0x04, 0x0C, 0x08, 0x18, 0x18, 0x3F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '{' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x20, 0x00, 0x20, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x00, 0x40, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x1C, 0x00, 0x00), - '|' : (0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00), - '}' : (0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x04, 0x00, 0x04, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, - 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, 0x02, 0x00, 0x06, 0x00, 0x06, 0x00, - 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x38, 0x00, 0x00, 0x00), - '~' : (0x00, 0x00, 0x1E, 0x00, 0x21, 0x82, 0x40, 0xC4, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), -} \ No newline at end of file diff --git "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\233\276\347\211\207/image.py" "b/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\233\276\347\211\207/image.py" deleted file mode 100644 index b82855a5a7e09519744f68df77c95e9d419b1b08..0000000000000000000000000000000000000000 --- "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\233\276\347\211\207/image.py" +++ /dev/null @@ -1,1244 +0,0 @@ -''' -通过工具将图片转换为数组的形式保存在一个元组中, -下面是像素为 99x100 的四叶草图片 -''' -image_buf = ( - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBF,0XFF,0XDD,0XF7,0XBF,0XF7,0XBE,0XFF,0XFC,0XF7,0XFC,0XE7,0XD9,0XDF, - 0XFC,0XF7,0X9F,0XF7,0XBF,0XFF,0X7E,0XFF,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0XBF,0XF7,0XBF,0XF7, - 0XBF,0XFF,0XBE,0XF7,0XDE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0XD0,0XB6,0X23,0X55, - 0X20,0X45,0X80,0X45,0X61,0X3D,0X80,0X45,0X80,0X4D,0XC4,0X54,0XFA,0XE7,0XBE,0XFF, - 0XBE,0XFF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBD,0XF7,0XBD,0XF7,0XBE,0XFF, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XFF,0XBE,0XF7,0XBF,0XF7,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBC,0XEF, - 0XE1,0X4C,0X40,0X3D,0X21,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X4D,0X40,0X4D, - 0X60,0X45,0X40,0X4D,0XAC,0X85,0XDE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0X9F,0XF7,0XFE,0XEF,0XFD,0XE7,0XB7,0XCF,0X77,0XCF,0XD9,0XD7,0XFD,0XF7,0XDF,0XFF, - 0XBE,0XFF,0XDE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7, - 0XDF,0XF7,0XDC,0XF7,0X22,0X4D,0X60,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X65,0X65,0X9F,0XFF, - 0XDF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0XDE,0XF7,0XBE,0XF7, - 0X9F,0XFF,0XDD,0XEF,0XCB,0X7D,0X21,0X4D,0X20,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X02,0X4D,0XB7,0XD7,0XBF,0XFF,0XDF,0XFF,0XBF,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBF,0XF7,0XBD,0XFF,0X9F,0XEF,0XE3,0X54,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X22,0X4D,0X2C,0X8E,0X9E,0XFF,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0XF4,0XB6,0X20,0X4D,0X80,0X55,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X41,0X45,0X60,0X3D,0X40,0X45,0X05,0X5D, - 0XBE,0XEF,0X9E,0XFF,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0XBD,0XFF,0XD9,0XDF,0X60,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X60,0X3D,0XFB,0XEF,0XBD,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBD,0XFF,0XDF,0XFF,0X4F,0X9E,0X40,0X45,0X61,0X3D, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X20,0X4D, - 0X40,0X45,0X40,0X45,0X40,0X45,0X6A,0X75,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XFF, - 0XBF,0XF7,0X0A,0X86,0X21,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X20,0X4D,0X22,0X4D,0XBF,0XFF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XFF,0XDC,0XE7, - 0X20,0X45,0X40,0X45,0X40,0X4D,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X60,0X45,0X40,0X45,0X40,0X45,0X60,0X45,0X40,0X45,0X9B,0XD7, - 0X9D,0XFF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XFF,0XBE,0XF7,0X26,0X65,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0XFB,0XE7,0X9E,0XFF,0XDE,0XF7, - 0XBE,0XF7,0X9F,0XF7,0XE4,0X54,0X60,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X60,0X3D,0XC5,0X54,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0XDE,0XF7,0X0D,0X8E, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X60,0X45,0X20,0X4D,0X60,0X3D, - 0X66,0X6D,0X9E,0XFF,0XBE,0XF7,0XBE,0XF7,0XFB,0XE7,0X40,0X4D,0X60,0X3D,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0XFD,0XEF,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBF,0XF7,0XBD,0XFF,0XF9,0XDF,0X20,0X4D,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X60,0X3D,0X20,0X4D,0X40,0X45,0X21,0X4D,0XFD,0XEF,0XBE,0XF7,0XBF,0XF7,0XEB,0X85, - 0X41,0X45,0X41,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X20,0X4D, - 0X80,0X3D,0XB4,0XB6,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0XBE,0XFF,0XBF,0XFF,0XBE,0XEF,0XD9,0XDF,0XCA,0X7D, - 0X23,0X55,0X02,0X4D,0XE1,0X4C,0X04,0X55,0X68,0X7D,0X54,0XBF,0X62,0X55,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0XB8,0XDF, - 0XBF,0XF7,0XBE,0XF7,0XC3,0X54,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X86,0X5D,0XBF,0XF7,0XBE,0XF7,0XBF,0XF7, - 0XBE,0XF7,0XBF,0XF7,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XDF,0XFF,0X32,0XB7, - 0X40,0X45,0X40,0X45,0X40,0X45,0X20,0X4D,0X20,0X4D,0X20,0X4D,0X20,0X4D,0X60,0X45, - 0X60,0X3D,0X20,0X4D,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X0B,0X86,0XBF,0XFF,0XDE,0XF7,0XE1,0X4C,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X21,0X4D, - 0XDE,0XF7,0XBE,0XFF,0XBE,0XF7,0XDF,0XFF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XDF,0XFF,0XAA,0X7D,0X40,0X3D,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X20,0X45,0X21,0X4D,0X9F,0XFF,0XDE,0XF7, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X22,0X4D,0XFE,0XEF,0XBF,0XFF,0XDF,0XF7,0XFC,0XE7,0XFD,0XF7, - 0X9E,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XFA,0XE7,0X60,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0XBF,0XFF,0XDE,0XEF,0X41,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X21,0X4D,0XFB,0XEF,0XC7,0X64, - 0X60,0X45,0X40,0X45,0X60,0X4D,0XC2,0X4C,0X34,0XBF,0XDF,0XFF,0XFF,0XFF,0XBF,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0X46,0X5D,0X80,0X45, - 0X20,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X4D,0X40,0X45,0XFE,0XF7,0X39,0XD7,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X42,0X55,0X60,0X3D,0X40,0X4D,0X40,0X45,0X40,0X45,0X40,0X45,0X20,0X3D, - 0XC3,0X4C,0XDC,0XEF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XDF,0XFF,0X20,0X45,0X60,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X4D,0X40,0X3D,0XFC,0XE7, - 0XD5,0XBE,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X41,0X45,0X40,0X45,0X40,0X45, - 0X20,0X4D,0X40,0X45,0X21,0X45,0X80,0X3D,0XC3,0X4C,0XDE,0XF7,0XBE,0XF7,0XBF,0XF7, - 0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0XFD,0XFF,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0XB6,0XD7,0X90,0XA6,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X03,0X45,0X7E,0XFF,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0XDE,0XFF,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0XF2,0XBE,0X2E,0X96,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X3D,0X37,0XC7,0XBD,0XF7,0XBF,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0X41,0X45,0X60,0X4D,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X70,0XA6,0XEC,0X85,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X00,0X3D,0X22,0X4D, - 0X9E,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0X22,0X55,0X60,0X45,0X22,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X6E,0X96,0XEA,0X7D,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X21,0X45,0X40,0X45,0XFF,0XEF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0X69,0X75,0X60,0X45,0X21,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X2D,0X8E,0XA9,0X6D, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X37,0XC7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XFC,0XEF,0X20,0X3D,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X0C,0X8E,0X68,0X6D,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X60,0X45,0X30,0X9E,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XDF,0XFF,0X20,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X2C,0X8E,0X47,0X65,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X50,0X96,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0X9D,0XF7,0X56,0XC7,0X80,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X6E,0X96, - 0X05,0X55,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0XD9,0XD7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XFF,0X9F,0XF7,0XE4,0X5C,0X20,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X90,0X9E,0X03,0X4D,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X4D,0X20,0X45,0XFE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7, - 0XDD,0XF7,0XBE,0XF7,0X82,0X4D,0X20,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X12,0XB7,0XE2,0X44,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X20,0X45,0X63,0X5D,0X9F,0XFF,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0X88,0X75,0X60,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X60,0X45, - 0X96,0XD7,0X22,0X4D,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X81,0X4D,0XDB,0XE7, - 0XBF,0XFF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0X9F,0XFF,0X97,0XD7,0X22,0X4D,0X20,0X45,0X60,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0XD9,0XDF,0X42,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X60,0X4D,0X0C,0X96,0X9F,0XF7,0XBC,0XFF,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0XBE,0XF7,0XDE,0XF7,0X9D,0XEF,0X35,0XC7, - 0X02,0X4D,0X60,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X60,0X45,0X40,0X45,0XFC,0XE7,0X41,0X3D, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X07,0X65,0XBF,0XFF,0XFE,0XFF,0XBF,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XFF,0XBF,0XF7,0XBD,0XEF,0XFB,0XEF,0X8A,0X75,0X21,0X4D,0X20,0X45, - 0X40,0X45,0X60,0X45,0X60,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X4D, - 0X60,0X3D,0XDD,0XF7,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X60,0X45,0X20,0X4D,0X20,0X3D,0X6A,0X75,0X9D,0XEF,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0XBF,0XF7,0XBE,0XF7, - 0X9E,0XFF,0XBE,0XF7,0XFA,0XEF,0XCB,0X85,0XE3,0X54,0X40,0X45,0X60,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0XDA,0XE7,0X40,0X4D,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X60,0X45,0X40,0X45,0X21,0X45,0X14,0XBF, - 0XBF,0XFF,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XFF,0XBF,0XF7,0XBF,0XF7,0XBE,0XF7,0XBD,0XF7,0XBE,0XFF,0XBE,0XEF, - 0XDC,0XEF,0X2D,0X9E,0X03,0X55,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X20,0X4D,0XB2,0XB6, - 0X20,0X4D,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X20,0X45, - 0X05,0X65,0XFD,0XF7,0XDF,0XFF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XDF,0XEF,0XBF,0XFF,0XBF,0XFF,0XDE,0XFF,0XDE,0XF7,0XDC,0XEF, - 0XB9,0XDF,0X14,0XBF,0X90,0XA6,0X6F,0X9E,0X70,0XA6,0XD1,0XAE,0X56,0XCF,0X99,0XDF, - 0XDD,0XF7,0XBD,0XF7,0XBF,0XF7,0X9F,0XFF,0XBE,0XF7,0XDF,0XF7,0XDD,0XF7,0X6F,0X9E, - 0X21,0X45,0X60,0X45,0X60,0X3D,0X20,0X4D,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X02,0X55,0X26,0X65,0X40,0X4D,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X4D,0X46,0X55,0XFD,0XEF,0XDE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XFF,0X9E,0XFF,0XDD,0XEF,0X99,0XD7, - 0X47,0X65,0X41,0X45,0X60,0X45,0X40,0X3D,0X60,0X3D,0X40,0X45,0X20,0X4D,0X20,0X4D, - 0X40,0X45,0X60,0X3D,0X60,0X45,0X60,0X45,0X60,0X45,0X01,0X4D,0X04,0X5D,0X8E,0XA6, - 0XFA,0XE7,0XDE,0XF7,0XBF,0XFF,0X9E,0XFF,0XFC,0XEF,0X44,0X65,0X40,0X4D,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0XC8,0X75,0X03,0X55,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X60,0X45, - 0X40,0X45,0X03,0X4D,0X2D,0X86,0XDF,0XEF,0X9E,0XFF,0XBE,0XF7,0XBF,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XDE,0XF7, - 0XB8,0XD7,0XE3,0X54,0X60,0X45,0X60,0X45,0X40,0X45,0X40,0X4D,0X20,0X4D,0X20,0X4D, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X4D,0X40,0X4D,0X40,0X4D,0X40,0X4D, - 0X60,0X45,0X60,0X45,0X60,0X3D,0X60,0X45,0X60,0X4D,0X01,0X4D,0XCC,0X85,0XBB,0XE7, - 0XBE,0XF7,0XFC,0XEF,0X67,0X6D,0X41,0X45,0X20,0X45,0X40,0X45,0X40,0X45,0X12,0XB7, - 0X40,0X45,0X60,0X3D,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X60,0X45,0X60,0X45, - 0X01,0X4D,0XC3,0X4C,0X2D,0X8E,0XFA,0XEF,0XDE,0XFF,0X7F,0XF7,0XBF,0XF7,0XDC,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7, - 0XDF,0XFF,0X7E,0XF7,0X0D,0X86,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X20,0X4D,0X65,0X65,0X97,0XCF,0XFA,0XEF,0XE4,0X5C, - 0X40,0X45,0X21,0X4D,0X6A,0X7E,0X40,0X45,0X60,0X3D,0X60,0X45,0X60,0X45,0X60,0X3D, - 0X40,0X45,0X40,0X45,0X40,0X45,0X41,0X45,0X40,0X3D,0X40,0X3D,0X60,0X45,0X01,0X4D, - 0XE4,0X54,0XEF,0X95,0XBA,0XDF,0XDE,0XEF,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XDE,0XF7,0XDE,0XF7,0XDF,0XF7,0XBF,0XF7,0XBE,0XFF,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XFF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBD,0XFF,0X9F,0XF7,0X6E,0X9E,0X40,0X45,0X60,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X41,0X45,0X60,0X3D, - 0X60,0X45,0X21,0X4D,0X06,0X5D,0XCB,0X86,0X60,0X45,0X61,0X4D,0X40,0X45,0X21,0X45, - 0X40,0X3D,0X41,0X45,0X21,0X4D,0X02,0X4D,0X24,0X55,0X87,0X6D,0X0D,0X8E,0X56,0XC7, - 0XDC,0XEF,0XBE,0XF7,0XBE,0XF7,0XBE,0XFF,0XBE,0XFF,0X9E,0XF7,0XBE,0XF7,0XBF,0XF7, - 0X9F,0XF7,0XBF,0XF7,0XBE,0XF7,0XDE,0XF7,0XBF,0XF7,0XBF,0XFF,0X9F,0XFF,0XBF,0XF7, - 0XDE,0XF7,0XBF,0XFF,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XFF,0XFA,0XE7,0X80,0X45, - 0X40,0X45,0X41,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X20,0X4D,0X40,0X45,0X40,0X45,0X60,0X3D,0X40,0X45,0X40,0X45,0X40,0X45, - 0X41,0X45,0X20,0X45,0X86,0X5D,0XAE,0X9E,0X75,0XC7,0XFA,0XE7,0XFB,0XE7,0XDC,0XEF, - 0XDD,0XEF,0XBD,0XF7,0XFC,0XEF,0XB9,0XD7,0X15,0XBF,0XD1,0XA6,0X0B,0X8E,0X86,0X6D, - 0X22,0X5D,0X01,0X55,0X21,0X4D,0X21,0X45,0X40,0X45,0X20,0X45,0X21,0X4D,0X21,0X55, - 0X01,0X55,0X67,0X6D,0X35,0XCF,0XBE,0XF7,0XDD,0XF7,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0X9F,0XFF,0X44,0X5D,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X20,0X4D, - 0X40,0X45,0X40,0X45,0X20,0X4D,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X60,0X45,0X60,0X45,0X60,0X3D,0X60,0X3D,0X40,0X45,0X40,0X45,0X40,0X45, - 0X60,0X45,0X60,0X45,0X60,0X45,0X60,0X45,0X60,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X80,0X45,0X60,0X45,0X40,0X45,0XEC,0X85, - 0XFD,0XEF,0X9F,0XFF,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0X40,0X45,0X20,0X4D,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X21,0X45,0X94,0XC7,0X60,0X4D,0X41,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X20,0X45,0XE4,0X5C,0XFB,0XF7,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XFB,0XE7,0X40,0X45, - 0X40,0X4D,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X42,0X45,0XEF,0XAE,0X88,0X85, - 0XCA,0X75,0X02,0X4D,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X60,0X3D,0XC6,0X5C, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBF,0XF7,0XFA,0XDF,0X60,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X23,0X4D,0X9F,0XFF,0X41,0X45,0X99,0XDF,0X45,0X5D,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X58,0XDF,0X9E,0XF7,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XFB,0XE7,0X60,0X3D,0X20,0X4D,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X20,0X4D,0XFB,0XE7,0XBD,0XF7,0X40,0X3D,0XDE,0XF7,0X8F,0X96, - 0X40,0X45,0X60,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0XE3,0X4C,0XBF,0XFF, - 0XDF,0XEF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XFD,0XF7, - 0X40,0X45,0X20,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X20,0X4D,0X60,0X3D,0X68,0X75,0XBF,0XF7,0XD9,0XDF, - 0X21,0X45,0XBF,0XFF,0XD9,0XDF,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X81,0X4D,0XBB,0XE7,0XBF,0XF7,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0X41,0X4D,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X41,0X45,0X20,0X4D, - 0XFC,0XEF,0X9E,0XFF,0XB1,0XA6,0X65,0X5D,0XBE,0XFF,0XDE,0XEF,0X40,0X45,0X20,0X4D, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X60,0X3D,0XD9,0XD7,0XBE,0XFF,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0X9F,0XFF,0XAF,0XA6,0XA1,0X4D, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X20,0X45,0XC9,0X75,0X9D,0XF7,0XBE,0XFF,0X45,0X5D,0X72,0X9E,0XBE,0XFF, - 0XBE,0XF7,0X41,0X4D,0X20,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X61,0X45, - 0XCC,0X85,0XBE,0XFF,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBD,0XFF,0XBD,0XEF,0X01,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0XDD,0XEF,0X9F,0XFF,0XBD,0XFF, - 0X02,0X4D,0XFA,0XDF,0X9E,0XF7,0XBE,0XFF,0X47,0X65,0X41,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0XE8,0X64,0XBE,0XFF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XFF,0XDE,0XF7,0XBF,0XFF,0XDB,0XE7,0XE2,0X4C,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0XA3,0X54, - 0XBE,0XFF,0XDE,0XF7,0XBE,0XFF,0X40,0X45,0XDD,0XEF,0XDF,0XF7,0X9E,0XFF,0X35,0XBF, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X60,0X45,0X08,0X6D,0XBE,0XFF, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XFB,0XEF,0X02,0X4D,0X20,0X3D,0X60,0X45,0X60,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X42,0X45,0XBD,0XF7,0XBD,0XF7,0XBF,0XF7,0XBD,0XF7,0X60,0X45,0XDE,0XF7, - 0XBD,0XFF,0X9F,0XF7,0XDC,0XEF,0X60,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X60,0X4D,0X34,0XBF,0X9E,0XFF,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBD,0XF7,0X9F,0XF7,0XDB,0XE7,0X76,0XC7, - 0X99,0XE7,0X0D,0X86,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X02,0X55,0XBE,0XF7,0XDF,0XFF,0XBF,0XF7, - 0XBA,0XE7,0X42,0X4D,0XBD,0XF7,0XBD,0XF7,0XBF,0XF7,0XDE,0XF7,0X02,0X4D,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0XDB,0XDF,0XBE,0XFF,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7, - 0XDD,0XF7,0XDD,0XF7,0XBF,0XF7,0XDD,0XF7,0X01,0X4D,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X60,0X45,0XD8,0XDF, - 0XBF,0XF7,0XBF,0XF7,0XBF,0XF7,0X54,0XC7,0X23,0X4D,0XBE,0XFF,0XBE,0XF7,0XBF,0XF7, - 0X9F,0XFF,0XEC,0X8D,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X27,0X65,0X9E,0XFF, - 0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XFF,0XFC,0XE7,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X20,0X4D,0XBF,0XF7,0XBE,0XF7,0XBF,0XF7,0XBE,0XF7,0X8E,0X96,0X46,0X65, - 0XBF,0XF7,0XBE,0XFF,0XBE,0XF7,0XBE,0XF7,0XDC,0XF7,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X20,0X4D,0X80,0X3D, - 0XE3,0X54,0XDE,0XF7,0XBE,0XFF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XDE,0XFF,0XD2,0XAE,0X60,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X3D,0X4F,0X96,0XDE,0XFF,0XBE,0XF7,0XBF,0XF7, - 0XBE,0XF7,0XA8,0X75,0XEA,0X85,0XBF,0XF7,0XBE,0XFF,0XBE,0XF7,0XBE,0XF7,0XDE,0XF7, - 0X03,0X55,0X60,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X3D,0X04,0X5D,0XDD,0XEF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XDF,0XFF,0XE5,0X5C,0X60,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X82,0X55,0XFD,0XF7, - 0XBE,0XFF,0XBE,0XF7,0XBF,0XF7,0XDE,0XFF,0X04,0X55,0X90,0X9E,0XBF,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0X0D,0X8E,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X60,0X3D,0X40,0X4D,0X02,0X4D,0X33,0XB7,0XBF,0XEF,0XBD,0XFF,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0X9F,0XF7,0XE3,0X54, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X27,0X65,0X9F,0XF7,0XBF,0XF7,0XBF,0XF7,0XBF,0XF7,0XBD,0XF7,0X03,0X4D, - 0X55,0XC7,0XBE,0XFF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0XFB,0XEF,0X41,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X01,0X55,0X24,0X5D,0X4F,0X9E,0XFA,0XE7,0XBF,0XF7,0X9F,0XFF, - 0XBD,0XF7,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBF,0XF7,0XC3,0X54,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X60,0X45,0X41,0X45,0XDB,0XE7,0X9F,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBD,0XF7,0X23,0X4D,0X97,0XCF,0XBE,0XFF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XFF,0X24,0X55,0X61,0X4D,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X03,0X55,0XFE,0XEF,0XBD,0XFF,0XBE,0XF7, - 0XBE,0XF7,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0X06,0X65,0X40,0X3D,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X60,0X45,0X08,0X65,0X9F,0XFF, - 0XBE,0XFF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBD,0XF7,0X03,0X4D,0XB7,0XD7,0XBE,0XFF, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0X9F,0XFF,0XD9,0XDF,0X20,0X3D,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X60,0X3D, - 0X04,0X55,0X9F,0XF7,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7, - 0XB4,0XCF,0X41,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X20,0X45,0XFB,0XEF,0XBE,0XF7,0XBF,0XF7,0XBF,0XF7,0XBE,0XFF,0XBE,0XF7,0XBD,0XF7, - 0X03,0X4D,0XD8,0XD7,0XBE,0XFF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7, - 0XBE,0XF7,0X01,0X4D,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X21,0X45,0X40,0X45,0XDB,0XE7,0XBE,0XF7,0XBF,0XF7,0XBF,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XFC,0XF7,0X42,0X55,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X60,0X45,0XD1,0XA6,0XBE,0XFF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XFF,0XBE,0XF7,0XBD,0XF7,0X03,0X4D,0XD8,0XD7,0XBE,0XFF,0XDE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0X9F,0XF7,0XB7,0XDF,0X61,0X4D,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X20,0X4D,0X60,0X3D,0X56,0XCF, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XDE,0XF7,0X9E,0XFF,0X13,0XAF, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X05,0X55,0XBF,0XF7,0XBE,0XFF, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XFF,0XBE,0XF7,0XBD,0XF7,0X23,0X4D,0X97,0XCF, - 0XBE,0XFF,0XDE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XFF,0XBF,0XFF, - 0XE5,0X5C,0X60,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X20,0X4D,0X60,0X3D,0X57,0XCF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBF,0XF7,0XDE,0XF7,0X2B,0X86,0X20,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X20,0X45,0X41,0X45, - 0X9C,0XEF,0XBF,0XF7,0XDE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XFF,0XBE,0XF7, - 0XDE,0XFF,0X03,0X4D,0X56,0XC7,0XBE,0XFF,0XDE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBF,0XF7,0XDE,0XF7,0XDE,0XF7,0XFC,0XEF,0X41,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0XDD,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0X9E,0XF7,0X96,0XCF, - 0XE3,0X4C,0X80,0X4D,0X60,0X45,0X41,0X45,0X22,0X45,0X20,0X4D,0X20,0X4D,0X20,0X4D, - 0X40,0X3D,0XE4,0X54,0XDC,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0X02,0X55,0XF1,0XA6,0XBF,0XF7,0XBF,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0X9F,0XF7,0X54,0XC7, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X23,0X55, - 0X9E,0XFF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0X7F,0XFF,0XDD,0XF7,0XF9,0XDF,0XAA,0X7D,0X00,0X4D,0X20,0X45, - 0X60,0X45,0X61,0X45,0X02,0X4D,0X75,0XCF,0XBE,0XF7,0XBF,0XFF,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0X87,0X6D, - 0XEB,0X85,0XBF,0XF7,0XBE,0XFF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XFF,0X9F,0XFF,0XEA,0X85,0X40,0X45,0X60,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X60,0X45,0XDA,0XEF,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XFF,0XDE,0XF7,0XBF,0XF7,0X9F,0XF7, - 0XBF,0XF7,0XBF,0XF7,0X9E,0XF7,0XBE,0XF7,0XBE,0XFF,0X9F,0XF7,0XBF,0XFF,0XBF,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7, - 0XBE,0XF7,0XBE,0XF7,0X6D,0X96,0X67,0X6D,0XBF,0XF7,0XBE,0XFF,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0X69,0X75, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X90,0XA6,0XBF,0XFF,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0X35,0XC7,0X43,0X55,0XBF,0XFF, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBF,0XFF,0X4E,0X96,0X41,0X4D,0X40,0X4D,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X20,0X45,0X40,0X45,0X20,0X45,0XF0,0XA6,0X9E,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBA,0XE7,0X21,0X4D,0XDE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XFF,0XFA,0XE7, - 0X05,0X4D,0X20,0X45,0X60,0X45,0X60,0X45,0X60,0X45,0X60,0X45,0X40,0X45,0XE4,0X4C, - 0XDA,0XE7,0XBE,0XFF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XDD,0XF7,0X61,0X4D,0XFC,0XEF,0X9F,0XFF,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBF,0XF7,0XBE,0XFF,0XBF,0XFF,0XBE,0XF7,0XFB,0XEF,0X55,0XC7,0X2C,0X8E,0X2C,0X8E, - 0X54,0XBF,0XFB,0XE7,0XBD,0XF7,0XBF,0XF7,0XDF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0X40,0X45, - 0XDD,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XE2,0X4C,0X77,0XD7,0XDF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0XAA,0X7D,0XC9,0X85,0XDF,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0X9F,0XF7, - 0X75,0XCF,0X21,0X4D,0XBF,0XFF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XDE,0XF7,0XFD,0XF7,0X60,0X4D,0XDF,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XDD,0XF7,0XBF,0XF7,0X01,0X55, - 0XF9,0XD7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBF,0XF7,0XBE,0XF7,0XA9,0X7D,0XC9,0X75,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XD9,0XDF,0X20,0X4D,0XBF,0XF7, - 0XBF,0XF7,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7, - 0XFE,0XF7,0X01,0X4D,0XF9,0XE7,0XBF,0XF7,0XBE,0XFF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBF,0XF7,0XDD,0XF7,0X7F,0XF7,0XCB,0X75,0X69,0X7D,0XDD,0XF7,0XBF,0XFF, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XFB,0XE7, - 0X21,0X4D,0XDD,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBF,0XFF,0X21,0X45,0X14,0XC7,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XF5,0XBE,0X21,0X45, - 0X9E,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBF,0XF7,0XDD,0XFF,0X41,0X4D,0XBA,0XD7,0XBE,0XFF,0XDF,0XF7,0XBE,0XFF,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XFF,0X70,0X9E,0X41,0X4D,0XBD,0XF7, - 0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XDE,0XF7,0XBF,0XFF, - 0XDD,0XEF,0X21,0X4D,0XB7,0XD7,0XBE,0XF7,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0XBE,0XF7,0X53,0XB6,0X03,0X55,0XDE,0XF7,0XBC,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XDD,0XF7, - 0X43,0X55,0XD2,0XB6,0XBF,0XFF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0X97,0XD7,0X21,0X45,0XFD,0XEF,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0X9F,0XFF,0X66,0X65, - 0X44,0X5D,0XBF,0XFF,0XBD,0XF7,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBF,0XFF,0XFC,0XF7,0X22,0X4D,0X95,0XCF,0X9F,0XFF,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBD,0XFF,0X9F,0XF7,0XB7,0XD7,0X02,0X4D, - 0XDB,0XE7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XDD,0XF7,0X9F,0XFF,0XC9,0X75,0XE3,0X4C,0XBE,0XF7,0XBF,0XF7,0XBE,0XF7,0XBF,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBD,0XEF,0X24,0X55,0X48,0X6D, - 0X7E,0XEF,0XDD,0XFF,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0X9F,0XFF,0XDC,0XEF,0X21,0X45,0X4D,0X96,0XBF,0XF7,0XDE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XDE,0XEF,0X7F,0XFF,0XFB,0XEF,0X61,0X45,0X90,0XAE, - 0X9F,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XFC,0XE7,0X20,0X45,0XF1,0XAE,0X9E,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XFF,0XFD,0XEF,0X42,0X55,0X7C,0XEF, - 0X9E,0XF7,0XBF,0XF7,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBD,0XFF,0X9E,0XEF,0X9E,0XF7,0X9E,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, -) \ No newline at end of file diff --git "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\233\276\347\211\207/readme.md" "b/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\233\276\347\211\207/readme.md" deleted file mode 100644 index d2d55943fc69ef861f0bf0f5787623c16e92d5f4..0000000000000000000000000000000000000000 --- "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\233\276\347\211\207/readme.md" +++ /dev/null @@ -1,6 +0,0 @@ -使用方法步骤: -1、将240*240的显示屏正确接到模块上; -2、将本目录的3个py文件(st7789v.py、image.py、example_display_image.py)拷贝到模块的usr目录下; -3、进入模块的命令行,执行如下指令即可看到显示屏显示图片: ->>> import example ->>> example.exec('usr/example_display_image.py') diff --git "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\233\276\347\211\207/st7789v.py" "b/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\233\276\347\211\207/st7789v.py" deleted file mode 100644 index 73ba2b363c32709d258fce3195384f699b9dfdbb..0000000000000000000000000000000000000000 --- "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\233\276\347\211\207/st7789v.py" +++ /dev/null @@ -1,317 +0,0 @@ -# -*- coding: UTF-8 -*- - -import log -from machine import LCD -from usr import fonts - -XSTART_H = 0xf0 -XSTART_L = 0xf1 -YSTART_H = 0xf2 -YSTART_L = 0xf3 -XEND_H = 0xE0 -XEND_L = 0xE1 -YEND_H = 0xE2 -YEND_L = 0xE3 - - -XSTART = 0xD0 -XEND = 0xD1 -YSTART = 0xD2 -YEND = 0xD3 - - -class ST7789V(): - def __init__(self, width, hight): - self.lcdlog = log.basicConfig() - self.lcdlog = log.getLogger("LCD") - self.lcdlog.setLevel(log.DEBUG) - self.lcd = LCD() - self.lcd_w = width - self.lcd_h = hight - - self.st7789v_init_data = ( - 2, 1, 120, - 0, 0, 0x11, - 2, 1, 120, - 0, 1, 0x36, - 1, 1, 0x00, - 0, 1, 0x3A, - 1, 1, 0x05, - 0, 0, 0x21, - 0, 5, 0xB2, - 1, 1, 0x05, - 1, 1, 0x05, - 1, 1, 0x00, - 1, 1, 0x33, - 1, 1, 0x33, - 0, 1, 0xB7, - 1, 1, 0x23, - 0, 1, 0xBB, - 1, 1, 0x22, - 0, 1, 0xC0, - 1, 1, 0x2C, - 0, 1, 0xC2, - 1, 1, 0x01, - 0, 1, 0xC3, - 1, 1, 0x13, - 0, 1, 0xC4, - 1, 1, 0x20, - 0, 1, 0xC6, - 1, 1, 0x0F, - 0, 2, 0xD0, - 1, 1, 0xA4, - 1, 1, 0xA1, - 0, 1, 0xD6, - 1, 1, 0xA1, - 0, 14, 0xE0, - 1, 1, 0x70, - 1, 1, 0x06, - 1, 1, 0x0C, - 1, 1, 0x08, - 1, 1, 0x09, - 1, 1, 0x27, - 1, 1, 0x2E, - 1, 1, 0x34, - 1, 1, 0x46, - 1, 1, 0x37, - 1, 1, 0x13, - 1, 1, 0x13, - 1, 1, 0x25, - 1, 1, 0x2A, - 0, 14, 0xE1, - 1, 1, 0x70, - 1, 1, 0x04, - 1, 1, 0x08, - 1, 1, 0x09, - 1, 1, 0x07, - 1, 1, 0x03, - 1, 1, 0x2C, - 1, 1, 0x42, - 1, 1, 0x42, - 1, 1, 0x38, - 1, 1, 0x14, - 1, 1, 0x14, - 1, 1, 0x27, - 1, 1, 0x2C, - 0, 0, 0x29, - - 0, 1, 0x36, - 1, 1, 0x00, - - 0, 4, 0x2a, - 1, 1, 0x00, - 1, 1, 0x00, - 1, 1, 0x00, - 1, 1, 0xef, - - 0, 4, 0x2b, - 1, 1, 0x00, - 1, 1, 0x00, - 1, 1, 0x00, - 1, 1, 0xef, - - 0, 0, 0x2c, - ) - - self.st7789v_invalid_data = ( - 0,4,0x2a, - 1,1,XSTART_H, - 1,1,XSTART_L, - 1,1,XEND_H, - 1,1,XEND_L, - 0,4,0x2b, - 1,1,YSTART_H, - 1,1,YSTART_L, - 1,1,YEND_H, - 1,1,YEND_L, - 0,0,0x2c, - ) - ret = self.lcd.lcd_init(bytearray(self.st7789v_init_data), self.lcd_w, self.lcd_h, 13000, 1, 4, 0, bytearray(self.st7789v_invalid_data), None, None, None) - self.lcdlog.info('lcd.lcd_init ret = {}'.format(ret)) - '''清屏,设置白色''' - self.lcd.lcd_clear(0xFFFF) - - ''' - 单个字符显示,包括汉字和ASCII - x - x轴坐标 - y - y轴坐标 - xsize - 字体宽度 - ysize - 字体高度 - ch_buf - 存放汉字字模的元组或者列表 - fc - 字体颜色,RGB565 - bc - 背景颜色,RGB565 - ''' - def lcd_show_char(self, x, y, xsize, ysize, ch_buf, fc, bc): - rgb_buf = [] - t1 = xsize // 8 - t2 = xsize % 8 - if t2 != 0: - xsize = (t1 + 1) * 8 - for i in range(0, len(ch_buf)): - for j in range(0, 8): - if (ch_buf[i] << j) & 0x80 == 0x00: - rgb_buf.append(bc & 0xff) - rgb_buf.append(bc >> 8) - else: - rgb_buf.append(fc & 0xff) - rgb_buf.append(fc >> 8) - self.lcd.lcd_write(bytearray(rgb_buf), x, y, x + xsize - 1, y + ysize - 1) - - ''' - ASCII字符显示,目前支持8x16、16x24的字体大小, - 如果需要其他字体大小需要自己增加对应大小的字库数据,并 - 在下面函数中增加这个对应字库的字典。 - x - x轴显示起点 - y - y轴显示起点 - xsize - 字体宽度 - ysize - 字体高度 - ch - 待显示的ASCII字符 - fc - 字体颜色,RGB565 - bc - 背景颜色,RGB565 - ''' - def lcd_show_ascii(self, x, y, xsize, ysize, ch, fc, bc): - ascii_dict = {} - if xsize == 8 and ysize == 16: - ascii_dict = fonts.ascii_8x16_dict - elif xsize == 16 and ysize == 24: - ascii_dict = fonts.ascii_16x24_dict - - for key in ascii_dict: - if ch == key: - self.lcd_show_char(x, y, xsize, ysize, ascii_dict[key], fc, bc) - - ''' - 显示字符串,目前支持8x16的字体大小, - 如果需要其他字体大小需要自己增加对应大小的字库数据,并 - 在lcd_show_ascii函数中增加这个对应字库的字典。 - x - x轴坐标 - y - y轴坐标 - xsize - 字体宽度 - ysize - 字体高度 - str - 待显示的 ASCII 字符串 - fc - 字体颜色,RGB565 - bc - 背景颜色,RGB565 - ''' - def lcd_show_ascii_str(self, x, y, xsize, ysize, str, fc, bc): - xs = x - ys = y - if (len(str) * xsize + x) > self.lcd_w: - raise Exception('Display out of range') - for ch in str: - self.lcd_show_ascii(xs, ys, xsize, ysize, ch, fc, bc) - xs += xsize - - ''' - 汉字显示,目前支持16x16、16x24、24x24的字体大小, - 如果需要其他字体大小需要自己增加对应大小的字库数据,并 - 在下面函数中增加这个对应字库的字典。 - x - x轴显示起点 - y - y轴显示起点 - xsize - 字体宽度 - ysize - 字体高度 - ch - 待显示的ASCII字符 - fc - 字体颜色,RGB565 - bc - 背景颜色,RGB565 - ''' - def lcd_show_chinese(self, x, y, xsize, ysize, ch, fc, bc): - hanzi_dict = {} - if xsize == 16 and ysize == 16: - hanzi_dict = fonts.hanzi_16x16_dict - elif xsize == 16 and ysize == 24: - hanzi_dict = fonts.hanzi_16x24_dict - elif xsize == 24 and ysize == 24: - hanzi_dict = fonts.hanzi_24x24_dict - - for key in hanzi_dict: - if ch == key: - self.lcd_show_char(x, y, xsize, ysize, hanzi_dict[key], fc, bc) - - ''' - 汉字字符串显示,目前支持16x16的字体大小, - 如果需要其他字体大小需要自己增加对应大小的字库数据,并 - 在lcd_show_chinese函数中增加这个对应字库的字典。 - x - x轴坐标 - y - y轴坐标 - xsize - 字体宽度 - ysize - 字体高度 - str - 待显示的多个汉字 - fc - 字体颜色,RGB565 - bc - 背景颜色,RGB565 - ''' - def lcd_show_chinese_str(self, x, y, xsize, ysize, str, fc, bc): - xs = x - ys = y - # print('chstrlen={}, w={}'.format(len(str), self.lcd_w)) - if (len(str) / 3 * xsize + x) > self.lcd_w: - raise Exception('Display out of range') - for i in range(0, len(str), 3): - index = i + 3 - ch = str[i:index] - self.lcd_show_chinese(xs, ys, xsize, ysize, ch, fc, bc) - xs += xsize - - ''' - 图片显示 - 如果图片宽高小于80x80,可直接该函数一次性写入并显示 - image_data - 存放待显示图片的RGB数据 - x - x轴显示起点 - y - y轴显示起点 - width - 图片宽度 - heigth - 图片高度 - ''' - def lcd_show_image(self, image_data, x, y, width, heigth): - self.lcd.lcd_write(bytearray(image_data), x, y, x + width - 1, y + heigth - 1) - - ''' - 图片显示 - 如果图片宽高大于80x80,用该函数来分段写入显示,分段写入原理如下: - 以要显示图片的宽度为固定值,将待显示的图片分成若干宽高为 width * h 大小的图片,最后一块高度不足h的按实际高度计算, - h为分割后每个图片的高度,可由用户通过参数 h 指定,h的值应该满足关系: width * h * 2 < 4096 - path - 存放图片数据的txt文件路径,包含文件名,如 '/usr/image.txt' - x - x轴显示起点 - y - y轴显示起点 - width - 图片宽度 - heigth - 图片高度 - h - 分割后每个图片的高度 - ''' - def lcd_show_image_file(self, path, x, y, width, heigth, h): - image_data = [] - read_n = 0 # 已经读取的字节数 - byte_n = 0 # 字节数 - xs = x - ys = y - h_step = h # 按高度h_step个像素点作为步长 - h1 = heigth // h_step # 当前图片按h_step大小分割,可以得到几个 width * h_step 大小的图片 - h2 = heigth % h_step # 最后剩下的一块 大小不足 width * h_step 的图片的实际高度 - # print('h1 = {}, h2 = {}'.format(h1, h2)) - with open(path, "r", encoding='utf-8') as fd: - # for line in fd.readlines(): - end = '' - while not end: - line = fd.readline() - if line == '': - end = 1 - else: - curline = line.strip('\r\n').strip(',').split(',') - for i in curline: - byte_n += 1 - read_n += 1 - image_data.append(int(i)) - if h1 > 0 and byte_n == width * h_step * 2: - self.lcd_show_image(image_data, xs, ys, width, h_step) - image_data = [] - ys = ys + h_step - h1 -= 1 - byte_n = 0 - # print('image_data len = {}'.format(len(image_data))) - elif h1 == 0 and read_n == width * heigth * 2: - if h2 != 0: - self.lcd_show_image(image_data, xs, ys, width, h2) - - ''' - 将24位色转换位16位色 - 如红色的24位色为0xFF0000,则r=0xFF,g=0x00,b=0x00, - 将r、g、b的值传入下面函数即可得到16位相同颜色数据 - ''' - def get_rgb565_color(self, r, g, b): - return ((r << 8) & 0xF800) | ((g << 3) & 0x07E0) | ((b >> 3) & 0x001F) diff --git "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\233\276\347\211\207/\345\233\276\347\211\207\346\230\276\347\244\272\347\273\223\346\236\234.jpg" "b/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\233\276\347\211\207/\345\233\276\347\211\207\346\230\276\347\244\272\347\273\223\346\236\234.jpg" deleted file mode 100644 index 171eb2f084200bb29421e564d21fa3fc85dfae65..0000000000000000000000000000000000000000 Binary files "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\233\276\347\211\207/\345\233\276\347\211\207\346\230\276\347\244\272\347\273\223\346\236\234.jpg" and /dev/null differ diff --git "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\255\227\347\254\246/Quecpython.py" "b/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\255\227\347\254\246/Quecpython.py" deleted file mode 100644 index 5cac2c4d6811ee777edc9d3bfecf56b11ab879d0..0000000000000000000000000000000000000000 --- "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\255\227\347\254\246/Quecpython.py" +++ /dev/null @@ -1,391 +0,0 @@ -import sys -import time -import os - - -try: - stdout = sys.stdout.buffer -except AttributeError: - # Python2 doesn't have buffer attr - stdout = sys.stdout - - -def stdout_write_bytes(b): - b = b.replace(b"\x04", b"") - stdout.write(b) - stdout.flush() - -class QuecpythonError(Exception): - pass - - -class Quecpython: - def __init__(self, device, baudrate=115200, wait=0): - import serial - delayed = False - for attempt in range(wait + 1): - try: - self.serial = serial.Serial(device, baudrate=baudrate, interCharTimeout=1) - break - except (OSError, IOError): # Py2 and Py3 have different errors - if wait == 0: - continue - if attempt == 0: - sys.stdout.write("Waiting {} seconds for Quecpython ".format(wait)) - delayed = True - time.sleep(1) - sys.stdout.write(".") - sys.stdout.flush() - else: - if delayed: - print("") - raise QuecpythonError("failed to access " + device) - if delayed: - print("") - - def close(self): - self.serial.close() - - def read_until(self, min_num_bytes, ending, timeout=10, data_consumer=None): - # if data_consumer is used then data is not accumulated and the ending must be 1 byte long - assert data_consumer is None or len(ending) == 1 - - data = self.serial.read(min_num_bytes) - if data_consumer: - data_consumer(data) - timeout_count = 0 - while True: - if data.endswith(ending): - break - elif self.serial.inWaiting() > 0: - new_data = self.serial.read(1) - if data_consumer: - data_consumer(new_data) - data = new_data - else: - data = data + new_data - timeout_count = 0 - else: - timeout_count += 1 - if timeout is not None and timeout_count >= 100 * timeout: - break - time.sleep(0.01) - return data - - def enter_raw_repl(self): - self.serial.write(b"\r\x03\x03") # ctrl-C twice: interrupt any running program - - # flush input (without relying on serial.flushInput()) - n = self.serial.inWaiting() - while n > 0: - self.serial.read(n) - n = self.serial.inWaiting() - - self.serial.write(b"\r\x01") # ctrl-A: enter raw REPL - data = self.read_until(1, b"raw REPL; CTRL-B to exit\r\n>") - if not data.endswith(b"raw REPL; CTRL-B to exit\r\n>"): - print(data) - raise QuecpythonError("could not enter raw repl") - - self.serial.write(b"\x04") # ctrl-D: soft reset - data = self.read_until(1, b"soft reboot\r\n") - if not data.endswith(b"soft reboot\r\n"): - print(data) - raise QuecpythonError("could not enter raw repl") - # By splitting this into 2 reads, it allows boot.py to print stuff, - # which will show up after the soft reboot and before the raw REPL. - data = self.read_until(1, b"raw REPL; CTRL-B to exit\r\n") - if not data.endswith(b"raw REPL; CTRL-B to exit\r\n"): - print(data) - raise QuecpythonError("could not enter raw repl") - def exit_raw_repl(self): - self.serial.write(b"\r\x02") # ctrl-B: enter friendly REPL - - def follow(self, timeout, data_consumer=None): - # wait for normal output - data = self.read_until(1, b"\x04", timeout=timeout, data_consumer=data_consumer) - if not data.endswith(b"\x04"): - raise QuecpythonError("timeout waiting for first EOF reception") - data = data[:-1] - - # wait for error output - data_err = self.read_until(1, b"\x04", timeout=timeout) - if not data_err.endswith(b"\x04"): - raise QuecpythonError("timeout waiting for second EOF reception") - data_err = data_err[:-1] - - # return normal and error output - return data, data_err - - def exec_raw_no_follow(self, command): - if isinstance(command, bytes): - command_bytes = command - else: - command_bytes = bytes(command, encoding="utf8") - - # check we have a prompt - data = self.read_until(1, b">") - if not data.endswith(b">"): - raise QuecpythonError("could not enter raw repl") - - # write command - for i in range(0, len(command_bytes), 256): - self.serial.write(command_bytes[i : min(i + 256, len(command_bytes))]) - time.sleep(0.1) - self.serial.write(b"\x04") - - # check if we could exec command - data = self.serial.read(2) - if data != b"OK": - raise QuecpythonError("could not exec command (response: %r)" % data) - - def exec_raw(self, command, timeout=10, data_consumer=None): - self.exec_raw_no_follow(command) - return self.follow(timeout, data_consumer) - - def eval(self, expression): - ret = self.exec_("print({})".format(expression)) - ret = ret.strip() - return ret - - def exec_(self, command, data_consumer=None): - ret, ret_err = self.exec_raw(command, data_consumer=data_consumer) - if ret_err: - raise QuecpythonError("exception", ret, ret_err) - return ret - - def execfile(self, filename): - with open(filename, "rb") as f: - pyfile = f.read() - print(pyfile) - return self.exec_(pyfile) - def fs_ls(self, src): - cmd = ( - "import uos\nfor f in uos.ilistdir(%s):\n" - " print('{:12} {}{}'.format(f[3]if len(f)>3 else 0,f[0],'/'if f[1]&0x4000 else ''))" - % (("'%s'" % src) if src else "") - ) - self.exec_(cmd, data_consumer=stdout_write_bytes) - - def fs_cat(self, src, chunk_size=256): - cmd = ( - "with open('%s') as f:\n while 1:\n" - " b=f.read(%u)\n if not b:break\n print(b,end='')" % (src, chunk_size) - ) - self.exec_(cmd, data_consumer=stdout_write_bytes) - - def fs_get(self, src, dest, chunk_size=256): - self.exec_("f=open('%s','rb')\nr=f.read" % src) - with open(dest, "wb") as f: - while True: - data = bytearray() - self.exec_("print(r(%u))" % chunk_size, data_consumer=lambda d: data.extend(d)) - assert data.endswith(b"\r\n\x04") - data = eval(str(data[:-3], "ascii")) - if not data: - break - f.write(data) - self.exec_("f.close()") - - def fs_put(self, src, dest, chunk_size=256): - self.exec_("f=open('%s','wb')\nw=f.write" % dest) - with open(src, "rb") as f: - while True: - data = f.read(chunk_size) - if not data: - break - if sys.version_info < (3,): - self.exec_("w(b" + repr(data) + ")") - else: - self.exec_("w(" + repr(data) + ")") - self.exec_("f.close()") - - def fs_mkdir(self, dir): - self.exec_("import uos\nuos.mkdir('%s')" % dir) - - def fs_rmdir(self, dir): - self.exec_("import uos\nuos.rmdir('%s')" % dir) - - def fs_rm(self, src): - self.exec_("import uos\nuos.remove('%s')" % src) - -setattr(Quecpython, "exec", Quecpython.exec_) - -def execfile(filename, device="COM24", baudrate=115200): - qpy = Quecpython(device, baudrate) - qpy.enter_raw_repl() - output = qpy.execfile(filename) - stdout_write_bytes(output) - qpy.exit_raw_repl() - qpy.close() - -def filesystem_command(qpy, args): - def fname_remote(src): - if src.startswith(":"): - src = src[1:] - return src - - def fname_cp_dest(src, dest): - src = src.rsplit("/", 1)[-1] - if dest is None or dest == "": - dest = src - elif dest == ".": - dest = "./" + src - elif dest.endswith("/"): - dest += src - return dest - - cmd = args[0] - args = args[1:] - try: - if cmd == "cp": - srcs = args[:-1] - dest = args[-1] - if srcs[0].startswith("./") or dest.startswith(":"): - op = qpy.fs_put - fmt = "cp %s :%s" - dest = fname_remote(dest) - else: - op = qpy.fs_get - fmt = "cp :%s %s" - for src in srcs: - src = fname_remote(src) - dest2 = fname_cp_dest(src, dest) - print(fmt % (src, dest2)) - op(src, dest2) - else: - op = { - "ls": qpy.fs_ls, - "cat": qpy.fs_cat, - "mkdir": qpy.fs_mkdir, - "rmdir": qpy.fs_rmdir, - "rm": qpy.fs_rm, - }[cmd] - if cmd == "ls" and not args: - args = [""] - for src in args: - src = fname_remote(src) - print("%s :%s" % (cmd, src)) - op(src) - except QuecpythonError as er: - print(str(er.args[2], "ascii")) - qpy.exit_raw_repl() - qpy.close() - sys.exit(1) - -def main(): - import argparse - cmd_parser = argparse.ArgumentParser(description="Run scripts on the EC100Y.") - cmd_parser.add_argument( - "-d", - "--device", - default=os.environ.get("EC100Y_DEVICE", "COM24"), - help="the serial device of the EC100Y", - ) - cmd_parser.add_argument( - "-b", - "--baudrate", - default=os.environ.get("EC100Y_BAUDRATE", "115200"), - help="the baud rate of the serial device", - ) - cmd_parser.add_argument("-c", "--command", help="program passed in as string") - cmd_parser.add_argument( - "-w", - "--wait", - default=0, - type=int, - help="seconds to wait for USB connected board to become available", - ) - group = cmd_parser.add_mutually_exclusive_group() - group.add_argument( - "--follow", - action="store_true", - help="follow the output after running the scripts [default if no scripts given]", - ) - group.add_argument( - "--no-follow", - action="store_true", - help="Do not follow the output after running the scripts.", - ) - cmd_parser.add_argument( - "-f", "--filesystem", action="store_true", help="perform a filesystem action" - ) - cmd_parser.add_argument("files", nargs="*", help="input files") - args = cmd_parser.parse_args() - # open the connection to the qpyoard - try: - qpy = Quecpython(args.device, args.baudrate, args.wait) - except QuecpythonError as er: - print(er) - sys.exit(1) - - # run any command or file(s) - if args.command is not None or args.filesystem or len(args.files): - # we must enter raw-REPL mode to execute commands - # this will do a soft-reset of the board - try: - qpy.enter_raw_repl() - except QuecpythonError as er: - print(er) - qpy.close() - sys.exit(1) - - def execbuffer(buf): - try: - if args.no_follow: - qpy.exec_raw_no_follow(buf) - ret_err = None - else: - ret, ret_err = qpy.exec_raw( - buf, timeout=None, data_consumer=stdout_write_bytes - ) - except QuecpythonError as er: - print(er) - qpy.close() - sys.exit(1) - except KeyboardInterrupt: - sys.exit(1) - if ret_err: - qpy.exit_raw_repl() - qpy.close() - stdout_write_bytes(ret_err) - sys.exit(1) - - # do filesystem commands, if given - if args.filesystem: - filesystem_command(qpy, args.files) - del args.files[:] - - # run the command, if given - if args.command is not None: - execbuffer(args.command.encode("utf-8")) - - # run any files - for filename in args.files: - with open(filename, "rb") as f: - pyfile = f.read() - execbuffer(pyfile) - - # exiting raw-REPL just drops to friendly-REPL mode - qpy.exit_raw_repl() - - # if asked explicitly, or no files given, then follow the output - if args.follow or (args.command is None and not args.filesystem and len(args.files) == 0): - try: - ret, ret_err = qpy.follow(timeout=None, data_consumer=stdout_write_bytes) - except QuecpythonError as er: - print(er) - sys.exit(1) - except KeyboardInterrupt: - sys.exit(1) - if ret_err: - qpy.close() - stdout_write_bytes(ret_err) - sys.exit(1) - - # close the connection to the EC100Y - qpy.close() - - -if __name__ == "__main__": - main() \ No newline at end of file diff --git "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\255\227\347\254\246/example_display_char.py" "b/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\255\227\347\254\246/example_display_char.py" deleted file mode 100644 index 96740663831ca30b8618bd789ecc5864453378b1..0000000000000000000000000000000000000000 --- "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\255\227\347\254\246/example_display_char.py" +++ /dev/null @@ -1,67 +0,0 @@ -# -*- coding: UTF-8 -*- - - -import utime - -''' -如果用户使用的固件版本中没有checkNet库,请将checkNet.mpy文件上传到模块的usr目录, -并将 import checkNet 改为 from usr import checkNet -''' -import checkNet -from usr import st7789v - -''' -下面两个全局变量是必须有的,用户可以根据自己的实际项目修改下面两个全局变量的值, -在执行用户代码前,会先打印这两个变量的值。 -''' -PROJECT_NAME = "QuecPython_ST7789V_LCD_Example" -PROJECT_VERSION = "1.0.0" - -checknet = checkNet.CheckNetwork(PROJECT_NAME, PROJECT_VERSION) -lcd_st7789v = st7789v.ST7789V(240, 240) - - -if __name__ == '__main__': - ''' - 手动运行本例程时,可以去掉该延时,如果将例程文件名改为main.py,希望开机自动运行时,需要加上该延时, - 否则无法从CDC口看到下面的 poweron_print_once() 中打印的信息 - ''' - # utime.sleep(5) - checknet.poweron_print_once() - - ''' - 如果用户程序包含网络相关代码,必须执行 wait_network_connected() 等待网络就绪(拨号成功); - 如果是网络无关代码,可以屏蔽 wait_network_connected() - ''' - # checknet.wait_network_connected() - - # 用户代码 - '''######################【User code star】###################################################''' - fc = 0x0000 # 字体颜色 黑色 可根据需要修改 - bc = 0xffff # 背景颜色 白色 可根据需要修改 - - # 8x16 ASCII字符显示 - lcd_st7789v.lcd_show_ascii(0, 0, 8, 16, 'A', fc, bc) - lcd_st7789v.lcd_show_ascii(8, 0, 8, 16, 'b', fc, bc) - lcd_st7789v.lcd_show_ascii(16, 0, 8, 16, '$', fc, bc) - lcd_st7789v.lcd_show_ascii(24, 0, 8, 16, '8', fc, bc) - - # 16x24 ASCII字符显示 - lcd_st7789v.lcd_show_ascii(0, 20, 16, 24, 'A', fc, bc) - lcd_st7789v.lcd_show_ascii(16, 20, 16, 24, 'b', fc, bc) - lcd_st7789v.lcd_show_ascii(32, 20, 16, 24, '$', fc, bc) - lcd_st7789v.lcd_show_ascii(48, 20, 16, 24, '8', fc, bc) - - # 16x16 汉字显示 - lcd_st7789v.lcd_show_chinese(0, 50, 16, 16, '移', fc, bc) - lcd_st7789v.lcd_show_chinese(16, 50, 16, 16, '远', fc, bc) - lcd_st7789v.lcd_show_chinese(32, 50, 16, 16, '通', fc, bc) - lcd_st7789v.lcd_show_chinese(48, 50, 16, 16, '信', fc, bc) - - # # 16x24 汉字显示 - lcd_st7789v.lcd_show_chinese(0, 70, 16, 24, '移', fc, bc) - lcd_st7789v.lcd_show_chinese(16, 70, 16, 24, '远', fc, bc) - lcd_st7789v.lcd_show_chinese(32, 70, 16, 24, '通', fc, bc) - lcd_st7789v.lcd_show_chinese(48, 70, 16, 24, '信', fc, bc) - - '''######################【User code end 】###################################################''' diff --git "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\255\227\347\254\246/fonts.py" "b/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\255\227\347\254\246/fonts.py" deleted file mode 100644 index 70c0fdcd45b884d64b680e39a194939da36162c2..0000000000000000000000000000000000000000 --- "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\255\227\347\254\246/fonts.py" +++ /dev/null @@ -1,462 +0,0 @@ - - -''' -16 x 16 汉字字库 -宋体、阴码,逐行式,顺向(高位在前) -''' -hanzi_16x16_dict = { - '移' : (0x08, 0x20, 0x1C, 0x20, 0xF0, 0x7C, 0x10, 0x84, 0x11, 0x48, 0xFC, 0x30, 0x10, 0x20, 0x30, 0x48, - 0x39, 0x90, 0x54, 0x3E, 0x54, 0x42, 0x91, 0xA4, 0x10, 0x18, 0x10, 0x10, 0x10, 0x60, 0x11, 0x80), - '远' : (0x00, 0x00, 0x23, 0xF8, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x07, 0xFC, 0xF1, 0x20, 0x11, 0x20, - 0x11, 0x20, 0x11, 0x20, 0x11, 0x24, 0x12, 0x24, 0x12, 0x24, 0x14, 0x1C, 0x28, 0x00, 0x47, 0xFE), - '通' : (0x00, 0x00, 0x47, 0xF8, 0x20, 0x10, 0x21, 0xA0, 0x00, 0x40, 0x07, 0xFC, 0xE4, 0x44, 0x24, 0x44, - 0x27, 0xFC, 0x24, 0x44, 0x24, 0x44, 0x27, 0xFC, 0x24, 0x44, 0x24, 0x54, 0x54, 0x08, 0x8F, 0xFE), - '信' : (0x08, 0x40, 0x08, 0x20, 0x0B, 0xFE, 0x10, 0x00, 0x10, 0x00, 0x31, 0xFC, 0x30, 0x00, 0x50, 0x00, - 0x91, 0xFC, 0x10, 0x00, 0x10, 0x00, 0x11, 0xFC, 0x11, 0x04, 0x11, 0x04, 0x11, 0xFC, 0x11, 0x04), -} - -''' -16 x 24 汉字字库 -宋体、阴码,逐行式,顺向(高位在前) -''' -hanzi_16x24_dict = { - '移' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x0E, 0x60, 0x38, 0x44, 0x08, 0x7C, 0x08, 0xCC, 0x09, 0x68, - 0x0A, 0x30, 0x7C, 0x10, 0x08, 0x20, 0x18, 0x50, 0x1C, 0xB0, 0x1B, 0x22, 0x2A, 0x5E, 0x28, 0x44, - 0x28, 0xC4, 0x49, 0x28, 0x08, 0x28, 0x08, 0x10, 0x08, 0x20, 0x08, 0xC0, 0x0F, 0x00, 0x00, 0x00,), - '远' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x13, 0xF8, 0x10, 0x00, 0x10, 0x00, 0x00, 0x04, - 0x03, 0x5C, 0x00, 0xA0, 0x70, 0xA0, 0x11, 0x20, 0x11, 0x20, 0x11, 0x20, 0x11, 0x20, 0x11, 0x24, - 0x12, 0x24, 0x12, 0x36, 0x14, 0x1C, 0x68, 0x00, 0x46, 0x00, 0x43, 0xFC, 0x00, 0x00, 0x00, 0x00,), - '通' : (0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x20, 0x08, 0x10, 0x90, 0x10, 0x60, 0x00, 0x44, 0x03, 0xFC, - 0x02, 0x44, 0x12, 0x44, 0x73, 0xFC, 0x12, 0x44, 0x12, 0x44, 0x12, 0x44, 0x13, 0xFC, 0x12, 0x44, - 0x12, 0x44, 0x12, 0x44, 0x12, 0x4C, 0x28, 0x00, 0x46, 0x00, 0x43, 0xFE, 0x00, 0x00, 0x00, 0x00,), - '信' : (0x00, 0x00, 0x08, 0x00, 0x0C, 0x40, 0x08, 0x40, 0x08, 0x20, 0x17, 0xFE, 0x10, 0x00, 0x10, 0x00, - 0x10, 0x08, 0x31, 0xF0, 0x30, 0x00, 0x50, 0x00, 0x53, 0xFC, 0x10, 0x00, 0x10, 0x00, 0x10, 0xFC, - 0x11, 0x04, 0x11, 0x04, 0x11, 0x04, 0x11, 0x04, 0x11, 0xF8, 0x11, 0x04, 0x10, 0x00, 0x00, 0x00,), -} - -''' -24 x 24 汉字字库 -宋体、阴码,逐行式,顺向(高位在前) -''' -hanzi_24x24_dict = { - '移' : (0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0xC3,0x00,0x1F,0x02,0x00,0x02, - 0x07,0xF8,0x02,0x04,0x18,0x02,0x0A,0x30,0x02,0x53,0x60,0x7F,0xE1,0xC0,0x06,0x01, - 0x80,0x06,0x03,0xC0,0x07,0x0D,0x80,0x0E,0xF3,0xFC,0x0A,0x46,0x0C,0x12,0x4C,0x08, - 0x12,0x12,0x10,0x22,0x21,0x30,0x42,0x01,0x60,0x02,0x00,0x80,0x02,0x03,0x00,0x02, - 0x1C,0x00,0x02,0xE0,0x00,0x00,0x00,0x00,), - '远' : (0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x20,0x08,0x7F,0xF0,0x0C,0x00,0x00,0x04, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x01,0xFF,0xFC,0x00,0x18,0x80,0x7E,0x18, - 0x80,0x04,0x18,0x80,0x04,0x10,0x80,0x04,0x10,0x80,0x04,0x10,0x88,0x04,0x20,0x88, - 0x04,0x60,0x8C,0x04,0xC0,0xFC,0x1B,0x00,0x00,0x31,0x00,0x00,0x60,0xFF,0xFE,0x00, - 0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,), - '通' : (0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xE0,0x10,0x00,0x30,0x08,0x08,0xC0,0x0C, - 0x07,0x00,0x0C,0x03,0x00,0x00,0x7F,0xF8,0x00,0x42,0x08,0x00,0x42,0x08,0x7C,0x7F, - 0xF8,0x04,0x42,0x08,0x04,0x42,0x08,0x04,0x42,0x08,0x04,0x7F,0xF8,0x04,0x42,0x08, - 0x04,0x42,0x08,0x04,0x42,0x08,0x04,0x42,0x18,0x1A,0x42,0x38,0x31,0x80,0x10,0x60, - 0xFF,0xFC,0x00,0x1F,0xF8,0x00,0x00,0x00,), - '信' : (0x00,0x00,0x00,0x00,0x04,0x00,0x03,0x02,0x00,0x02,0x03,0x00,0x02,0x03,0x08,0x04, - 0xFF,0xFC,0x04,0x00,0x00,0x08,0x00,0x10,0x0C,0x7F,0xF8,0x14,0x00,0x00,0x14,0x00, - 0x10,0x24,0x7F,0xF8,0x44,0x00,0x00,0x04,0x00,0x00,0x04,0x00,0x00,0x04,0x3F,0xF8, - 0x04,0x20,0x10,0x04,0x20,0x10,0x04,0x20,0x10,0x04,0x20,0x10,0x04,0x3F,0xF0,0x04, - 0x20,0x10,0x04,0x20,0x10,0x00,0x00,0x00,), -} - - -''' -常用ASCII字符集 -字宽:8 【实际取模时,字宽设置为16,对应英文字宽则为8】 -字高:16 -宋体、阴码,逐行式,顺向(高位在前) -''' -ascii_8x16_dict = { - ' ' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,), - '!' : (0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,), - '"' : (0x00, 0x12, 0x24, 0x24, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,), - "#" : (0x00, 0x00, 0x00, 0x12, 0x12, 0x12, 0x7E, 0x24, 0x24, 0x24, 0x7E, 0x24, 0x24, 0x24, 0x00, 0x00,), - '$' : (0x00, 0x00, 0x08, 0x3C, 0x4A, 0x4A, 0x48, 0x38, 0x0C, 0x0A, 0x0A, 0x4A, 0x4A, 0x3C, 0x08, 0x08,), - '%' : (0x00, 0x00, 0x00, 0x44, 0xA4, 0xA8, 0xA8, 0xB0, 0x54, 0x1A, 0x2A, 0x2A, 0x4A, 0x44, 0x00, 0x00,), - '&' : (0x00, 0x00, 0x00, 0x30, 0x48, 0x48, 0x48, 0x50, 0x6E, 0xA4, 0x94, 0x98, 0x89, 0x76, 0x00, 0x00,), - "'" : (0x00, 0x60, 0x20, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,), - '(' : (0x00, 0x02, 0x04, 0x08, 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x04, 0x02, 0x00,), - ')' : (0x00, 0x40, 0x20, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x10, 0x10, 0x20, 0x40, 0x00,), - '*' : (0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0xD6, 0x38, 0x38, 0xD6, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00,), - '+' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x7F, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00,), - ',' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x20, 0x20, 0x40,), - '-' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,), - '.' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00,), - '/' : (0x00, 0x00, 0x02, 0x04, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x00,), - '0' : (0x00, 0x00, 0x00, 0x18, 0x24, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x24, 0x18, 0x00, 0x00,), - '1' : (0x00, 0x00, 0x00, 0x08, 0x38, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x3E, 0x00, 0x00,), - '2' : (0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x02, 0x04, 0x08, 0x10, 0x20, 0x42, 0x7E, 0x00, 0x00,), - '3' : (0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x02, 0x04, 0x18, 0x04, 0x02, 0x42, 0x42, 0x3C, 0x00, 0x00,), - '4' : (0x00, 0x00, 0x00, 0x04, 0x0C, 0x0C, 0x14, 0x24, 0x24, 0x44, 0x7F, 0x04, 0x04, 0x1F, 0x00, 0x00,), - '5' : (0x00, 0x00, 0x00, 0x7E, 0x40, 0x40, 0x40, 0x78, 0x44, 0x02, 0x02, 0x42, 0x44, 0x38, 0x00, 0x00,), - '6' : (0x00, 0x00, 0x00, 0x18, 0x24, 0x40, 0x40, 0x5C, 0x62, 0x42, 0x42, 0x42, 0x22, 0x1C, 0x00, 0x00,), - '7' : (0x00, 0x00, 0x00, 0x7E, 0x42, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00,), - '8' : (0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x24, 0x18, 0x24, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00,), - '9' : (0x00, 0x00, 0x00, 0x38, 0x44, 0x42, 0x42, 0x42, 0x46, 0x3A, 0x02, 0x02, 0x24, 0x18, 0x00, 0x00,), - ':' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,), - ';' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10,), - '<' : (0x00, 0x00, 0x00, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x00, 0x00,), - '=' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,), - '>' : (0x00, 0x00, 0x00, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x00, 0x00,), - '?' : (0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x62, 0x04, 0x08, 0x08, 0x08, 0x00, 0x18, 0x18, 0x00, 0x00,), - '@' : (0x00, 0x00, 0x00, 0x38, 0x44, 0x5A, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x5C, 0x42, 0x3C, 0x00, 0x00,), - 'A' : (0x00, 0x00, 0x00, 0x10, 0x10, 0x18, 0x28, 0x28, 0x24, 0x3C, 0x44, 0x42, 0x42, 0xE7, 0x00, 0x00,), - 'B' : (0x00, 0x00, 0x00, 0xF8, 0x44, 0x44, 0x44, 0x78, 0x44, 0x42, 0x42, 0x42, 0x44, 0xF8, 0x00, 0x00,), - 'C' : (0x00, 0x00, 0x00, 0x3E, 0x42, 0x42, 0x80, 0x80, 0x80, 0x80, 0x80, 0x42, 0x44, 0x38, 0x00, 0x00,), - 'D' : (0x00, 0x00, 0x00, 0xF8, 0x44, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x44, 0xF8, 0x00, 0x00,), - 'E' : (0x00, 0x00, 0x00, 0xFC, 0x42, 0x48, 0x48, 0x78, 0x48, 0x48, 0x40, 0x42, 0x42, 0xFC, 0x00, 0x00,), - 'F' : (0x00, 0x00, 0x00, 0xFC, 0x42, 0x48, 0x48, 0x78, 0x48, 0x48, 0x40, 0x40, 0x40, 0xE0, 0x00, 0x00,), - 'G' : (0x00, 0x00, 0x00, 0x3C, 0x44, 0x44, 0x80, 0x80, 0x80, 0x8E, 0x84, 0x44, 0x44, 0x38, 0x00, 0x00,), - 'H' : (0x00, 0x00, 0x00, 0xE7, 0x42, 0x42, 0x42, 0x42, 0x7E, 0x42, 0x42, 0x42, 0x42, 0xE7, 0x00, 0x00,), - 'I' : (0x00, 0x00, 0x00, 0x7C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7C, 0x00, 0x00,), - 'J' : (0x00, 0x00, 0x00, 0x3E, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x88, 0xF0,), - 'K' : (0x00, 0x00, 0x00, 0xEE, 0x44, 0x48, 0x50, 0x70, 0x50, 0x48, 0x48, 0x44, 0x44, 0xEE, 0x00, 0x00,), - 'L' : (0x00, 0x00, 0x00, 0xE0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x42, 0xFE, 0x00, 0x00,), - 'M' : (0x00, 0x00, 0x00, 0xEE, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x54, 0x54, 0x54, 0x54, 0xD6, 0x00, 0x00,), - 'N' : (0x00, 0x00, 0x00, 0xC7, 0x62, 0x62, 0x52, 0x52, 0x4A, 0x4A, 0x4A, 0x46, 0x46, 0xE2, 0x00, 0x00,), - 'O' : (0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x44, 0x38, 0x00, 0x00,), - 'P' : (0x00, 0x00, 0x00, 0xFC, 0x42, 0x42, 0x42, 0x42, 0x7C, 0x40, 0x40, 0x40, 0x40, 0xE0, 0x00, 0x00,), - 'Q' : (0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0xB2, 0x4C, 0x38, 0x06, 0x00,), - 'R' : (0x00, 0x00, 0x00, 0xFC, 0x42, 0x42, 0x42, 0x7C, 0x48, 0x48, 0x44, 0x44, 0x42, 0xE3, 0x00, 0x00,), - 'S' : (0x00, 0x00, 0x00, 0x3E, 0x42, 0x42, 0x40, 0x20, 0x18, 0x04, 0x02, 0x42, 0x42, 0x7C, 0x00, 0x00,), - 'T' : (0x00, 0x00, 0x00, 0xFE, 0x92, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00, 0x00,), - 'U' : (0x00, 0x00, 0x00, 0xE7, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00,), - 'V' : (0x00, 0x00, 0x00, 0xE7, 0x42, 0x42, 0x44, 0x24, 0x24, 0x28, 0x28, 0x18, 0x10, 0x10, 0x00, 0x00,), - 'W' : (0x00, 0x00, 0x00, 0xD6, 0x54, 0x54, 0x54, 0x54, 0x54, 0x6C, 0x28, 0x28, 0x28, 0x28, 0x00, 0x00,), - 'X' : (0x00, 0x00, 0x00, 0xE7, 0x42, 0x24, 0x24, 0x18, 0x18, 0x18, 0x24, 0x24, 0x42, 0xE7, 0x00, 0x00,), - 'Y' : (0x00, 0x00, 0x00, 0xEE, 0x44, 0x44, 0x28, 0x28, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00, 0x00,), - 'Z' : (0x00, 0x00, 0x00, 0x7E, 0x84, 0x04, 0x08, 0x08, 0x10, 0x20, 0x20, 0x42, 0x42, 0xFC, 0x00, 0x00,), - '[' : (0x00, 0x1E, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1E, 0x00,), - '\\' : (0x00, 0x00, 0x40, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x08, 0x08, 0x04, 0x04, 0x04, 0x02, 0x02,), - ']' : (0x00, 0x78, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x78, 0x00,), - '^' : (0x00, 0x18, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,), - '_' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,), - '`' : (0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,), - 'a' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x44, 0x0C, 0x34, 0x44, 0x4C, 0x36, 0x00, 0x00,), - 'b' : (0x00, 0x00, 0x00, 0x00, 0xC0, 0x40, 0x40, 0x58, 0x64, 0x42, 0x42, 0x42, 0x64, 0x58, 0x00, 0x00,), - 'c' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x22, 0x40, 0x40, 0x40, 0x22, 0x1C, 0x00, 0x00,), - 'd' : (0x00, 0x00, 0x00, 0x00, 0x06, 0x02, 0x02, 0x3E, 0x42, 0x42, 0x42, 0x42, 0x46, 0x3B, 0x00, 0x00,), - 'e' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x7E, 0x40, 0x42, 0x3C, 0x00, 0x00,), - 'f' : (0x00, 0x00, 0x00, 0x00, 0x0C, 0x12, 0x10, 0x7C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7C, 0x00, 0x00,), - 'g' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x44, 0x44, 0x38, 0x40, 0x3C, 0x42, 0x42, 0x3C,), - 'h' : (0x00, 0x00, 0x00, 0x00, 0xC0, 0x40, 0x40, 0x5C, 0x62, 0x42, 0x42, 0x42, 0x42, 0xE7, 0x00, 0x00,), - 'i' : (0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x70, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7C, 0x00, 0x00,), - 'j' : (0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x1C, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x44, 0x78,), - 'k' : (0x00, 0x00, 0x00, 0x00, 0xC0, 0x40, 0x40, 0x4E, 0x48, 0x50, 0x70, 0x48, 0x44, 0xEE, 0x00, 0x00,), - 'l' : (0x00, 0x00, 0x00, 0x10, 0x70, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7C, 0x00, 0x00,), - 'm' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x49, 0x49, 0x49, 0x49, 0x49, 0xED, 0x00, 0x00,), - 'n' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x62, 0x42, 0x42, 0x42, 0x42, 0xE7, 0x00, 0x00,), - 'o' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00,), - 'p' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x64, 0x42, 0x42, 0x42, 0x64, 0x58, 0x40, 0xE0,), - 'q' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x26, 0x42, 0x42, 0x42, 0x26, 0x1A, 0x02, 0x07,), - 'r' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0x32, 0x20, 0x20, 0x20, 0x20, 0xF8, 0x00, 0x00,), - 's' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x42, 0x40, 0x3C, 0x02, 0x42, 0x7C, 0x00, 0x00,), - 't' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x7C, 0x10, 0x10, 0x10, 0x10, 0x12, 0x0C, 0x00, 0x00,), - 'u' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0x42, 0x42, 0x42, 0x42, 0x46, 0x3B, 0x00, 0x00,), - 'v' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0x44, 0x44, 0x28, 0x28, 0x10, 0x10, 0x00, 0x00,), - 'w' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDB, 0x89, 0x4A, 0x5A, 0x54, 0x24, 0x24, 0x00, 0x00,), - 'x' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x24, 0x18, 0x18, 0x18, 0x24, 0x6E, 0x00, 0x00,), - 'y' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0x42, 0x24, 0x24, 0x18, 0x18, 0x10, 0x10, 0x60,), - 'z' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x44, 0x08, 0x10, 0x10, 0x22, 0x7E, 0x00, 0x00,), - '{' : (0x00, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x00,), - '|' : (0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,), - '}' : (0x00, 0xC0, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x10, 0x20, 0x20, 0x20, 0x20, 0x20, 0xC0, 0x00,), - '~' : (0x20, 0x5A, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,), -} - - -''' -常用ASCII字符集 -字宽:16 【实际取模时,字宽设置为32,对应英文字宽则为16】 -字高:24 -宋体、阴码,逐行式,顺向(高位在前) -''' -ascii_16x24_dict = { - ' ' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '!' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x03, 0xC0, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '"' : (0x00, 0x00, 0x00, 0x00, 0x03, 0x18, 0x07, 0x38, 0x0E, 0x70, 0x18, 0xC0, 0x10, 0x80, 0x21, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '#' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x04, 0x08, 0x04, 0x18, 0x0C, 0x10, - 0x7F, 0xFE, 0x7F, 0xFE, 0x08, 0x10, 0x08, 0x10, 0x08, 0x10, 0x08, 0x10, 0x08, 0x10, 0x7F, 0xFE, - 0x7F, 0xFE, 0x18, 0x20, 0x10, 0x20, 0x10, 0x20, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '$' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x01, 0xC0, 0x07, 0xB0, 0x19, 0x98, 0x19, 0x98, - 0x19, 0xB8, 0x1D, 0x80, 0x0F, 0x80, 0x07, 0x80, 0x01, 0xC0, 0x01, 0xF0, 0x01, 0xB8, 0x01, 0x98, - 0x39, 0x98, 0x39, 0x98, 0x31, 0x98, 0x19, 0xB0, 0x07, 0xC0, 0x01, 0x80, 0x01, 0x80, 0x00, 0x00), - '%' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x64, 0x10, 0x46, 0x10, 0xC6, 0x20, - 0xC6, 0x40, 0xC6, 0x40, 0x46, 0x80, 0x44, 0x80, 0x3D, 0x18, 0x01, 0x64, 0x02, 0x46, 0x02, 0x42, - 0x04, 0x42, 0x04, 0x42, 0x08, 0x46, 0x10, 0x64, 0x10, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '&' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x08, 0x80, 0x10, 0xC0, 0x10, 0xC0, - 0x10, 0xC0, 0x19, 0x80, 0x19, 0x00, 0x1E, 0x20, 0x1C, 0x18, 0x2E, 0x10, 0x46, 0x10, 0x43, 0x10, - 0xC3, 0xA0, 0xC1, 0xE0, 0x60, 0xE1, 0x31, 0xF2, 0x1E, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - "'" : (0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '(' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x30, 0x00, 0x20, 0x00, 0x40, 0x00, 0xC0, - 0x00, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x00, 0xC0, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00), - ')' : (0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x06, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x06, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x60, 0x00, 0x00, 0x00), - '*' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x71, 0x8E, 0x79, 0xBC, 0x0F, 0x60, 0x01, 0x80, 0x0F, 0x70, 0x79, 0x9E, 0x61, 0x8E, - 0x01, 0x80, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '+' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, - 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x7F, 0xFE, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, - 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - ',' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x20, 0x00), - '-' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '.' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x3C, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '/' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, - 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x80, 0x01, 0x80, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00), - '0' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x06, 0x60, 0x1C, 0x18, 0x18, 0x18, - 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, - 0x30, 0x0C, 0x18, 0x18, 0x18, 0x18, 0x0C, 0x30, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '1' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x80, 0x07, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0xC0, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '2' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x0C, 0x30, 0x10, 0x18, 0x30, 0x0C, - 0x38, 0x0C, 0x38, 0x1C, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x02, 0x00, - 0x04, 0x00, 0x18, 0x04, 0x30, 0x0C, 0x3F, 0xF8, 0x3F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '3' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x08, 0x70, 0x10, 0x38, 0x38, 0x18, - 0x18, 0x18, 0x00, 0x18, 0x00, 0x30, 0x00, 0xE0, 0x01, 0xE0, 0x00, 0x18, 0x00, 0x18, 0x00, 0x0C, - 0x10, 0x0C, 0x38, 0x0C, 0x30, 0x18, 0x18, 0x30, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '4' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x70, 0x00, 0xF0, 0x00, 0xF0, - 0x01, 0x70, 0x02, 0x70, 0x04, 0x70, 0x08, 0x70, 0x18, 0x70, 0x10, 0x70, 0x20, 0x70, 0x7F, 0xFE, - 0x00, 0x70, 0x00, 0x70, 0x00, 0x70, 0x00, 0x70, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '5' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0x10, 0x00, 0x10, 0x00, - 0x10, 0x00, 0x10, 0x00, 0x13, 0xC0, 0x1C, 0x30, 0x10, 0x18, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, - 0x38, 0x0C, 0x38, 0x0C, 0x30, 0x18, 0x18, 0x30, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '6' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x06, 0x18, 0x08, 0x18, 0x18, 0x18, - 0x30, 0x00, 0x30, 0x00, 0x30, 0xC0, 0x37, 0x38, 0x38, 0x1C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, - 0x30, 0x0C, 0x30, 0x0C, 0x18, 0x08, 0x0C, 0x10, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '7' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x30, 0x08, 0x20, 0x10, - 0x20, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x80, 0x01, 0x80, 0x01, 0x80, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x80, 0x03, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '8' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x0C, 0x30, 0x30, 0x08, 0x30, 0x0C, - 0x30, 0x0C, 0x30, 0x0C, 0x1C, 0x18, 0x0F, 0x20, 0x07, 0xE0, 0x18, 0x70, 0x30, 0x18, 0x20, 0x0C, - 0x60, 0x0C, 0x60, 0x0C, 0x30, 0x0C, 0x18, 0x18, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '9' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x0C, 0x70, 0x30, 0x18, 0x30, 0x18, - 0x70, 0x0C, 0x70, 0x0C, 0x70, 0x0C, 0x30, 0x1C, 0x30, 0x3C, 0x1C, 0x6C, 0x07, 0x8C, 0x00, 0x1C, - 0x00, 0x18, 0x00, 0x18, 0x18, 0x30, 0x18, 0x60, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - ':' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x03, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x03, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - ';' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x03, 0x80, 0x01, 0x80, 0x01, 0x00, 0x00, 0x00), - '<' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x20, 0x00, 0xC0, - 0x01, 0x80, 0x02, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, 0x18, 0x00, 0x04, 0x00, 0x03, 0x00, - 0x01, 0x80, 0x00, 0x40, 0x00, 0x30, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '=' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '>' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x18, 0x00, 0x04, 0x00, 0x03, 0x00, - 0x01, 0x80, 0x00, 0x40, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x20, 0x00, 0xC0, - 0x01, 0x80, 0x02, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '?' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x18, 0x18, 0x30, 0x0C, 0x20, 0x0C, - 0x30, 0x0C, 0x38, 0x0C, 0x00, 0x1C, 0x00, 0x38, 0x00, 0xE0, 0x01, 0x80, 0x01, 0x00, 0x01, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x80, 0x03, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '@' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x06, 0x18, 0x08, 0x04, 0x10, 0x7E, - 0x31, 0x92, 0x23, 0x12, 0x62, 0x32, 0x66, 0x32, 0x66, 0x32, 0x64, 0x22, 0x64, 0x62, 0x24, 0x64, - 0x33, 0xB8, 0x30, 0x02, 0x18, 0x04, 0x0C, 0x18, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'A' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x80, 0x02, 0x80, 0x02, 0xC0, - 0x02, 0xC0, 0x04, 0x40, 0x04, 0x60, 0x04, 0x60, 0x08, 0x60, 0x08, 0x30, 0x0F, 0xF0, 0x10, 0x30, - 0x10, 0x18, 0x10, 0x18, 0x20, 0x18, 0x20, 0x1C, 0xF8, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'B' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xF0, 0x18, 0x18, 0x18, 0x0C, - 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x18, 0x18, 0x60, 0x1F, 0xB0, 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x0E, - 0x18, 0x0E, 0x18, 0x0E, 0x18, 0x0C, 0x18, 0x18, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'C' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x06, 0x1C, 0x18, 0x04, 0x18, 0x06, - 0x30, 0x02, 0x30, 0x00, 0x70, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x70, 0x00, - 0x30, 0x02, 0x30, 0x04, 0x18, 0x04, 0x0C, 0x18, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'D' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xE0, 0x18, 0x18, 0x18, 0x1C, - 0x18, 0x0C, 0x18, 0x0E, 0x18, 0x0E, 0x18, 0x0E, 0x18, 0x0E, 0x18, 0x0E, 0x18, 0x0E, 0x18, 0x0C, - 0x18, 0x0C, 0x18, 0x1C, 0x18, 0x18, 0x18, 0x60, 0x7F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'E' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x18, 0x04, 0x18, 0x02, - 0x18, 0x00, 0x18, 0x10, 0x18, 0x10, 0x18, 0x30, 0x1F, 0xF0, 0x18, 0x10, 0x18, 0x10, 0x18, 0x00, - 0x18, 0x00, 0x18, 0x02, 0x18, 0x04, 0x18, 0x0C, 0x7F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'F' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x18, 0x06, 0x18, 0x02, - 0x18, 0x00, 0x18, 0x00, 0x18, 0x10, 0x18, 0x10, 0x1F, 0xF0, 0x18, 0x10, 0x18, 0x10, 0x18, 0x00, - 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'G' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC8, 0x0E, 0x38, 0x18, 0x18, 0x30, 0x08, - 0x30, 0x04, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x20, 0x60, 0x1C, 0x60, 0x18, - 0x30, 0x18, 0x30, 0x18, 0x18, 0x18, 0x0C, 0x18, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'H' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1C, 0x30, 0x0C, 0x30, 0x0C, - 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x3F, 0xFC, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, - 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0xFC, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'I' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF0, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x1F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'J' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x70, 0x40, 0x71, 0x80, 0x1E, 0x00), - 'K' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x3C, 0x18, 0x30, 0x18, 0x20, - 0x18, 0x40, 0x18, 0x80, 0x19, 0x00, 0x1B, 0x80, 0x1D, 0x80, 0x18, 0xC0, 0x18, 0xC0, 0x18, 0x60, - 0x18, 0x30, 0x18, 0x30, 0x18, 0x18, 0x18, 0x1C, 0x7E, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'L' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x18, 0x00, 0x18, 0x00, - 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, - 0x18, 0x00, 0x18, 0x02, 0x18, 0x06, 0x18, 0x0C, 0x7F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'M' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x1E, 0x30, 0x1C, 0x38, 0x1C, - 0x38, 0x2C, 0x28, 0x2C, 0x2C, 0x2C, 0x2C, 0x4C, 0x2C, 0x4C, 0x24, 0x4C, 0x26, 0x8C, 0x26, 0x8C, - 0x22, 0x8C, 0x23, 0x0C, 0x23, 0x0C, 0x23, 0x0C, 0xF1, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'N' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0E, 0x38, 0x04, 0x2C, 0x04, - 0x26, 0x04, 0x27, 0x04, 0x23, 0x04, 0x21, 0x84, 0x21, 0xC4, 0x20, 0xC4, 0x20, 0x64, 0x20, 0x74, - 0x20, 0x34, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x0C, 0xF8, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'O' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x0C, 0x30, 0x18, 0x18, 0x30, 0x0C, - 0x30, 0x0C, 0x30, 0x0E, 0x70, 0x06, 0x70, 0x06, 0x70, 0x06, 0x70, 0x06, 0x70, 0x06, 0x30, 0x06, - 0x30, 0x0C, 0x30, 0x0C, 0x18, 0x08, 0x0C, 0x30, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'P' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xF8, 0x18, 0x0C, 0x18, 0x0E, - 0x18, 0x06, 0x18, 0x06, 0x18, 0x0C, 0x18, 0x0C, 0x1F, 0xF0, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, - 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'Q' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x0C, 0x30, 0x18, 0x18, 0x30, 0x0C, - 0x30, 0x0C, 0x70, 0x0E, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x70, 0x0E, - 0x37, 0x8C, 0x38, 0xCC, 0x18, 0x78, 0x0C, 0x70, 0x03, 0xF0, 0x00, 0x3C, 0x00, 0x18, 0x00, 0x00), - 'R' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xF8, 0x18, 0x1C, 0x18, 0x0C, - 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x18, 0x18, 0x30, 0x1F, 0xC0, 0x18, 0xC0, 0x18, 0x60, 0x18, 0x60, - 0x18, 0x30, 0x18, 0x30, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'S' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x18, 0x38, 0x30, 0x18, 0x20, 0x08, - 0x20, 0x00, 0x30, 0x00, 0x38, 0x00, 0x0F, 0x00, 0x03, 0xE0, 0x00, 0x78, 0x00, 0x18, 0x00, 0x0C, - 0x40, 0x0C, 0x20, 0x0C, 0x30, 0x08, 0x38, 0x18, 0x27, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'T' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x61, 0x84, 0x41, 0x82, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'U' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x30, 0x08, 0x30, 0x08, - 0x30, 0x08, 0x30, 0x08, 0x30, 0x08, 0x30, 0x08, 0x30, 0x08, 0x30, 0x08, 0x30, 0x08, 0x30, 0x08, - 0x30, 0x08, 0x30, 0x08, 0x18, 0x08, 0x18, 0x30, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'V' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x18, 0x08, 0x18, 0x08, - 0x18, 0x10, 0x1C, 0x10, 0x0C, 0x10, 0x0C, 0x20, 0x0E, 0x20, 0x06, 0x40, 0x06, 0x40, 0x06, 0x40, - 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'W' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x86, 0x21, 0x84, 0x31, 0x84, - 0x30, 0x84, 0x31, 0xC4, 0x31, 0xC8, 0x11, 0xC8, 0x1A, 0xC8, 0x1A, 0x48, 0x1A, 0x70, 0x1A, 0x70, - 0x0C, 0x70, 0x0C, 0x70, 0x0C, 0x20, 0x0C, 0x20, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'X' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1C, 0x18, 0x10, 0x0C, 0x10, - 0x06, 0x20, 0x06, 0x40, 0x03, 0x40, 0x03, 0x80, 0x01, 0x80, 0x01, 0xC0, 0x02, 0xC0, 0x02, 0x60, - 0x04, 0x70, 0x08, 0x30, 0x08, 0x18, 0x10, 0x1C, 0x7C, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'Y' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1C, 0x18, 0x08, 0x18, 0x10, - 0x0C, 0x10, 0x0C, 0x20, 0x06, 0x20, 0x06, 0x40, 0x03, 0x40, 0x03, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'Z' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x30, 0x18, 0x20, 0x38, - 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, 0x07, 0x00, 0x06, 0x00, - 0x0C, 0x00, 0x18, 0x04, 0x18, 0x04, 0x30, 0x1C, 0x7F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '[' : (0x00, 0x00, 0x00, 0x00, 0x03, 0xFC, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00), - '\\' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x18, 0x00, 0x08, 0x00, 0x0C, 0x00, - 0x06, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x01, 0x80, 0x00, 0x80, 0x00, 0xC0, 0x00, 0x40, - 0x00, 0x60, 0x00, 0x20, 0x00, 0x30, 0x00, 0x10, 0x00, 0x18, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x04), - ']' : (0x00, 0x00, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, - 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, - 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x3F, 0xC0, 0x00, 0x00), - '^' : (0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x0C, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '_' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF), - '`' : (0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'a' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0F, 0xE0, 0x30, 0x10, 0x30, 0x18, 0x00, 0x18, 0x03, 0xF8, 0x1C, 0x18, - 0x30, 0x18, 0x70, 0x18, 0x70, 0x18, 0x30, 0x7A, 0x0F, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'b' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x00, 0x10, 0x00, 0x10, 0x00, - 0x10, 0x00, 0x10, 0x00, 0x13, 0xF0, 0x14, 0x18, 0x18, 0x0C, 0x18, 0x0C, 0x10, 0x0C, 0x10, 0x0C, - 0x10, 0x0C, 0x10, 0x0C, 0x18, 0x08, 0x1C, 0x10, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'c' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x0C, 0x18, 0x18, 0x18, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, - 0x30, 0x00, 0x30, 0x04, 0x18, 0x08, 0x0C, 0x18, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'd' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, - 0x00, 0x18, 0x00, 0x18, 0x07, 0xD8, 0x0C, 0x38, 0x18, 0x18, 0x30, 0x18, 0x30, 0x18, 0x30, 0x18, - 0x30, 0x18, 0x30, 0x18, 0x18, 0x18, 0x0C, 0x7E, 0x03, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'e' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x08, 0x18, 0x18, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x3F, 0xF0, - 0x30, 0x00, 0x30, 0x00, 0x18, 0x08, 0x0C, 0x10, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'f' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFE, 0x03, 0x06, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x3F, 0xF8, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'g' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x08, 0x36, 0x18, 0x10, 0x10, 0x18, 0x18, 0x10, 0x08, 0x30, - 0x0F, 0xC0, 0x10, 0x00, 0x1F, 0x80, 0x0B, 0xF8, 0x30, 0x0C, 0x20, 0x0C, 0x30, 0x0C, 0x0F, 0xF0), - 'h' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, - 0x18, 0x00, 0x18, 0x00, 0x1B, 0xF0, 0x1C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7C, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'i' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x01, 0xC0, 0x01, 0x80, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x1F, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x1F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'j' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x38, 0x00, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, - 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x30, 0x38, 0x20, 0x1F, 0xC0), - 'k' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, - 0x18, 0x00, 0x18, 0x00, 0x18, 0x7C, 0x18, 0x20, 0x18, 0x40, 0x19, 0x80, 0x1B, 0x80, 0x1C, 0xC0, - 0x18, 0x60, 0x18, 0x60, 0x18, 0x30, 0x18, 0x18, 0x7C, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'l' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x1F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'm' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xEF, 0x3C, 0x31, 0xC6, 0x21, 0x86, 0x21, 0x86, 0x21, 0x86, 0x21, 0x86, - 0x21, 0x86, 0x21, 0x86, 0x21, 0x86, 0x21, 0x86, 0xFB, 0xCF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'n' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7B, 0xF0, 0x1C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7C, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'o' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x18, 0x18, 0x10, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, - 0x30, 0x0C, 0x30, 0x0C, 0x10, 0x08, 0x08, 0x10, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'p' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7B, 0xE0, 0x1C, 0x18, 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x0C, - 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x0C, 0x1C, 0x38, 0x1B, 0xC0, 0x18, 0x00, 0x18, 0x00, 0x3C, 0x00), - 'q' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0xC8, 0x18, 0x38, 0x30, 0x18, 0x30, 0x18, 0x30, 0x18, 0x30, 0x18, - 0x30, 0x18, 0x30, 0x18, 0x30, 0x18, 0x18, 0x38, 0x07, 0xD8, 0x00, 0x18, 0x00, 0x18, 0x00, 0x3C), - 'r' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7C, 0x7C, 0x04, 0x8E, 0x05, 0x00, 0x06, 0x00, 0x04, 0x00, 0x04, 0x00, - 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x7F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 's' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x08, 0x18, 0x18, 0x08, 0x18, 0x00, 0x0F, 0x00, 0x01, 0xF0, - 0x00, 0x38, 0x00, 0x0C, 0x10, 0x0C, 0x18, 0x18, 0x17, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 't' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x03, 0x00, 0x07, 0x00, 0x3F, 0xF8, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x04, 0x03, 0x18, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'u' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x70, 0x78, 0x10, 0x18, 0x10, 0x18, 0x10, 0x18, 0x10, 0x18, 0x10, 0x18, - 0x10, 0x18, 0x10, 0x18, 0x18, 0x18, 0x1C, 0x7E, 0x07, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'v' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7E, 0x3E, 0x18, 0x08, 0x08, 0x10, 0x0C, 0x10, 0x0C, 0x20, 0x06, 0x20, - 0x06, 0x40, 0x03, 0x40, 0x03, 0x80, 0x01, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'w' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xFB, 0xCF, 0x21, 0x84, 0x31, 0x84, 0x31, 0x88, 0x11, 0xC8, 0x1A, 0xC8, - 0x1A, 0x50, 0x0A, 0x70, 0x0C, 0x70, 0x0C, 0x20, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'x' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x0C, 0x10, 0x06, 0x20, 0x03, 0x40, 0x01, 0x80, 0x01, 0x80, - 0x02, 0xC0, 0x04, 0x60, 0x0C, 0x30, 0x18, 0x18, 0x7C, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'y' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7E, 0x3E, 0x18, 0x18, 0x0C, 0x10, 0x0C, 0x30, 0x06, 0x20, 0x06, 0x20, - 0x03, 0x40, 0x03, 0x40, 0x01, 0x80, 0x01, 0x80, 0x01, 0x00, 0x01, 0x00, 0x12, 0x00, 0x3C, 0x00), - 'z' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0x10, 0x30, 0x20, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, - 0x06, 0x00, 0x06, 0x04, 0x0C, 0x08, 0x18, 0x18, 0x3F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '{' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x20, 0x00, 0x20, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x00, 0x40, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x1C, 0x00, 0x00), - '|' : (0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00), - '}' : (0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x04, 0x00, 0x04, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, - 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, 0x02, 0x00, 0x06, 0x00, 0x06, 0x00, - 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x38, 0x00, 0x00, 0x00), - '~' : (0x00, 0x00, 0x1E, 0x00, 0x21, 0x82, 0x40, 0xC4, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), -} \ No newline at end of file diff --git "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\255\227\347\254\246/readme.md" "b/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\255\227\347\254\246/readme.md" deleted file mode 100644 index 9da12fe7041d364cfe643eabc8ec7380df6998fc..0000000000000000000000000000000000000000 --- "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\255\227\347\254\246/readme.md" +++ /dev/null @@ -1,17 +0,0 @@ -显示字符实验例程说明 - -1. 例程说明 - - 本例程基于 ST7789V LCD显示屏,型号240x240。 - -2. 文件说明 - -| 文件名 | 描述 | -| ----------------------- | ------------------------------------------------------------ | -| st7789v.py | 包含 ST7789V lcd 驱动初始化、写ASCII字符、写汉字以及显示图片的方法接口。 | -| fonts.py | 字库,提供常见ASCII字符的两种大小的字库,分别是8x16和16x24,同时包含了实验中用到汉字的几种不同大小的字库。用户可根据自己的需要制作字库,使用PCtoLCD2002软件,参照fonts.py中说明来制作。 | -| example_display_char.py | 主程序,调用st7789v.py和fonts.py中接口及信息来实现ASCII字符的显示与汉字的显示。 | - -3. 显示效果 - -显示结果 \ No newline at end of file diff --git "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\255\227\347\254\246/st7789v.py" "b/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\255\227\347\254\246/st7789v.py" deleted file mode 100644 index 73ba2b363c32709d258fce3195384f699b9dfdbb..0000000000000000000000000000000000000000 --- "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\255\227\347\254\246/st7789v.py" +++ /dev/null @@ -1,317 +0,0 @@ -# -*- coding: UTF-8 -*- - -import log -from machine import LCD -from usr import fonts - -XSTART_H = 0xf0 -XSTART_L = 0xf1 -YSTART_H = 0xf2 -YSTART_L = 0xf3 -XEND_H = 0xE0 -XEND_L = 0xE1 -YEND_H = 0xE2 -YEND_L = 0xE3 - - -XSTART = 0xD0 -XEND = 0xD1 -YSTART = 0xD2 -YEND = 0xD3 - - -class ST7789V(): - def __init__(self, width, hight): - self.lcdlog = log.basicConfig() - self.lcdlog = log.getLogger("LCD") - self.lcdlog.setLevel(log.DEBUG) - self.lcd = LCD() - self.lcd_w = width - self.lcd_h = hight - - self.st7789v_init_data = ( - 2, 1, 120, - 0, 0, 0x11, - 2, 1, 120, - 0, 1, 0x36, - 1, 1, 0x00, - 0, 1, 0x3A, - 1, 1, 0x05, - 0, 0, 0x21, - 0, 5, 0xB2, - 1, 1, 0x05, - 1, 1, 0x05, - 1, 1, 0x00, - 1, 1, 0x33, - 1, 1, 0x33, - 0, 1, 0xB7, - 1, 1, 0x23, - 0, 1, 0xBB, - 1, 1, 0x22, - 0, 1, 0xC0, - 1, 1, 0x2C, - 0, 1, 0xC2, - 1, 1, 0x01, - 0, 1, 0xC3, - 1, 1, 0x13, - 0, 1, 0xC4, - 1, 1, 0x20, - 0, 1, 0xC6, - 1, 1, 0x0F, - 0, 2, 0xD0, - 1, 1, 0xA4, - 1, 1, 0xA1, - 0, 1, 0xD6, - 1, 1, 0xA1, - 0, 14, 0xE0, - 1, 1, 0x70, - 1, 1, 0x06, - 1, 1, 0x0C, - 1, 1, 0x08, - 1, 1, 0x09, - 1, 1, 0x27, - 1, 1, 0x2E, - 1, 1, 0x34, - 1, 1, 0x46, - 1, 1, 0x37, - 1, 1, 0x13, - 1, 1, 0x13, - 1, 1, 0x25, - 1, 1, 0x2A, - 0, 14, 0xE1, - 1, 1, 0x70, - 1, 1, 0x04, - 1, 1, 0x08, - 1, 1, 0x09, - 1, 1, 0x07, - 1, 1, 0x03, - 1, 1, 0x2C, - 1, 1, 0x42, - 1, 1, 0x42, - 1, 1, 0x38, - 1, 1, 0x14, - 1, 1, 0x14, - 1, 1, 0x27, - 1, 1, 0x2C, - 0, 0, 0x29, - - 0, 1, 0x36, - 1, 1, 0x00, - - 0, 4, 0x2a, - 1, 1, 0x00, - 1, 1, 0x00, - 1, 1, 0x00, - 1, 1, 0xef, - - 0, 4, 0x2b, - 1, 1, 0x00, - 1, 1, 0x00, - 1, 1, 0x00, - 1, 1, 0xef, - - 0, 0, 0x2c, - ) - - self.st7789v_invalid_data = ( - 0,4,0x2a, - 1,1,XSTART_H, - 1,1,XSTART_L, - 1,1,XEND_H, - 1,1,XEND_L, - 0,4,0x2b, - 1,1,YSTART_H, - 1,1,YSTART_L, - 1,1,YEND_H, - 1,1,YEND_L, - 0,0,0x2c, - ) - ret = self.lcd.lcd_init(bytearray(self.st7789v_init_data), self.lcd_w, self.lcd_h, 13000, 1, 4, 0, bytearray(self.st7789v_invalid_data), None, None, None) - self.lcdlog.info('lcd.lcd_init ret = {}'.format(ret)) - '''清屏,设置白色''' - self.lcd.lcd_clear(0xFFFF) - - ''' - 单个字符显示,包括汉字和ASCII - x - x轴坐标 - y - y轴坐标 - xsize - 字体宽度 - ysize - 字体高度 - ch_buf - 存放汉字字模的元组或者列表 - fc - 字体颜色,RGB565 - bc - 背景颜色,RGB565 - ''' - def lcd_show_char(self, x, y, xsize, ysize, ch_buf, fc, bc): - rgb_buf = [] - t1 = xsize // 8 - t2 = xsize % 8 - if t2 != 0: - xsize = (t1 + 1) * 8 - for i in range(0, len(ch_buf)): - for j in range(0, 8): - if (ch_buf[i] << j) & 0x80 == 0x00: - rgb_buf.append(bc & 0xff) - rgb_buf.append(bc >> 8) - else: - rgb_buf.append(fc & 0xff) - rgb_buf.append(fc >> 8) - self.lcd.lcd_write(bytearray(rgb_buf), x, y, x + xsize - 1, y + ysize - 1) - - ''' - ASCII字符显示,目前支持8x16、16x24的字体大小, - 如果需要其他字体大小需要自己增加对应大小的字库数据,并 - 在下面函数中增加这个对应字库的字典。 - x - x轴显示起点 - y - y轴显示起点 - xsize - 字体宽度 - ysize - 字体高度 - ch - 待显示的ASCII字符 - fc - 字体颜色,RGB565 - bc - 背景颜色,RGB565 - ''' - def lcd_show_ascii(self, x, y, xsize, ysize, ch, fc, bc): - ascii_dict = {} - if xsize == 8 and ysize == 16: - ascii_dict = fonts.ascii_8x16_dict - elif xsize == 16 and ysize == 24: - ascii_dict = fonts.ascii_16x24_dict - - for key in ascii_dict: - if ch == key: - self.lcd_show_char(x, y, xsize, ysize, ascii_dict[key], fc, bc) - - ''' - 显示字符串,目前支持8x16的字体大小, - 如果需要其他字体大小需要自己增加对应大小的字库数据,并 - 在lcd_show_ascii函数中增加这个对应字库的字典。 - x - x轴坐标 - y - y轴坐标 - xsize - 字体宽度 - ysize - 字体高度 - str - 待显示的 ASCII 字符串 - fc - 字体颜色,RGB565 - bc - 背景颜色,RGB565 - ''' - def lcd_show_ascii_str(self, x, y, xsize, ysize, str, fc, bc): - xs = x - ys = y - if (len(str) * xsize + x) > self.lcd_w: - raise Exception('Display out of range') - for ch in str: - self.lcd_show_ascii(xs, ys, xsize, ysize, ch, fc, bc) - xs += xsize - - ''' - 汉字显示,目前支持16x16、16x24、24x24的字体大小, - 如果需要其他字体大小需要自己增加对应大小的字库数据,并 - 在下面函数中增加这个对应字库的字典。 - x - x轴显示起点 - y - y轴显示起点 - xsize - 字体宽度 - ysize - 字体高度 - ch - 待显示的ASCII字符 - fc - 字体颜色,RGB565 - bc - 背景颜色,RGB565 - ''' - def lcd_show_chinese(self, x, y, xsize, ysize, ch, fc, bc): - hanzi_dict = {} - if xsize == 16 and ysize == 16: - hanzi_dict = fonts.hanzi_16x16_dict - elif xsize == 16 and ysize == 24: - hanzi_dict = fonts.hanzi_16x24_dict - elif xsize == 24 and ysize == 24: - hanzi_dict = fonts.hanzi_24x24_dict - - for key in hanzi_dict: - if ch == key: - self.lcd_show_char(x, y, xsize, ysize, hanzi_dict[key], fc, bc) - - ''' - 汉字字符串显示,目前支持16x16的字体大小, - 如果需要其他字体大小需要自己增加对应大小的字库数据,并 - 在lcd_show_chinese函数中增加这个对应字库的字典。 - x - x轴坐标 - y - y轴坐标 - xsize - 字体宽度 - ysize - 字体高度 - str - 待显示的多个汉字 - fc - 字体颜色,RGB565 - bc - 背景颜色,RGB565 - ''' - def lcd_show_chinese_str(self, x, y, xsize, ysize, str, fc, bc): - xs = x - ys = y - # print('chstrlen={}, w={}'.format(len(str), self.lcd_w)) - if (len(str) / 3 * xsize + x) > self.lcd_w: - raise Exception('Display out of range') - for i in range(0, len(str), 3): - index = i + 3 - ch = str[i:index] - self.lcd_show_chinese(xs, ys, xsize, ysize, ch, fc, bc) - xs += xsize - - ''' - 图片显示 - 如果图片宽高小于80x80,可直接该函数一次性写入并显示 - image_data - 存放待显示图片的RGB数据 - x - x轴显示起点 - y - y轴显示起点 - width - 图片宽度 - heigth - 图片高度 - ''' - def lcd_show_image(self, image_data, x, y, width, heigth): - self.lcd.lcd_write(bytearray(image_data), x, y, x + width - 1, y + heigth - 1) - - ''' - 图片显示 - 如果图片宽高大于80x80,用该函数来分段写入显示,分段写入原理如下: - 以要显示图片的宽度为固定值,将待显示的图片分成若干宽高为 width * h 大小的图片,最后一块高度不足h的按实际高度计算, - h为分割后每个图片的高度,可由用户通过参数 h 指定,h的值应该满足关系: width * h * 2 < 4096 - path - 存放图片数据的txt文件路径,包含文件名,如 '/usr/image.txt' - x - x轴显示起点 - y - y轴显示起点 - width - 图片宽度 - heigth - 图片高度 - h - 分割后每个图片的高度 - ''' - def lcd_show_image_file(self, path, x, y, width, heigth, h): - image_data = [] - read_n = 0 # 已经读取的字节数 - byte_n = 0 # 字节数 - xs = x - ys = y - h_step = h # 按高度h_step个像素点作为步长 - h1 = heigth // h_step # 当前图片按h_step大小分割,可以得到几个 width * h_step 大小的图片 - h2 = heigth % h_step # 最后剩下的一块 大小不足 width * h_step 的图片的实际高度 - # print('h1 = {}, h2 = {}'.format(h1, h2)) - with open(path, "r", encoding='utf-8') as fd: - # for line in fd.readlines(): - end = '' - while not end: - line = fd.readline() - if line == '': - end = 1 - else: - curline = line.strip('\r\n').strip(',').split(',') - for i in curline: - byte_n += 1 - read_n += 1 - image_data.append(int(i)) - if h1 > 0 and byte_n == width * h_step * 2: - self.lcd_show_image(image_data, xs, ys, width, h_step) - image_data = [] - ys = ys + h_step - h1 -= 1 - byte_n = 0 - # print('image_data len = {}'.format(len(image_data))) - elif h1 == 0 and read_n == width * heigth * 2: - if h2 != 0: - self.lcd_show_image(image_data, xs, ys, width, h2) - - ''' - 将24位色转换位16位色 - 如红色的24位色为0xFF0000,则r=0xFF,g=0x00,b=0x00, - 将r、g、b的值传入下面函数即可得到16位相同颜色数据 - ''' - def get_rgb565_color(self, r, g, b): - return ((r << 8) & 0xF800) | ((g << 3) & 0x07E0) | ((b >> 3) & 0x001F) diff --git "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\255\227\347\254\246/\346\230\276\347\244\272\347\273\223\346\236\234.jpg" "b/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\255\227\347\254\246/\346\230\276\347\244\272\347\273\223\346\236\234.jpg" deleted file mode 100644 index 644bc4b1d833ad8e66ab509378b08817d9b8e6fc..0000000000000000000000000000000000000000 Binary files "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\255\227\347\254\246/\346\230\276\347\244\272\347\273\223\346\236\234.jpg" and /dev/null differ diff --git a/docs/little_demo/zh/QuecPythonTest/code/buttonclass.py b/docs/little_demo/zh/QuecPythonTest/code/buttonclass.py deleted file mode 100644 index a8d0e94982ce05ae1d628d8e549978cd46c47cb4..0000000000000000000000000000000000000000 --- a/docs/little_demo/zh/QuecPythonTest/code/buttonclass.py +++ /dev/null @@ -1,154 +0,0 @@ -''' -File: buttonclass.py -Project: button -File Created: Thursday, 24th December 2020 5:52:44 pm -Author: chengzhu.zhou ------ -Last Modified: Friday, 25th December 2020 5:30:48 pm -Modified By: chengzhu.zhou ------ -Copyright 2020 - 2020 quectel -''' - - -# copy from https://blog.csdn.net/qq997758497/article/details/80606710 -from machine import Pin -import _thread -import utime as time - - -def Processing_button_fun(Alias, actionKey): - print("{0} has {1} action".format(Alias, actionKey)) - pass - - -class ButtonClass(): - Alias = None - Gpio_obj = None - # check quiet click and long - Status2 = None - Status1 = None - callbackfun = None - timercount2 = None - timercount1 = None - # macro - # readonly - KEY_ACTION_QUIET = "quiet" - KEY_ACTION_CLICK = "click" - KEY_ACTION_DOUBLE = "double" - KEY_ACTION_LONG = "long" - # KEY_ACTION = {"quiet": "No key is generated ", "click": "Single key generation", - # "double": "Double click the event", "long": "There are long press events"} - - # KeyValue - KEY_VALUE = {"press": 0, "normal": 1} - - # - KEY_LONG_MAX_TIME = 2000 - - def SetButtonStatu2(self, status="state0", time=0x00): - self.Status2 = status - self.timercount2 = time - - def SetButtonStatu1(self, status="state0", time=0x00): - self.Status1 = status - self.timercount1 = time - - def __nextstatus(self): - pass - - def init(self, pin, callbackfun, Alias="gpio0"): - self.Gpio_obj = Pin(pin, Pin.IN, Pin.PULL_DISABLE, 0) - self.Alias = Alias - self.callbackfun = callbackfun - self.SetButtonStatu2("state0", 0x0) - self.SetButtonStatu1("state0", 0x0) - print("init button has success") - pass - - # return quiet click and long - def __button_read_key(self): - _Status = self.Status2 - keyValue = self.Gpio_obj.read() - if _Status == "state0": - if keyValue == self.KEY_VALUE["press"]: - self.SetButtonStatu2("state1", 0x00) - return self.KEY_ACTION_QUIET - - # Software chattering elimination - if _Status == "state1": - if keyValue == self.KEY_VALUE["press"]: - self.SetButtonStatu2("state2", time.ticks_ms()) - else: - # reset status - self.SetButtonStatu2("state0", 0x00) - return self.KEY_ACTION_QUIET - elif _Status == "state2": - if keyValue == self.KEY_VALUE["normal"]: - # has click occur - self.SetButtonStatu2("state0", self.timercount2) - return self.KEY_ACTION_CLICK - else: - difftime = time.ticks_ms() - self.timercount2 - if difftime > self.KEY_LONG_MAX_TIME: - self.SetButtonStatu2("state0", 0x00) - return self.KEY_ACTION_LONG - elif _Status == "state3": - # Wait for the key to release - if keyValue == self.KEY_VALUE["normal"]: - self.SetButtonStatu2("state0", 0x00) - return self.KEY_ACTION_QUIET - - def polling(self): - # check has double click - _Status = self.Status1 - _KeyStatus = self.__button_read_key() - retStatus = _KeyStatus - if _Status == "state0": - if _KeyStatus != self.KEY_ACTION_CLICK: - retStatus = _KeyStatus - else: - self.SetButtonStatu1("state1", time.ticks_ms()) - # No report - retStatus = self.KEY_ACTION_QUIET - elif _Status == "state1": - difftime = time.ticks_ms() - self.timercount1 - if _KeyStatus == self.KEY_ACTION_CLICK: - # Second time detected in a short time - self.SetButtonStatu1("state0", 0x00) - retStatus = self.KEY_ACTION_DOUBLE - elif difftime >= 500: - self.SetButtonStatu1("state0", 0x00) - retStatus = self.KEY_ACTION_CLICK - if retStatus != self.KEY_ACTION_QUIET: - print("{0} has {1}".format(self.Alias, retStatus)) - return retStatus - - -# -def button_polling_thread(delay, PinList): - ButtonList = [] - i = 0 - # init button - for _pin in PinList: - _temp = ButtonClass() - _temp.init(_pin, Processing_button_fun, "button{0}".format(i)) - ButtonList.append(_temp) - i = i + 1 - # Polling button - i = 10 - while i: - for button in ButtonList: - action = button.polling() - if action != ButtonClass.KEY_ACTION_QUIET: - # has press - button.callbackfun(button.Alias, action) - i = i - 1 - time.sleep_ms(10) - print("button thread has exited") - - -if __name__ == "__main__": - # creat a thread Check key status - _thread.start_new_thread(button_polling_thread, - (1, [Pin.GPIO1, Pin.GPIO2])) diff --git a/docs/little_demo/zh/QuecPythonTest/code/ebf_smd4805.py b/docs/little_demo/zh/QuecPythonTest/code/ebf_smd4805.py deleted file mode 100644 index cd53a71bc305751ead7bb22800dd830b4654a2b6..0000000000000000000000000000000000000000 --- a/docs/little_demo/zh/QuecPythonTest/code/ebf_smd4805.py +++ /dev/null @@ -1,148 +0,0 @@ -''' -File: EBF_SMD4805.py -Project: others -File Created: Wednesday, 6th January 2021 2:16:52 pm -Author: chengzhu.zhou ------ -Last Modified: Wednesday, 6th January 2021 2:56:42 pm -Modified By: chengzhu.zhou ------ -Copyright 2021 - 2021 quectel -''' - -""" -参考资料 -1. API -https://python.quectel.com/wiki/#/zh-cn/api/?id=pwm -https://python.quectel.com/wiki/#/zh-cn/api/?id=pin -2. 模块资料 -https://item.taobao.com/item.htm?ft=t&id=543053172983 -步进电机驱动器 + 42步进电机 -2.1 模块开发资料 -https://ebf-products.readthedocs.io/zh_CN/latest/module/motor/ebf-msd4805.html -""" - -""" -引脚连接 -| 电机 | EC600开发板 | 对应的函数标号 | -| ---------- | ------------------ | ------- | -| ENA- (GPIO) | GPIO81 (引脚号16) | GPIO7 | -| DIR- (GPIO) | GPIO77 (引脚号15) | GPIO6 | -| PUL- (PWM) | GPIO2_1V8 (引脚号70) | PWM2 | -| ENA+ DIR+ PUL+ | 1V8(电源) | 无 | -""" - - - - -from misc import PWM -from machine import Pin -import utime as time -import urandom as random -import log -def delay_500us(): - for i in range(600): - pass - - -def delay_250us(): - for i in range(310): - pass - - -ENABLE_MOTOR = 0x1 -DISABLE_MOTOR = 0x0 - -DIR_CLOCKWISE = 0x1 -DIR_ANTI_CLOCKWISE = 0x0 - - -class ebf_smd4805(): - - dev_log = None - - # 步进电机的参数 - sm_para_step = None # 步进角度 - # 控制器的参数 - env_pin = None # 使能引脚 - dir_pin = None # 方向引脚 - pul_pwm = None # 脉冲输出引脚 - ctrl_divstep = None # 细分参数,具体请参考控制器手册 - - def init(self, step, divstep): - self.dev_log = log.getLogger("ebf_smd4805") - self.env_pin = Pin(Pin.GPIO7, Pin.OUT, Pin.PULL_DISABLE, 0) - self.dir_pin = Pin(Pin.GPIO6, Pin.OUT, Pin.PULL_DISABLE, 0) - # 配置电机的参数 - self.sm_para_step = step - # 配置控制器的参数 - self.ctrl_divstep = divstep - - def reset(self): - self.env_pin.write(DISABLE_MOTOR) - self.dir_pin.write(DIR_ANTI_CLOCKWISE) - if self.pul_pwm is not None: - self.pul_pwm.close() - - # 根据频率 初始化PWM - def outputpwm(self, HZ, duty_cycle): - # 将HZ 转化为 us 级别 - cycleTime = int(1000000/HZ) - highTime = int(cycleTime * duty_cycle) - return highTime, cycleTime - - # 根据速度,设置PWM的输出 - def enable_pwm(self, speed): - # 1. 首先根据步进电机的步进角度,计算旋转一圈需要多少个脉冲 - Count_pulse = int(360/self.sm_para_step) - self.dev_log.debug("sm motor step as {0}".format(Count_pulse)) - # 2. 根据控制器的细分参数,计算控制器控制步进电机旋转一圈,需要多少的脉冲 - Count_pulse = int(Count_pulse * self.ctrl_divstep) - # 3. 最后计算出1秒旋转speed圈,需要多少个脉冲 , 换句话说 就是频率 - Count_pulse = int(Count_pulse * speed) - # 4. 初始化PWM, 默认占空比%50 - highTime, cycleTime = self.outputpwm(Count_pulse, 0.1) - self.dev_log.debug( - """config frequency is {0}HZ,cycleTime {1}us, hightime {2}us""" - .format(Count_pulse, cycleTime, highTime)) - self.pul_pwm = PWM(PWM.PWM2, PWM.ABOVE_10US, - int(highTime), int(cycleTime)) - self.pul_pwm.open() - pass - - def disable_pwm(self): - self.pul_pwm.close() - pass - - # speed 为速度, 每秒多少圈 - # Duration 为持续时间, ms - # dir 表示方向 - def run(self, speed, Duration, dir=DIR_CLOCKWISE): - self.dir_pin.write(dir) - self.dev_log.info( - "Configure the motor to rotate {0} revolutions per second".format(speed)) - self.enable_pwm(speed) - self.env_pin.write(1) - # delay - for i in range(int(Duration * 4)): - delay_250us() - self.env_pin.write(0) - - self.reset() - pass - - -def test_ebf_smd4805(): - log.basicConfig(level=log.DEBUG) - # log.basicConfig(level=log.INFO) - ebf_smd4805_dev = ebf_smd4805() - ebf_smd4805_dev.init(step=1.8, divstep=2) - for i in range(2, 10): - ebf_smd4805_dev.run(i, Duration=1000, dir=DIR_CLOCKWISE) - print("test_ebf_smd4805 Function exit,!!!") - pass - - -if __name__ == "__main__": - # creat a thread Check key status - test_ebf_smd4805() diff --git a/docs/little_demo/zh/QuecPythonTest/code/i2c_aht10.py b/docs/little_demo/zh/QuecPythonTest/code/i2c_aht10.py deleted file mode 100644 index bd7136dff94eea08b941e90135a387511faa87b1..0000000000000000000000000000000000000000 --- a/docs/little_demo/zh/QuecPythonTest/code/i2c_aht10.py +++ /dev/null @@ -1,108 +0,0 @@ -''' -File: i2c_aht10.py -Project: i2c -File Created: Monday, 28th December 2020 5:17:28 pm -Author: chengzhu.zhou ------ -Last Modified: Tuesday, 29th December 2020 9:01:35 pm -Modified By: chengzhu.zhou ------ -Copyright 2020 - 2020 quectel -''' - -import log -from machine import I2C -import utime as time -""" -1. calibration -2. Trigger measurement -3. read data -""" - -# API 手册 http://qpy.quectel.com/wiki/#/zh-cn/api/?id=i2c -# AHT10 说明书 -# https://server4.eca.ir/eshop/AHT10/Aosong_AHT10_en_draft_0c.pdf - - -class aht10class(): - i2c_log = None - i2c_dev = None - i2c_addre = None - - # Initialization command - AHT10_CALIBRATION_CMD = 0xE1 - # Trigger measurement - AHT10_START_MEASURMENT_CMD = 0xAC - # reset - AHT10_RESET_CMD = 0xBA - - def write_data(self, data): - self.i2c_dev.write(self.i2c_addre, - bytearray(0x00), 0, - bytearray(data), len(data)) - pass - - def read_data(self, length): - r_data = [0x00 for i in range(length)] - r_data = bytearray(r_data) - self.i2c_dev.read(self.i2c_addre, - bytearray(0x00), 0, - r_data, length, - 0) - return list(r_data) - - def aht10_init(self, addre=0x38, Alise="Ath10"): - self.i2c_log = log.getLogger(Alise) - self.i2c_dev = I2C(I2C.I2C1, I2C.STANDARD_MODE) # 返回i2c对象 - self.i2c_addre = addre - self.sensor_init() - pass - - def aht10_transformation_temperature(self, data): - r_data = data - # 根据数据手册的描述来转化温度 - humidity = (r_data[0] << 12) | ( - r_data[1] << 4) | ((r_data[2] & 0xF0) >> 4) - humidity = (humidity/(1 << 20)) * 100.0 - print("current humidity is {0}%".format(humidity)) - temperature = ((r_data[2] & 0xf) << 16) | ( - r_data[3] << 8) | r_data[4] - temperature = (temperature * 200.0 / (1 << 20)) - 50 - print("current temperature is {0}°C".format(temperature)) - - - def sensor_init(self): - # calibration - self.write_data([self.AHT10_CALIBRATION_CMD, 0x08, 0x00]) - time.sleep_ms(300) # at last 300ms - pass - - def ath10_reset(self): - self.write_data([self.AHT10_RESET_CMD]) - time.sleep_ms(20) # at last 20ms - - def Trigger_measurement(self): - # Trigger data conversion - self.write_data([self.AHT10_START_MEASURMENT_CMD, 0x33, 0x00]) - time.sleep_ms(200) # at last delay 75ms - # check has success - r_data = self.read_data(6) - # check bit7 - if (r_data[0] >> 7) != 0x0: - print("Conversion has error") - else: - self.aht10_transformation_temperature(r_data[1:6]) - - -def i2c_aht10_test(): - ath_dev = aht10class() - ath_dev.aht10_init() - - # 测试十次 - for i in range(10): - ath_dev.Trigger_measurement() - time.sleep(1) - - -if __name__ == "__main__": - i2c_aht10_test() diff --git a/docs/little_demo/zh/QuecPythonTest/code/i2c_base.py b/docs/little_demo/zh/QuecPythonTest/code/i2c_base.py deleted file mode 100644 index 0a24fe6ec238e3f445dff5d8ff310196398f8366..0000000000000000000000000000000000000000 --- a/docs/little_demo/zh/QuecPythonTest/code/i2c_base.py +++ /dev/null @@ -1,44 +0,0 @@ -''' -File: i2c_base.py -Project: i2c -File Created: Wednesday, 30th December 2020 3:09:07 pm -Author: chengzhu.zhou ------ -Last Modified: Thursday, 7th January 2021 7:20:51 pm -Modified By: chengzhu.zhou ------ -Copyright 2021 - 2021 quectel -''' -from machine import I2C -''' -I2C使用示例 -''' - -# 参考 http://qpy.quectel.com/wiki/#/zh-cn/api/?id=i2c -# 设置日志输出级别 - - -def test_i2c(): - i2c_dev = I2C(I2C.I2C1, I2C.STANDARD_MODE) - addres = 0x19 - LIS2DH12_WHO_AM_I = 0x0F # 板载三轴加速度传感器 身份寄存器 - r_data = bytearray([0x00]) # 存储数据 - i2c_dev.read(addres, bytearray(LIS2DH12_WHO_AM_I), 1, - r_data, 1, 1) - print("read data lis2dh12 who_am_i reg 0x{0:02x}".format(list(r_data)[0])) - # 读写寄存器 - LIS2DH12_CTRL_REG2 = 0x21 # - w_data = [0x04] # 想要写的数据 - print("write 0x04 to 0x21") - i2c_dev.write(addres, bytearray(LIS2DH12_CTRL_REG2), 1, - bytearray(w_data), len(w_data)) - i2c_dev.read(addres, bytearray(LIS2DH12_CTRL_REG2), 1, - r_data, 1, 1) - print("read 0x{0:02x} from 0x{1:02x}".format( - list(r_data)[0], LIS2DH12_CTRL_REG2)) - print("test_i2c funcation has exited") - pass - - -if __name__ == "__main__": - test_i2c() diff --git a/docs/little_demo/zh/QuecPythonTest/code/i2c_lis2dh12.py b/docs/little_demo/zh/QuecPythonTest/code/i2c_lis2dh12.py deleted file mode 100644 index 6387e81ae66cf8dc12ecaf74433201ed58d80782..0000000000000000000000000000000000000000 --- a/docs/little_demo/zh/QuecPythonTest/code/i2c_lis2dh12.py +++ /dev/null @@ -1,194 +0,0 @@ -''' -File: i2c_lis2dh12.py -Project: i2c -File Created: Monday, 4th January 2021 8:04:35 pm -Author: chengzhu.zhou ------ -Last Modified: Tuesday, 5th January 2021 8:27:48 pm -Modified By: chengzhu.zhou ------ -Copyright 2021 - 2021 quectel -''' -import utime as time -import _thread -import log -from machine import I2C -from machine import Pin -import ustruct as struct - -# 参考文档 -# http://qpy.quectel.com/wiki/#/zh-cn/api/?id=i2c -# http://qpy.quectel.com/wiki/#/zh-cn/api/?id=extint -# https://www.st.com/resource/en/datasheet/lis2dh12.pdf - -# 寄存器地址 -LIS2DH12_OUT_X_L = 0x28 -LIS2DH12_OUT_X_H = 0x29 -LIS2DH12_OUT_Y_L = 0x2A -LIS2DH12_OUT_Y_H = 0x2B -LIS2DH12_OUT_Z_L = 0x2C -LIS2DH12_OUT_Z_H = 0x2D -LIS2DH12_FIFO_CTRL_REG = 0x2E - -# 控制寄存器 -LIS2DH12_CTRL_REG1 = 0x20 -LIS2DH12_CTRL_REG2 = 0x21 -LIS2DH12_CTRL_REG3 = 0x22 -LIS2DH12_CTRL_REG4 = 0x23 -LIS2DH12_CTRL_REG5 = 0x24 -LIS2DH12_CTRL_REG6 = 0x25 -LIS2DH12_REFERENCE_REG = 0x26 -LIS2DH12_STATUS_REG = 0x27 - -# 状态寄存器 -LIS2DH12_STATUS_REG_AUX = 0x7 - -# 中断寄存器 -LIS2DH12_INT1_CFG = 0x30 -LIS2DH12_INT1_SRC = 0x31 -LIS2DH12_INT1_THS = 0x32 -LIS2DH12_INT1_DURATION = 0x33 - -# 身份寄存器 -LIS2DH12_WHO_AM_I = 0x0F - -# 单击有关的寄存器 -LIS2DH12_CLICK_CFG = 0x38 -LIS2DH12_CLICK_SRC = 0x39 -LIS2DH12_CLICK_THS = 0x3A -LIS2DH12_TIME_LIMIT = 0x3B -LIS2DH12_TIME_LATENCY = 0x3C - -""" -EC600SCN平台引脚对应关系如下(引脚号为模块外部引脚编号): -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 -""" - -# 将其和外部的中断引脚绑定到一起。 - - -class lis2dh12(): - i2c_dev = None - address = None - int_pin = None - dev_log = None - - def init(self, slave_address): - self.dev_log = log.getLogger("I2C") - self.address = slave_address - self.i2c_dev = I2C(I2C.I2C1, I2C.STANDARD_MODE) - self.int_pin = Pin(Pin.GPIO3, Pin.IN, Pin.PULL_PU, 0) - self.sensor_init() - # 配置单击检测 - self.Single_tap_enable() - self.start_sensor() - pass - - def read_data(self, regaddr, datalen, debug=True): - r_data = [0x00 for i in range(datalen)] - r_data = bytearray(r_data) - reg_addres = bytearray([regaddr]) - self.i2c_dev.read(self.address, - reg_addres, 1, r_data, datalen, 1) - ret_data = list(r_data) - if debug is True: - self.dev_log.debug( - " read 0x{0:02x} from 0x{1:02x}".format(ret_data[0], regaddr)) - return ret_data - - def write_data(self, regaddr, data, debug=True): - w_data = bytearray([regaddr, data]) - # 临时将需要传送的地址放在数据位 - self.i2c_dev.write(self.address, bytearray(0x00), 0, - bytearray(w_data), len(w_data)) - if debug is True: - self.dev_log.debug( - " write 0x{0:02x} to 0x{1:02x}".format(data, regaddr)) - - def sensor_reset(self): - self.dev_log.debug("Sensor restart Ing") - # 重置chip - self.write_data(LIS2DH12_CTRL_REG5, 0x80) - time.sleep_ms(100) - r_data = self.read_data(LIS2DH12_WHO_AM_I, 1) - # 确定重启成功 - while r_data[0] != 0x33: - r_data = self.read_data(LIS2DH12_WHO_AM_I, 1) - time.sleep_ms(5) - self.dev_log.debug("Sensor restart successful") - pass - - def sensor_init(self): - # 1. 重置设备 - self.sensor_reset() - # 2. 初始化传感器 - self.write_data(LIS2DH12_CTRL_REG2, 0x04) # 使能高分辨率 - self.write_data(LIS2DH12_CTRL_REG3, 0x80) # 将中断引到INT1 引脚上面, 默认高电平有效 - self.write_data(LIS2DH12_CTRL_REG4, 0x08) # ±2g, High-resolution mode - - def Single_tap_enable(self): - # self.write_data(LIS2DH12_CLICK_CFG, 0x15) # 使能 XYZ 三轴单击中断, - self.write_data(LIS2DH12_CLICK_CFG, 0x10) # 使能 Z 轴单击中断, - self.write_data(LIS2DH12_CLICK_THS, 0x30) # 设置阈值 - self.write_data(LIS2DH12_TIME_LIMIT, 0x18) # 设置时间窗口限制 - self.write_data(LIS2DH12_TIME_LATENCY, 0x02) # 设置延时 - - def start_sensor(self): - self.write_data(LIS2DH12_CTRL_REG1, 0x77) # 设置ODR 400HZ ,enable XYZ. - # self.write_data(LIS2DH12_CTRL_REG1, 0x74) # 设置ODR ,enable Z轴. - time.sleep_ms(20) # (7/ODR) = 18ms - - # Xl,Xh,Yl,Yh,Zl,Zh - def ReadXYZ(self): - data = [] - for i in range(6): - r_data = self.read_data(LIS2DH12_OUT_X_L+i, 1) - data.append(r_data[0]) - return data - # 检测到上升沿了 - - def ProcessingData(self): - self.dev_log.debug("An interrupt has been detected") - data = self.ReadXYZ() - self.dev_log.info("xL:{0},xH:{1},yL:{2},yH:{3},zL:{4},zH:{5}".format( - data[0], data[1], data[2], data[3], data[4], data[5])) - self.dev_log.info("X:{0} Y:{1} Z:{2}".format( - data[0] & data[1], data[2] & data[3], data[4] & data[5])) - pass - - def run(self): - # 提示上下抬起开发板, 给传感器一个分量 - self.dev_log.info("Lift the development board up and down") - while True: - value = self.int_pin.read() - # 检测到中断信号了 - if value == 1: - self.ProcessingData() - - -def is2dh12_thread(delay, retryCount): - log.basicConfig(level=log.INFO) - # log.basicConfig(level=log.DEBUG) - dev = lis2dh12() - dev.init(0x19) - dev.run() - print("thread has exited") - - -if __name__ == "__main__": - # creat a thread Convert ADC to Voltage - _thread.start_new_thread(is2dh12_thread, (100, 100)) - print("creent main thread has exit") diff --git a/docs/little_demo/zh/QuecPythonTest/code/in_capture.py b/docs/little_demo/zh/QuecPythonTest/code/in_capture.py deleted file mode 100644 index b18639293affd3a85e7da50ffd8e9e8dae954f94..0000000000000000000000000000000000000000 --- a/docs/little_demo/zh/QuecPythonTest/code/in_capture.py +++ /dev/null @@ -1,71 +0,0 @@ -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 diff --git a/docs/little_demo/zh/QuecPythonTest/code/pwm_demo.py b/docs/little_demo/zh/QuecPythonTest/code/pwm_demo.py deleted file mode 100644 index e6cb58105bdc2ffc4502f2532360eb914db778cb..0000000000000000000000000000000000000000 --- a/docs/little_demo/zh/QuecPythonTest/code/pwm_demo.py +++ /dev/null @@ -1,48 +0,0 @@ -''' -File: pwm_demo.py -Project: pwm -File Created: Wednesday, 23rd December 2020 11:21:14 am -Author: chengzhu.zhou ------ -Last Modified: Tuesday, 29th December 2020 4:38:49 pm -Modified By: chengzhu.zhou ------ -Copyright 2020 - 2020 quectel -''' - - -from misc import PWM -import utime as time -""" -PWM号 -注:EC100YCN平台,支持PWM0-PWM5,对应引脚如下: -PWM0 – 引脚号19 -PWM1 – 引脚号18 -PWM2 – 引脚号16 -PWM3 – 引脚号17 -PWM4 – 引脚号23 -PWM5 – 引脚号22 -注:EC600SCN平台,支持PWM0-PWM5,对应引脚如下: -PWM0 – 引脚号52 -PWM1 – 引脚号53 -PWM2 – 引脚号57 -PWM3 – 引脚号56 -PWM4 – 引脚号70 -PWM5 – 引脚号69 -""" - - -def main(): - # config cysle 200ms , config high voltage 100ms , - # in other words , config duty cycle as %50 - pwm_obj = PWM(PWM.PWM0, PWM.ABOVE_MS, 100, 200) - # - pwm_obj.open() - time.sleep(10) - pwm_obj.close() - print("pwm Demo run successfully") - pass - - -if __name__ == "__main__": - main() diff --git a/docs/little_demo/zh/QuecPythonTest/code/timer.py b/docs/little_demo/zh/QuecPythonTest/code/timer.py deleted file mode 100644 index c4d7bc02529a7b45f999afc8130b1fdce0ef2717..0000000000000000000000000000000000000000 --- a/docs/little_demo/zh/QuecPythonTest/code/timer.py +++ /dev/null @@ -1,48 +0,0 @@ -''' -File: timer.py -Project: timer -File Created: Monday, 28th December 2020 2:44:33 pm -Author: chengzhu.zhou ------ -Last Modified: Friday, 8th January 2021 9:19:55 am -Modified By: chengzhu.zhou ------ -Copyright 2021 - 2021 quectel -''' - -# refs for http://qpy.quectel.com/wiki/#/zh-cn/api/?id=timer -from machine import Timer -import utime as time - - -# 创建一个执行函数,并将timer实例传入 -num = 0 -state = 1 - - -def CallBack(t): - global num - global state - print('num is %d' % num) - num += 1 - if num > 10: - print('num > 10, timer exit') - state = 0 - t.stop() - - -def main(): - # 创建一个定时器对象 - T = Timer(Timer.Timer1) - # 设置周期为1秒, - T.start(period=1000, mode=Timer.PERIODIC, callback=CallBack) # 启动定时器 - # wait - while state: - time.sleep_ms(1) - pass - T.stop() # 结束该定时器实例 - print("The main function has exited") - - -if __name__ == "__main__": - main() diff --git a/docs/little_demo/zh/QuecPythonTest/code/uart_demo1.py b/docs/little_demo/zh/QuecPythonTest/code/uart_demo1.py deleted file mode 100644 index 465c7a512849635a3903cb98f2505bb7678c85ea..0000000000000000000000000000000000000000 --- a/docs/little_demo/zh/QuecPythonTest/code/uart_demo1.py +++ /dev/null @@ -1,55 +0,0 @@ -''' -File: uart_demo1.py -Project: uart -File Created: Wednesday, 23rd December 2020 3:33:56 pm -Author: chengzhu.zhou ------ -Last Modified: Wednesday, 23rd December 2020 3:34:15 pm -Modified By: chengzhu.zhou ------ -Copyright 2020 - 2020 quectel -''' - -from machine import UART -import utime as time -""" -端口号 -EC100YCN平台与EC600SCN平台,UARTn作用如下: -UART0 - DEBUG PORT -UART1 – BT PORT -UART2 – MAIN PORT -UART3 – USB CDC PORT -""" - - -def main(): - """ - config uart Baud rate as 115200,data bits as 8bit, Do not use parity, - Stop bit as 0bit,Do not use Flow control, - UART(UART.UARTn, buadrate, databits, parity, stopbits, flowctl) - """ - uart = UART(UART.UART2, 115200, 8, 0, 1, 0) - # write string - delay = 100 - for i in range(2): - # write string - uart.write("hello world\r\n") - # write string and & integer - uart.write("delay num as {0}ms\r\n".format(delay)) - # write float - uart.write("π as {0}\r\n".format(3.14159)) - # read something - read_btyes = 6 - uart.write("please input {0} bytes:\r\n".format(read_btyes)) - while True: - if uart.any() > read_btyes: - break - else: - time.sleep_ms(10) - # !!! Before reading buffer, please make sure there is data in buffer - input_date = uart.read(read_btyes) - uart.write("The data you entered is {0}\r\n".format(input_date)) - time.sleep_ms(delay) - -if __name__ == "__main__": - main() diff --git a/docs/little_demo/zh/QuecPythonTest/ebf_smd4805.md b/docs/little_demo/zh/QuecPythonTest/ebf_smd4805.md deleted file mode 100644 index 4d2c16ad7d94775e570c7f9bd4501c327d866437..0000000000000000000000000000000000000000 --- a/docs/little_demo/zh/QuecPythonTest/ebf_smd4805.md +++ /dev/null @@ -1,227 +0,0 @@ -## 步进电机驱动实验 - -本片文章主要描述使用 EC600S 来驱动野火家的步进电机控制器,从而驱动步进电机。 - -### 使用说明 - -#### 硬件说明 - -本次实验使用到了下面两个外部模块 - -(1)EBF_MSD4805 步进电机控制器 - -(2)42 步进电机 - -购买地址为野火家的淘宝店: [https://item.taobao.com/item.htm?ft=t&id=543053172983 ](https://item.taobao.com/item.htm?ft=t&id=543053172983) - -![Quectel-QuecPythonPwm步进电机小实验_01](media/Quectel-QuecPythonPwm步进电机小实验_01.png) - -![Quectel-QuecPythonPwm步进电机小实验_02](media/Quectel-QuecPythonPwm步进电机小实验_02.png) - - - -#### 驱动说明 - -野火家的这款电机驱动器只需要控制三个引脚,就可以驱动电机了。 - -(1)控制方向引脚,确定顺时针或者是逆时针。 - -(2)控制 pul 脉冲引脚, 给控制器脉冲。 - -(3)控制使能引脚, 使能驱动器驱动电机。 - - - -### 实验步骤 - -#### 实验准备 - -(1)一台直流电源可以输 出 12V~48V 的直流电。 - -(2)一个 EBF_MSD4805 的步进电机控制器。 - -(3)一个 42 步进电机。 - -参考 EBF_MSD4805 的开发手册,使用共阳极的连接方式。 - -![Quectel-QuecPythonPwm步进电机小实验_03](media/Quectel-QuecPythonPwm步进电机小实验_03.png) - - - -#### 引脚连接 - -![Quectel-QuecPythonPwm步进电机小实验_04](media/Quectel-QuecPythonPwm步进电机小实验_04.png) - -| 电机驱动器 | EC600S 开发板 | 对应的函数标号 | -| -------------- | -------------------- | -------------- | -| ENA (GPIO) | GPIO81 (引脚号16) | GPIO7 | -| DIR (GPIO) | GPIO77 (引脚号15) | GPIO6 | -| PUL (PWM) | GPIO2_1V8 (引脚号70) | PWM2 | -| ENA+ DIR+ PUL+ | 1V8 (电源) | 无 | - - - -驱动器和电机连接方式 - -![Quectel-QuecPythonPwm步进电机小实验_05](media/Quectel-QuecPythonPwm步进电机小实验_05.png) - -(1)连接好 24V 电源。 - -(2)将驱动器 和 步进电机连接好。 - -(3)将驱动器和 EC600S 开发板连接好。 - - - -### 实验代码 - -```python -''' -File: EBF_SMD4805.py -Project: others -File Created: Wednesday, 6th January 2021 2:16:52 pm -Author: chengzhu.zhou ------ -Last Modified: Wednesday, 6th January 2021 2:56:42 pm -Modified By: chengzhu.zhou ------ -Copyright 2021 - 2021 quectel -''' - -""" -参考资料 -1. API -https://python.quectel.com/wiki/#/zh-cn/api/?id=pwm -https://python.quectel.com/wiki/#/zh-cn/api/?id=pin -2. 模块资料 -https://item.taobao.com/item.htm?ft=t&id=543053172983 -步进电机驱动器 + 42步进电机 -2.1 模块开发资料 -https://ebf-products.readthedocs.io/zh_CN/latest/module/motor/ebf-msd4805.html -""" - -""" -引脚连接 -| 电机 | EC600开发板 | 对应的函数标号 | -| ---------- | ------------------ | ------- | -| ENA- (GPIO) | GPIO81 (引脚号16) | GPIO7 | -| DIR- (GPIO) | GPIO77 (引脚号15) | GPIO6 | -| PUL- (PWM) | GPIO2_1V8 (引脚号70) | PWM2 | -| ENA+ DIR+ PUL+ | 1V8(电源) | 无 | -""" - -from misc import PWM -from machine import Pin -import utime as time -import urandom as random -import log -def delay_500us(): - for i in range(600): - pass - -def delay_250us(): - for i in range(310): - pass - -ENABLE_MOTOR = 0x1 -DISABLE_MOTOR = 0x0 - -DIR_CLOCKWISE = 0x1 -DIR_ANTI_CLOCKWISE = 0x0 - - -class ebf_smd4805(): - dev_log = None - - # 步进电机的参数 - sm_para_step = None # 步进角度 - # 控制器的参数 - env_pin = None # 使能引脚 - dir_pin = None # 方向引脚 - pul_pwm = None # 脉冲输出引脚 - ctrl_divstep = None # 细分参数,具体请参考控制器手册 - - def init(self, step, divstep): - self.dev_log = log.getLogger("ebf_smd4805") - self.env_pin = Pin(Pin.GPIO7, Pin.OUT, Pin.PULL_DISABLE, 0) - self.dir_pin = Pin(Pin.GPIO6, Pin.OUT, Pin.PULL_DISABLE, 0) - # 配置电机的参数 - self.sm_para_step = step - # 配置控制器的参数 - self.ctrl_divstep = divstep - - def reset(self): - self.env_pin.write(DISABLE_MOTOR) - self.dir_pin.write(DIR_ANTI_CLOCKWISE) - if self.pul_pwm is not None: - self.pul_pwm.close() - - # 根据频率 初始化PWM - def outputpwm(self, HZ, duty_cycle): - # 将HZ 转化为 us 级别 - cycleTime = int(1000000/HZ) - highTime = int(cycleTime * duty_cycle) - return highTime, cycleTime - - # 根据速度,设置PWM的输出 - def enable_pwm(self, speed): - # 1. 首先根据步进电机的步进角度,计算旋转一圈需要多少个脉冲 - Count_pulse = int(360/self.sm_para_step) - self.dev_log.debug("sm motor step as {0}".format(Count_pulse)) - # 2. 根据控制器的细分参数,计算控制器控制步进电机旋转一圈,需要多少的脉冲 - Count_pulse = int(Count_pulse * self.ctrl_divstep) - # 3. 最后计算出1秒旋转speed圈,需要多少个脉冲 , 换句话说 就是频率 - Count_pulse = int(Count_pulse * speed) - # 4. 初始化PWM, 默认占空比%50 - highTime, cycleTime = self.outputpwm(Count_pulse, 0.1) - self.dev_log.debug( - """config frequency is {0}HZ,cycleTime {1}us, hightime {2}us""" - .format(Count_pulse, cycleTime, highTime)) - self.pul_pwm = PWM(PWM.PWM2, PWM.ABOVE_10US, - int(highTime), int(cycleTime)) - self.pul_pwm.open() - pass - - def disable_pwm(self): - self.pul_pwm.close() - pass - - # speed 为速度, 每秒多少圈 - # Duration 为持续时间, ms - # dir 表示方向 - def run(self, speed, Duration, dir=DIR_CLOCKWISE): - self.dir_pin.write(dir) - self.dev_log.info( - "Configure the motor to rotate {0} revolutions per second".format(speed)) - self.enable_pwm(speed) - self.env_pin.write(1) - # delay - for i in range(int(Duration * 4)): - delay_250us() - self.env_pin.write(0) - - self.reset() - pass - - -def test_ebf_smd4805(): - log.basicConfig(level=log.DEBUG) - # log.basicConfig(level=log.INFO) - ebf_smd4805_dev = ebf_smd4805() - ebf_smd4805_dev.init(step=1.8, divstep=2) - for i in range(2, 10): - ebf_smd4805_dev.run(i, Duration=1000, dir=DIR_CLOCKWISE) - print("test_ebf_smd4805 Function exit,!!!") - pass - - -if __name__ == "__main__": - # creat a thread Check key status - test_ebf_smd4805() - -``` - -### 配套代码 - - - 下载代码 \ No newline at end of file diff --git a/docs/little_demo/zh/QuecPythonTest/i2c_aht.md b/docs/little_demo/zh/QuecPythonTest/i2c_aht.md deleted file mode 100644 index 70717ea85b7a1a922e0342a276de753b6cd62a49..0000000000000000000000000000000000000000 --- a/docs/little_demo/zh/QuecPythonTest/i2c_aht.md +++ /dev/null @@ -1,245 +0,0 @@ -## 内部温湿度传感器实验 - -本片文章主要基于 EC600S 板载温湿度传感器AHT10,做一个温湿度检测的小实验。 - -### 硬件资源 - -![](media/8c3561c7648bc9b8d7f6625c812f9897.png) - -AHT10是一款高精度,完全校准,贴片封装的温湿度传感器,MEMS的制作工艺,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电容式感湿元件和一个高性能CMOS微处理器相连接。该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。具体可以参考[aht10产品手册 a220201221.pdf](http://www.aosong.com/userfiles/files/media/AHT10%E4%BA%A7%E5%93%81%E6%89%8B%E5%86%8C%20A2%2020201221.pdf)。 - -AHT10 通过I2C 接口通讯。按照说明书的简介。只需要按照下面的方式,发送数据就可以获取数据了。 - -1. 上电等待校准数据。 发送 0xE1 0x08 0x00 。 (只需要校准一次就可以) - -2. 触发测量,发送 0xAC, 0x33, 0x00 . 即可。 - -3. 读取数据, 等待70ms 转换。 读取6字节即可。 - -![](media/dc7f7f722e57250c9c4b1e0d5b1256bb.png) - -查看原理图和数据手册 可以确定从机地址为 0x38 - -### 实验记录 - -由于是板载的模块,不需要其他外部模块。 - -### 实验设计 - -1. 初始化AHT10 传感器 -2. 触发测量 -3. 延时70ms -4. 读取数据 -5. 转换温湿度 -6. 持续第2步 - -### 实验代码 - -```python -''' - -File: i2c_aht10.py - -Project: i2c - -File Created: Monday, 28th December 2020 5:17:28 pm - -Author: chengzhu.zhou - ------ - -Last Modified: Tuesday, 29th December 2020 9:01:35 pm - -Modified By: chengzhu.zhou - ------ - -Copyright 2020 - 2020 quectel - -''' - -import log - -from machine import I2C - -import utime as time - -""" - -1. calibration - -2. Trigger measurement - -3. read data - -""" - -# API 手册 http://qpy.quectel.com/wiki/#/zh-cn/api/?id=i2c - -# AHT10 说明书 - -# https://server4.eca.ir/eshop/AHT10/Aosong_AHT10_en_draft_0c.pdf - - - -class aht10class(): - - i2c_log = None - - i2c_dev = None - - i2c_addre = None - - - - # Initialization command - - AHT10_CALIBRATION_CMD = 0xE1 - - # Trigger measurement - - AHT10_START_MEASURMENT_CMD = 0xAC - - # reset - - AHT10_RESET_CMD = 0xBA - - - - def write_data(self, data): - - self.i2c_dev.write(self.i2c_addre, - - bytearray(0x00), 0, - - bytearray(data), len(data)) - - pass - - - -def read_data(self, length): - - r_data = [0x00 for i in range(length)] - - r_data = bytearray(r_data) - - self.i2c_dev.read(self.i2c_addre, - - bytearray(0x00), 0, - - r_data, length,0) - - return list(r_data) - - - -def aht10_init(self, addre=0x38, Alise="Ath10"): - - self.i2c_log = log.getLogger(Alise) - - self.i2c_dev = I2C(I2C.I2C1, I2C.STANDARD_MODE) # 返回i2c对象 - - self.i2c_addre = addre - - self.sensor_init() - - pass - - - -def aht10_transformation_temperature(self, data): - - r_data = data - - # 根据数据手册的描述来转化温度 - - humidity = (r_data[0] << 12) | ( - - r_data[1] << 4) | ((r_data[2] & 0xF0) >> 4) - - humidity = (humidity/(1 << 20)) * 100.0 - - print("current humidity is {0}%".format(humidity)) - - temperature = ((r_data[2] & 0xf) << 16) | ( - - r_data[3] << 8) | r_data[4] - - temperature = (temperature * 200.0 / (1 << 20)) - 50 - - print("current temperature is {0}°C".format(temperature)) - - - -def sensor_init(self): - - # calibration - - self.write_data([self.AHT10_CALIBRATION_CMD, 0x08, 0x00]) - - time.sleep_ms(300) # at last 300ms - - pass - - - -def ath10_reset(self): - - self.write_data([self.AHT10_RESET_CMD]) - - time.sleep_ms(20) # at last 20ms - - - -def Trigger_measurement(self): - - # Trigger data conversion - - self.write_data([self.AHT10_START_MEASURMENT_CMD, 0x33, 0x00]) - - time.sleep_ms(200) # at last delay 75ms - - # check has success - - r_data = self.read_data(6) - - # check bit7 - - if (r_data[0] >> 7) != 0x0: - - print("Conversion has error") - - else: - - self.aht10_transformation_temperature(r_data[1:6]) - - - -def i2c_aht10_test(): - - ath_dev = aht10class() - - ath_dev.aht10_init() - - - - # 测试十次 - - for i in range(10): - - ath_dev.Trigger_measurement() - - time.sleep(1) - - - -if __name__ == "__main__": - - i2c_aht10_test() -``` - -### 配套代码 - - - 下载代码 \ No newline at end of file diff --git a/docs/little_demo/zh/QuecPythonTest/i2c_lis2dh.md b/docs/little_demo/zh/QuecPythonTest/i2c_lis2dh.md deleted file mode 100644 index 371bd61090096e0a5455c53ff59b46a098eee71f..0000000000000000000000000000000000000000 --- a/docs/little_demo/zh/QuecPythonTest/i2c_lis2dh.md +++ /dev/null @@ -1,440 +0,0 @@ -## 加速度传感器实验 - -本片文章主要基于 EC600S 板载 三轴加速度传感器LIS2DH12TR,做一个检测加速度的小实验。 - -### 硬件资源 - -![](media/7b300525f8aad8fbb7fb7d387a753108.png) - -LIS2DH12 是属于“nano”系列的超低功耗高性能 3 轴线性加速度计,具有数字 I2C、SPI串行接口标准输出。 器件具有超低功耗工作模式,可实现高级节能、智能 -睡眠唤醒以及恢复睡眠功能。 LIS2DH12 具有 ±2g/±4g/±8g/±16g 的动态用户可选满量程,并能通过 1 Hz 到 5 kHz 的输出数据速率测 量加速度。器件可配置为通过独立的惯性唤醒 / 自由落体事件以及通过器件自身的位置生成中断信号。中断发生器的阈值 和时序可由终端用户动态设定。 - -LIS2DH12 通过I2C 接口通讯。查看说明书和原理图。 - -![](media/ccbc03bb239949f8cf13ede7afae51e9.png) - -可以发现SD0/SA0 引脚高电平。 因此可以确认加速度传感器的从机地址为0x19。 - -#### LIS2SH12 单击中断使用步骤 - -LIS2DH12 支持的功能: - -1. 单双击检测 - -2. 自由落体检测 - -3. 倾斜角测量 - -4. 切换横屏/竖屏模式 - -我们使用其单击检测功能,出现单击事件,将其映射到INT1 引脚上面,其处理逻辑大致如下: - -![](media/0a345e4bc4142f0f7fe856cc7645519a.png) - -**LIS2SH12 初始化** - -1. 设置 CTRL_REG2 寄存器,开启高通滤波。 -2. 设置 CTRL_REG3 ,将中断引到INT1 引脚上面。 -3. 设置 CTRL_REG4 ,配置Full-scale selection - -**配置单击中断** - -1. 配置CLICK_CFG寄存器,使能需要检测的感应轴,X,Y,Z -2. 配置CLICK_THS 设置阈值 -3. 配置TIME_LIMIT 设置窗口限制 -4. 配置TIME_LATENCY 设置延时 - -**LIS2SH12 使能传感器** - -1. 配置CTRL_REG1 开始使能传感器。 - -### 实验步骤 - -#### 实验设计 - -1. 使用LIS2DH12 传感器的 INT1 引脚产生中断。 -2. 轮询此引脚的状态,检测到上升沿以后, 表示中断产生,处理中断。 -3. 在中断函数里面读取三轴的状态。 - -#### 实验代码 - -``` -''' - -File: i2c_lis2dh12.py - -Project: i2c - -File Created: Monday, 4th January 2021 8:04:35 pm - -Author: chengzhu.zhou - ------ - -Last Modified: Tuesday, 5th January 2021 8:27:48 pm - -Modified By: chengzhu.zhou - ------ - -Copyright 2021 - 2021 quectel - -''' - -import utime as time - -import _thread - -import log - -from machine import I2C - -from machine import Pin - -import ustruct as struct - - - -# 参考文档 - -# http://qpy.quectel.com/wiki/#/zh-cn/api/?id=i2c - -# http://qpy.quectel.com/wiki/#/zh-cn/api/?id=extint - -# https://www.st.com/resource/en/datasheet/lis2dh12.pdf - - - -# 寄存器地址 - -LIS2DH12_OUT_X_L = 0x28 - -LIS2DH12_OUT_X_H = 0x29 - -LIS2DH12_OUT_Y_L = 0x2A - -LIS2DH12_OUT_Y_H = 0x2B - -LIS2DH12_OUT_Z_L = 0x2C - -LIS2DH12_OUT_Z_H = 0x2D - -LIS2DH12_FIFO_CTRL_REG = 0x2E - - - -# 控制寄存器 - -LIS2DH12_CTRL_REG1 = 0x20 - -LIS2DH12_CTRL_REG2 = 0x21 - -LIS2DH12_CTRL_REG3 = 0x22 - -LIS2DH12_CTRL_REG4 = 0x23 - -LIS2DH12_CTRL_REG5 = 0x24 - -LIS2DH12_CTRL_REG6 = 0x25 - -LIS2DH12_REFERENCE_REG = 0x26 - -LIS2DH12_STATUS_REG = 0x27 - - - -# 状态寄存器 - -LIS2DH12_STATUS_REG_AUX = 0x7 - - - -# 中断寄存器 - -LIS2DH12_INT1_CFG = 0x30 - -LIS2DH12_INT1_SRC = 0x31 - -LIS2DH12_INT1_THS = 0x32 - -LIS2DH12_INT1_DURATION = 0x33 - - - -# 身份寄存器 - -LIS2DH12_WHO_AM_I = 0x0F - - - -# 单击有关的寄存器 - -LIS2DH12_CLICK_CFG = 0x38 - -LIS2DH12_CLICK_SRC = 0x39 - -LIS2DH12_CLICK_THS = 0x3A - -LIS2DH12_TIME_LIMIT = 0x3B - -LIS2DH12_TIME_LATENCY = 0x3C - -""" - -EC600SCN平台引脚对应关系如下(引脚号为模块外部引脚编号): - -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 - -""" - -# 将其和外部的中断引脚绑定到一起。 - - - -class lis2dh12(): - - i2c_dev = None - - address = None - - int_pin = None - - dev_log = None - - def init(self, slave_address): - - self.dev_log = log.getLogger("I2C") - - self.address = slave_address - - self.i2c_dev = I2C(I2C.I2C1, I2C.STANDARD_MODE) - - self.int_pin = Pin(Pin.GPIO3, Pin.IN, Pin.PULL_PU, 0) - - self.sensor_init() - - # 配置单击检测 - - self.Single_tap_enable() - - self.start_sensor() - - pass - -def read_data(self, regaddr, datalen, debug=True): - - r_data = [0x00 for i in range(datalen)] - - r_data = bytearray(r_data) - - reg_addres = bytearray([regaddr]) - - self.i2c_dev.read(self.address, - - reg_addres, 1, r_data, datalen, 1) - - ret_data = list(r_data) - - if debug is True: - - self.dev_log.debug( - - " read 0x{0:02x} from 0x{1:02x}".format(ret_data[0], regaddr)) - - return ret_data - - - -def write_data(self, regaddr, data, debug=True): - - w_data = bytearray([regaddr, data]) - - # 临时将需要传送的地址放在数据位 - - self.i2c_dev.write(self.address, bytearray(0x00), 0, - - bytearray(w_data), len(w_data)) - - if debug is True: - - self.dev_log.debug( - - " write 0x{0:02x} to 0x{1:02x}".format(data, regaddr)) - - - -def sensor_reset(self): - - self.dev_log.debug("Sensor restart Ing") - - # 重置chip - - self.write_data(LIS2DH12_CTRL_REG5, 0x80) - - time.sleep_ms(100) - - r_data = self.read_data(LIS2DH12_WHO_AM_I, 1) - - # 确定重启成功 - - while r_data[0] != 0x33: - - r_data = self.read_data(LIS2DH12_WHO_AM_I, 1) - - time.sleep_ms(5) - - self.dev_log.debug("Sensor restart successful") - - pass - - - -def sensor_init(self): - - # 1. 重置设备 - - self.sensor_reset() - - # 2. 初始化传感器 - - self.write_data(LIS2DH12_CTRL_REG2, 0x04) # 使能高分辨率 - - self.write_data(LIS2DH12_CTRL_REG3, 0x80) # 将中断引到INT1 引脚上面,默认高电平有效 - - self.write_data(LIS2DH12_CTRL_REG4, 0x08) # ±2g, High-resolution mode - - - -def Single_tap_enable(self): - - # self.write_data(LIS2DH12_CLICK_CFG, 0x15) # 使能 XYZ 三轴单击中断, - - self.write_data(LIS2DH12_CLICK_CFG, 0x10) # 使能 Z 轴单击中断, - - self.write_data(LIS2DH12_CLICK_THS, 0x30) # 设置阈值 - - self.write_data(LIS2DH12_TIME_LIMIT, 0x18) # 设置时间窗口限制 - - self.write_data(LIS2DH12_TIME_LATENCY, 0x02) # 设置延时 - - - -def start_sensor(self): - - self.write_data(LIS2DH12_CTRL_REG1, 0x77) # 设置ODR 400HZ ,enable XYZ. - - # self.write_data(LIS2DH12_CTRL_REG1, 0x74) # 设置ODR ,enable Z轴. - - time.sleep_ms(20) # (7/ODR) = 18ms - - - -# Xl,Xh,Yl,Yh,Zl,Zh - -def ReadXYZ(self): - - data = [] - - for i in range(6): - - r_data = self.read_data(LIS2DH12_OUT_X_L+i, 1) - - data.append(r_data[0]) - - return data - -# 检测到上升沿了 - - - -def ProcessingData(self): - - self.dev_log.debug("An interrupt has been detected") - - data = self.ReadXYZ() - - self.dev_log.info("xL:{0},xH:{1},yL:{2},yH:{3},zL:{4},zH:{5}".format( - - data[0], data[1], data[2], data[3], data[4], data[5])) - - self.dev_log.info("X:{0} Y:{1} Z:{2}".format( - - data[0] & data[1], data[2] & data[3], data[4] & data[5])) - - pass - - - -def run(self): - - # 提示上下抬起开发板, 给传感器一个分量 - - self.dev_log.info("Lift the development board up and down") - - while True: - - value = self.int_pin.read() - - # 检测到中断信号了 - - if value == 1: - - self.ProcessingData() - - - -def is2dh12_thread(delay, retryCount): - - log.basicConfig(level=log.INFO) - - # log.basicConfig(level=log.DEBUG) - - dev = lis2dh12() - - dev.init(0x19) - - dev.run() - - print("thread has exited") - - - -if __name__ == "__main__": - - # creat a thread Convert ADC to Voltage - - _thread.start_new_thread(is2dh12_thread, (100, 100)) - - print("creent main thread has exit") -``` - -### 配套代码 - - - 下载代码 \ No newline at end of file diff --git a/docs/little_demo/zh/QuecPythonTest/media/0a345e4bc4142f0f7fe856cc7645519a.png b/docs/little_demo/zh/QuecPythonTest/media/0a345e4bc4142f0f7fe856cc7645519a.png deleted file mode 100644 index 4b935988f84fc8d09cb04f16d78a8f53013430ac..0000000000000000000000000000000000000000 Binary files a/docs/little_demo/zh/QuecPythonTest/media/0a345e4bc4142f0f7fe856cc7645519a.png and /dev/null differ diff --git a/docs/little_demo/zh/QuecPythonTest/media/20210115095814.png b/docs/little_demo/zh/QuecPythonTest/media/20210115095814.png deleted file mode 100644 index 47b616ba83e90624bd548fe13a49b2e9d796b928..0000000000000000000000000000000000000000 Binary files a/docs/little_demo/zh/QuecPythonTest/media/20210115095814.png and /dev/null differ diff --git a/docs/little_demo/zh/QuecPythonTest/media/31bd655eba27dc3311e3c628e942f1bb.jpg b/docs/little_demo/zh/QuecPythonTest/media/31bd655eba27dc3311e3c628e942f1bb.jpg deleted file mode 100644 index 0cf3eec3ef0a9034c939a34885b6b74f67dc27de..0000000000000000000000000000000000000000 Binary files a/docs/little_demo/zh/QuecPythonTest/media/31bd655eba27dc3311e3c628e942f1bb.jpg and /dev/null differ diff --git a/docs/little_demo/zh/QuecPythonTest/media/3500f8868c71d63ff9da393a10cbe747.jpg b/docs/little_demo/zh/QuecPythonTest/media/3500f8868c71d63ff9da393a10cbe747.jpg deleted file mode 100644 index a3f74b4eb9f4137fa1e5aa487ac11f004b72df87..0000000000000000000000000000000000000000 Binary files a/docs/little_demo/zh/QuecPythonTest/media/3500f8868c71d63ff9da393a10cbe747.jpg and /dev/null differ diff --git a/docs/little_demo/zh/QuecPythonTest/media/357a598b34f88d768af40348b0f25494.jpg b/docs/little_demo/zh/QuecPythonTest/media/357a598b34f88d768af40348b0f25494.jpg deleted file mode 100644 index 207c538473aace9546e0bf27f039f45559081fe2..0000000000000000000000000000000000000000 Binary files a/docs/little_demo/zh/QuecPythonTest/media/357a598b34f88d768af40348b0f25494.jpg and /dev/null differ diff --git a/docs/little_demo/zh/QuecPythonTest/media/466a7209f9edc319f3ef2f6f9786ba0c.jpg b/docs/little_demo/zh/QuecPythonTest/media/466a7209f9edc319f3ef2f6f9786ba0c.jpg deleted file mode 100644 index d859b6948d85a42aaa5400832aab2f03812a2ead..0000000000000000000000000000000000000000 Binary files a/docs/little_demo/zh/QuecPythonTest/media/466a7209f9edc319f3ef2f6f9786ba0c.jpg and /dev/null differ diff --git a/docs/little_demo/zh/QuecPythonTest/media/5c98f65b95739edcac696e1352614f0a.jpg b/docs/little_demo/zh/QuecPythonTest/media/5c98f65b95739edcac696e1352614f0a.jpg deleted file mode 100644 index 3d5bad6541e69072942a7436a81f599c3f7d1f45..0000000000000000000000000000000000000000 Binary files a/docs/little_demo/zh/QuecPythonTest/media/5c98f65b95739edcac696e1352614f0a.jpg and /dev/null differ diff --git a/docs/little_demo/zh/QuecPythonTest/media/7b300525f8aad8fbb7fb7d387a753108.png b/docs/little_demo/zh/QuecPythonTest/media/7b300525f8aad8fbb7fb7d387a753108.png deleted file mode 100644 index 2ba09fb8acb59b10598b25c4e33b02b1a70cf931..0000000000000000000000000000000000000000 Binary files a/docs/little_demo/zh/QuecPythonTest/media/7b300525f8aad8fbb7fb7d387a753108.png and /dev/null differ diff --git a/docs/little_demo/zh/QuecPythonTest/media/834b6f2ab93d7439d2a3b871e9fc1e3b.jpg b/docs/little_demo/zh/QuecPythonTest/media/834b6f2ab93d7439d2a3b871e9fc1e3b.jpg deleted file mode 100644 index cbd5ef11de0bcdf98f44f0b577bbe2818557879f..0000000000000000000000000000000000000000 Binary files a/docs/little_demo/zh/QuecPythonTest/media/834b6f2ab93d7439d2a3b871e9fc1e3b.jpg and /dev/null differ diff --git a/docs/little_demo/zh/QuecPythonTest/media/8aab25aa717d0a0be57094d08fc53b28.png b/docs/little_demo/zh/QuecPythonTest/media/8aab25aa717d0a0be57094d08fc53b28.png deleted file mode 100644 index 1d3ca5f9f0d0bcd199876acf71d24b444e65f461..0000000000000000000000000000000000000000 Binary files a/docs/little_demo/zh/QuecPythonTest/media/8aab25aa717d0a0be57094d08fc53b28.png and /dev/null differ diff --git a/docs/little_demo/zh/QuecPythonTest/media/8c3561c7648bc9b8d7f6625c812f9897.png b/docs/little_demo/zh/QuecPythonTest/media/8c3561c7648bc9b8d7f6625c812f9897.png deleted file mode 100644 index c30d0412462ed18a0b01e53a16469760bf467fb8..0000000000000000000000000000000000000000 Binary files a/docs/little_demo/zh/QuecPythonTest/media/8c3561c7648bc9b8d7f6625c812f9897.png and /dev/null differ diff --git a/docs/little_demo/zh/QuecPythonTest/media/QuecPython_little_demo_buzzer01.png b/docs/little_demo/zh/QuecPythonTest/media/QuecPython_little_demo_buzzer01.png deleted file mode 100644 index e4546daabdc18b88a1e3b2243f68044b7a680661..0000000000000000000000000000000000000000 Binary files a/docs/little_demo/zh/QuecPythonTest/media/QuecPython_little_demo_buzzer01.png and /dev/null differ diff --git "a/docs/little_demo/zh/QuecPythonTest/media/Quectel-QuecPythonPwm\346\255\245\350\277\233\347\224\265\346\234\272\345\260\217\345\256\236\351\252\214_01.png" "b/docs/little_demo/zh/QuecPythonTest/media/Quectel-QuecPythonPwm\346\255\245\350\277\233\347\224\265\346\234\272\345\260\217\345\256\236\351\252\214_01.png" deleted file mode 100644 index 6eae458454ced48c9a5a8001da86f9dff28be725..0000000000000000000000000000000000000000 Binary files "a/docs/little_demo/zh/QuecPythonTest/media/Quectel-QuecPythonPwm\346\255\245\350\277\233\347\224\265\346\234\272\345\260\217\345\256\236\351\252\214_01.png" and /dev/null differ diff --git "a/docs/little_demo/zh/QuecPythonTest/media/Quectel-QuecPythonPwm\346\255\245\350\277\233\347\224\265\346\234\272\345\260\217\345\256\236\351\252\214_02.png" "b/docs/little_demo/zh/QuecPythonTest/media/Quectel-QuecPythonPwm\346\255\245\350\277\233\347\224\265\346\234\272\345\260\217\345\256\236\351\252\214_02.png" deleted file mode 100644 index fc2ee865675cfcf65a202833da2bab33e726a485..0000000000000000000000000000000000000000 Binary files "a/docs/little_demo/zh/QuecPythonTest/media/Quectel-QuecPythonPwm\346\255\245\350\277\233\347\224\265\346\234\272\345\260\217\345\256\236\351\252\214_02.png" and /dev/null differ diff --git "a/docs/little_demo/zh/QuecPythonTest/media/Quectel-QuecPythonPwm\346\255\245\350\277\233\347\224\265\346\234\272\345\260\217\345\256\236\351\252\214_03.png" "b/docs/little_demo/zh/QuecPythonTest/media/Quectel-QuecPythonPwm\346\255\245\350\277\233\347\224\265\346\234\272\345\260\217\345\256\236\351\252\214_03.png" deleted file mode 100644 index d9be4eb7b1bc44780017f01ef355d5e96bbc1fce..0000000000000000000000000000000000000000 Binary files "a/docs/little_demo/zh/QuecPythonTest/media/Quectel-QuecPythonPwm\346\255\245\350\277\233\347\224\265\346\234\272\345\260\217\345\256\236\351\252\214_03.png" and /dev/null differ diff --git "a/docs/little_demo/zh/QuecPythonTest/media/Quectel-QuecPythonPwm\346\255\245\350\277\233\347\224\265\346\234\272\345\260\217\345\256\236\351\252\214_04.png" "b/docs/little_demo/zh/QuecPythonTest/media/Quectel-QuecPythonPwm\346\255\245\350\277\233\347\224\265\346\234\272\345\260\217\345\256\236\351\252\214_04.png" deleted file mode 100644 index 901bdbc8e7e50a265d725ade564fb6a0706e5835..0000000000000000000000000000000000000000 Binary files "a/docs/little_demo/zh/QuecPythonTest/media/Quectel-QuecPythonPwm\346\255\245\350\277\233\347\224\265\346\234\272\345\260\217\345\256\236\351\252\214_04.png" and /dev/null differ diff --git "a/docs/little_demo/zh/QuecPythonTest/media/Quectel-QuecPythonPwm\346\255\245\350\277\233\347\224\265\346\234\272\345\260\217\345\256\236\351\252\214_05.png" "b/docs/little_demo/zh/QuecPythonTest/media/Quectel-QuecPythonPwm\346\255\245\350\277\233\347\224\265\346\234\272\345\260\217\345\256\236\351\252\214_05.png" deleted file mode 100644 index ecb09ae193b094b63ad6967e168193485ff00948..0000000000000000000000000000000000000000 Binary files "a/docs/little_demo/zh/QuecPythonTest/media/Quectel-QuecPythonPwm\346\255\245\350\277\233\347\224\265\346\234\272\345\260\217\345\256\236\351\252\214_05.png" and /dev/null differ diff --git "a/docs/little_demo/zh/QuecPythonTest/media/Quectel-QuecPythonPwm\350\276\223\345\207\272\345\260\217\345\256\236\351\252\214_01.png" "b/docs/little_demo/zh/QuecPythonTest/media/Quectel-QuecPythonPwm\350\276\223\345\207\272\345\260\217\345\256\236\351\252\214_01.png" deleted file mode 100644 index 4ec9ee5c8d770f4aed9680d9ea5ec2f8c12e6e1c..0000000000000000000000000000000000000000 Binary files "a/docs/little_demo/zh/QuecPythonTest/media/Quectel-QuecPythonPwm\350\276\223\345\207\272\345\260\217\345\256\236\351\252\214_01.png" and /dev/null differ diff --git "a/docs/little_demo/zh/QuecPythonTest/media/Quectel-QuecPython\344\270\262\345\217\243\345\260\217\345\256\236\351\252\214_01.png" "b/docs/little_demo/zh/QuecPythonTest/media/Quectel-QuecPython\344\270\262\345\217\243\345\260\217\345\256\236\351\252\214_01.png" deleted file mode 100644 index bb1fc23f17754dd583394b62933a9d4b4fcef720..0000000000000000000000000000000000000000 Binary files "a/docs/little_demo/zh/QuecPythonTest/media/Quectel-QuecPython\344\270\262\345\217\243\345\260\217\345\256\236\351\252\214_01.png" and /dev/null differ diff --git "a/docs/little_demo/zh/QuecPythonTest/media/Quectel-QuecPython\346\214\211\351\224\256\350\276\223\345\205\245\345\260\217\345\256\236\351\252\214_01.png" "b/docs/little_demo/zh/QuecPythonTest/media/Quectel-QuecPython\346\214\211\351\224\256\350\276\223\345\205\245\345\260\217\345\256\236\351\252\214_01.png" deleted file mode 100644 index 0fb4b68fc5dc38ce2cc675dfd65c2b5ecb9a3517..0000000000000000000000000000000000000000 Binary files "a/docs/little_demo/zh/QuecPythonTest/media/Quectel-QuecPython\346\214\211\351\224\256\350\276\223\345\205\245\345\260\217\345\256\236\351\252\214_01.png" and /dev/null differ diff --git "a/docs/little_demo/zh/QuecPythonTest/media/Quectel-QuecPython\346\214\211\351\224\256\350\276\223\345\205\245\345\260\217\345\256\236\351\252\214_02.png" "b/docs/little_demo/zh/QuecPythonTest/media/Quectel-QuecPython\346\214\211\351\224\256\350\276\223\345\205\245\345\260\217\345\256\236\351\252\214_02.png" deleted file mode 100644 index 9edfb731e60fff7f3e89fc6927d4414a07b6c9bb..0000000000000000000000000000000000000000 Binary files "a/docs/little_demo/zh/QuecPythonTest/media/Quectel-QuecPython\346\214\211\351\224\256\350\276\223\345\205\245\345\260\217\345\256\236\351\252\214_02.png" and /dev/null differ diff --git "a/docs/little_demo/zh/QuecPythonTest/media/Quectel_QuecPython_\345\275\225\351\237\263\345\256\236\351\252\214\350\257\264\346\230\216_01.png" "b/docs/little_demo/zh/QuecPythonTest/media/Quectel_QuecPython_\345\275\225\351\237\263\345\256\236\351\252\214\350\257\264\346\230\216_01.png" deleted file mode 100644 index 4028a1700d8b89ea01e1f257f6eae5d1b3e4250c..0000000000000000000000000000000000000000 Binary files "a/docs/little_demo/zh/QuecPythonTest/media/Quectel_QuecPython_\345\275\225\351\237\263\345\256\236\351\252\214\350\257\264\346\230\216_01.png" and /dev/null differ diff --git "a/docs/little_demo/zh/QuecPythonTest/media/Quectel_QuecPython_\345\275\225\351\237\263\345\256\236\351\252\214\350\257\264\346\230\216_02.png" "b/docs/little_demo/zh/QuecPythonTest/media/Quectel_QuecPython_\345\275\225\351\237\263\345\256\236\351\252\214\350\257\264\346\230\216_02.png" deleted file mode 100644 index b94206b0591c318464b4f77cf5c2ba86ab514b35..0000000000000000000000000000000000000000 Binary files "a/docs/little_demo/zh/QuecPythonTest/media/Quectel_QuecPython_\345\275\225\351\237\263\345\256\236\351\252\214\350\257\264\346\230\216_02.png" and /dev/null differ diff --git "a/docs/little_demo/zh/QuecPythonTest/media/Quectel_QuecPython_\345\275\225\351\237\263\345\256\236\351\252\214\350\257\264\346\230\216_03.png" "b/docs/little_demo/zh/QuecPythonTest/media/Quectel_QuecPython_\345\275\225\351\237\263\345\256\236\351\252\214\350\257\264\346\230\216_03.png" deleted file mode 100644 index 487ab91c727ea1260204b8b792d060b572b2c2c9..0000000000000000000000000000000000000000 Binary files "a/docs/little_demo/zh/QuecPythonTest/media/Quectel_QuecPython_\345\275\225\351\237\263\345\256\236\351\252\214\350\257\264\346\230\216_03.png" and /dev/null differ diff --git a/docs/little_demo/zh/QuecPythonTest/media/b5ef6d654f81ae75d469cc32795760bc.jpg b/docs/little_demo/zh/QuecPythonTest/media/b5ef6d654f81ae75d469cc32795760bc.jpg deleted file mode 100644 index 8eb69d64f76ff2a5a8d39b835ea28e68859f131e..0000000000000000000000000000000000000000 Binary files a/docs/little_demo/zh/QuecPythonTest/media/b5ef6d654f81ae75d469cc32795760bc.jpg and /dev/null differ diff --git a/docs/little_demo/zh/QuecPythonTest/media/c54638bf424884febcbbd9fd87cc4db4.jpg b/docs/little_demo/zh/QuecPythonTest/media/c54638bf424884febcbbd9fd87cc4db4.jpg deleted file mode 100644 index 79fcc690784d975ff299cf93154900faf8cb91f7..0000000000000000000000000000000000000000 Binary files a/docs/little_demo/zh/QuecPythonTest/media/c54638bf424884febcbbd9fd87cc4db4.jpg and /dev/null differ diff --git a/docs/little_demo/zh/QuecPythonTest/media/ccbc03bb239949f8cf13ede7afae51e9.png b/docs/little_demo/zh/QuecPythonTest/media/ccbc03bb239949f8cf13ede7afae51e9.png deleted file mode 100644 index 08698e7d38e908646d19b28162fa72d9fb28bf31..0000000000000000000000000000000000000000 Binary files a/docs/little_demo/zh/QuecPythonTest/media/ccbc03bb239949f8cf13ede7afae51e9.png and /dev/null differ diff --git a/docs/little_demo/zh/QuecPythonTest/media/cec8ced13c05b84026f408456b6272f7.jpg b/docs/little_demo/zh/QuecPythonTest/media/cec8ced13c05b84026f408456b6272f7.jpg deleted file mode 100644 index c414bf7988a21b655b6cd83d42bbd1ac24c0dfd9..0000000000000000000000000000000000000000 Binary files a/docs/little_demo/zh/QuecPythonTest/media/cec8ced13c05b84026f408456b6272f7.jpg and /dev/null differ diff --git a/docs/little_demo/zh/QuecPythonTest/media/cf43805ec64c98529fc4c909d372b5f7.jpg b/docs/little_demo/zh/QuecPythonTest/media/cf43805ec64c98529fc4c909d372b5f7.jpg deleted file mode 100644 index e9839c5d3e0ed93b7e6551c9a902b27eb7283b70..0000000000000000000000000000000000000000 Binary files a/docs/little_demo/zh/QuecPythonTest/media/cf43805ec64c98529fc4c909d372b5f7.jpg and /dev/null differ diff --git a/docs/little_demo/zh/QuecPythonTest/media/dc6f8d77e95daecdd93e8bf209c840e6.jpg b/docs/little_demo/zh/QuecPythonTest/media/dc6f8d77e95daecdd93e8bf209c840e6.jpg deleted file mode 100644 index 5e51c5d8ee070c7f8ebac7637a92997cc91015b4..0000000000000000000000000000000000000000 Binary files a/docs/little_demo/zh/QuecPythonTest/media/dc6f8d77e95daecdd93e8bf209c840e6.jpg and /dev/null differ diff --git a/docs/little_demo/zh/QuecPythonTest/media/dc7f7f722e57250c9c4b1e0d5b1256bb.png b/docs/little_demo/zh/QuecPythonTest/media/dc7f7f722e57250c9c4b1e0d5b1256bb.png deleted file mode 100644 index 4078a7a3eabcf523aa62f652543b5fe50ee7fd83..0000000000000000000000000000000000000000 Binary files a/docs/little_demo/zh/QuecPythonTest/media/dc7f7f722e57250c9c4b1e0d5b1256bb.png and /dev/null differ diff --git a/docs/little_demo/zh/QuecPythonTest/media/ef40a9163b85d808df2488e08c09d482.jpg b/docs/little_demo/zh/QuecPythonTest/media/ef40a9163b85d808df2488e08c09d482.jpg deleted file mode 100644 index 2bdfb19bfcfc6116dc5688232efa4c2697b87a19..0000000000000000000000000000000000000000 Binary files a/docs/little_demo/zh/QuecPythonTest/media/ef40a9163b85d808df2488e08c09d482.jpg and /dev/null differ diff --git a/docs/little_demo/zh/QuecPythonTest/media/f2b300f1bfe287f568953e90440c2b31.jpg b/docs/little_demo/zh/QuecPythonTest/media/f2b300f1bfe287f568953e90440c2b31.jpg deleted file mode 100644 index bb78d6aba9f0acb57bad805260c1ab473f710a09..0000000000000000000000000000000000000000 Binary files a/docs/little_demo/zh/QuecPythonTest/media/f2b300f1bfe287f568953e90440c2b31.jpg and /dev/null differ diff --git a/docs/little_demo/zh/QuecPythonTest/record.md b/docs/little_demo/zh/QuecPythonTest/record.md deleted file mode 100644 index 33f315cc04041b83d0888b09d11de4ac1c010674..0000000000000000000000000000000000000000 --- a/docs/little_demo/zh/QuecPythonTest/record.md +++ /dev/null @@ -1,257 +0,0 @@ -## 录音实验 - -文档主要基于 EC600S 介绍如何使用 QuecPython 的录音功能 。同时说明录音功能的相关 API 的用法。 硬件描述 。 - -### 硬件设计 - -录音功能的硬件设计电路如下: - -![Quectel_QuecPython_录音实验说明_01](media/Quectel_QuecPython_录音实验说明_01.png) - - 图1 录音模块电路原理图 - -![Quectel_QuecPython_录音实验说明_02](media/Quectel_QuecPython_录音实验说明_02.png) - - 图2 开发板录音硬件 - -注意事项 - -(1) 焊接 MIC 时,要注意区分正负极,咪头正负极区分方法如下: - -咪头两个引脚中,有 铜皮连接到了外壳 的那个引脚 就是负极,或者用万用表量, 与外壳连通的引脚 就是负极。 - -![Quectel_QuecPython_录音实验说明_03](media/Quectel_QuecPython_录音实验说明_03.png) - - 图3 咪头正负极说明 - -(2) 外接喇叭播放录音文件时,请使用规格型号为 4Ω 3W 的喇叭。 - -### 软件设计 - -#### 录音 API 说明 - -**创建对象** - -> ***import audio*** -> -> ***record_obj = audio.Reocrd(filename, callback)*** - -参数说明: - -**filename** :保存录音的文件名 - -**callback** :录音回调函数,用于通知用户录音结果、录音文件大小以及文件名 回调函数形式如下: - -```python -def record_callback(args): - print('file_name:{}'.format(args[0])) - print('file_size:{}'.format(args[1])) - print('record_sta:{}'.format(args[2])) -``` - - - -**开始录音** - -> ***record_obj.start(seconds)*** - -参数说明: - -**seconds** :指定录音时长,单位 s - -返回值: - -**0** :正常 - -**-1** : 文件覆盖失败 - -**-2** : 文件打开失败 - -**-3** : 文件正在使用 - -**-4** : 通道设置错误(只能设置 0 或 1) - -**-5** : 定时器资源申请失败 - - - -**停止录音** - -> ***record_obj.stop()*** - -参数说明:无参数 。 - -返回值: 无返回值 。 - - - -**判断录音文件是否存在** - -> ***record_obj.exists()*** - -参数说明:无参数 - -返回值: - -**true** :文件存在 - -**false** :文件不存在 - - - -**获取录音文件保存的路径** - -> ***record_obj.getFilePath()*** - -参数说明:无参数 。 - -返回值: 返回 string 类型的录音文件保存路径。 - - - -**读取录音数据** - -> ***record_obj.getData(offset, size)*** - -参数说明: - -**offset** :偏移位置 - -**size** :读取的长度,单位字节 - -返回值: 正常返回读取的数据 ,失败返回错误码,如下 - -**-1** : 读取数据错误 - -**-2** : 文件打开失败 - -**-3** : 偏移量设置错误 - -**-4** : 文件正在使用 - -**-5** : 设置超出文件大小( offset+size > file_size) - - - -**读取录音文件大小** - -> ***record_obj.getSize()*** - -参数说明:无参数 。 - -返回值: - -成功返回录音文件大小( 此文件有 44byte 的文件头,所以比创建对象传入回调的值大 44),单位字节,失败返回错误码,如下 - -**-1** :获取文件 size 失败 **-2** : 文件打开失败 - -**-3** : 文件正在使用 - - - -**删除录音文件** - -> ***record_obj.Delete()*** - -参数说明:无参数 。 - -返回值: - -**0** :删除成功 - -**-1** :文件不存在 - -**-2** :文件正在使用 - - - -**判断是否正在处理录音** - -> ***record_obj.isBusy()*** - -参数说明:无参数 。 - -返回值: - -**0** :idle - -**1** :busy - - - -### 下载验证 - -#### 实验代码 - -```python -# -*- coding: UTF-8 -*- - -import utime -import checkNet -import audio -from machine import Pin -''' -下面两个全局变量是必须有的,用户可以根据自己的实际项目修改下面两个全局变量的值, -在执行用户代码前,会先打印这两个变量的值。 -''' -PROJECT_NAME = "QuecPython_Record_example" -PROJECT_VERSION = "1.0.0" - -checknet = checkNet.CheckNetwork(PROJECT_NAME, PROJECT_VERSION) - -''' -外接喇叭播放录音文件,参数选择0 -''' -aud = audio.Audio(0) -tts = audio.TTS(0) - -''' -外接喇叭播放录音文件,需要下面这一句来使能 -''' -audio_EN = Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) - - -def record_callback(args): - print('file_name:{}'.format(args[0])) - print('file_size:{}'.format(args[1])) - print('record_sta:{}'.format(args[2])) - - record_sta = args[2] - if record_sta == 3: - print('The recording is over, play it') - tts.play(1, 0, 2, '录音结束,准备播放录音文件') - aud.play(1, 0, record.getFilePath()) - elif record_sta == -1: - print('The recording failure.') - tts.play(1, 0, 2, '录音失败') - - -if __name__ == '__main__': - ''' - 手动运行本例程时,可以去掉该延时,如果将例程文件名改为main.py,希望开机自动运行时,需要加上该延时, - 否则无法从CDC口看到下面的 poweron_print_once() 中打印的信息 - ''' - # utime.sleep(5) - checknet.poweron_print_once() - - ''' - 如果用户程序包含网络相关代码,必须执行 wait_network_connected() 等待网络就绪(拨号成功); - 如果是网络无关代码,可以屏蔽 wait_network_connected() - ''' - # checknet.wait_network_connected() - - # 用户代码 - '''######################【User code star】########################################''' - print('the recording will begin in 2 seconds. Please be ready!') - utime.sleep(2) - print('start recording!') - record = audio.Record('recordfile.wav', record_callback) - record.start(10) - '''######################【User code end 】########################################''' - -``` - -### 配套代码 - - - 下载代码 \ No newline at end of file diff --git a/docs/little_demo/zh/QuecPythonTest/relay.md b/docs/little_demo/zh/QuecPythonTest/relay.md deleted file mode 100644 index ea5c1ac14ee663a54556f11c85c3045ed9b24906..0000000000000000000000000000000000000000 --- a/docs/little_demo/zh/QuecPythonTest/relay.md +++ /dev/null @@ -1,110 +0,0 @@ - - - - -## 继电器实验 - -文档主要介绍如何操作继电器,继电器是电子行业中最常用的控制设备之一,许多设备通常都需要用低压控制高压,如5V 控制220V,以保障操作人员的安全。下面主要从硬件设计和软件设计方面讲解,通过阅读本文,您将了解到继电器的操作原理和验证实验理论。 - -### 硬件描述 - -模组的 GPIO 输出电压为1.8V,为了能够稳定地控制继电器,搭配电压转换电路,可用电压转换IC,也可以直接用三极管,然后用三极管驱动继电器。高电平三极管导通,继电器吸合;低电平三极管截止,继电器断开。 - -
-![](media/ef40a9163b85d808df2488e08c09d482.jpg) - -
- -### 软件设计 - -找到和继电器连接的 GPIO 口,初始化 GPIO 后,控制继电器通断,就是控制 GPIO的高低电平变化,要继电器吸合,就往 GPIO 写入 1,要断开,就往 GPIO 写入 -0,这样轻易的实现我们的目的了。 - -以下示例代码,初始化 GPIO,包括一个读函数、一个写函数。 - -```python -IOdictRead = {} # 记录已经初始化的GPIO口 -IOdictWrite = {} # 记录已经初始化的GPIO口 - -def GPIO_Read(gpioX, Pull=Pin.PULL_DISABLE, level=1): - if IOdictWrite.get(gpioX, None): - del IOdictWrite[gpioX] - gpioIO = IOdictRead.get(gpioX, None) - if gpioIO: - return gpioIO.read() - else: - IOdictRead[gpioX] = (Pin(gpioX, Pin.IN, Pull, level)) - gpioIO = IOdictRead.get(gpioX, None) - return gpioIO.read() - -def GPIO_Write(gpioX, level, Pull=Pin.PULL_DISABLE): - if IOdictRead.get(gpioX, None): - del IOdictRead[gpioX] - gpioIO = IOdictWrite.get(gpioX, None) - if gpioIO: - gpioIO.write(level) - else: - IOdictWrite[gpioX] = (Pin(gpioX, Pin.OUT, Pull, level)) - gpioIO = IOdictWrite.get(gpioX, None) - gpioIO.write(level) -``` - -定义了两个继电器的 GPIO 口, - -```python -Relay_1 = Pin.GPIO3 # 定义继电器引脚 -Relay_2 = Pin.GPIO4 # 定义继电器引脚 -def relayIO_On(gpioX): # 某个引脚置0 - GPIO_Write(gpioX, 0) -def relayIO_Off(gpioX): # 某个引脚置1 - GPIO_Write(gpioX, 1) -``` - -定义了两个按键的GPIO 口,用按键操作继电器的吸合、断开 - -```python -KEY_1 = Pin.GPIO1 # 定义按键引脚 -KEY_2 = Pin.GPIO2 # 定义按键引脚 - -def readKey(): # 读取按键,返回按键值 - if (GPIO_Read(KEY_1) == low): # 判断是否为低电平 - utime.sleep_ms(20) # 防抖 - if (GPIO_Read(KEY_1) == low): # 判断是否为低电平 - return KEY_1 # 返回按键值 - elif (GPIO_Read(KEY_2) == low): # 判断是否为低电平 - utime.sleep_ms(20) # 防抖 - if (GPIO_Read(KEY_2) == low): # 判断是否为低电平 - return KEY_2 # 返回按键值 - else: - return None # 返回空 -``` - -主函数,无限循环检测按键是否被按下,某个按键按下后两个继电器互换跳动。 - -```python -while True: - if(readKey() == KEY_1): # 判断是否KEY_1 被按下 - relayIO_On(Relay_1) # Relay_1 ON - relayIO_Off(Relay_2) # Relay_2 OFF - elif (readKey() == KEY_1): # 判断是否KEY_1 被按下 - relayIO_Off(Relay_1) # Relay_1 OFF - relayIO_On(Relay_2) # Relay_2 ON -``` - -接下来就可以下载验证了,python 代码不需要编译,直接通过 QPYcom 工具把.py文件下载到模块中运行。 - -### 下载验证 - -> 下载.py 文件到模组运行: - -
-![](media/466a7209f9edc319f3ef2f6f9786ba0c.jpg) - -
- -下载之后,代码在延时的时候自动进入休眠,功耗降低。 - -### 配套代码 - - - 下载代码 \ No newline at end of file diff --git a/docs/little_demo/zh/QuecPythonTest/timer.md b/docs/little_demo/zh/QuecPythonTest/timer.md deleted file mode 100644 index 14399415ff5c6d3389facede6f88716cca50f8c7..0000000000000000000000000000000000000000 --- a/docs/little_demo/zh/QuecPythonTest/timer.md +++ /dev/null @@ -1,147 +0,0 @@ -## 定时器中断实验 - -### 基本概述 - -本文档主要基于EC600介绍如何使用QuecPython类库API来快速开发使用定时器功能。 - -### 使用说明 - -#### Timer创建对象 - -from machine import Timer - -timer = Timer(Timern) - -| 常量 | 说明 | -| ------------ | ------- | -| Timer.Timer0 | 定时器0 | -| Timer.Timer1 | 定时器1 | -| Timer.Timer2 | 定时器2 | -| Timer.Timer3 | 定时器3 | - -#### start启动定时器 - -timer.start(period, mode, callback) - -| 参数 | 类型 | 说明 | -| -------- | -------- | ------------------------------------------------------------ | -| period | int | 中断周期,单位毫秒,大于等于1 | -| mode | int | 运行模式 Timer.ONE_SHOT 单次模式,定时器只执行一次 Timer.PERIODIC 周期模式,循环执行 | -| callback | function | 定时器执行函数 | - -返回值 - -启动成功返回整型值0,失败返回整型值-1。 - -#### stop停止定时器 - -关闭定时器。 - -参数:无 - -返回值: - -成功返回整型值0,失败返回整型值-1。 - -### 实验设计 - -#### 实验步骤 - -1. 分配一个定时器。 - -2. 定义一个回调函数, 配置成为1秒回调一次。 - -3. 在回调函数里面设置,回调10次。关闭定时器。 - -#### 实验代码 - -``` -'''File: timer.py - -Project: timer - -File Created: Monday, 28th December 2020 2:44:33 pm - -Author: chengzhu.zhou - ------ - -Last Modified: Friday, 8th January 2021 9:19:55 am - -Modified By: chengzhu.zhou - ------ - -Copyright 2021 - 2021 quectel - -''' - -# refs for http://qpy.quectel.com/wiki/#/zh-cn/api/?id=timer - -from machine import Timer - -import utime as time - - - -# 创建一个执行函数,并将timer实例传入 - -num = 0 - -state = 1 - - - -def CallBack(t): - - global num - - global state - - print('num is %d' % num) - - num += 1 - - if num > 10: - - print('num > 10, timer exit') - - state = 0 - - t.stop() - - - -def main(): - - # 创建一个定时器对象 - - T = Timer(Timer.Timer1) - - # 设置周期为1秒, - - T.start(period=1000, mode=Timer.PERIODIC, callback=CallBack) # 启动定时器 - - # wait - - while state: - - time.sleep_ms(1) - - pass - - T.stop() # 结束该定时器实例 - - print("The main function has exited") - - - -if __name__ == "__main__": - - main() -``` - -### 配套代码 - - - 下载代码 \ No newline at end of file diff --git a/docs/little_demo/zh/QuecPythonTest/uart.md b/docs/little_demo/zh/QuecPythonTest/uart.md deleted file mode 100644 index d04895263f551233e73cd119dcd10ee3b7746880..0000000000000000000000000000000000000000 --- a/docs/little_demo/zh/QuecPythonTest/uart.md +++ /dev/null @@ -1,192 +0,0 @@ -## 串口实验 - -本片文章主要简介 EC600S 串口硬件资源,介绍 quecpython串口 API, 以及实现一个 demo程序 展示怎样使用串口。 - -### 硬件资源 - -EC600 包含了 4 个串口外设, 分别命名为 - -- DEBUG PORT - -- BT PORT - -- MAIN PORT - -- USB CDC PORT - - - -### 软件资源 - -#### 创建 uart 对象 – uart - -**uart = UART(UART.UARTn, buadrate, databits, parity, stopbits, flowctl)** - -| 参数 | 类型 | 说明 | -| -------- | ---- | ------------------------------------------------------------ | -| UARTn | int | 端口号 EC600SCN平台,UARTn作用如下:
UART0 - DEBUG PORT
UART1 – BT PORT
UART2 – MAIN PORT
UART3 – USB CDC PORT | -| buadrate | int | 波特率,常用波特率都支持,如4800、9600、19200、38400、57600、115200、230400等 | -| databits | int | 数据位(5~8) | -| parity | int | 奇偶校验(0 – NONE,1 – EVEN,2 - ODD) | -| stopbits | int | 停止位(1~2) | -| flowctl | int | 硬件控制流(0 – FC_NONE, 1 – FC_HW) | - - - -#### 查看 buffer 容量 – any - -**uart.any()** - -功能 :返回接收缓存器中有多少字节的数据未读 - -参数 : 无 - -返回值 : 返回接收缓存器中有多少字节的数据未读 - - - -#### 读取 buffer – read - -**uart.read(nbytes)** - -功能 : 从串口读取数据 - -参数 : - -|参数 |类型 |说明 | -| - | - | - | -|nbytes |int |要读取的字节数| -返回值:返回读取的数据 - - - -#### 写数据 – write - -**uart.write(data)** - -功能 :发送数据到串口 - -参数 : - -| 参数 | 类型 | 说明 | -| ---- | ------ | ---------- | -| data | string | 发送的数据 | - -返回值:返回发送的字节数 - - - -#### 关闭 uart 对象 – close - -**uart.close() ** - -功能 :关闭串口 - -参数 :无 - -返回值 :成功返回整型 0,失败返回整型 -1 - - - -### 实验步骤 - -#### 实验环境准备 - -首先将 EC600 开发板上面的 TXD1 和 RXD1,焊上排针 ,使用杜邦线连接到 USB 转串口模块上。 - -![Quectel-QuecPython串口小实验_01](media/Quectel-QuecPython串口小实验_01.png) - -使用另外一个串口终端上位机(比如 xshell)接受消息。 接下来我们将使用 MAIN PORT 串口打印消息。 - - - -#### 交互实验 - -```python ->>> from machine import UART -""" -端口号 -EC100YCN平台与EC600SCN平台,UARTn映射如下: -UART0 - DEBUG PORT -UART1 – BT PORT -UART2 – MAIN PORT -UART3 – USB CDC PORT -""" ->>> uart1 = UART(UART.UART2, 115200, 8, 0, 1, 0) ->>> uart1.any() -10 ->>> uart1.read(5) -b’12345’ ->>> uart1.any() -5 -``` - - - -### 实验代码 - -```python -''' -File: example_uart_base.py.py -Project: uart -File Created: Wednesday, 23rd December 2020 3:33:56 pm -Author: chengzhu.zhou ------ -Last Modified: Wednesday, 23rd December 2020 3:34:15 pm -Modified By: chengzhu.zhou ------ -Copyright 2020 - 2020 quectel -''' - -from machine import UART -import utime as time -""" -端口号 -EC100YCN平台与EC600SCN平台,UARTn映射如下: -UART0 - DEBUG PORT -UART1 – BT PORT -UART2 – MAIN PORT -UART3 – USB CDC PORT -""" - - -def main(): - """ - config uart Baud rate as 115200,data bits as 8bit, Do not use parity, - Stop bit as 0bit,Do not use Flow control, - UART(UART.UARTn, buadrate, databits, parity, stopbits, flowctl) - """ - uart = UART(UART.UART2, 115200, 8, 0, 1, 0) - # write string - delay = 100 - for i in range(2): - # write string - uart.write("hello world\r\n") - # write string and & integer - uart.write("delay num as {0}ms\r\n".format(delay)) - # write float - uart.write("π as {0}\r\n".format(3.14159)) - # read something - read_btyes = 6 - uart.write("please input {0} bytes:\r\n".format(read_btyes)) - while True: - if uart.any() > read_btyes: - break - else: - time.sleep_ms(10) - # !!! Before reading buffer, please make sure there is data in buffer - input_date = uart.read(read_btyes) - uart.write("The data you entered is {0}\r\n".format(input_date)) - time.sleep_ms(delay) - -if __name__ == "__main__": - main() - - -``` - -### 配套代码 - - - - 下载代码 \ No newline at end of file diff --git a/docs/little_demo/zh/README.md b/docs/little_demo/zh/README.md deleted file mode 100644 index 6a5ed7e024ae4d676696722eefcf81f7f645720c..0000000000000000000000000000000000000000 --- a/docs/little_demo/zh/README.md +++ /dev/null @@ -1,4 +0,0 @@ - -## 小实验 - -本页面简述小实验 \ No newline at end of file diff --git a/docs/little_demo/zh/config.json b/docs/little_demo/zh/config.json deleted file mode 100644 index 10c2a1cc1964035be8ce534c1a708e32e4094fcc..0000000000000000000000000000000000000000 --- a/docs/little_demo/zh/config.json +++ /dev/null @@ -1,95 +0,0 @@ -{ - "class": "language_zh", - "navbar": { - "title": "QuecPython", - "logo": { - "alt": "teedoc logo", - "src": "/static/image/quectel.png" - }, - "home_url": "/", - "items": [ - { - "url": "https://python.quectel.com/wiki/#/", - "label": "wiki", - "position": "left" - }, - { - "label": "    文档    ", - "position": "left", - "items": [ - { - "url": "/doc/Quecpython_intro/zh/index.html", - "label": "产品介绍" - }, - { - "url": "/doc/Quick_start/zh/index.html", - "label": "快速开始" - }, - { - "url": "/doc/sbs/zh/index.html", - "label": "手把手教程" - }, - { - "url": "/doc/Advanced_development/zh/index.html", - "label": "开发进阶" - }, - { - "url": "/doc/little_demo/zh/index.html", - "label": "小实验" - }, - { - "url": "/doc/Product_case/zh/index.html", - "label": "产品案例" - }, - { - "url": "/doc/Mass_production/zh/index.html", - "label": "产品量产" - }, - { - "url": "/doc/FAQ/zh/index.html", - "label": "常见问题" - } - ] - }, - { - "label": "GitHub", - "position": "right", - "url": "https://github.com/quecpython/Community-document" - } - ] - }, - "footer": { - "top": [ - { - "label": "链接", - "items": [ - { - "label": "使用 teedoc 构建", - "url": "https://github.com/neutree/teedoc", - "target": "_blank" - }, - { - "label": "Copyright © 2021 Neucrack", - "url": "https://neucrack.com", - "target": "_blank" - } - ] - }, - { - "label": "源码", - "items": [ - { - "label": "github", - "url": "https://github.com/neutree/teedoc", - "target": "_blank" - }, - { - "label": "本网站源文件", - "url": "https://github.com/quecpython/Community-document", - "target": "_blank" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/docs/little_demo/zh/sidebar.yaml b/docs/little_demo/zh/sidebar.yaml deleted file mode 100644 index 9f3bdaa5444e4ef7a65769390b8350b5b22e8d21..0000000000000000000000000000000000000000 --- a/docs/little_demo/zh/sidebar.yaml +++ /dev/null @@ -1,30 +0,0 @@ -# 小实验 -items: -- label: 小实验简介 - file: README.md -- label: 总线 - items: - - label: 跑马灯实验 - file: QuecPythonTest/LED.md - - label: 蜂鸣器实验 - file: QuecPythonTest/buzzer.md - - label: 按键输入实验 - file: QuecPythonTest/button.md - - label: 串口实验 - file: QuecPythonTest/uart.md - - label: 外部中断实验 - file: QuecPythonTest/External_interrupt.md - - label: 独立看门狗实验 - file: QuecPythonTest/WDT.md - - label: 录音实验 - file: QuecPythonTest/record.md -- label: 传感器 - items: - - label: 内部温度传感器实验 - file: QuecPythonTest/i2c_aht.md - - label: 光敏传感器实验 - file: QuecPythonTest/Photoresistor.md - - label: 加速度传感器 - file: QuecPythonTest/i2c_lis2dh.md - - label: 步进电机驱动实验 - file: QuecPythonTest/ebf_smd4805.md \ No newline at end of file diff --git a/docs/sbs/en/README.md b/docs/sbs/en/README.md new file mode 100644 index 0000000000000000000000000000000000000000..ced92eb75dbf6c12fe8ef26b42b52bb6b2e37ab2 --- /dev/null +++ b/docs/sbs/en/README.md @@ -0,0 +1,121 @@ +### QuecPython basic operation instructions + +This article mainly introduces the basic operations of quecpthon, including file system and instruction execution. In quecpthon, the main serial port is used as the instruction and data receiving channel, and all operations are completed through the main serial port. + +Applicable modules: + +-Ec100y-cn (this paper takes this module as an example) + +- EC600S-CN + +#### System startup + +After quecpthon is started, the interactive interpreter will be started on the main serial port, similar to the Linux shell. Through the interactive interpreter, users can execute commands in real time and view the returned results. + +![](sbs/media/0f627ce2f6c2f679cd92c7685c3cf148.jpg) + +Interactive interpreter + +Of which: + +-Execute ** help (obj) ** command to view help; + +-Execute the ** dir (obj) ** instruction to view the detailed methods provided by the module; + +-Execute the ** help ('modules') ** command to view the currently supported class libraries. During system startup, in addition to hardware resource initialization, partition mounting and initialization script operation will also be performed. The startup script mainly includes two parts: + +-* boot. Py *: resource initialization, such as attaching partitions during startup, and the script is frozen in the factory firmware; + +-* main. Py *: user initialization script, which is executed after system initialization. + +#### File system + +In quecpthon, 5 MB is divided +As a user partition, users can store some configuration, script and other files in this partition. When the system starts, the partition will be automatically mounted in the '/' directory. + +>In quecpthon, a class library * UOS * for accessing the file system is provided, which can be used to operate and access the file system. +>The following code example shows how to create files, write contents and read contents in the current directory. + +``` +import uos # create a file +f=open('test.txt','w') +f.write('hello quecpython!\n') +f.write('123456789abcdefg!\n') +f.close() # read a file +f=open('test.txt', 'r') +print(f.readline()) +print(f.readline()) +f.close() +``` + + + +>To facilitate operation, you can use the * qpycom. Exe * tool for routine file system operation. + +Script Download + +Step ** 1 **: unzip * qpycom. Zip * under the * tools * directory in the SDK package, obtain * qpycom. Exe *, and double-click to run; + +Step ** 2 **: enter the "download" tab, click the "create" button to create a user project according to requirements; + +Step ** 3 **: click the "** + **" button to select the script to be downloaded to the module; + +Step ** 4 **: click the inverted triangle button at the bottom right of the interface to switch to the "download script" mode; + +Step ** 5 **: click ** Download FW ** to download the script; + +Step ** 6 **: when the progress bar displays "** 100% **", it indicates that the download is complete. You can enter the "file" tab to view the file details in the module. + +![](sbs/media/5515ac10e5070dd1b9bfd61c7a7022cf.jpg) + +>** 2 **: script Download Interface + +see file + +Run * qpycom. Exe * tool and click "view" --> "file browsing" to realize Python connection between local and module +The operation interface and buttons for uploading, viewing, adding and deleting files are shown in the figure below. + +![](sbs/media/277228479c7256251a776b75160dfcec.jpg) + +Upload, view, add and delete ** Python ** files with local modules + +Command interaction + +Run * qpycom. Exe * tool, click "view" --> "interactive command line" to enter the main interactive interface. In the interactive interface, you can manually input and interact with the module through the interactive window. The description of the main interactive interface is shown in the figure. + +![](sbs/media/c240cbfd8fcee183b8644a9a41320d34.jpg) + +Interactive interface description + +>** 4 ** execute script + +>Step ** 1 **: unzip * qpycom. Zip * under the * tools * directory in the SDK package, obtain * qpycom. Exe *, and double-click to run; +>Step ** 2 **: enter the "file" tab; +>Step ** 3 **: click the button shown in the red box below to execute the script file. + +![](sbs/media/8431414d399d975a4c26434403a514bd.jpg) + +Execute script interface + +#### Bytecode compilation + +The MPY - Cross tool improves the execution speed of Python script and the security code for the user. Bytecode can be solidified in firmware or stored in file system for script. For details, please refer to + +> 《Quectel_ QuecPython_ MPY cross User Guide + +>The commands for compiling Python scripts into bytecode are: + +> mpy-cross.exe -o test.mpy -s test.py -march=armv7m test.py + +#### Appendix ** a ** abbreviations + +Table ** 1 **: Abbreviations of terms + +|Abbreviation | full English name | full Chinese name| +| ---- | ------------------------------------------- | ------------------ | +|UART universal asynchronous receiver / transmitter universal asynchronous transceiver| + + + + + diff --git a/docs/sbs/en/config.json b/docs/sbs/en/config.json new file mode 100644 index 0000000000000000000000000000000000000000..d56bd18299cbd9a93aa356727e036fe8bcccc768 --- /dev/null +++ b/docs/sbs/en/config.json @@ -0,0 +1,24 @@ +{ + "import": "config_en", + "navbar": { + "items": [ + { + "id": "language", + "label": "Language: ", + "position": "right", + "items": [ + { + "id": "zh", + "url": "doc/sbs/zh/", + "label": "中文" + }, + { + "id": "en", + "url": "doc/sbs/en/", + "label": "English" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/docs/little_demo/zh/QuecPythonTest/code/LCD_file.zip b/docs/sbs/en/lcd/code/LCD_file.zip similarity index 100% rename from docs/little_demo/zh/QuecPythonTest/code/LCD_file.zip rename to docs/sbs/en/lcd/code/LCD_file.zip diff --git a/docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_01.png b/docs/sbs/en/lcd/media/Quectel_Qp_little_demo_lcd_01.png similarity index 100% rename from docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_01.png rename to docs/sbs/en/lcd/media/Quectel_Qp_little_demo_lcd_01.png diff --git a/docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_02.jpg b/docs/sbs/en/lcd/media/Quectel_Qp_little_demo_lcd_02.jpg similarity index 100% rename from docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_02.jpg rename to docs/sbs/en/lcd/media/Quectel_Qp_little_demo_lcd_02.jpg diff --git a/docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_03.png b/docs/sbs/en/lcd/media/Quectel_Qp_little_demo_lcd_03.png similarity index 100% rename from docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_03.png rename to docs/sbs/en/lcd/media/Quectel_Qp_little_demo_lcd_03.png diff --git a/docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_04.png b/docs/sbs/en/lcd/media/Quectel_Qp_little_demo_lcd_04.png similarity index 100% rename from docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_04.png rename to docs/sbs/en/lcd/media/Quectel_Qp_little_demo_lcd_04.png diff --git a/docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_05.png b/docs/sbs/en/lcd/media/Quectel_Qp_little_demo_lcd_05.png similarity index 100% rename from docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_05.png rename to docs/sbs/en/lcd/media/Quectel_Qp_little_demo_lcd_05.png diff --git a/docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_06.jpg b/docs/sbs/en/lcd/media/Quectel_Qp_little_demo_lcd_06.jpg similarity index 100% rename from docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_06.jpg rename to docs/sbs/en/lcd/media/Quectel_Qp_little_demo_lcd_06.jpg diff --git a/docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_07.png b/docs/sbs/en/lcd/media/Quectel_Qp_little_demo_lcd_07.png similarity index 100% rename from docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_07.png rename to docs/sbs/en/lcd/media/Quectel_Qp_little_demo_lcd_07.png diff --git a/docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_08.jpg b/docs/sbs/en/lcd/media/Quectel_Qp_little_demo_lcd_08.jpg similarity index 100% rename from docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_08.jpg rename to docs/sbs/en/lcd/media/Quectel_Qp_little_demo_lcd_08.jpg diff --git a/docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_09.png b/docs/sbs/en/lcd/media/Quectel_Qp_little_demo_lcd_09.png similarity index 100% rename from docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_09.png rename to docs/sbs/en/lcd/media/Quectel_Qp_little_demo_lcd_09.png diff --git a/docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_10.png b/docs/sbs/en/lcd/media/Quectel_Qp_little_demo_lcd_10.png similarity index 100% rename from docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_10.png rename to docs/sbs/en/lcd/media/Quectel_Qp_little_demo_lcd_10.png diff --git a/docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_11.png b/docs/sbs/en/lcd/media/Quectel_Qp_little_demo_lcd_11.png similarity index 100% rename from docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_11.png rename to docs/sbs/en/lcd/media/Quectel_Qp_little_demo_lcd_11.png diff --git a/docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_12.png b/docs/sbs/en/lcd/media/Quectel_Qp_little_demo_lcd_12.png similarity index 100% rename from docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_12.png rename to docs/sbs/en/lcd/media/Quectel_Qp_little_demo_lcd_12.png diff --git a/docs/little_demo/zh/QuecPythonTest/media/st7789v.png b/docs/sbs/en/lcd/media/Quectel_Qp_little_demo_lcd_st7789v.png similarity index 100% rename from docs/little_demo/zh/QuecPythonTest/media/st7789v.png rename to docs/sbs/en/lcd/media/Quectel_Qp_little_demo_lcd_st7789v.png diff --git a/docs/sbs/en/lcd/st7789_lcd.md b/docs/sbs/en/lcd/st7789_lcd.md new file mode 100644 index 0000000000000000000000000000000000000000..ae214602cd1d23492733f3d72de7485c0db07bec --- /dev/null +++ b/docs/sbs/en/lcd/st7789_lcd.md @@ -0,0 +1,476 @@ +## Platform description + +​ This experimental routine is based on ec600s_ QuecPython_ EVB_ V1.1 development board completed. + + + +## LCD interface description of development board + +​ The st7789v LCD pin definition used in this experiment is completely matched with the LCD interface of the development board, and can be directly inserted into the LCD interface of the development board. The LCD interface of the development board is as follows: + +![Quectel_Qp_little_demo_lcd_01](media/Quectel_Qp_little_demo_lcd_01.png) + +|LCD pin | pin definition of development board| +| ------------- | ------------------------------ | +|GND | power ground| +| VCC_ 3v3 | power supply 3.3V| +| LCD_ SCL_ 3v3 | SPI bus clock signal| +| LCD_ SDA_ 3v3 | SPI bus write data signal| +| LCD_ RST_ 3v3 | LCD reset control signal, low level reset| +| LCD_ DC_ 3v3 | write register / write data control signal| +| LCD_ BLK | LCD backlight control signal| + + + +## St7789v LCD interface description + +![st7789v](media/Quectel_Qp_little_demo_lcd_st7789v.png) + + + +|LCD pin | pin definition| +| ------- | ------------------------------ | +|GND | power ground| +|VCC | power supply 3.3V| +|SCL | SPI bus clock signal| +|SDA | SPI bus write data signal| +|Res | LCD reset control signal, low level reset| +|DC | write register / write data control signal| +|BLK | LCD backlight control signal| + +## Wiring mode + +​ The following are 1.14inch st7789v LCD module and ec600s_ QuecPython_ EVB_ V1.1 module wiring correspondence. EC600S_ QuecPython_ EVB_ For the definition of v1.1 module LCD interface, please refer to the module schematic diagram of the development board. + +|1.14inch st7789v LCD module pin | ec600s_ QuecPython_ EVB_ V1.1 pin| +| ---------------------------- | ------------------------------- | +| GND | GND | +| VCC | VCC_3V3 | +| SCL | LCD_SCL_3V3 | +| SDA | LCD_SDA_3V3 | +| RES | LCD_RST_3V3 | +| DC | LCD_DC_3V3 | +| BLK | LCD_BLK | + + + +## Software description + +​ The interface in this example is implemented based on quecpthon's machine. LCD library. For details, you can read the source code of the sample program. + +## Document description + +|Document description| +| ------------------------ | ------------------------------------------------------------ | +|St7789v.py | contains the LCD driver whose driver IC is st7789v and interfaces for displaying characters and pictures| +|Fonts.py | font library used in the sample program| +|Image.py | image data used in the sample program| +| example_ display_ Image.py | main program for displaying pictures, calling methods and data in several other files| +| example_ display_ Char.py | display the character main program and call the methods and data in several other files| + + + +## Instructions for st7789v LCD driving method + +### Create st7789v object + +> **from usr import st7789v** +> +> **lcd_st7789v = st7789v.ST7789V(width, hight)** + +*Function: + + Create an LCD object for LCD initialization. + +*Parameters: + +|Parameter type description| +| ----- | ---- | ---------- | +|Width | width of integer | display screen| +|High | integer | high of display screen| + +*Return value: + + Returns an LCD object. + +*Example: + +```python +from usr import st7789v +lcd_st7789v = st7789v.ST7789V(240, 240) +``` + + + +### Show single character + +> **lcd_st7789v.lcd_show_char(x, y, xsize, ysize, ch_buf, fc, bc)** + +*Function: + + Single character display, which can display Chinese characters and ASCII characters. + +*Parameters: + +|Parameter | type | description| +| ------ | ------------ | ----------------------------- | +|X | integer | X axis starting point coordinate| +|Y | integer | Y axis starting point coordinate| + + + + + + + + + nothing + + + +### Single ASCII character display + +> **lcd_st7789v.lcd_show_ascii(x, y, xsize, ysize, ch, fc, bc)** + +*Function: + + ASCII character display currently supports font sizes of 8x16 and 16X24. If other font sizes are required, you need to increase the font data of the corresponding size, and add the dictionary of the corresponding font in this function. + +*Parameters: + +|Parameter | type | description| +| ----- | ------------ | ----------------------------- | +|X | integer | X axis starting point coordinate| +|Y | integer | Y axis starting point coordinate| +|Xsize | integer | width of characters to be displayed| +|Ysize | integer | height of the character to be displayed| +|Ch | character | ASCII character to be displayed| +|FC | 16 bit hex | font color, such as 0x0000 indicates black| +|BC | 16 bit hexadecimal | background color, such as 0xFFFF indicates white| + +*Return value: + + nothing + + + +### Ascii string display + +> **lcd_st7789v.lcd_show_ascii_str(x, y, xsize, ysize, str, fc, bc)** + +*Function: + + Ascii string display, display order, starting from left to right with the set starting coordinates. In the example, only ASCII characters of 8x16 size are provided. If users need characters of other sizes, they need to remake the font library and display them on the ` LCD_ st7789v.lcd_ show_ ASCII (x, y, xsize, ysize, CH, FC, BC) ` interface adds support for new font libraries. + + Note: make sure that the incoming string can be displayed on the current line, that is, the value of the total length of the incoming string multiplied by the width of a single character plus the starting coordinate X cannot exceed the screen width, otherwise the program will directly report an error and prompt that it exceeds the display range. + +Parameters: + +|Parameter | type | description| +| ----- | ------------ | ----------------------------- | +|X | integer | X axis starting point coordinate| +|Y | integer | Y axis starting point coordinate| +|Xsize | integer | width of characters to be displayed| +|Ysize | integer | height of the character to be displayed| +|STR | string | ASCII character to be displayed| +|FC | 16 bit hex | font color, such as 0x0000 indicates black| +|BC | 16 bit hexadecimal | background color, such as 0xFFFF indicates white| + +*Return value: + + None. + + + +### Single Chinese character display + +> **lcd_st7789v.lcd_show_chinese(x, y, xsize, ysize, ch, fc, bc)** + +*Function: + + Chinese character display currently supports the font sizes of 16x16, 16X24 and 24x24 of several Chinese characters in the example. If you need to display other Chinese characters and other font sizes, you need to increase the font data of the corresponding size, and add the dictionary of the corresponding font in this function. + +*Parameters: + +|Parameter | type | description| +| ----- | ------------ | ----------------------------- | +|X | integer | X axis starting point coordinate| +|Y | integer | Y axis starting point coordinate| +|Xsize | integer | width of characters to be displayed| +|Ysize | integer | height of the character to be displayed| +|Ch | character | Chinese character to be displayed| +|FC | 16 bit hex | font color, such as 0x0000 indicates black| +|BC | 16 bit hexadecimal | background color, such as 0xFFFF indicates white| + +*Return value: + + nothing + + + +### Chinese character string display + +> **lcd_st7789v.lcd_show_chinese_str(x, y, xsize, ysize, str, fc, bc)** + +*Function: + + Chinese character string display, display order, starting from left to right with the set starting coordinate. In the example, only a 16x16 font size of several Chinese characters used is provided. If users need characters of other sizes, they need to recreate the font and display it on ` LCD_ st7789v.lcd_ show_ Chinese (x, y, xsize, ysize, STR, FC, BC) ` interface adds support for new font libraries. + + Note: make sure that the incoming string can be displayed on the current line, that is, the value of the number of incoming Chinese characters multiplied by the width of a single Chinese character, plus the value of the starting coordinate X, cannot exceed the screen width, otherwise the program will directly report an error and prompt that it exceeds the display range. + +*Parameters: + +|Parameter | type | description| +| ----- | ------------ | ----------------------------------- | +|X | integer | X axis starting point coordinate| +|Y | integer | Y axis starting point coordinate| +|Xsize | integer | width of characters to be displayed| +|Ysize | integer | height of the character to be displayed| +|STR | string | Chinese character string to be displayed, such as' mobile communication '| +|FC | 16 bit hex | font color, such as 0x0000 indicates black| +|BC | 16 bit hexadecimal | background color, such as 0xFFFF indicates white| + +*Return value: + + None. + + + +### Show small size pictures + +> **lcd_st7789v.lcd_show_image(image_data, x, y, width, heigth)** + +*Function: + + This method is suitable for displaying pictures with small size. If the picture resolution (width and height) is less than 80x80, the picture data can be directly written into the display at one time. + +*Parameters: + +|Parameter | type | description| +| ---------- | ---------- | ----------------------- | +| image_ Data | tuple or list | store the RGB data of the picture to be displayed| +|X | integer | X axis starting point coordinate| +|Y | integer | Y axis starting point coordinate| +|Width | integer | width of the picture to be displayed| +|Height | character | height of the picture to be displayed| + +*Return value: + + nothing + + + +### Show large picture + +> **lcd_st7789v.lcd_show_image_file(path, x, y, width, heigth, h)** + +*Function: + + This method is suitable for displaying pictures with large size. If the picture resolution (width and height) is greater than 80x80, this method needs to be used for display. This method reads the picture data from the file and writes it in segments. The principle of segmented writing is as follows: + + If the resolution (width height) of the picture to be displayed is width * height, the picture to be displayed is divided into several pictures with width * h. If the height of the last piece is less than h, it is calculated according to the actual height. H is the height of each picture after segmentation, which can be specified by the user through the parameter h. The value of H should meet the relationship: ` width * h * 2 < 4096` + +Parameters: + +|Parameter | type | description| +| ------ | ------ | ---------------------------------------------------------- | +|Path | string | TXT file path for storing image data, including file name, such as' / usr / image. TXT '| +|The X | int | X axis shows the starting point| +|The Y | int | Y axis shows the starting point| +|Width | int | picture width| +|Height | int | picture height| +|H | int | height of each picture after segmentation| + +*Return value: + + nothing + +Example: + +If you want to display a 240x240 picture, the picture is as follows: + +![Quectel_Qp_little_demo_lcd_02](media/Quectel_Qp_little_demo_lcd_02.jpg) + +(1) Use image2lcd software to obtain picture color data + +![Quectel_Qp_little_demo_lcd_03](media/Quectel_Qp_little_demo_lcd_03.png) + +(2) Get the data as shown in Figure 1 and 2 below. Delete the redundant parts at the head and tail of the. C file, and only keep the middle data part to ensure that the first line of processed data is data, and there are no more lines at the end, and there are no redundant characters such as spaces in front of each line + +![Quectel_Qp_little_demo_lcd_04](media/Quectel_Qp_little_demo_lcd_04.png) + +![Quectel_Qp_little_demo_lcd_05](media/Quectel_Qp_little_demo_lcd_05.png) + +(3) Save the processed picture data file as a TXT format file, assuming it is named image.txt + +(4) Upload the image.txt file to the development board module [note that there is no image.py file at this time, and there is no need to import image from usr] + +(5) In the main program example_ display_ In image.py, use the following code to display the picture + +```python +# -*- coding: UTF-8 -*- + + +import utime +''' +If there is no checknet Library in the firmware version used by the user, please upload the checknet.mpy file to the usr directory of the module, +And change import checknet to from usr import checknet +''' +import checkNet +from usr import st7789v +# from usr import image + +''' +The following two global variables are required. Users can modify the values of the following two global variables according to their actual projects, +The values of these two variables are printed before executing the user code. +''' +PROJECT_NAME = "QuecPython_ST7789V_LCD_Example" +PROJECT_VERSION = "1.0.0" + +checknet = checkNet.CheckNetwork(PROJECT_NAME, PROJECT_VERSION) +lcd_st7789v = st7789v.ST7789V(240, 240) + + +if __name__ == '__main__': + ''' +When running this routine manually, you can remove the delay. If you change the routine file name to main.py, you need to add the delay when you want to start up and run automatically, +Otherwise, the following poweron cannot be seen from the CDC port_ print_ Information printed in once() + ''' + # utime.sleep(5) + checknet.poweron_print_once() + + ''' +If the user program contains network related code, wait must be executed_ network_ Connected() wait for the network to be ready (dialing succeeded); +If it is a network independent code, you can mask the wait_ network_ connected() + ''' + # checknet.wait_network_connected() + + #user designation codes + '''######################【User code star】#####################################''' + + #Display a 240 * 240 size picture + lcd_st7789v.lcd_show_image_file("/usr/image.txt", 0, 0, 240, 240, 8) + + '''######################【User code end 】#####################################''' + +``` + +Display results: + + +![Quectel_Qp_little_demo_lcd_06](media/Quectel_Qp_little_demo_lcd_06.jpg) + + + +## Experimental operation + + + +## Display picture + +​ In the directory of experimental routines, find the [display picture] directory, enter the directory, and there are the following source files: + +|Document description| +| ------------------------ | ------------------------------------------------------------ | +|St7789v.py | contains method interfaces for st7789v LCD driver initialization, writing ASCII characters, writing Chinese characters and displaying pictures| +|Image.py | RGB data of sample picture| +| example_ display_ Image.py | the main program calls the interfaces and information in st7789v.py and image.py to realize picture display| +|Fonts.py | font library provides two sizes of common ASCII characters, 8x16 and 16X24, and contains several different sizes of Chinese characters used in the experiment. Users can make word libraries according to their own needs, using pctolcd2002 software and referring to the instructions in fonts.py| + + + +### Experimental steps + +(1) Connect the 240 * 240 display screen to the module correctly; +(2) The four py files in this directory (st7789v.py, image.py, fonts.py, example_ display_ Image. Py) copy to the usr directory of the module; +(3) Enter the command line of the module and execute the following commands to see the picture displayed on the display screen: + +``` +import example +example.exec('usr/example_display_image.py') +``` + + + +### Experimental results + +![Quectel_Qp_little_demo_lcd_07](media/Quectel_Qp_little_demo_lcd_07.png) + + + + + +## Display character + +​ In the directory of experimental routines, find the [display character] directory, enter the directory, and there are the following source files: + +|Document description| +| ----------------------- | ------------------------------------------------------------ | +|St7789v.py | contains method interfaces for st7789v LCD driver initialization, writing ASCII characters, writing Chinese characters and displaying pictures| +|Fonts.py | font library provides two sizes of common ASCII characters, 8x16 and 16X24, and contains several different sizes of Chinese characters used in the experiment. Users can make word libraries according to their own needs, using pctolcd2002 software and referring to the instructions in fonts.py| +| example_ display_ Char.py | the main program calls the interfaces and information in st7789v.py and fonts.py to realize the display of ASCII characters and Chinese characters| + +### Experimental steps + +(1) Connect the 240 * 240 display screen to the module correctly; +(2) The three py files in this directory (st7789v.py, fonts.py, example_ display_ Char. Py) to the usr directory of the module; +(3) Enter the command line of the module and execute the following commands to see the picture displayed on the display screen: + +``` +import example +example.exec('usr/example_display_char.py') +``` + + + +### Experimental results + +![Quectel_Qp_little_demo_lcd_08](media/Quectel_Qp_little_demo_lcd_08.jpg) + + + +## Use of character and picture mold tools + +### Tool introduction + +(1)Image2Lcd + +Image2lcd software is used for image modeling, which can extract monochrome and color images. + +(2)PCtoLCD2002 + +Pctolcd2002 is a character modeling software, which can generate font data of Chinese characters, English and punctuation marks. + + + +### How to mold a picture + +(1) Open image2lcd software, click [open] button and select the picture to be displayed; + +![Quectel_Qp_little_demo_lcd_09](media/Quectel_Qp_little_demo_lcd_09.png) + +(2) Select [C language array (*. C)] as the output data type, select [horizontal scanning] as the scanning mode, and select [16 bit true color] as the output gray level; + +(3) Set the maximum width and height of the picture, and the actual output size shall be subject to the bottom part of [output image: (XX, YY)] in the above figure; + +(4) Click the [save] button to get the mold data of the picture and save it in the tuple. + + + +### How to mold characters + +(1) Open pctolcd2002 software and click [mode] - [character mode (W)]; + +(2) Select font and set font size as required; + +![字符取模1](media/Quectel_Qp_little_demo_lcd_10.png) + +(3) Click the gear icon to enter the interface as shown below, select [negative code], [line by line], [forward] and [C51 format], and click OK; + +![字符取模2](media/Quectel_Qp_little_demo_lcd_11.png) + +(4) After entering the character to be molded, click generate font to get the corresponding font data, and save the font data to the dictionary according to the format in the example fonts.py file. + +## Matching code + + Download experimental materials diff --git a/docs/sbs/en/mqtt/code/mqtt_test_log.py b/docs/sbs/en/mqtt/code/mqtt_test_log.py new file mode 100644 index 0000000000000000000000000000000000000000..8ab3206b03fcaeadf9800e03a6c86089b9eb33c4 --- /dev/null +++ b/docs/sbs/en/mqtt/code/mqtt_test_log.py @@ -0,0 +1,44 @@ +from umqtt import MQTTClient +import utime +import log +import checkNet + +PROJECT_NAME = "QuecPython_MQTT_example" +PROJECT_VERSION = "1.0.0" + +checknet = checkNet.CheckNetwork(PROJECT_NAME, PROJECT_VERSION) + +# 设置日志输出级别 +log.basicConfig(level=log.INFO) +mqtt_log = log.getLogger("MQTT") + +state = 0 + + +def sub_cb(topic, msg): + global state + mqtt_log.info("Subscribe Recv: Topic={},Msg={}".format( + topic.decode(), msg.decode())) + + +if __name__ == '__main__': + utime.sleep(5) + checknet.poweron_print_once() + checknet.wait_network_connected() + c = MQTTClient("umqtt_client", "mq.tongxinmao.com", 18830) + c.set_callback(sub_cb) + c.connect() + while True: + c.subscribe(b"/public/TEST/quecpython") + mqtt_log.info( + "Connected to mq.tongxinmao.com, subscribed to /public/TEST/quecpython topic" + ) + # 发布消息 + c.publish(b"/public/TEST/quecpython", b"my name is Quecpython!") + mqtt_log.info( + "Publish topic: /public/TEST/quecpython, msg: my name is Quecpython" + ) + c.wait_msg() # 阻塞函数,监听消息 + if state == 1: + break + c.disconnect() diff --git a/docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_01.jpg b/docs/sbs/en/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_01.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_01.jpg rename to docs/sbs/en/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_01.jpg diff --git a/docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_02.jpg b/docs/sbs/en/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_02.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_02.jpg rename to docs/sbs/en/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_02.jpg diff --git a/docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_03.jpg b/docs/sbs/en/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_03.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_03.jpg rename to docs/sbs/en/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_03.jpg diff --git a/docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_04.jpg b/docs/sbs/en/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_04.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_04.jpg rename to docs/sbs/en/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_04.jpg diff --git a/docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_05.jpg b/docs/sbs/en/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_05.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_05.jpg rename to docs/sbs/en/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_05.jpg diff --git a/docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_06.jpg b/docs/sbs/en/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_06.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_06.jpg rename to docs/sbs/en/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_06.jpg diff --git a/docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_07.jpg b/docs/sbs/en/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_07.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_07.jpg rename to docs/sbs/en/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_07.jpg diff --git a/docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_08.jpg b/docs/sbs/en/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_08.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_08.jpg rename to docs/sbs/en/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_08.jpg diff --git a/docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_09.jpg b/docs/sbs/en/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_09.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_09.jpg rename to docs/sbs/en/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_09.jpg diff --git a/docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_10.jpg b/docs/sbs/en/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_10.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_10.jpg rename to docs/sbs/en/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_10.jpg diff --git a/docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_11.jpg b/docs/sbs/en/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_11.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_11.jpg rename to docs/sbs/en/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_11.jpg diff --git a/docs/sbs/en/mqtt/media/mqtt_Faq_use_001.png b/docs/sbs/en/mqtt/media/mqtt_Faq_use_001.png new file mode 100644 index 0000000000000000000000000000000000000000..0f8f1f35ea76c93c29eafb7968f0a38cb8f902f5 Binary files /dev/null and b/docs/sbs/en/mqtt/media/mqtt_Faq_use_001.png differ diff --git a/docs/sbs/en/mqtt/media/sbs_MQTT_21071401.jpg b/docs/sbs/en/mqtt/media/sbs_MQTT_21071401.jpg new file mode 100644 index 0000000000000000000000000000000000000000..95ed15504a990db411200df9cf631f7b8162171c Binary files /dev/null and b/docs/sbs/en/mqtt/media/sbs_MQTT_21071401.jpg differ diff --git a/docs/sbs/en/mqtt/media/sbs_MQTT_21071402.jpg b/docs/sbs/en/mqtt/media/sbs_MQTT_21071402.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c582ad8dc77ccef3e780238eff337f0e6f241258 Binary files /dev/null and b/docs/sbs/en/mqtt/media/sbs_MQTT_21071402.jpg differ diff --git a/docs/sbs/en/mqtt/media/sbs_MQTT_21071403.jpg b/docs/sbs/en/mqtt/media/sbs_MQTT_21071403.jpg new file mode 100644 index 0000000000000000000000000000000000000000..507c3544b2bf43a324629d2f6e528762c2a2e5e5 Binary files /dev/null and b/docs/sbs/en/mqtt/media/sbs_MQTT_21071403.jpg differ diff --git a/docs/sbs/en/mqtt/mqtt_Faq_use.md b/docs/sbs/en/mqtt/mqtt_Faq_use.md new file mode 100644 index 0000000000000000000000000000000000000000..77fe852ad0efd8b89d11710be2a4a84eb49f6932 --- /dev/null +++ b/docs/sbs/en/mqtt/mqtt_Faq_use.md @@ -0,0 +1,150 @@ +## Mqtt advanced skills + +## Document history + +**Revision record** + +|** version ** date ** author ** change statement **| +| -------- | --------- | -------- | -------------------------------- | +|1.0.0 | 2021-4-6 | don David | initial version| +|1.0.1 | 2021-4-6 | weekly column | summarize to the file system and process the corresponding parameters| +|1.0.2 | July 14, 2021 | Ye Zhiqiang | mqtt FAQs| + +## Mqtt connection status + +### Query of mqtt connection status + +ret = c.get_mqttsta() + + + + +## Mqtt short line capture exception handling + +### Mqtt disconnection is obtained by capturing exceptions, but exceptions cannot be captured after disconnection +**Answer:** +An exception will be thrown. Umqtt has handled it. The upper level try cannot catch the following exception. It will try to reconnect after disconnection, +If there is log output, no exception will be thrown directly. The following are some logs of the test (I have been sending and receiving before, and then try to reconnect after pulling out the card). +![mqtt 断线测试log截图](media/mqtt_Faq_use_001.png) + + + [mqtt Disconnection Test - Test code] (code / mqtt)_ test_ log.py) + + + + + + + +## Use of mqtt wills + +Call function set_ last_ will(); The will message must be set before connect() to be valid. + + + +retain=False + +When the retain parameter of the will is set to true, after triggering, the subscriber will receive the will message every time he subscribes. + +When the retain parameter of the will is set to false, only online subscribers will be notified once triggered. + + + +Cancel will message: + +When retain is true, the retain for publishing empty messages should also be true; When retain is false, the retain for publishing empty messages should also be false; +When the client does not call disconnect() but drops the line unexpectedly, the will message will be published; + +Deleting a retain message can publish an empty retain message, because each new retain message will overwrite the last retain message; + + + +Example code: + +```python + #Create an mqtt instance + c = MQTTClient( + client_id=CLIENT_ID, + server=SERVER, + port=PORT, + user=USER, + password=PASSWORD, + keepalive=5) #You must keep alive = 30, otherwise you can't connect + #Set message callback + c.set_callback(sub_cb) + #Set will message + c.set_last_will(topic='set_last_will', msg='set_last_will', retain=False, qos=1) + #Establish connection + c.connect() + #Subscribe to topics + c.subscribe(SUB_TOPIC.format(IMEI)) + #Release news +c.publish(PUB_ Topic. Format (IMEI), "test publish" +``` + + + +## Change to main.py, mqtt cannot connect to the server + +When the program is started automatically, the module has not come and connected to the network. + + + +```python + PROJECT_NAME = "QuecPython" + PROJECT_VERSION = "1.0.0" + + checknet = checkNet.CheckNetwork(PROJECT_NAME, PROJECT_VERSION) + checknet.poweron_print_once() + + try: + checknet.wait_network_connected() + except BaseException: + print('Not Net, Resatrting...') + utime.sleep_ms(200) + Power.powerRestart() +``` + + + +## Blocking function mqtt_ MSG (), when will it jump out + +Under normal circumstances, it will jump out when receiving the subscribed message; + +Another situation is that when the heartbeat packet time is up, the bottom layer will jump out when sending a Ping packet. + + + +## The local EMQ x communication is normal, and the communication cannot be changed to aliyun + +If the communication fails, check the IP, port, and topic of subscribe and publish; + +Note that some topics can only be published but not subscribed; + +Similarly, some topics can only subscribe, not publish; + +You can't define topics by yourself. You must define them according to the format. + + + +## How to write mqtt in code_ MSG and publish logic program + +Create two threads, one dedicated to mqtt_ MSG (), another thread dedicated to publish messages. + +When using threads, each thread is while 1: there must be a sleep() function to switch threads, otherwise other thread codes cannot be executed, and threads can be switched wherever there is a delay. + + + +## Connect to the server using mqtts certificates + +When the certificate is written in the code, it must be written in the following format + + + +![sbs_MQTT_21071401](media\sbs_MQTT_21071401.jpg) + +![sbs_MQTT_21071402](media\sbs_MQTT_21071402.jpg) + +![sbs_MQTT_21071403](media\sbs_MQTT_21071403.jpg) + + diff --git a/docs/sbs/en/mqtt/mqtt_base_how_to_use.md b/docs/sbs/en/mqtt/mqtt_base_how_to_use.md new file mode 100644 index 0000000000000000000000000000000000000000..909668a438ae002b99c0d2ff4f22e8f0667d662f --- /dev/null +++ b/docs/sbs/en/mqtt/mqtt_base_how_to_use.md @@ -0,0 +1,525 @@ +## Mqtt Application Development Guide + +### Mqtt overview + +**Introduction to mqtt** + +Mqtt is an agent-based publish / subscribe mode communication protocol, which is open, simple, lightweight and easy to implement. The biggest advantage of mqtt is that it can provide real-time and reliable message services for remote device connections with very little code and limited network bandwidth. Due to its simple specification, it is suitable for Internet of things scenarios with strict requirements on low power consumption and limited network bandwidth, such as remote sensing data, cars, smart home, smart city and medical care. + +**Mqtt design principles** + +Mqtt protocol follows the following design principles: + +1. Streamlined functions. + +2. Adopt publish / subscribe (Pub / sub) mode to facilitate message delivery. +3. Allow users to dynamically create themes and reduce operating costs. +4. Reduce the transmission volume to the minimum and improve the transmission efficiency. +5. Pay attention to factors such as low bandwidth, high latency and unstable network. +6. Support continuous session control. +7. Be inclusive of client computing power. +8. Provide service quality management. +9. There are no mandatory requirements for the type and format of transmission data, and flexibility is maintained. + +**Mqtt business scenario** + +Using mqtt protocol, the device can easily connect to the Internet of things cloud service, manage the device and process data, and finally apply to various business scenarios, as shown in the figure below: + +![](media/Quectel_Qp_mqtt_app_how_to_use_01.jpg) + +Figure 1: mqtt business scenario + +**Mqtt publish / subscribe mode** + +Publish / subscribe mode provides an alternative to traditional client server architecture. In the client server model, the client communicates directly with the endpoint. The publish / subscribe model decouples the relationship between the sending client (publisher) and the receiving client (subscriber), and they do not establish a direct relationship. The third component (agent) connects the publisher and the subscriber. The agent filters all incoming messages and distributes them correctly to the subscriber. + +The advantages of publish / subscribe mode are as follows: + +​ 1. Publishers and subscribers do not need to know each other, they just need to use the same agent. + +​ 2. The publisher and the subscriber do not need to interact, and the publisher does not have to wait for the subscriber's confirmation to cause locking. + +​ 3. Publishers and subscribers do not need to be online at the same time, and can freely choose the time to publish / receive messages. + +**Mqtt protocol principle** + +![](media/Quectel_Qp_mqtt_app_how_to_use_02.jpg) + +​ Figure 2: schematic diagram of mqtt protocol + +1. The implementation of mqtt protocol requires: client and server. + +2. There are three identities in mqtt protocol: publisher, broker and subscriber. his + +In, both the publisher and subscriber of the message are clients, the message proxy is the server, and the message publisher can be subscribers at the same time. + +3. The messages transmitted by mqtt are divided into two parts: topic and payload: + Topic can be understood as the type of message. After subscribing, the subscriber will receive the message content of the topic; + Payload, which can be understood as the content of the message, refers to the specific content to be used by the subscriber. + +**Related methods in mqtt** + +​ Mqtt defines some methods (or actions) to represent the operation on the determined resources. This resource can represent pre-existing data or dynamically generated data, depending on the implementation of the server. Generally speaking, resources refer to files or outputs on the server: + + Connect, waiting to establish a connection with the server; + Disconnect, wait for the mqtt client to complete its work, and disconnect the TCP / IP session from the server; + Subscribe and wait for the subscription to be completed; + Unsubscribe one or more subscribing servers; + Publish, the mqtt client sends a message request, and returns to the application thread after sending. + +**Mqtt topics** + +​ Mqtt classifies messages by topic. The topic is generally a string of UTF - 8, and the hierarchical relationship can be represented by the symbol "/". Themes can be used directly without creating them again. Topics can also be filtered through wildcards, where "+" is used to filter a level, and "#" is generally located after the topic, which means filtering any level of level. Examples are as follows: + +1. Building-b / floor - 5: it represents the equipment on the 5th floor of building B. +2. + / floor - 5: equipment representing the 5th floor of any building. +3. Building-b / #: represents all equipment in building B. + +remarks + +Mqtt allows wildcard subscriptions to topics, but does not allow wildcard broadcasts. + + + +**Mqtt quality of service** + +Mqtt supports three different levels of quality of service to ensure the reliability of message transmission for different scenarios. + +​ Level 0: at most once. + +​ The message sender sends it only once and will not send it again. It is used to transfer unimportant data in general scenarios. + +​ Level 1: at least once. + +​ After sending a message, if the message sender does not receive the message receiver's confirmation information, it will be sent again until the message receiver's confirmation information is received. This situation may result in duplicate messages. Generally used for log processing scenarios. + + Level 2: send only once. + +​ After sending the message, the message sender waits for the confirmation message of the message receiver. After receiving the confirmation message, the message sender deletes the message and notifies the message receiver. This will reduce concurrency or increase latency, but can be used if data loss or repeated messages are unacceptable + +Set to level 2. + + + + +## MQTT API + +**MQTTClient** + +This function is used to build an mqtt connection object. + +Function prototype + +``` +MQTTClient(client_id, server, port=0, user=None, password=None, keepalive=0, ssl=False,ssl_params={}) +``` + + + +parameter + +client_id: + +String type. The client ID is unique, or it may be an encrypted client_ ID, such as Alibaba cloud. + +server: +String type. The server address can be IP or domain name. + +port: +(optional) integer. The server port is 1883 by default, and the default port of mqtt through SSL / TLS is 8883. + +user: +(optional) string type. The user name registered on the server may also be an encrypted user name, such as Alibaba cloud. + +password: +(optional) string type. The password registered on the server may also be an encrypted password, such as Alibaba cloud. + +keepalive: +(optional) integer. Keepalive timeout value for the client. The default is 60 seconds, and the range is 60 ~ 120 seconds. + +ssl: +(optional) Boolean. Whether to enable SSL / TLS support. + +ssl_params: +(optional) string type. SSL / TLS parameters. + + + +Return value + +Mqtt object. + + + +**MQTTClient.set_callback** + +This function is used to set the callback function. + +Function prototype + +``` +MQTTClient.set_callback(callback) +``` + +parameter + +``` +callback: +Message callback function. +``` + +Return value + +None. + + + +**MQTTClient.connect** + +This function is used to establish a connection with the server. + +Function prototype + +``` +MQTTClient.connect(clean_session=True) +``` + +parameter + +clean_session: +Boolean. Optional parameter, a Boolean value that determines the client type. If true, the agent will delete the existing when it disconnects +All information about this client. If it is false, the client is a persistent client. When the client disconnects, the subscription information and queue information are displayed +Queue messages will be retained. The default is false. + +Return value + +None. + +**MQTTClient.disconnect** + +This function is used to disconnect from the server. + +Function prototype + +``` +MQTTClient.disconnect() +``` + +parameter + +None. + +Return value + +None. + + + +**MQTTClient.ping** + +This function is used to send a Ping packet to the server to detect and maintain connectivity. + + + +``` +MQTTClient.ping() +``` + +parameter + +None. + +Return value + +None. + + + +**MQTTClient.publish** + +This function is used to publish messages. + +Function prototype + +``` +MQTTClient.publish(topic,msg) +``` + +parameter + +topic: +String type. Message subject. + +msg: +String type. Data to be sent. + +Return value + +None. + + + +**MQTTClient.subscribe** + +This function is used to subscribe to mqtt topics. + +Function prototype + +``` +MQTTClient.subscribe(topic,qos) +``` + +parameter + +topic: +String type. Mqtt topic. + +msg: +String type. Mqtt message quality of service. The default is 0. You can select 0 or 1. + +Return value + +None. + +**MQTTClient.check_msg** + +This function checks whether the server is waiting to process messages. + +Function prototype + +``` +MQTTClient.check_msg() +``` + +parameter + +None. + +Return value + +None. + + + +**MQTTClient.wait_msg** + +This function is used to wait for a server message response. + +Function prototype + +``` +MQTTClient.wait_msg() +``` + +parameter + +None. + +Return value + +None. + + + +**MQTTClient.set_last_will** + +​ This function is used to set the will to be sent to the server. If the client does not call disconnect() to disconnect abnormally, a notification will be sent to the client. + +Function prototype + +``` +MQTTClient.set_last_will(topic,msg,retain=False,qos=0) +``` + +parameter + +topic: +String type. The subject of the will. + +msg: +String type. Contents of the will. + +retain: +Boolean. Retain = true. Boker will always keep messages. The default is false. + +qos: +Integer. Message service quality, ranging from 0 to 2. + +Return value + +None. + + + +## Mqtt development instructions + +**Mqtt server setup and testing** + +​ The upper computer installs mqtt server, i.e. message agent. This document takes mosquitto open source message broker software as an example. + +**Set up mqtt server** + +1. The Linux system can be installed through the following commands. +2. Windows system access https://mosquitto.org/download/ Download the appropriate version of the. Exe installation package. + +Take windows system as an example. After installation, enter the mosquitto installation directory, start the command line and execute the following commands to view +Usage of mosquitto: + +``` +mosquitto -h +``` + +![](media/Quectel_Qp_mqtt_app_how_to_use_03.jpg) + +​ Figure 3: mosquitto help information + +​ The two key parameters - C and - P in the figure above, - C is used to specify the configuration of mqtt service and - P is used to specify the service port. + +**Start mqtt server** + +​ Before starting the mqtt server, ensure that the network where the server is located can be accessed by the device. Start by typing the following command on the command line + +Mqtt service: + +``` +mosquitto -c mosquitto.conf -p 10080 –v +``` + +​ In the test phase, the configuration file can directly use the default configuration under the installation directory; The local port of this test uses 10080. + +![](media/Quectel_Qp_mqtt_app_how_to_use_04.jpg) + +​ Figure 4: mqtt server started successfully + +**Verify the validity of mqtt server** + +**Install mqtt client** + +This document takes the client of mqtt.fx as an example. visit http://mqttfx.bceapp.com , download and install the client software. + +After the installation is completed, the mqtt.fx interface is opened by default, as shown in the following figure: + +![](media/Quectel_Qp_mqtt_app_how_to_use_05.jpg) + +​ Figure 5: mqtt.fx startup interface + +**Configure mqtt client** + +​ Click the configure button in the figure above to add the mqtt connection configuration. + +​ The configuration interface adds the configuration of m2m.eclipse.org and mosquitto services by default. You can modify any configuration, mainly "broker" +Address and broker port. You can also click the plus sign in the lower left corner of the configuration interface to add a custom service connection configuration. + +​ The configuration options "general", "user credentials", "SSL / TLS", "proxy" and "LWT" can be configured according to the service +Configure according to the requirements of the device, including connection timeout, keep alive time interval, mqtt protocol version, user name / password and SSL related configuration. + +The default configuration is used in this article. + +![](media/Quectel_Qp_mqtt_app_how_to_use_06.jpg) + +​ Figure 6: mqtt connection configuration + +**Mqtt interaction test** + +1. Establish mqtt connection + +After mqtt.fx is started, enter the default interface and click the "connect" button to establish an mqtt connection. For the log printed by the mosquitto server after successful connection, please refer to the interaction between the mqtt server and the client. After the connection is successful, you can publish messages and subscribe to topics. By default, the message topics to be subscribed and published have been filled. + +![](media/Quectel_Qp_mqtt_app_how_to_use_07.jpg) + +​ Figure 7: mqtt server client interaction + +![](media/Quectel_Qp_mqtt_app_how_to_use_08.jpg) + +​ Figure 8: Publishing messages + +![](media/Quectel_Qp_mqtt_app_how_to_use_09.jpg) + +​ Figure 9: Subscription topics + + + + + + + + + + +![](media/Quectel_Qp_mqtt_app_how_to_use_10.jpg) + + + +Step 2: create the test.py file and import the umqtt module. Let's create the following generation by connecting to the website of mq.tongxinmao.com +Code: + +```python +from umqtt import MQTTClient +state = 0 +def sub_cb(topic, msg): + global state + print("subscribe recv:") + print(topic, msg) + state = 1 + +#Create an mqtt instance +c = MQTTClient("umqtt_client", "mq.tongxinmao.com", '18830') +#Set message callback +c.set_callback(sub_cb) +#Establish connection + +c.connect() +#Subscribe to topics +c.subscribe(b"/public/TEST/quecpython") +print("Connected to mq.tongxinmao.com, subscribed to /public/TEST/quecpython topic" ) +#Release news +c.publish(b"/public/TEST/quecpython", b"my name is Kingka!") +print("Publish topic: /public/TEST/quecpython, msg: my name is Quecpython") + +while True: + c.wait_msg() #Blocking function, listening for messages + if state == 1: + break + +#Close connection +c.disconnect() +``` + + + +remarks + +Mqtt authentication can also be performed by accessing the communication cat online client server: + +http://www.tongxinmao.com/txm/webmqtt.php。 + +![](media/Quectel_Qp_mqtt_app_how_to_use_11.jpg) + +​ Figure 11: Communication cat online client server + + + +Step 3: upload the test.py file to EC1 00 y-cn quecpthon development board. For detailed upload methods, please refer to +《Quectel_ QuecPython_ Basic operating instructions. + + + +Step 4: run the test.py file in the development board to see the module execution results, as shown in the following figure: + +![](media/Quectel_Qp_mqtt_app_how_to_use_11.jpg) + + +## Appendix + +Table 1: Abbreviations of terms + +|Abbreviation | full English name | full Chinese name| +| ---- | ----------------------------------- | ------------------ | +|API Application Programming Interface| +|IP | internet protocol | Internet Interconnection Protocol| +|Mqtt message queuing telemetry transport| +|SSL secure sockets layer Secure Sockets Layer| +|TLS | transport layer security | transport layer security (Protocol)| + + + diff --git a/docs/sbs/en/sbs/README.md b/docs/sbs/en/sbs/README.md new file mode 100644 index 0000000000000000000000000000000000000000..34cc0266070e98254b0a3593efb0c4bbc72735ec --- /dev/null +++ b/docs/sbs/en/sbs/README.md @@ -0,0 +1,52 @@ +# Hand to hand teaching +## Introduction + +[quecpthon basic operating instructions](/zh-cn/sbs/basic.md) + +[overview of quecpthon technology and resources](https://qpy.quectel.com/wiki/zh-cn/sbs/res/res.pdf) + +## Cloud platform + +[application development guide for quecpthon access to alicloud](/zh-cn/sbs/aliyun.md) + +[quecpthon access to Tencent cloud application development guide](/zh-cn/sbs/tencentyun.md) + +## Correspondence + +[quecpthon mqtt application development guide](/zh-cn/sbs/mqtt.md) + +[quecpthon HTTP application development guide](/zh-cn/sbs/http.md) + +[quecpthon socket application development guide](/zh-cn/sbs/socket.md) + +## System + +[instructions for reading and writing quecpthon files](/zh-cn/sbs/file.md) + +[quecpthon multithreaded application development guide](/zh-cn/sbs/thread.md) + +[instructions for using quecpthon bus](/zh-cn/sbs/bus.md) + +[quecpthon led instruction](/zh-cn/sbs/led.md) + +[instructions for using quecpthon timer](/zh-cn/sbs/timer.md) + +## Apply + +[quecpthon GPS instruction](/zh-cn/sbs/gps.md) + +[quecpthon NTP instruction](/zh-cn/sbs/ntp.md) + +[instructions for using quecpthon audio](/zh-cn/sbs/audio.md) + +[instructions for using quecpthon TTS](/zh-cn/sbs/tts.md) + +[quecpthon LCD instruction](/zh-cn/sbs/lcd.md) + +[instructions for using quecpthon record polar](/zh-cn/sbs/record.md) + +[quecpthon PWM instruction](/zh-cn/sbs/pwm.md) + +## Other + +[instructions for using quecpthon MPY cross tool](/zh-cn/sbs/mpycross.md) diff --git a/docs/sbs/en/sbs/aliyun.md b/docs/sbs/en/sbs/aliyun.md new file mode 100644 index 0000000000000000000000000000000000000000..90b370a91acd059e9d9ca5024ed962d767e6d054 --- /dev/null +++ b/docs/sbs/en/sbs/aliyun.md @@ -0,0 +1,388 @@ +## Access Alibaba cloud application development guidance + +Introduction to Alibaba cloud Internet of things platform + +Alibaba cloud's Internet of things platform provides devices with safe and reliable connection and communication capabilities, connecting massive devices downward and supporting device data collection to the cloud; The cloud API is provided upward, and the server sends commands to the device by calling the cloud API to realize remote control. The IOT platform also provides other connection management capabilities, such as device management, rule engine, security capabilities, etc., enabling various IOT scenarios and industry developers. + +Alibaba cloud IOT platform documents:< https://help.aliyun.com/product/30520.html >[。](https://help.aliyun.com/product/30520.html)开发者可以登录该网址进一步了解该物联网平台及设备接入相关知识。 + +## Explanation of key terms of Alibaba cloud Internet of things platform + +The following table briefly introduces the explanation of key terms in Alibaba cloud Internet of things platform. For details, please refer to Alibaba cloud official documents (URL: +[)](https://help.aliyun.com/document_detail/30524.html)。 + +>Table ** 1 **: Interpretation of key terms + +|Key nouns | noun interpretation | +| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +|A collection of products and equipment, usually a group of equipment with the same function. The Internet of things platform issues a globally unique productkey for each product. | +|Equipment | specific equipment belonging to a product. The Internet of things platform issues the unique certificate devicename in the product for the device. The device can be directly connected to the Internet of things platform, It can also be connected to the Internet of things platform through the gateway as a sub device. | +|Sub equipment | is also equipment in essence. The sub equipment cannot be directly connected to the Internet of things platform, It can only be connected through the gateway. | +|The gateway | can directly connect the equipment of the Internet of things platform and has the function of sub equipment management, Be able to connect to the cloud through proxy sub devices. | +|Device certificate | device certificate refers to the combination of productkey, devicename and devicesecret, which is used for device authentication and connection establishment. Productkey: the globally unique identifier issued by the Internet of things platform for the product. This parameter is very important and will be used in equipment authentication and communication, so you need to keep it well. Devicename: a user-defined or system generated device name when registering a device. It is unique in the product dimension. This parameter is very important and will be used in equipment authentication and communication, so you need to keep it well.  devicesecret: the device key issued by the Internet of things platform for the device appears in pairs with devicename. This parameter is very important and will be used in equipment certification, so you need to keep it and not disclose it| +|Productsecret | the product key issued by the Internet of things platform, usually appears in pairs with the productkey, which is used for the one type one secret authentication scheme. This parameter is very important and needs to be kept by you, No leakage. | +|One machine and one secret | each device burns its unique device certificate (productkey, devicename and devicesecret). When the device is connected to the Internet of things platform, The Internet of things platform authenticates the equipment certificate information it carries. | +|One type and one secret | all devices under the same product can burn the same productkey and productsecret. When the device sends an activation request, the Internet of things platform authenticates the productkey and productsecret it carries, passes the authentication, and issues the information required for the device to access. The device then carries this information to establish a connection with the Internet of things platform| +|Device ID ² Authentication | ID ²( Internet device ID) is a trusted identity of Internet of things devices, which has security attributes such as non tampering, non forgery and global uniqueness. Internet of things platform supports device use ID ² Conduct identity authentication. | +|Topic | topic is a UTF-8 string, which is the transmission intermediary of device publish (PUB) and subscribe (sub) messages. Publish: the device can publish messages to this topic. Subscription: the device can subscribe to this topic to get messages. | +|The rule engine creates and configures rules to realize server-side subscription Data flow and scenario linkage. | +|The object model | is a description of the functions of the device in the cloud, including the attributes, services and events of the device. The IOT platform describes the object model by defining an object description language, called TSL (i.e. thing specification language), which adopts JSON format, Developers can assemble and report device data according to TSL| + +## Alibaba cloud interface details + +**aLiYun** + +>This method is used to configure the product information and device information of Alibaba cloud IOT suite. + +-Function prototype + +aLiYun(productKey, productSecret, DeviceName, DeviceSecret) + +-Parameters + + *productKey*: + + Product identification + + *Productsecret *: product key. Optional parameter. The default value is none. + + This parameter is passed in when one machine one secret authentication scheme is used + None (cannot be an empty string); This parameter is used to pass in the real product key in the one type one secret authentication scheme. + + *deviceName*: + + Equipment name + + *Devicesecret *: device key. Optional parameter, default to + None。 This parameter is passed into none in case of one type one secret authentication scheme. + +  return value + + Return the alicloud connection object. + +**aLiYun.setMqtt** + + + +> aLiYun.setMqtt(clientID, clean_session, keepAlive) + + + + *clientID*: + + + + + + False, the client is a persistent client. When the client disconnects, the subscription information and queued messages will be retained. + + *Keepalive *: the maximum time allowed between communications. Range: 60 ~ 1200; Unit: second; Default: 300. + +-Return value + + nothing + +**aLiYun.setCallback** + +>This method is used to register callback functions. + +-Function prototype + + aLiYun.setCallback(sub_cb) + +-Parameters + + *sub_cb*: + + Callback function + +-Return value + + nothing + +**aLiYun.subscribe** + +>This method is used to subscribe to mqtt topics. + +> aLiYun.subscribe(topic,qos) + +-Parameters + + *topic*: + + Subscribed topics + + *qos*: + + Mqtt message quality of service. Default: 0. You can select 0 or 1. + +-Return value + + nothing + +**aLiYun.publish** + +>This method is used to publish messages. + +-Function prototype + + aLiYun.publish(topic,msg) + +-Parameters + + *topic*: + + Published topic + + *msg*: + + Data to be sent + +-Return value + + nothing + +**aLiYun.start** + +>This method is used to start running the connection. aLiYun.start() + +-Parameters + + nothing + +-Return value + + nothing + +## Connect to alicloud using quecpthon + +Create products and devices + +>When using Alibaba cloud Internet of things platform, you first need to create products and corresponding devices in the cloud and obtain device certificates (productkey, devicename and devicesecret). A product is equivalent to a collection of one kind of equipment, and the equipment under the same product has the same function. Burn the device certificate issued by the Internet of things platform to the device for authentication when the device is connected to the Internet of things platform. + +Step ** 1 **: +Log in to Alibaba cloud Internet of things platform console [:](https://iot.console.aliyun.com/product)[。](https://iot.console.aliyun.com/product)登陆后,依次点击“设备管理”、导航栏的“产品”开始创建产品并进行产品的参数配置。如下图所示: + +![](media/0da5c0e906c2dfef5e1066e03eddb533.jpg) + +>Figure ** 1 **: creating a product + +Step ** 2 **: +It is recommended to refer to the parameters shown in the figure below for configuration. To learn more about parameter configuration, you can visit the official address of Alibaba cloud Internet of things platform: https://help.aliyun.com/document_ detail/73728.html[。](https://help.aliyun.com/document_detail/73728.html) + +After creation, click "confirm" to save the configuration. + +![](media/f20ca6b0c04fd992473f2f7474af106c.jpg) + +>Figure ** 2 **: create product parameter configuration reference + +Step ** 3 **: +A product refers to a certain type of equipment. After creating a product, you need to create an identity for the equipment. You can create individual devices or batch devices. The following describes how to create a single device in detail. Click "equipment" and "add equipment" to start adding equipment, as shown in the figure below: + +![](media/42dbaa1445eaa8539bde9e66a7a78d59.jpg) + +>Figure ** 3 **: creating a device + +Step ** 4 **: +After the device is created successfully, the "device certificate" window will pop up automatically. You can view and copy the device certificate information, as shown in the following figure. The device certificate consists of the productkey, devicename and devicesecret of the device +Composition is an important identity authentication for the communication between the equipment and the Internet of things platform. Please keep it properly. + +![](media/d8152295b16a9524bb60da43dc35f674.jpg) + +>Figure ** 4 **: equipment certificate information + +Access Alibaba cloud Internet of things platform + +>Before accessing the Alibaba cloud Internet of things platform, please confirm that products and devices have been created on the Alibaba cloud Internet of things platform console and obtain the device certificate information (productkey, devicename) +>And devicesecret). + +Access Alibaba cloud Internet of things platform through mqtt.fx and test it + +Access Alibaba cloud Internet of things platform + +>Step ** 1 **: Download and install mqtt.fx software. + +>Step ** 2 **: open mqtt.fx +>Software, click the settings Icon! [](media/f926080e54c4ffe9aef2234c64143cdd.jpg)。 + +![](media/9aab3c579e9b1c974e24cb5ca8fa9cc8.jpg) + +>Figure ** 5 **: click the setting button + +>Step ** 3 **: +>Set connection parameters. The IOT platform currently supports two connection modes, with different mode setting parameters. For parameter settings, +>See the table below for details. + +>Table ** 2 **: connection parameter settings + +|Parameter name | input information| +| ------------ | ---------------- | +|Profile name | enter a custom name| +| Profile Type | MQTT Broker | + +>Indicates the access domain name. You should enter the access domain name of the purchased instance. Please enter the instance management page of Alibaba cloud Internet of things platform console to view the access domain name information in the instance details. + +The access domain name of the public instance is * ${yourproductkey}. IOT as mqtt. ${yourregionid}. Aliyuncs. Com *. + +> Broker Address + +-* ${yourproductkey} * should be replaced with the productkey of the product to which the device belongs (the productkey can be obtained from the device details page of the Internet of things platform console). + +-See region and availability zone, and replace * ${yourregionid} * with custom region ID. + +| Broker Port | 1883 | +| ----------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +|Client ID | fill in mqttclientid, which is used for the underlying protocol message of mqtt. Fixed format: ${ClientID} | +|| MAC address or Sn code* Securemode * is the security mode, TCP direct connection mode is set to * securemode = 3 *, and TLS direct connection is set to * securemode = 2 ** Signmethod * is the algorithm type, Hmacmd5 and hmacsha1 are supported. | +|The setting items under the general column can keep the system default, It can also be set according to specific requirements. | +|User name | consists of device name devicename, symbol (&) and product key. Fixed format: ${yourdevicename} & ${yourproductkey}. Complete example: Device & alXXXXXXXX. | +|Password | download the password generation widget. Enter< https://files.alicdn.com/tpsservice/88413c66e471bec826257781969d1bc7.zip >[solution](https://files.alicdn.com/tpsservice/88413c66e471bec826257781969d1bc7.zip)压缩下载包后,双击 *sign* 文件,即可使用。使用 Password 生成小工具的输入参数:  productKey:设备所属产品 Key。可在控制台设备详情页查看。 deviceName:设备名称。可在控制台设备详情页查看。 deviceSecret:设备密钥。可在控制台设备详情页查看。 timestamp:(可选)时间戳。 clientId:设备的 ID 信息,与 Client ID 中*${clientId}*一致。 method:选择签名算法类型,与 Client ID 中 *signmethod* 确定的加密方法一致 | + +>Remarks + +1. After entering the client ID information, do not click ** generate **. + +2. During TCP direct connection, securemode in client id = 3, and SSL / TLS information does not need to be set. + +3. When TLS is connected directly, securemode = 2 in client ID, SSL / TLS information needs to be set. + +4. When setting parameters, please ensure that there are no spaces in or before and after the parameter value. + + The setting example of connection parameter information is shown in the following figure: + +![](media/e2085274508cac96952fdfe232d0c4b4.jpg) + +>Figure ** 6 **: configuration parameters + +>Step ** 4 **: +>After setting the connection parameters, click ** OK ** to confirm the application. Then click ** connect ** to connect to Alibaba cloud Internet of things +>Platform. + +![](media/9a1039ed5ae22e349c21f6c8fcbe1dc9.jpg) + +>Figure ** 7 **: equipment details page + +Conduct data test + +Downlink data test + +>Downlink data test refers to sending messages from Alibaba cloud Internet of things platform and receiving messages on mqtt.fx +>Whether mqtt.fx is successfully connected to the Internet of things platform. + +>In the step navigation bar, click ** on mqtt: Subscribe *. + +>Step ** 2 **: enter a custom device with subscription permission +>Topic, click ** subscribe ** to subscribe to the topic, as shown in the figure below. + +![](media/20ba8885738df4172d61acebdcf0aa43.jpg) + +>Figure ** 8 **: subscribe to a custom ** topic** + +![](media/d516adcc620700e25a229ebfc3dc33fe.jpg) + +Figure ** 9 **: Custom ** topic** + +>Step ** 3 **: after the subscription is successful, the topic will be displayed in the list, as shown in the following figure: + +![](media/6d3f940f6bbc0f8bffc344aace5b8de9.jpg) + +>Figure ** 10 **: Subscription succeeded + + + +![](media/9a0a7aa791766b583716d7c2cff312d5.jpg) + +>Figure ** 11 **: information released by Internet of things platform + +>Step ** 5 **: log in to mqtt.fx +>Software to check whether the message entered in the previous step is received, as shown in the figure below: + +![](media/90a8a0a1f6234753ecd29e7e2132f4ce.jpg) + +>Figure ** 12 **: the client receives the Internet of things platform message + +Uplink data test + +Uplink data test refers to sending a message on mqtt.fx, viewing the device log through the Internet of things platform, and testing whether the connection between mqtt.fx and the Internet of things platform is successful. + +>Step ** 1 **: on mqtt.fx, click ** publish ** in the navigation bar. + +>Step ** 2 **: enter a topic for which the device has publishing permission and the message content to be sent, and click ** publish ** to push a message to this topic. As shown in the figure below. + +![](media/6a9b5bd82fc31d7fbb8a885cc24c3543.jpg) + +>Figure ** 13 **: publishing data to the Internet of things platform + +>Step ** 3 **: +>On the Internet of things platform console, click "monitoring operation and maintenance", "log service" and "cloud operation log" to view the cloud message of the device. + +![](media/6b0cd9b99e274453b1fcdf0961b5217b.jpg) + +>Figure ** 14 **: viewing message content + +Use quecpthon to access Alibaba cloud Internet of things platform + +>Run the following code on ec100y-cn. See quectel for details_ QuecPython_ Basic operating instructions. + +```python + from aLiYun import aLiYun + import utime + productKey = "a1b2gBFGcLF" #Product identification + productSecret = None #Product key (one machine one secret authentication. This parameter is passed into none) + DeviceName = "smartLight" #Equipment name + DeviceSecret = "78a3407e7d43b445cd2dd895cec50ffa" #Device key (one type one secret authentication. This parameter is passed into none) + #Create aliyun connection object + ali = aLiYun(productKey, productSecret, DeviceName, DeviceSecret) #Set mqtt connection properties + clientID = "12345" #Custom characters (no more than 64) + ali.setMqtt(clientID, clean_session=False, keepAlive=300) #Callback function + def sub_cb(topic, msg): + print("subscribe recv:") + print(topic, msg) + #Set callback function + ali.setCallback(sub_cb) + topic = "/a1b2gBFGcLF/smartLight/user/get" #theme + #Subscribe to topics + ali.subscribe(topic) + topicP="/a1b2gBFGcLF/smartLight/user/update" #Release news + ali.publish(topic, "hell world") #function + ali.start() + utime.sleep(2) +``` + +>The running results of the code are as follows: + +The uplink device views the log from the Alibaba cloud Internet of things platform, as shown in the following figure: + +![](media/c542639b55ad51c52e8a0036d1ca25eb.jpg) + +Figure ** 15 **: viewing message content + +The cloud publishes messages, and the device is on * sub_ CB * received in the callback function, as shown in the following figure: + +![](media/e4c3f24d1835777199a0d86d71bc4dd6.jpg) + +Figure ** 16 **: sending messages + +![](media/70658f75cc3656d9613fb7be881895ab.jpg) + +## Appendix a reference documents and abbreviations of terms + +>Reference documents + +Quectel_ QuecPython_ Basic operation instructions quecpthon upload and download file instructions + +>Table ** 4 **: Abbreviations of terms + +|Term | full English name | full Chinese name || +| ---- | --------------------------------------------------------------------- | ------------------------ | + + + + + +|Mqtt message queuing telemetry transport| +|Sn | serial number | serial number| +|TCP transmission control protocol| +|TLS | transport layer security | transport layer security (Protocol)| +|TSL | thing specification language | object model| + diff --git a/docs/sbs/en/sbs/basic.md b/docs/sbs/en/sbs/basic.md new file mode 100644 index 0000000000000000000000000000000000000000..7de0a31c9954c8e2d8e16898fc3944cf3e83a561 --- /dev/null +++ b/docs/sbs/en/sbs/basic.md @@ -0,0 +1,121 @@ +### QuecPython basic operation instructions + +This article mainly introduces the basic operations of quecpthon, including file system and instruction execution. In quecpthon, the main serial port is used as the instruction and data receiving channel, and all operations are completed through the main serial port. + +Applicable modules: + +-Ec100y-cn (this paper takes this module as an example) + +- EC600S-CN + +#### System startup + +After quecpthon is started, the interactive interpreter will be started on the main serial port, similar to the Linux shell. Through the interactive interpreter, users can execute commands in real time and view the returned results. + +![](media/0f627ce2f6c2f679cd92c7685c3cf148.jpg) + +Interactive interpreter + +Of which: + +-Execute ** help (obj) ** command to view help; + +-Execute the ** dir (obj) ** instruction to view the detailed methods provided by the module; + +-Execute the ** help ('modules') ** command to view the currently supported class libraries. During system startup, in addition to hardware resource initialization, partition mounting and initialization script operation will also be performed. The startup script mainly includes two parts: + +-* boot. Py *: resource initialization, such as attaching partitions during startup, and the script is frozen in the factory firmware; + +-* main. Py *: user initialization script, which is executed after system initialization. + +#### File system + +In quecpthon, 5 MB is divided +As a user partition, users can store some configuration, script and other files in this partition. When the system starts, the partition will be automatically mounted in the '/' directory. + +>In quecpthon, a class library * UOS * for accessing the file system is provided, which can be used to operate and access the file system. +>The following code example shows how to create files, write contents and read contents in the current directory. + +``` +import uos # create a file +f=open('test.txt','w') +f.write('hello quecpython!\n') +f.write('123456789abcdefg!\n') +f.close() # read a file +f=open('test.txt', 'r') +print(f.readline()) +print(f.readline()) +f.close() +``` + + + +>To facilitate operation, you can use the * qpycom. Exe * tool for routine file system operation. + +Script Download + +Step ** 1 **: unzip * qpycom. Zip * under the * tools * directory in the SDK package, obtain * qpycom. Exe *, and double-click to run; + +Step ** 2 **: enter the "download" tab, click the "create" button to create a user project according to requirements; + +Step ** 3 **: click the "** + **" button to select the script to be downloaded to the module; + +Step ** 4 **: click the inverted triangle button at the bottom right of the interface to switch to the "download script" mode; + +Step ** 5 **: click ** Download FW ** to download the script; + +Step ** 6 **: when the progress bar displays "** 100% **", it indicates that the download is complete. You can enter the "file" tab to view the file details in the module. + +![](media/5515ac10e5070dd1b9bfd61c7a7022cf.jpg) + +>** 2 **: script Download Interface + +see file + +Run * qpycom. Exe * tool and click "view" --> "file browsing" to realize Python connection between local and module +The operation interface and buttons for uploading, viewing, adding and deleting files are shown in the figure below. + +![](media/277228479c7256251a776b75160dfcec.jpg) + +Upload, view, add and delete ** Python ** files with local modules + +Command interaction + +Run * qpycom. Exe * tool, click "view" --> "interactive command line" to enter the main interactive interface. In the interactive interface, you can manually input and interact with the module through the interactive window. The description of the main interactive interface is shown in the figure. + +![](media/c240cbfd8fcee183b8644a9a41320d34.jpg) + +Interactive interface description + +>** 4 ** execute script + +>Step ** 1 **: unzip * qpycom. Zip * under the * tools * directory in the SDK package, obtain * qpycom. Exe *, and double-click to run; +>Step ** 2 **: enter the "file" tab; +>Step ** 3 **: click the button shown in the red box below to execute the script file. + +![](media/8431414d399d975a4c26434403a514bd.jpg) + +Execute script interface + +#### Bytecode compilation + +The MPY - Cross tool improves the execution speed of Python script and the security code for the user. Bytecode can be solidified in firmware or stored in file system for script. For details, please refer to + +> 《Quectel_ QuecPython_ MPY cross User Guide + +>The commands for compiling Python scripts into bytecode are: + +> mpy-cross.exe -o test.mpy -s test.py -march=armv7m test.py + +#### Appendix ** a ** abbreviations + +Table ** 1 **: Abbreviations of terms + +|Abbreviation | full English name | full Chinese name| +| ---- | ------------------------------------------- | ------------------ | +|UART universal asynchronous receiver / transmitter universal asynchronous transceiver| + + + + + diff --git a/docs/sbs/en/sbs/bus.md b/docs/sbs/en/sbs/bus.md new file mode 100644 index 0000000000000000000000000000000000000000..5c05a93252d84e3de6206a726b86033eccc6649e --- /dev/null +++ b/docs/sbs/en/sbs/bus.md @@ -0,0 +1,126 @@ +## Revision history +|Version | date | author | change statement| +|------|------|------|------| +|1.0 | 2021-4-1 | gary.zhou | First Edition| + +## Bus instruction + +This paper mainly introduces the use of ADC, UART, SPI and I2C. + +## ADC digital to analog conversion + +The digital signal and analog signal converter ADC is called digital to analog converter. The CPU itself is digital, but some external variables are analog, so it is necessary to use digital technology to process the external analog physical quantities. Analog signal is a continuous signal. In real life, time, voltage and height are analog signals, and the response in mathematics is the value of infinite subdivision. + +Digital to analog conversion is to sample analog signals according to a certain accuracy and turn them into a limited number of digital quantities. This process is digital to analog conversion. After digitization, analog quantities can be described by numbers in the computer. It is the basis of computer technology. All computer involved in operation are digital quantities. If analog quantities are involved in calculation, It is necessary to use digital to analog converter to convert analog quantity into digital quantity to participate in operation. Similarly, digital signal can also be converted into analog signal by using devices with integral and differential effects. + +The ADC input pin in the quecpthon development board is shown in the figure below. + +![Quectel_QuecPython_bus_Guidance_for_use_015.png](media/Quectel_QuecPython_bus_Guidance_for_use_015.png) + +​ Figure ** 1 **: ** ADC ** input pin + +Connect the gpio1 serial port with the ADC serial port, read the channel voltage value through the * misc * module ADC class in quecpthon, and set the pin pin level through the * pin. Write (value) * method in the * Pin * class of the * machine * module. See quectel for detailed usage methods and API interface instructions_ QuecPython_ Class library API description. + +```python +from machine import Pin +from misc import ADC +adc = ADC +adc.open() + +gpio1 = Pin(Pin.GPIO1, Pin.OUT, Pin.PULL_DISABLE, 0) +gpio1.read()#Get the current status of GPIO +gpio1.write(1) #Set gpio1 output high +adc.read(ADC.ADC0) +gpio1.write(0) #Set gpio1 output low +adc.read(ADC.ADC0) +``` + +As a result of the command line operation, the ADC channel voltage becomes 1.8 V, as shown in the figure: + +![Quectel_QuecPython_bus_Guidance_for_use_019.png](media/Quectel_QuecPython_bus_Guidance_for_use_019.png) + +​ Figure ** 2 **: ** ADC ** channel voltage change + +## UART + +UART is a serial asynchronous transceiver protocol, which is widely used. The working principle of UART is to transmit the binary bits of data bit by bit. On the signal line of UART communication protocol, the high level represents * 1 * and the low level represents * 0 *. Of course, when two devices use UART serial port for communication, they must first agree on the transmission rate and some data bits. + +The hardware connection is relatively simple, and only 3 lines are required. Note that if the UART level ranges of the two devices are inconsistent during connection, please make level conversion before connecting. + +-TX: transmitting data terminal, to be connected to RX of the opposite equipment, +-Rx: receiving data terminal, to be connected to TX of opposite equipment, +-GND: ensure that the two equipment are grounded together and have a unified reference plane. + +![Quectel_QuecPython_bus_Guidance_for_use_020.png](media/Quectel_QuecPython_bus_Guidance_for_use_020.png) + +​ Figure ** 3 **: ** UART ** hardware connection + +When using UART serial port to transmit data on ec100y-cn module, it is necessary to connect TX at the sending data end to RX at the opposite side and Rx at the receiving data end to TX at the opposite side. In quecpthon, the serial port data transmission function can be realized through UART class of machine module. See quectel for detailed usage method and API interface description_ QuecPython_ Class library API description. + +![Quectel_QuecPython_bus_Guidance_for_use_021.png](media/Quectel_QuecPython_bus_Guidance_for_use_021.png) + +​ Figure ** 4 **: ** UART API ** example code + +## SPI communication + +SPI protocol is a serial peripheral interface and a high-speed full duplex communication bus. SPI bus includes 4 buses, namely SS, SCK, MoSi and miso. + +(1) SS: chip select signal line. When multiple SPI devices are connected to MCU, the chip select signal line of each device is connected to a separate pin of MCU, while other SCK, MoSi and miso lines are multiple devices connected in parallel to the same SPI bus, and the low level is effective. + +(2) SCK: clock signal line, generated by the main communication equipment. Different devices support different clock frequencies. For example, the maximum SPI clock frequency of STM32 is f PCLK / 2. + +(3) Mosi: master device output / slave device input pin. The data of the host is output from this signal line, and the slave reads the data from this signal line, that is, the direction of the data on this line is from the host to the slave. + +(4) Miso: master input / slave output pin. The host reads data from this signal line, and the data of the slave is output by this signal line, that is, the direction of the data on this line is from the slave to the host. + +![Quectel_QuecPython_bus_Guidance_for_use_022.png](media/Quectel_QuecPython_bus_Guidance_for_use_022.png) + + + +​ Figure ** 5 **: ** spi ** hardware connection + + + + + + + + + +I2C belongs to serial communication. The data is transmitted serially and sequentially on the SDA line in bit. The master and slave devices work at the same clock frequency. The clock is synchronized through the SCL line. I2C transmits level signals without high speed. The distance between the two sides of communication is very close, so there is no need for differential signals to resist interference, I2C is usually used for communication between two ICs on the same board, with small amount of data and low speed. + +![Quectel_QuecPython_bus_Guidance_for_use_025.png](media/Quectel_QuecPython_bus_Guidance_for_use_025.png) + +​ Figure ** 6 **: ** I2C ** hardware connection + +The following data take I2C connected light sensor as an example. + +![Quectel_QuecPython_bus_Guidance_for_use_026.png](media/Quectel_QuecPython_bus_Guidance_for_use_026.png) + +![Quectel_QuecPython_bus_Guidance_for_use_027.png](media/Quectel_QuecPython_bus_Guidance_for_use_027.png) + +​ Figure ** 7 **: ** I2C ** connect the light sensor + +## Appendix abbreviations of terms + +Table ** 1 **: Abbreviations of terms + +|ADC analog to digital converter| +| ---- | ------------------------------------------- | ---------------------- | +|API Application Programming Interface| +|CPU central processing unit| +|UART universal asynchronous receiver / transmitter universal asynchronous transceiver| +|GND ground| +|IC integrated circuit| +|I2C | inter integrated circuit | bidirectional two-wire synchronous serial bus| +|LCD | liquid crystal display | liquid crystal display| +|MCU microprogrammed control unit| +|Miso master in slave out| +|MoSi | master out slave in | master output slave input| +|RX | receive | receive| +|TX | transmit | send| +|SCK | serial clock | clock signal line| +|SCL | serial clock line | serial clock line| +|SDA serial data line| +|SPI | serial peripheral interface | serial peripheral interface| +|SS | slave select | chip select signal line| diff --git a/docs/sbs/en/sbs/file.md b/docs/sbs/en/sbs/file.md new file mode 100644 index 0000000000000000000000000000000000000000..7bd66ba33f2e1047acc5677a249efeda8cc8d607 --- /dev/null +++ b/docs/sbs/en/sbs/file.md @@ -0,0 +1,203 @@ +## Revision history +|Version | date | author | change statement| +|------|------|------|------| +|1.0 | 2021-3-31 | gary.zhou | First Edition| + +## Document reading and writing instructions + +This article mainly introduces several ways of reading and writing quecpthon files. + +## Basic concepts of documents + +Files save and store data on a long-term storage device, which mainly includes hard disk, USB flash disk, mobile hard disk, optical disk, etc. + +## File storage method + +Documents are mainly stored in text and binary. + +### Text files, such as Python's source program: + +-You can use text editing software to view; + +-It is essentially a binary file. + +### Binary files, such as picture files, audio files, video files: + +-The saved content cannot be read directly, but is provided to other software for use; +-Binary files cannot be viewed using text editing software. + +## Basic operation of files + +For specific API details, please refer to [quecpthon standard library UIO](https://python.quectel.com/wiki/#/zh-cn/api/pythonStdlib?id=uio-输入输出流)。 + +## File operation function + +Table ** 2 **: file operation functions + +|Function description method| +| ----- | ------------------------------ | ------------------------------ | +|Open | opens the file and returns the file operation object | is responsible for opening the file and returning the file object| +|Read | read the contents of the file into memory | it needs to be called through the file object| +|Write | write the specified content to the file | it needs to be called through the file object| +|Close | close the file | it needs to be called through the file object| + + + +## Operation files and directories + +Connect the ec600s-cn quecpthon development board to the computer. See [quectel] for the operation method after connection_ QuecPython_ Basic operating instructions](https://python.quectel.com/doc/doc/sbs/zh/index.html)。 + +![QuecPytgon_sbs_file_01.png](media/QuecPytgon_sbs_file_01.png) + +Figure ** 1 **: ** connection between ec600s-cn quecpthon ** development board and computer + +### Open file as read-only + +Step 1: create * test. Py *, * test. TXT * files, import the * UIO * module in quecpthon in the * test. Py * file, and enter "Hello Python" in the * test. TXT * file. + +-Import the * UIO * module in quecpthon in the T * est. Py * file: + +```python +import uio + +#Open the test.txt file as read-only +fd = uio.open("usr/test.txt", mode='r') +#Read file contents +text = fd.read() +print(text) +#Close file +fd.close() +``` + +-Enter "Hello Python" in the * test. TXT * file: + +![QuecPytgon_sbs_file_02.png](media/QuecPytgon_sbs_file_02.png) + +Figure ** 2 **: enter ** "Hello Python" in ** test. TXT ** file** + +Step 2: upload the * test. Py * file and * test. TXT * file to the ec600s-cn quecpthon development board respectively. See [quectel] for the upload method_ QuecPython_ Basic operating instructions](https://python.quectel.com/doc/doc/sbs/zh/index.html)。 + +Step 3: read the file operation results + +![QuecPytgon_sbs_file_03.png](media/QuecPytgon_sbs_file_03.png) + +Figure ** 3 **: read file operation results + +### Open file write only + +Step 1: create a * test. Py * file and a blank * test. TXT * file, and import the UIO module in quecpthon into the * test. Py * file +Block, and write the following code: + +```python +import uio + +#Open the test.txt file in write only mode +fd = uio.open("usr/test.txt", mode='w') +#Write content to file +fd.write("HELLO PYTHON") +#Close file +fd.close() +``` + +Step 2: upload the * test. Py * file and * test. TXT * file to the ec600s-cn quecpthon development board respectively. + +Step 3: refer to 5.1 to run the read-only file mode to display the file, and the write result can be obtained. + +![QuecPytgon_sbs_file_04.png](media/QuecPytgon_sbs_file_04.png) + +Figure ** 4 **: write file operation results + +### Open file in write only append mode + +Step 1: create * text. Py *, * text. TXT * files, import the * UIO * module in quecpthon in the * test. Py * file, and enter "Hello Python" in the * test. TXT * file. + +-Import the * UIO * module in quecpthon in the T * est. Py * file: + +```python +import uio + +#Open the text.txt file as an append +fd = uio.open("usr/text.txt", mode='a') +#Append write content to file +fd.write("Hello Quectel") +#Close file +fd.close() + +#Open in read-only mode to see the appended results +fd = uio.open("usr/text.txt", mode='r') +#Read file contents +text = fd.read() +print(text) +#Close file +fd.close() +``` +-Enter "Hello Python" in the * test. TXT * file: + +![QuecPytgon_sbs_file_08.png](media/QuecPytgon_sbs_file_08.png) +Figure ** 5 **: enter ** "Hello quecpthon" in ** test. TXT ** file** + +Step 2: upload the * text. Py * file and * text. TXT * file to the ec600s-cn quecpthon development board respectively. + +Step 3: obtain the append result. + +![QuecPytgon_sbs_file_09.png](media/QuecPytgon_sbs_file_09.png) + +### Using UOS module +For specific API details, please refer to [quecpthon standard library UOS](https://python.quectel.com/wiki/#/zh-cn/api/pythonStdlib?id=uos-基本系统服务)。 + +#### Lists the current file list + +![QuecPytgon_sbs_file_05.png](media/QuecPytgon_sbs_file_05.png) + +Figure ** 6 **: list of current files + +#### New directory + +![QuecPytgon_sbs_file_05.png](media/QuecPytgon_sbs_file_05.png) + +Figure ** 7 **: new directory + +#### Delete directory + +![QuecPytgon_sbs_file_06.png](media/QuecPytgon_sbs_file_06.png) + +Figure ** 8 **: delete directory + +**Remarks **: APN_ Cfg.json is the default script file. + + + + + +```python +import gc +import uos + +res = uos.statvfs("/usr") +res = list(res) +Print ('Get file system status information: ', RES) +print('f_ Bsize – file system block size in bytes: ', res [0]) +print('f_ Bfree – number of available blocks: ', res [3]) +Print ('total space left {} bytes'. Format (RES [0] * res [3])) +Print ('total space left {} MB '. Format ((RES [0] * res [3]) / 1024 / 1024)) + +mem = gc.mem_free() +Print ('remaining RAM space: {} KB '. Format (MEM / 1024)) +``` +-** code running results** + +![QuecPytgon_sbs_file_10.png](media/QuecPytgon_sbs_file_10.png) + + Figure ** 9 **: obtaining ROM and ram information + +#### Get file read / write speed + +The reading and writing speed of the document is to be supplemented by internal research, and there is no such data for the time being. + +### Appendix abbreviations of terms + +Table ** 3 **: Abbreviations of terms + +|Abbreviation | full English name | full Chinese name| +| ---- | --------------------------------- | ---------------- | +|API Application Programming Interface| diff --git a/docs/sbs/en/sbs/gps.md b/docs/sbs/en/sbs/gps.md new file mode 100644 index 0000000000000000000000000000000000000000..db886b573e99546e5cac051ef7240ff394c8bb1f --- /dev/null +++ b/docs/sbs/en/sbs/gps.md @@ -0,0 +1,145 @@ +### GPS guidance + +#### GPS overview + +Use GPS positioning satellites to conduct real-time [positioning] all over the world(https://baike.baidu.com/item/%E5%AE%9A%E4%BD%8D)、[导航](https://baike.baidu.com/item/%E5%AF%BC%E8%88%AA)的系统,称为全球卫星定位系统,简称GPS。NEMA-0183,是[GPS接收机](https://baike.baidu.com/item/GPS%E6%8E%A5%E6%94%B6%E6%9C%BA/3475821)应当遵守的标准协议,也是目前[GPS](https://baike.baidu.com/item/GPS/214654)接收机上使用最广泛的协议,大多数常见的GPS接收机、GPS数据处理软件、[导航软件](https://baike.baidu.com/item/%E5%AF%BC%E8%88%AA%E8%BD%AF%E4%BB%B6/1401586)都遵守或者至少兼容这个协议。GPS现已被广泛应用于[交通](https://baike.baidu.com/item/%E4%BA%A4%E9%80%9A/30183)、[测绘](https://baike.baidu.com/item/%E6%B5%8B%E7%BB%98/2271120)等许多行业。GPS的所有应用领域,都是基于定位、或从定位延伸出去的,主要包括:运动导航,轨迹记录、大地测量、周边信息查询等。 + +#### GPS module usage process + +**Preparatory work** + +**Step 1: ** first prepare the ec100y-cn development board and l80-r GPS module, and connect the l80-r GPS module with the development board. Note that it should be in an outdoor environment to receive GPS signals. As shown in the figure below: + + +![](media/1.png) + +The functions of l80-r GPS module are shown in the figure below: + + +![](media/2.png) + +**Step 2: ** connect the development board through xshell tool and enter the interaction page. It can be seen from the module function diagram above * GPS_ The serial port on the development board corresponding to the en * pin is gpio5, so the GPS function is started through gpio5. + +The execution code is as follows: + +![](media/3.png) + +**Step 3: ** after executing the above code, you can see that the GPS indicator of the module is always on. Similarly, you can also light the led by setting the voltage of gpio1. + +#### Data processing + +**Step 1: ** after enabling the GPS function of the module, the GPS data will pass through the GPS of the module_ Send the TXD serial port to the development board, and then output the data through the data transmission function of UART serial port of machine module of ec100y-cn quecpthon. The code is shown in the following figure: + +![](media/4.png) + +For the detailed API interface description of the machine module, please refer to the document quectel quecphon class library API description. + + + +**Step 2: ** then, process the data format defined by the received NMEA-0183 protocol. The statement to be processed here is $gngga. + +For example: $gngga, 092204.9994250.5589, s, 14718.5084, e, 1,04,24.4,19.7, m,,,, 0000 * 1F + +Field 0: $gpgga, statement ID, indicating that the statement is global positioning system fix data + +Field 1: UTC time, hhmmss.sss, hour, minute and second format + +Field 2: latitude, ddmm.mmmm, degree division format (if the leading digits are insufficient, supplement 0) + +Field 3: latitude n (north latitude) or s (south latitude) + +Field 4: longitude, dddmm.mmmm, degree division format (if the leading digits are insufficient, supplement 0) + +Field 5: longitude e e (east longitude) or w (west longitude) + +Field 6: GPS status, 0 = no positioning, 1 = non differential positioning, 2 = differential positioning, 3 = invalid PPS, 6 = estimating + +Field 7: number of satellites in use (00 ~ 12) (fill in 0 if the leading digits are insufficient) + +Field 8: hdop horizontal accuracy factor (0.5 ~ 99.9) + +Field 9: altitude (- 9999.9 ~ 99999.9) + +Field 10: height of earth ellipsoid relative to geoid + +Field 11: differential time (the number of seconds since the last received differential signal, which will be empty if it is not differential positioning) + +Field 12: differential station ID number (0000 ~ 1023) (if the leading digits are insufficient, fill in 0. If it is not differential positioning, it will be empty) + +Field 13: check value + + + +**Step 3: ** finally, run the following code to obtain the time and latitude in the GPS information. By continuously obtaining the time and latitude, you can track the position in real time. + +Please refer to the document quectel for detailed operation methods_ QuecPython_ Basic operating instructions. + + + +```python +from machine import UART +import utime +import modem +import _thread +uart = UART(2,115200,8,0,1,0) +def gngga(): +while True: +#Get current RTC time +time = utime.localtime( ) +#Get device Imet +imei = modem.getDevImei( ) +if uart.any() > 0: +buf = uart.read(uart.any()) +buf = str(buf,"utf8" ) +try : +gngga1 = buf.split("$GNGGA,")[1].split("\r\n" )[0].split(",") +#UTC time, hhmmss.sss, hour, minute and second format +time_gps = gngga1[0] +#The latitude is ddmm.mmmm, and if the leading digits of the degree division format are insufficient, 0 shall be supplemented +_latitude = float(gngga1[1]) +#Longitude dddmm.mmmm, if the leading digits of degree division format are insufficient, 0 shall be supplemented +_longitude = float(gngga1[3]) +#UTC time conversion +_Clock = int(time[0:2]) +_Minute = time[2:4] +_Second = time[4:6] +_Clock =_Clock + 8 +#Prevent more than 24 hours +if (_Clock >= 24): +_Clock = _Clock % 24 +#Final acquisition time +Effect_time = str(_clock) + ':' +_Minute + ':' +_Second +#Finally get the latitude +Effect_latitude = int(_latitude / 100)+ ((_latitude % 100) / 60) +#Finally get longitude +Effect_longitude = int(_longitude / 100) +((_longitude % 100)/ 60) +Print ('current time: ', time) +Print ('gps time: ', effect_ time) +Print ('device Imet ', IMEI) +print(gngga1[2],'',str(Effect_latitude )) +print(gngga1[4],'',str(Effect_longitude )) + +utime.sleep(2) +except: +Print ('incorrect data format or damaged data ') +continue +def run(): +_thread.start_new_thread(gngga, ()) + +run() +``` + + + +#### Appendix + +Table 1: Abbreviations of terms + +|** abbreviation *** full English name *** full Chinese name **| +| -------- | ---------------------------------- | -------------------- | +|API Application Programming Interface| +|GPS | global positioning system | global positioning system| +|GPIO | general purpose input / output | general purpose input / output| +|GGA global positioning system fix data| +|Hdop | horizontal differentiation of precision | horizontal precision factor| +|LED light emitting diode| diff --git a/docs/sbs/en/sbs/http.md b/docs/sbs/en/sbs/http.md new file mode 100644 index 0000000000000000000000000000000000000000..358cfd0453c02b4bf931dac0e25681cea8e997b4 --- /dev/null +++ b/docs/sbs/en/sbs/http.md @@ -0,0 +1,275 @@ +## Revision history +|Version | date | author | change statement| +|------|------|------|------| +|1.0 | 2021-3-29 | gary.zhou | First Edition| + +## HTTP client development + +Through the understanding of this article, readers can learn the basic operation of HTTP interface. + +## HTTP protocol Foundation +### HTTP protocol + +HTTP protocol is a transfer protocol used to transfer hypertext from the world wide web server to the local browser. The application layer protocol based on TCP does not care about the details of data transmission. HTTP (Hypertext Transfer Protocol) is a stateless application layer protocol based on request and response mode. Only by following the unified HTTP request format can the server correctly parse the requests sent by different clients. Similarly, the server follows the unified response format, The client can correctly parse the responses sent by different websites. + +![Client与Server通信](media/QuecPytgon_sbs_http_08.png) + +## HTTP request + +An HTTP request consists of a request line, a request header, an empty line, and a request body. + +![HTTP请求构成](media/30dd898d830b27416fd3b691ae64e3dd.png) + +### Request line + +The request line consists of request method + address + protocol version. + +-Common request methods include get, post, put, delete and head; + +-Address: the resource path to be obtained by the client; + + + + + + + + + + + +-Content length: the length of data sent to the HTTP server; + +-Content type: the data type of the parameter; + +-Cookie: send the value of the cookie to the HTTP server; + +-Accept charset: character set acceptable to the browser; + +-Accept language: the language acceptable to the browser; + +-Accept: the media type acceptable to the browser. + +### Request body + +The request body carries the request parameters. + +- application/json:{"name":"value","name1":"value2”}; + +- application/x-www-form-addressencoded: name1=value1&name2=value2; + +-Multipart / from data: in tabular form; + +- text/xml; + +- content-type:octets/stream。 + +## HTTP response + +HTTP response consists of status line, response header, blank line and response body. + +![HTTP响应构成](media/800f014c0ddfdeeef025fd803aa23697.png) + +### Status line + +The status line consists of HTTP version number + response status code + status description. + +The response status codes are 1XX, 2XX, 3xx, 4xx and 5xx. + +-1XX: prompt - indicates that the request has been successfully received and continues to be processed; + +-2XX: successful - indicates that the request has been successfully received, understood and accepted; + +-3xx: redirection - further processing is required to complete the request; + +-4xx: client error - the request has syntax error or the request cannot be implemented; + +-5xx: server side error - the server failed to implement a legal request response header. + +### Response header + +The response header corresponds to the request header, which is some additional instructions of the server for the response. + +### Responder + +For the real response data, that is, the HTML source code of the web page. + +## address + +Address is the unified resource location mark of WWW, which refers to the network address. + +Address format: https://host:port/path?xxx=aaa&ooo=bbb + +Of which: + +-Http / HTTPS: This is the protocol type; + +-Host: IP address or domain name of the server; + +-Port: the port of the HTTP server. The default port is 80; + +-Path: the path to access resources; + +-In address? This symbol is a dividing line, which is used to distinguish the path before the question mark and the parameter after the question mark; + +-Address params: after the question mark is the request parameter, format: XXX = AAA. Multiple parameters are connected with the & symbol. + +## HTTP protocol request method + +HTTP 1.0 defines three request methods: get, post and head. HTTP 1.1 adds five request methods: options, put, delete, trace and connect. + +-Get: request the specified page information and return the entity body; + +-Post: submit a data processing request to the specified resource, and the data is included in the request body; + +-Head: there is no specific content in the returned response, which is used to obtain the header; + +-Options: returns the HTTP request method supported by the server for specific resources. You can also send '*' to the web server + To test the functionality of the server; + +-Put: upload the latest content to the specified resource location; + +-Delete: request the server to delete the resource identified by the request address; + +-Trace: echo the request received by the server, which is mainly used for testing or diagnosis; + +-Connect: * HTTP 1.1 * protocol is reserved for proxy servers that can change the connection to pipeline mode. + +## HTTP interface + +Please refer to [quecpthon request HTTP] for specific API interface details(https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonThirdlib?id=request-http) + + +## Reponse class method description + +response =request.get(address) + +|** method ** |** description **| +| ---------------- | --------------------------------------- | +|Response.content | returns the content of the response, in bytes. If you want to get pictures and files, you can get them through it| +|Response.text | returns the content of the response in the form of text, encoded as Unicode. If you want to get the text, you can get it through it. Since response.text is an iterator, you need to use for to access the content| +|Response. Json() | return the JSON encoded content of the response and convert it to dict type| +|Response. Close() | close the socket| + +## Example + +Connect the quecpthon development board to the computer. See [quectel] for the operation method after connection_ QuecPython_ Basic operating instructions](https://python.quectel.com/doc/doc/sbs/zh/index.html)。 + +After the development board is connected to the computer, create a * test. Py * file, import the * request * module of quecpthon, and create HTTP get / put / post / delete and other request codes respectively. After writing, upload the file to the development board and run the * test. Py * file. For details, see [quercetel]_ QuecPython_ Basic operating instructions](https://python.quectel.com/doc/doc/sbs/zh/index.html)。示例代码及运行结果详见如下章节。 + +![开发板与电脑连接](media/QuecPytgon_sbs_http_01.png) + +### Request post + +-** sample code** + +```python +import request +import ujson + +address = "http://httpbin.org/post" +data = {"key1": "value1", "key2": "value2", "key3": "value3"} +###Post request +response = request.post(address, data=ujson.dumps(data)) +print(response.json()) +``` + +-** code running results** + +![](media/QuecPytgon_sbs_http_02.png) + +### Get request + +-** sample code** + +```python +import request + +address = "http://httpbin.org/get" +###Get request +response = request.get(address) +print(response.json()) +``` + +-** code running results** + +![](media/QuecPytgon_sbs_http_03.png) + +### Request put + +-** sample code** + +```python +import request + +address = "http://httpbin.org/put" +###Put request +response = request.put(address) +print(response.json()) +``` + +![](media/QuecPytgon_sbs_http_04.png) + +### Request patch + +-** sample code** + +```python +import request + +address = "http://httpbin.org/patch" +###Patch request +response = request.patch(address) +print(response.json()) +``` + +-** code running results** + +![](media/QuecPytgon_sbs_http_05.png) + +### Request delete + +-** sample code** + +```python +import request + +address = "http://httpbin.org/delete" +###Delete request +response = request.delete(address) +print(response.json()) +``` + +-** code running results** + +![](media/QuecPytgon_sbs_http_06.png) + +### Request HTTP connection + +-** sample code** + +```python +import request + +address = "https://myssl.com" +###HTTPS request +response = request.get(address) +for i in response.text: + print(i) +``` + +-** code running results** + +![](media/QuecPytgon_sbs_http_07.png) + +### Appendix a abbreviations of terms + +Table 1: Abbreviations of terms + +|** abbreviation *** full English name *** full Chinese name **| +| -------- | --------------------------------- | ---------------- | +|Application programming interface| +|Http | Hyper Text Transfer Protocol | Hypertext Transfer Protocol| +|TCP transmission control protocol| +|Address | uniform resource locator, | uniform resource locator| +|Www | World Wide Web | World Wide Web| diff --git a/docs/sbs/zh/sbs/lcd.md b/docs/sbs/en/sbs/lcd.md similarity index 63% rename from docs/sbs/zh/sbs/lcd.md rename to docs/sbs/en/sbs/lcd.md index f052958c1444b6eb69bc5511c7a5a09687b26f6f..cdcb68a6beec1e0b8bbfd3844a912885e6c82791 100644 --- a/docs/sbs/zh/sbs/lcd.md +++ b/docs/sbs/en/sbs/lcd.md @@ -1,10 +1,10 @@ -### LCD 使用指导 +## LCD instruction -#### LCD相关接口 +### LCD related interface -**创建LCD对象** +**Create LCD object** -首先,导入machine模块下的LCD,然后创建LCD对象。有关示例代码,请参考以下代码清单: +First, import the LCD under the machine module, and then create the LCD object. For example code, refer to the following code listing: ``` from machine import LCD @@ -13,242 +13,242 @@ lcd = LCD() **lcd.lcd_init** -该方法用于初始化LCD。 +This method is used to initialize the LCD. -**函数原型** +**Function prototype** ``` lcd.lcd_init(lcd_init_data, lcd_width, lcd_hight, lcd_clk, data_line, line_num, lcd_type, lcd_invalid,lcd_display_on, lcd_display_off, lcd_set_brightness) ``` -**参数** +**Parameters** lcd_init_data: -传入LCD的配置命令 +Incoming LCD configuration command lcd_width: -LCD屏幕的宽度。宽度不超过 500 。 +The width of the LCD screen. The width shall not exceed 500. lcd_hight: -LCD屏幕的高度。高度不超过 500 。 +The height of the LCD screen. The height shall not exceed 500. lcd_clk: -LCD SPI时钟。SPI时钟为6.5K/13K/26K/52K。 +LCD SPI clock. SPI clock is 6.5k/13k/26k/52k. data_line: -数据线数。参数值为 1 和 2 。 +Number of data lines. The parameter values are 1 and 2. line_num: -线的数量。参数值为 3 和 4 。 +Number of lines. The parameter values are 3 and 4. lcd_type: -屏幕类型。 0 :fstn; 1 :rgb +Screen type. 0 :fstn; 1 :rgb lcd_invalid: -LCD写屏时xy的设置 +Setting when writing LCD screen lcd_display_on: -LCD屏亮 +LCD screen on lcd_display_off: -LCD屏灭 +LCD screen off lcd_set_brightness: -LCD设置亮度值。设置为none表示由LCD_BL_K控制亮度(有些屏幕是由寄存器控制屏幕亮度,有些是通过LCD_BL_K控制屏幕亮度) -**返回值** -0 成功 --1 已经初始化 --2 屏初始化参数错误(为空或过大(大于 1000 像素点)) --3 初始化参数解析错误 --4 屏幕缓存申请失败 --5 配置参数错误 + + + +-3 initialization parameter parsing error + +-4 screen cache request failed + +-5 configuration parameter error **lcd.lcd_clear** -该方法用于清除屏幕。 +This method is used to clear the screen. -函数原型 +Function prototype ``` lcd.lcd_clear(color) ``` -**参数** +**Parameters** color: -需要刷屏的颜色值 +Color value to be swiped -**返回值** +**Return value** -0 成功 +0 succeeded --1 屏幕未初始化 +-1 screen not initialized **lcd.lcd_write** -该方法用于区域写屏。 +This method is used for area writing screen. -**函数原型** +**Function prototype** lcd.lcd_write(color_buffer,start_x,start_y,end_x,end_y) -**参数** +**Parameters** Color_buffer: -屏幕的颜色值缓存。 +The color value cache of the screen. start_x: -起始x坐标 +Starting X coordinate start_y: -起始y坐标 +Start y coordinate end_x: -结束x坐标 +End X coordinate end_y: -结束y坐标 +End y coordinate -**返回值** +**Return value** -0 成功 +0 succeeded --1 屏幕未初始化 +-1 screen not initialized --2 宽度和高度设置错误 +-2. Wrong width and height setting --3 数据缓存为空 +-3. The data cache is empty **lcd.lcd_brightness** -该方法用于设置屏幕亮度。 +This method is used to set the screen brightness. -**函数原型** +**Function prototype** ``` lcd.lcd_brightness(level) ``` -**参数** +**Parameters** level: -亮度等级。此处会调用lcd.lcd_init()中的lcd_set_brightness参数。若该参数为None,亮度调节则由 -背光亮度调节引脚来控制。 +Brightness level. Lcd.lcd will be called here_ LCD in init()_ set_ Brightness parameter. If the parameter is none, the brightness is adjusted by +Backlight brightness adjustment pin to control. -**返回值** +**Return value** -0 成功 +0 succeeded --1 屏幕未初始化 +-1 screen not initialized **lcd.lcd_display_on** -该方法用于设置亮屏。调用此接口后调用lcd.lcd_init()中的lcd_display_on回调。 +This method is used to set the bright screen. After calling this interface, call lcd.lcd_. LCD in init()_ display_ On callback. -**函数原型** +**Function prototype** ``` lcd.lcd_display_on () ``` -**参数** +**Parameters** -无 +nothing -**返回值** +**Return value** -0 成功 +0 succeeded --1 屏幕未初始化 +-1 screen not initialized **lcd.lcd_display_off** -该方法用于灭屏设置。调用此接口后调用lcd.lcd_init()中的lcd_display_off回调。 +This method is used for screen out setting. After calling this interface, call lcd.lcd_. LCD in init()_ display_ Off callback. -**函数原型** +**Function prototype** ``` lcd.lcd_display_off () ``` -**参数** +**Parameters** -无 +nothing -**返回值** +**Return value** -0 成功 +0 succeeded -- 1 屏幕未初始化 +-1 screen not initialized **lcd.lcd_write_cmd** -该方法用于写入命令。 +This method is used to write commands. -**函数原型** +**Function prototype** ``` lcd.lcd_write_cmd (cmd_value, cmd_value_len) ``` -**参数** +**Parameters** cmd_value: -命令值 +Command value cmd_value_len: -命令值长度 +Command value length -**返回值** +**Return value** -0 成功 -其他值 失败 +0 success +Other values fail lcd.lcd_write_data -该方法用于写入数据。 +This method is used to write data. -**函数原型** +**Function prototype** ``` lcd.lcd_write_data (data_value, data_value_len) ``` -**参数** +**Parameters** data_value: -数据值 +Data value data_value_len: -数据值长度 +Data value length -**返回值** +**Return value** -0 成功 -其他值 失败 +0 success +Other values fail -#### LCD配置流程 +### LCD configuration process -**LCD硬件接线** +**LCD hardware wiring** -如下表所示,LCD引脚对应模块使用的LCD模块引脚,如下表所示: +As shown in the table below, the LCD pin corresponds to the LCD module pin used by the module, as shown in the table below: -表 1 :引脚对应表 +Table 1: pin correspondence table ``` -LCD引脚 LCD模块引脚 +LCD pin LCD module pin LCD_SPI_CLK gpio[20] LCD_SPI_DOUT gpio[24] LCD_SPI_CS gpio[22] @@ -257,22 +257,22 @@ LCD_SPI_RST gpio[26] LCD_BL_K / ``` -**编写屏幕初始化参数** +**Write screen initialization parameters** -在交互式命令行窗口中键入以下内容,准备LCD屏幕初始化参数,参数格式为:类型+长度+参数值: +Type the following in the interactive command line window to prepare LCD screen initialization parameters. The parameter format is: type + length + parameter value: -类型: 0 表示命令; 1 表示数据; 2 表示延时 +Type: 0 indicates command; 1 represents data; 2 indicates delay -长度:若类型为 0 ,则长度表示命令后的数据数量;若类型为 1 ,则长度表示数据的长度 +Length: if the type is 0, the length indicates the amount of data after the command; If the type is 1, the length represents the length of the data -参数值:对应值 +Parameter value: corresponding value -以下以ili9225为例: +Take ili9225 as an example: ``` Ili9225_init = ( -0,1,0x02, #命令,后接一个data, cmd值为0x -1,2,0x01,0x00, #数据,数据长度为 2 , data值为0x +0,1,0x02, # Command, followed by a data, CMD value 0x +1,2,0x01,0x00, # Data, the data length is 2, and the data value is 0x 0,1,0x01, 1,2,0x01,0x1C, @@ -352,22 +352,22 @@ Ili9225_init_data = bytearray(Ili9225_init) -**执行初始化接口** +**Execute initialization interface** -本节以ili 9225 为例,演示如何驱动屏幕。 +This section takes Ili 9225 as an example to demonstrate how to drive the screen. -创建LCD对象 +Create LCD object -在交互式命令行窗口中键入以下命令,创建LCD对象。 +Create an LCD object by typing the following command in an interactive command line window. ``` from machine import LCD lcd = LCD() ``` -打开屏显 +Open screen display -在交互式命令行窗口中键入以下命令,打开屏显: +Open the screen display by typing the following command in an interactive command line window: ``` def display_on(para): @@ -376,9 +376,9 @@ def display_on(para): lcd.lcd_write_data(0x1017, 2) ``` -关闭屏显 +Turn off the screen display -在交互式命令行窗口中键入以下命令,关闭屏显: +Close the screen display by typing the following command in the interactive command line window: ``` def display_off(para): @@ -387,10 +387,10 @@ def display_off(para): lcd.lcd_write_data(0x1004, 2) ``` -编写写屏时区域值 +Area value when writing screen -不同的LCD屏有不同的设置区域方式,故放置python层实现。在底层实现lcd_write时,会调用该函 -数在交互式命令行窗口中键入以下命令,实现lcd_invalid: +Different LCD screens have different setting area modes, so it is realized by placing Python layer. Implement LCD at the bottom_ This function is called when writing +In the interactive command line window, type the following commands to realize LCD_ invalid: ``` def lcd_invalid(para): @@ -408,40 +408,40 @@ def lcd_invalid(para): lcd.lcd_write_cmd(0x21, 1) lcd.lcd_write_data(para[1], 2) lcd.lcd_write_cmd(0x22, 1) - lcd.lcd_write_cmd(0xff, 1) #此0xff尤为重要,此值时配置区域完成的标志 + lcd.lcd_ write_ CMD (0xff, 1) # this 0xff is particularly important. This value indicates the completion of the configuration area ``` -初始化配置 +Initialize configuration -在交互式命令行窗口中键入以下命令,实现LCD配置: +Type the following command in the interactive command line window to realize LCD configuration: ``` lcd.lcd_init(Ili9225_init_data,176,220,13000,1,4,0,lcd_invalid,display_on,display_off,None)) -Ili9225_init_data: 2.1配置的初始化参数 -176 : lcd宽度 -220 : lcd高度 +Ili9225_ init_ data: 2.1 configured initialization parameters +176 : LCD width +220 : LCD height 13000 : spi clk -1 : 1 根数据线 -4 : 4 根线 -0 : type, 0 表示rgb -lcd_invalid: 区域写屏,设置范围 -display_on: 亮屏 -display_off: 息屏 -None: 表示LCD亮度由IO口控制 +1 : 1 data cable +4 : 4 wires +0 : Type, 0 means RGB +lcd_ invalid: Area write screen, setting range +display_ on: Bright screen +display_ off: Rest screen +None: Indicates that LCD brightness is controlled by IO port ``` -清屏 +Clear screen -在交互式命令行窗口中键入以下命令,实现清屏: +Clear the screen by typing the following command in the interactive command line window: ``` lcd.lcd_clear(0x001f) ``` -区域写屏 +Area write screen -在交互式命令行窗口中键入以下命令,实现区域写屏: +In the interactive command line window, type the following command to realize the area write screen: ``` test_buf = ( @@ -493,15 +493,15 @@ test_buf1 = bytearray(test_buf) lcd.lcd_write(test_buf1,10,10,20,20) ``` -备注 +remarks -因设计原因,该示例目标显示为0x001f(蓝色),当前为0x1f00。 +For design reasons, the example target is displayed as 0x001f (blue), and currently 0x1f00. -#### LCD执行示例 +### LCD execution example -本章节以ili9225为例,汇总LCD流程脚本命令以及执行结果。 +This chapter takes ili9225 as an example to summarize LCD process script commands and execution results. -LCD流程脚本命令 +LCD process script command ``` test=( @@ -667,14 +667,14 @@ test_buf1 = bytearray(test_buf) lcd.lcd_write(test_buf1,10,10,20,20) -lcd.lcd_clear(0xf800) //红色 +lcd.lcd_ Clear (0xf800) / / red ``` -LCD流程脚本执行结果 +LCD process script execution results -LCD流程脚本执行结果分别如图所示: +The execution results of LCD process script are shown as follows: ![](media/sbs_lcd_script_exec_1.jpg) @@ -702,12 +702,12 @@ LCD流程脚本执行结果分别如图所示: -#### 附录术语缩写 +### Appendix abbreviations of terms -表 2 :术语缩写 +Table 2: Abbreviations of terms -| 缩写 | 英文全称 | 中文全称 | +|Abbreviation | full English name | full Chinese name| | ---- | --------------------------- | ------------ | -| LCD | Liquid Crystal Display | 液晶显示器 | -| SPI | Serial Peripheral Interface | 串行外设接口 | +|LCD | liquid crystal display | liquid crystal display| +|SPI | serial peripheral interface | serial peripheral interface| diff --git a/docs/sbs/en/sbs/led.md b/docs/sbs/en/sbs/led.md new file mode 100644 index 0000000000000000000000000000000000000000..baf143337e24adda7b4dc869d6dd8bca08382dd5 --- /dev/null +++ b/docs/sbs/en/sbs/led.md @@ -0,0 +1,107 @@ +## Led usage guide + +### Basic overview + +Before using the LED function, you need to understand the GPIO serial port of the development board, which is the general I / O port. GPIO is the pin output and input function of the development board. Output function, that is, the control pin becomes high and low; The input function is to detect whether the level on the pin is high or low. When the control pin needs to be high or low, that is, use the output function of GPIO. For example, when controlling the on and off of LED lamp, it is necessary to realize the on and off of LED lamp by controlling the high and low level of output. + +Take ec100y-cn module as an example, as shown in the figure, GPIO serial port: + +![](media/sbs_led_picture_0.jpg) + +​ Figure 1: GPIO serial port + + +### Led function realization + +​ To realize the LED function in the development board, you need to use the pin function in quecpthon. Take ec100y-cn module as an example +The LED control line is connected with the gpio1 serial port of the development board, and then the module v3.3 serial port is connected with the v3.3 serial port of the development board to supply power to the module. Power up the development board after the connection is completed. + +Step 1: first import the machine module and create a GPIO object. Code examples are as follows: + +``` +from machine import Pin +gpio1 = Pin(GPIO1, Pin.OUT, Pin.PULL_DISABLE, 0) +``` + + + +GPIOn Integer. Pin number. +The corresponding relationship of pins is as follows: +GPIO 1 – pin 22 +Gpio2 – pin 23 +Gpio3 – pin 178 +Gpio4 – pin 199 +Gpio5 – pin 204 + +direction Integer. +In input mode +Out output mode + +pullMode Integer. +PULL_ Disable floating mode +PULL_ Pu pull-up mode +PULL_ PD pull down mode + +Level integer. Pin level. +0 set pin to low level +1 set pin to high level + +Step 2: obtain the pin voltage, and the execution code is as follows: + +``` +gpio1.read() +``` + +Step 3: set the pin level. The execution code is as follows: + +``` +gpio1.write(1) +``` + + + +Step 4: set a series of variable voltages to the pin to realize the flashing effect of LED lamp. The execution code is as follows: + +``` +import utime +i = 1 + +while i<100: + gpio1.write(0) + utime.sleep(1) + gpio1.write(1) + utime.sleep(1) + i += 1 +``` + +![](media/sbs_led_picture_1.jpg) + +![](media/sbs_led_picture_2.jpg) + +​ After running the above code, you can observe that the LED of ec100y-cn module flashes every 1 second, and you can modify the code and connect multiple + +Group peripherals achieve more functions. + +![](media/sbs_led_picture_3.jpg) + +​ Figure 2: LED flashing + +remarks + +``` +The above codes can be found in the SDK toolkit provided by China mobile communications. The path is modules / GPIO / example_ pin.py。 +``` + +### Appendix + +Table 1: Abbreviations of terms + + + +|Abbreviation | full English name | full Chinese name| +| ---- | ---------------------------- | --------------- | +|GPIO | general purpose input / output | general purpose input / output| +|LED light emitting diode| +|SDK software development kit| + + diff --git a/docs/sbs/zh/sbs/media/0da5c0e906c2dfef5e1066e03eddb533.jpg b/docs/sbs/en/sbs/media/0da5c0e906c2dfef5e1066e03eddb533.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/0da5c0e906c2dfef5e1066e03eddb533.jpg rename to docs/sbs/en/sbs/media/0da5c0e906c2dfef5e1066e03eddb533.jpg diff --git a/docs/sbs/zh/sbs/media/0f627ce2f6c2f679cd92c7685c3cf148.jpg b/docs/sbs/en/sbs/media/0f627ce2f6c2f679cd92c7685c3cf148.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/0f627ce2f6c2f679cd92c7685c3cf148.jpg rename to docs/sbs/en/sbs/media/0f627ce2f6c2f679cd92c7685c3cf148.jpg diff --git a/docs/sbs/zh/sbs/media/1.png b/docs/sbs/en/sbs/media/1.png similarity index 100% rename from docs/sbs/zh/sbs/media/1.png rename to docs/sbs/en/sbs/media/1.png diff --git a/docs/sbs/zh/sbs/media/139025156eadcb1ec370ba48b610e43e.jpg b/docs/sbs/en/sbs/media/139025156eadcb1ec370ba48b610e43e.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/139025156eadcb1ec370ba48b610e43e.jpg rename to docs/sbs/en/sbs/media/139025156eadcb1ec370ba48b610e43e.jpg diff --git a/docs/sbs/zh/sbs/media/2.png b/docs/sbs/en/sbs/media/2.png similarity index 100% rename from docs/sbs/zh/sbs/media/2.png rename to docs/sbs/en/sbs/media/2.png diff --git a/docs/sbs/zh/sbs/media/20ba8885738df4172d61acebdcf0aa43.jpg b/docs/sbs/en/sbs/media/20ba8885738df4172d61acebdcf0aa43.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/20ba8885738df4172d61acebdcf0aa43.jpg rename to docs/sbs/en/sbs/media/20ba8885738df4172d61acebdcf0aa43.jpg diff --git a/docs/sbs/zh/sbs/media/277228479c7256251a776b75160dfcec.jpg b/docs/sbs/en/sbs/media/277228479c7256251a776b75160dfcec.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/277228479c7256251a776b75160dfcec.jpg rename to docs/sbs/en/sbs/media/277228479c7256251a776b75160dfcec.jpg diff --git a/docs/sbs/zh/sbs/media/3.png b/docs/sbs/en/sbs/media/3.png similarity index 100% rename from docs/sbs/zh/sbs/media/3.png rename to docs/sbs/en/sbs/media/3.png diff --git a/docs/sbs/zh/sbs/media/30dd898d830b27416fd3b691ae64e3dd.png b/docs/sbs/en/sbs/media/30dd898d830b27416fd3b691ae64e3dd.png similarity index 100% rename from docs/sbs/zh/sbs/media/30dd898d830b27416fd3b691ae64e3dd.png rename to docs/sbs/en/sbs/media/30dd898d830b27416fd3b691ae64e3dd.png diff --git a/docs/sbs/zh/sbs/media/35b9112bf62d5cc4a417eb4190b0a979.jpg b/docs/sbs/en/sbs/media/35b9112bf62d5cc4a417eb4190b0a979.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/35b9112bf62d5cc4a417eb4190b0a979.jpg rename to docs/sbs/en/sbs/media/35b9112bf62d5cc4a417eb4190b0a979.jpg diff --git a/docs/sbs/zh/sbs/media/4.png b/docs/sbs/en/sbs/media/4.png similarity index 100% rename from docs/sbs/zh/sbs/media/4.png rename to docs/sbs/en/sbs/media/4.png diff --git a/docs/sbs/zh/sbs/media/42dbaa1445eaa8539bde9e66a7a78d59.jpg b/docs/sbs/en/sbs/media/42dbaa1445eaa8539bde9e66a7a78d59.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/42dbaa1445eaa8539bde9e66a7a78d59.jpg rename to docs/sbs/en/sbs/media/42dbaa1445eaa8539bde9e66a7a78d59.jpg diff --git a/docs/sbs/zh/sbs/media/5515ac10e5070dd1b9bfd61c7a7022cf.jpg b/docs/sbs/en/sbs/media/5515ac10e5070dd1b9bfd61c7a7022cf.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/5515ac10e5070dd1b9bfd61c7a7022cf.jpg rename to docs/sbs/en/sbs/media/5515ac10e5070dd1b9bfd61c7a7022cf.jpg diff --git a/docs/sbs/zh/sbs/media/6a9b5bd82fc31d7fbb8a885cc24c3543.jpg b/docs/sbs/en/sbs/media/6a9b5bd82fc31d7fbb8a885cc24c3543.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/6a9b5bd82fc31d7fbb8a885cc24c3543.jpg rename to docs/sbs/en/sbs/media/6a9b5bd82fc31d7fbb8a885cc24c3543.jpg diff --git a/docs/sbs/zh/sbs/media/6b0cd9b99e274453b1fcdf0961b5217b.jpg b/docs/sbs/en/sbs/media/6b0cd9b99e274453b1fcdf0961b5217b.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/6b0cd9b99e274453b1fcdf0961b5217b.jpg rename to docs/sbs/en/sbs/media/6b0cd9b99e274453b1fcdf0961b5217b.jpg diff --git a/docs/sbs/zh/sbs/media/6d3f940f6bbc0f8bffc344aace5b8de9.jpg b/docs/sbs/en/sbs/media/6d3f940f6bbc0f8bffc344aace5b8de9.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/6d3f940f6bbc0f8bffc344aace5b8de9.jpg rename to docs/sbs/en/sbs/media/6d3f940f6bbc0f8bffc344aace5b8de9.jpg diff --git a/docs/sbs/zh/sbs/media/6e5654be296f4a5fc4f620bb2b0f238a.emf b/docs/sbs/en/sbs/media/6e5654be296f4a5fc4f620bb2b0f238a.emf similarity index 100% rename from docs/sbs/zh/sbs/media/6e5654be296f4a5fc4f620bb2b0f238a.emf rename to docs/sbs/en/sbs/media/6e5654be296f4a5fc4f620bb2b0f238a.emf diff --git a/docs/sbs/zh/sbs/media/70658f75cc3656d9613fb7be881895ab.jpg b/docs/sbs/en/sbs/media/70658f75cc3656d9613fb7be881895ab.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/70658f75cc3656d9613fb7be881895ab.jpg rename to docs/sbs/en/sbs/media/70658f75cc3656d9613fb7be881895ab.jpg diff --git a/docs/sbs/zh/sbs/media/7a5e31394f4d29cc26626c279cc933fe.jpg b/docs/sbs/en/sbs/media/7a5e31394f4d29cc26626c279cc933fe.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/7a5e31394f4d29cc26626c279cc933fe.jpg rename to docs/sbs/en/sbs/media/7a5e31394f4d29cc26626c279cc933fe.jpg diff --git a/docs/sbs/zh/sbs/media/800f014c0ddfdeeef025fd803aa23697.png b/docs/sbs/en/sbs/media/800f014c0ddfdeeef025fd803aa23697.png similarity index 100% rename from docs/sbs/zh/sbs/media/800f014c0ddfdeeef025fd803aa23697.png rename to docs/sbs/en/sbs/media/800f014c0ddfdeeef025fd803aa23697.png diff --git a/docs/sbs/zh/sbs/media/8431414d399d975a4c26434403a514bd.jpg b/docs/sbs/en/sbs/media/8431414d399d975a4c26434403a514bd.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/8431414d399d975a4c26434403a514bd.jpg rename to docs/sbs/en/sbs/media/8431414d399d975a4c26434403a514bd.jpg diff --git a/docs/sbs/zh/sbs/media/85a947dbbd4ec41cb30a42b2a0e60a70.jpg b/docs/sbs/en/sbs/media/85a947dbbd4ec41cb30a42b2a0e60a70.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/85a947dbbd4ec41cb30a42b2a0e60a70.jpg rename to docs/sbs/en/sbs/media/85a947dbbd4ec41cb30a42b2a0e60a70.jpg diff --git a/docs/sbs/zh/sbs/media/90a8a0a1f6234753ecd29e7e2132f4ce.jpg b/docs/sbs/en/sbs/media/90a8a0a1f6234753ecd29e7e2132f4ce.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/90a8a0a1f6234753ecd29e7e2132f4ce.jpg rename to docs/sbs/en/sbs/media/90a8a0a1f6234753ecd29e7e2132f4ce.jpg diff --git a/docs/sbs/zh/sbs/media/9a0a7aa791766b583716d7c2cff312d5.jpg b/docs/sbs/en/sbs/media/9a0a7aa791766b583716d7c2cff312d5.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/9a0a7aa791766b583716d7c2cff312d5.jpg rename to docs/sbs/en/sbs/media/9a0a7aa791766b583716d7c2cff312d5.jpg diff --git a/docs/sbs/zh/sbs/media/9a1039ed5ae22e349c21f6c8fcbe1dc9.jpg b/docs/sbs/en/sbs/media/9a1039ed5ae22e349c21f6c8fcbe1dc9.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/9a1039ed5ae22e349c21f6c8fcbe1dc9.jpg rename to docs/sbs/en/sbs/media/9a1039ed5ae22e349c21f6c8fcbe1dc9.jpg diff --git a/docs/sbs/zh/sbs/media/9aab3c579e9b1c974e24cb5ca8fa9cc8.jpg b/docs/sbs/en/sbs/media/9aab3c579e9b1c974e24cb5ca8fa9cc8.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/9aab3c579e9b1c974e24cb5ca8fa9cc8.jpg rename to docs/sbs/en/sbs/media/9aab3c579e9b1c974e24cb5ca8fa9cc8.jpg diff --git a/docs/sbs/zh/sbs/media/9c3b369e3dc8b4f7b157861383dbbfac.jpg b/docs/sbs/en/sbs/media/9c3b369e3dc8b4f7b157861383dbbfac.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/9c3b369e3dc8b4f7b157861383dbbfac.jpg rename to docs/sbs/en/sbs/media/9c3b369e3dc8b4f7b157861383dbbfac.jpg diff --git a/docs/sbs/en/sbs/media/QuecPytgon_sbs_file_01.png b/docs/sbs/en/sbs/media/QuecPytgon_sbs_file_01.png new file mode 100644 index 0000000000000000000000000000000000000000..466b1f1fb45f3dfdf08323643c5f28dc903a14f8 Binary files /dev/null and b/docs/sbs/en/sbs/media/QuecPytgon_sbs_file_01.png differ diff --git a/docs/sbs/en/sbs/media/QuecPytgon_sbs_file_02.png b/docs/sbs/en/sbs/media/QuecPytgon_sbs_file_02.png new file mode 100644 index 0000000000000000000000000000000000000000..b39e4f37680ee5911427a7e9bf9f84b1f6ded5ee Binary files /dev/null and b/docs/sbs/en/sbs/media/QuecPytgon_sbs_file_02.png differ diff --git a/docs/sbs/en/sbs/media/QuecPytgon_sbs_file_03.png b/docs/sbs/en/sbs/media/QuecPytgon_sbs_file_03.png new file mode 100644 index 0000000000000000000000000000000000000000..10b772a9015e0358e685d6ffd863b93fb00f7976 Binary files /dev/null and b/docs/sbs/en/sbs/media/QuecPytgon_sbs_file_03.png differ diff --git a/docs/sbs/en/sbs/media/QuecPytgon_sbs_file_04.png b/docs/sbs/en/sbs/media/QuecPytgon_sbs_file_04.png new file mode 100644 index 0000000000000000000000000000000000000000..6e47dbbf1576ac466bb6f85d7cb373cd850bc822 Binary files /dev/null and b/docs/sbs/en/sbs/media/QuecPytgon_sbs_file_04.png differ diff --git a/docs/sbs/en/sbs/media/QuecPytgon_sbs_file_05.png b/docs/sbs/en/sbs/media/QuecPytgon_sbs_file_05.png new file mode 100644 index 0000000000000000000000000000000000000000..eec29be874bb9d8fadd9155ab6a84b55d2a105b6 Binary files /dev/null and b/docs/sbs/en/sbs/media/QuecPytgon_sbs_file_05.png differ diff --git a/docs/sbs/en/sbs/media/QuecPytgon_sbs_file_06.png b/docs/sbs/en/sbs/media/QuecPytgon_sbs_file_06.png new file mode 100644 index 0000000000000000000000000000000000000000..d1218e14a4ab15041f160b17850c4ea051c1e345 Binary files /dev/null and b/docs/sbs/en/sbs/media/QuecPytgon_sbs_file_06.png differ diff --git a/docs/sbs/en/sbs/media/QuecPytgon_sbs_file_07.png b/docs/sbs/en/sbs/media/QuecPytgon_sbs_file_07.png new file mode 100644 index 0000000000000000000000000000000000000000..456b9e10aec4a0a60305343a7c041ea07d994362 Binary files /dev/null and b/docs/sbs/en/sbs/media/QuecPytgon_sbs_file_07.png differ diff --git a/docs/sbs/en/sbs/media/QuecPytgon_sbs_file_08.png b/docs/sbs/en/sbs/media/QuecPytgon_sbs_file_08.png new file mode 100644 index 0000000000000000000000000000000000000000..e29753d5cf3d2e83c919fcce4d739bffc173c44a Binary files /dev/null and b/docs/sbs/en/sbs/media/QuecPytgon_sbs_file_08.png differ diff --git a/docs/sbs/en/sbs/media/QuecPytgon_sbs_file_09.png b/docs/sbs/en/sbs/media/QuecPytgon_sbs_file_09.png new file mode 100644 index 0000000000000000000000000000000000000000..ecd20039b6eed73d6ef3d060a73606ca6792dd64 Binary files /dev/null and b/docs/sbs/en/sbs/media/QuecPytgon_sbs_file_09.png differ diff --git a/docs/sbs/en/sbs/media/QuecPytgon_sbs_file_10.png b/docs/sbs/en/sbs/media/QuecPytgon_sbs_file_10.png new file mode 100644 index 0000000000000000000000000000000000000000..05dcb7eabfca15f2ac9a035c3a5d1934f5ecaaf8 Binary files /dev/null and b/docs/sbs/en/sbs/media/QuecPytgon_sbs_file_10.png differ diff --git a/docs/sbs/en/sbs/media/QuecPytgon_sbs_http_01.png b/docs/sbs/en/sbs/media/QuecPytgon_sbs_http_01.png new file mode 100644 index 0000000000000000000000000000000000000000..466b1f1fb45f3dfdf08323643c5f28dc903a14f8 Binary files /dev/null and b/docs/sbs/en/sbs/media/QuecPytgon_sbs_http_01.png differ diff --git a/docs/sbs/en/sbs/media/QuecPytgon_sbs_http_02.png b/docs/sbs/en/sbs/media/QuecPytgon_sbs_http_02.png new file mode 100644 index 0000000000000000000000000000000000000000..6409e0a425ba2f2021e3832086c678ef3522030f Binary files /dev/null and b/docs/sbs/en/sbs/media/QuecPytgon_sbs_http_02.png differ diff --git a/docs/sbs/en/sbs/media/QuecPytgon_sbs_http_03.png b/docs/sbs/en/sbs/media/QuecPytgon_sbs_http_03.png new file mode 100644 index 0000000000000000000000000000000000000000..716c45d3ada859f4a4eeb01a1b4c73a581252a37 Binary files /dev/null and b/docs/sbs/en/sbs/media/QuecPytgon_sbs_http_03.png differ diff --git a/docs/sbs/en/sbs/media/QuecPytgon_sbs_http_04.png b/docs/sbs/en/sbs/media/QuecPytgon_sbs_http_04.png new file mode 100644 index 0000000000000000000000000000000000000000..d5a1818c3c18c047fc425e4f6b41aa34177fdc9e Binary files /dev/null and b/docs/sbs/en/sbs/media/QuecPytgon_sbs_http_04.png differ diff --git a/docs/sbs/en/sbs/media/QuecPytgon_sbs_http_05.png b/docs/sbs/en/sbs/media/QuecPytgon_sbs_http_05.png new file mode 100644 index 0000000000000000000000000000000000000000..2fb5acc72db427f288d9796c22f1f652b5ee574f Binary files /dev/null and b/docs/sbs/en/sbs/media/QuecPytgon_sbs_http_05.png differ diff --git a/docs/sbs/en/sbs/media/QuecPytgon_sbs_http_06.png b/docs/sbs/en/sbs/media/QuecPytgon_sbs_http_06.png new file mode 100644 index 0000000000000000000000000000000000000000..9b9acaaacb88297d8e855d584036e6e168bb9eed Binary files /dev/null and b/docs/sbs/en/sbs/media/QuecPytgon_sbs_http_06.png differ diff --git a/docs/sbs/en/sbs/media/QuecPytgon_sbs_http_07.png b/docs/sbs/en/sbs/media/QuecPytgon_sbs_http_07.png new file mode 100644 index 0000000000000000000000000000000000000000..23a91605302c5b9c5e30822bd90f6f880d1734b7 Binary files /dev/null and b/docs/sbs/en/sbs/media/QuecPytgon_sbs_http_07.png differ diff --git a/docs/sbs/en/sbs/media/QuecPytgon_sbs_http_08.png b/docs/sbs/en/sbs/media/QuecPytgon_sbs_http_08.png new file mode 100644 index 0000000000000000000000000000000000000000..7a786658528f1391aa71de30b21a16b134abd347 Binary files /dev/null and b/docs/sbs/en/sbs/media/QuecPytgon_sbs_http_08.png differ diff --git a/docs/sbs/en/sbs/media/QuecPython_sbs_ntp01.png b/docs/sbs/en/sbs/media/QuecPython_sbs_ntp01.png new file mode 100644 index 0000000000000000000000000000000000000000..d3ff00fe6989a40b433d3c2a88feb41cdd47908f Binary files /dev/null and b/docs/sbs/en/sbs/media/QuecPython_sbs_ntp01.png differ diff --git a/docs/sbs/en/sbs/media/QuecPython_sbs_ntp02.png b/docs/sbs/en/sbs/media/QuecPython_sbs_ntp02.png new file mode 100644 index 0000000000000000000000000000000000000000..01a07df983814ad728c799bfb93d48d33662da4a Binary files /dev/null and b/docs/sbs/en/sbs/media/QuecPython_sbs_ntp02.png differ diff --git a/docs/sbs/en/sbs/media/QuecPython_sbs_ntp03.png b/docs/sbs/en/sbs/media/QuecPython_sbs_ntp03.png new file mode 100644 index 0000000000000000000000000000000000000000..cf01c852045c1a2b91b96c5498b7143e31ef16bc Binary files /dev/null and b/docs/sbs/en/sbs/media/QuecPython_sbs_ntp03.png differ diff --git a/docs/sbs/en/sbs/media/QuecPython_sbs_ntp04.png b/docs/sbs/en/sbs/media/QuecPython_sbs_ntp04.png new file mode 100644 index 0000000000000000000000000000000000000000..ced3c491f839bb0aaf03315e37ba1433a7ba430d Binary files /dev/null and b/docs/sbs/en/sbs/media/QuecPython_sbs_ntp04.png differ diff --git a/docs/sbs/en/sbs/media/QuecPython_sbs_ntp05.png b/docs/sbs/en/sbs/media/QuecPython_sbs_ntp05.png new file mode 100644 index 0000000000000000000000000000000000000000..489fc4e8e019475afad73bbde61b4f09212d1f3f Binary files /dev/null and b/docs/sbs/en/sbs/media/QuecPython_sbs_ntp05.png differ diff --git a/docs/sbs/zh/sbs/media/Quectel_Qp_mpy_cross_tools_how_to_use_01.jpg b/docs/sbs/en/sbs/media/Quectel_Qp_mpy_cross_tools_how_to_use_01.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_Qp_mpy_cross_tools_how_to_use_01.jpg rename to docs/sbs/en/sbs/media/Quectel_Qp_mpy_cross_tools_how_to_use_01.jpg diff --git a/docs/sbs/zh/sbs/media/Quectel_Qp_mpy_cross_tools_how_to_use_02.jpg b/docs/sbs/en/sbs/media/Quectel_Qp_mpy_cross_tools_how_to_use_02.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_Qp_mpy_cross_tools_how_to_use_02.jpg rename to docs/sbs/en/sbs/media/Quectel_Qp_mpy_cross_tools_how_to_use_02.jpg diff --git a/docs/sbs/zh/sbs/media/Quectel_Qp_mpy_cross_tools_how_to_use_03.jpg b/docs/sbs/en/sbs/media/Quectel_Qp_mpy_cross_tools_how_to_use_03.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_Qp_mpy_cross_tools_how_to_use_03.jpg rename to docs/sbs/en/sbs/media/Quectel_Qp_mpy_cross_tools_how_to_use_03.jpg diff --git a/docs/sbs/zh/sbs/media/Quectel_Qp_mpy_cross_tools_how_to_use_04.jpg b/docs/sbs/en/sbs/media/Quectel_Qp_mpy_cross_tools_how_to_use_04.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_Qp_mpy_cross_tools_how_to_use_04.jpg rename to docs/sbs/en/sbs/media/Quectel_Qp_mpy_cross_tools_how_to_use_04.jpg diff --git a/docs/sbs/zh/sbs/media/Quectel_Qp_mpy_cross_tools_how_to_use_05.jpg b/docs/sbs/en/sbs/media/Quectel_Qp_mpy_cross_tools_how_to_use_05.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_Qp_mpy_cross_tools_how_to_use_05.jpg rename to docs/sbs/en/sbs/media/Quectel_Qp_mpy_cross_tools_how_to_use_05.jpg diff --git a/docs/sbs/zh/sbs/media/Quectel_QuecPython_Audio_file_play_016.png b/docs/sbs/en/sbs/media/Quectel_QuecPython_Audio_file_play_016.png similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_QuecPython_Audio_file_play_016.png rename to docs/sbs/en/sbs/media/Quectel_QuecPython_Audio_file_play_016.png diff --git a/docs/sbs/zh/sbs/media/Quectel_QuecPython_Audio_file_play_018.png b/docs/sbs/en/sbs/media/Quectel_QuecPython_Audio_file_play_018.png similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_QuecPython_Audio_file_play_018.png rename to docs/sbs/en/sbs/media/Quectel_QuecPython_Audio_file_play_018.png diff --git a/docs/sbs/zh/sbs/media/Quectel_QuecPython_Audio_file_play_020.png b/docs/sbs/en/sbs/media/Quectel_QuecPython_Audio_file_play_020.png similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_QuecPython_Audio_file_play_020.png rename to docs/sbs/en/sbs/media/Quectel_QuecPython_Audio_file_play_020.png diff --git a/docs/sbs/zh/sbs/media/Quectel_QuecPython_Audio_file_play_023.png b/docs/sbs/en/sbs/media/Quectel_QuecPython_Audio_file_play_023.png similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_QuecPython_Audio_file_play_023.png rename to docs/sbs/en/sbs/media/Quectel_QuecPython_Audio_file_play_023.png diff --git a/docs/sbs/zh/sbs/media/Quectel_QuecPython_Audio_file_play_025.png b/docs/sbs/en/sbs/media/Quectel_QuecPython_Audio_file_play_025.png similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_QuecPython_Audio_file_play_025.png rename to docs/sbs/en/sbs/media/Quectel_QuecPython_Audio_file_play_025.png diff --git a/docs/sbs/zh/sbs/media/Quectel_QuecPython_Audio_file_play_027.png b/docs/sbs/en/sbs/media/Quectel_QuecPython_Audio_file_play_027.png similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_QuecPython_Audio_file_play_027.png rename to docs/sbs/en/sbs/media/Quectel_QuecPython_Audio_file_play_027.png diff --git a/docs/sbs/zh/sbs/media/Quectel_QuecPython_Audio_file_play_029.png b/docs/sbs/en/sbs/media/Quectel_QuecPython_Audio_file_play_029.png similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_QuecPython_Audio_file_play_029.png rename to docs/sbs/en/sbs/media/Quectel_QuecPython_Audio_file_play_029.png diff --git a/docs/sbs/zh/sbs/media/Quectel_QuecPython_Audio_file_play_031.png b/docs/sbs/en/sbs/media/Quectel_QuecPython_Audio_file_play_031.png similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_QuecPython_Audio_file_play_031.png rename to docs/sbs/en/sbs/media/Quectel_QuecPython_Audio_file_play_031.png diff --git a/docs/sbs/zh/sbs/media/Quectel_QuecPython_Audio_file_play_033.png b/docs/sbs/en/sbs/media/Quectel_QuecPython_Audio_file_play_033.png similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_QuecPython_Audio_file_play_033.png rename to docs/sbs/en/sbs/media/Quectel_QuecPython_Audio_file_play_033.png diff --git a/docs/sbs/zh/sbs/media/Quectel_QuecPython_Audio_file_play_034.png b/docs/sbs/en/sbs/media/Quectel_QuecPython_Audio_file_play_034.png similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_QuecPython_Audio_file_play_034.png rename to docs/sbs/en/sbs/media/Quectel_QuecPython_Audio_file_play_034.png diff --git a/docs/sbs/zh/sbs/media/Quectel_QuecPython_Audio_file_play_035.png b/docs/sbs/en/sbs/media/Quectel_QuecPython_Audio_file_play_035.png similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_QuecPython_Audio_file_play_035.png rename to docs/sbs/en/sbs/media/Quectel_QuecPython_Audio_file_play_035.png diff --git a/docs/sbs/zh/sbs/media/Quectel_QuecPython_Audio_file_play_038.png b/docs/sbs/en/sbs/media/Quectel_QuecPython_Audio_file_play_038.png similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_QuecPython_Audio_file_play_038.png rename to docs/sbs/en/sbs/media/Quectel_QuecPython_Audio_file_play_038.png diff --git a/docs/sbs/zh/sbs/media/Quectel_QuecPython_Audio_file_play_039.png b/docs/sbs/en/sbs/media/Quectel_QuecPython_Audio_file_play_039.png similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_QuecPython_Audio_file_play_039.png rename to docs/sbs/en/sbs/media/Quectel_QuecPython_Audio_file_play_039.png diff --git a/docs/sbs/zh/sbs/media/Quectel_QuecPython_bus_Guidance_for_use_015.png b/docs/sbs/en/sbs/media/Quectel_QuecPython_bus_Guidance_for_use_015.png similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_QuecPython_bus_Guidance_for_use_015.png rename to docs/sbs/en/sbs/media/Quectel_QuecPython_bus_Guidance_for_use_015.png diff --git a/docs/sbs/zh/sbs/media/Quectel_QuecPython_bus_Guidance_for_use_019.png b/docs/sbs/en/sbs/media/Quectel_QuecPython_bus_Guidance_for_use_019.png similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_QuecPython_bus_Guidance_for_use_019.png rename to docs/sbs/en/sbs/media/Quectel_QuecPython_bus_Guidance_for_use_019.png diff --git a/docs/sbs/zh/sbs/media/Quectel_QuecPython_bus_Guidance_for_use_020.png b/docs/sbs/en/sbs/media/Quectel_QuecPython_bus_Guidance_for_use_020.png similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_QuecPython_bus_Guidance_for_use_020.png rename to docs/sbs/en/sbs/media/Quectel_QuecPython_bus_Guidance_for_use_020.png diff --git a/docs/sbs/zh/sbs/media/Quectel_QuecPython_bus_Guidance_for_use_021.png b/docs/sbs/en/sbs/media/Quectel_QuecPython_bus_Guidance_for_use_021.png similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_QuecPython_bus_Guidance_for_use_021.png rename to docs/sbs/en/sbs/media/Quectel_QuecPython_bus_Guidance_for_use_021.png diff --git a/docs/sbs/zh/sbs/media/Quectel_QuecPython_bus_Guidance_for_use_022.png b/docs/sbs/en/sbs/media/Quectel_QuecPython_bus_Guidance_for_use_022.png similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_QuecPython_bus_Guidance_for_use_022.png rename to docs/sbs/en/sbs/media/Quectel_QuecPython_bus_Guidance_for_use_022.png diff --git a/docs/sbs/zh/sbs/media/Quectel_QuecPython_bus_Guidance_for_use_025.png b/docs/sbs/en/sbs/media/Quectel_QuecPython_bus_Guidance_for_use_025.png similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_QuecPython_bus_Guidance_for_use_025.png rename to docs/sbs/en/sbs/media/Quectel_QuecPython_bus_Guidance_for_use_025.png diff --git a/docs/sbs/zh/sbs/media/Quectel_QuecPython_bus_Guidance_for_use_026.png b/docs/sbs/en/sbs/media/Quectel_QuecPython_bus_Guidance_for_use_026.png similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_QuecPython_bus_Guidance_for_use_026.png rename to docs/sbs/en/sbs/media/Quectel_QuecPython_bus_Guidance_for_use_026.png diff --git a/docs/sbs/zh/sbs/media/Quectel_QuecPython_bus_Guidance_for_use_027.png b/docs/sbs/en/sbs/media/Quectel_QuecPython_bus_Guidance_for_use_027.png similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_QuecPython_bus_Guidance_for_use_027.png rename to docs/sbs/en/sbs/media/Quectel_QuecPython_bus_Guidance_for_use_027.png diff --git a/docs/sbs/en/sbs/media/Quectel_sbs_Socket_course.png b/docs/sbs/en/sbs/media/Quectel_sbs_Socket_course.png new file mode 100644 index 0000000000000000000000000000000000000000..45647602d435c7f31e6f6431ee862bad7f76fea9 Binary files /dev/null and b/docs/sbs/en/sbs/media/Quectel_sbs_Socket_course.png differ diff --git a/docs/sbs/en/sbs/media/Quectel_sbs_Socket_relation_1.png b/docs/sbs/en/sbs/media/Quectel_sbs_Socket_relation_1.png new file mode 100644 index 0000000000000000000000000000000000000000..83842de47d3fd0894a1c4cb9f3538fc8103f3276 Binary files /dev/null and b/docs/sbs/en/sbs/media/Quectel_sbs_Socket_relation_1.png differ diff --git a/docs/sbs/en/sbs/media/Quectel_sbs_Socket_relation_2.png b/docs/sbs/en/sbs/media/Quectel_sbs_Socket_relation_2.png new file mode 100644 index 0000000000000000000000000000000000000000..9ffe2a127ce0932449577fccf47b65099faeefdf Binary files /dev/null and b/docs/sbs/en/sbs/media/Quectel_sbs_Socket_relation_2.png differ diff --git a/docs/sbs/zh/sbs/media/Quectel_sbs_record_API_029.png b/docs/sbs/en/sbs/media/Quectel_sbs_record_API_029.png similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_sbs_record_API_029.png rename to docs/sbs/en/sbs/media/Quectel_sbs_record_API_029.png diff --git a/docs/sbs/zh/sbs/media/Quectel_sbs_tencent_Iot_plat_014.png b/docs/sbs/en/sbs/media/Quectel_sbs_tencent_Iot_plat_014.png similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_sbs_tencent_Iot_plat_014.png rename to docs/sbs/en/sbs/media/Quectel_sbs_tencent_Iot_plat_014.png diff --git a/docs/sbs/zh/sbs/media/Quectel_sbs_tencent_Iot_plat_015.png b/docs/sbs/en/sbs/media/Quectel_sbs_tencent_Iot_plat_015.png similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_sbs_tencent_Iot_plat_015.png rename to docs/sbs/en/sbs/media/Quectel_sbs_tencent_Iot_plat_015.png diff --git a/docs/sbs/zh/sbs/media/Quectel_sbs_tencent_Iot_plat_016.png b/docs/sbs/en/sbs/media/Quectel_sbs_tencent_Iot_plat_016.png similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_sbs_tencent_Iot_plat_016.png rename to docs/sbs/en/sbs/media/Quectel_sbs_tencent_Iot_plat_016.png diff --git a/docs/sbs/zh/sbs/media/Quectel_sbs_tencent_Iot_plat_017.png b/docs/sbs/en/sbs/media/Quectel_sbs_tencent_Iot_plat_017.png similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_sbs_tencent_Iot_plat_017.png rename to docs/sbs/en/sbs/media/Quectel_sbs_tencent_Iot_plat_017.png diff --git a/docs/sbs/zh/sbs/media/Quectel_sbs_tencent_Iot_plat_018.png b/docs/sbs/en/sbs/media/Quectel_sbs_tencent_Iot_plat_018.png similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_sbs_tencent_Iot_plat_018.png rename to docs/sbs/en/sbs/media/Quectel_sbs_tencent_Iot_plat_018.png diff --git a/docs/sbs/zh/sbs/media/Quectel_sbs_tencent_Iot_plat_019.png b/docs/sbs/en/sbs/media/Quectel_sbs_tencent_Iot_plat_019.png similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_sbs_tencent_Iot_plat_019.png rename to docs/sbs/en/sbs/media/Quectel_sbs_tencent_Iot_plat_019.png diff --git a/docs/sbs/zh/sbs/media/Quectel_sbs_tencent_Iot_plat_020.png b/docs/sbs/en/sbs/media/Quectel_sbs_tencent_Iot_plat_020.png similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_sbs_tencent_Iot_plat_020.png rename to docs/sbs/en/sbs/media/Quectel_sbs_tencent_Iot_plat_020.png diff --git a/docs/sbs/zh/sbs/media/Quectel_sbs_tencent_Iot_plat_021.png b/docs/sbs/en/sbs/media/Quectel_sbs_tencent_Iot_plat_021.png similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_sbs_tencent_Iot_plat_021.png rename to docs/sbs/en/sbs/media/Quectel_sbs_tencent_Iot_plat_021.png diff --git a/docs/sbs/zh/sbs/media/Quectel_sbs_tencent_Iot_plat_022.png b/docs/sbs/en/sbs/media/Quectel_sbs_tencent_Iot_plat_022.png similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_sbs_tencent_Iot_plat_022.png rename to docs/sbs/en/sbs/media/Quectel_sbs_tencent_Iot_plat_022.png diff --git a/docs/sbs/zh/sbs/media/Quectel_sbs_tencent_Iot_plat_023.png b/docs/sbs/en/sbs/media/Quectel_sbs_tencent_Iot_plat_023.png similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_sbs_tencent_Iot_plat_023.png rename to docs/sbs/en/sbs/media/Quectel_sbs_tencent_Iot_plat_023.png diff --git a/docs/sbs/zh/sbs/media/Quectel_sbs_tencent_Iot_plat_025.png b/docs/sbs/en/sbs/media/Quectel_sbs_tencent_Iot_plat_025.png similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_sbs_tencent_Iot_plat_025.png rename to docs/sbs/en/sbs/media/Quectel_sbs_tencent_Iot_plat_025.png diff --git a/docs/sbs/zh/sbs/media/Quectel_sbs_tencent_Iot_plat_026.png b/docs/sbs/en/sbs/media/Quectel_sbs_tencent_Iot_plat_026.png similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_sbs_tencent_Iot_plat_026.png rename to docs/sbs/en/sbs/media/Quectel_sbs_tencent_Iot_plat_026.png diff --git a/docs/sbs/zh/sbs/media/Quectel_sbs_tencent_Iot_plat_027.png b/docs/sbs/en/sbs/media/Quectel_sbs_tencent_Iot_plat_027.png similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_sbs_tencent_Iot_plat_027.png rename to docs/sbs/en/sbs/media/Quectel_sbs_tencent_Iot_plat_027.png diff --git a/docs/sbs/zh/sbs/media/Quectel_sbs_tencent_Iot_plat_028.png b/docs/sbs/en/sbs/media/Quectel_sbs_tencent_Iot_plat_028.png similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_sbs_tencent_Iot_plat_028.png rename to docs/sbs/en/sbs/media/Quectel_sbs_tencent_Iot_plat_028.png diff --git a/docs/sbs/zh/sbs/media/c240cbfd8fcee183b8644a9a41320d34.jpg b/docs/sbs/en/sbs/media/c240cbfd8fcee183b8644a9a41320d34.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/c240cbfd8fcee183b8644a9a41320d34.jpg rename to docs/sbs/en/sbs/media/c240cbfd8fcee183b8644a9a41320d34.jpg diff --git a/docs/sbs/zh/sbs/media/c542639b55ad51c52e8a0036d1ca25eb.jpg b/docs/sbs/en/sbs/media/c542639b55ad51c52e8a0036d1ca25eb.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/c542639b55ad51c52e8a0036d1ca25eb.jpg rename to docs/sbs/en/sbs/media/c542639b55ad51c52e8a0036d1ca25eb.jpg diff --git a/docs/sbs/zh/sbs/media/ca8b43ce1e9c9364ba50d7a744f72b71.jpg b/docs/sbs/en/sbs/media/ca8b43ce1e9c9364ba50d7a744f72b71.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/ca8b43ce1e9c9364ba50d7a744f72b71.jpg rename to docs/sbs/en/sbs/media/ca8b43ce1e9c9364ba50d7a744f72b71.jpg diff --git a/docs/sbs/zh/sbs/media/cd4fe22a5b5b1c9a1ecad743187c1d14.jpg b/docs/sbs/en/sbs/media/cd4fe22a5b5b1c9a1ecad743187c1d14.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/cd4fe22a5b5b1c9a1ecad743187c1d14.jpg rename to docs/sbs/en/sbs/media/cd4fe22a5b5b1c9a1ecad743187c1d14.jpg diff --git a/docs/sbs/zh/sbs/media/d2cef6ba0685ea8f9fe2095c6e1ef9f9.jpg b/docs/sbs/en/sbs/media/d2cef6ba0685ea8f9fe2095c6e1ef9f9.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/d2cef6ba0685ea8f9fe2095c6e1ef9f9.jpg rename to docs/sbs/en/sbs/media/d2cef6ba0685ea8f9fe2095c6e1ef9f9.jpg diff --git a/docs/sbs/zh/sbs/media/d516adcc620700e25a229ebfc3dc33fe.jpg b/docs/sbs/en/sbs/media/d516adcc620700e25a229ebfc3dc33fe.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/d516adcc620700e25a229ebfc3dc33fe.jpg rename to docs/sbs/en/sbs/media/d516adcc620700e25a229ebfc3dc33fe.jpg diff --git a/docs/sbs/zh/sbs/media/d8152295b16a9524bb60da43dc35f674.jpg b/docs/sbs/en/sbs/media/d8152295b16a9524bb60da43dc35f674.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/d8152295b16a9524bb60da43dc35f674.jpg rename to docs/sbs/en/sbs/media/d8152295b16a9524bb60da43dc35f674.jpg diff --git a/docs/sbs/zh/sbs/media/dbb0d91af354b1481829d37270a36e0b.jpg b/docs/sbs/en/sbs/media/dbb0d91af354b1481829d37270a36e0b.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/dbb0d91af354b1481829d37270a36e0b.jpg rename to docs/sbs/en/sbs/media/dbb0d91af354b1481829d37270a36e0b.jpg diff --git a/docs/sbs/zh/sbs/media/e2085274508cac96952fdfe232d0c4b4.jpg b/docs/sbs/en/sbs/media/e2085274508cac96952fdfe232d0c4b4.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/e2085274508cac96952fdfe232d0c4b4.jpg rename to docs/sbs/en/sbs/media/e2085274508cac96952fdfe232d0c4b4.jpg diff --git a/docs/sbs/zh/sbs/media/e4c3f24d1835777199a0d86d71bc4dd6.jpg b/docs/sbs/en/sbs/media/e4c3f24d1835777199a0d86d71bc4dd6.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/e4c3f24d1835777199a0d86d71bc4dd6.jpg rename to docs/sbs/en/sbs/media/e4c3f24d1835777199a0d86d71bc4dd6.jpg diff --git a/docs/sbs/zh/sbs/media/f20ca6b0c04fd992473f2f7474af106c.jpg b/docs/sbs/en/sbs/media/f20ca6b0c04fd992473f2f7474af106c.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/f20ca6b0c04fd992473f2f7474af106c.jpg rename to docs/sbs/en/sbs/media/f20ca6b0c04fd992473f2f7474af106c.jpg diff --git a/docs/sbs/zh/sbs/media/f926080e54c4ffe9aef2234c64143cdd.jpg b/docs/sbs/en/sbs/media/f926080e54c4ffe9aef2234c64143cdd.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/f926080e54c4ffe9aef2234c64143cdd.jpg rename to docs/sbs/en/sbs/media/f926080e54c4ffe9aef2234c64143cdd.jpg diff --git a/docs/sbs/zh/sbs/media/sbs_lcd_display_1.jpg b/docs/sbs/en/sbs/media/sbs_lcd_display_1.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/sbs_lcd_display_1.jpg rename to docs/sbs/en/sbs/media/sbs_lcd_display_1.jpg diff --git a/docs/sbs/zh/sbs/media/sbs_lcd_display_2.jpg b/docs/sbs/en/sbs/media/sbs_lcd_display_2.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/sbs_lcd_display_2.jpg rename to docs/sbs/en/sbs/media/sbs_lcd_display_2.jpg diff --git a/docs/sbs/zh/sbs/media/sbs_lcd_display_3.jpg b/docs/sbs/en/sbs/media/sbs_lcd_display_3.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/sbs_lcd_display_3.jpg rename to docs/sbs/en/sbs/media/sbs_lcd_display_3.jpg diff --git a/docs/sbs/zh/sbs/media/sbs_lcd_script_exec_1.jpg b/docs/sbs/en/sbs/media/sbs_lcd_script_exec_1.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/sbs_lcd_script_exec_1.jpg rename to docs/sbs/en/sbs/media/sbs_lcd_script_exec_1.jpg diff --git a/docs/sbs/zh/sbs/media/sbs_lcd_script_exec_2.jpg b/docs/sbs/en/sbs/media/sbs_lcd_script_exec_2.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/sbs_lcd_script_exec_2.jpg rename to docs/sbs/en/sbs/media/sbs_lcd_script_exec_2.jpg diff --git a/docs/sbs/zh/sbs/media/sbs_lcd_script_exec_23.jpg b/docs/sbs/en/sbs/media/sbs_lcd_script_exec_23.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/sbs_lcd_script_exec_23.jpg rename to docs/sbs/en/sbs/media/sbs_lcd_script_exec_23.jpg diff --git a/docs/sbs/zh/sbs/media/sbs_led_picture_0.jpg b/docs/sbs/en/sbs/media/sbs_led_picture_0.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/sbs_led_picture_0.jpg rename to docs/sbs/en/sbs/media/sbs_led_picture_0.jpg diff --git a/docs/sbs/zh/sbs/media/sbs_led_picture_1.jpg b/docs/sbs/en/sbs/media/sbs_led_picture_1.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/sbs_led_picture_1.jpg rename to docs/sbs/en/sbs/media/sbs_led_picture_1.jpg diff --git a/docs/sbs/zh/sbs/media/sbs_led_picture_2.jpg b/docs/sbs/en/sbs/media/sbs_led_picture_2.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/sbs_led_picture_2.jpg rename to docs/sbs/en/sbs/media/sbs_led_picture_2.jpg diff --git a/docs/sbs/zh/sbs/media/sbs_led_picture_3.jpg b/docs/sbs/en/sbs/media/sbs_led_picture_3.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/sbs_led_picture_3.jpg rename to docs/sbs/en/sbs/media/sbs_led_picture_3.jpg diff --git a/docs/sbs/en/sbs/media/sbs_socket_picture_1.png b/docs/sbs/en/sbs/media/sbs_socket_picture_1.png new file mode 100644 index 0000000000000000000000000000000000000000..513d870ad8946658bcedc2cdcb4bf096a42ef399 Binary files /dev/null and b/docs/sbs/en/sbs/media/sbs_socket_picture_1.png differ diff --git a/docs/sbs/en/sbs/media/sbs_socket_picture_10.png b/docs/sbs/en/sbs/media/sbs_socket_picture_10.png new file mode 100644 index 0000000000000000000000000000000000000000..f44eabdd18c9a9d3e52a4fe0b59c14669fdd6352 Binary files /dev/null and b/docs/sbs/en/sbs/media/sbs_socket_picture_10.png differ diff --git a/docs/sbs/en/sbs/media/sbs_socket_picture_2.png b/docs/sbs/en/sbs/media/sbs_socket_picture_2.png new file mode 100644 index 0000000000000000000000000000000000000000..0d93c15e64706c3f1fd6842c946253f9093d0d0c Binary files /dev/null and b/docs/sbs/en/sbs/media/sbs_socket_picture_2.png differ diff --git a/docs/sbs/en/sbs/media/sbs_socket_picture_3.png b/docs/sbs/en/sbs/media/sbs_socket_picture_3.png new file mode 100644 index 0000000000000000000000000000000000000000..da9914445e775ab6aae8a3b2b38fcc3477ed393c Binary files /dev/null and b/docs/sbs/en/sbs/media/sbs_socket_picture_3.png differ diff --git a/docs/sbs/en/sbs/media/sbs_socket_picture_4.png b/docs/sbs/en/sbs/media/sbs_socket_picture_4.png new file mode 100644 index 0000000000000000000000000000000000000000..20eacf5ea3837b5daafb5755eef6a459ad376be6 Binary files /dev/null and b/docs/sbs/en/sbs/media/sbs_socket_picture_4.png differ diff --git a/docs/sbs/en/sbs/media/sbs_socket_picture_5.png b/docs/sbs/en/sbs/media/sbs_socket_picture_5.png new file mode 100644 index 0000000000000000000000000000000000000000..01b43cc768f6703d3b1e54f44b7cc3a1aa9cda33 Binary files /dev/null and b/docs/sbs/en/sbs/media/sbs_socket_picture_5.png differ diff --git a/docs/sbs/en/sbs/media/sbs_socket_picture_6.png b/docs/sbs/en/sbs/media/sbs_socket_picture_6.png new file mode 100644 index 0000000000000000000000000000000000000000..ec4646739464a740ae9bf90c8fb7187cbec65db6 Binary files /dev/null and b/docs/sbs/en/sbs/media/sbs_socket_picture_6.png differ diff --git a/docs/sbs/en/sbs/media/sbs_socket_picture_7.png b/docs/sbs/en/sbs/media/sbs_socket_picture_7.png new file mode 100644 index 0000000000000000000000000000000000000000..c524185af736bb2138c5ee76236883f91e93709b Binary files /dev/null and b/docs/sbs/en/sbs/media/sbs_socket_picture_7.png differ diff --git a/docs/sbs/en/sbs/media/sbs_socket_picture_8.png b/docs/sbs/en/sbs/media/sbs_socket_picture_8.png new file mode 100644 index 0000000000000000000000000000000000000000..b3d41386fccd82b6641eb4c34bd99b01d4c8a564 Binary files /dev/null and b/docs/sbs/en/sbs/media/sbs_socket_picture_8.png differ diff --git a/docs/sbs/en/sbs/media/sbs_socket_picture_9.png b/docs/sbs/en/sbs/media/sbs_socket_picture_9.png new file mode 100644 index 0000000000000000000000000000000000000000..884981ae1fb0ac2efb7ead8ebce1db6979001c3a Binary files /dev/null and b/docs/sbs/en/sbs/media/sbs_socket_picture_9.png differ diff --git a/docs/sbs/en/sbs/mpycross.md b/docs/sbs/en/sbs/mpycross.md new file mode 100644 index 0000000000000000000000000000000000000000..37cfd1e6cb107318a32085d818229032eb624169 --- /dev/null +++ b/docs/sbs/en/sbs/mpycross.md @@ -0,0 +1,88 @@ +### MPY cross tool instruction + +#### ** tool introduction** + +In Python, you can compile. Py files into. PyC files. The compiled. PyC file is in binary format, which can speed up the loading speed and, more importantly, protect the original code. Micro Python compiles and encrypts the. Py file using the MPY cross tool. The compiled file is. MPY. + +**Document description** + +**. py file** +Python source code file + +**. PyC file** +Binary file, python source code file, bytecode file generated after compilation PyC file loading speed has been improved, and PyC is a cross platform bytecode, which is executed by Python virtual machine. + +**. MPY file** +Micropython provides an MPY cross tool for compiling Python source code files into. MPY files. This file and. PyC file are binary bytecode files. + +**Parameter description** + +![](media/Quectel_Qp_mpy_cross_tools_how_to_use_01.jpg) + +​ Figure 1: MPY cross parameter usage description image index + +**Remarks** + +For more information on the MPY cross tool, visit the following link: +https://pypi.org/project/mpy-cross/1.9.3/ +https://makeblock-micropython-api.readthedocs.io/zh/latest/novapi/tutorial/precompiled_to_mpy.html + +#### Tool use + +1. Connect ec100y-cn development board to the computer, as shown in the figure below. Please refer to quectel for the operation method after access_ QuecPython_ Basic operating instructions. + + ![](media/Quectel_Qp_mpy_cross_tools_how_to_use_02.jpg) + + ​ Figure 2: connecting the development board to the computer + + + + + ``` + def test_mpy(): + print(“hello this is mpy file”) + ``` + + + + + + ![](media/Quectel_Qp_mpy_cross_tools_how_to_use_03.jpg) + + + + + + + + ``` + mpy-cross-amd64.exe -mno-unicode usertest.py + ``` + + + + ![](media/Quectel_Qp_mpy_cross_tools_how_to_use_04.jpg) + + + +5. Import the usertest module in the test.py file and directly call the methods in the usertest file, as shown below: + + ``` + import usertest + usertest.test_mpy() + ``` + + + +6. Upload the test.py file and usertest.mpy file to the ec100y-cn development board of China Mobile Communications respectively. See the upload method for details + 《Quectel_ QuecPython_ Basic operating instructions. + + + +7. Run the test.py file in the development board to see the execution results of the usertest module encrypted by MPY cross tool, as follows: + As shown in the figure. + + ![](media/Quectel_Qp_mpy_cross_tools_how_to_use_05.jpg) + + ​ Figure 5: test.py running results + diff --git a/docs/sbs/en/sbs/ntp.md b/docs/sbs/en/sbs/ntp.md new file mode 100644 index 0000000000000000000000000000000000000000..b78e0e7becde328fbe0fd8f1832e4c9b24aab121 --- /dev/null +++ b/docs/sbs/en/sbs/ntp.md @@ -0,0 +1,80 @@ +## Revision history +|Version | date | author | change statement| +|------|------|------|------| +|1.0 | 2021-4-1 | gary.zhou | First Edition| + +## NTP application development + +This paper mainly introduces the guidance of NTP. + +## Overview + +NTP, also known as network time protocol, is a protocol used to synchronize computer time. The protocol enables the computer to synchronize its server or clock source (such as quartz clock, GPS, etc.), and provides high-precision time correction (the difference between LAN and standard time is less than 1 millisecond, and the difference between Wan and standard time is about tens of milliseconds), and can prevent malicious protocol attacks by means of encryption confirmation. The purpose of NTP is to provide accurate and robust time services in a disordered Internet environment. + +NTP provides accurate time. First, there must be an accurate time source, that is, international standard time UTC. NTP can obtain UTC from atomic clock, observatory, satellite or Internet. Time is propagated according to the level of NTP server, and all servers are classified into different stratum (layers) according to the distance from the external UTC time source. Stratum - 1 is on the top floor with external UTC access; Stratum - 2 obtains the time from stratum - 1; Stratum - 3 gets the time from stratum - 2,..., and so on, but the total number of stratums is limited to 15. All these servers logically form a ladder architecture and are connected with each other, and the time server of stratum - 1 is the basis of the whole system. The computer host is generally connected to multiple time servers, and the statistical algorithm is used to filter the time from different servers to select the best path and source to correct the host time. Even if the host cannot contact a time server for a long time, the NTP service still operates effectively. + +In order to prevent malicious damage to the time server, NTP uses the authentication mechanism to check whether the time synchronization information really comes from the claimed server, and check the return path of the data to provide a protection mechanism against interference. The time contained in NTP time synchronization message is Greenwich mean time, which is the number of seconds calculated from 1900. + +## API introduction + +Please refer to [quecpthon ntptime NTP timing] for specific API details(https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonThirdlib?id=ntptime-ntp对时) + +## Function realization + +NTP time synchronization needs to obtain time from NTP server, so it is necessary to connect to the network before realizing NTP time synchronization function. This document takes networking through SIM card as an example. + +### Operation 1: +Prepare an available SIM card, insert the SIM card, power on and wait for automatic dialing. Take ec600s-cn as an example, ec600s_ QuecPython_ EVB_ The v1.1 development board is equipped with a nano SIM card holder, which is self elastic, with the contact downward and the notch inward. The SIM card slot position is shown in the figure: + +![](media/QuecPython_sbs_ntp01.png) + + ​ Figure 1: inserting SIM card + +After automatic dialing, you can verify whether the dialing is successful by the following methods: + +![](media/QuecPython_sbs_ntp03.png) + +​ Figure 2: automatic dialing success verification + +### Operation 2: + +After successful dialing, import the ntpptime module and return to the current NTP server. The default is "NTP. Aliyun. Com". + +![](media/QuecPython_sbs_ntp02.png) + + ​ Figure 3: current NTP server + +### Operation 3: + +Set up NTP server. 0 is returned for setting success, and - 1 is returned for setting failure. + +![](media/QuecPython_sbs_ntp04.png) + + ​ Figure 4: setting up NTP server + +### Operation 4: + +Use ntptime. Settime() to synchronize NTP time. 0 - synchronization success, 1 - synchronization failure. + +The timing results can be verified using utime. Localtime(). After executing utime. Localtime(), the current time is returned. The returned value is a tuple: (year, month, mday, hour, minute, second, weekday, yearday). For specific API details, please refer to [quecpthon utime time related functions](https://python.quectel.com/wiki/#/zh-cn/api/pythonStdlib?id=utime-与时间相关功能)。 + +Ntptime. Settime() returns UTC time after time synchronization. Beijing time is eight hours ahead of UTC. Therefore, after time synchronization, it can be found that the time is eight hours backward compared with the current time. + +![](media/QuecPython_sbs_ntp05.png) + + ​ Figure 5: timing success + +## Appendix abbreviations of terms + +Table 1: Abbreviations of terms + +|Terminology | English description | Chinese description| +| ---------- | --------------------------------- |----------- | +| GPS | Global Positioning System | Global positioning system| +| LAN | Local Area Network | LAN| +| NTP | Network Time Protocol | Network time protocol| +| RTC | Real_ Time Clock | Real time clock| +| SIM | Subscriber Identity Module | User identification module| +| UTC | Coordinated Universal Time | Coordinated universal time| +| WAN | Wide Area Network | Wide area network| + diff --git a/docs/sbs/en/sbs/pwm.md b/docs/sbs/en/sbs/pwm.md new file mode 100644 index 0000000000000000000000000000000000000000..1f90d190e1233c3d6fb441db89cdd6e449e0a88b --- /dev/null +++ b/docs/sbs/en/sbs/pwm.md @@ -0,0 +1,109 @@ +### PWM instruction + +#### PWM related interface + +**Create PWM object** + +First, import PWM under misc module, and then create PWM object. For example code, refer to the following code listing: + +``` +from misc import PWM +pwm0 = PWM(PWM.PWMn,PWM.ABOVE_xx,highTime,cycleTime) +``` + +**Parameters** + +``` +Parameters Parameter type Parameter description + PWM.PWM0 PWM0 +PWM.PWMn PWM.PWM1 PWM1 + PWM.PWM2 PWM2 + PWM.PWM3 PWM3 + + +PWM.ABOVE_ MS Ms level value range: (01023] +PWM.ABOVE_ xx PWM.ABOVE_ 1US Us level value range: (0157] +PWM.ABOVE_ 10US Us level value range: (11575] +PWM.ABOVE_ BELOW_ US Ns level value (01024] + + +highTime int In MS level, the unit is Ms +In case of class us, the unit is us +Ns level: user calculation is required + Frequency = 13mhz / cycletime + Duty cycle = hightime / cycletime + + +cycleTime int In MS level, the unit is Ms +In case of class us, the unit is us +Ns level: user calculation is required + Frequency = 13mhz / cycletime + Duty cycle = hightime / cycletime + +``` + + + +**pwm.open** + +This method is used to start outputting PWM. + +**Function prototype** + +``` +pwm.open() +``` + +**Parameters** + +nothing + +**Return value** + +0 succeeded + +-1 failed + + + +**pwm.close** + +This method is used to turn off the output PWM. + +**Function prototype** + +``` +pwm.open() +``` + +**Parameters** + +nothing + +**Return value** + +0 succeeded + +-1 failed + + + +#### PWM execution example + + + +```python +from misc import PWM +pwm1 = PWM(PWM.PWM0,PWM.ABOVE_MS, 1, 2) +pwm1 = PWM(PWM.PWM0,PWM.ABOVE_1US, 100, 200) +pwm1 = PWM(PWM.PWM0,PWM.ABOVE_10US, 100, 200) +``` + +#### Appendix abbreviations of terms + +Table 1: Abbreviations of terms + +|Abbreviation | full English name | full Chinese name| +| ---- | ---------------------- | ------------ | +|PWM pulse width modulation| + diff --git a/docs/sbs/zh/sbs/res/res.pdf b/docs/sbs/en/sbs/res/res.pdf similarity index 100% rename from docs/sbs/zh/sbs/res/res.pdf rename to docs/sbs/en/sbs/res/res.pdf diff --git a/docs/sbs/en/sbs/socket.md b/docs/sbs/en/sbs/socket.md new file mode 100644 index 0000000000000000000000000000000000000000..c90d59f57f58c1381a27f4414571a3c8e9f936e7 --- /dev/null +++ b/docs/sbs/en/sbs/socket.md @@ -0,0 +1,160 @@ +## Revision history + +|Version | date | author | change statement| +| ---- | -------- | ------- | ---------------- | +|1.0 | 2021-4-7 | grey. Tu | first version, socket use| + + + +## Socket Development Guide + +This article mainly introduces socket socket. Readers can learn the basic operation of socket socket interface through their understanding of this article. + + + +## Socket overview + +### Socket introduction + +​ The so-called two-way communication between socket processes is the so-called two-way communication between socket processes on the network. A socket is the end of process communication on the network, which provides a mechanism for application layer processes to exchange data using network protocol. In terms of its position, socket connects the application process and the network protocol stack. It is the interface for applications to communicate through the network protocol and the interface for applications to interact with the network protocol root. + +​ Socket can be regarded as the endpoint of each communication connection when two network applications communicate, which is a logical concept. It is not only an API (Application Programming Interface) for inter process communication in the network environment, but also a communication endpoint that can be named and addressed. Each socket in use has its type and a process connected to it. During communication, one of the network applications writes a piece of information to be transmitted into the socket of its host. The socket sends the information to the socket of another host through the transmission medium connected to the network interface card (NIC), so that the other can receive the information. Socket is a combination of IP address and port to provide a mechanism for transmitting data packets to application layer processes. + +​ Socket is an intermediate software abstraction layer for communication between application layer and TCP / IP protocol family. It is a group of interfaces. In the design mode, socket is actually a facade mode. It hides the complex TCP / IP protocol family behind the socket interface. For users, a group of simple interfaces is all, allowing the socket to organize data to comply with the specified protocol. + +![Quectel_sbs_Socket_relation_2](media/Quectel_sbs_Socket_relation_2.png) + +### Socket procedure + +​ Socket originated from UNIX, and one of the basic philosophies of UNIX / Linux is "everything is a file". You can use "open" → +Write / read → close mode. In the implementation process, the server can be regarded as a web server, and the client can be regarded as a browser to access the web server. The access process can correspond to open → read / write → close one by one. + +![Quectel_sbs_Socket_course](media/Quectel_sbs_Socket_course.png) + +### ** socket application** + +​ Socket enables an application to read and write data from the network. Two applications on different computers can send and receive byte streams through connections. Note that when sending messages, you need to know each other's IP and port. There are many application scenarios in daily life. When you browse the web page, how does the browser process communicate with the web server process; When you chat with QQ, how does the QQ process communicate with the QQ process where the server or friends are located? These are realized through socket. + +## Introduction to quecpthon socket API + +Please refer to [usocket - socket module] for specific API details(https://python.quectel.com/wiki/#/zh-cn/api/pythonStdlib?id=usocket-socket模块) + +## Socket function implementation + +​ Before this function test, you need to understand the basic operation of quecpthon. For the basic operation methods, see [quectel]_ QuecPython_ Basic operating instructions](https://python.quectel.com/doc/doc/sbs/zh/index.html)。本章节将通过介绍在QuecPython上创建一个TCP客户端连接服务器为例给大家介绍Socket功能。 + +​ Since the module connects to the server as a TCP client, it needs to provide a connection server before connecting. Here, we mainly introduce the socket function of the module. You can learn more about the server. Here we introduce a relatively simple test method, using network resources: [Anxin Kechuan cloud v1.0](http://tt.ai-thinker.com:8000/ttcloud)进行测试。[安信可透传云 V1.0](http://tt.ai-thinker.com:8000/ttcloud)提供了连接服务器;数据发送;数据接收;断开连接等功能。 + +### Interactive experiment + +According to [quectel_ QuecPython_ Basic operating instructions](https://python.quectel.com/doc/doc/sbs/zh/index.html)进入命令交互状态,进行以下操作。 + +#### Import the usocket module and create a socket instance: + +```python +import usocket +sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) +``` + +![sbs_socket_picture_1](media/sbs_socket_picture_1.png) + +#### Open [Anxin Kechuan cloud v1.0](http://tt.ai-thinker.com:8000/ttcloud)查看需要连接的IP地址及端口号: + +![sbs_socket_picture_2](media/sbs_socket_picture_2.png)注:由于此服务器为网络共享资源,提供的IP地址与端口若三分钟没有设备建立连接会自动回收,固建立连接的过程需要在此时间内进行,不然将出现错误。 + +#### Establish a connection with the server: + +```python +sock.connect(('122.114.122.174', 34187)) +``` + +![sbs_socket_picture_3](media/sbs_socket_picture_3.png) + +Note: 1. The IP address and port of the API parameter must be the IP address and port of the server. + +​ 2. The API parameters for establishing a connection must be enclosed with "()" because the bottom layer will pass in the IP address and port number as a parameter. + +![sbs_socket_picture_4](media/sbs_socket_picture_4.png)发送指令后可以在网址上看到模块已经上线,下面便可以进行数据交互了。 + +#### Module upload data: + +```python +>>> ret=sock.send('1234567890\r\n') +>>> print('send %d bytes' % ret) +send 12 bytes +``` + +![sbs_socket_picture_5](media/sbs_socket_picture_5.png) + +![sbs_socket_picture_6](media/sbs_socket_picture_6.png)模块上传数据后可以在服务器上看到模块上传的数据。 + +#### Data distributed by the server: + +![sbs_socket_picture_7](media/sbs_socket_picture_7.png) + +After the server issues the data, the module can read the data. The reading instructions and reading effects are as follows: + +```python +>>> data=sock.recv(1024) +>>> print('recv %s bytes:' % len(data)) +recv 10 bytes: +>>> print(data.decode()) +0123456789 +``` + +![sbs_socket_picture_8](media/sbs_socket_picture_8.png) + +#### Disconnect: + +```python +sock.close() +``` + +![sbs_socket_picture_9](media/sbs_socket_picture_9.png) + +After the disconnection command is executed, the equipment on the server side will be offline, as shown in the following figure: ![ sbs_ socket_ picture_ 10](media/sbs_socket_picture_10.png) + +So far, the module has finished connecting to the server as a TCP client. + +### Code experiment + +The function implementation code of usocket server is shown in the figure below: + +```python +#Import usocket module +import usocket + +#Create a socket instance +sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) +#Set port multiplexing +sock.setsockopt(usocket.SOL_SOCKET, usocket.SO_REUSEADDR, 1) + +sock.bind(('127.0.0.1', 6000)) + +sock.listen(50) + +sock.close() + +while True: + newSock, addr = sock.accept() + newSock.send('hello world') + recv_data = newSock.recv(256) + print(recv_data.decode()) + newSock.close() + break +``` + +## Appendix abbreviations of terms + +Table 1: Abbreviations of terms + +|** abbreviation *** full English name *** full Chinese name **| +| -------- | --------------------------------- | ---------------- | +|Application programming interface| +|Http | Hyper Text Transfer Protocol | Hypertext Transfer Protocol| +|SDK software development kit| +|TCP transmission control protocol| +|IPv4 internet protocol version 4 Internet Protocol version 4| +|NIC | network interface controller | network interface controller| +|BSD | Berkeley Socket Berkeley | Socket| + diff --git a/docs/sbs/en/sbs/tencentyun.md b/docs/sbs/en/sbs/tencentyun.md new file mode 100644 index 0000000000000000000000000000000000000000..0034883b18fd1cae5be106c8c8c16c5c8bbab51a --- /dev/null +++ b/docs/sbs/en/sbs/tencentyun.md @@ -0,0 +1,149 @@ +### Access Tencent cloud application development guidance + +The Internet of things platform provides safe and reliable connection and communication capabilities for devices, connects massive devices downward, and supports device data collection and cloud; The cloud API is provided upward, and the server sends instructions to the device by calling the cloud API to realize remote control. The IOT platform also provides other connection management capabilities, such as device management, rule engine, security capabilities, etc., enabling various IOT scenarios and industry developers. + +-Tencent cloud Internet of things platform document:[ https://cloud.tencent.com/document/product/634 ](https://cloud.tencent.com/document/product/634) +-Tencent cloud Internet of things platform management:[ https://console.cloud.tencent.com/iothub ](https://console.cloud.tencent.com/iothub/product/U2D3JII78Y/log) + +Developers can log in to the above website to learn more about the Internet of things platform and device access. + + + +#### Create products and devices + +Step ** 1 **: log in to Tencent cloud Internet of things platform ([ https://console.cloud.tencent.com/iothub ),](https://console.cloud.tencent.com/iothub)显示界面如下: + +![Quectel_sbs_tencent_Iot_plat_014.png](media/Quectel_sbs_tencent_Iot_plat_014.png) + +​ Figure ** 1 **: Tencent cloud login interface + +Step ** 2 **: click "create new product", create a new product name, and select "key authentication" and "user defined" data formats, as shown in the following figure + +As shown in: + +![Quectel_sbs_tencent_Iot_plat_015.png](media/Quectel_sbs_tencent_Iot_plat_015.png) + +​ Figure ** 2 **: new product + +Step ** 3 **: click "OK" to open the following product list interface: + +![Quectel_sbs_tencent_Iot_plat_016.png](media/Quectel_sbs_tencent_Iot_plat_016.png) + +​ Figure ** 3 **: product list + +Step ** 4 **: enter product management, and the equipment list interface as shown in the following figure appears: + +![Quectel_sbs_tencent_Iot_plat_017.png](media/Quectel_sbs_tencent_Iot_plat_017.png) + +​ Figure ** 4 **: equipment list interface + +Step ** 5 **: click "device list" and "add new device" successively to start creating a new device name and key. After setting, click "save", as shown below + +As shown in the figure: + +![Quectel_sbs_tencent_Iot_plat_018.png](media/Quectel_sbs_tencent_Iot_plat_018.png) + +​ Figure ** 5 **: creating a new device + +Step ** 6 **: after creating a new device, a prompt of successful creation will appear. The details are as follows: + +![Quectel_sbs_tencent_Iot_plat_019.png](media/Quectel_sbs_tencent_Iot_plat_019.png) + +​ Figure ** 6 **: device creation success prompt + +Step ** 7 **: click "start managing device" in the above figure to enter the device details interface, as shown in the following figure: + +![Quectel_sbs_tencent_Iot_plat_020.png](media/Quectel_sbs_tencent_Iot_plat_020.png) + +​ Figure ** 7 **: equipment details page + +Step ** 8 **: copy and save the device key, client ID and other information, as shown in the following figure + +![Quectel_sbs_tencent_Iot_plat_021.png](media/Quectel_sbs_tencent_Iot_plat_021.png) + +​ Figure ** 8 **: device key + +Step ** 9 **: enter the permission list to view the topics of related publications and subscriptions, as shown in the following figure: + +![Quectel_sbs_tencent_Iot_plat_022.png](media/Quectel_sbs_tencent_Iot_plat_022.png) + +​ Figure ** 9 **: topic list + +#### Write Tencent cloud test program + +Step ** 1 **: connect the development board to the computer. Please refer to quectel for the operation method after connection_ QuecPython_ Basic operating instructions. + +![Quectel_sbs_tencent_Iot_plat_023.png](media/Quectel_sbs_tencent_Iot_plat_023.png) + +​ Figure ** 10 **: connecting the development board to the computer + +Step ** 2 **: create the * test. Py * file, write the following code, and fill the relevant parameters saved in Chapter ** 3.1 ** into the code, as shown below: + +```python +from TenCentYun import TXyun + +productID = "U2D3JII78Y" #Product identification +devicename = "dev1" #Equipment name +devicePsk = "p2h/OlKGnOPMdugNTGAFrg==" #Device key (one type one secret authentication, this parameter is passed to none) productsecret = none # product key (one machine one secret authentication, this parameter is passed to none) + +tenxun = TXyun(productID, devicename, devicePsk, ProductSecret) #Create connection object + +def sub_cb(topic, msg): #Cloud message response callback function + print("subscribe recv:") + print(topic, msg) + +tenxun.setMqtt() +tenxun.setCallback(sub_cb) +topic_sub = "U2D3JII78Y/dev1/control" #Enter subscription topic +topic_pub = "U2D3JII78Y/dev1/event" #Enter publishing topic +tenxun.subscribe(topic_sub) +tenxun.publish(topic_pub, "hello world") +tenxun.start() +``` + +Step ** 3 **: upload the test.py file to the development board. See quectel for the upload method_ QuecPython_ Basic operating instructions. + +Step ** 4 **: run the * test. Py * file on ec100y-cn development board, as shown in the following figure: + +![Quectel_sbs_tencent_Iot_plat_025.png](media/Quectel_sbs_tencent_Iot_plat_025.png) + +​ Figure ** 11 **: running ** test. Py ** file + +#### Subscribe to Tencent ECS messages + +Step ** 1 **: open the "online debugging" page of Tencent cloud device, select the topic as shown in the figure, and enter any content in the "message content" box + +Click "send message", as shown in the figure below: + +![Quectel_sbs_tencent_Iot_plat_026.png](media/Quectel_sbs_tencent_Iot_plat_026.png) + +​ Figure ** 12 **: writing message content + +Step ** 2 **: the device side will receive the subscription message sent by Tencent cloud, as shown in the figure below: + +![Quectel_sbs_tencent_Iot_plat_027.png](media/Quectel_sbs_tencent_Iot_plat_027.png) + +​ Figure ** 13 **: device subscription message receiving interface + +#### Devices publish messages to Tencent cloud + +Open the "product list" of Tencent cloud, click "device management" --> "cloud log" --> "behavior log" in turn to view the messages released by the device to Tencent cloud platform, as shown in the following figure: + +![Quectel_sbs_tencent_Iot_plat_028.png](media/Quectel_sbs_tencent_Iot_plat_028.png) + +​ Figure ** 14 **: Tencent cloud receives the device release message + +#### Appendix a reference documents and abbreviations of terms + +Table ** 1 **: reference documents + +|Serial number | document name | remarks| +| ---- | ------------------------------- | --------------------------- | +| [1] | Quectel_ QuecPython_ Basic operating instructions | instructions for uploading and downloading quecpthon files| + +Table ** 2 **: Abbreviations of terms + +|Term | full English name | full Chinese name| +| ---- | --------------------------------- | ---------------- | +|API Application Programming Interface| +|IOT Internet of things| diff --git a/docs/sbs/en/sbs/timer.md b/docs/sbs/en/sbs/timer.md new file mode 100644 index 0000000000000000000000000000000000000000..62cd4230c40f36275d4e271eae7fdacac76eb294 --- /dev/null +++ b/docs/sbs/en/sbs/timer.md @@ -0,0 +1,151 @@ +### Timer instruction + +#### Timer function + +**Basic functions of timer** + +Timers can be used for a variety of tasks. At present, only the simplest case is realized, that is, the function is called regularly. The timer provided by the current mobile communication can realize two modes: single call and periodic call. When the timer cycle is reached, an event is triggered. By using the callback function, the timer event can call a python function. + +**Timer function example** + +Connect the development board to the computer, and then refer to quectel_ QuecPython_ The basic operation instructions document is used for operation, which is shown in the following figure +Take ec100y-cn module as an example. + +![](media/782cd2c870c62e6f022cca4e47c7c806.jpg) + +>Figure ** 1 **: module connected to computer + +>Create a test.py file and import the timer class in quecpthon in the file. The timer class is in machine +>Module. Write timer code as follows: + +``` +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 +>Upload the file to the development board. See quectel for the upload method_ QuecPython_ Basic operating instructions. + +>The program running results are as follows: + +``` +>>> import example + +>>> example.exec('test.py') + +>>> ###timer callback function### + + ###timer callback function### + + ###timer callback function### + + ###timer callback function### + + ###timer callback function### + + ###timer callback function### + + ###timer callback function### + + ###timer callback function### + +timer.stop() 0 + +>>> +``` + + + +#### ** timer in quecpthon ** + +**Constants in timer class** + +|Constant | description| +| -------------- | -------------------------- | +|Timer.timer0 | timer 0| +|Timer.timer1 | timer 1| +|Timer.timer2 | timer 2| +|Timer.timer3 | timer 3| +| Timer.ONE_ Shot | single time mode, the timer only executes once| +|Timer.periodic 𞓜 cycle mode, timer cycle execution| + +#### Methods in timer class + +**timer = Timer** + +>This function is used to create a timer object. Use timer correlation functions * timer. Start * and +>Use this function before * timer. Stop * + +>Instantiate an object, that is, create a timer object. + +-Function prototype + + timer = Timer(Timern) + +-Parameters + + *Timern *: constant. Timer number. Ec100y-cn and ec600s-cn + The timers supported by the module are: timer0 ~ timer3. ⚫ Return value + + Returns the timer object. + +**timer.start** + +>This function is used to start the timer. + +-Function prototype + + timer.start(period, mode, callback) + +-Parameters + + *Period *: integer. Interrupt period, in milliseconds. + + *mode*: + + Constant. Timer operation mode, as follows: + + Timer.ONE_ In shot single mode, the timer is executed only once + + Timer.periodic cycle mode, loop execution + + *Callback *: callback function, which is executed regularly. + +-Return value + + 0 timer started successfully- 1 timer start failed. + +**timer.stop** + +>This function is used to turn off the timer. + +-Function prototype + + timer.stop() + +-Parameters + + None. + +-Return value + + 0 timer closed successfully- 1 timer off failed. + + +#### Appendix + +>Table ** 1 **: Abbreviations of terms + +|Term | full English name | full Chinese name| +| ---- | --------------------------------- | ---------------- | +|API Application Programming Interface| + diff --git a/docs/sbs/en/sbs/tts.md b/docs/sbs/en/sbs/tts.md new file mode 100644 index 0000000000000000000000000000000000000000..ea6e190d1c02716e858ab727c4037c974eeb9f2c --- /dev/null +++ b/docs/sbs/en/sbs/tts.md @@ -0,0 +1,267 @@ +### TTS usage guide + +#### Overview + +TTS is the abbreviation of text to speech, i.e. "from text to speech". It is a part of man-machine dialogue, so that the machine can speak. It is an outstanding work using linguistics and psychology at the same time. With the support of built-in chip, it intelligently converts characters into natural speech flow through the design of neural network. TTS technology can convert text files in real time. The conversion time can be calculated in seconds. Under the action of its unique intelligent voice controller, the voice rhythm of text output is smooth, making the listener feel natural when listening to information, without the indifference and astringency of machine voice output. Before using the TTS module function of the development board, we need to understand the audio interface of the module, as shown in the following figure (taking ec100y-cn module as an example): + +![](media/35b9112bf62d5cc4a417eb4190b0a979.jpg) + +>Figure ** 1 **: ** ec100y-cn ** module ** audio ** interface + +>After connecting the 3.5mm audio interface, download the driver and install the firmware according to the instructions for use of quectel-quecpthon-cat1 development board. + +#### TTS API details + +>This chapter introduces TTS related APIs. + +**tts = audio.TTS** + +>This function is used to import audio library and create TTS object. + +-Function prototype + + import audio + + tts = audio.TTS(device) + +-Parameters + + *device*: + + Indicates the equipment type, and the values are as follows: + +1. Microphone + +2. Headphones + +3. Horn + +> ⚫ Return value + +>None. + +**tts.play** + +>This function is used to play voice. + +-Function prototype + + tts.play(priority, breakin, mode, str) + +-Parameters + + *Priority *: integer. Playback priority: priority 0 ~ 4 is supported. The higher the value, the higher the priority. + + *Breakin *: integer. Interrupt mode, 0 means that it is not allowed to be interrupted, and 1 means that it is allowed to be interrupted. + + *mode*: + + Integer. Encoding mode: + +1. UNICODE16 (Size end conversion) + +2. UTF-8 + +3. UNICODE16 (Don't convert) + + *STR *: string. String to be played. + + ⚫ Return value + +0 played successfully + +>- 1 playback failed + +>1 can't play now. Join the playback queue + +-2 cannot play immediately, and the requested priority group Queue task has reached the upper limit, so it cannot be added to the playback queue + +>Priority 0 ~ 4 is supported. The higher the number, the higher the priority. Each priority group can add up to 10 at the same time +>A playback task. See for the playback queue policy + +>Quectel quecpthon class library API description. + +**tts.setSpeed** + +>This function is used to set the playback speed. + +-Function prototype + + tts.setSpeed(speed) + +-Parameters + + *Speed *: integer. Playback speed, range: 0 ~ 9. The higher the value, the faster the speed. + + + + + +**tts.setVolume** + + + + + + tts.setVolume(vol) + + + + *Integer: Vol *. Play volume. Range: 0 ~ 9, 0 means mute. + +-Return value + + If the setting succeeds, the current volume will be returned. If the setting fails, the integer - 1 will be returned. + +**tts.getSpeed** + +>This function is used to obtain the current playback speed. + +-Function prototype + + tts.getSpeed() + +-Parameters + + None. + +-Return value + + The current playback speed is returned successfully, and the integer - 1 is returned if it fails. + +**tts.getVolume** + +>This function is used to obtain the playback volume. + +-Function prototype + + tts.getVolume() + +-Parameters + + None. + +-Return value + + The current playback volume is returned successfully, and the integer - 1 is returned if it fails. + +**tts.getState** + +>This function is used to obtain the current playback status. + +-Function prototype + + tts.getState() + +-Parameters + + None. + +-Return value + +1. No TTS playback currently + +2. TTS is currently playing + +**tts.stop** + +>This function pauses playback. + +-Function prototype + + tts.stop() + +-Parameters + +>None. + +-Return value + +0 pause successfully + +>- 1 pause failed + +**tts.close** + +>This function is used to turn off TTS function. + +-Function prototype + + tts.close() + +-Parameters + + None. + +-Return value + +0 successfully closed TTS + +>- 1 failed to close TTS + +#### TTS function implementation + +**Command line execution** + +1. Through xshell + After connecting the main serial port of the development board, follow the following steps to import the audio library and create TTS through the following functions + Object: + + import audio tts = audio.TTS(device) + +![](media/cd4fe22a5b5b1c9a1ecad743187c1d14.jpg) + +1. Play voice using the following functions: + + tts.play(priority, breakin, mode, str) + +![](media/9c3b369e3dc8b4f7b157861383dbbfac.jpg) + +![](media/ca8b43ce1e9c9364ba50d7a744f72b71.jpg) + +1. At this time, you can hear the voice playing text content in the headset through * TTS. Setspeed (speed) * and + *TTS. SetVolume (vol) * to set the playback speed and volume. + +![](media/d2cef6ba0685ea8f9fe2095c6e1ef9f9.jpg) + +1. Through * TTS. Getspeed() * and + *TTS. Getvolume() * to get the current playback speed and volume. In addition, through + *TTS. Getstate() * to get the current playback state. + +![](media/dbb0d91af354b1481829d37270a36e0b.jpg) + +1. You can pause playback by * TTS. Stop() * during playback. After playing, it can be closed through * TTS. Close() * + TTS function. + +![](media/7a5e31394f4d29cc26626c279cc933fe.jpg) + +**Execute py file** + +1. First, enter the demo directory in the SDK toolkit provided, find the TTS folder, and use the qpycom tool to + Example under TTS directory_ tts.py + Send the script file to the module. For the specific steps of sending and executing the script file, see qpycom + Tool instructions. + +![](media/139025156eadcb1ec370ba48b610e43e.jpg) + +1. In xshell, connect the main serial port of the module, enter the interactive interface, and + *Use the UOS. Listdir() * method to confirm whether the script file sent in the previous step is in the current directory, and then perform the following steps: + +![](media/85a947dbbd4ec41cb30a42b2a0e60a70.jpg) + +Import the example module through import example, which provides the * exec() * method to execute python +The script program executes example.tts.py through * example. Exec ('example. TTS. Py ') * +After the script is executed, you can hear the voice of playing the text content in the script in the headset. + +#### Appendix + +>Table ** 1 **: Abbreviations of terms + +|Term | full English name | full Chinese name| +| ------- | ------------------------------------------------------ | ------------------------------- | +|API Application Programming Interface| +|LTE | long term evolution | long term evolution| +|SDK software development kit| +|TTS | text to speech | from text to speech| +|Unicode | Unicode | unified code| +|UTF | universal character set / Unicode transformation format | variable length character encoding for Unicode| diff --git a/docs/sbs/en/sidebar.yaml b/docs/sbs/en/sidebar.yaml new file mode 100644 index 0000000000000000000000000000000000000000..13cdd1a589e41a8e02b70b3a91a4ee983d63a86f --- /dev/null +++ b/docs/sbs/en/sidebar.yaml @@ -0,0 +1,44 @@ +# Handle tutorial +items: + - label: basic operating instructions + file: README.md + - label: network application + items: + - label: socket programming + file: sbs/socket.md + - label: MQTT + items: + - label: mqtt basic usage + file: mqtt/mqtt_base_how_to_use.md + - label: mqtt FAQ + file: mqtt/mqtt_Faq_use.md + - label: HTTP client development + file: sbs/http.md + - label: NTP application development + file: sbs/ntp.md + - label: System + items: + - label: instructions for reading and writing files + file: sbs/file.md + - label: multithreading Application Development Guide + file: thread/thread.md + - label: bus instruction + file: sbs/bus.md + - label: timer instruction + file: sbs/timer.md + - label: Application + items: + - label: GPS usage guide + file: sbs/gps.md + - label: NTP instruction + file: sbs/ntp.md + # - label: audio instruction + # file: sbs/audio.md + # - label: TTS instruction + # file: sbs/tts.md + - label: LCD instruction + file: sbs/lcd.md + - label: st7789 240 * 240 LCD display picture + file: lcd/st7789_lcd.md + # - label: record recording instruction + # file: sbs/record.md diff --git a/docs/sbs/en/thread/code/Qp_thread_exit.py b/docs/sbs/en/thread/code/Qp_thread_exit.py new file mode 100644 index 0000000000000000000000000000000000000000..55e4a63bb4a18e950147996c789806367d368eaa --- /dev/null +++ b/docs/sbs/en/thread/code/Qp_thread_exit.py @@ -0,0 +1,24 @@ +import _thread as thread +import utime as time + +exited = False + + +def th_func(thread_id, delay): + global exited + print("thread:{} delay {}".format(thread_id, delay)) + time.sleep_ms(delay) + exited = True + + +def main(): + print("线程传递多个参数测试") + # for i in range(5): + thread.start_new_thread(th_func, (1, 2000)) + # 等待所有子线程回收 + while exited is False: + time.sleep_ms(100) + print("等待线程退出") + + +main() diff --git a/docs/sbs/en/thread/code/Qp_thread_trans_mutil_args.py b/docs/sbs/en/thread/code/Qp_thread_trans_mutil_args.py new file mode 100644 index 0000000000000000000000000000000000000000..5f563274fb34101201a343e0324c8f04f57728c0 --- /dev/null +++ b/docs/sbs/en/thread/code/Qp_thread_trans_mutil_args.py @@ -0,0 +1,18 @@ +import _thread as thread +import utime as time + + +def th_func(thread_id, delay): + print("thread:{} delay {}".format(thread_id, delay)) + time.sleep_ms(delay) + + +def main(): + print("线程传递多个参数测试") + for i in range(5): + thread.start_new_thread(th_func, (i + 1, 2)) + # 等待所有子线程回收 + time.sleep_ms(100) + + +main() diff --git a/docs/sbs/zh/sbs/media/5b584fb5c2b36cb7e057ae95d87b295e.png b/docs/sbs/en/thread/media/Qp_sbs_thread_01.png similarity index 100% rename from docs/sbs/zh/sbs/media/5b584fb5c2b36cb7e057ae95d87b295e.png rename to docs/sbs/en/thread/media/Qp_sbs_thread_01.png diff --git a/docs/sbs/zh/sbs/media/e2d4afc1ebb0f7d9ad420489f74da40d.jpg b/docs/sbs/en/thread/media/Qp_sbs_thread_02.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/e2d4afc1ebb0f7d9ad420489f74da40d.jpg rename to docs/sbs/en/thread/media/Qp_sbs_thread_02.jpg diff --git a/docs/sbs/en/thread/thread.md b/docs/sbs/en/thread/thread.md new file mode 100644 index 0000000000000000000000000000000000000000..441861559b66969ac79324f8bdb6dce60f7b96d5 --- /dev/null +++ b/docs/sbs/en/thread/thread.md @@ -0,0 +1,107 @@ +## Multithreaded application development guide +This article mainly introduces the use tutorial of quecpthon. Please refer to the API explanation of quecpthon thread +[quecpython wiki thread API explanation](https://python.quectel.com/wiki/#/zh-cn/api/pythonStdlib?id=_thread-%e5%a4%9a%e7%ba%bf%e7%a8%8b) + +## Document history + +**Revision record** + +|** version ** date ** author ** change statement **| +| -------- | -------- | -------- | ------------ | +|1.0 | 2021-4-6 | Chengzhu | initial version| + +### Basic concepts of multithreading / process + +Python runs in the python virtual machine, and the multithreading created by the user is only in Python +Virtual threads in virtual machines, not real threads in the operating system. That is, Python +Multithreading in is polled and scheduled by the python virtual machine, not the operating system. + +Multithreading can make the same program execute multiple tasks at the same time. Threads are different from processes in the execution process. In each independent thread, there are program entry, sequential execution sequence and program exit. And threads must be attached to a program, which controls the operation of multiple threads. + +**Basic operation of thread** + +>Threads have five states. The process of state transition is as follows: + +![线程5种状态](media/Qp_sbs_thread_01.png) + +>Figure ** 1 **: ** 5 ** states of threads + +**Main differences between threads and processes** + +Threads and processes are the basic units of the operating system to control the operation of programs. The system can use these two characteristics to achieve high concurrency. The main differences between threads and processes are as follows: + +1. A program has at least one process; A process contains at least one thread. + +2. The process has independent storage space in memory, while multiple threads share the storage space of the process it depends on. + +3. Processes and threads manage the resources of the operating system in different ways. + +## Common use cases of quecpthon + +### Using threads, passing multiple parameters +[thread passes multiple parameters](code/Qp_thread_trans_mutil_args.py) + +When passing multiple parameters, use ** tuple ** to transfer data. + +```python +import _thread as thread +import utime as time + + +def th_func(thread_id, delay): + print("thread:{} delay {}".format(thread_id, delay)) + time.sleep_ms(delay) + + +def main(): +Print ("thread passing multiple parameters test") + for i in range(5): + thread.start_new_thread(th_func, (i + 1, 2)) + #Wait for all child threads to recycle + time.sleep_ms(100) + + +main() + +``` + +### Thread exit +Operations such as ** join ** function are not provided at present. In the early stage, a global flag bit can be used to mark the exit of the thread. +[thread exit code](code/Qp_thread_exit.py) + +```python +import _thread as thread +import utime as time + +exited = False + + +def th_func(thread_id, delay): + global exited + print("thread:{} delay {}".format(thread_id, delay)) + time.sleep_ms(delay) + exited = True + + +def main(): +Print ("thread passing multiple parameters test") + # for i in range(5): + thread.start_new_thread(th_func, (1, 2000)) + #Wait for all child threads to recycle + while exited is False: + time.sleep_ms(100) +Print ("wait for thread to exit") + + +main() +``` + +### Inter thread communication +To be added + + + + + + + diff --git a/docs/Advanced_development/zh/QuecPythonSub/ADC.md b/docs/sbs/zh/BSP/ADC.md similarity index 55% rename from docs/Advanced_development/zh/QuecPythonSub/ADC.md rename to docs/sbs/zh/BSP/ADC.md index 4f494b8977c1ac7f7aaacc9f96f075ede767dbe6..6fb8b7b1933a730da0b286213a632a2511ea13ca 100644 --- a/docs/Advanced_development/zh/QuecPythonSub/ADC.md +++ b/docs/sbs/zh/BSP/ADC.md @@ -1,10 +1,28 @@ -# **QuecPython ADC采样开发使用说明** +## 修订历史 + +| 版本 | 日期 | 作者 | 变更表述 | +| ---- | ---------- | ------ | -------------------------------------------------- | +| 1.0 | 2021-09-10 | Kayden | 增加修订历史,参考链接,更换截图和代码下载链接位置 | + +## **QuecPython ADC采样开发使用说明** + +本文主要基于EC600S_QuecPython_EVB进行介绍,其他开发板类同。 + +本部分介绍可结合光敏传感器实验进行学习:[光敏传感器实验](https://python.quectel.com/doc/doc/Advanced_development/zh/QuecPythonSub/Photoresistor.html) ## 硬件描述 -目前开放共2路ADC,2路ADC连接位置如下表所示: +目前EC600S开放共2路ADC,2路ADC连接位置如下图所示: + +其他模组开放ADC情况可查看硬件支持内容:[硬件支持](https://python.quectel.com/doc/doc/Quecpython_intro/zh/Qp_Product_intro/Hardware_Support.html) -![](media/7acc910ebd7bf4eb806399676e468795.png) +具体ADC相关API使用介绍:[ADC相关API](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=adc) + +ADC硬件原理图请查看模组硬件设计手册和开发板原理图[官网下载链接](https://python.quectel.com/download) + +资料如有缺失可在QQ群搜索群文件获取:445121768 + +![](media/ADC_0.png) 对应关系如下表: @@ -50,7 +68,7 @@ adc.close(),无参数。 使用QPYcom工具和模组进行交互,下面实例是基于ADC0。 -![](media/d498ea36bae149ce7f0f7221587898bc.png) +![](media/ADC_1.png) 注意: @@ -64,13 +82,13 @@ adc.close(),无参数。 ### 软件代码 -下载.py文件到模组运行,代码如下: +下载.py文件到模组运行,代码如下: 点击下载代码 ```python from misc import ADC # 导入ADC模块 import utime # 导入定时模块 -read_time = 5 # 设定读取次数 a -dc = ADC() +read_time = 5 # 设定读取次数 +adc = ADC() while read_time: adc.open() read_data = adc.read(ADC.ADC0) @@ -82,22 +100,16 @@ while read_time: ### 硬件连接 -无需另外的硬件连接,EC600S的ADC0接口已经外接光敏电阻,本文的下载验证就是利用光敏电阻进行辅助验证。 +无需另外的硬件连接,EC600S的ADC0接口已经外接光敏电阻,本文的下载验证就是利用光敏电阻进行辅助验证。(EC600N部分型号模组ADC不可用,可用型号具体查看硬件支持,ADC可用模组均可以直接下载例程运行) ### 运行效果 1. 打开QPYcom运行adc_file.py(运行同时保证光敏电阻接收不同程度的光照),如下图: - ![](media/e574fb98f5cd8906b43f82b87012770d.png) - - - -2. 在QPYcom交互界面查看输出结果(数值会有所不同) + ![](media/ADC_2.png) -![](media/fbce9c32a8929f43a5635b8e6c770219.png) + 2.在QPYcom交互界面查看输出结果(数值会有所不同) -## 配套代码 - +![](media/ADC_3.png) - 下载代码 \ No newline at end of file diff --git a/docs/sbs/zh/BSP/GPIO.md b/docs/sbs/zh/BSP/GPIO.md new file mode 100644 index 0000000000000000000000000000000000000000..73e941f9577b6bb13c731c7df492f46bf8481fc2 --- /dev/null +++ b/docs/sbs/zh/BSP/GPIO.md @@ -0,0 +1,128 @@ +## 修订历史 + +| Version | Date | Author | Change expression | +| ------- | ---------- | ---------- | ----------------- | +| 1.0 | 2021-09-06 | David.Tang | Initial version | + +## PIN + +文档主要基于EC600X(包括EC600S、EC600N、EC600U)先介绍如何使用QuecPython_GPIO,GPIO通常用于连接驱动LED、蜂鸣器、继电器等等,同样也可以用来读取KEY、开关状态、外部IC的引脚电平状态等等。通过本文你将了解到GPIO的所有设置参数及使用方法。 + +### 硬件设计 + +对于目前QuecPython支持的GPIO,在官网wiki已经详细列出,具体位置为:[PIN_API库](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=pin) + +### 软件设计 + +软件设计主要参考官网的wiki,具体位置为:[PIN_API库](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=pin) + +### 交互操作 + +使用QPYcom工具和模组进行交互,示例如下: + +![](media/GPIO_01.png) + +注意: + +1. from machine import Pin目的是让Pin模块在当前空间可见。 + +2. 只有from machine import Pin模块,才能使用Pin内的函数和变量。 + +3. 上述操作没有连接任何外设,仅作为熟悉指令参考 + +### 下载验证 + +由于GPIO的控制比较简单,可以外接一个三极管等器件自行测试。 + +## ExtInt + +GPIO介绍过后,接着介绍外部中断,普通GPIO可以随时查询Pin引脚的电平状态,但却不能及时发现电平的变化,而外部中断就能完美的解决这个问题。若设定了上升沿触发外部中断时,当电平从低电平上升到高电平瞬间,就会触发外部中断,从而在电平变化时立马执行回调函数。 + +### 硬件设计 + +同上 + +### 软件设计 + +软件设计主要参考官网的wiki,地址:[ExtInt_API库](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=extint) + +### 交互操作 + +使用QPYcom工具和模组进行交互,示例如下: + +![](media/GPIO_02.png) + +注意: + +**回调函数fun(args)中的args,是引脚中断后返回的内部GPIO行号,一般用不上,但也要设置。** + +### 下载验证 + +模组:EC600N_QuecPython开发板 + +按键触发:KEY1和KEY2 + +#### 软件代码 + +配套demo的参考代码为文档同目录下的example_extint_file.py文件。下载此文件到模组运行,代码如下: + +```python +from machine import ExtInt +import utime +def fun1(args): + print(args) + print("key1 extint") +def fun2(args): + print(args) + print("key2 extint") +extint1 = ExtInt(ExtInt.GPIO12, ExtInt.IRQ_FALLING, ExtInt.PULL_PU, fun1) +extint2 = ExtInt(ExtInt.GPIO13, ExtInt.IRQ_FALLING, ExtInt.PULL_PU, fun2) +extint1.enable() +extint2.enable() +while True: + utime.sleep_ms(200) +``` + +#### 硬件连接 + +对于QuecPython开发板来说,无需另外的硬件连接,开发板正常供电即可 + +#### 运行效果 + +1.打开QPYcom,运行example_extint_file.py,至如下界面: + +image-20210906141407279 + +2.随意按下按键,即可触发对应的回调进行打印,结果如下: + +image-20210906141540171 + + + + + + 下载代码 + +## 名词解释 + +低电平:通常用0来表示低电平 + +高电平:通常用1来表示高电平 + +上升沿:从低电平上升到高电平的边沿 + +下降沿:从高电平上升到低电平的边沿 + +回调函数:一个普通函数,在满足设定条件下被触发执行这个函数 + +浮空:Pin引脚直出,没有默认电平,处于不稳定状态 + +上拉:Pin引脚内部有个电阻拉到VCC,默认为高电平 + +下拉:Pin引脚内部有个电阻拉到GND,默认为低电平 + +输入:Pin引脚的电平状态随外部变化 + +输出:Pin引脚的电平驱动外围电路 + +中断:停止执行当前的程序去执行另一段程序,这个过程叫中断 \ No newline at end of file diff --git a/docs/Advanced_development/zh/QuecPythonSub/IIC.md b/docs/sbs/zh/BSP/I2C.md old mode 100755 new mode 100644 similarity index 58% rename from docs/Advanced_development/zh/QuecPythonSub/IIC.md rename to docs/sbs/zh/BSP/I2C.md index 544d5b6975c444451c4dbc726a4d13e14318b909..675497f0d6553f36b534563dd5ea2b9bb8a9f148 --- a/docs/Advanced_development/zh/QuecPythonSub/IIC.md +++ b/docs/sbs/zh/BSP/I2C.md @@ -1,10 +1,17 @@ +## 修订历史 + +| 版本 | 日期 | 作者 | 变更描述 | +| ---- | ---------- | ------ | -------------------------------------------- | +| 1.0 | 2021-09-13 | Kayden | 增加修订历史,删除参考代码,新增参考实验链接 | + ## 简介 -本文基于 **EC600S V1.1** 开发板。用于介绍QuecPython I2C模块的使用。 具体关于 QuecPython I2C 的详细的API 请参考 -1. [QuecPython-machine - 硬件相关功能-I2C](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=i2c) +本文主要介绍QuecPython I2C模块的使用。 文章的主要的是教会你怎样使用Quecpython I2C库, 更多基础的知识,请自行百度 **I2C** 。 +**I2C** 也可以叫做 **IIC**。 全称为 **Inter-Integrated Circuit**,中文意思为集成电路总线。 + ### I2C简介 请自行参考 [I2C总线](https://baike.baidu.com/item/I2C%E6%80%BB%E7%BA%BF),更多详细信息不在此赘述。 @@ -37,42 +44,9 @@ 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/Advanced_development/zh/QuecPythonSub/i2c_aht.html) +3. 关于I2C的应用实验详情还可以参考加速度传感器实验:[加速度传感器实验](https://python.quectel.com/doc/doc/Advanced_development/zh/QuecPythonSub/i2c_lis2dh.html) -## 快速开始 -在官网资料下载中下载 EC600S 原理图。确定板载温湿度传感器的型号 -- **温湿度传感器** -![温湿度传感器](media/Qp_Advanced_development_QuecPythonSub_i2c_bus_02.png) -更多关于 **温湿度传感器** 的信息,不在这里讲述,请自行查阅 **[AHT10数据手册](http://www.aosong.com/userfiles/files/media/AHT10%E4%BA%A7%E5%93%81%E6%89%8B%E5%86%8C%20A2%2020201221.pdf)** 数据手册。 -下面我们通过I2C总线控制温湿度传感器, 通过查阅手册,可以确定从机地址为 **0x38**。 - -### -```python -from machine import I2C - - -def test_i2c(): - i2c_dev = I2C(I2C.I2C1, I2C.STANDARD_MODE) - addres = 0x19 - LIS2DH12_WHO_AM_I = 0x0F # 板载三轴加速度传感器 身份寄存器 - r_data = bytearray([0x00]) # 存储数据 - # 读取指定设备, 指定地址, - i2c_dev.read(addres, bytearray(LIS2DH12_WHO_AM_I), 1, r_data, 1, 1) - print("read data lis2dh12 who_am_i reg 0x{0:02x}".format(list(r_data)[0])) - # 读写寄存器 - LIS2DH12_CTRL_REG2 = 0x21 # - w_data = [0x04] # 想要写的数据 - print("write 0x04 to 0x21") - i2c_dev.write(addres, bytearray(LIS2DH12_CTRL_REG2), 1, bytearray(w_data), - len(w_data)) - i2c_dev.read(addres, bytearray(LIS2DH12_CTRL_REG2), 1, r_data, 1, 1) - print("read 0x{0:02x} from 0x{1:02x}".format( - list(r_data)[0], LIS2DH12_CTRL_REG2)) - print("test_i2c funcation has exited") - pass - - -if __name__ == "__main__": - test_i2c() -``` - -上面我们展示了使用 \ No newline at end of file diff --git a/docs/sbs/zh/BSP/PWM.md b/docs/sbs/zh/BSP/PWM.md new file mode 100644 index 0000000000000000000000000000000000000000..b569f260e5fb3af6ade608aeaa00866693bf26c2 --- /dev/null +++ b/docs/sbs/zh/BSP/PWM.md @@ -0,0 +1,131 @@ +## 修订历史 + +| Version | Date | Author | Change expression | +| ------- | ---------- | ---------- | ----------------- | +| 1.0 | 2021-09-06 | David.Tang | Initial version | + +文档主要基于EC600X(包括EC600S、EC600N、EC600U)介绍如何使用 QuecPython_PWM。PWM是一种对模拟信号电平进行数字编码的方法。根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的改变。这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术。脉冲宽度调制是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。 + +## 软件设计 + +软件设计主要参考官网的wiki,地址:[PWM_API库](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=pwm) + +## 交互操作 + +下面我们使用 EC600S V1.1 版本的硬件, 使用 69号引脚 G1发出PWM 波形。 +image-20210906161205040 + +红蓝两根线接到逻辑分析仪上。然后运行下面的代码,即可抓取到波形。 + +由于PWM API 接口 分为了 1ms , 10us , 1us三个等级。 + +```python +from misc import PWM +import utime as time +import log + + +class pwmclass(): + def __init__(self): + self.Log = log.basicConfig() + self.Log = log.getLogger("pwm_class") + # self.Log.setLevel(log.INFO) + self.Log.setLevel(log.DEBUG) + self.pwm = None + pass + + """ + 注:EC100YCN平台,支持PWM0~PWM3,对应引脚如下: + PWM0 – 引脚号19 + PWM1 – 引脚号18 + PWM2 – 引脚号23 + PWM3 – 引脚号22 + + 注:EC600SCN平台,支持PWM0~PWM3,对应引脚如下: + PWM0 – 引脚号52 + PWM1 – 引脚号53 + PWM2 – 引脚号70 + PWM3 – 引脚号69 + """ + + # fre 频率为K, (0.0 ~ 1000] + # Duty_Cycle (0~1) + def init(self, Pwm_pin=PWM.PWM3, fre=1, Duty_Cycle=0.5): + # https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=pwm + + # 根据频率,计算出高低电平 + # 计算出周期时间 + if (fre <= 0) or (fre > 1000): + self.Log.error( + "ERROR: {0} 不支持的频率参数, 请输入 (0 ~ 1000]k 范围的频率".format(fre)) + if (Duty_Cycle < 0.000) or (Duty_Cycle >= 1): + self.Log.error( + "ERROR: {0} 不支持的占空比参数, 请输入 (0~1.0) 范围的频率".format(Duty_Cycle)) + # us 单位 + cycle_time = int(1 * 1000 / fre) + hight_time = int(cycle_time * Duty_Cycle) + self.Log.info("""设置 {0} 设备 频率为 {1}khz + 周期为 {2}us 占空比 {3}us""".format(Pwm_pin, fre, cycle_time, + hight_time)) + # ms 周期范围 + # 周期在 (1K us ~ 1000K us) + if cycle_time > 1000: + self.pwm = PWM(Pwm_pin, PWM.ABOVE_MS, int(hight_time / 1000), + int(cycle_time / 1000)) + # 周期在 10us ~ 15.75ms + if (cycle_time > 10) and (cycle_time < 15750): + self.pwm = PWM(Pwm_pin, PWM.ABOVE_10US, int(hight_time / 10), + int(cycle_time / 10)) + # 周期在 (0~157us) + if (cycle_time > 0) and (cycle_time < 157): + self.pwm = PWM(Pwm_pin, PWM.ABOVE_1US, hight_time, cycle_time) + + def deinit(self, fre=0): + self.pwm = None + pass + + def start(self, fre=1): + self.Log.info("开始输出 PWM 波形".format()) + if self.pwm is not None: + self.pwm.open() + pass + + def stop(self): + if self.pwm is not None: + self.pwm.close() + pass + + +def test_pwm(fre, duty, delay=2): + obj_pwm = pwmclass() + obj_pwm.init(fre=fre, Duty_Cycle=duty, Pwm_pin=PWM.PWM3) + obj_pwm.start() + time.sleep(delay) + obj_pwm.stop() + obj_pwm.deinit() + + +if __name__ == "__main__": + # 频率 1K, 占空比 0.1 + test_pwm(fre=1, duty=0.1) + # 频率 10K, 占空比 0.2 + test_pwm(fre=10, duty=0.2) + # 频率 100K, 占空比 0.4 + test_pwm(fre=100, duty=0.4) + +``` +占空比 0.2 频率为 10K + +上面我们展示了使用封装的**PWMclass**直接输出, 1K、10K、100K的波形。 + +## 名词解释 + +PWM:脉冲宽度调制 + +高电平:通常高于用0.8V认为是高电平 + +低电平:通常低于用0.6V认为是低电平 + +周期:低电平和高电平时间的总和 + +占空比:高电平占整个周期的比例 \ No newline at end of file diff --git a/docs/sbs/zh/BSP/README.md b/docs/sbs/zh/BSP/README.md new file mode 100644 index 0000000000000000000000000000000000000000..fbfb824cf806cf0b3cb5e5b3272beb34582553c1 --- /dev/null +++ b/docs/sbs/zh/BSP/README.md @@ -0,0 +1,47 @@ +# QuecPython 驱动子系统 +## 平台驱动开发 +[QuecPython RTC开发](zh-cn/QuecPythonSub/RTC.md) + +[QuecPython Timer定时器开发](zh-cn/QuecPythonSub/Timer.md) + +[QuecPython Watchdog开发](zh-cn/QuecPythonSub/WDT.md) + +[QuecPython Power开关机开发](zh-cn/QuecPythonSub/Power.md) + +[QuecPython 低功耗开发](zh-cn/QuecPythonSub/PM.md) + + + +## 音频开发 + +[QuecPython 音频播放](zh-cn/QuecPythonSub/Audio.md) + + + +[QuecPython TTS模块开发](zh-cn/QuecPythonSub/TTS.md) + +## 总线开发 + +[QuecPython GPIO及IO中断开发](zh-cn/QuecPythonSub/GPIO.md) + +[QuecPython UART开发](zh-cn/QuecPythonSub/UART.md) + +[QuecPython I2C总线开发](zh-cn/QuecPythonSub/IIC.md) + +[QuecPython PWM开发](zh-cn/QuecPythonSub/PWM.md) + +[QuecPython ADC采样开发](zh-cn/QuecPythonSub/ADC.md) + +[QuecPython SPI总线开发](zh-cn/QuecPythonSub/SPI.md) + +## 外设调试 + + + +[QuecPython LCD调试流程](zh-cn/QuecPythonSub/LCD.md) + +[QuecPython Sensor调试流程](zh-cn/QuecPythonSub/Sensor.md) + + + + \ No newline at end of file diff --git a/docs/sbs/zh/BSP/SPI.md b/docs/sbs/zh/BSP/SPI.md new file mode 100644 index 0000000000000000000000000000000000000000..74f170deee3eadad647775e9247f933bef327617 --- /dev/null +++ b/docs/sbs/zh/BSP/SPI.md @@ -0,0 +1,107 @@ +# QuecPython SPI总线开发 + +## 修订历史 + +| 版本 | 日期 | 作者 | 变更表述 | +| ---- | ---------- | ---- | -------- | +| 1.0 | 2021-09-14 | Grey | 初版 | + +文档主要基于EC600x(包括EC600S、EC600N、EC600U)介绍如何使用 QuecPython_SPI 功能,通过本文你将了解到 EC600x_SPI 的参数设置及使用方法。 + +有关API详解请参考 [QuecPython-machine - spi](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=spi) + + + +## SPI 简介 + +SPI,是英语 Serial Peripheral interface 的缩写,顾名思义就是串行外围设备接口。是 Motorola 首先在其 MC68HCXX 列处理器上定义的。SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。SPI是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议。 + + + +### 主-从模式(Master-Slave) + +SPI 规定了两个 SPI 设备之间通信必须由主设备 (Master) 来控制次设备 (Slave)。一个 Master 设备可以通过提供 Clock 以及对 Slave 设备进行片选 (Slave Select) 来控制多个 Slave 设备,SPI 协议还规定 Slave 设备的 Clock 由 Master 设备通过 SCK 管脚提供给 Slave 设备,Slave 设备本身不能产生或控制 Clock,没有 Clock 则 Slave 设备不能正常工作。 + +![media_SPI_1](media/media_SPI_1.jpg) + + + +### 同步方式(Synchronous) + +Master 设备会根据将要交换的数据来产生相应的时钟脉冲(Clock Pulse),时钟脉冲组成了时钟信号(Clock Signal),时钟信号通过时钟极性 (CPOL) 和 时钟相位 (CPHA) 控制着两个 SPI 设备间何时数据交换以及何时对接收到的数据进行采样,来保证数据在两个设备之间是同步传输的。 + +![media_SPI_2](media/media_SPI_2.jpg) + + + +### 四种通信模式 + +**时钟极性 CPOL** 是指 SPI 通讯设备处于空闲状态时,SCK 信号线的电平信号(即 SPI 通讯开始前、 NSS 线为高电平时 SCK 的状态)。 CPOL=0 时, SCK 在空闲状态时为低电平,CPOL=1 时,则相反。 + + **时钟相位 CPHA** 是指数据的采样的时刻,当 CPHA=0 时, MOSI 或 MISO 数据线上的信号将会在 SCK 时钟线的“奇数边沿” 被采样。当 CPHA=1 时,数据线在 SCK 的“偶数边沿” 采样。 + +根据 **时钟极性 CPOL** 与 **时钟相位 CPHA** 的不同,SPI具有四种通信模式。 + +![media_SPI_3](media/media_SPI_3.jpg) + +![media_SPI_4](media/media_SPI_4.jpg) + +![media_SPI_5](media/media_SPI_5.jpg) + + + +### 数据交换(Data Exchanges) + +SPI 设备间的数据传输之所以又被称为数据交换,是因为 SPI 协议规定一个 SPI 设备不能在数据通信过程中仅仅只充当一个 "发送者(Transmitter)" 或者 "接收者(Receiver)"。在每个 Clock 周期内,SPI 设备都会发送并接收一个 bit 大小的数据,相当于该设备有一个 bit 大小的数据被交换了。 + +一个 Slave 设备要想能够接收到 Master 发过来的控制信号,必须在此之前能够被 Master 设备进行访问 (Access)。所以, Master 设备必须首先通过 SS/CS pin 对 Slave 设备进行片选,把想要访问的 Slave 设备选上,在数据传输的过程中,每次接收到的数据必须在下一次数据传输之前被采样。如果之前接收到的数据没有被读取,那么这些已经接收完成的数据将有可能会被丢弃,导致 SPI 物理模块最终失效。因此,在程序中一般都会在 SPI 传输完数据后,去读取 SPI 设备里的数据,即使这些数据(Dummy Data)在我们的程序里是无用的。 + +SPI只有主模式和从模式之分,没有读和写的说法。因为实质上每次SPI是主从设备在交换数据。也就是说,你发一个数据必然会收到一个数据;你要收一个数据必须也要先发一个数据。 + + + +## SPI通信 + +### 实验代码 + +以下代码适合EC600x 开发板进行 SPI 自发自收通信测试。**实验前提:短接 SPI_MISO 与 SPI_MOSI 引脚**。 + +```python +# -*- coding: UTF-8 -*- +import utime +from machine import SPI +from machine import Pin + +# 屏蔽GNSS模块数据干扰. 由于EC600S/N的SPI_MISO与SPI_MOSI引脚还被复用为UART1. 开发板还连接GNSS模块L76K, 为了断开L76K吐数据对SPI通信的干扰, 需要添加下面两句代码. +gpio11 = Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 0) # EC600S/EC600N使用 +gpio11.write(0) # EC600S/EC600N使用 + +w_data = "Grey" +r_data = bytearray(len(w_data)) +count = 10 # 运行次数 + +# 以下代码根据模块型号进行选择. +spi_obj = SPI(1, 0, 1) # EC600S/N使用 +# spi_obj = SPI(0, 0, 1) # EC600U使用 + +while count: + count -= 1 + utime.sleep(1) + ret = spi_obj.write_read(r_data, w_data, 100) + if ret == -1: + SPI_msg = "SPIReadError" + else: + SPI_msg = "SPIRead:{} running:{:0>2d}".format(r_data, count) + print(SPI_msg) +``` + + + +### 实验现象 + +![media_SPI_6](media/media_SPI_6.jpg) + +## 配套代码 + + + 下载代码 \ No newline at end of file diff --git a/docs/sbs/zh/BSP/UART.md b/docs/sbs/zh/BSP/UART.md new file mode 100644 index 0000000000000000000000000000000000000000..c5a538beac3aa14e3f77afbb98d5c02881117e13 --- /dev/null +++ b/docs/sbs/zh/BSP/UART.md @@ -0,0 +1,128 @@ +## 修订历史 + +| Version | Date | Author | Change expression | +| ------- | ---------- | ---------- | ----------------- | +| 1.0 | 2021-09-02 | David.Tang | Initial version | + +文档主要基于EC600X(包括EC600S、EC600N、EC600U)介绍如何使用QuecPython_UART,UART作为一种通用串行数据总线,用于异步通信,可实现全双工传输和接收。在嵌入式设计中,UART用来与PC进行通信,包括监控调试器和其它器件。通过本文你将了解到EC600X_UART的所有设置参数及使用方法。 + +## 硬件设计 + +针对不同的模组,开放的UART列表如下: + +| module_name | module_UART_name | module_UART_PIN | +| ----------- | ----------------------------------------------------- | ------------------------------------------- | +| EC600S/N | UART0_DEBUG PORT
UART1_BT PORT
UART2_MAIN PORT | PIN71、PIN72
PIN2、PIN3
PIN31、PIN32 | +| EC600U | UART1_BT PORT
UART2_MAIN PORT | PIN123、PIN124
PIN31、32 | + +对于V1.2和V1.3的QuecPython开发板,具体的UART位置标记如下: + + + +备注: + +1. 针对其他版本的QuecPython开发板,可以根据上述的PIN脚号和对应版本的原理图在开发板上面找到对应的位置 +2. 后续wiki对于UART_PIN更新后,可参考wiki里面的说明,忽略上述的表格 + +## 软件设计 + +软件设计主要参考官网的wiki,地址:[UART_API库](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=uart) + +## 交互操作 + +使用QPYcom工具和模组进行交互,下面实例是基于UART0,对于UART1和UART2的话,操作类似,此处省略。![](media/UART_02.png) + +注意: + +1. from machine import UART目的是让UART模块在当前空间可见。 + +2. 只有from machine import UART模块,才能使用UART内的函数和变量。 + +3. 上述操作没有连接任何外设,仅作为熟悉指令参考 + +## 下载验证 + +模组:EC600U_QuecPython开发板 + +串口:UART1 + +### 软件代码 + +配套demo的参考代码为文档同目录下的example_uart_file.py文件。下载此文件到模组运行,代码如下: + +```python +import _thread # 导入线程模块 +import utime # 导入定时模块 +import log # 导入log模块 +from machine import UART # 导入UART模块 + +# 设置日志输出级别 +log.basicConfig(level=log.INFO) +uart_log = log.getLogger("UART") +uart = UART(UART.UART1, 115200, 8, 0, 1, 0) + +def uartWrite(): + global uart + count = 10 + while count: + write_msg = "Hello count={}".format(count) + uart.write(write_msg) + uart_log.info("Write msg :{}".format(write_msg)) + utime.sleep(1) + count -= 1 + uart_log.info("uartWrite end!") + + +def UartRead(): + global uart + while 1: + msgLen = uart.any() + utime.sleep(0.1) + # 当有数据时进行读取 + if msgLen: + msg = uart.read(msgLen) + utf8_msg = msg.decode() + uart_log.info("UartRead msg: {}".format(utf8_msg)) + else: + continue + + +def run(): + _thread.start_new_thread(UartRead, ()) + _thread.start_new_thread(uartWrite, ()) + +if __name__ == "__main__": + run() + while True: + utime.sleep(0.5) +``` + +### 硬件连接 + +使用type-c给模块供电,UART与TTL转USB模块的连接如下表(仅供参考): + +| 开发板上的PIN脚 | TTL转USB模块 | 图中线的颜色 | +| --------------- | ------------ | ------------ | +| J6的12脚 | Tx | 红色 | +| J6的13脚 | Rx | 橘色 | +| GND | GND | 棕色 | + +硬件连接展示图如下图所示: + + +### 运行效果 + +1. 打开QCOM,连接TTL转USB对应的端口,如下图所示: +![image-20210902135537042](media/UART_04.png) + +2. 打开QPYcom,运行example_uart_file.py,可在QCOM查看到UART write数据,现象如下截图红色部分 + +3. 然后QCOM上写QuecPython多次,可在QPYcom上查看读取的数据。现象如下截图蓝色部分 + +![image-20210902135941009](media/UART_05.png) + + +## 配套代码 + + + 下载代码 \ No newline at end of file diff --git a/docs/little_demo/zh/QuecPythonTest/code/adc_file.py b/docs/sbs/zh/BSP/code/adc_file.py similarity index 96% rename from docs/little_demo/zh/QuecPythonTest/code/adc_file.py rename to docs/sbs/zh/BSP/code/adc_file.py index 7f03ad18a2183705c2b4ab88eda979302afb7559..c6143d313a3cc2ebe55cacccc912b25e67c3ec6a 100644 --- a/docs/little_demo/zh/QuecPythonTest/code/adc_file.py +++ b/docs/sbs/zh/BSP/code/adc_file.py @@ -1,11 +1,11 @@ -from misc import ADC # 导入ADC模块 -import utime # 导入定时模块 -read_time = 5 # 设定读取次数 -adc = ADC() -while read_time: - adc.open() - read_data = adc.read(ADC.ADC0) - print(read_data) - adc.close() - read_time -= 1 - utime.sleep(1) # 延时1S +from misc import ADC # 导入ADC模块 +import utime # 导入定时模块 +read_time = 5 # 设定读取次数 +adc = ADC() +while read_time: + adc.open() + read_data = adc.read(ADC.ADC0) + print(read_data) + adc.close() + read_time -= 1 + utime.sleep(1) # 延时1S diff --git a/docs/sbs/zh/BSP/code/code_SPI.py b/docs/sbs/zh/BSP/code/code_SPI.py new file mode 100644 index 0000000000000000000000000000000000000000..2eaef63c7a2a226912adb82b4a8cbf3113c415ea --- /dev/null +++ b/docs/sbs/zh/BSP/code/code_SPI.py @@ -0,0 +1,24 @@ +# -*- coding: UTF-8 -*- +import utime +from machine import SPI +from machine import Pin + +# 屏蔽GNSS模块数据干扰. 由于EC600S/N的SPI_MISO与SPI_MOSI引脚还被复用为UART1. 开发板还连接GNSS模块L76K, 为了断开L76K吐数据对SPI通信的干扰, 需要添加下面两句代码. +gpio11 = Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 0) # EC600S/EC600N使用 +gpio11.write(0) # EC600S/EC600N使用 + +w_data = "Grey" +r_data = bytearray(len(w_data)) +count = 10 # 运行次数 +spi_obj = SPI(1, 0, 1) # EC600S/EC600N使用 +# spi_obj = SPI(0, 0, 1) # EC600U/EC100Y使用 + +while count: + count -= 1 + utime.sleep(1) + ret = spi_obj.write_read(r_data, w_data, 100) + if ret == -1: + SPI_msg = "SPIReadError" + else: + SPI_msg = "SPIRead:{} running:{:0>2d}".format(r_data, count) + print(SPI_msg) diff --git a/docs/sbs/zh/BSP/code/example_pwm_file.py b/docs/sbs/zh/BSP/code/example_pwm_file.py new file mode 100644 index 0000000000000000000000000000000000000000..7c10dbe2931ee2862754f70b21729fee2a8453ad --- /dev/null +++ b/docs/sbs/zh/BSP/code/example_pwm_file.py @@ -0,0 +1,92 @@ +from misc import PWM +import utime as time +import log + + +class pwmclass(): + def __init__(self): + self.Log = log.basicConfig() + self.Log = log.getLogger("pwm_class") + # self.Log.setLevel(log.INFO) + self.Log.setLevel(log.DEBUG) + self.pwm = None + pass + + """ + 注:EC100YCN平台,支持PWM0~PWM3,对应引脚如下: + PWM0 – 引脚号19 + PWM1 – 引脚号18 + PWM2 – 引脚号23 + PWM3 – 引脚号22 + + 注:EC600SCN平台,支持PWM0~PWM3,对应引脚如下: + PWM0 – 引脚号52 + PWM1 – 引脚号53 + PWM2 – 引脚号70 + PWM3 – 引脚号69 + """ + + # fre 频率为K, (0.0 ~ 1000] + # Duty_Cycle (0~1) + def init(self, Pwm_pin=PWM.PWM3, fre=1, Duty_Cycle=0.5): + # https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=pwm + + # 根据频率,计算出高低电平 + # 计算出周期时间 + if (fre <= 0) or (fre > 1000): + self.Log.error( + "ERROR: {0} 不支持的频率参数, 请输入 (0 ~ 1000]k 范围的频率".format(fre)) + if (Duty_Cycle < 0.000) or (Duty_Cycle >= 1): + self.Log.error( + "ERROR: {0} 不支持的占空比参数, 请输入 (0~1.0) 范围的频率".format(Duty_Cycle)) + # us 单位 + cycle_time = int(1 * 1000 / fre) + hight_time = int(cycle_time * Duty_Cycle) + self.Log.info("""设置 {0} 设备 频率为 {1}khz + 周期为 {2}us 占空比 {3}us""".format(Pwm_pin, fre, cycle_time, + hight_time)) + # ms 周期范围 + # 周期在 (1K us ~ 1000K us) + if cycle_time > 1000: + self.pwm = PWM(Pwm_pin, PWM.ABOVE_MS, int(hight_time / 1000), + int(cycle_time / 1000)) + # 周期在 10us ~ 15.75ms + if (cycle_time > 10) and (cycle_time < 15750): + self.pwm = PWM(Pwm_pin, PWM.ABOVE_10US, int(hight_time / 10), + int(cycle_time / 10)) + # 周期在 (0~157us) + if (cycle_time > 0) and (cycle_time < 157): + self.pwm = PWM(Pwm_pin, PWM.ABOVE_1US, hight_time, cycle_time) + + def deinit(self, fre=0): + self.pwm = None + pass + + def start(self, fre=1): + self.Log.info("开始输出 PWM 波形".format()) + if self.pwm is not None: + self.pwm.open() + pass + + def stop(self): + if self.pwm is not None: + self.pwm.close() + pass + + +def test_pwm(fre, duty, delay=2): + obj_pwm = pwmclass() + obj_pwm.init(fre=fre, Duty_Cycle=duty, Pwm_pin=PWM.PWM3) + obj_pwm.start() + time.sleep(delay) + obj_pwm.stop() + obj_pwm.deinit() + + +if __name__ == "__main__": + # 频率 1K, 占空比 0.1 + test_pwm(fre=1, duty=0.1) + # 频率 10K, 占空比 0.2 + test_pwm(fre=10, duty=0.2) + # 频率 100K, 占空比 0.4 + test_pwm(fre=100, duty=0.4) diff --git a/docs/sbs/zh/BSP/code/example_uart_file.py b/docs/sbs/zh/BSP/code/example_uart_file.py new file mode 100644 index 0000000000000000000000000000000000000000..f96d4bb74ae947e693612eff68c81cf67f7368fc --- /dev/null +++ b/docs/sbs/zh/BSP/code/example_uart_file.py @@ -0,0 +1,44 @@ +import _thread # 导入线程模块 +import utime # 导入定时模块 +import log # 导入log模块 +from machine import UART # 导入UART模块 + +# 设置日志输出级别 +log.basicConfig(level=log.INFO) +uart_log = log.getLogger("UART") +uart = UART(UART.UART1, 115200, 8, 0, 1, 0) + +def uartWrite(): + global uart + count = 10 + while count: + write_msg = "Hello count={}".format(count) + uart.write(write_msg) + uart_log.info("Write msg :{}".format(write_msg)) + utime.sleep(1) + count -= 1 + uart_log.info("uartWrite end!") + + +def UartRead(): + global uart + while 1: + msgLen = uart.any() + utime.sleep(0.1) + # 当有数据时进行读取 + if msgLen: + msg = uart.read(msgLen) + utf8_msg = msg.decode() + uart_log.info("UartRead msg: {}".format(utf8_msg)) + else: + continue + + +def run(): + _thread.start_new_thread(UartRead, ()) + _thread.start_new_thread(uartWrite, ()) + +if __name__ == "__main__": + run() + while True: + utime.sleep(0.5) diff --git a/docs/sbs/zh/BSP/media/ADC_0.png b/docs/sbs/zh/BSP/media/ADC_0.png new file mode 100644 index 0000000000000000000000000000000000000000..0a49f31ebe0de20480873fc01d57d5dac0a4538f Binary files /dev/null and b/docs/sbs/zh/BSP/media/ADC_0.png differ diff --git a/docs/sbs/zh/BSP/media/ADC_1.png b/docs/sbs/zh/BSP/media/ADC_1.png new file mode 100644 index 0000000000000000000000000000000000000000..df99464c5b561895dba56743674c1b90e603c3b4 Binary files /dev/null and b/docs/sbs/zh/BSP/media/ADC_1.png differ diff --git a/docs/sbs/zh/BSP/media/ADC_2.png b/docs/sbs/zh/BSP/media/ADC_2.png new file mode 100644 index 0000000000000000000000000000000000000000..c369cc6bb7a1979950ebae04c9072606b4d01f63 Binary files /dev/null and b/docs/sbs/zh/BSP/media/ADC_2.png differ diff --git a/docs/sbs/zh/BSP/media/ADC_3.png b/docs/sbs/zh/BSP/media/ADC_3.png new file mode 100644 index 0000000000000000000000000000000000000000..464fe40d64566958046db12cc23ac0a7dc1b73d3 Binary files /dev/null and b/docs/sbs/zh/BSP/media/ADC_3.png differ diff --git a/docs/sbs/zh/BSP/media/GPIO_01.png b/docs/sbs/zh/BSP/media/GPIO_01.png new file mode 100644 index 0000000000000000000000000000000000000000..6878a16e0b43601687887d6fa7a8fdc0f32a5129 Binary files /dev/null and b/docs/sbs/zh/BSP/media/GPIO_01.png differ diff --git a/docs/sbs/zh/BSP/media/GPIO_02.png b/docs/sbs/zh/BSP/media/GPIO_02.png new file mode 100644 index 0000000000000000000000000000000000000000..8374c30cc7c836d1d83cb67027c0c33d795b3015 Binary files /dev/null and b/docs/sbs/zh/BSP/media/GPIO_02.png differ diff --git a/docs/sbs/zh/BSP/media/GPIO_03.png b/docs/sbs/zh/BSP/media/GPIO_03.png new file mode 100644 index 0000000000000000000000000000000000000000..ee2a2e6d89eab5f14ffe51e979017077b38fc917 Binary files /dev/null and b/docs/sbs/zh/BSP/media/GPIO_03.png differ diff --git a/docs/sbs/zh/BSP/media/GPIO_04.png b/docs/sbs/zh/BSP/media/GPIO_04.png new file mode 100644 index 0000000000000000000000000000000000000000..be9155dcf8ee41f6d394bb1d75fe294bc6142ea9 Binary files /dev/null and b/docs/sbs/zh/BSP/media/GPIO_04.png differ diff --git a/docs/sbs/zh/BSP/media/PWM_01.png b/docs/sbs/zh/BSP/media/PWM_01.png new file mode 100644 index 0000000000000000000000000000000000000000..00f02a84d2a5fb0c6cdd172ab9e5cedf129f6fad Binary files /dev/null and b/docs/sbs/zh/BSP/media/PWM_01.png differ diff --git a/docs/sbs/zh/BSP/media/PWM_02.jpg b/docs/sbs/zh/BSP/media/PWM_02.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c349a57c53ea1b5cb1e4bf94e79be4402e67bf91 Binary files /dev/null and b/docs/sbs/zh/BSP/media/PWM_02.jpg differ diff --git a/docs/sbs/zh/BSP/media/Qp_Advanced_development_QuecPythonSub_i2c_bus_03.png b/docs/sbs/zh/BSP/media/Qp_Advanced_development_QuecPythonSub_i2c_bus_03.png new file mode 100644 index 0000000000000000000000000000000000000000..66c80f3ab17fe5a58334607a4b4fe9e274d24d33 Binary files /dev/null and b/docs/sbs/zh/BSP/media/Qp_Advanced_development_QuecPythonSub_i2c_bus_03.png differ diff --git a/docs/sbs/zh/BSP/media/Qp_Advanced_development_QuecPythonSub_i2c_bus_04.png b/docs/sbs/zh/BSP/media/Qp_Advanced_development_QuecPythonSub_i2c_bus_04.png new file mode 100644 index 0000000000000000000000000000000000000000..816e95f9e6a218ac6409a21e5f6a2a0ace0d0c24 Binary files /dev/null and b/docs/sbs/zh/BSP/media/Qp_Advanced_development_QuecPythonSub_i2c_bus_04.png differ diff --git a/docs/sbs/zh/BSP/media/QuecPytgon_sbs_http_02.png b/docs/sbs/zh/BSP/media/QuecPytgon_sbs_http_02.png new file mode 100644 index 0000000000000000000000000000000000000000..6409e0a425ba2f2021e3832086c678ef3522030f Binary files /dev/null and b/docs/sbs/zh/BSP/media/QuecPytgon_sbs_http_02.png differ diff --git a/docs/sbs/zh/BSP/media/UART_01.png b/docs/sbs/zh/BSP/media/UART_01.png new file mode 100644 index 0000000000000000000000000000000000000000..73e736486a7086971093588ffbd8ac307134d2e9 Binary files /dev/null and b/docs/sbs/zh/BSP/media/UART_01.png differ diff --git a/docs/sbs/zh/BSP/media/UART_02.png b/docs/sbs/zh/BSP/media/UART_02.png new file mode 100644 index 0000000000000000000000000000000000000000..8aafaaded8a9bf3aca2dd3d40abfcf4d04f3af26 Binary files /dev/null and b/docs/sbs/zh/BSP/media/UART_02.png differ diff --git a/docs/sbs/zh/BSP/media/UART_03.png b/docs/sbs/zh/BSP/media/UART_03.png new file mode 100644 index 0000000000000000000000000000000000000000..cb2e91615c5bb252404fd2bd7793afb70a3c51dd Binary files /dev/null and b/docs/sbs/zh/BSP/media/UART_03.png differ diff --git a/docs/sbs/zh/BSP/media/UART_04.png b/docs/sbs/zh/BSP/media/UART_04.png new file mode 100644 index 0000000000000000000000000000000000000000..89ab8c148098d4058fad59e486b007f76ddff3c3 Binary files /dev/null and b/docs/sbs/zh/BSP/media/UART_04.png differ diff --git a/docs/sbs/zh/BSP/media/UART_05.png b/docs/sbs/zh/BSP/media/UART_05.png new file mode 100644 index 0000000000000000000000000000000000000000..de8e5c88e701dc3074f665aacce35a3ab5afefb9 Binary files /dev/null and b/docs/sbs/zh/BSP/media/UART_05.png differ diff --git a/docs/sbs/zh/BSP/media/media_SPI_1.jpg b/docs/sbs/zh/BSP/media/media_SPI_1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f9e636fa9fc329c164c2e2f42f31795b5c61abaf Binary files /dev/null and b/docs/sbs/zh/BSP/media/media_SPI_1.jpg differ diff --git a/docs/sbs/zh/BSP/media/media_SPI_2.jpg b/docs/sbs/zh/BSP/media/media_SPI_2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7ac14f0715250687e91e68bf13d5b98b4efac075 Binary files /dev/null and b/docs/sbs/zh/BSP/media/media_SPI_2.jpg differ diff --git a/docs/sbs/zh/BSP/media/media_SPI_3.jpg b/docs/sbs/zh/BSP/media/media_SPI_3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cf87c486c4832c74f3d20170f7cd64faf10d774a Binary files /dev/null and b/docs/sbs/zh/BSP/media/media_SPI_3.jpg differ diff --git a/docs/sbs/zh/BSP/media/media_SPI_4.jpg b/docs/sbs/zh/BSP/media/media_SPI_4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..66b9a7b203f332146efb947dc5c550a98c413dd5 Binary files /dev/null and b/docs/sbs/zh/BSP/media/media_SPI_4.jpg differ diff --git a/docs/sbs/zh/BSP/media/media_SPI_5.jpg b/docs/sbs/zh/BSP/media/media_SPI_5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..88c9a0922849681691935bf954f22daf1123b45e Binary files /dev/null and b/docs/sbs/zh/BSP/media/media_SPI_5.jpg differ diff --git a/docs/sbs/zh/BSP/media/media_SPI_6.jpg b/docs/sbs/zh/BSP/media/media_SPI_6.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a41d5f821b017388e145b87efddbe0a9759f3619 Binary files /dev/null and b/docs/sbs/zh/BSP/media/media_SPI_6.jpg differ diff --git a/docs/sbs/zh/QuecPythonPlatform/Audio.md b/docs/sbs/zh/QuecPythonPlatform/Audio.md new file mode 100644 index 0000000000000000000000000000000000000000..40caf497d1984c0422027121396fa35f70976b23 --- /dev/null +++ b/docs/sbs/zh/QuecPythonPlatform/Audio.md @@ -0,0 +1,72 @@ +## 修订历史 +| 版本 | 日期 | 作者 | 变更表述 | +|------|------|------|------| +| 1.0 | 2021-4-6 | gary.zhou | 初版 | +| 1.1 | 2021-9-16 | David.Tang | 增加多模组的适用性 | + + +## 硬件连接 + +| 开发板型号 | 开发板对应PIN脚 | 开发板上对应的连接位置 | 对应的音频通道 | +| -------------------------------------------------------- | ------------------------------ | ---------------------- | -------------- | +| EC600S_QuecPython_EVB_V1.3
EC600N_QuecPython_EVB_V1.3 | PIN21、PIN22 | J7 | 通道0 | +| EC600U_QuecPython_EVB_V1.3 | PIN21、PIN22
PIN109、PIN110 | J7
J6的PIN14、PIN15 | 通道0
通道2 | + +针对EC600S/N的硬件连接图如下: + +![audio_01](media/audio_01.png) + +针对EC600U_通道0的硬件连接图如下: + +![audio_02](media/audio_02.png) + +针对EC600U_通道2的硬件连接图如下: + +![audio_03](media/audio_03.png) + +## 下载验证 + +1. 根据测试场景,调整下面代码的注释。 + + ```python + # -*- coding: UTF-8 -*- + #备注如下: + #(1)对于EC600S和EC600N的话,下面的代码不需要做任何修改,就可以播放 + #(2)对于EC600U的通道0的话,注释掉18行(18行的配置对这个播放没有影响) + #(3)对于EC600U的通道2的话,注释掉12行和19行,取消注释13行; + import utime as time + import audio + from machine import Pin + + + def example_audio_mp3(): + aud = audio.Audio(0) # 配置通道0 + # aud = audio.Audio(2) # 配置通道2 + aud.setVolume(9) + ''' + 使能外接喇叭播放 + ''' + # Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) # 官方板V1.1使用 + Pin(Pin.GPIO9, Pin.OUT, Pin.PULL_PD, 1) # 官方板V1.2和V1.3使用 + # U: 表示用户目录, GUI下载工具会将文件下载到 /usr 文件下 + aud.play(2, 1, "U:/example.mp3") + pass + + if __name__ == "__main__": + example_audio_mp3() + ``` + + + +2. 将随包的 example.mp3 和修改好的 example_audio_file.py 文件下载到开发板中。 + +3. 运行 example_audio_file.py 脚本即可。 + + + + +## 配套代码 + + + + 下载代码和音频文件 \ No newline at end of file diff --git a/docs/sbs/zh/QuecPythonPlatform/code/Audio.rar b/docs/sbs/zh/QuecPythonPlatform/code/Audio.rar new file mode 100644 index 0000000000000000000000000000000000000000..64e38e8f83702c2c0c98d5f04a30638ddb56f757 Binary files /dev/null and b/docs/sbs/zh/QuecPythonPlatform/code/Audio.rar differ diff --git a/docs/sbs/zh/QuecPythonPlatform/code/example.mp3 b/docs/sbs/zh/QuecPythonPlatform/code/example.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..1d36dd78c62237d5a4ecd1f32841815ed3e33a3e Binary files /dev/null and b/docs/sbs/zh/QuecPythonPlatform/code/example.mp3 differ diff --git a/docs/sbs/zh/QuecPythonPlatform/code/example_audio_file.py b/docs/sbs/zh/QuecPythonPlatform/code/example_audio_file.py new file mode 100644 index 0000000000000000000000000000000000000000..84df3371f4262067e32079631fc313147558d2d3 --- /dev/null +++ b/docs/sbs/zh/QuecPythonPlatform/code/example_audio_file.py @@ -0,0 +1,25 @@ +# -*- coding: UTF-8 -*- +#备注如下: +#(1)对于EC600S和EC600N的话,下面的代码不需要做任何修改,就可以播放 +#(2)对于EC600U的通道0的话,注释掉18行(18行的配置对这个播放没有影响) +#(3)对于EC600U的通道2的话,注释掉12行和19行,取消注释13行; +import utime as time +import audio +from machine import Pin + + +def example_audio_mp3(): + aud = audio.Audio(0) # 配置通道0 + # aud = audio.Audio(2) # 配置通道2 + aud.setVolume(9) + ''' + 使能外接喇叭播放 + ''' + # Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) # 官方板V1.1使用 + Pin(Pin.GPIO9, Pin.OUT, Pin.PULL_PD, 1) # 官方板V1.2和V1.3使用 + # U: 表示用户目录, GUI下载工具会将文件下载到 /usr 文件下 + aud.play(2, 1, "U:/example.mp3") + pass + +if __name__ == "__main__": + example_audio_mp3() diff --git a/docs/sbs/zh/QuecPythonPlatform/media/Qp_modem_get_dev_info_01.png b/docs/sbs/zh/QuecPythonPlatform/media/Qp_modem_get_dev_info_01.png new file mode 100644 index 0000000000000000000000000000000000000000..898c2ff0b615f66e26166a8465b661ecd07db57e Binary files /dev/null and b/docs/sbs/zh/QuecPythonPlatform/media/Qp_modem_get_dev_info_01.png differ diff --git a/docs/sbs/zh/QuecPythonPlatform/media/Qp_modem_get_dev_info_02.png b/docs/sbs/zh/QuecPythonPlatform/media/Qp_modem_get_dev_info_02.png new file mode 100644 index 0000000000000000000000000000000000000000..4754b01a58814167259f5236522573f1ebc9ec78 Binary files /dev/null and b/docs/sbs/zh/QuecPythonPlatform/media/Qp_modem_get_dev_info_02.png differ diff --git a/docs/sbs/zh/QuecPythonPlatform/media/audio_01.png b/docs/sbs/zh/QuecPythonPlatform/media/audio_01.png new file mode 100644 index 0000000000000000000000000000000000000000..3c344a43085a495f5d412a085723b18fb5d44f1d Binary files /dev/null and b/docs/sbs/zh/QuecPythonPlatform/media/audio_01.png differ diff --git a/docs/sbs/zh/QuecPythonPlatform/media/audio_02.png b/docs/sbs/zh/QuecPythonPlatform/media/audio_02.png new file mode 100644 index 0000000000000000000000000000000000000000..a2511585b7ddd55e77c0a1bfebff9e2aac3ffc88 Binary files /dev/null and b/docs/sbs/zh/QuecPythonPlatform/media/audio_02.png differ diff --git a/docs/sbs/zh/QuecPythonPlatform/media/audio_03.png b/docs/sbs/zh/QuecPythonPlatform/media/audio_03.png new file mode 100644 index 0000000000000000000000000000000000000000..0d13edd79a3ab670db63680908314b8c8f67d41b Binary files /dev/null and b/docs/sbs/zh/QuecPythonPlatform/media/audio_03.png differ diff --git a/docs/sbs/zh/QuecPythonPlatform/modem_get_dev_info.md b/docs/sbs/zh/QuecPythonPlatform/modem_get_dev_info.md new file mode 100644 index 0000000000000000000000000000000000000000..4f7338400ae55916846340aec67fd416585d6e72 --- /dev/null +++ b/docs/sbs/zh/QuecPythonPlatform/modem_get_dev_info.md @@ -0,0 +1,102 @@ + +## **QuecPython modem 获取设备信息** + +## 修订历史 + +| Version | Date | Author | Change expression | +| ------- | ---------- | ---------- | ----------------- | +| 1.0 | 2021-09-15 | David.Tang | Initial version | + +## 前言 + +本文主要基于EC600U-CN介绍如何使用QuecPython modem模块获取设备信息。通过本文您将了解到EC600U-CN线程的所有设置参数及使用方法。 + +## 软件设计 + +软件设计主要参考官网的wiki,具体位置为:[modem_API库](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=%e8%8e%b7%e5%8f%96%e8%ae%be%e5%a4%87%e7%9a%84imei) + +## 交互操作 + +使用QPYcom工具和EC600S-CN进行交互,具体如下: + +```Python +>>> import modem +>>> help(modem) +object is of type module + __name__ -- modem + getDevSN -- + getDevImei -- + getDevModel -- + getDevFwVersion -- + getDevProductId -- +>>> from modem import * +>>> getDevSN() +'D1D20J60A0017870P' +>>> getDevImei() +'868540050393723' +>>> getDevModel() +'EC600S' +>>> getDevFwVersion() +'EC600SCNAAR01A01M16_OCPU_PY_BETA1211' +>>> getDevProductId() +'Quectel' +``` + +注意: + +1. import modem即为让 modem模块在当前空间可见。 + +2. 只有import modem模块,才能使用 modem内的函数和变量。 + +## 下载验证 + +#### 软件代码 + +下载.py文件到EC600S-CN上运行,代码如下: + +```python +import modem +import log + +state = 1 +log.basicConfig(level=log.INFO) # 设置日志输出级别 + +log = log.getLogger("QuecPython") + +def modem_msg(): + global state + modem_Imei = modem.getDevImei() + modem_DevModel = modem.getDevModel() + modem_DevSN = modem.getDevSN() + modem_DevFwVersion = modem.getDevFwVersion() + modem_DevProductId = modem.getDevProductId() + log.info("modem_Imei:{}".format(modem_Imei)) + log.info("modem_DevModel:{}".format(modem_DevModel)) + log.info("modem_DevSN:{}".format(modem_DevSN)) + log.info("modem_DevFwVersion:{}".format(modem_DevFwVersion)) + log.info("modem_DevProductId:{}".format(modem_DevProductId)) + state = 0 + +if __name__ == "__main__": + modem_msg() + while 1: + if state: + pass + else: + break +``` + +#### 硬件连接 + +无需硬件连接 + +#### 运行效果 + +打开QPYcom运行*modem_file.py*,如下图: + +![image-20210915170111036](media/Qp_modem_get_dev_info_01.png) + +运行结果如下: + +![image-20210915165947749](media/Qp_modem_get_dev_info_02.png) + diff --git a/docs/sbs/zh/QuecPythonSys/filesystem.md b/docs/sbs/zh/QuecPythonSys/filesystem.md new file mode 100644 index 0000000000000000000000000000000000000000..2e4e2755e6213e1fdf329b97852ca6dfd98803da --- /dev/null +++ b/docs/sbs/zh/QuecPythonSys/filesystem.md @@ -0,0 +1,137 @@ +## 修订历史 + +| Version | Date | Author | Change expression | +| ------- | ---------- | ---------- | ----------------- | +| 1.0 | 2021-09-17 | David.Tang | Initial version | + +## 概述 + +本文主要介绍QuecPython文件系统的操作与使用。文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。通过本文您将了解到文件系统的操作与使用方法。 + +## 如何将文件存放到文件系统中 + +### 通过QPYcom工具下载操作调试文件 + +脚本下载 + +对于脚本下载,方法有多种,例如: + +(1)使用QPYcom的拖拽功能,直接将文件拖至模块中, + +(2)使用QPYcom的脚本下载功能,可一键下载脚本至模块。 + +说明:具体的脚本下载操作可见《Quectel QuecPython_QPYcom工具使用说明》 + +文件操作 + +对于QuecPython文件系统如何操作,可见[uos模块](https://python.quectel.com/wiki/#/zh-cn/api/pythonStdlib?id=uos-%e5%9f%ba%e6%9c%ac%e7%b3%bb%e7%bb%9f%e6%9c%8d%e5%8a%a1)和[uio模块](https://python.quectel.com/wiki/#/zh-cn/api/pythonStdlib?id=uio-%e8%be%93%e5%85%a5%e8%be%93%e5%87%ba%e6%b5%81) + +对于各类接口的举例操作如下: + +```python +>>> import uos +>>> uos.getcwd() #获取路径 +'/' +>>> uos.chdir('/usr') # 改变路径 +>>> uos.mkdir('QuecPython') # 在当前路径创建文件夹 +>>> uos.listdir() +['apn_cfg.json', 'a.py', 'b.py', 'V05.bin', 'system_config.json', 'checksum.json', 'b.txt', 'QuecPython'] +>>> uos.chdir('QuecPython')# 改变路径 +>>> uos.getcwd() +'/usr/QuecPython' +>>> import uio +>>> fd = uio.open('test.py', mode='w') #在当前路径新建文件,已写方式打开 +>>> fd.write('quectel') #写操作 +7 +>>> fd.close() # 关闭文件 +>>> fd = uio.open('test.py', mode='r') # 对当前路径下的文件,已读方式打开 +>>> fd.read() #读操作 +'quectel' +>>> fd.close() +``` + +### 量产文件生成bin方式 + + 对于固件合并的操作,实际上就是生成了customer_fs.bin,原理介绍如下: + +1.找到mklfs,在QPYcom解压后的目录(QPYcom_v1.7\exes\aboot)下,在mklfs工具目录下通过cmd命令打开如下: + +![filesystem_01](media/filesystem_01.jpg) + +2.创建一个文件夹,可随意命名,本文命为mount,并在此文件夹中,放置需要合并的文件,举例如下: + +![filesystem_02](media/filesystem_02.jpg) + +3.cmd命令行操作如下 + +![filesystem_03](media/filesystem_03.jpg) + +(1).bin生成命令如上,具体命令解释如下: + +![filesystem_04](media/filesystem_04.jpg) + +(2)如上图,生成的是customer_fs.bin,默认是5 MB,即图中大小是:5242880 + +(3)对于customer_backup_fs.bin,默认是200 KB,即图中输出值为:20480 + +4.生成的customer_fs.bin文件可见mklfs的工具目录,如下截图: + +![filesystem_05](media/filesystem_05.jpg) + +## 参数保存方法 + +### 动态参数的保存方法 + +开发者在开发过程中使用的临时参数,变量,字符串定义等属于动态变化的参数,对于这些动态参数,QuecPython提供了GC内存管理模块来进行内存垃圾回收。详细可以参见QuecPython官网wiki相关说明: [gc - 内存碎片回收](https://python.quectel.com/wiki/#/zh-cn/api/pythonStdlib?id=gc-%e5%86%85%e5%ad%98%e7%a2%8e%e7%89%87%e5%9b%9e%e6%94%b6) + +### 出厂参数的保存方法 + +关于出厂参数的保存,需要将配置的出厂参数先写入文件中,然后通过文件镜像生成.bin文件,具体操作方法可参考"量产文件生成bin方式"章节。 + +## 文件备份(脚本备份) + +对于文件备份,需要将备份的文件与原固件合并生成新固件,然后重新烧录至模块中,具体操作步骤见如下章节。 + +### 制作镜像文件 + +对于镜像文件的制作可以参考上面的"量产文件生成bin方式 "章节,也可以参考《Quectel_EC100Y-QuecOpen_FS镜像制作_应用指导》 + +本文对如下几个文件说明镜像文件制作: + +![filesystem_06](media/filesystem_06.png) + +制作的镜像文件是: + +![filesystem_07](media/filesystem_07.png) + +### 镜像文件替换与烧录固件 + +由于"模块会对于用户区与备份区默认烧录一个已经格式化的内容为空的镜像文件",所以需要将制作的镜像文件customer_backup_fs.bin替换原有的镜像文件,生成新的压缩包固件,使用QPYcom烧录固件,烧录步骤可参考《Quectel_QuecPython_QPYcom工具使用说明》。 + +### 文件更新 + +对于上述文件的烧录,登录QPYcom,结果如下: + +![filesystem_08](media/filesystem_08.png) + +交互界面操作如下: + +```python +>>> import checksum +>>> checksum.update('/usr/a.py') + +[{'name': '/usr/a.py', 'sha256': '454f048b9b584add8b6f67a86ec4ec01ce63baace41efba994881f608a227e30'}, {'name': '/usr/b.py', 'sha256': '3edc1bd333bc7f4caf33bb35e7602bafe5d85c6b6b2ca74a92588a470fbee917'}, {'name': '/usr/b.txt', 'sha256': 'cced28c6dc3f99c2396a5eaad732bf6b28142335892b1cd0e6af6cdb53f5ccfa'}, {'name': '/usr/V05.bin', 'sha256': 'e5d2dd354947292348a8fb29cdf78e4ffc05754f8e12ecf0dc0ff3783b6b8822'}] +>>> uos.listdir('usr/') +['apn_cfg.json', 'checksum.json', 'a.py', 'b.py', 'b.txt', 'V05.bin', 'system_config.json'] +>>> uos.listdir('/bak/usr/') +['test.txt', 'a.py', 'b.py', 'b.txt', 'V05.bin'] +>>> +``` + +操作说明: + +(1)对于更改customer_backup_fs.bin后的烧录如上图所示 + +(2)如果更新usr目录下的文件且希望下次上电后可以继续运行的话,需要使用checksum.update接口更新checksum.json文件。 + +(3)文件备份的操作就是保留合并的文件,防止后面误删文件,导致程序删除,无法恢复。 \ No newline at end of file diff --git a/docs/sbs/zh/QuecPythonSys/media/filesystem_01.jpg b/docs/sbs/zh/QuecPythonSys/media/filesystem_01.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1931c71147c5b749bd3c5dbbd505cc2109547ebd Binary files /dev/null and b/docs/sbs/zh/QuecPythonSys/media/filesystem_01.jpg differ diff --git a/docs/sbs/zh/QuecPythonSys/media/filesystem_02.jpg b/docs/sbs/zh/QuecPythonSys/media/filesystem_02.jpg new file mode 100644 index 0000000000000000000000000000000000000000..21b5ef0284bc874f7d0c92b9161f7b56c91913a6 Binary files /dev/null and b/docs/sbs/zh/QuecPythonSys/media/filesystem_02.jpg differ diff --git a/docs/sbs/zh/QuecPythonSys/media/filesystem_03.jpg b/docs/sbs/zh/QuecPythonSys/media/filesystem_03.jpg new file mode 100644 index 0000000000000000000000000000000000000000..322f3f654806cbc5e6ba7ed64058142583c6d442 Binary files /dev/null and b/docs/sbs/zh/QuecPythonSys/media/filesystem_03.jpg differ diff --git a/docs/sbs/zh/QuecPythonSys/media/filesystem_04.jpg b/docs/sbs/zh/QuecPythonSys/media/filesystem_04.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7c5b4a8eb58b280bbc701708f5b14b734100c05d Binary files /dev/null and b/docs/sbs/zh/QuecPythonSys/media/filesystem_04.jpg differ diff --git a/docs/sbs/zh/QuecPythonSys/media/filesystem_05.jpg b/docs/sbs/zh/QuecPythonSys/media/filesystem_05.jpg new file mode 100644 index 0000000000000000000000000000000000000000..12a9f7620876915bacffadebb9e4880e07375861 Binary files /dev/null and b/docs/sbs/zh/QuecPythonSys/media/filesystem_05.jpg differ diff --git a/docs/sbs/zh/QuecPythonSys/media/filesystem_06.png b/docs/sbs/zh/QuecPythonSys/media/filesystem_06.png new file mode 100644 index 0000000000000000000000000000000000000000..426fda2253d2726f3e5b5c3335a1fe5e031ca3ea Binary files /dev/null and b/docs/sbs/zh/QuecPythonSys/media/filesystem_06.png differ diff --git a/docs/sbs/zh/QuecPythonSys/media/filesystem_07.png b/docs/sbs/zh/QuecPythonSys/media/filesystem_07.png new file mode 100644 index 0000000000000000000000000000000000000000..90bd22f3ecefbd6a4eaff6f23d1db6f2909fb90f Binary files /dev/null and b/docs/sbs/zh/QuecPythonSys/media/filesystem_07.png differ diff --git a/docs/sbs/zh/QuecPythonSys/media/filesystem_08.png b/docs/sbs/zh/QuecPythonSys/media/filesystem_08.png new file mode 100644 index 0000000000000000000000000000000000000000..e9600be3531d9e5c3975c86692cfb2f66ffea1d0 Binary files /dev/null and b/docs/sbs/zh/QuecPythonSys/media/filesystem_08.png differ diff --git a/docs/sbs/zh/QuecPythonWirelessNetwork/DataCall.md b/docs/sbs/zh/QuecPythonWirelessNetwork/DataCall.md new file mode 100644 index 0000000000000000000000000000000000000000..bea00f49754561331d9797e02dc43396b000cf7d --- /dev/null +++ b/docs/sbs/zh/QuecPythonWirelessNetwork/DataCall.md @@ -0,0 +1,193 @@ +## 修订记录 + +| 版本 | 日期 | 作者 | 变更表述 | +| ---- | ---------- | ------ | ------------ | +| 1.0 | 2021-09-13 | Kayden | 初始版本修订 | + +
+ +## QuecPython_dataCall数据拨号 + +**模块功能:** + +提供数据拨号相关接口。启动;配置;查询终端通过何种接入方式来访问何种网络。 + +具体的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/Qp_Sim_fun_01.png b/docs/sbs/zh/QuecPythonWirelessNetwork/media/Qp_Sim_fun_01.png new file mode 100644 index 0000000000000000000000000000000000000000..5e6bbcc8267d8a34062af3cf1913fa79e393e4f4 Binary files /dev/null and b/docs/sbs/zh/QuecPythonWirelessNetwork/media/Qp_Sim_fun_01.png differ 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 diff --git a/docs/sbs/zh/QuecPythonWirelessNetwork/media/ntp_01.png b/docs/sbs/zh/QuecPythonWirelessNetwork/media/ntp_01.png new file mode 100644 index 0000000000000000000000000000000000000000..d3ff00fe6989a40b433d3c2a88feb41cdd47908f Binary files /dev/null and b/docs/sbs/zh/QuecPythonWirelessNetwork/media/ntp_01.png differ diff --git a/docs/sbs/zh/QuecPythonWirelessNetwork/media/ntp_02.png b/docs/sbs/zh/QuecPythonWirelessNetwork/media/ntp_02.png new file mode 100644 index 0000000000000000000000000000000000000000..cf01c852045c1a2b91b96c5498b7143e31ef16bc Binary files /dev/null and b/docs/sbs/zh/QuecPythonWirelessNetwork/media/ntp_02.png differ diff --git a/docs/sbs/zh/QuecPythonWirelessNetwork/media/ntp_03.png b/docs/sbs/zh/QuecPythonWirelessNetwork/media/ntp_03.png new file mode 100644 index 0000000000000000000000000000000000000000..01a07df983814ad728c799bfb93d48d33662da4a Binary files /dev/null and b/docs/sbs/zh/QuecPythonWirelessNetwork/media/ntp_03.png differ diff --git a/docs/sbs/zh/QuecPythonWirelessNetwork/media/ntp_04.png b/docs/sbs/zh/QuecPythonWirelessNetwork/media/ntp_04.png new file mode 100644 index 0000000000000000000000000000000000000000..ced3c491f839bb0aaf03315e37ba1433a7ba430d Binary files /dev/null and b/docs/sbs/zh/QuecPythonWirelessNetwork/media/ntp_04.png differ diff --git a/docs/sbs/zh/QuecPythonWirelessNetwork/media/ntp_05.png b/docs/sbs/zh/QuecPythonWirelessNetwork/media/ntp_05.png new file mode 100644 index 0000000000000000000000000000000000000000..489fc4e8e019475afad73bbde61b4f09212d1f3f Binary files /dev/null and b/docs/sbs/zh/QuecPythonWirelessNetwork/media/ntp_05.png differ diff --git a/docs/sbs/zh/QuecPythonWirelessNetwork/media/sim_02.png b/docs/sbs/zh/QuecPythonWirelessNetwork/media/sim_02.png new file mode 100644 index 0000000000000000000000000000000000000000..5e6bbcc8267d8a34062af3cf1913fa79e393e4f4 Binary files /dev/null and b/docs/sbs/zh/QuecPythonWirelessNetwork/media/sim_02.png differ diff --git a/docs/sbs/zh/QuecPythonWirelessNetwork/media/sim_03.png b/docs/sbs/zh/QuecPythonWirelessNetwork/media/sim_03.png new file mode 100644 index 0000000000000000000000000000000000000000..c69de7da003570f058d13bfe7394e6e9202f518b Binary files /dev/null and b/docs/sbs/zh/QuecPythonWirelessNetwork/media/sim_03.png differ diff --git a/docs/sbs/zh/QuecPythonWirelessNetwork/ntp.md b/docs/sbs/zh/QuecPythonWirelessNetwork/ntp.md new file mode 100644 index 0000000000000000000000000000000000000000..2720cf9892c0e44ae4241b423daa062cbca14948 --- /dev/null +++ b/docs/sbs/zh/QuecPythonWirelessNetwork/ntp.md @@ -0,0 +1,81 @@ +## 修订历史 +| 版本 | 日期 | 作者 | 变更表述 | +|------|------|------|------| +| 1.0 | 2021-4-1 | gary.zhou | 初版 | +| 1.1 | 2021-9-15 | David.Tang | 略作检查与修改 | + +## 前言 + +本文主要介绍NTP使用指导。 + +## 概述 + +NTP又称网络时间协议,用于同步计算机时间的一种协议。该协议可以使计算机对其服务器或时钟源(如石英钟,GPS等等)进行同步,同时提供高精准度的时间校正(LAN上与标准时间差小于 1 毫秒,WAN上与标准时间差大约有几十毫秒),且可介由加密确认的方式来防止恶毒的协议攻击。NTP的目的是在无序的互联网环境中提供精确和健壮的时间服务。 + +NTP提供准确时间,首先要有准确的时间来源,即国际标准时间UTC。NTP获得UTC的时间来源可以是原子钟、天文台、卫星,也可以从互联网上获取。时间按NTP服务器的等级传播,按照离外部UTC时间源的远近将所有服务器归入不同的Stratum(层)中。Stratum- 1 在顶层,有外部UTC接入;Stratum- 2从Stratum- 1 获取时间;Stratum- 3 从Stratum- 2 获取时间,......,以此类推,但Stratum的总数限制在 15以内。所有这些服务器在逻辑上形成阶梯式的架构相互连接,而Stratum- 1 的时间服务器是整个系统的基础。计算机主机一般同多个时间服务器连接,利用统计学的算法过滤来自不同服务器的时间,以选择最佳的路径和来源来校正主机时间,即使主机在长时间无法与某一时间服务器相联系的情况下,NTP服务依然有效运转。 + +为防止对时间服务器的恶意破坏,NTP使用了识别(Authentication)机制,检查来对时的信息是否是真正来自所宣称的服务器并检查资料的返回路径,以提供对抗干扰的保护机制。NTP时间同步报文中包含的时间是格林威治时间,是从 1900 年开始计算的秒数。 + +## API介绍 + +具体的API详解请参考[QuecPython-ntptime-NTP对时](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonThirdlib?id=ntptime-ntp对时) + +## 功能实现 + +NTP对时需要从NTP服务器上获取时间,故在实现NTP对时功能之前需连接网络。本文档以通过SIM卡进行联网为例。 + +### 操作一: +准备一张可用的SIM卡,插入SIM卡后通电,等待自动拨号。以EC600S-CN为例,EC600S_QuecPython_EVB_V1.1开发板配备的是NANO SIM卡座,自弹式,触点向下,缺口向内。SIM卡槽位置如图所示: + +![](media/ntp_01.png) + + ​ 图 1 :插入SIM卡 + +自动拨号后,可通过如下方法验证是否拨号成功: + +![](media/ntp_02.png) + +​ 图 2 :自动拨号成功验证 + +### 操作二: + +拨号成功后,导入ntptime模块,返回当前的NTP服务器,默认为"ntp.aliyun.com"。 + +![](media/ntp_03.png) + + ​ 图 3 :当前NTP服务器 + +### 操作三: + +设置NTP服务器。设置成功返回 0 ,设置失败返回- 1 。 + +![](media/ntp_04.png) + + ​ 图 4 :设置NTP服务器 + +### 操作四: + +使用 ntptime.settime() 同步NTP时间。同步成功返回 0 ,同步失败返回- 1 。 + +对时结果可使用utime.localtime()验证。执行utime.localtime()后返回当前时间,返回值为一个元组:(year, month, mday, hour, minute, second, weekday, yearday)。具体的API详解请参考[QuecPython-utime-与时间相关功能](https://python.quectel.com/wiki/#/zh-cn/api/pythonStdlib?id=utime-与时间相关功能)。 + +ntptime.settime()对时后返回时间为UTC时间,北京时间领先UTC八个小时,所以对时后,对比当前时间可发现时间后退八小时。 + +![](media/ntp_05.png) + + ​ 图 5 :对时成功 + +## 附录术语缩写 + +表 1 :术语缩写 + +|术语 | 英文描述 | 中文描述 | +| ---------- | --------------------------------- |----------- | +| GPS | Global Positioning System | 全球定位系统| +| LAN | Local Area Network | 局域网| +| NTP | Network Time Protocol | 网络时间协议| +| RTC | Real_Time Clock | 实时时钟| +| SIM | Subscriber Identity Module | 用户身份识别模块| +| UTC | Coordinated Universal Time | 协调世界时| +| WAN | Wide Area Network | 广域网| + diff --git a/docs/sbs/zh/QuecPythonWirelessNetwork/sim.md b/docs/sbs/zh/QuecPythonWirelessNetwork/sim.md new file mode 100644 index 0000000000000000000000000000000000000000..f952e5148494e6c4eefbe749d858ddf24a81e1a5 --- /dev/null +++ b/docs/sbs/zh/QuecPythonWirelessNetwork/sim.md @@ -0,0 +1,137 @@ +## 修订记录 + +| 版本 | 日期 | 作者 | 变更表述 | +| ---- | ---------- | ---------- | ------------ | +| 1.0 | 2021-09-13 | David.Tang | 初始版本修订 | + +## 前言 + +本文主要简介QuecPython SIM卡模块的使用。 具体的API 详解请参考[QuecPython_SIM](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=sim-sim%e5%8d%a1) + +## SIM卡基本概述 + +SIM 分为手机卡和物联网卡。区别就是物联网卡没有电话号码不能收发短信,手机可以发短信。 常见的是手机卡。 + +第二代标准的Mini卡,国内用户俗称的大卡。 + +第三代标准的Micro卡,俗称小卡。 + +第四代标准的Nano卡。 + +Qp_Sim_fun_01 + +sim_02 + +需要的是第四代标准的 Nano 卡。 + +## 快速开始 +获取sim 卡信息之前,请首先确认sim卡状态是否完好, +```python +import sim +# 返回状态1 表示状态正确,其他错误码,请查阅 WIKI SIM API +sim.getStatus() +``` +### 获取imsi +IMSI全称为 Internation Mobile Subscriber Identity,即国际移动用户识别码。 + +- 前三位数字代表移动国家代码(MCC)。 +- 接下来的两位或三位数字代表移动网络代码(MNC)。E.212允许使用三位数的MNC代码,但主要在美国和加拿大使用。 +- 接下来的数字代表移动用户识别号(MSIN)。 +```python +import sim +sim.getImsi() +``` +### 获取iccid +ICCID全称为Integrated Circuit Card Identifier,即集成电路卡识别码。 + +- 可以简单理解为SIM卡的卡号(身份证号)。 + +- 编码格式为:XXXXXX 0MFSS YYGXX XXXX。 + +- 前六位运营商代码: + + 中国移动的为:898600;898602;898604;898607 , + + 中国联通的为:898601、898606、898609, + + 中国电信898603、898611。 +```python +import sim +sim.iccid() +``` + +### PIN码操作 + PIN码(PIN1)是电信名词,全称**Personal Identification Number**。是指SIM卡的个人识别密码. +手机的PIN码是保护SIM卡的一种安全措施,防止别人盗用SIM卡,如果启用了开机PIN码,那么每次开机后就要输入**4-8**位数PIN码。当输入PIN码错误超过三次时,将自动锁卡保护。解锁需要使用PUK码拨打运营商客服热线.需要注意的是,如果输入三次PIN码错误,手机便会自动锁卡,并提示输入PUK码解锁,这个时候已经接近了危险的边缘,如果你不知道你的PUK码就暂时不要动了,拿上服务密码拨打客服热线,客服会告诉你初始的PUK码,输入PUK码之后就会解锁PIN,就可以重置密码了。如果擅自修改了PIN码,一定要牢记。 + +#### PIN1码 + PIN1码是个人识别码。是SIM卡内部的一个存储单元,通过手机设置。 +开机时会要求输入PIN1码,错误地输入PIN1码3次,将会导致“锁卡”现象。此时需要运营商提供PUK码在手机键盘上输入,就可以解锁。如果错误输入PUK码10次,就会“烧卡”,您必须带机主有效证件到运营网络的营业厅补卡。 + +#### PIN2码 + 您的手机上如果显示“PIN2码限制通话”可能是由于您开启了PIN2码的相关功能, +但由于网络暂不支持PIN2码的相关功能,即便开启也不能使用其功能。如不慎将PIN2码锁死,也不会影响手机的正常使用,请您携带机主的有效证件到运营服务商营业厅办理免费解锁服务。启用sim卡PIN码验证,开启后需要输入正确的PIN验证成功后,sim卡才能正常使用。只有3次输入PIN码机会,3次都错误,sim卡被锁定,需要PUK来解锁。 + +#### 使能验证Pin码 +```python +import sim +# 1234 修改成为你的 Pin码, 一般是 4到8位,此类操作,请慎重。 +sim.enablePin("1234") +# 在使能 pin码以后,才能进行验证 Pin +sim.verifyPin("1234") +# 关闭Pin码 +sim.disablePin("1234") +``` +#### 修改PIN码 +```python +import sim +# 1234 为 久的PIN码, 4321 为 新的PIN码 +sim.changePin("1234", "4321") +``` + +### 重置pin码-PUK码 +当错误输入Pin码次数过多以后,不能再输入PIN码。此时需要使用PUK码来解锁。 + +#### PUK1码 +PUK码(PUK1)由8位数字组成 ,这是用户无法更改的,只有补换SIM卡后PUK码才会变更。当手机PIN码被锁,并提示输入PUK码时。千万不要轻举妄动,因为PUK码只有10次输入机会,10次都输错的话,SIM卡将会被永久锁死,也就是报废。部分SIM卡的PUK码是用户在购卡时随卡附带的。 + +#### PUK2码 +PIN2码是电信局用于计费的,一般不向用户提供 。如果输入三次错误,手机会需要用PUK2码解锁,过程与先前介绍的PIN码、PUK码相同。不过这两种密码与网络计费及SIM卡内部资料的修改有关,所以不会公开,而且即便PIN2密码锁死,也不会影响手机的正常使用。**因此,PIN2码和PUK2码不必去刻意理会**。 + +#### 解锁PIN码 +```python +import sim +# 12345678 为 PUK码, 0000 为新的 PIN码 +sim.unblockPin("12345678", "0000") +``` + +### 读写SIM内存区域 + +#### Phonebook Memory Storage +Phonebook Memory Storage即为SIM卡电话薄存储区域。详情可参考 [ts_127007v100300p.pdf](https://www.etsi.org/deliver/etsi_ts/127000_127099/127007/10.03.00_60/ts_127007v100300p.pdf) +![sim_03](media/sim_03.png) + +```python +>>> import sim +>>> sim.getStatus() +1 +>>> sim.getImsi() +'460110847679419' +>>> sim.getIccid() +'89860319747555431000' +# 写电话薄, +>>> sim.writePhonebook(9, 1, 'Tom', '18144786859') +0 +>>> sim.writePhonebook(9, 2, 'z', '18144786859') +0 +>>> sim.readPhonebook(9, 1, 4, "") +(1, [(1, 'Tom', '18144786859')]) +>>> sim.readPhonebook(9, 2, 4, "") +(1, [(2, 'z', '18144786859')]) +``` +## 参考资料 + +**[ts_127007v100300p.pdf](https://www.etsi.org/deliver/etsi_ts/127000_127099/127007/10.03.00_60/ts_127007v100300p.pdf)** + +**[Quecpython sim - SIM卡库]([QuecPython 类库 (quectel.com)](https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=sim-sim卡))** + diff --git a/docs/sbs/zh/README.md b/docs/sbs/zh/README.md index a301ab150144fbab9e29a191297f0ef5ba2f5910..a1b25c5110c75a210ec9633f0663ce40316c4330 100644 --- a/docs/sbs/zh/README.md +++ b/docs/sbs/zh/README.md @@ -1,18 +1,19 @@ -### QuecPython 基础操作说明 +## QuecPython 基础操作说明 -本文主要介绍 QuecPython 基础操作,包括文件系统以及指令执行。在 QuecPython中,使用主串口作为指令和数据接收通道,所有操作都通过主串口完成。 +本文主要介绍 QuecPython 基础操作,包括文件系统以及指令执行。 -适用模块: +### 文档历史 -- EC100Y-CN(本文以该模块为例进行介绍) +| **版本** | **日期** | **作者** | **变更表述** | +| -------- | ---------- | ----------- | ------------- | +| 1.0 | 2021-09-31 | rivern.yuan | 初始版本&修订 | -- EC600S-CN -#### 系统启动 +### 系统启动 QuecPython 启动后,将在主串口启动交互式解释器,类似于 Linux Shell。通过该交互式解释器,用户可实时地执行命令,并查看返回的结果。 -![](sbs/media/0f627ce2f6c2f679cd92c7685c3cf148.jpg) +![](media/basic-01.jpg) 交互式解释器 @@ -28,7 +29,7 @@ QuecPython 启动后,将在主串口启动交互式解释器,类似于 Linux - *main.py*:用户初始化脚本,系统初始化完成后执行。 -#### 文件系统 +### 文件系统 在 QuecPython 中,划分了 5 MB 的空间作为用户分区,用户可以将一些配置、脚本等文件存储在该分区中。在系统启动时,会自动挂载该分区,该分区挂载在‘/’目录。 @@ -36,7 +37,7 @@ QuecPython 启动后,将在主串口启动交互式解释器,类似于 Linux > 在 QuecPython 中,提供了对文件系统访问的类库*uos*,可用于操作和访问文件系统。 > 以下代码示例为如何在当前目录下创建文件、写入内容及读取内容。 -``` +```python import uos # create a file f=open('test.txt','w') f.write('hello quecpython!\n') @@ -66,7 +67,7 @@ f.close() 步骤 **6**:进度条显示为“**100%**”时,表示下载完成,可进入“文件”Tab查看模块内文件详情。 -![](sbs/media/5515ac10e5070dd1b9bfd61c7a7022cf.jpg) +![](media/basic-02.jpg) > **2**:脚本下载界面 @@ -75,7 +76,7 @@ f.close() 运行 *QPYcom.exe* 工具,点击“查看”-->“文件浏览”,可实现本地与模块进行 Python 文件的上传、查看、添加、删除操作,操作界面及按钮如下图所示。 -![](sbs/media/277228479c7256251a776b75160dfcec.jpg) +![](media/basic-05.jpg) 本地与模块进行 **Python** 文件的上传、查看、添加、删除操作 @@ -83,7 +84,7 @@ f.close() 运行 *QPYcom.exe*工具,点击“查看”-->“交互命令行”,进入交互主界面。在交互界面可以通过交互窗口与模块进行手动输入交互,交互主界面说明如图所示。 -![](sbs/media/c240cbfd8fcee183b8644a9a41320d34.jpg) +![](media/basic-03.jpg) 交互界面说明 @@ -93,11 +94,11 @@ f.close() > 步骤 **2**:进入“文件”Tab; > 步骤 **3**:点击下图红框所示按钮,执行脚本文件。 -![](sbs/media/8431414d399d975a4c26434403a514bd.jpg) +![](media/basic-04.jpg) 执行脚本界面 -#### 字节码编译 +### 字节码编译 为了提高代码执行速度以及客户代码安全,移远通信提供了 mpy-cross 工具将用户 Python脚本编译为字节码。字节码可固化在固件中,也可以存放在文件系统中供脚本使用。详情请参考 @@ -107,7 +108,7 @@ f.close() > mpy-cross.exe -o test.mpy -s test.py -march=armv7m test.py -#### 附录 **A** 术语缩写 +附录 **A** 术语缩写 表 **1**:术语缩写 diff --git a/docs/sbs/zh/config.json b/docs/sbs/zh/config.json index 10c2a1cc1964035be8ce534c1a708e32e4094fcc..91f378176713a497624b6d516327454c8605ba9a 100644 --- a/docs/sbs/zh/config.json +++ b/docs/sbs/zh/config.json @@ -1,92 +1,21 @@ { - "class": "language_zh", + "import": "config_zh", "navbar": { - "title": "QuecPython", - "logo": { - "alt": "teedoc logo", - "src": "/static/image/quectel.png" - }, - "home_url": "/", "items": [ { - "url": "https://python.quectel.com/wiki/#/", - "label": "wiki", - "position": "left" - }, - { - "label": "    文档    ", - "position": "left", - "items": [ - { - "url": "/doc/Quecpython_intro/zh/index.html", - "label": "产品介绍" - }, - { - "url": "/doc/Quick_start/zh/index.html", - "label": "快速开始" - }, - { - "url": "/doc/sbs/zh/index.html", - "label": "手把手教程" - }, - { - "url": "/doc/Advanced_development/zh/index.html", - "label": "开发进阶" - }, - { - "url": "/doc/little_demo/zh/index.html", - "label": "小实验" - }, - { - "url": "/doc/Product_case/zh/index.html", - "label": "产品案例" - }, - { - "url": "/doc/Mass_production/zh/index.html", - "label": "产品量产" - }, - { - "url": "/doc/FAQ/zh/index.html", - "label": "常见问题" - } - ] - }, - { - "label": "GitHub", + "id": "language", + "label": "Language: ", "position": "right", - "url": "https://github.com/quecpython/Community-document" - } - ] - }, - "footer": { - "top": [ - { - "label": "链接", - "items": [ - { - "label": "使用 teedoc 构建", - "url": "https://github.com/neutree/teedoc", - "target": "_blank" - }, - { - "label": "Copyright © 2021 Neucrack", - "url": "https://neucrack.com", - "target": "_blank" - } - ] - }, - { - "label": "源码", "items": [ { - "label": "github", - "url": "https://github.com/neutree/teedoc", - "target": "_blank" + "id": "zh", + "url": "doc/sbs/zh/", + "label": "中文" }, { - "label": "本网站源文件", - "url": "https://github.com/quecpython/Community-document", - "target": "_blank" + "id": "en", + "url": "doc/sbs/en/", + "label": "English" } ] } diff --git a/docs/sbs/zh/media/basic-01.jpg b/docs/sbs/zh/media/basic-01.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1927fcb6a2fcc330e20d957254909473d5bf9ff3 Binary files /dev/null and b/docs/sbs/zh/media/basic-01.jpg differ diff --git a/docs/sbs/zh/media/basic-02.jpg b/docs/sbs/zh/media/basic-02.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1772cc4440d61b6cadd17801396653865af13631 Binary files /dev/null and b/docs/sbs/zh/media/basic-02.jpg differ diff --git a/docs/sbs/zh/media/basic-03.jpg b/docs/sbs/zh/media/basic-03.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b207eed7806f0f6bdef05e98faaa226d42759981 Binary files /dev/null and b/docs/sbs/zh/media/basic-03.jpg differ diff --git a/docs/sbs/zh/media/basic-04.jpg b/docs/sbs/zh/media/basic-04.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6c56a06d1dd01f614735090b4447efa521d0fdaf Binary files /dev/null and b/docs/sbs/zh/media/basic-04.jpg differ diff --git a/docs/sbs/zh/media/basic-05.jpg b/docs/sbs/zh/media/basic-05.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ad38ffab09b58943311e3b07f1347e65b149b1f2 Binary files /dev/null and b/docs/sbs/zh/media/basic-05.jpg differ diff --git a/docs/sbs/zh/sbs/README.md b/docs/sbs/zh/sbs/README.md deleted file mode 100644 index 395678a109e0817d70c895073b35c3dc4fec54c2..0000000000000000000000000000000000000000 --- a/docs/sbs/zh/sbs/README.md +++ /dev/null @@ -1,52 +0,0 @@ -# 手把手教学 -## 入门 - -[QuecPython 基础操作说明](/zh-cn/sbs/basic.md) - -[QuecPython 技术与资源综述](https://qpy.quectel.com/wiki/zh-cn/sbs/res/res.pdf) - -## 云平台 - -[QuecPython 接入阿里云应用开发指导](/zh-cn/sbs/aliyun.md) - -[QuecPython 接入腾讯云应用开发指导](/zh-cn/sbs/tencentyun.md) - -## 通信 - -[QuecPython MQTT应用开发指导](/zh-cn/sbs/mqtt.md) - -[QuecPython HTTP应用开发指导](/zh-cn/sbs/http.md) - -[QuecPython Socket应用开发指导](/zh-cn/sbs/socket.md) - -## 系统 - -[QuecPython 文件读写使用说明](/zh-cn/sbs/file.md) - -[QuecPython 多线程应用开发指导](/zh-cn/sbs/thread.md) - -[QuecPython 总线使用指导](/zh-cn/sbs/bus.md) - -[QuecPython LED使用指导](/zh-cn/sbs/led.md) - -[QuecPython 定时器使用指导](/zh-cn/sbs/timer.md) - -## 应用 - -[QuecPython GPS使用指导](/zh-cn/sbs/gps.md) - -[QuecPython NTP使用指导](/zh-cn/sbs/ntp.md) - -[QuecPython Audio使用指导](/zh-cn/sbs/audio.md) - -[QuecPython TTS使用指导](/zh-cn/sbs/tts.md) - -[QuecPython LCD使用指导](/zh-cn/sbs/lcd.md) - -[QuecPython Record拾音使用指导](/zh-cn/sbs/record.md) - -[QuecPython PWM使用指导](/zh-cn/sbs/pwm.md) - -## 其他 - -[QuecPython mpy-cross工具使用指导](/zh-cn/sbs/mpycross.md) \ No newline at end of file diff --git a/docs/sbs/zh/sbs/aliyun.md b/docs/sbs/zh/sbs/aliyun.md deleted file mode 100644 index 1f5906018070c117780978325df7169ae5d52c3a..0000000000000000000000000000000000000000 --- a/docs/sbs/zh/sbs/aliyun.md +++ /dev/null @@ -1,388 +0,0 @@ -## 接入阿里云应用 开发指导 - -阿里云物联网平台介绍 - -阿里云物联网平台为设备提供安全可靠的连接通信能力,向下连接海量设备,支撑设备数据采集上云;向上提供云端API,服务端通过调用云端 API将命令下发至设备端,实现远程控制。物联网平台也提供了其他连接管理能力,如设备管理、规则引擎、安全能力等,为各类IoT 场景和行业开发者赋能。 - -阿里云物联网平台文档:[。](https://help.aliyun.com/product/30520.html)开发者可以登录该网址进一步了解该物联网平台及设备接入相关知识。 - -## 阿里云物联网平台关键的名词解释 - -如下表格中简单介绍了阿里云物联网平台中关键的名词解释,详细信息可参考阿里云官方文档(URL: -[)](https://help.aliyun.com/document_detail/30524.html)。 - -> 表 **1**:关键名词解释 - -| 关键名词 | 名词解释 | -| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| 产品 | 设备的集合,通常指一组具有相同功能的设备。物联网平台为每个产品颁发全局唯一的 ProductKey。 | -| 设备 | 归属于某个产品下的具体设备。物联网平台为设备颁发产品内唯一的证书 DeviceName。设备可以直接连接物联网平台,也可以作为子设备通过网关连接物联网平台。 | -| 子设备 | 本质上也是设备。子设备不能直接连接物联网平台,只能通过网关连接。 | -| 网关 | 能够直接连接物联网平台的设备,且具有子设备管理功能,能够代理子设备连接云端。 | -| 设备证书 | 设备证书指 ProductKey、DeviceName、DeviceSecret 的组合,用于设备认证以及建立连接。 ProductKey:物联网平台为产品颁发的全局唯一标识。该参数很重要,在设备认证以及通信中都会用到,因此需要您保管好。 DeviceName:在注册设备时,自定义的或系统生成的设备名称,具备产品维度内的唯一性。该参数很重要,在设备认证以及通信中都会用到,因此需要您保管好。  DeviceSecret:物联网平台为设备颁发的设备密钥,和 DeviceName 成对出现。 该参数很重要,在设备认证时会用到,因此需要您保管好并且不能泄露。 | -| ProductSecret | 由物联网平台颁发的产品密钥,通常与 ProductKey 成对出现,用于一型一密的认证方案。该参数很重要,需要您保管好,不能泄露。 | -| 一机一密 | 每个设备烧录其唯一的设备证书(ProductKey、DeviceName 和 DeviceSecret)。当设备与物联网平台建立连接时,物联网平台对其携带的设备证书信息进行认证。 | -| 一型一密 | 同一产品下所有设备可以烧录相同的 ProductKey 和 ProductSecret。设备发送激活 请求时,物联网平台对其携带的 ProductKey 和 ProductSecret 进行认证,认证通过,下发该设备接入所需信息。设备再携带这些信息与物联网平台建立连接。 | -| 设备 ID²认证 | ID²(Internet Device ID)是一种物联网设备的可信身份标识,具备不可篡改、不可伪造、全球唯一等安全属性。物联网平台支持设备使用 ID²进行身份认证。 | -| Topic | Topic 是 UTF-8 字符串,是设备发布(Pub)、订阅(Sub)消息的传输中介。 发布:设备可以往该 Topic 发布消息。 订阅:设备可以订阅该 Topic 获取消息。 | -| 规则引擎 | 通过创建、配置规则,以实现服务端订阅、数据流转和场景联动。 | -| 物模型 | 是对设备在云端的功能描述,包括设备的属性、服务和事件。物联网平台通过定义一种物的描述语言来描述物模型,称之为 TSL(即 Thing Specification Language),采用 JSON 格式,开发者可以根据 TSL 组装上报设备的数据。 | - -## 阿里云接口详解 - -**aLiYun** - -> 该方法用于配置阿里云物联网套件的产品信息和设备信息。 - -- 函数原型 - -aLiYun(productKey, productSecret, DeviceName, DeviceSecret) - -- 参数 - - *productKey*: - - 产品标识 - - *productSecret*:产品密钥。可选参数,默认为 None。 - - 一机一密认证方案时,此参数传入 - None(不可以为空字符串);一型一密认证方案时,此参数传入真实的产品密钥。 - - *deviceName*: - - 设备名称 - - *deviceSecret*:设备密钥。可选参数,默认为 - None。一型一密认证方案时此参数传入 None。 - -  返回值 - - 返回阿里云连接对象。 - -**aLiYun.setMqtt** - -> 该方法用于设置 MQTT 数据通道的参数。 - -> aLiYun.setMqtt(clientID, clean_session, keepAlive) - -- 参数 - - *clientID*: - - 自定义阿里云连接 ID - - *clean_session*:可选参数,一个决定客户端类型的布尔值。默认为 False。如果为 - True,那么代理将在其断开连接时删除有关此客户端的所有信息。如果为 - False,则客户端是持久客户端,当客户端断开连接时,订阅信息和排队消息将被保留。 - - *keepAlive*:通信之间允许的最长时间段。范围:60~1200;单位:秒;默认:300。 - -- 返回值 - - 无 - -**aLiYun.setCallback** - -> 该方法用于注册回调函数。 - -- 函数原型 - - aLiYun.setCallback(sub_cb) - -- 参数 - - *sub_cb*: - - 回调函数 - -- 返回值 - - 无 - -**aLiYun.subscribe** - -> 该方法用于订阅 MQTT 主题。 - -> aLiYun.subscribe(topic,qos) - -- 参数 - - *topic*: - - 订阅的 Topic - - *qos*: - - MQTT 消息服务质量。默认值:0。可选择 0 或 1。 - -- 返回值 - - 无 - -**aLiYun.publish** - -> 该方法用于发布消息。 - -- 函数原型 - - aLiYun.publish(topic,msg) - -- 参数 - - *topic*: - - 发布的 Topic - - *msg*: - - 需要发送的数据 - -- 返回值 - - 无 - -**aLiYun.start** - -> 该方法用于开始运行连接。 aLiYun.start() - -- 参数 - - 无 - -- 返回值 - - 无 - -## 使用 QuecPython 连接阿里云 - -创建产品与设备 - -> 使用阿里云物联网平台时,首先需要在云端创建产品和对应设备,获取设备证书(ProductKey、DeviceName 和DeviceSecret)。产品相当于一类设备的集合,同一产品下的设备具有相同的功能。将物联网平台颁发的设备证书烧录到设备上,用于设备连接物联网平台的身份验证。 - -步骤**1**: -登录阿里云物联网平台控制台[:](https://iot.console.aliyun.com/product)[。](https://iot.console.aliyun.com/product)登陆后,依次点击“设备管理”、导航栏的“产品”开始创建产品并进行产品的参数配置。如下图所示: - -![](media/0da5c0e906c2dfef5e1066e03eddb533.jpg) - -> 图 **1**:创建产品 - -步骤**2**: -建议参考下图所示的参数进行配置。如需详细了解参数配置,可访问阿里云物联网平台官方地址:https://help.aliyun.com/document_detail/73728.html[。](https://help.aliyun.com/document_detail/73728.html) - -创建完成后,点击“确认”保存配置。 - -![](media/f20ca6b0c04fd992473f2f7474af106c.jpg) - -> 图 **2**:创建产品参数配置参考 - -步骤**3**: -产品指某一类设备,创建产品后,需要为设备创建身份。用户可以创建单个设备,也可以批量创建设备。如下以创建单个设备为例进行详细介绍。依次点击“设备”、“添加设备”开始添加设备,如下图所示: - -![](media/42dbaa1445eaa8539bde9e66a7a78d59.jpg) - -> 图 **3**:创建设备 - -步骤**4**: -设备创建成功后,将自动弹出“设备证书”窗口,可以查看、复制设备证书信息,如下图所示。设备证书由设备的ProductKey、DeviceName 和 DeviceSecret -组成,是设备与物联网平台进行通信的重要身份认证,请妥善保管。 - -![](media/d8152295b16a9524bb60da43dc35f674.jpg) - -> 图 **4**:设备证书信息 - -接入阿里云物联网平台 - -> 在接入阿里云物联网平台之前,请确认已在阿里云物联网平台控制台创建产品和设备,并获取设备证书信息(ProductKey、DeviceName -> 和 DeviceSecret)。 - -通过 MQTT.fx 接入阿里云物联网平台并进行测试 - -接入阿里云物联网平台 - -> 步骤**1**: 下载并安装 MQTT.fx 软件。 - -> 步骤**2**: 打开 MQTT.fx -> 软件,单击设置图标![](media/f926080e54c4ffe9aef2234c64143cdd.jpg)。 - -![](media/9aab3c579e9b1c974e24cb5ca8fa9cc8.jpg) - -> 图 **5**:点击设置按钮 - -> 步骤**3**: -> 设置连接参数。物联网平台目前支持两种连接模式,不同模式设置参数不同。有关参数设置, -> 详见下表。 - -> 表 **2**:连接参数设置 - -| 参数名称 | 输入信息 | -| ------------ | ---------------- | -| Profile Name | 输入自定义名称。 | -| Profile Type | MQTT Broker | - -> 表示接入域名,应输入购买的实例的接入域名。请进入阿里云物联网平台控制台实例管理页面查看实例详情中的接入域名信息。 - -公共实例的接入域名为*${YourProductKey}.iot-as-mqtt.${YourRegionId}.aliyuncs.com*。 - -> Broker Address - -- *${YourProductKey}*应替换为设备所属产品的ProductKey(可从物联网平台控制台设备详情页获取 ProductKey)。 - -- 参见地域和可用区,将*${YourRegionId}*替换为自定义的 Region ID。 - -| Broker Port | 1883 | -| ----------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Client ID | 填写 mqttClientId,用于 MQTT 的底层协议报文。格式固定:${clientId} | -| | MAC 地址或 SN 码。 *securemode* 为安全模式,TCP 直连模式设置为 *securemode=3*,TLS 直连为 *securemode=2*。 *signmethod* 为算法类型,支持 hmacmd5 和 hmacsha1。 | -| General | General 栏目下的设置项可保持系统默认,也可以根据具体需求设置。 | -| User Name | 由设备名 DeviceName、符号(&)和产品 ProductKey 组成。固定格式:${YourDeviceName}&${YourProductKey}。完整示例如:device&alxxxxxxxxx。 | -| Password | 下载 Password 生成小工具。 进入 [解](https://files.alicdn.com/tpsservice/88413c66e471bec826257781969d1bc7.zip)压缩下载包后,双击 *sign* 文件,即可使用。使用 Password 生成小工具的输入参数:  productKey:设备所属产品 Key。可在控制台设备详情页查看。 deviceName:设备名称。可在控制台设备详情页查看。 deviceSecret:设备密钥。可在控制台设备详情页查看。 timestamp:(可选)时间戳。 clientId:设备的 ID 信息,与 Client ID 中*${clientId}*一致。 method:选择签名算法类型,与 Client ID 中 *signmethod* 确定的加密方法一致 | - -> 备注 - -1. 输入 Client ID 信息后,请勿单击“**Generate**”。 - -2. TCP 直连时,Client ID 中 securemode=3,无需设置 SSL/TLS 信息。 - -3. TLS 直连时,Client ID 中 securemode=2,需要设置 SSL/TLS 信息。 - -4. 设置参数时,请确保参数值中或参数值的前后均没有空格。 - - 连接参数信息设置示例如下图所示: - -![](media/e2085274508cac96952fdfe232d0c4b4.jpg) - -> 图 **6**:配置参数 - -> 步骤**4**: -> 连接参数设置完成后,点击“**OK**”确认应用。然后点击“**Connect**”按钮连接阿里云物联网 -> 平台。 - -![](media/9a1039ed5ae22e349c21f6c8fcbe1dc9.jpg) - -> 图 **7**:设备详情页面 - -进行数据测试 - -下行数据测试 - -> 下行数据测试是指从阿里云物联网平台发送消息,在 MQTT.fx 上接收消息,测试 -> MQTT.fx 与物联网平台连接是否成功。 - -> 步骤**1**: 在 MQTT.fx 上,单击导航栏中的“**Subscribe**”。 - -> 步骤**2**: 输入一个设备具有订阅权限的自定义 -> Topic,单击“**Subscribe**”,订阅该 Topic,如下图所示。 - -![](media/20ba8885738df4172d61acebdcf0aa43.jpg) - -> 图 **8**:订阅自定义 **Topic** - -![](media/d516adcc620700e25a229ebfc3dc33fe.jpg) - -图 **9**:自定义 **Topic** - -> 步骤**3**: 订阅成功后,该 Topic 将显示在列表中,如下图所示: - -![](media/6d3f940f6bbc0f8bffc344aace5b8de9.jpg) - -> 图 **10**:订阅成功 - -> 步骤**4**: 在物联网平台控制台中的该设备的设备详情的 Topic列表页下,单击已订阅的 Topic 对应的 发布消息。输入消息内容,单击“确认”。 - -![](media/9a0a7aa791766b583716d7c2cff312d5.jpg) - -> 图 **11**:物联网平台发布消息 - -> 步骤**5**: 登录 MQTT.fx -> 软件,查看是否接收到上一步骤输入的消息,如下图所示: - -![](media/90a8a0a1f6234753ecd29e7e2132f4ce.jpg) - -> 图 **12**:客户端接收到物联网平台消息 - -上行数据测试 - -上行数据测试是指在 MQTT.fx 上发送消息,通过物联网平台查看设备日志,测试MQTT.fx 与物联网平台连接是否成功。 - -> 步骤**1**: 在 MQTT.fx 上,单击导航栏的“**Publish**”。 - -> 步骤**2**: 输入一个设备具有发布权限的 Topic和需要发送的消息内容,单击“**Publish**”,向这个 Topic推送一条消息。如下图所示。 - -![](media/6a9b5bd82fc31d7fbb8a885cc24c3543.jpg) - -> 图 **13**:向物联网平台发布数据 - -> 步骤**3**: -> 在物联网平台控制台,依次点击“监控运维”、“日志服务”、“云端运行日志”,查看该设备的云消息。 - -![](media/6b0cd9b99e274453b1fcdf0961b5217b.jpg) - -> 图 **14**:查看消息内容 - -使用 QuecPython 接入阿里云物联网平台 - -> 在 EC100Y-CN上运行以下代码,运行方法详见《Quectel_QuecPython_基础操作说明》。 - -```python - from aLiYun import aLiYun - import utime - productKey = "a1b2gBFGcLF" # 产品标识 - productSecret = None # 产品密钥(一机一密认证此参数传入 None) - DeviceName = "smartLight" # 设备名称 - DeviceSecret = "78a3407e7d43b445cd2dd895cec50ffa" # 设备密钥(一型一密认证此参数传入 None) - # 创建 aliyun 连接对象 - ali = aLiYun(productKey, productSecret, DeviceName, DeviceSecret) # 设置 mqtt 连接属性 - clientID = "12345" # 自定义字符(不超过 64) - ali.setMqtt(clientID, clean_session=False, keepAlive=300) # 回调函数 - def sub_cb(topic, msg): - print("subscribe recv:") - print(topic, msg) - # 设置回调函数 - ali.setCallback(sub_cb) - topic = "/a1b2gBFGcLF/smartLight/user/get" # 主题 - # 订阅主题 - ali.subscribe(topic) - topicP="/a1b2gBFGcLF/smartLight/user/update" # 发布消息 - ali.publish(topic, "hell world") # 运行 - ali.start() - utime.sleep(2) -``` - -> 代码运行结果如下: - -设备上行从阿里云物联网平台端查看日志,如下图所示: - -![](media/c542639b55ad51c52e8a0036d1ca25eb.jpg) - -图 **15**:查看消息内容 - -云端发布消息,设备在 *sub_cb* 回调函数中接收,如下图所示: - -![](media/e4c3f24d1835777199a0d86d71bc4dd6.jpg) - -图 **16**:发送消息 - -![](media/70658f75cc3656d9613fb7be881895ab.jpg) - -## 附录 A 参考文档及术语缩写 - -> 参考文档 - -Quectel_QuecPython_基础操作说明 QuecPython 上传下载文件说明 - -> 表 **4**:术语缩写 - -| 术语 | 英文全称 中文全称 | | -| ---- | --------------------------------------------------------------------- | ------------------------ | -| API | Application Programming Interface 应用程序编程接口 | | -| ID | Mostly refers to Identifier in terms of 软件中多数指“标识符” software | | -| ID² | Internet Device ID | 物联网设备的可信身份标识 | -| IoT | Internet of Things | 物联网 | -| MAC | Medium Access Control | 媒体访问控制 | -| MQTT | Message Queuing Telemetry Transport | 消息队列遥测传输 | -| SN | Serial Number | 序列号 | -| TCP | Transmission Control Protocol | 传输控制协议 | -| TLS | Transport Layer Security | 传输层安全(协议) | -| TSL | Thing Specification Language | 物模型 | - diff --git a/docs/sbs/zh/sbs/audio.md b/docs/sbs/zh/sbs/audio.md deleted file mode 100644 index 722bfdb9ee86ed74ad1ba6325392dd5672d7ba56..0000000000000000000000000000000000000000 --- a/docs/sbs/zh/sbs/audio.md +++ /dev/null @@ -1,221 +0,0 @@ -### Audio 使用指导 - -#### 播放音频文件 - -目前用户分区大小默认为 5 M,所以放入音频文件的大小不应该超过 5 M,同时还应预留足够的空间存 放用户的应用程序及其他文件。 本 章节主要介绍如何 上传 并播放 存放在用户 分区 根目录, 及存放在根目录 下某个 目录 中的 音频 文件。 - -**将音频文件上传至用户分区的根目录** - -步骤 **1**: 解压 SDK 压缩 包内 *tools* 目录 下的 *QPYcom.zip*, 获取 *QPYcom.exe*。 - -步骤 **2**: 使用 QPYcom.exe 将音频文件上传至模块中,具体上传方式详见《 Quectel_QuecPython_基 - -础操作说明 》。 - -步骤 **3**:上传 音频文件至用户分区的根目录。 假设 音频文件名称为 *music.mp3*,在 音频文件所在目录下 - -打开 cmd, 执行如下命令: - -```python -QuecPyComTools.exe -d COM20 -b 115200 -f cp music.mp3 :/ -``` - -- **说明** - --d 后面 的参数 COM20 应为 实际 CDC 口。 - -- **示例** - -![Quectel_QuecPython_Audio_file_play_016.png](media/Quectel_QuecPython_Audio_file_play_016.png) - -步骤 **4**: 查看用户根目录下是否有 *music.mp3* 文件。 通过 Xshell 连接 模块的 CDC 口 ,进入命令交互 - -界面,执 行 如下 命令 : - -```shell ->>> uos.listdir() -``` - -- **说明** - -```shell -“ >>>” 表示这是在模块的命令交互行 -``` - -- **示例** - -![Quectel_QuecPython_Audio_file_play_018.png](media/Quectel_QuecPython_Audio_file_play_018.png) - -步骤 **5**:播放音频文件 。通过命令交互界面依次执行如下命令,即可播放。 - -```shell ->>> import audio #导入音频播放库 - ->>> a = audio.Audio(1) #创建一个音频对象, 此处 选择耳机通道,所以参数为 1 ->>> a.play(1, 0, 'U:/music.mp3') # 设定优先级为 1,不可被打断,播放该音频文件 -``` - - - -- **说明** - -创建一个音频对象, 此处 选择耳机通道,所以参数为 1,其他参数请参 《Quectel_QuecPython_ 类库 API 说明》 相关模块说明部分 。 - -- **示例** - -![Quectel_QuecPython_Audio_file_play_020.png](media/Quectel_QuecPython_Audio_file_play_020.png) - -**备注** : 用户分区盘符目前固定为 U,播放时必须为绝对路径,比如 U:/path/filename,如果直接放到根目录下, 则为 U:/filename。 - -**将 音频文件上传至用户分区根目录 下 的audio目录** - -步骤 **1**:在 用户分区根目录下创建 *audio* 目录。 通过命令交互界面执行如下命令。 - -```shell ->>> uos.mkdir('audio') -``` - -- **示例** - -![Quectel_QuecPython_Audio_file_play_023.png](media/Quectel_QuecPython_Audio_file_play_023.png) - -步骤 **2**: 断开 Xshell 与模块 CDC 口的连接 , 否则 CDC 被 占用, 将 导致 *QPYcom.exe* 工具执 行失败 (若 使用的 是其它工具,请断开其它工具与 CDC 口的连接) - -步骤 **3**:上传 音频文件至用户分区根目录 下 的 *audio* 目录 。假设 音频文件名称为 *music.mp3*,在 音频文 - -件所在目录下打开 cmd, 执行如下 命令: - -```shell -QuecPyComTools.exe -d COM20 -b 115200 -f cp music.mp3 :/audio/ -``` - -- **说明** - -最后一个‘ **/**’不能缺失 。 - -- **示例** - -![Quectel_QuecPython_Audio_file_play_025.png](media/Quectel_QuecPython_Audio_file_play_025.png) - -步骤 **4**: 查看用户根目录 的 *audio* 目录 下是否有 *music.mp3* 文件。通过 Xshell 重新连接 模块的 CDC - -口 ,进入命令交互界面 , 执行如下命令: - -```shell ->>> uos.listdir() ->>> uos.listdir('audio') -``` - -- **示例** - -![Quectel_QuecPython_Audio_file_play_027.png](media/Quectel_QuecPython_Audio_file_play_027.png) - -步骤 **5**:播放音频文件 。 通过命令交互界面依次执行如下命令,即可播放。 - -```shell ->>> import audio #导入音频播放库 ->>> a = audio.Audio(1) #创建一个音频对象, 此处 选择耳机通道,所以参数为 1 ->>> a.play(1, 0, ‘U:/audio/music.mp3’) #设定优先级为 1,不可被打断,播放该音频文件 -``` - -- **说明** - -创建一个音频对象,此处 选择耳机通道,所以参数为 1,其他参数请参 《Quectel_QuecPython_ 类库 API 说明》相关模块说明部分 。 - -![Quectel_QuecPython_Audio_file_play_029.png](media/Quectel_QuecPython_Audio_file_play_029.png) - -#### 删除音频文件 - -本章节主要介绍如何删除 存放在用户分区根目录 ,及存放在根目录下某个目录中的音频文件。 - -**删除用户分区的根目录 下 的音频文件** - -步骤 **1**:通过 Xshell 或 其他同类工具连接到模块 CDC 口 。 - -步骤 **2**:删除 音频文件。 进入 命令交互界面后,执行如下命令 : - -```shell ->>> uos.remove('music.mp3') #删除音频文件 ->>> uos.listdir() #查看删除结果,确认文件是否删除成功 -``` - -- **示例** - -![Quectel_QuecPython_Audio_file_play_031.png](media/Quectel_QuecPython_Audio_file_play_031.png) - -​ 此时用户分区根目录下的音频 文件 已被删除。 - -**删除用户分区根目录 下的某个 目录下的音频文件** - -步骤 **1**:通过 Xshell 或 其他同类工具连接到模块 CDC 口 。 - -步骤 **2**:删除 音频文件。 进入 命令交互界面后,执行如下命令 : - -```shell ->>> uos.remove('audio/music.mp3') #删除音频文件 ->>> uos.listdir('audio') #查看删除结果,确认文件是否删除成功 -``` - - - -#### 批量打包音频文件至用户分区 - -实际应用 中,用户可能 提前将音频文件打包到用户分区中,然后利用工具将其打包到固件 并 对设备进行 升级 。本章节介绍如何利用打包工具将音频文件打包至 用户分区中 。 - -步骤 **1**: 从 QuecPython 官网 http://qpy.quectel.com/down.html 下载 SDK 包 。 - -![Quectel_QuecPython_Audio_file_play_033.png](media/Quectel_QuecPython_Audio_file_play_033.png) - -​ 图 **1**: 下载 **SDK** 包 - -步骤 **2**: 解压 SDK 包 , 并进入 *tools* 目录 下 , 解压 *littlefs_tools.zip*。 - -![Quectel_QuecPython_Audio_file_play_034.png](media/Quectel_QuecPython_Audio_file_play_034.png) - -​ 图 **2**: ***littlefs_tools*** 目录下的 文件 - -步骤 **3**: 将 需要打包的音频文件存放至 *littlefs_tools/mount* 目录下 , 此处 以 *music.mp3* 为例 。 - -![Quectel_QuecPython_Audio_file_play_035.png](media/Quectel_QuecPython_Audio_file_play_035.png) - -图 **3**: 上传 **music.mp3** 音频文件 至 **littlefs_tools/mount** - -**备注** : - -1. 请勿删除 mount 目录下默认的 apn 配置文件。 - -2. 目前用户分区大小默认为 5 M,所以放入音频文件的大小不应该超过 5 M,同时还应预留足够的空间 存放用户的应用程序及其他文件。 - -步骤 **4**: 返回 至 *littlefs_tools* 目录 , 即 *mklfs.exe* 所在的目录 。 在该目录 下打开 cmd, 然后输入如下命 - -令 。 - -```shell -mklfs.exe -c mount -b 4096 -r 4096 -p 4096 -s 1048576 -i customer_fs.bin -``` - -- **说明** - -1. 上述命令参数中 -s 参数后面的数字表示生成文件系统镜像的大小,单位字节,此处 生成 1M 大小的镜像,即 1024 x 1024Byte = 1048579 Bytes;如果用户分区大小有变化,不 为 1 M, 则需要根据实际情况修改该参数,以生成大小匹配的文件镜像。 -1. 默认生成的文件镜像名称就是 customer_fs.bin,暂不支持用户修改该 名称。 - -- **示例** - -![Quectel_QuecPython_Audio_file_play_038.png](media/Quectel_QuecPython_Audio_file_play_038.png) - -步骤 **5**:步骤 4 执行 成功后 ,将在 *littlefs_tools* 目录下 生成文件系统镜像文件 *customer_fs.bin*,将其打 - -` `包至固件包。 - -![Quectel_QuecPython_Audio_file_play_039.png](media/Quectel_QuecPython_Audio_file_play_039.png) - -​ 图 **4**: 打包 镜像文件 **customer_fs.bin** 至版本包 - -#### 附录术语缩写 - -表 **1**: 术语缩写 - -| 缩写 | 英文全称 | 中文全称 | -| ---- | --------------------------------- | ---------------- | -| SDK | Software Development Kit | 软件开发工具包 | -| API | Application Programming Interface | 应用程序编程接口 | \ No newline at end of file diff --git a/docs/sbs/zh/sbs/basic.md b/docs/sbs/zh/sbs/basic.md deleted file mode 100644 index e714f41464c8a7a7dcc3cf271fdfd576d9f1a269..0000000000000000000000000000000000000000 --- a/docs/sbs/zh/sbs/basic.md +++ /dev/null @@ -1,121 +0,0 @@ -### QuecPython 基础操作说明 - -本文主要介绍 QuecPython 基础操作,包括文件系统以及指令执行。在 QuecPython中,使用主串口作为指令和数据接收通道,所有操作都通过主串口完成。 - -适用模块: - -- EC100Y-CN(本文以该模块为例进行介绍) - -- EC600S-CN - -#### 系统启动 - -QuecPython 启动后,将在主串口启动交互式解释器,类似于 Linux Shell。通过该交互式解释器,用户可实时地执行命令,并查看返回的结果。 - -![](media/0f627ce2f6c2f679cd92c7685c3cf148.jpg) - -交互式解释器 - -其中: - -- 执行 **help(obj)**指令,查看帮助; - -- 执行 **dir(obj)**指令,查看模块提供的详细方法; - -- 执行**help('modules')**指令,查看当前支持的类库。系统启动时,除了进行硬件资源初始化外,还会进行分区挂载,执行初始化脚本操作。启动脚本主要包括两个: - -- *boot.py*:资源初始化等,如启动时挂载分区,该脚本被冻结在出厂固件中; - -- *main.py*:用户初始化脚本,系统初始化完成后执行。 - -#### 文件系统 - -在 QuecPython 中,划分了 5 MB -的空间作为用户分区,用户可以将一些配置、脚本等文件存储在该分区中。在系统启动时,会自动挂载该分区,该分区挂载在‘/’目录。 - -> 在 QuecPython 中,提供了对文件系统访问的类库*uos*,可用于操作和访问文件系统。 -> 以下代码示例为如何在当前目录下创建文件、写入内容及读取内容。 - -``` -import uos # create a file -f=open('test.txt','w') -f.write('hello quecpython!\n') -f.write('123456789abcdefg!\n') -f.close() # read a file -f=open('test.txt', 'r') -print(f.readline()) -print(f.readline()) -f.close() -``` - - - -> 为方便操作,可使用 *QPYcom.exe* 工具进行常规的文件系统操作。 - -脚本下载 - -步骤 **1**:解压 SDK 压缩包内 *tools* 目录下的 *QPYcom.zip*,获取*QPYcom.exe*,并双击运行; - -步骤**2**:进入“下载”Tab,点击“创建”按钮,根据需求创建用户项目; - -步骤**3**:点击“**+**”按钮,选择需要下载到模块的脚本; - -步骤 **4**:点击界面右下方倒三角按钮,切换到“下载脚本”模式; - -步骤**5**:点击“**Download FW**”按钮,下载脚本; - -步骤 **6**:进度条显示为“**100%**”时,表示下载完成,可进入“文件”Tab查看模块内文件详情。 - -![](media/5515ac10e5070dd1b9bfd61c7a7022cf.jpg) - -> **2**:脚本下载界面 - -查看文件 - -运行 *QPYcom.exe* 工具,点击“查看”-->“文件浏览”,可实现本地与模块进行 Python -文件的上传、查看、添加、删除操作,操作界面及按钮如下图所示。 - -![](media/277228479c7256251a776b75160dfcec.jpg) - -本地与模块进行 **Python** 文件的上传、查看、添加、删除操作 - -命令交互 - -运行 *QPYcom.exe*工具,点击“查看”-->“交互命令行”,进入交互主界面。在交互界面可以通过交互窗口与模块进行手动输入交互,交互主界面说明如图所示。 - -![](media/c240cbfd8fcee183b8644a9a41320d34.jpg) - -交互界面说明 - -> **4** 执行脚本 - -> 步骤 **1**:解压 SDK 压缩包内 *tools* 目录下的 *QPYcom.zip*,获取*QPYcom.exe*,并双击运行; -> 步骤 **2**:进入“文件”Tab; -> 步骤 **3**:点击下图红框所示按钮,执行脚本文件。 - -![](media/8431414d399d975a4c26434403a514bd.jpg) - -执行脚本界面 - -#### 字节码编译 - -为了提高代码执行速度以及客户代码安全,移远通信提供了 mpy-cross 工具将用户 Python脚本编译为字节码。字节码可固化在固件中,也可以存放在文件系统中供脚本使用。详情请参考 - -> 《Quectel_QuecPython_mpy-cross 用户指导》 - -> Python 脚本编译为字节码的命令为: - -> mpy-cross.exe -o test.mpy -s test.py -march=armv7m test.py - -#### 附录 **A** 术语缩写 - -表 **1**:术语缩写 - -| 缩写 | 英文全称 | 中文全称 | -| ---- | ------------------------------------------- | ------------------ | -| UART | Universal Asynchronous Receiver/Transmitter | 通用异步收发传输器 | - - - - - diff --git a/docs/sbs/zh/sbs/bus.md b/docs/sbs/zh/sbs/bus.md deleted file mode 100644 index e6a15656cf4d6eda8130478aba6c4cb3cd006200..0000000000000000000000000000000000000000 --- a/docs/sbs/zh/sbs/bus.md +++ /dev/null @@ -1,121 +0,0 @@ -### 总线 使用指导 - -#### ADC 数模 转换 - -​ 数字信号和模拟信号转换器 ADC,称为数模转换器, CPU 本身是数字的,但是外 部的一些变量是模拟 的,所以需要利用数字技术处理外部模拟的物理量。 模拟信号,是一个连续的信号,现实生活中的时间,电 压,高度等就是模拟信号,反应在数学里就是无限细分的值。 - -​ 数模转换就是把模拟信号按照一定精度进行采样,变成有限多个数字量,这个过程就是数模转换,数字 化之后就可以在计算机中用数字来描述模拟量,是计算机技术的基础,计算机所有参与运算的都是数字量, 如果参与计算的有模拟量,就需要使用数模转换器将模拟量转换为数字量来参与运算,同样,也 可以通过使 用有积分和微分效果的器件来将数字信号转换为模拟信号。 - -QuecPython 开发板中ADC输入引脚如下图所示 。 - -![Quectel_QuecPython_bus_Guidance_for_use_015.png](media/Quectel_QuecPython_bus_Guidance_for_use_015.png) - -​ 图 **1**: **ADC** 输入 引脚 - -将 GPIO1 串口和 ADC 串口连接 , 在 QuecPython 中通过 *misc* 模块 ADC 类读取通道电压值 ,通过 *machine* 模块 *Pin* 类中 *Pin.write(value)*方法设置 PIN 脚电平,详细使用方法和 API 接口说明见 《Quectel_QuecPython_类库 API 说明 》。 - -```python -from machine import Pin -from misc import ADC -adc = ADC -adc.open() - -gpio1 = Pin(Pin.GPIO1, Pin.OUT, Pin.PULL_DISABLE, 0) -gpio1.read()# 获取 gpio 的当前高低状态 -gpio1.write(1) # 设置 gpio1 输出高 -adc.read(ADC.ADC0) -gpio1.write(0) # 设置 gpio1 输出 低 -adc.read(ADC.ADC0) -``` - -命令行运行结果可见 ADC通道电压变为 1.8 V,如 图所示: - -![Quectel_QuecPython_bus_Guidance_for_use_019.png](media/Quectel_QuecPython_bus_Guidance_for_use_019.png) - -​ 图 **2**: **ADC** 通道 电压变化 - -#### UART - -​ UART 是一种串行异步收发协议,应用十分广泛。 UART 工作原理是将数据的二进制位一位一位的进行 - -传输。在 UART 通讯协议中信号线上的状态位高电平代表 *1*,低电平代表 *0*。当然两个设备使用 UART 串 口通讯时,必须先约定好传输速率和一些数据位。 - -硬件连接比较简单,仅需要 3 条线,注意连接时若两个设备UART电平范围不一致请做电平转换后再 连接 。 - -- TX:发送数据端,要接对面设备的 RX, -- RX:接收数据端,要接对面设备的 TX, -- GND:保证两设备共地,有统一的参考平面 。 - -![Quectel_QuecPython_bus_Guidance_for_use_020.png](media/Quectel_QuecPython_bus_Guidance_for_use_020.png) - -​ 图 **3**: **UART** 硬件连接 - -在 EC100Y-CN 模块 上使用 UART 串口传输 数据时,需将发送数据端 TX 与 对面的 RX 相连 ,将接受数 据端 RX 与 对面的 TX 相连 ,在 QuecPython 中 通过 machine 模块 UART 类 可以实现串口数据传输功能 , 详细使用方法和 API 接口说明见 《Quectel_QuecPython_类库 API 说明 》。 - -![Quectel_QuecPython_bus_Guidance_for_use_021.png](media/Quectel_QuecPython_bus_Guidance_for_use_021.png) - -​ 图 **4**: **UART API** 示例代码 - -#### SPI通信 - -SPI 协议是串行外围设备接口,是一种高速全双工的通信总线 。SPI 总线包含 4 条总线,分别为 SS、 SCK、MOSI、MISO。 - -(1)SS:片选信号线,当有多个 SPI 设备与 MCU 相连时,每个设备的这个片选信号线是与 MCU 单 独的引脚相连的,而其他的 SCK、MOSI、MISO 线则为多个设备并联到相同的 SPI 总线上,低电平有效。 - -(2)SCK:时钟信号线,由主通信设备产生。 不同的设备支持的时钟频率不一样,如 STM32 的 SPI 时钟频率最大为 f PCLK / 2。 - -(3)MOSI:主设备输出 / 从设备输入引脚。主机的数据从这条信号线输出,从机由这条信号线读入 数据,即这条线上数据的方向为主机到从机。 - -(4)MISO:主设备输入 / 从设备输出引脚。主机从这条信号线读入数据,从机的数据则由这条信号 线输出,即在这条线上数据的方向为从机到主机。 - -![Quectel_QuecPython_bus_Guidance_for_use_022.png](media/Quectel_QuecPython_bus_Guidance_for_use_022.png) - - - -​ 图 **5**: **SPI** 硬件连接 - -#### I2C通信 - -I2C 接口只有两根线, SCL 和 SDA: - -- SCL: 传输时钟信号,由主设备向从设备传输时钟信号。 - -- SDA: 传输数据信号,主从设备之间相互传递数据的通道 。 - -I2C 属于串行通信,数据以 bit 为单位在 SDA 线上串行依次传输,同步工作状态,主从设备工作在同一 个时钟频率下,通过 SCL 线同步时钟, I2C 传输电平信号,不需要很高的速度,通信双方距离很近,所以 不需要差分信号来抗干扰, I2C 通常用在同一块板子上的两个 IC 之间的通信,数据量不大且速度较低。 - -![Quectel_QuecPython_bus_Guidance_for_use_025.png](media/Quectel_QuecPython_bus_Guidance_for_use_025.png) - -​ 图 **6**: **I2C** 硬件连接 - -以下数据以 I2C 连接 光照传感器为例 。 - -![Quectel_QuecPython_bus_Guidance_for_use_026.png](media/Quectel_QuecPython_bus_Guidance_for_use_026.png) - -![Quectel_QuecPython_bus_Guidance_for_use_027.png](media/Quectel_QuecPython_bus_Guidance_for_use_027.png) - -​ 图 **7**: **I2C** 连接 光照传感器 - -#### 附录 术语缩写 - -表 **1**: 术语缩写 - -| ADC | Analog-to-Digital Converter | 模数转换器 | -| ---- | ------------------------------------------- | ---------------------- | -| API | Application Programming Interface | 应用程序编程接口 | -| CPU | Central Processing Unit | 中央处理器 | -| UART | Universal Asynchronous Receiver/Transmitter | 通用异步收发传输器 | -| GND | Ground | 地 | -| IC | Integrated Circuit | 集成电路 | -| I2C | Inter-Integrated Circuit | 双向二线制同步串行总线 | -| LCD | Liquid Crystal Display | 液晶显示屏 | -| MCU | Microprogrammed Control Unit | 微程序控制器 | -| MISO | Master In Slave Out | 主机输入从机输出 | -| MOSI | Master Out Slave In | 主机输出从机输入 | -| RX | Receive | 接收 | -| TX | Transmit | 发送 | -| SCK | Serial Clock | 时钟信号线 | -| SCL | Serial Clock Line | 串行 时钟线 | -| SDA | Serial Data Line | 串行 数据线 | -| SPI | Serial Peripheral Interface | 串行外设接口 | -| SS | Slave Select | 片选信号线 | \ No newline at end of file diff --git a/docs/sbs/zh/sbs/file.md b/docs/sbs/zh/sbs/file.md deleted file mode 100644 index 94efb0133e6d0201b129fd40eb539611b9911d9f..0000000000000000000000000000000000000000 --- a/docs/sbs/zh/sbs/file.md +++ /dev/null @@ -1,157 +0,0 @@ -### 文件读写 使用说明 - -#### 文件基本概念 - -文件将数据保存并存储在某种长期存储设备上,存储设备主要包括硬盘 、U 盘 、移动硬盘、光盘等。 - -**文件存储方式** - -文件主要以二进制及文本的方式进行储存。 - -1. 文本文件 , 例如 Python 的 源程序 : - -- 可以使用文本编辑软件查看 ; - -- 本质上还是二进制文件 。 - -2. 二进制文件 ,例如图片文件、音频文件、视频文件: - -- 保存的内容无法直接阅读 ,而是提供给其他软件使用的 ; -- 二进制文件不能使用文本编辑软件查看 。 - -**文件的基本操作** - -文件操作类型 - -- 打开文件 -- 读、写文件 - - 读 : 将文件内容读入内存 - - 写 : 将内存内容写入文件 -- 关闭文件 - -文件访问方式 - -表 **1**: 文件访问方式 - -| 访问方式 | 说明 | -| -------- | ------------------------------------------------------------ | -| r | 以只读方式打开文件。文件的指针将会放在文件的开头,为默认模式。如果文件不存在,抛出异常 。 | -| w | 以只写方式打开文件。如果文件存在会被覆盖;如果文件不存在,创建新文件。 | -| a | 以读写方式打开文件。如果该文件已存在,文件指针将会放在文件的结尾。如果文件不存在,创建新文件进行写入。 | - -**备注** :若频繁移动文件指针,会影响文件的读写效率。通常,在开发过程中会以只读、只写的方式来操作文件。 - -**文件操作函数** - -表 **2**: 文件操作函数 - -| 函数 | 说明 | 方法 | -| ----- | ------------------------------ | ------------------------------ | -| Open | 打开文件,并且返回文件操作对象 | 负责打开文件,并且返回文件对象 | -| Read | 将文件内容读取到内存 | 需要通过文件对象来调用 | -| Write | 将指定内容写入文件 | 需要通过文件对象来调用 | -| Close | 关闭文件 | 需要通过文件对象来调用 | - - - -#### 操作文件及目录 - -将 EC100Y-CN QuecPython 开发板 连接至电脑,接入后的操作方法详见《 Quectel_QuecPython_基础 操作说明 》。 - -![Quectel_QuecPython_file_rw_029.png](media/Quectel_QuecPython_file_rw_029.png) - -​ 图 **1**: **EC100Y-CN QuecPython** 开发板与电脑连接 - -**以只读方式打开文件** - -步骤一 : 创建 *test.py*、*test.txt* 文件, 并 在 *test.py* 文件中导入 QuecPython 中的 *uio* 模块,在 *test.txt* 文件输入 "hello python"。 - -- 在 t*est.py* 文件中导入 QuecPython 中的 *uio* 模块 : - -```python -import uio - -# 以只读方式打开 test.txt 文件 -fd = uio.open("test.txt", mode='r') - -# 读取文件内容 -text = fd.read() -print(text) - -# 关闭文件 -fd.close() -``` - -- 在 *test.txt* 文件输入 "hello python": - -![Quectel_QuecPython_file_rw_032.png](media/Quectel_QuecPython_file_rw_032.png) - -​ 图 **2**: 在 **test.txt** 文件输入 **"hello python"** - -步骤 二 : 将 *test.py* 文件和 *test.txt* 文件分别上传到 EC100Y-CN QuecPython 开发板内,上传方法详见《Quectel_QuecPython_基础操作说明》 。 - -步骤 三 : 读取文件 运行结果 - -![Quectel_QuecPython_file_rw_033.png](media/Quectel_QuecPython_file_rw_033.png) - -​ 图 **3**: 读取 文件运行结果 - -**以只写方式打开文件** - -步骤一 : 创建 *test.py* 文件及 内容 为空白的 *test.txt* 文件,在 *test.py* 文件中导入 QuecPython 中的 uio 模 - -块, 并 编写如下代码 : - -```python -import uio - -# 以只写方式打开 test.txt 文件 -fd = uio.open("test.txt", mode=‘w') - -# 向文件写内容 -fd.write("HELLO PYTHON") - -# 关闭文件 -fd.close() -``` - -步骤 二 : 将 *test.py* 文件和 *test.txt* 文件分别上传到 EC100Y-CN QuecPython 开发板内,上传方法详见《Quectel_QuecPython_基础操作说明》。 - -步骤 三 : 写入文件运行结果 - -![Quectel_QuecPython_file_rw_035.png](media/Quectel_QuecPython_file_rw_035.png) - -​ 图 **4**: 写入 文件运行结果 - -**使用 uos 模块** - -1. 列出当前文件列表 - -![Quectel_QuecPython_file_rw_036.png](media/Quectel_QuecPython_file_rw_036.png) - -​ 图 **5**: 列出 当前文件列表 - -2. 新建目录 - -![Quectel_QuecPython_file_rw_037.png](media/Quectel_QuecPython_file_rw_037.png) - -​ 图 **6**: 新建目录 - -3. 删除目录 - -![Quectel_QuecPython_file_rw_038.png](media/Quectel_QuecPython_file_rw_038.png) - -​ 图 **7**: 删除目录 - -**备注**: apn_cfg.json 为默认脚本文件。 - - - -#### 附录术语缩写 - -表 **3**: 术语缩写 - -| 缩写 | 英文全称 | 中文全称 | -| ---- | --------------------------------- | ---------------- | -| SDK | Software Development Kit | 软件开发工具包 | -| API | Application Programming Interface | 应用程序编程接口 | \ No newline at end of file diff --git a/docs/sbs/zh/sbs/gps.md b/docs/sbs/zh/sbs/gps.md deleted file mode 100644 index e82d7a25a6d5886a76de757023acc5d156cbd7c6..0000000000000000000000000000000000000000 --- a/docs/sbs/zh/sbs/gps.md +++ /dev/null @@ -1,145 +0,0 @@ -### GPS 使用指导 - -#### GPS概述 - -利用GPS定位卫星,在全球范围内实时进行[定位](https://baike.baidu.com/item/%E5%AE%9A%E4%BD%8D)、[导航](https://baike.baidu.com/item/%E5%AF%BC%E8%88%AA)的系统,称为全球卫星定位系统,简称GPS。NEMA-0183,是[GPS接收机](https://baike.baidu.com/item/GPS%E6%8E%A5%E6%94%B6%E6%9C%BA/3475821)应当遵守的标准协议,也是目前[GPS](https://baike.baidu.com/item/GPS/214654)接收机上使用最广泛的协议,大多数常见的GPS接收机、GPS数据处理软件、[导航软件](https://baike.baidu.com/item/%E5%AF%BC%E8%88%AA%E8%BD%AF%E4%BB%B6/1401586)都遵守或者至少兼容这个协议。GPS现已被广泛应用于[交通](https://baike.baidu.com/item/%E4%BA%A4%E9%80%9A/30183)、[测绘](https://baike.baidu.com/item/%E6%B5%8B%E7%BB%98/2271120)等许多行业。GPS的所有应用领域,都是基于定位、或从定位延伸出去的,主要包括:运动导航,轨迹记录、大地测量、周边信息查询等。 - -#### GPS模块使用流程 - -**准备工作** - -**步骤1:**首先准备EC100Y-CN开发板和L80-R GPS模块,将L80-R GPS模块与开发板相连。注意使用时应处于室外环境以便于接收GPS信号。如下图所示: - - -![](media/1.png) - -L80-R GPS模块功能如下图所示: - - -![](media/2.png) - -**步骤2:**通过xshell工具连接开发板,进入交互页面,由上文模块功能图可知*GPS_EN*引脚对应的开发板上的串口为GPIO5,故通过GPIO5启动GPS功能。 - -​ 执行代码如下: - -![](media/3.png) - -**步骤3:**执行完以上代码后,即可看到模块的GPS指示灯常亮,同理也可以通过设置GPIO1的电压来点亮LED灯。 - -#### 数据处理 - -**步骤1:**启用模块的GPS功能后,GPS数据会通过模块的GPS_TXD串口发送到开发板中,接下来通过EC100Y-CN QuecPython的machine模块UART串口的数据传输 功能将数据输出,代码如下图所示: - -![](media/4.png) - -machine模块的详细API接口说明请参考文档《Quectel QuecPython类库API说明》。 - - - -**步骤2:**然后,对接收的NMEA-0183协议定义的数据格式进行处理,这里需要处理的语句是$GNGGA。 - -​ 例如: $GNGGA,092204.999,4250.5589,S,14718.5084,E,1,04,24.4,19.7,M,,,,0000*1F - -字段0:$GPGGA,语句ID,表明该语句为Global Positioning System Fix Data(GPS定位信息) - -字段1:UTC时间,hhmmss.sss,时分秒格式 - -字段2:纬度,ddmm.mmmm,度分格式(前导位数不足则补0) - -字段3:纬度N(北纬)或S(南纬) - -字段4:经度,dddmm.mmmm,度分格式(前导位数不足则补0) - -字段5:经度E(东经)或W(西经) - -字段6:GPS状态,0=未定位,1=非差分定位,2=差分定位,3=无效PPS,6=正在估算 - -字段7:正在使用的卫星数量(00~12)(前导位数不足则补0) - -字段8:HDOP水平精度因子(0.5~99.9) - -字段9:海拔高度(-9999.9~99999.9) - -字段10:地球椭球面相对大地水准面的高度 - -字段11:差分时间(从最近一次接收到差分信号开始的秒数,如果不是差分定位将为空) - -字段12:差分站ID号(0000~1023)(前导位数不足则补0,如果不是差分定位将为空) - -字段13:校验值 - - - -**步骤3:**最后,运行以下代码获取GPS信息中的时间和经纬度,通过不断获取时间和经纬度可以实时追踪位置。 - -​ 详细运行方法请参考文档《Quectel_QuecPython_基础操作说明》。 - - - -```python -from machine import UART -import utime -import modem -import _thread -uart = UART(2,115200,8,0,1,0) -def gngga(): -while True: -#获取当前RTC时间 -time = utime.localtime( ) -#获取设备IMET -imei = modem.getDevImei( ) -if uart.any() > 0: -buf = uart.read(uart.any()) -buf = str(buf,"utf8" ) -try : -gngga1 = buf.split("$GNGGA,")[1].split("\r\n" )[0].split(",") -# UTC时间,hhmmss.sss,时分秒格式 -time_gps = gngga1[0] -#纬度ddmm.mmmm,度分格式前导位数不足则补0 -_latitude = float(gngga1[1]) -#经度dddmm.mmmm,度分格式前导位数不足则补0 -_longitude = float(gngga1[3]) -# UTC时间转化 -_Clock = int(time[0:2]) -_Minute = time[2:4] -_Second = time[4:6] -_Clock =_Clock + 8 -#防止超过24小时 -if (_Clock >= 24): -_Clock = _Clock % 24 -#最终获得时间 -Effect_time = str(_clock) + ':' +_Minute + ':' +_Second -#最终获得纬度 -Effect_latitude = int(_latitude / 100)+ ((_latitude % 100) / 60) -#最终获得经度 -Effect_longitude = int(_longitude / 100) +((_longitude % 100)/ 60) -print( '当前时间:',time) -print( 'GPS时间:',Effect_time) -print('设备IMET',imei) -print(gngga1[2],'',str(Effect_latitude )) -print(gngga1[4],'',str(Effect_longitude )) - -utime.sleep(2) -except: -print('数据格式有误或数据受损') -continue -def run(): -_thread.start_new_thread(gngga, ()) - -run() -``` - - - -#### 附录 - -表1:术语缩写 - -| **缩写** | **英文全称** | **中文全称** | -| -------- | ---------------------------------- | -------------------- | -| API | Application Programming Interface | 应用程序编程接口 | -| GPS | Global Positioning System | 全球定位系统 | -| GPIO | General-Purpose Input/Output | 通用型输入/输出 | -| GGA | Global Positioning System Fix Data | 全球定位系统定位数据 | -| HDOP | Horizontal Dilution of Precision | 水平精度因子 | -| LED | Light Emitting Diode | 发光二极管 | \ No newline at end of file diff --git a/docs/sbs/zh/sbs/http.md b/docs/sbs/zh/sbs/http.md deleted file mode 100644 index 5e7be89307a6a7443ca07cf6584ed674b5bb3025..0000000000000000000000000000000000000000 --- a/docs/sbs/zh/sbs/http.md +++ /dev/null @@ -1,411 +0,0 @@ -### HTTP应用 开发指导 - -#### **HTTP协议基础** - -**HTTP协议** - -HTTP协议是用于从万维网服务器传输超文本到本地浏览器的传送协议。基于TCP的应用层协议,它不关心数据传输的细节,HTTP(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,只有遵循统一的HTTP请求格式,服务器才能正确解析不同客户端发的请求,同样地,服务器遵循统一的响应格式,客户端才得以正确解析不同网站发过来的响应。 - -![Client与Server通信](media/de988b13c542b7f454d13cc183693d82.png) - -#### HTTP请求 - -HTTP请求由请求行、请求头、空行、请求体组成。 - -![HTTP请求构成](media/30dd898d830b27416fd3b691ae64e3dd.png) - -**请求行** - -请求行由请求方式 + address+ 协议版本组成。 - -- 常见的请求方法有GET、POST、PUT、DELETE、HEAD; - -- address:客户端要获取的资源路径; - -- 协议版本:客户端使用的HTTP协议版本号(目前使用的是http1.1)。 - -**请求头** - -请求头是客户端向服务器发送请求的补充说明。 - -- host:请求地址; - -- User-Agent:客户端使用的操作系统和浏览器的名称和版本; - -- Content-Length:发送给HTTP服务器数据的长度; - -- Content-Type:参数的数据类型; - -- Cookie:将cookie的值发送给HTTP 服务器; - -- Accept-Charset:浏览器可接受的字符集; - -- Accept-Language:浏览器可接受的语言; - -- Accept:浏览器可接受的媒体类型。 - -**请求体** - -请求体携带请求参数。 - -- application/json:{"name":"value","name1":"value2”}; - -- application/x-www-form-addressencoded: name1=value1&name2=value2; - -- multipart/from-data:表格形式; - -- text/xml; - -- content-type:octets/stream。 - -#### HTTP响应 - -HTTP响应由状态行、响应头、空行、响应体组成。 - -![HTTP响应构成](media/800f014c0ddfdeeef025fd803aa23697.png) - -**状态行** - -状态行由HTTP 版本号 + 响应状态码 + 状态说明组成。 - -响应状态码有1XX、2XX、3XX、4XX、5XX。 - -- 1XX:提示信息 - 表示请求已被成功接收,继续处理; - -- 2XX:成功 - 表示请求已被成功接收,理解,接受; - -- 3XX:重定向 - 要完成请求必须进行更进一步的处理; - -- 4XX:客户端错误 - 请求有语法错误或请求无法实现; - -- 5XX:服务器端错误 - 服务器未能实现合法的请求响应头。 - -**响应头** - -响应头与请求头对应,是服务器对该响应的一些附加说明。 - -**响应体** - -为真正的响应数据,即为网页的HTML源代码。 - -#### address - -address是WWW的统一资源定位标志,就是指网络地址。 - -address格式:https://host:port/path?xxx=aaa&ooo=bbb - -其中: - -- http/https:这个是协议类型 - -- host:服务器的IP地址或者域名 - -- port:HTTP服务器的端口,默认端口是80 - -- path:访问资源的路径 - -- address里面的?这个符号是个分割线,用来区分问号前面的是path,问号后面的是参数 - -- address-params:问号后面的是请求参数,格式:xxx=aaa。多个参数用&符号连接 - -#### HTTP协议请求方法 - -HTTP1.0定义了三种请求方法:GET、POST和HEAD方法。HTTP1.1新增了五种请求方法:OPTIONS、PUT、DELETE、TRACE和CONNECT方法。 - -- GET:请求指定的页面信息,并返回实体主体。 - -- POST:向指定资源提交数据进行处理请求,数据被包含在请求体中。 - -- HEAD:返回的响应中没有具体的内容,用于获取报头。 - -- OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’ - 的请求来测试服务器的功能性 - -- PUT:向指定资源位置上传其最新内容 - -- DELETE:请求服务器删除Request-address所标识的资源 - -- TRACE:回显服务器收到的请求,主要用于测试或诊断 - -- CONNECT:*HTTP1.1*协议中预留给能够将连接改为管道方式的代理服务器。 - -#### HTTP接口 - -**request.get** - -该函数用于发送GET请求。 - -- **函数原型** - -request.get(address, data, json, headers) - -- **参数** - -*address*:网址,字符串类型。 - -*data*:(可选参数)附加到请求的正文,json字典类型,默认为None。 - -*json*:(可选参数)json格式用于附加到请求的主体,默认为None。 - -*headers*:(可选参数)请求头,默认为None。 - -- **返回值** - -返回请求对象 - -**request.post** - -该函数用于发送POST请求。 - -- **函数原型** - -request.post(address, data, json, headers) - -- **参数** - -*address*:网址,字符串类型。 - -*data*:(可选参数)附加到请求的正文,json字典类型,默认为None。 - -*json*:(可选参数)json格式用于附加到请求的主体,默认为None。 - -*headers*:(可选参数)请求头,默认为None。 - -- **返回值** - -返回请求对象 - -**request.put** - -该函数用于发送PUT请求。 - -- **函数原型** - -request.put(address, data, json, headers) - -- **参数** - -*address*:网址,字符串类型。 - -*data*:(可选参数)附加到请求的正文,json字典类型,默认为None。 - -*json*:(可选参数)json格式用于附加到请求的主体,默认为None。 - -*headers*:(可选参数)请求头,默认为None。 - -- **返回值** - -返回请求对象 - -**request.head** - -该函数用于发送HEAD请求。 - -- **函数原型** - -request.head(address, data, json, headers) - -- **参数** - -*address*:网址,字符串类型。 - -*data*:(可选参数)附加到请求的正文,json字典类型,默认为None。 - -*json*:(可选参数)json格式用于附加到请求的主体,默认为None。 - -*headers*:(可选参数)请求头,默认为None。 - -- **返回值** - -返回请求对象 - -**request.patch** - -该函数用于发送PATCH请求。 - -- **函数原型** - -request.patch(address, data, json, headers) - -- **参数** - -*address*:网址,字符串类型。 - -*data*:(可选参数)附加到请求的正文,json字典类型,默认为None。 - -*json*:(可选参数)json格式用于附加到请求的主体,默认为None。 - -*headers*:(可选参数)请求头,默认为None。 - -- **返回值** - -返回请求对象 - -**request.delete** - -该函数用于发送DELETE请求。 - -- **函数原型** - -request.delete(address, data, json, headers) - -- **参数** - -*address*:网址,字符串类型。 - -*data*:(可选参数)附加到请求的正文,json字典类型,默认为None。 - -*json*:(可选参数)json格式用于附加到请求的主体,默认为None。 - -*headers*:(可选参数)请求头,默认为None。 - -- **返回值** - -返回请求对象 - -**reponse类方法说明** - -response =request.get(address) - -| **方法** | **说明** | -| ---------------- | --------------------------------------- | -| response.content | 返回响应的内容,以字节为单位 | -| response.text | 以文本方式返回响应的内容,编码为unicode | -| response.json() | 返回响应的json编码内容并转为dict类型 | -| response.close() | 关闭socket | - -#### 示例 - -将QuecPython开发板连接至电脑,接入后的操作方法详见《Quectel_QuecPython_基础操作说明》。 - -开发板连接至电脑后,创建*test.py*文件,导入QuecPython的*request*模块,分别创建HTTP GET/PUT/POST/DELETE等请求代码,编写完成后,将文件上传到开发板内并运行*test.py*文件,方法详见《Quectel_QuecPython_基础操作说明》。示例代码及运行结果详见如下章节。 - -![开发板与电脑连接](media/6bb2bca69cee76f3586799191dd2cc87.jpeg) - -**请求POST** - -- **示例代码** - -import request - -import ujson - -address = "http://httpbin.org/post" - -data = {"key1": "value1", "key2": "value2", "key3": "value3"} - -**POST请求** - -response = request.post(address, data=ujson.dumps(data)) - -print(response.text) - - -- **代码运行结果** - -![](media/ca55e37f24bee44fa77138e1083be1d1.png) - -**请求GET** - -- **示例代码** - -import request - -address = "http://httpbin.org/get" - -**GET请求** - -response = request.get(address) - -print(response.text) - - -- **代码运行结果** - -![](media/ac0ebee2450a2170f52aeeb36f06ef03.png) - -**请求PUT** - -- **示例代码** - -import request - -address = "http://httpbin.org/put" - -**PUT请求** - -response = request.put(address) - -print(response.text) - - -![](media/2f3227680733adae0aa17b3b6518adb9.png) - -**请求**PATCH - -- **示例代码** - -import request - -address = "http://httpbin.org/patch" - -**PATCH请求** - -response = request.patch(address) - -print(response.text) - -- **代码运行结果** - -![](media/480312d532ba119833ca7a16b897e409.png) - -**请求DELETE** - -- **示例代码** - -import request - -address = "http://httpbin.org/delete" - -**DELETE请求** - -response = request.delete(address) - -print(response.text) - - -- **代码运行结果** - -![](media/e3245758512d024f27619fd8e359d53c.png) - -**请求HTTP连接** - -- **示例代码** - -import request - -address = "https://myssl.com" - -**HTTPS请求** - -response = request.get(address) - -print(response.text) - - -- **代码运行结果** - -![](media/fbea842752b5a5006c5a5cdac1632304.png) - -#### 附录A术语缩写 - -表1:术语缩写 - -| **缩写** | **英文全称** | **中文全称** | -| -------- | --------------------------------- | ---------------- | -| API | Application Programming Interface | 应用程序编程接口 | -| HTTP | Hyper Text Transfer Protocol | 超文本传输协议 | -| SDK | Software Development Kit | 软件开发工具包 | -| TCP | Transmission Control Protocol | 传输控制协议 | -| address | Uniform Resource Locator, | 统一资源定位符 | -| WWW | World Wide Web | 万维网 | \ No newline at end of file diff --git a/docs/sbs/zh/sbs/led.md b/docs/sbs/zh/sbs/led.md deleted file mode 100644 index 22ea4a162cd0c355727bddc1c82f5c64befdff7d..0000000000000000000000000000000000000000 --- a/docs/sbs/zh/sbs/led.md +++ /dev/null @@ -1,107 +0,0 @@ -### LED 使用指导 - -#### 基本概述 - -在使用LED功能之前,需要先了解开发板的GPIO串口,GPIO即通用I/O端口。GPIO即开发板的引脚输出输入功能。输出功能,即控制引脚变高和变低;输入功能,即检测引脚上的电平是高电平还是低电平。当需要控制引脚为高电平或低电平时,即使用GPIO的输出功能使用。例如,控制LED灯的亮灭时,需要通过控制输出的高低电平来实现LED灯的亮灭。 - -以EC100Y-CN模块为例,如图所示为GPIO串口: - -![](media/sbs_led_picture_0.jpg) - -​ 图 1 :GPIO串口 - - -#### LED功能实现 - -​ 在开发板中实现LED功能需要用到QuecPython中的Pin类功能,以EC100Y-CN模块为例,将模块 -的LED控制线与开发板的GPIO1串口相连,再将模块V3.3串口与开发板的V3.3串口相连,为模块供电。连接完成后给开发板上电。 - -步骤 1 : 首先导入machine模块,创建GPIO对象。代码示例如下: - -``` -from machine import Pin -gpio1 = Pin(GPIO1, Pin.OUT, Pin.PULL_DISABLE, 0) -``` - - - -GPIOn 整型。引脚号。 - 引脚对应关系如下: - GPIO 1 – 引脚号 22 - GPIO2–引脚号 23 - GPIO3–引脚号 178 - GPIO4–引脚号 199 - GPIO5–引脚号 204 - -direction 整型。 - IN 输入模式 - OUT 输出模式 - -pullMode 整型。 - PULL_DISABLE 浮空模式 - PULL_PU 上拉模式 - PULL_PD 下拉模式 - -level 整型。 引脚电平。 - 0 设置引脚为低电平 - 1 设置引脚为高电平 - -步骤 2 : 获取引脚电压,执行代码如下: - -``` -gpio1.read() -``` - -步骤 3 : 设置引脚电平。执行代码如下: - -``` -gpio1.write(1) -``` - - - -步骤 4 : 通过给引脚设置一串变化的电压来实现LED灯的闪烁效果。执行代码如下: - -``` -import utime -i = 1 - -while i<100: - gpio1.write(0) - utime.sleep(1) - gpio1.write(1) - utime.sleep(1) - i += 1 -``` - -![](media/sbs_led_picture_1.jpg) - -![](media/sbs_led_picture_2.jpg) - -​ 运行以上代码后即可观察到EC100Y-CN模块的LED灯每隔 1 秒闪烁,并且可通过修改代码和连接多 - -组外设实现更多功能。 - -![](media/sbs_led_picture_3.jpg) - -​ 图 2 :LED灯闪烁 - -备注 - -``` -以上部分代码可见于移远通信提供的SDK工具包中,路径为modules/gpio/example_pin.py。 -``` - -#### 附录 - -表 1 :术语缩写 - - - -| 缩写 | 英文全称 | 中文全称 | -| ----- | --------------------------------- | ---------------- | -| GPIO | General-Purpose Input/Output | 通用型输入/输出 | -| LED | Light Emitting Diode | 发光二极管 | -| SDK | Software Development Kit | 软件开发工具包 | - - diff --git a/docs/sbs/zh/sbs/media/2f3227680733adae0aa17b3b6518adb9.png b/docs/sbs/zh/sbs/media/2f3227680733adae0aa17b3b6518adb9.png deleted file mode 100644 index 7f6ca4627bc1e0ac8bdbfd2604ea0695c7c9062d..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/sbs/media/2f3227680733adae0aa17b3b6518adb9.png and /dev/null differ diff --git a/docs/sbs/zh/sbs/media/480312d532ba119833ca7a16b897e409.png b/docs/sbs/zh/sbs/media/480312d532ba119833ca7a16b897e409.png deleted file mode 100644 index 2aea478646a9cf303c1635f88bade8567052d713..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/sbs/media/480312d532ba119833ca7a16b897e409.png and /dev/null differ diff --git a/docs/sbs/zh/sbs/media/6bb2bca69cee76f3586799191dd2cc87.jpeg b/docs/sbs/zh/sbs/media/6bb2bca69cee76f3586799191dd2cc87.jpeg deleted file mode 100644 index 396c6a3aa1ef810bb603f4b7f8d00b914052c34d..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/sbs/media/6bb2bca69cee76f3586799191dd2cc87.jpeg and /dev/null differ diff --git a/docs/sbs/zh/sbs/media/782cd2c870c62e6f022cca4e47c7c806.jpg b/docs/sbs/zh/sbs/media/782cd2c870c62e6f022cca4e47c7c806.jpg deleted file mode 100644 index 575991836b57cc4989dd6fa50f37889b5b670f9b..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/sbs/media/782cd2c870c62e6f022cca4e47c7c806.jpg and /dev/null differ diff --git a/docs/sbs/zh/sbs/media/Quectel_Qp_ntp_how_to_use_01.jpg b/docs/sbs/zh/sbs/media/Quectel_Qp_ntp_how_to_use_01.jpg deleted file mode 100644 index 5cea8816683d74c21e46ce2fef2a6284cbb3de5c..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/sbs/media/Quectel_Qp_ntp_how_to_use_01.jpg and /dev/null differ diff --git a/docs/sbs/zh/sbs/media/Quectel_Qp_ntp_how_to_use_02.jpg b/docs/sbs/zh/sbs/media/Quectel_Qp_ntp_how_to_use_02.jpg deleted file mode 100644 index d52ad53600c875b2eeed4112065048f46aca2e83..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/sbs/media/Quectel_Qp_ntp_how_to_use_02.jpg and /dev/null differ diff --git a/docs/sbs/zh/sbs/media/Quectel_Qp_ntp_how_to_use_03.jpg b/docs/sbs/zh/sbs/media/Quectel_Qp_ntp_how_to_use_03.jpg deleted file mode 100644 index 112b314a04770e39281c970cbe001e9d824b7596..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/sbs/media/Quectel_Qp_ntp_how_to_use_03.jpg and /dev/null differ diff --git a/docs/sbs/zh/sbs/media/Quectel_Qp_ntp_how_to_use_04.jpg b/docs/sbs/zh/sbs/media/Quectel_Qp_ntp_how_to_use_04.jpg deleted file mode 100644 index e3a27be745600db0d74850f9505bf6ee173f596c..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/sbs/media/Quectel_Qp_ntp_how_to_use_04.jpg and /dev/null differ diff --git a/docs/sbs/zh/sbs/media/Quectel_Qp_ntp_how_to_use_05.jpg b/docs/sbs/zh/sbs/media/Quectel_Qp_ntp_how_to_use_05.jpg deleted file mode 100644 index cee2f46c33980eed78a8e6047d137cec427b819a..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/sbs/media/Quectel_Qp_ntp_how_to_use_05.jpg and /dev/null differ diff --git a/docs/sbs/zh/sbs/media/Quectel_QuecPython_file_rw_029.png b/docs/sbs/zh/sbs/media/Quectel_QuecPython_file_rw_029.png deleted file mode 100644 index 6d0a8d54e6cf42b1d1e7b95eeffd9d8671befa2d..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/sbs/media/Quectel_QuecPython_file_rw_029.png and /dev/null differ diff --git a/docs/sbs/zh/sbs/media/Quectel_QuecPython_file_rw_032.png b/docs/sbs/zh/sbs/media/Quectel_QuecPython_file_rw_032.png deleted file mode 100644 index 91c4b6474fa4fc99c56ac4035f65cdb7795bd158..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/sbs/media/Quectel_QuecPython_file_rw_032.png and /dev/null differ diff --git a/docs/sbs/zh/sbs/media/Quectel_QuecPython_file_rw_033.png b/docs/sbs/zh/sbs/media/Quectel_QuecPython_file_rw_033.png deleted file mode 100644 index 827b0ed0c7089e0b41cc0f2bd78421acea367915..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/sbs/media/Quectel_QuecPython_file_rw_033.png and /dev/null differ diff --git a/docs/sbs/zh/sbs/media/Quectel_QuecPython_file_rw_035.png b/docs/sbs/zh/sbs/media/Quectel_QuecPython_file_rw_035.png deleted file mode 100644 index 09acb3348a2aa167ced6ce1971b7106c76b9f735..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/sbs/media/Quectel_QuecPython_file_rw_035.png and /dev/null differ diff --git a/docs/sbs/zh/sbs/media/Quectel_QuecPython_file_rw_036.png b/docs/sbs/zh/sbs/media/Quectel_QuecPython_file_rw_036.png deleted file mode 100644 index 1c48fc1de4607a17708f6b0c2eef57c2b4cf8f0f..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/sbs/media/Quectel_QuecPython_file_rw_036.png and /dev/null differ diff --git a/docs/sbs/zh/sbs/media/Quectel_QuecPython_file_rw_037.png b/docs/sbs/zh/sbs/media/Quectel_QuecPython_file_rw_037.png deleted file mode 100644 index 7502a4a86b041d07e074851150b537cc027c005e..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/sbs/media/Quectel_QuecPython_file_rw_037.png and /dev/null differ diff --git a/docs/sbs/zh/sbs/media/Quectel_QuecPython_file_rw_038.png b/docs/sbs/zh/sbs/media/Quectel_QuecPython_file_rw_038.png deleted file mode 100644 index 552f339a9d394d536a648dd8641cda8007de58ad..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/sbs/media/Quectel_QuecPython_file_rw_038.png and /dev/null differ diff --git a/docs/sbs/zh/sbs/media/ac0ebee2450a2170f52aeeb36f06ef03.png b/docs/sbs/zh/sbs/media/ac0ebee2450a2170f52aeeb36f06ef03.png deleted file mode 100644 index aab96b58836cd5c2e4dfd207064d4d556592286f..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/sbs/media/ac0ebee2450a2170f52aeeb36f06ef03.png and /dev/null differ diff --git a/docs/sbs/zh/sbs/media/ca55e37f24bee44fa77138e1083be1d1.png b/docs/sbs/zh/sbs/media/ca55e37f24bee44fa77138e1083be1d1.png deleted file mode 100644 index b19bdbfe047e2ece48b1addb47209f468a862ddc..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/sbs/media/ca55e37f24bee44fa77138e1083be1d1.png and /dev/null differ diff --git a/docs/sbs/zh/sbs/media/de988b13c542b7f454d13cc183693d82.png b/docs/sbs/zh/sbs/media/de988b13c542b7f454d13cc183693d82.png deleted file mode 100644 index 9b3730edcdaad48b0d3e92fe0adc7b256dce8294..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/sbs/media/de988b13c542b7f454d13cc183693d82.png and /dev/null differ diff --git a/docs/sbs/zh/sbs/media/e3245758512d024f27619fd8e359d53c.png b/docs/sbs/zh/sbs/media/e3245758512d024f27619fd8e359d53c.png deleted file mode 100644 index b3dcf8b6c0935260cfbd5475a947038579eff4a2..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/sbs/media/e3245758512d024f27619fd8e359d53c.png and /dev/null differ diff --git a/docs/sbs/zh/sbs/media/fbea842752b5a5006c5a5cdac1632304.png b/docs/sbs/zh/sbs/media/fbea842752b5a5006c5a5cdac1632304.png deleted file mode 100644 index 76fab99b76cd2322d78bac0aed2a40f8b3398d8e..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/sbs/media/fbea842752b5a5006c5a5cdac1632304.png and /dev/null differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture1.jpg b/docs/sbs/zh/sbs/media/sbs_socket_picture1.jpg deleted file mode 100644 index 2c84dabc7cc228121eaf4311675b0259a240795f..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/sbs/media/sbs_socket_picture1.jpg and /dev/null differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture2.jpg b/docs/sbs/zh/sbs/media/sbs_socket_picture2.jpg deleted file mode 100644 index 7ec6f65fe66cfe302bb5acfcedaf904ad07a9e6a..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/sbs/media/sbs_socket_picture2.jpg and /dev/null differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture3.jpg b/docs/sbs/zh/sbs/media/sbs_socket_picture3.jpg deleted file mode 100644 index 940272b8ef2f5ccc18d26e022f8b02f6a90d3774..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/sbs/media/sbs_socket_picture3.jpg and /dev/null differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture4.jpg b/docs/sbs/zh/sbs/media/sbs_socket_picture4.jpg deleted file mode 100644 index 7442f2cc0d0463103b1c30ccbfba4a4b119b4af1..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/sbs/media/sbs_socket_picture4.jpg and /dev/null differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture5.jpg b/docs/sbs/zh/sbs/media/sbs_socket_picture5.jpg deleted file mode 100644 index bbbcfdd07f513ac3313f5e2e0a82086702ad9748..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/sbs/media/sbs_socket_picture5.jpg and /dev/null differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture6.jpg b/docs/sbs/zh/sbs/media/sbs_socket_picture6.jpg deleted file mode 100644 index e6a6be3adc45e2e85806d93aceb319b218fbeb58..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/sbs/media/sbs_socket_picture6.jpg and /dev/null differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture7.jpg b/docs/sbs/zh/sbs/media/sbs_socket_picture7.jpg deleted file mode 100644 index 01d78635e6af1079fc35f1dea97b7b7c18b2eb6b..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/sbs/media/sbs_socket_picture7.jpg and /dev/null differ diff --git a/docs/sbs/zh/sbs/mpycross.md b/docs/sbs/zh/sbs/mpycross.md deleted file mode 100644 index ce9966cc28dcf11af6042e7ce360e8189a6b9159..0000000000000000000000000000000000000000 --- a/docs/sbs/zh/sbs/mpycross.md +++ /dev/null @@ -1,88 +0,0 @@ -### mpy-cross工具 使用指导 - -#### **工具介绍** - -在Python中,可将.py文件编译为.pyc文件。编译后的.pyc文件是二进制格式,可加快加载速度,更重要的是可以保护原始代码。micropython使用mpy-cross工具完成.py文件编译并加密,编译后的文件为.mpy。 - -**文件说明** - -**.py文件** -Python源代码文件 - -**.pyc文件** -二进制文件,Python源代码文件经过编译后生成的字节码文件。.pyc文件加载速度有所提高,且pyc是一种跨平台的字节码,由Python虚拟机来执行。 - -**.mpy文件** -Micropython提供mpy-cross工具,用于将Python源代码文件编译成.mpy文件。该文件和.pyc文件均为二进制字节码文件。 - -**参数说明** - -![](media/Quectel_Qp_mpy_cross_tools_how_to_use_01.jpg) - -​ 图 1 :mpy-cross参数使用说明 图片索引 - -**备注** - -可访问如下链接获取更多有关工具mpy-cross的说明: -https://pypi.org/project/mpy-cross/1.9.3/ -https://makeblock-micropython-api.readthedocs.io/zh/latest/novapi/tutorial/precompiled_to_mpy.html - -#### 工具使用 - -1. 连接EC100Y-CN开发板至电脑,如下图所示。接入后操作方法详见《Quectel_QuecPython_基础操作说明》。 - - ![](media/Quectel_Qp_mpy_cross_tools_how_to_use_02.jpg) - - ​ 图 2 :开发板接入电脑 - -2. 使用mpy-cross-amd64.exe工具。在工具同目录下编写usertest.py文件,文件内编写测试函数, - 如下所示: - - ``` - def test_mpy(): - print(“hello this is mpy file”) - ``` - - - -3. 打开Windows下cmd命令行,进入mpy-cross-amd64.exe工具所在目录,如下图所示。 - - ![](media/Quectel_Qp_mpy_cross_tools_how_to_use_03.jpg) - - ​ 图 3 :命令行进入工具目录 - - - -4. 随后执行如下命令及参数生成.mpy文件: - - ``` - mpy-cross-amd64.exe -mno-unicode usertest.py - ``` - - 生成的.mpy如下图所示 - - ![](media/Quectel_Qp_mpy_cross_tools_how_to_use_04.jpg) - - ​ 图 4 :mpy文件 - -5. 在test.py文件中使用import导入usertest模块,直接调用usertest文件中的方法,如下所示: - - ``` - import usertest - usertest.test_mpy() - ``` - - - -6. 把test.py文件和usertest.mpy文件分别上传到移远通信EC100Y-CN开发板内,上传方法详见 - 《Quectel_QuecPython_基础操作说明》。 - - - -7. 在开发板中运行test.py文件,可看到经过mpy-cross工具加密过的usertest模块执行结果,如下 - 图所示。 - - ![](media/Quectel_Qp_mpy_cross_tools_how_to_use_05.jpg) - - ​ 图 5 :test.py运行结果 - diff --git a/docs/sbs/zh/sbs/mqtt.md b/docs/sbs/zh/sbs/mqtt.md deleted file mode 100644 index b51e6045254e59b2d025aba967ea19f584dafecd..0000000000000000000000000000000000000000 --- a/docs/sbs/zh/sbs/mqtt.md +++ /dev/null @@ -1,525 +0,0 @@ -### MQTT应用 开发指导 - -#### MQTT概述 - -**MQTT简介** - -MQTT是基于代理的发布/订阅模式通讯协议,具有开放、简单、轻量和易于实现等特点。MQTT最大优点在于,可以以极少的代码和有限的网络带宽,为远程设备连接提供实时可靠的消息服务。由于规范简单,适合对低功耗要求严格和网络带宽有限的物联网场景,例如:遥感数据、汽车、智能家居、智慧城市和医疗医护等。 - -**MQTT设计原则** - -MQTT协议遵循以下设计原则: - -1. 功能精简。 - -2. 采用发布/订阅(Pub/Sub)模式,方便消息传递。 -3. 允许用户动态创建主题,降低运营成本。 -4. 降低传输量至最低,提高传输效率。 -5. 关注低带宽、高延迟、不稳定的网络等因素。 -6. 支持连续会话控制。 -7. 对客户端计算能力包容性强。 -8. 提供服务质量管理。 -9. 对传输数据的类型与格式无强制要求,保持灵活性。 - -**MQTT业务场景** - -运用MQTT协议,设备可以方便地连接到物联网云服务,管理设备并处理数据,最后应用到各种业务场景,如下图所示: - -![](media/Quectel_Qp_mqtt_app_how_to_use_01.jpg) - -图 1 :MQTT业务场景 - -**MQTT发布/订阅模式** - -发布/订阅模式提供传统客户端-服务器体系结构的替代方法。在客户端服务器模型中,客户端直接与端点进行通信。发布/订阅模型解耦了发送消息的客户端(发布者)与接收消息的客户端(订阅者)之间的关系,二者并不直接建立联系。发布者与订阅者之间由第三个组件(代理)进行连接,代理过滤所有传入的消息,并将其正确分发给订阅者。 - -发布/订阅模式优点如下: - -​ 1. 发布者与订阅者无需互相知悉,只需使用同一个代理即可。 - -​ 2. 发布者和订阅者无需交互,发布者不必因等待订阅者确认而导致锁定。 - -​ 3. 发布者和订阅者无需同时在线,可自由选择时间发布/接收消息。 - -**MQTT协议原理** - -![](media/Quectel_Qp_mqtt_app_how_to_use_02.jpg) - -​ 图 2 :MQTT协议原理图示 - -1. 实现MQTT协议需要:客户端和服务器端。 - -2. MQTT协议中有三种身份:发布者(Publisher)、代理(Broker)、订阅者(Subscriber)。其 - -中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。 - -3. MQTT传输的消息分为:主题(Topic)和负载(Payload)两部分: - Topic,可以理解为消息的类型,订阅者订阅后,就会收到该主题的消息内容; - Payload,可以理解为消息的内容,是指订阅者具体要使用的内容。 - -**MQTT中的相关方法** - -​ MQTT中定义了一些方法(或动作),来于表示对确定资源所进行操作。这个资源可以代表预先存在的数据或动态生成数据,这取决于服务器的实现。通常来说,资源是指服务器上的文件或输出: - - Connect,等待与服务器建立连接; - Disconnect,等待MQTT客户端完成所做的工作,并与服务器断开TCP/IP会话; - Subscribe,等待完成订阅; - UnSubscribe,等待服务器取消客户端的一个或多个topics订阅; - Publish,MQTT客户端发送消息请求,发送完成后返回应用程序线程。 - -**MQTT主题** - -​ MQTT通过主题对消息进行分类。主题一般是一个UTF- 8 的字符串,可通过符号“/”表示层级关系。主题可直接使用,无需再次创建。主题还可以通过通配符进行过滤,其中,“+”用于过滤一个层级,“#”一般位于主题后表示过滤任意级别的层级。示例如下: - -1. building-b/floor- 5 :代表B楼 5 层的设备。 -2. +/floor- 5 :代表任何一个楼的 5 层的设备。 -3. building-b/#:代表B楼所有的设备。 - -备注 - -MQTT允许使用通配符订阅主题,但并不允许使用通配符广播。 - - - -**MQTT服务质量** - -MQTT支持三种不同级别的服务质量,为不同场景保证消息传输的可靠性。 - -​ 级别 0 :最多一次。 - -​ 消息发送者仅发送一次,不会重复发送。一般用于传输不重要数据的场景。 - -​ 级别 1 :至少一次。 - -​ 消息发送者发送消息以后,若未收到消息接收者的确认信息,则会再次发送,直到接收到消息接受者的确认信息。这种情况可能导致重复消息。一般用于日志处理的场景。 - - 级别 2 :只发送一次。 - -​ 消息发送者发送消息以后等待消息接收者的确认消息,接收到确认消息后消息发送者删除消息并通知消息接收者。如此会减少并发或者增加延时,但是若数据丢失或者重复消息不可接受时,可 - -设置为级别 2 。 - - - - -#### MQTT API - -**MQTTClient** - -该函数用于构建MQTT连接对象。 - -函数原型 - -``` -MQTTClient(client_id, server, port=0, user=None, password=None, keepalive=0, ssl=False,ssl_params={}) -``` - - - -参数 - -client_id: - -字符串类型。客户端ID,具有唯一性,也可能是经过加密处理后的client_id,例如阿里云。 - -server: -字符串类型。服务端地址,可以是IP或者域名。 - -port: -(可选)整型。服务器端口,默认为 1883 ,通过SSL/TLS的MQTT的默认端口是 8883 。 - -user: -(可选)字符串类型。在服务器上注册的用户名,也可能是经过加密处理的用户名,例如阿里云。 - -password: -(可选)字符串类型。在服务器上注册的密码,也可能是经过加密处理的密 码,例如阿里云。 - -keepalive: -(可选)整型。客户端的keepalive超时值。默认为 60 秒,范围为60~120秒。 - -ssl: -(可选)布尔型。是否使能支持SSL/TLS。 - -ssl_params: -(可选)字符串类型。SSL/TLS参数。 - - - -返回值 - -MQTT对象。 - - - -**MQTTClient.set_callback** - -该函数用于设置回调函数。 - -函数原型 - -``` -MQTTClient.set_callback(callback) -``` - -参数 - -``` -callback: -消息回调函数。 -``` - -返回值 - -无。 - - - -**MQTTClient.connect** - -该函数用于与服务器建立连接。 - -函数原型 - -``` -MQTTClient.connect(clean_session=True) -``` - -参数 - -clean_session: -布尔型。可选参数,一个决定客户端类型的布尔值。如果为True,那么代理将在其断开连接时删除有 -关此客户端的所有信息。如果为False,则客户端是持久客户端,当客户端断开连接时,订阅信息和排 -队消息将被保留。默认为False。 - -返回值 - -无。 - -**MQTTClient.disconnect** - -该函数用于与服务器断开连接。 - -函数原型 - -``` -MQTTClient.disconnect() -``` - -参数 - -无。 - -返回值 - -无。 - - - -**MQTTClient.ping** - -该函数用于向服务器发送ping包,检测保持连通性。 - -函数原型 - -``` -MQTTClient.ping() -``` - -参数 - -无。 - -返回值 - -无。 - - - -**MQTTClient.publish** - -该函数用于发布消息。 - -函数原型 - -``` -MQTTClient.publish(topic,msg) -``` - -参数 - -topic: -字符串类型。消息主题。 - -msg: -字符串类型。需要发送的数据。 - -返回值 - -无。 - - - -**MQTTClient.subscribe** - -该函数用于订阅MQTT主题。 - -函数原型 - -``` -MQTTClient.subscribe(topic,qos) -``` - -参数 - -topic: -字符串类型。MQTT主题。 - -msg: -字符串类型。MQTT消息服务质量,默认为 0 ,可选择 0 或 1 。 - -返回值 - -无。 - -**MQTTClient.check_msg** - -该函数用于检查服务器是否有待处理消息。 - -函数原型 - -``` -MQTTClient.check_msg() -``` - -参数 - -无。 - -返回值 - -无。 - - - -**MQTTClient.wait_msg** - -该函数用于等待服务器消息响应。 - -函数原型 - -``` -MQTTClient.wait_msg() -``` - -参数 - -无。 - -返回值 - -无。 - - - -**MQTTClient.set_last_will** - -​ 该函数用于设置要发送给服务器的遗嘱,客户端没有调用disconnect()异常断开,则发送通知到客户端。 - -函数原型 - -``` -MQTTClient.set_last_will(topic,msg,retain=False,qos=0) -``` - -参数 - -topic: -字符串类型。遗嘱主题。 - -msg: -字符串类型。遗嘱内容。 - -retain: -布尔型。retain=True boker会一直保留消息,默认为False。 - -qos: -整型。消息服务质量,范围为0~2。 - -返回值 - -无。 - - - -#### MQTT开发说明 - -**MQTT服务器搭建和测试** - -​ 上位机安装MQTT服务器,即消息代理。本文档以mosquitto开源消息代理软件为例。 - -**搭建MQTT服务器** - -1. Linux系统通过以下命令进行安装。 -2. Windows系统访问https://mosquitto.org/download/下载适配版本的.exe安装包。 - -以Windows 系统为例,安装完成后进入 mosquitto 安装目录,启动命令行执行如下命令,查看 -mosquitto的用法: - -``` -mosquitto -h -``` - -![](media/Quectel_Qp_mqtt_app_how_to_use_03.jpg) - -​ 图 3 :mosquitto帮助信息 - -​ 上图中的两个关键参数-c和-p,-c用于指定MQTT服务的配置,-p用于指定服务端口。 - -**启动MQTT服务器** - -​ 启动MQTT 服务器前,要确保服务器所在网络能够被设备访问。在命令行中键入以下命令,启动 - -MQTT服务: - -``` -mosquitto -c mosquitto.conf -p 10080 –v -``` - -​ 测试阶段,配置文件直接使用安装目录下的默认配置即可;本测试本地端口使用 10080 。 - -![](media/Quectel_Qp_mqtt_app_how_to_use_04.jpg) - -​ 图 4 :MQTT服务器启动成功 - -**验证MQTT服务器有效性** - -**安装MQTT客户端** - -本文档以MQTT.fx的客户端为例。访问http://mqttfx.bceapp.com,下载并安装客户端软件。 - -安装完成后,打开MQTT.fx,默认进入发布界面,如下图所示: - -![](media/Quectel_Qp_mqtt_app_how_to_use_05.jpg) - -​ 图 5 :MQTT.fx启动界面 - -**配置MQTT客户端** - -​ 点击上图中配置按钮 ,添加MQTT连接配置。 - -​ 配置界面默认添加了m2m.eclipse.org和mosquitto服务的配置。可修改任意配置,主要修改“Broker -Address”(代理地址)和“Broker Port”(代理端口)两项。亦可点击配置界面左下角的加号,添加自定义服务连接配置。 - -​ 配置选项“General”、“User Credentials”、“SSL/TLS”、“Proxy”和“LWT”,可根据服务 -器的要求进行配置,包括连接超时时间、保活时间间隔、MQTT协议版本、用户名/密码及SSL相关配置。 - -本文中采用默认配置。 - -![](media/Quectel_Qp_mqtt_app_how_to_use_06.jpg) - -​ 图 6 :MQTT连接配置 - -**MQTT交互测试** - -1. 建立MQTT连接 - -​ 在 MQTT.fx 启动后进入的默认界面点击“Connect”按钮,建立 MQTT 连接。连接成功后mosquitto服务器打印的日志请参考MQTT服务器与客户端交互。连接成功后即可发布消息、订阅主题,默认已填充待订阅和发布的消息主题。 - -![](media/Quectel_Qp_mqtt_app_how_to_use_07.jpg) - -​ 图 7 :MQTT服务器与客户端交互 - -![](media/Quectel_Qp_mqtt_app_how_to_use_08.jpg) - -​ 图 8 :发布消息 - -![](media/Quectel_Qp_mqtt_app_how_to_use_09.jpg) - -​ 图 9 :订阅主题 - -​ MQTT允许用户动态创建主题,也可动态修改主题。将待订阅和发布的消息主题配置一致,如此可实现回显功能。客户端向服务器发布的消息可立即分发至到客户端。 - - -#### 使用MQTT进行数据发布订阅 - -本测试采用echo功能作为测试示例。 - -步骤 1 : 开发板接入电脑,接入后详细操作方法,请参考《Quectel_QuecPython_基础操作说明》。 - -![](media/Quectel_Qp_mqtt_app_how_to_use_10.jpg) - -​ 图 10 :接入开发板 - -步骤 2 : 建立test.py文件,导入umqtt模块,我们以连接mq.tongxinmao.com网址为例创建以下代 -码: - -```python -from umqtt import MQTTClient -state = 0 -def sub_cb(topic, msg): - global state - print("subscribe recv:") - print(topic, msg) - state = 1 - -#创建一个mqtt实例 -c = MQTTClient("umqtt_client", "mq.tongxinmao.com", '18830') -#设置消息回调 -c.set_callback(sub_cb) -#建立连接 - -c.connect() -#订阅主题 -c.subscribe(b"/public/TEST/quecpython") -print("Connected to mq.tongxinmao.com, subscribed to /public/TEST/quecpython topic" ) -#发布消息 -c.publish(b"/public/TEST/quecpython", b"my name is Kingka!") -print("Publish topic: /public/TEST/quecpython, msg: my name is Quecpython") - -while True: - c.wait_msg() #阻塞函数,监听消息 - if state == 1: - break - -#关闭连接 -c.disconnect() -``` - - - -备注 - -也 可 以 通过访 问 通 信 猫 在 线 客 户 端 服 务 器 进 行 MQTT 验 证 : - -http://www.tongxinmao.com/txm/webmqtt.php。 - -![](media/Quectel_Qp_mqtt_app_how_to_use_11.jpg) - -​ 图 11 :通信猫在线客户端服务器 - - - -步骤 3 : 将 test.py 文件上传至 EC1 00 Y-CN QuecPython 开发板内,详细上传方法请参考 -《Quectel_QuecPython_基础操作说明》。 - - - -步骤 4 : 在开发板中运行test.py文件,即可以看到模块执行结果,如下图所示: - -![](media/Quectel_Qp_mqtt_app_how_to_use_11.jpg) - - -#### 附录 - -表 1 :术语缩写 - -| 缩写 | 英文全称 | 中文全称 | -| ---- | ----------------------------------- | ------------------ | -| API | Application Programming Interface | 应用程序编程接口 | -| IP | Internet Protocol | 网际互连协议 | -| MQTT | Message Queuing Telemetry Transport | 消息队列遥测传输 | -| SSL | Secure Sockets Layer | 安全套接层 | -| TLS | Transport Layer Security | 传输层安全(协议) | - - - diff --git a/docs/sbs/zh/sbs/ntp.md b/docs/sbs/zh/sbs/ntp.md deleted file mode 100644 index ea108b0e764a95a79103c588360323cf1caa3e57..0000000000000000000000000000000000000000 --- a/docs/sbs/zh/sbs/ntp.md +++ /dev/null @@ -1,86 +0,0 @@ -### NTP 使用指导 - -#### 概述 - -​ NTP又称网络时间协议,用于同步计算机时间的一种协议。该协议可以使计算机对其服务器或时钟源(如石英钟,GPS等等)进行同步,同时提供高精准度的时间校正(LAN上与标准时间差小于 1 毫秒,WAN上与标准时间差大约有几十毫秒),且可介由加密确认的方式来防止恶毒的协议攻击。NTP的目的是在无序的互联网环境中提供精确和健壮的时间服务。 - -​ NTP提供准确时间,首先要有准确的时间来源,即国际标准时间UTC。NTP获得UTC的时间来源可 - -以是原子钟、天文台、卫星,也可以从互联网上获取。时间按NTP服务器的等级传播,按照离外部UTC时间源的远近将所有服务器归入不同的Stratum(层)中。Stratum- 1 在顶层,有外部UTC接入;Stratum- 2从Stratum- 1 获取时间;Stratum- 3 从Stratum- 2 获取时间,......,以此类推,但Stratum的总数限制在 15以内。所有这些服务器在逻辑上形成阶梯式的架构相互连接,而Stratum- 1 的时间服务器是整个系统的基础。计算机主机一般同多个时间服务器连接,利用统计学的算法过滤来自不同服务器的时间,以选择最佳的路径和来源来校正主机时间,即使主机在长时间无法与某一时间服务器相联系的情况下,NTP服务依然有效运转。 - -​ 为防止对时间服务器的恶意破坏,NTP使用了识别(Authentication)机制,检查来对时的信息是否是真正来自所宣称的服务器并检查资料的返回路径,以提供对抗干扰的保护机制。NTP时间同步报文中包含的时间是格林威治时间,是从 1900 年开始计算的秒数。 - -#### 功能实现 - -NTP对时需要从NTP服务器上获取时间,故在实现NTP对时功能之前需连接网络。本文档以通过SIM - -卡进行联网为例。 - -1. 准备一张可用的Nano SIM卡,滑动打开开发板上SIM卡槽,放入SIM卡后合上卡槽盖子并通电, - 等待自动拨号。以EC100Y-CN为例,SIM卡槽位置如图所示: - - ![](media/Quectel_Qp_ntp_how_to_use_01.jpg) - - ​ 图 1 :插入SIM卡 - - 自动拨号后,可通过如下方法验证是否拨号成功: - -![](media/Quectel_Qp_ntp_how_to_use_02.jpg) - -​ 图 2 :自动拨号成功验证 - -1. 拨号成功后,导入ntptime模块 - - ``` - import ntptime - ntptime.host - ``` - - - - 返回当前的NTP服务器,默认为"ntp.aliyun.com"。 - - ![](media/Quectel_Qp_ntp_how_to_use_03.jpg) - - ​ 图 3 :当前NTP服务器 - -2. 设置NTP服务器。设置成功返回 0 ,设置失败返回- 1 。 - - ``` - ntptime.sethost(host) - ``` - - ![](media/Quectel_Qp_ntp_how_to_use_04.jpg) - - ​ 图 4 :设置NTP服务器 - -3. 同步NTP时间。同步成功返回 0 ,同步失败返回- 1 。 - - ``` - ntptime.settime() - ``` - - ​ 对时结果可使用utime.localtime()验证。执行utime.localtime()后返回当前时间,返回值为一个元组:(year, month, mday, hour, minute, second, weekday, yearday)。详细说明请参考《QuectelQuecPython类库API说明》。 - - ​ ntptime.settime()对时后返回时间为UTC时间,北京时间领先UTC八个小时,所以对时后,对比当前时间可发现时间后退八小时。 - - ![](media/Quectel_Qp_ntp_how_to_use_05.jpg) - - ​ 图 5 :对时成功 - - - -#### 附录术语缩写 - -表 1 :术语缩写 - -|术语 | 英文描述 | 中文描述 | -| ---------- | --------------------------------- |----------- | -| GPS | Global Positioning System | 全球定位系统| -| LAN | Local Area Network | 局域网| -| NTP | Network Time Protocol | 网络时间协议| -| RTC | Real_Time Clock | 实时时钟| -| SIM | Subscriber Identity Module | 用户身份识别模块| -| UTC | Coordinated Universal Time | 协调世界时| -| WAN | Wide Area Network | 广域网| - diff --git a/docs/sbs/zh/sbs/pwm.md b/docs/sbs/zh/sbs/pwm.md deleted file mode 100644 index e0af313903d6485cc3a19d42d910205455a02f5e..0000000000000000000000000000000000000000 --- a/docs/sbs/zh/sbs/pwm.md +++ /dev/null @@ -1,109 +0,0 @@ -### PWM 使用指导 - -#### PWM相关接口 - -**创建PWM对象** - -首先,导入misc模块下的PWM,然后创建PWM对象。有关示例代码,请参考以下代码清单: - -``` -from misc import PWM -pwm0 = PWM(PWM.PWMn,PWM.ABOVE_xx,highTime,cycleTime) -``` - -**参数** - -``` -参数 参数类型 参数说明 - PWM.PWM0 PWM0 -PWM.PWMn PWM.PWM1 PWM1 - PWM.PWM2 PWM2 - PWM.PWM3 PWM3 - - - PWM.ABOVE_MS ms级取值范围:(0,1023] -PWM.ABOVE_xx PWM.ABOVE_1US us级取值范围:(0,157] - PWM.ABOVE_10US us级取值范围:(1,1575] - PWM.ABOVE_BELOW_US ns级 取值(0,1024] - - -highTime int ms级时,单位为ms - us级时,单位为us - ns级别:需要使用者计算 - 频率 = 13Mhz / cycleTime - 占空比 = highTime/ cycleTime - - -cycleTime int ms级时,单位为ms - us级时,单位为us - ns级别:需要使用者计算 - 频率 = 13Mhz / cycleTime - 占空比 = highTime/ cycleTime - -``` - - - -**pwm.open** - -该方法用于开始输出PWM。 - -**函数原型** - -``` -pwm.open() -``` - -**参数** - -无 - -**返回值** - -0 成功 - --1 失败 - - - -**pwm.close** - -该方法用于关闭输出PWM。 - -**函数原型** - -``` -pwm.open() -``` - -**参数** - -无 - -**返回值** - -0 成功 - --1 失败 - - - -#### PWM执行示例 - -PWM流程的脚本命令汇总如下: - -```python -from misc import PWM -pwm1 = PWM(PWM.PWM0,PWM.ABOVE_MS, 1, 2) -pwm1 = PWM(PWM.PWM0,PWM.ABOVE_1US, 100, 200) -pwm1 = PWM(PWM.PWM0,PWM.ABOVE_10US, 100, 200) -``` - -#### 附录术语缩写 - -表 1 :术语缩写 - -| 缩写 | 英文全称 | 中文全称 | -| ---- | ---------------------- | ------------ | -| PWM | Pulse Width Modulation | 脉冲宽度调制 | - diff --git a/docs/sbs/zh/sbs/record.md b/docs/sbs/zh/sbs/record.md deleted file mode 100644 index 1aa36adbf8772d1d262fd50a638ed11a3b1ca058..0000000000000000000000000000000000000000 --- a/docs/sbs/zh/sbs/record.md +++ /dev/null @@ -1,313 +0,0 @@ -### Record拾音 使用指导 - -#### 录音接口函数 - -**创建record对象** - -```python -import audio - -record = audio.Record(file_name,callback) -``` - -- **参数** - -*file_name*: - -字符串 ,录音文件名 。 - -*callback*: - -录音结束的回调函数 。 - -- **返回值** - -返回 *-1* 表示创建失败 ; 若返回对象 ,则表示创建成功 。 - -- **示例** - -```python -import audio -def record_callback(para): - print("file_name:",para[0]) # 返回文件路径 - print("audio_len:",para[1]) # 返回录音长度 - print("audio_state:",para[2]) # 返回录音状态 -1: error 3: 成功 - -record_test = audio.Record("record_test.wav",record_callback) -``` - - - -**record.start** - -开始录音 。 - -- **函数原型** - -```python -record.start(seconds) -``` - -- **参数** - -*seconds*: - -整型 。 需要录制时长。 单位:秒 。 - -- **返回值** - -*0* 成功 ; - -*-1* 文件覆盖失败 ; - -*-2* 文件打开失败 ; - -*-3* 文件正在使用 ; - -*-4* 通道设置错误(只能设置 0 或 1); - -*-5* 定时器资源申请失败 。 - -- **示例** - -```python -record.start(40) -``` - - - -**record.stop** - -停止录音 。 - -- **函数原型** - -```python -record.stop() -``` - -- **参数** - - 无 - -- **返回值** - - 无 - -- **示例** - -```python -record_test.stop() -``` - - - -**record.getFilePath** - -读取录音文件的路径 。 - -- **函数原型** - -```python -record.getFilePath() -``` - -- **参数** - - 无 - -- **返回值** - -录音文件的路径 ,字符串 。 - -- **示例** - -```python -record_test.getFilePath() -``` - -**record.getData** - -读取录音数据 。 - -- **函数原型** - -```python -record.getData(offset, size) -``` - -- **参数** - -*offset*: - -整型 。 读取数据的偏移量 。 - -*size*: - -整型 。读取大小 ,需小于10K。 - -- **返回值** - -*1* 读取数据错误 ; - --*2* 文件打开失败 ; - -*-3* 偏移量设置错误 ; - -*-4* 文件正在使用 ; - -*-5* 设置超出文件大小 (offset+size > file_size); *-6* 读 size 大于 10K; - -*-7* 内存不足 10K bytes: 返回数据 。 - -- **示例** - -```python -record_test.getData(0, 44) # 读取文件头 -``` - - - -**record.getSize** - -读取录音文件大小 。 - -- **函数原型** - -```python -record.getSize() -``` - -- **参数** - - 无 - -- **返回值** - -若获取成功,返回文件大小 ,此值会比返回 callback 返回值大 44 bytes(44 bytes 为文件头): 否则 : - -*-1* 获取文件 大小 失败 ; - -*-2* 文件打开失败 ; - -*-3* 文件正在使用 ; - -- **示例** - -```python -record_test.getSize() -``` - - - -**record.Delete** - -删除录音文件 。 - -- **函数原型** - -```python -record.Delete() -``` - -- **参数** - - 无 - -- **返回值** - -*0* 成功 - -*-1* 文件不存在 - -*-2* 文件正在使用 - -- **示例** - -```python -record_test.Delete() -``` - - - -**record.exists** - -判断录音文件是否存在 。 - -- **函数原型** - -```python -record.exists() -``` - -- **参数** - - 无 - -- **返回值** - -*TRUE* 文件存在 - - *FALSE* 文件不存在 - - - -**record.isBusy** - -- **函数原型** - -```python -record.isBusy() -``` - -- **参数** - - 无 - -- **返回值** - -*0* IDEL - -*1* BUSY - -- **返回值** - -```python -record_test.isBusy() -``` - - - -#### 示例 - -**Record流程脚本命令** - -*record* 流程的脚本命令汇总如下 : - -```python -import audio - -def record_callback(para): - print("file_name:",para[0]) - print("audio_len:",para[1]) - print("audio_state:",para[2]) - -record_test = audio.Record("record_test.wav",record_callback) record_test.isBusy() -record_test.start(40) -record_test.isBusy() -record_test.stop() -record_test.getFilePath() -record_test.getData(0, 44) -record_test.getSize() -record_test.Delete() -record_test.exists() -record_test.isBusy() -``` - - - -**脚本执行结果** - -脚本执行结果分别下图所示: - -![Quectel_sbs_record_API_029.png](media/Quectel_sbs_record_API_029.png) \ No newline at end of file diff --git a/docs/sbs/zh/sbs/socket.md b/docs/sbs/zh/sbs/socket.md deleted file mode 100644 index e5b153cf0da6e8edae610b4cd7a7edf456b7a09a..0000000000000000000000000000000000000000 --- a/docs/sbs/zh/sbs/socket.md +++ /dev/null @@ -1,580 +0,0 @@ -### Socket应用 开发指导 - -#### Socket概述 - -​ 所谓Socket(套接字),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个Socket就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,Socket上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口。 - -​ Socket可以看成是两个网络应用程序进行通信时,各自通信连接中的端点,这是一个逻辑上的概念。它是网络环境中进程间通信的API(应用程序编程接口),也是可以被命名和寻址的通信端点,使用中的每一个Socket都有其类型和一个与之相连进程。通信时其中一个网络应用程序将要传输的一段信息写入它所在主机的Socket中,该Socket通过与网络接口卡(NIC)相连的传输介质将这段信息送到另外一台主机的Socket中,使对方能够接收到这段信息。Socket是由IP地址和端口结合的,提供向应用层进程传送数据包的机制。 - -**Socket的应用** - -​ Socket可以使一个应用从网络中读取和写入数据,不同计算机上的两个应用可以通过连接发送和接受字节流,注意,当发送消息时,需要知道对方的IP和端口。在日常生活中有很多应用场景,当你浏览网页时,浏览器进程怎么与web服务器进程通信;当你用QQ聊天时,QQ进程怎么与服务器或好友所在的QQ进程通信,这些都是通过socket来实现的。 - -#### QuecPython Socket API详解 - -​ Socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开(open)→ -读写(write/read)→关闭(close)”模式来操作。在实现过程中服务端可以看作是web服务器,客户端可以看作是要访问web服务器的浏览器,访问过程就可以和打开→读写→关闭一一对应。 - -​ QuecPython类库中通过usocket实现Socket功能,usocket 模块提供对BSD套接字接口的访问。该模块实现相应CPython模块的子集,更多信息请参阅CPython文档:socket。其中usocket对Socket功能的具体流程及实现的相关API介绍如下。 - -**usocket.socket** - -​ 该函数用于服务端或客户端创建一个Socket对象。 - -函数原型 - -``` -sock=usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) -``` - -参数 - -usocket.AF_INET: -网络协议,IPv - -usocket.SOCK_STREAM: -对应TCP的流式Socket。更多常量定义详见Quectel QuecPython 类库API说明。 - -返回值 - -无。 - -**usock.getaddrinfo** - -​ 该函数用于将主机域名(host)和端口(port)转换为用于创建套接字的 5 元组序列,元组结构如下: -(family, type, proto, canonname, sockaddr) - -函数原型 - -``` -usocket.getaddrinfo(host, port) -``` - -参数 - -host: -主机域名。 - -port: -端口。 - -返回值 - -无。 - - - -**sock.bind** - -​ 该函数用于将Socket对象和服务端IP:端口绑定。由于TCP口是动态的,客户端无需进行绑定。使用该函数之前,Socket必须未进行绑定。 - -函数原型 - -``` -sock.bind(address) -``` - -参数 - -address: -由地址端口号组成的列表或者元组。 - -返回值 - -无。 - - - -**sock.listen** - -​ 该函数允许服务端接受Socket连接,可指定最大连接数。 - -函数原型 - -``` -sock.listen(backlog) -``` - -参数 - -backlog: -接受的最大Socket连接数,至少为 0 。 - -返回值 - -无。 - - - -**sock.accept** - -​ 该函数用于服务端接受客户端连接请求。 - -函数原型 - -``` -(conn, addres) = sock.accept() -``` - -参数 - -无。 - -返回值 - -返回元组,包含新的Socket和客户端地址,形式为:(conn, address)。 - -conn: -新的Socket对象,用来发送和接收数据。 - -address: -连接到服务器的客户端地址。 - - - -**sock.connect** - -​ 客户端使用该函数连接到指定地址的服务器。 - -函数原型 - -``` -sock.connect(address) -``` - -参数 - -address: -连接到客户端的服务端地址。 - -返回值 - -无。 - - - -**2.3.7. sock.recv** - -​ 该函数用于接受客户端或服务端发送的数据。 - -函数原型 - -``` -recv_data = sock.recv(bufsize) -``` - -参数 - -bufsize: -一次接收的最大数据量。 - -返回值 - -返回值是一个字节对象,表示接收到的数据。 - - - -**sock.send** - -​ 该函数用于发送数据到服务端或客户端。 - -函数原型 - -``` -sock.send(send_data.encode("utf8")) -``` - -参数 - -send_data: -表示要发送的数据。 - -返回值 - -返回实际发送的字节数。 - -备注 - -​ TCP协议的Socket是基于字节流的,通过Socket发送数据之前,需先使用encode("utf8")对数据进行编码,其中"utf8"为编码方式。 - - - -**sock.close** - -​ 该函数用于关闭Socket通信。 - -函数原型 - -``` -sock.close() -``` - -参数 - -无。 - -返回值 - -无。 - - - -**sock.read** - -​ 该函数用于从Socket中读取size字节数据,如果没有指定size,则会从套接字读取所有可读数据,直到读取到数据结束。 - -函数原型 - -``` -socket.read([ size ]) -``` - -参数 - -[ size ]: -要读取的字节数。 - -返回值 - -字节对象。 - - - -**sock.readinto** - -​ 该函数用于将字节读取到缓冲区中。 - -函数原型 - -``` -sock.readinto(buf [ , nbytes ]) -``` - -参数 - -buf: -存放读取字节的缓冲区。 - -nbytes: -读取的字节数。 - -返回值 - -实际读取的字节数。 - - - -**sock.readline** - -​ 该函数用于按行读取数据,遇到换行符结束。 - -函数原型 - -``` -sock.readline() -``` - -参数 - -无。 - -返回值 - -返回读取的数据行。 - - - -**sock.write** - -​ 该函数用于向缓存区写入数据。 - -函数原型 - -``` -sock.write(buf) -``` - -参数 - -buf: -写入缓冲区的数据。 - -返回值 - -返回实际写入的字节数。 - - - -**sock.sendall** - -​ 该函数用于将所有数据都发送到Socket。 - -函数原型 - -``` -sock.sendall(bytes) -``` - -参数 - -bytes: -缓存buffer,存放bytes型数据。 - -返回值 - -无。 - - - -**sock.sendto** - -​ 该函数用于将数据发送到Socket。该Socket不应连接到远程Socket,因为目标Socket是由address指定的。 - -函数原型 - -``` -sock.sendto(bytes, address) -``` - -参数 - -bytes: -缓存buffer,存放bytes型数据。 - -address: - -包含地址和端口号的元组或列表。 - -返回值 - -无。 - - - -**sock.recvfrom** - -​ 该函数用于从Socket接收数据。返回一个元组,包含字节对象和地址。 - -函数原型 - -``` -socket.recvfrom(bufsize) -``` - -参数 - -bufsize: -接收的缓存数据。 - -返回值 - -返回一个元组,包含字节对象和地址,形式为:(bytes, address)。 - -bytes: -接收数据的字节对象。 - -address: - -发送数据的Socket的地址。 - - - -**sock.setsockopt** - -​ 该函数用于设置socket选项的值。 - -函数原型 - -``` -socket.setsockopt(level, optname, value) -``` - -参数 - -level: -socket选项级别。 - -optname: -socket选项。 - -value: -既可以是一个整数,也可以是一个表示缓冲区的bytes类对象。 - -返回值 - -无。 - - - -**sock.setblocking** - -​ 该函数用于设置Socket为阻塞模式或者非阻塞模式。如果flag为false,则将Socket设置为非阻塞模式,否则设置为阻塞模式。 - -函数原型 - -``` -socket.setblocking(flag) -``` - -参数 - -flag: -Ture 阻塞模式 -False 非阻塞模式 - -返回值 - -无。 - - - -**sock.settimeout** - -​ 该函数用于设置Socket的超时时间,单位:秒。 - -函数原型 - -``` -socket.settimeout(value) -``` - -参数 - -value: - 可以是秒的非负浮点数,也可以是None。如果将其设置为一个非零值,OSError在该操作完成之前已超过超时时间值,则随后的Socket操作将引发异常;如果将其设置为零,则将Socket置于非阻塞模式。如果未指定该值,则Socket将处于阻塞模式。 - -返回值 - -无。 - - - -**Socket.makefile** - -​ 该函数用于生成一个文件与socket对象关联,之后即可像读取普通文件一样使用socket。(普通文件的操作有open和write等。) - -函数原型 - -``` -socket.makefile(mode='rb')、 -``` - -参数 - -mode: -二进制模式(rb和wb)。 - -返回值 - -返回与套接字关联的文件对象。 - - - -#### Socket功能实现 - -​ 为了使用户更清楚的了解Socket功能,本章节提供了一个在QuecPython上创建Socket的实例,即模拟浏览器访问web服务器获取网页内容。首先在Xshell中,连接模块主串口,进入交互界面,然后按如下步骤实现Socket功能: - -1. 导入usocket模块,创建一个Socket实例: - - ``` - import usocket - sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) - ``` - - ![](media/sbs_socket_picture1.jpg) - -2. 解析域名 - - ``` - sockaddr=usocket.getaddrinfo('www.tongxinmao.com',80)[0][-1] - ``` - - ​ 将主机域名(host)和端口(port)转换为用于创建Socket的 5 元组序列,元组结构如下: - -(family, type, proto, canonname, sockaddr) - -![](media/sbs_socket_picture2.jpg) - -3. 建立与服务端的连接: - - ``` - sock.connect(sockaddr) - ``` - -![](media/sbs_socket_picture3.jpg) - -4. 向服务端发送消息: - - ``` - ret=sock.send('GET /News HTTP/1.1\r\nHost: www.tongxinmao.com\r\nAccept-Encoding:deflate\r\nConnection: keep-alive\r\n\r\n') - print('send %d bytes' % ret) - ``` - - ![](media/sbs_socket_picture4.jpg) - -5. 接收服务端的消息: - - ``` - data=sock.recv(1024) - print('recv %s bytes:' % len(data)) - print(data.decode()) - ``` - - ![](media/sbs_socket_picture5.jpg) - - ​ 服务端消息接收完成后,可在浏览器上发起请求,验证返回消息是否与Socket接收的消息一致,如下所示: - - ![](media/sbs_socket_picture6.jpg) - -6. 关闭连接: - - ``` - sock.close() - ``` - - ![](media/sbs_socket_picture7.jpg) - - ​ 以上部分代码可见于移远通信提供的SDK工具包中,路径为moudles/socket/example_socket.py,也可通过example模块来执行该脚本文件。 - - - - usocket服务端功能实现代码如下图: - -```python -#导入usocket模块 -import usocket - -#创建一个socket实例 -sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) -#设置端口复用 -sock.setsockopt(usocket.SOL_SOCKET, usocket.SO_REUSEADDR, 1) - -sock.bind(('127.0.0.1', 6000)) - -sock.listen(50) - -sock.close() - -while True: - newSock, addr = sock.accept() - newSock.send('hello world') - recv_data = newSock.recv(256) - print(recv_data.decode()) - newSock.close() - break -``` - -#### 附录 - -表 1 :术语缩写 - -| **缩写** | **英文全称** | **中文全称** | -| -------- | --------------------------------- | ---------------- | -| API | Application Programming Interface | 应用程序编程接口 | -| HTTP | Hyper Text Transfer Protocol | 超文本传输协议 | -| SDK | Software Development Kit | 软件开发工具包 | -| TCP | Transmission Control Protocol | 传输控制协议 | -| IPv4 | Internet Protocol version 4 | 第 4 版互联网协议| -| NIC | Network Interface Controller | 网络接口控制器 | -|BSD | Berkeley Socket Berkeley |套接字 | - diff --git a/docs/sbs/zh/sbs/tencentyun.md b/docs/sbs/zh/sbs/tencentyun.md deleted file mode 100644 index aaba4921571043ac2ae0809e91390db715125830..0000000000000000000000000000000000000000 --- a/docs/sbs/zh/sbs/tencentyun.md +++ /dev/null @@ -1,149 +0,0 @@ -### 接入腾讯云应用 开发指导 - -物联网平台为设备提供安全可靠的连接通信能力,向下连接海量设备,支撑设备数据采集上云;向上提供云端 API,服务端通过调用云端 API 将指令下发至设备端,实现远程控制。物联网平台也提供了其他 连接 管理能力,如设备管理、规则引擎 、安全能力等,为各类IoT场景和行业开发者赋能。 - -- 腾讯云物联网平台文档: [https://cloud.tencent.com/document/product/634 ](https://cloud.tencent.com/document/product/634) -- 腾讯云物联网平台管理: [https://console.cloud.tencent.com/iothub ](https://console.cloud.tencent.com/iothub/product/U2D3JII78Y/log) - -开发者可以登录如上网址进一步了解该物联网平台及设备接入相关知识。 - - - -#### 创建产品与设备 - -步骤 **1**: 登录腾讯云物联网平台( [https://console.cloud.tencent.com/iothub),](https://console.cloud.tencent.com/iothub)显示界面如下: - -![Quectel_sbs_tencent_Iot_plat_014.png](media/Quectel_sbs_tencent_Iot_plat_014.png) - -​ 图 **1** : 腾讯云登录界面 - -步骤 **2**: 点击“ 创建新产品 ,” 新建一个产品名称并选择“ 密匙认证 ”及“ 自定义 ”数据格式,如下图 - -所示: - -![Quectel_sbs_tencent_Iot_plat_015.png](media/Quectel_sbs_tencent_Iot_plat_015.png) - -​ 图**2** : 新建产品 - -步骤 **3**: 点击“ 确定 ,将” 出现下图产品列表界面: - -![Quectel_sbs_tencent_Iot_plat_016.png](media/Quectel_sbs_tencent_Iot_plat_016.png) - -​ 图 **3** : 产品列表 - -步骤 **4**: 进入产品管理,出现如 下图所示的 设备列表界面: - -![Quectel_sbs_tencent_Iot_plat_017.png](media/Quectel_sbs_tencent_Iot_plat_017.png) - -​ 图 **4**: 设备列表界面 - -步骤 **5**: 依次点击“ 设备列表 、”“ 添加新设备 ,”开始新建设备名称及密钥,设置后点击“ 保存 ,”如下 - -图所示: - -![Quectel_sbs_tencent_Iot_plat_018.png](media/Quectel_sbs_tencent_Iot_plat_018.png) - -​ 图 **5**: 创建新设备 - -步骤 **6**: 创建新设备后,将出现创建成功界面提示,详情如下: - -![Quectel_sbs_tencent_Iot_plat_019.png](media/Quectel_sbs_tencent_Iot_plat_019.png) - -​ 图 **6**: 设备创建成功提示 - -步骤 **7**: 点击上图中的“ 开始管理设备 ,” 进入设备详细信息界面,如下图所示: - -![Quectel_sbs_tencent_Iot_plat_020.png](media/Quectel_sbs_tencent_Iot_plat_020.png) - -​ 图 **7**: 设备详情页面 - -步骤 **8**: 复制并保存设备密钥和 client id 等信息,如下图所示 - -![Quectel_sbs_tencent_Iot_plat_021.png](media/Quectel_sbs_tencent_Iot_plat_021.png) - -​ 图 **8**: 设备密钥 - -步骤 **9**: 进入“ 权限列表'' ,可以查阅 相关发布订阅的 Topic,如下图所示: - -![Quectel_sbs_tencent_Iot_plat_022.png](media/Quectel_sbs_tencent_Iot_plat_022.png) - -​ 图 **9**: topic列表 - -#### 编写腾讯云测试程序 - -步骤 **1**: 将开发板接入电脑 。接入后的操作方法详见《 Quectel_QuecPython_基础操作说明》。 - -![Quectel_sbs_tencent_Iot_plat_023.png](media/Quectel_sbs_tencent_Iot_plat_023.png) - -​ 图 **10**:开发板接入电脑 - -步骤 **2**: 创建 *test.py* 文件,编写以下代码,并将 第 ***3.1*** 章 保存的相关参数填充至代码中,如下所示: - -```python -from TenCentYun import TXyun - -productID = "U2D3JII78Y" # 产品标识 -devicename = "dev1" # 设备名称 -devicePsk = "p2h/OlKGnOPMdugNTGAFrg==" # 设备密钥(一型一密认证此参数传入 None) ProductSecret = None # 产品密钥(一机一密认证此参数传入 None) - -tenxun = TXyun(productID, devicename, devicePsk, ProductSecret) # 创建连接对象 - -def sub_cb(topic, msg): # 云端消息响应回调函数 - print("subscribe recv:") - print(topic, msg) - -tenxun.setMqtt() -tenxun.setCallback(sub_cb) -topic_sub = "U2D3JII78Y/dev1/control" # 输入订阅 Topic -topic_pub = "U2D3JII78Y/dev1/event" # 输入发布 Topic -tenxun.subscribe(topic_sub) -tenxun.publish(topic_pub, "hello world") -tenxun.start() -``` - -步骤 **3**: 将 test.py 文件上传到开发板,上传方法详见《 Quectel_QuecPython_基础操作说明 》。 - -步骤 **4**: 在 EC100Y-CN 开发板运行 *test.py* 文件,如下图所示: - -![Quectel_sbs_tencent_Iot_plat_025.png](media/Quectel_sbs_tencent_Iot_plat_025.png) - -​ 图 **11**:运行 **test.py** 文件 - -#### 订阅腾讯云服务器消息 - -步骤 **1**: 打开腾讯云设备的“在线调试”页面,选择如图所示 Topic,在“消息内容”框中输入任意内 - -容后点击“ 发送消息 ,如” 下图所示: - -![Quectel_sbs_tencent_Iot_plat_026.png](media/Quectel_sbs_tencent_Iot_plat_026.png) - -​ 图 **12**:编写消息内容 - -步骤 **2**: 设备端将接收到腾讯云发送的订阅消息,如下图所示: - -![Quectel_sbs_tencent_Iot_plat_027.png](media/Quectel_sbs_tencent_Iot_plat_027.png) - -​ 图 **13**:设备订阅消息接收界面 - -#### 设备向腾讯云发布消息 - -打开腾讯云的“ 产品列表 ”依次点击“设备管理” --> “云日志” -->“行为日志” ,可以查看设备侧向腾讯云平台发布的消息,如下图所示: - -![Quectel_sbs_tencent_Iot_plat_028.png](media/Quectel_sbs_tencent_Iot_plat_028.png) - -​ 图 **14**:腾讯云接收到设备发布消息 - -#### 附录A参考文档及术语缩写 - -表 **1**:参考文档 - -| 序号 | 文档名称 | 备注 | -| ---- | ------------------------------- | --------------------------- | -| [1] | Quectel_QuecPython_基础操作说明 | QuecPython 上传下载文件说明 | - -表 **2**:术语缩写 - -| 术语 | 英文全称 | 中文全称 | -| ---- | --------------------------------- | ---------------- | -| API | Application Programming Interface | 应用程序编程接口 | -| IoT | Internet of Things | 物联网 | \ No newline at end of file diff --git a/docs/sbs/zh/sbs/thread.md b/docs/sbs/zh/sbs/thread.md deleted file mode 100644 index d45e97446f3d858fd729fab56337650f5d2faad9..0000000000000000000000000000000000000000 --- a/docs/sbs/zh/sbs/thread.md +++ /dev/null @@ -1,194 +0,0 @@ -### 多线程 应用开发指导 - -#### 多线程/进程的基本概念 - -Python 运行在 Python 虚拟机中,用户创建的多线程只是在 Python -虚拟机中的虚拟线程,而非在操作系统中的真正的线程。也就是说,Python -中的多线程是由 Python 虚拟机来进行轮询调度,而不是操作系统。 - -多线程可以使同一程序同时执行多个任务。线程在执行过程中与进程存在区别,在每个独立的线程中,都分别存在程序运行的入口、顺序执行序列以及程序的出口。并且线程必须依附在某个程序中,由程序来控制多个线程的运行。 - -**线程的基本操作** - -> 线程具有 5 种状态,状态转换的过程如下: - -![5b584fb5c2b36cb7e057ae95d87b295e](media/5b584fb5c2b36cb7e057ae95d87b295e.png) - -> 图 **1**:线程的 **5** 种状态 - -**线程和进程的主要区别** - -线程和进程都是操作系统控制程序运行的基本单位,系统可以利用这两个特性对程序实现高并发。而线程和进程的主要区别如下: - -1. 一个程序至少有一个进程;一个进程中至少包含一个线程。 - -2. 进程在内存中拥有独立的存储空间,而多个线程则共享它所依赖的进程的存储空间。 - -3. 进程和线程对操作系统的资源管理的方式不同。 - -#### 多线程 **API** 详解 - -**_thread.allocate_lock** - -> 该函数用于创建一个互斥锁对象。 - -- 函数原型 - - _thread.allocate_lock() - -- 参数 - - 无 - - 返回值 - - 返回互斥锁对象。互斥锁对象的函数详见第**3.1.1**章。 - -**互斥锁对象函数** - -**lock.acquire** - -> 该方法用于获取锁。 - -- 函数原型 - - lock.acquire() - -- 参数 - - 无 - -- 返回值 - -True 成功 - -> False 失败 - -**lock.release** - -> 该方法用于释放锁。 - -- 函数原型 - - lock.release() - -- 参数 - - 无 - -- 返回值 - - 无 - -**lock.locked** - -> 该方法用于返回锁的状态。 - -- 函数原型 - - lock.locked() - -- 参数 - - 无 - -- 返回值 - -True 表示被某个线程获取 - -> False 表示没有被线程获取 - -**_thread.get_ident** - -> 该方法用于获取当前线程号。 - -- 函数原型 - - _thread.get_ident() - -- 参数 - - 无 - -- 返回值 - - 返回当前线程号。 - -**_thread.stack_size** - -> 该方法用于设置创建新线程使用的堆栈大小。单位:字节。 - -- 函数原型 - - _thread.stack_size(size) - -- 参数 - - *size*:堆栈大小。默认值:8192。 - -- 返回值 - - 返回当前堆栈大小。 - -**_thread.start_new_thread** - -> 该方法用于创建一个新线程。 - -- 函数原型 - - _thread.start_new_thread(function, args) - -- 参数 - - *function*: - - 接收执行函数 - - *args*: - - 被执行函数参数 - -- 返回值 - - 无 - -#### 多线程使用示例 - -> 步骤**1**: -> 将开发板接入电脑。接入后的操作方法详见《Quectel_QuecPython_基础操作说明》。 - -> ![](media/782cd2c870c62e6f022cca4e47c7c806.jpg) - -> 图 **2**:开发板接入电脑 - -> 步骤**2**: 创建 *test.py* 文件,在文件内导入 QuecPython 中的_thread -> 模块,编写多线程代码。 - -```python -import _thread - -def th_func(thread_id): - - Print("thread id is:%d" % thread_id) - -for i in range(5): - - _thread.start_new_thread(th_func,(i+1,)) -``` - - - -> 步骤**3**: 将 test.py -> 文件上传到开发板,上传方法详见《Quectel_QuecPython_基础操作说明》。 - -> 步骤**4**: 程序运行结果,如图所示: - -![](media/e2d4afc1ebb0f7d9ad420489f74da40d.jpg) - -#### 附录参考文档 - -> 表 **1**:参考文档 - -| 序号 | 文档名称 | 备注 | -| ---- | ------------------------------- | --------------------------- | -| [1] | Quectel_QuecPython_基础操作说明 | QuecPython 上传下载文件说明 | \ No newline at end of file diff --git a/docs/sbs/zh/sbs/timer.md b/docs/sbs/zh/sbs/timer.md deleted file mode 100644 index 6f5bc275bc8f0cf12728d22eda64496b0699b582..0000000000000000000000000000000000000000 --- a/docs/sbs/zh/sbs/timer.md +++ /dev/null @@ -1,151 +0,0 @@ -### 定时器 使用指导 - -#### 定时器功能 - -**定时器基本功能** - -定时器可用于多种任务。目前,仅实现了最简单的情况,即定时调用函数,当前移远通信提供的定时器可实现单次和周期性调用函数两种模式。当到达定时器周期时,会触发事件。通过使用回调函数,定时器事件可调用一个Python 函数。 - -**定时器功能示例** - -将开发板接入电脑,之后,参考《Quectel_QuecPython_基础操作说明》文档进行操作,下面以 -EC100Y-CN 模块为例进行说明。 - -![](media/782cd2c870c62e6f022cca4e47c7c806.jpg) - -> 图 **1**:模块接入电脑 - -> 创建 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### - - ###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.ONE_SHOT | 单次模式,定时器只执行一次 | -| Timer.PERIODIC | 周期模式,定时器循环执行 | - -#### Timer 类中的方法 - -**timer = Timer** - -> 该函数用于创建一个 timer 对象。使用定时器相关函数 *timer.start* 和 -> *timer.stop* 之前,需先使用该函数 - -> 实例化对象,即创建 Timer 对象。 - -- 函数原型 - - timer = Timer(Timern) - -- 参数 - - *Timern*:常量。定时器号。EC100Y-CN 和 EC600S-CN - 模块支持的定时器为:Timer0~Timer3。 ⚫ 返回值 - - 返回 timer 对象。 - -**timer.start** - -> 该函数用于启动定时器。 - -- 函数原型 - - timer.start(period, mode, callback) - -- 参数 - - *period*:整型。中断周期,单位:毫秒。 - - *mode*: - - 常量。定时器运行模式,如下: - - Timer.ONE_SHOT 单次模式,定时器只执行一次 - - Timer.PERIODIC 周期模式,循环执行 - - *callback*: 回调函数,定时执行的函数。 - -- 返回值 - - 0 定时器启动成功。 -1 定时器启动失败。 - -**timer.stop** - -> 该函数用于关闭定时器。 - -- 函数原型 - - timer.stop() - -- 参数 - - 无。 - -- 返回值 - - 0 定时器关闭成功。 -1 定时器关闭失败。 - - -#### 附录 - -> 表 **1**:术语缩写 - -| 术语 | 英文全称 | 中文全称 | -| ---- | --------------------------------- | ---------------- | -| API | Application Programming Interface | 应用程序编程接口 | - diff --git a/docs/sbs/zh/sbs/tts.md b/docs/sbs/zh/sbs/tts.md deleted file mode 100644 index 4783fa505524ff1ad71d9b2b9ea514f7c3c13db1..0000000000000000000000000000000000000000 --- a/docs/sbs/zh/sbs/tts.md +++ /dev/null @@ -1,267 +0,0 @@ -### TTS 使用指导 - -#### 概述 - -TTS 是 Text To Speech的缩写,即“从文本到语音”,是人机对话的一部分,让机器能够说话。它是同时运用语言学和心理学的杰出之作,在内置芯片的支持之下,通过神经网络的设计,把文字智能地转化为自然语音流。TTS技术对文本文件进行实时转换,转换时间之短可以秒计算。在其特有智能语音控制器作用下,文本输出的语音音律流畅,使得听者在听取信息时感觉自然,毫无机器语音输出的冷漠与生涩感。在使用开发板的TTS 模块功能之前我们需要先了解模块的 Audio 接口,如下图(以 EC100Y-CN模块为例): - -![](media/35b9112bf62d5cc4a417eb4190b0a979.jpg) - -> 图 **1**:**EC100Y-CN** 模块 **Audio** 接口 - -> 连接 3.5mm 音频接口后按照《Quectel-QuecPython-Cat1开发板使用说明》进行驱动下载和固件安装。 - -#### TTS API 详解 - -> 本章节介绍 TTS 相关 API。 - -**tts = audio.TTS** - -> 该函数用于导入音频(audio)库并创建 TTS 对象。 - -- 函数原型 - - import audio - - tts = audio.TTS(device) - -- 参数 - - *device*: - - 表示设备类型,取值如下: - -1. 话筒 - -2. 耳机 - -3. 喇叭 - -> ⚫ 返回值 - -> 无。 - -**tts.play** - -> 该函数用于播放语音。 - -- 函数原型 - - tts.play(priority, breakin, mode, str) - -- 参数 - - *priority*:整型。播放优先级,支持优先级 0~4,数值越大优先级越高。 - - *breakin*:整型。打断模式,0 表示不允许被打断,1 表示允许被打断。 - - *mode*: - - 整型。编码模式: - -1. UNICODE16 (Size end conversion) - -2. UTF-8 - -3. UNICODE16 (Don't convert) - - *str*:字符串。待播放字符串。 - - ⚫ 返回值 - -0 播放成功 - -> -1 播放失败 - -> 1 无法立即播放,加入播放队列 - --2 无法立即播放,且该请求的优先级组队列任务已达上限,无法加入播放队列备注 - -> 支持优先级 0~4,数字越大优先级越高,每个优先级组可同时最多加入 10 -> 个播放任务,播放队列策略见 - -> 《Quectel QuecPython 类库 API 说明》。 - -**tts.setSpeed** - -> 该函数用于设置播放速度。 - -- 函数原型 - - tts.setSpeed(speed) - -- 参数 - - *speed*:整型。播放速度,范围:0~9。值越大,速度越快。 - -- 返回值 - - 设置成功返回当前播放速度,失败返回整型-1。 - -**tts.setVolume** - -> 该函数用于设置播放音量。 - -- 函数原型 - - tts.setVolume(vol) - -- 参数 - - *vol*:整型。播放音量。范围:0~9,0 表示静音。 - -- 返回值 - - 设置成功返回当前音量,失败返回整型-1。 - -**tts.getSpeed** - -> 该函数用于获取当前播放速度。 - -- 函数原型 - - tts.getSpeed() - -- 参数 - - 无。 - -- 返回值 - - 成功返回当前播放速度,失败返回整型-1。 - -**tts.getVolume** - -> 该函数用于获取播放音量。 - -- 函数原型 - - tts.getVolume() - -- 参数 - - 无。 - -- 返回值 - - 成功返回当前播放音量,失败返回整型-1。 - -**tts.getState** - -> 该函数用于获取当前播放状态。 - -- 函数原型 - - tts.getState() - -- 参数 - - 无。 - -- 返回值 - -1. 当前无 TTS 播放 - -2. 当前有 TTS 正在播放 - -**tts.stop** - -> 该函数用于暂停播放。 - -- 函数原型 - - tts.stop() - -- 参数 - -> 无。 - -- 返回值 - -0 暂停播放成功 - -> -1 暂停播放失败 - -**tts.close** - -> 该函数用于关闭 TTS 功能。 - -- 函数原型 - - tts.close() - -- 参数 - - 无。 - -- 返回值 - -0 关闭 TTS 成功 - -> -1 关闭 TTS 失败 - -#### TTS 功能实现 - -**命令行执行** - -1. 通过 Xshell - 连接开发板主串口后按以下步骤执行,通过以下函数导入音频(audio)库并创建 TTS - 对象: - - import audio tts = audio.TTS(device) - -![](media/cd4fe22a5b5b1c9a1ecad743187c1d14.jpg) - -1. 使用以下函数播放语音: - - tts.play(priority, breakin, mode, str) - -![](media/9c3b369e3dc8b4f7b157861383dbbfac.jpg) - -![](media/ca8b43ce1e9c9364ba50d7a744f72b71.jpg) - -1. 此时可在耳机中听到播放文本内容的语音,可通过 *tts.setSpeed(speed)*和 - *tts.setVolume(vol)*来设置播放速度和播放音量。 - -![](media/d2cef6ba0685ea8f9fe2095c6e1ef9f9.jpg) - -1. 通过 *tts.getSpeed()*和 - *tts.getVolume()*来获取当前播放速度和音量。另外,可通过 - *tts.getState()*来获取当前播放状态。 - -![](media/dbb0d91af354b1481829d37270a36e0b.jpg) - -1. 播放过程中可通过 *tts.stop()*来暂停播放。播放完成后可通过 *tts.close()*关闭 - TTS 功能。 - -![](media/7a5e31394f4d29cc26626c279cc933fe.jpg) - -**执行 py 文件** - -1. 首先在提供的 SDK 工具包中进入 demo 目录,找到 TTS 文件夹,通过 QPYcom 工具将 - TTS 目录下的 example_tts.py - 脚本文件发送到模块中,脚本文件发送和执行具体步骤,参见《QPYcom - 工具使用说明》。 - -![](media/139025156eadcb1ec370ba48b610e43e.jpg) - -1. 在 Xshell 中,连接模块主串口,进入交互界面,通过 - *uos.listdir()*方法确认上一步骤发送的脚本文件是否在当前目录下,然后执行如下步骤: - -![](media/85a947dbbd4ec41cb30a42b2a0e60a70.jpg) - -通过 import example 导入 example 模块,该模块提供了 *exec()*方法用来执行 python -脚本程序,通过 *example.exec(‘example.tts.py’)*来执行 example.tts.py -脚本,执行完成后即可在耳机中听到播放脚本中文本内容的语音。 - -#### 附录 - -> 表 **1**:术语缩写 - -| 术语 | 英文全称 | 中文全称 | -| ------- | ------------------------------------------------------ | ------------------------------- | -| API | Application Programming Interface | 应用程序编程接口 | -| LTE | Long Term Evolution | 长期演进 | -| SDK | Software Development Kit | 软件开发工具包 | -| TTS | Text To Speech | 从文本到语音 | -| UNICODE | Unicode | 统一码 | -| UTF | Universal Character Set/Unicode Transformation Format | 针对 Unicode 的可变长度字符编码 | \ No newline at end of file diff --git a/docs/sbs/zh/sidebar.yaml b/docs/sbs/zh/sidebar.yaml index 0d5ff13e2b708ae76c9da22067fb3b73f14bf8d6..bd77d5b16f24bbfa456db2440fdbc431192c22d2 100644 --- a/docs/sbs/zh/sidebar.yaml +++ b/docs/sbs/zh/sidebar.yaml @@ -2,37 +2,47 @@ items: - label: 基础操作说明 file: README.md + - label: BSP + items: + - label: UART开发 + file: BSP/UART.md + - label: GPIO及中断开发 + file: BSP/GPIO.md + - label: I2C总线开发 + file: BSP/I2C.md + - label: PWM开发 + file: BSP/PWM.md + - label: ADC采样开发 + file: BSP/ADC.md + - label: SPI总线开发 + file: BSP/SPI.md - label: 网络应用 items: - - label: Socket编程 - file: sbs/socket.md - - label: MQTT客户端开发 - file: sbs/mqtt.md - - label: HTTP客户端开发 - file: sbs/http.md + - label: dataCall数据拨号 + file: QuecPythonWirelessNetwork/DataCall.md + - label: SIM卡功能开发 + file: QuecPythonWirelessNetwork/sim.md + - label: cellLocator基站定位 + file: QuecPythonWirelessNetwork/cellLocator.md - label: NTP应用开发 - file: sbs/ntp.md - - label: 系统 + file: QuecPythonWirelessNetwork/ntp.md + - label: 平台 items: - - label: 文件读写使用说明 - file: sbs/file.md - - label: 多线程应用开发指导 - file: sbs/thread.md - - label: 总线使用指导 - file: sbs/bus.md - - label: 定时器使用指导 - file: sbs/timer.md - - label: 应用 + - label: modem使用指导 + file: QuecPythonPlatform/modem_get_dev_info.md + - label: FOTA固件升级用户指导 + file: QuecPythonPlatform/FOTA_binary_upgrade.md + - label: 音频开发 + file: QuecPythonPlatform/Audio.md + - label: 多线程&消息队列 + items: + - label: 多线程开发 + file: Thread/thread.md + - label: 消息队列开发 + file: Thread/queue.md + - label: 系统 items: - - label: GPS使用指导 - file: sbs/gps.md - - label: NTP使用指导 - file: sbs/ntp.md - - label: Audio使用指导 - file: sbs/audio.md - - label: TTS使用指导 - file: sbs/tts.md - - label: LCD使用指导 - file: sbs/lcd.md - - label: Record录音使用指导 - file: sbs/record.md + - label: json解析 + file: QuecPythonSys/json.md + - label: 文件系统应用指导 + file: QuecPythonSys/filesystem.md \ No newline at end of file diff --git a/docs/sbs/zh/thread/code/Qp_thread_exit.py b/docs/sbs/zh/thread/code/Qp_thread_exit.py new file mode 100644 index 0000000000000000000000000000000000000000..55e4a63bb4a18e950147996c789806367d368eaa --- /dev/null +++ b/docs/sbs/zh/thread/code/Qp_thread_exit.py @@ -0,0 +1,24 @@ +import _thread as thread +import utime as time + +exited = False + + +def th_func(thread_id, delay): + global exited + print("thread:{} delay {}".format(thread_id, delay)) + time.sleep_ms(delay) + exited = True + + +def main(): + print("线程传递多个参数测试") + # for i in range(5): + thread.start_new_thread(th_func, (1, 2000)) + # 等待所有子线程回收 + while exited is False: + time.sleep_ms(100) + print("等待线程退出") + + +main() diff --git a/docs/sbs/zh/thread/code/Qp_thread_trans_mutil_args.py b/docs/sbs/zh/thread/code/Qp_thread_trans_mutil_args.py new file mode 100644 index 0000000000000000000000000000000000000000..5f563274fb34101201a343e0324c8f04f57728c0 --- /dev/null +++ b/docs/sbs/zh/thread/code/Qp_thread_trans_mutil_args.py @@ -0,0 +1,18 @@ +import _thread as thread +import utime as time + + +def th_func(thread_id, delay): + print("thread:{} delay {}".format(thread_id, delay)) + time.sleep_ms(delay) + + +def main(): + print("线程传递多个参数测试") + for i in range(5): + thread.start_new_thread(th_func, (i + 1, 2)) + # 等待所有子线程回收 + time.sleep_ms(100) + + +main() diff --git a/docs/sbs/zh/thread/code/example_thread_file.py b/docs/sbs/zh/thread/code/example_thread_file.py new file mode 100644 index 0000000000000000000000000000000000000000..c7c4fdfeed2286e8f4527486dd9a2389bb475856 --- /dev/null +++ b/docs/sbs/zh/thread/code/example_thread_file.py @@ -0,0 +1,53 @@ +import _thread +import utime +import log +from machine import UART + +# 设置日志输出级别 +log.basicConfig(level=log.INFO) +uart_log = log.getLogger("Thread") + +state = 1 +msglen = 0 +count = 10 +uart = UART(UART.UART2, 115200, 8, 0, 1, 0) + +def uartwrite(): + global count + while count: + write_msg = "Quectel count={}".format(count) # 发送数据 + uart.write(write_msg) + uart_log.info("write msg :{}".format(write_msg)) + utime.sleep(1) + count -= 1 + if count == 0: + break + uart_log.info("uartWrite end!") + +def uartread(): + global state + global msglen + while 1: + utime.sleep_ms(10) + msgLen = uart.any() # 返回是否有可读取的数据长度 + if msgLen: + msg = uart.read(msgLen) # 当有数据时进行读取 + utf8_msg = msg.decode() # 初始数据是字节类型(bytes),将字节类型数据转STR + uart_log.info("uartread msg: {}".format(utf8_msg)) + state = 0 + break + else: + continue + +def run(): + _thread.start_new_thread(uartread, ()) # 创建一个线程来监听接收uart消息 + _thread.start_new_thread(uartwrite, ()) + + +if __name__ == "__main__": + run() + while 1: + if state: + pass + else: + break \ No newline at end of file diff --git a/docs/sbs/zh/thread/media/Qp_sbs_thread_01.png b/docs/sbs/zh/thread/media/Qp_sbs_thread_01.png new file mode 100644 index 0000000000000000000000000000000000000000..4b614d50ff2222380818b57025050312fa306418 Binary files /dev/null and b/docs/sbs/zh/thread/media/Qp_sbs_thread_01.png differ diff --git a/docs/sbs/zh/thread/media/Qp_sbs_thread_02.jpg b/docs/sbs/zh/thread/media/Qp_sbs_thread_02.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a01fae2f06d95e1e8551edd323e2c83be0b51928 Binary files /dev/null and b/docs/sbs/zh/thread/media/Qp_sbs_thread_02.jpg differ diff --git a/docs/sbs/zh/thread/media/_thread_01.jpg b/docs/sbs/zh/thread/media/_thread_01.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9d74d16a7a2fe91c1cccfae52a43f0f404ec20ee Binary files /dev/null and b/docs/sbs/zh/thread/media/_thread_01.jpg differ diff --git a/docs/sbs/zh/thread/media/_thread_02.png b/docs/sbs/zh/thread/media/_thread_02.png new file mode 100644 index 0000000000000000000000000000000000000000..7e383ac56a31aace1d39e8894a2dfab26016da6b Binary files /dev/null and b/docs/sbs/zh/thread/media/_thread_02.png differ diff --git a/docs/sbs/zh/thread/media/_thread_03.png b/docs/sbs/zh/thread/media/_thread_03.png new file mode 100644 index 0000000000000000000000000000000000000000..1926877555c918027285bccf412612a9f1bd4436 Binary files /dev/null and b/docs/sbs/zh/thread/media/_thread_03.png differ diff --git a/docs/sbs/zh/thread/media/filesystem_01.jpg b/docs/sbs/zh/thread/media/filesystem_01.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1931c71147c5b749bd3c5dbbd505cc2109547ebd Binary files /dev/null and b/docs/sbs/zh/thread/media/filesystem_01.jpg differ diff --git a/docs/sbs/zh/thread/queue.md b/docs/sbs/zh/thread/queue.md new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/docs/sbs/zh/thread/thread.md b/docs/sbs/zh/thread/thread.md new file mode 100644 index 0000000000000000000000000000000000000000..082c47a4bf31fcf9b8e0a5e5b8cb2efc5fc49892 --- /dev/null +++ b/docs/sbs/zh/thread/thread.md @@ -0,0 +1,137 @@ +## 修订历史 + +| Version | Date | Author | Change expression | +| ------- | ---------- | ---------- | ----------------- | +| 1.0 | 2021-09-16 | David.Tang | Initial version | + +## 前言 + +本文以EC600U-CN为例介绍如何使用QuecPython的多线程功能。几乎所有操作系统均支持进程(Process)概念,操作系统中正在运行中的任务一般对应一个进程。当一个程序进入内存运行时,即变成一个进程。多线程扩展了多进程的概念,使得同一个进程可以同时并发处理多个任务。线程(Thread)也被称作轻量级进程(Lightweight Process),线程是进程的执行单元。类似进程在操作系统中的地位,线程在程序中是独立的、并发的执行流。 + +## 硬件描述 + +线程是软件层面的功能实现,硬件方面只需要足够的内存即可,此处不再赘述。 + +## 软件设计 + +thread 模块提供创建新线程的方法,并提供互斥锁,具体的功能介绍见:[_thread](https://python.quectel.com/wiki/#/zh-cn/api/pythonStdlib?id=_thread-%e5%a4%9a%e7%ba%bf%e7%a8%8b) + +## 交互操作 + +使用QPYcom工具和EC600S-CN进行交互,具体如下截图。 + +```python +>>> import _thread +>>> _thread.get_ident() +2126467632 +>>> _thread.get_heap_size() +748032 +>>> lock = _thread.allocate_lock() +>>> lock.acquire() +True +>>> lock.locked() +True +>>> lock.release() +>>> lock.locked() +False +``` + +注意: + +1. import _thread即为让 _thread模块在当前空间可见。 + +2. 只有import _thread模块,才能使用 _thread内的函数和变量。 + +## 下载验证 + +### 软件代码 + +配套demo的参考代码为文档同目录下的example_thread_file.py文件。下载example_thread_file.py文件到EC600U-CN并运行,代码如下: + +```python +import _thread +import utime +import log +from machine import UART + +# 设置日志输出级别 +log.basicConfig(level=log.INFO) +uart_log = log.getLogger("Thread") + +state = 1 +msglen = 0 +count = 10 +uart = UART(UART.UART2, 115200, 8, 0, 1, 0) + +def uartwrite(): + global count + while count: + write_msg = "Quectel count={}".format(count) # 发送数据 + uart.write(write_msg) + uart_log.info("write msg :{}".format(write_msg)) + utime.sleep(1) + count -= 1 + if count == 0: + break + uart_log.info("uartWrite end!") + +def uartread(): + global state + global msglen + while 1: + utime.sleep_ms(10) + msgLen = uart.any() # 返回是否有可读取的数据长度 + if msgLen: + msg = uart.read(msgLen) # 当有数据时进行读取 + utf8_msg = msg.decode() # 初始数据是字节类型(bytes),将字节类型数据转STR + uart_log.info("uartread msg: {}".format(utf8_msg)) + state = 0 + break + else: + continue + +def run(): + _thread.start_new_thread(uartread, ()) # 创建一个线程来监听接收uart消息 + _thread.start_new_thread(uartwrite, ()) + + +if __name__ == "__main__": + run() + while 1: + if state: + pass + else: + break + +``` + +### 硬件连接 + +通过type-c接口给EC600U-CN供电,UART与TTL转USB模块的连接如下表(仅供参考): + +| EC600U模组_PIN脚 | EC600U_QuecPython_EVB_V1.3 | TTL转USB模块 | +| :--------------: | :------------------------: | :----------: | +| PIN31 | J5_PIN9 | Tx | +| PIN32 | J5_PIN8 | Rx | +| / | GND | GND | + +硬件连接展示图如下所示: + +![_thread_01](media/_thread_01.jpg) + +### 运行效果 + +(1)打开QPYcom运行example_thread_file.py,如下图: + +![_thread_02](media/_thread_02.png) + +(2)由于两个线程同时进行,故UART写数据的同时,可向EC600U-CN串口发送数据(如下只表示读写的同时进行,但是具体的log输出顺序取决于手动发送的时间)。如下是在EC600U-CN写数据的第三和第四间隙,通过TTL转USB向EC600U-CN发送“QuecPython”。 + +![_thread_03](media/_thread_03.png) + +## 配套代码 + + + +下载代码 + diff --git a/pages/index/en/README.md b/pages/index/en/README.md index 463825416d6f9d54bb27d275f20ad0e0cb9eb6d1..c5f1491e8647fc578c646ec5925f88d4676613b8 100644 --- a/pages/index/en/README.md +++ b/pages/index/en/README.md @@ -1,21 +1,223 @@ --- -title: teedoc -keywords: teedoc, markdown, jupyter notebook, html, document generation, alternative gitbook, website generation, static website, document website generation, multiple documents -desc: teedoc, convert markdown or jupyter notbook into html static webpage +title: +keywords: Quecpython, markdown, Quectel, html, Document generation, move far, site generation, static site, document site generation, multiple documents +desc: Quecpython, Quecpython Use tutorials to quickly develop new languages --- -
-

teedoc

-

Concise and comprehensive website/document generator

+

QuecPython

+

QuecPython Document center/makes development faster

-
-
- Get started + + + + + + + + + + +
+ + + + + +
- -
+
\ No newline at end of file diff --git a/pages/index/en/config.json b/pages/index/en/config.json index a347a59cd4af19d83a10499f33179f12e514b4c7..c88e13219bb4cf254fde753596c3c73f67a34a66 100644 --- a/pages/index/en/config.json +++ b/pages/index/en/config.json @@ -1,92 +1,4 @@ { - "navbar": { - "title": "teedoc", - "logo": { - "alt": "teedoc logo", - "src": "/static/image/logo.png" - }, - "home_url": "/zh/", - "items": [ - { - "url": "/Quecpython/zh/", - "label": "Install", - "position": "left" - }, - { - "url": "/develop/zh/", - "label": "Develop", - "position": "left" - }, - { - "url": "https://github.com/neutree/teedoc", - "label": "github", - "target": "_blank", - "position": "right" - }, - { - "label": "Language: ", - "position": "right", - "items": [ - { - "url": "/", - "label": "中文" - }, - { - "url": "/zh/", - "label": "English" - } - ] - } - ] - }, - "footer":{ - "top":[ - { - "label": "Links", - "items": [ - { - "label": "Build with teedoc", - "url": "https://github.com/neutree/teedoc", - "target": "_blank" - }, - { - "label": "Copyright © 2021 Neucrack", - "url": "https://neucrack.com", - "target": "_blank" - }, - { - "label": "Sitemap", - "url": "/sitemap.xml" - } - ] - }, - { - "label": "Source code", - "items": [ - { - "label": "github", - "url": "https://github.com/neutree/teedoc", - "target": "_blank" - }, - { - "label": "website source files", - "url": "https://github.com/teedoc/teedoc.github.io", - "target": "_blank" - } - ] - } - ], - "bottom": [ - { - "label": "*ICP备********号-1", - "url": "https://beian.miit.gov.cn", - "target": "_blank" - }, - { - "label": "*公网安备**************号", - "url": "https://beian.miit.gov.cn/#/Integrated/index", - "target": "_blank" - } - ] - } + "import": "config_en", + "class": "md_page" } \ No newline at end of file diff --git a/pages/index/en/favicon.ico b/pages/index/en/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..8133b9baa030ef9f2dd9835bdc341ad1f58217d0 Binary files /dev/null and b/pages/index/en/favicon.ico differ diff --git a/pages/index/zh/README.md b/pages/index/zh/README.md index cb1975a7304b667f050224b97a3ce3ecb18eafae..c86d54c6e5282180ce3933aac25f74f968f51f23 100644 --- a/pages/index/zh/README.md +++ b/pages/index/zh/README.md @@ -1,7 +1,7 @@ --- -title: -keywords: teedoc, markdown, jupyter notebook, html, 文档生成, 替代gitbook, 网站生成, 静态网站, 文档网站生成, 多文档 -desc: teedoc, 将 markdown 或者 jupyter notbook 转换成 html 静态网页 +title: +keywords: Quecpython, markdown, Quectel, html, 文档生成, 移远, 网站生成, 静态网站, 文档网站生成, 多文档 +desc: Quecpython, Quecpython 使用教程,快速开发的新语言 --- @@ -19,6 +19,15 @@ desc: teedoc, 将 markdown 或者 jupyter notbook 转换成 html 静态网页 +
@@ -28,21 +37,21 @@ desc: teedoc, 将 markdown 或者 jupyter notbook 转换成 html 静态网页
Sample Image - -
-
+
-

QuecPython产品介绍

+

产品介绍

-

最新:2021-03-31 +

最新:2021-09-31

@@ -50,92 +59,70 @@ desc: teedoc, 将 markdown 或者 jupyter notbook 转换成 html 静态网页
Sample Image - -
-
+
-

QuecPython快速开始

+

快速开始

-

最新:2021-03-31 -

+

最新:2021-09-31 +

- +
-
- - +
+ + + + +

常见问题

+
+

最新:2021-09-31 +

+ + + \ No newline at end of file diff --git a/pages/index/zh/config.json b/pages/index/zh/config.json index 10c2a1cc1964035be8ce534c1a708e32e4094fcc..386982b7e75137bbe0b78e838df057b79fc5b8f8 100644 --- a/pages/index/zh/config.json +++ b/pages/index/zh/config.json @@ -1,95 +1,4 @@ { - "class": "language_zh", - "navbar": { - "title": "QuecPython", - "logo": { - "alt": "teedoc logo", - "src": "/static/image/quectel.png" - }, - "home_url": "/", - "items": [ - { - "url": "https://python.quectel.com/wiki/#/", - "label": "wiki", - "position": "left" - }, - { - "label": "    文档    ", - "position": "left", - "items": [ - { - "url": "/doc/Quecpython_intro/zh/index.html", - "label": "产品介绍" - }, - { - "url": "/doc/Quick_start/zh/index.html", - "label": "快速开始" - }, - { - "url": "/doc/sbs/zh/index.html", - "label": "手把手教程" - }, - { - "url": "/doc/Advanced_development/zh/index.html", - "label": "开发进阶" - }, - { - "url": "/doc/little_demo/zh/index.html", - "label": "小实验" - }, - { - "url": "/doc/Product_case/zh/index.html", - "label": "产品案例" - }, - { - "url": "/doc/Mass_production/zh/index.html", - "label": "产品量产" - }, - { - "url": "/doc/FAQ/zh/index.html", - "label": "常见问题" - } - ] - }, - { - "label": "GitHub", - "position": "right", - "url": "https://github.com/quecpython/Community-document" - } - ] - }, - "footer": { - "top": [ - { - "label": "链接", - "items": [ - { - "label": "使用 teedoc 构建", - "url": "https://github.com/neutree/teedoc", - "target": "_blank" - }, - { - "label": "Copyright © 2021 Neucrack", - "url": "https://neucrack.com", - "target": "_blank" - } - ] - }, - { - "label": "源码", - "items": [ - { - "label": "github", - "url": "https://github.com/neutree/teedoc", - "target": "_blank" - }, - { - "label": "本网站源文件", - "url": "https://github.com/quecpython/Community-document", - "target": "_blank" - } - ] - } - ] - } + "import": "config_zh", + "class": "md_page" } \ No newline at end of file diff --git a/restart.sh b/restart.sh index dcdbab9053366cde684c2de1ca3e4437910c99f0..10d86671a4092dc077e64f868ebb43261ad0d654 100755 --- a/restart.sh +++ b/restart.sh @@ -1,124 +1,154 @@ #!/bin/bash function usage() { - echo "uasge: $0 {start|restart|kill|toc|build|publish|release_src|release|help|-h}" + echo "uasge: $0 {start|restart|kill|toc|build|publish|release_src|release|help|-h}" } function kill_teedoc() { - ps aux | grep teedoc | grep python3 | awk '{print $2}' | xargs kill -9 >/dev/null + ps aux | grep teedoc | grep python3 | awk '{print $2}' | xargs kill -9 >/dev/null } function teedoc_build() { - teedoc build + teedoc build + ret=$? + retry_count=1 + # 等于1表示,文件夹存在,重新运行 + while ((ret==1)) + do + teedoc build + ret=$? + let "retry_count=$retry_count+1" + echo $retry_count + done } function restart() { - teedoc_build - kill_teedoc - teedoc serve & + teedoc_build + kill_teedoc + teedoc serve & } function start() { - teedoc serve & + teedoc serve & } function creat_toc() { - # 读取所有的 sidebar.yml 生成目录 - echo "生成目录" - python3 script/auto_creat_toc.py --out_file Quecpython_toc.yml --input_file docs/Quecpython_intro/zh/config.json --action toc + # 读取所有的 sidebar.yml 生成目录 + echo "生成目录" + python3 script/auto_creat_toc.py --out_file Quecpython_toc.yml --input_file docs/Quecpython_intro/zh/config.json --action toc } function teedoc_release() { - # 检查是否存在 out文件 - release_filename=Community-document-$(date "+%Y%m%d-%H%M") - if [ ! -d "out" ]; then - teedoc_build - fi - tar cf ${release_filename}.tar out - tar jcf ${release_filename}.tar.bz2 ${release_filename}.tar - rm -rf ${release_filename}.tar - mv ${release_filename}.tar.bz2 .. + # 检查是否存在 out文件 + release_filename=Community-document-$(date "+%Y%m%d-%H%M") + if [ ! -d "out" ]; then + teedoc_build + fi + tar cf ${release_filename}.tar out + tar jcf ${release_filename}.tar.bz2 ${release_filename}.tar + rm -rf ${release_filename}.tar + mv ${release_filename}.tar.bz2 .. } function teedoc_src_release() { - release_filename=Community-document-src-$(date "+%Y%m%d-%H%M") - tar -zcvf ${release_filename}.tar.gz --exclude-from .tar_excludefile . - mv ${release_filename}.tar.gz .. + release_filename=Community-document-src-$(date "+%Y%m%d-%H%M") + tar -zcvf ${release_filename}.tar.gz --exclude-from .tar_excludefile . + mv ${release_filename}.tar.gz .. } function teedoc_publish_to_server() { - OUT_DOC_TOP_DIC=./out/doc/ - cp ${OUT_DOC_TOP_DIC}/doc/*.html ${OUT_DOC_TOP_DIC} - cp ${OUT_DOC_TOP_DIC}/doc/*.ico ${OUT_DOC_TOP_DIC} - cp ${OUT_DOC_TOP_DIC}/doc/*.json ${OUT_DOC_TOP_DIC} - - case $1 in - "root@192.168.25.215:/home/dist/doc") - echo "确认发布到服务器: " - sudo chmod -R 777 ${OUT_DOC_TOP_DIC} - rsync ${OUT_DOC_TOP_DIC}/ $1 -r -i - ;; - *) - echo "发布到 /www/wwwroot/test.com/doc 文件夹" - sudo chmod -R 777 ${OUT_DOC_TOP_DIC} - rsync ${OUT_DOC_TOP_DIC}/ /www/wwwroot/test.com/doc -r -i >/dev/null - ;; - esac + OUT_DOC_TOP_DIC=./out/doc + cp ${OUT_DOC_TOP_DIC}/doc/*.html ${OUT_DOC_TOP_DIC} + cp ${OUT_DOC_TOP_DIC}/doc/*.ico ${OUT_DOC_TOP_DIC} + cp ${OUT_DOC_TOP_DIC}/doc/*.json ${OUT_DOC_TOP_DIC} + rm ${OUT_DOC_TOP_DIC}/doc/*.html + rm ${OUT_DOC_TOP_DIC}/doc/*.ico + rm ${OUT_DOC_TOP_DIC}/doc/*.json + # 首页的英文页面 + mkdir ${OUT_DOC_TOP_DIC}/en/ + cp ${OUT_DOC_TOP_DIC}/doc/en/*.html ${OUT_DOC_TOP_DIC}/en/ + cp ${OUT_DOC_TOP_DIC}/doc/en/*.ico ${OUT_DOC_TOP_DIC}/en/ + cp ${OUT_DOC_TOP_DIC}/doc/en/*.json ${OUT_DOC_TOP_DIC}/en/ + cp -r ${OUT_DOC_TOP_DIC}/assets/* ${OUT_DOC_TOP_DIC}/en/assets/ + rm -rf ${OUT_DOC_TOP_DIC}/doc/en/ + + + + case $1 in + "root@192.168.25.215:/home/dist/doc") + echo "确认发布到服务器: " + sudo chmod -R 777 ${OUT_DOC_TOP_DIC} + rsync ${OUT_DOC_TOP_DIC}/ $1 -r -i + ;; + *) + echo "发布到 /www/wwwroot/test.com/doc 文件夹" + sudo chmod -R 777 ${OUT_DOC_TOP_DIC} + rsync ${OUT_DOC_TOP_DIC}/ /www/wwwroot/test.com/doc -r -i >/dev/null + ;; + esac } function copy_file() { - python3 script/auto_creat_toc.py --input_file pages/index/zh/config.json --action copy + python3 script/auto_creat_toc.py --input_file pages/index/zh/config.json --action copy +} + +function apply_patch() { + . script/out_doc_static_css_theme_default_light_patch.sh } case $1 in "start") - start - ;; + start + ;; "restart") - restart - ;; + restart + ;; "kill") - kill_teedoc - ;; + kill_teedoc + ;; "--help") - usage - ;; + usage + ;; "build") - teedoc_build - ;; + teedoc_build + ;; "-h") - usage - ;; + usage + ;; "release") - teedoc_release - ;; + teedoc_release + ;; "release_src") - teedoc_src_release - ;; + teedoc_src_release + ;; "publish") - teedoc_publish_to_server $2 - ;; + apply_patch + teedoc_publish_to_server $2 + ;; "toc") - # 生成目录 - creat_toc - ;; + # 生成目录 + creat_toc + ;; "copy") - # 覆盖相同的文档 - copy_file - ;; + # 覆盖相同的文档 + copy_file + ;; +"patch") + apply_patch + ;; *) - if [ $# = 0 ]; then - # 没有参数,默认 - teedoc_build - else - # 错误的参数 - echo "ERROR: $0 $1 错误的参数" - usage - exit -1 - fi - ;; + if [ $# = 0 ]; then + # 没有参数,默认 + teedoc_build + else + # 错误的参数 + echo "ERROR: $0 $1 错误的参数" + usage + exit -1 + fi + ;; esac diff --git a/script/auto_creat_toc.py b/script/auto_creat_toc.py index 544947e881ea1c8913fa533f942df1a1fb610aa8..be7f3f98f1e03764a73fd52258132f34a4949a22 100644 --- a/script/auto_creat_toc.py +++ b/script/auto_creat_toc.py @@ -37,7 +37,8 @@ def creat_toc(args): # 2. 根据 url 找到 某一个目录下所有的指定文件 List_file_path = [] for _ in dir_list: - r = find_file("docs/" + _, "sidebar.yaml") + (filepath, tempfilename) = os.path.split(_) + r = find_file("out/doc/" + filepath + '/', "sidebar.yaml") if r is not None: List_file_path.append(r) logger.debug("找到了 {}".format(List_file_path)) diff --git a/script/out_doc_static_css_theme_default_light.css b/script/out_doc_static_css_theme_default_light.css new file mode 100644 index 0000000000000000000000000000000000000000..b68a987870fe6a3235c8f27a0c153d0ebb6d8a7b --- /dev/null +++ b/script/out_doc_static_css_theme_default_light.css @@ -0,0 +1,12 @@ +/*--------patch标识符---------*/ +#content_body { + max-width: 80em; + width: 85%; +} + +th { + font-weight: 700; + background-color: #dc143c; + color: white; + border: 2px solid #dc143c; +} diff --git a/script/out_doc_static_css_theme_default_light_patch.sh b/script/out_doc_static_css_theme_default_light_patch.sh new file mode 100755 index 0000000000000000000000000000000000000000..213919ac14b622f139abed7c95843a12d6e80180 --- /dev/null +++ b/script/out_doc_static_css_theme_default_light_patch.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +# 修复右下角图标的错误 +echo "修改 out/doc/static/css/theme_default/light.css" +# sed -i "s@url(/static/image/theme_default/to-top.svg)@url(/doc/static/image/theme_default/to-top.svg)@g" out/doc/static/css/theme_default/light.css +sed -i "s@url(/static/image/theme_default/to-top.svg)@url(\"/doc/static/image/theme_default/to-top.svg\")@g" out/doc/static/css/theme_default/light.css +# 在后面追加,覆盖前面的属性 +cat script/out_doc_static_css_theme_default_light.css >>./out/doc/static/css/theme_default/light.css diff --git a/site_config.json b/site_config.json index 8d2871a2da3245db09c12f7a2b8b9d355648cd7d..40e5e17ed17e90d66eaa3e7e7370d024dca4e0f7 100644 --- a/site_config.json +++ b/site_config.json @@ -2,22 +2,28 @@ "site_name": "QuecPython", "site_slogon": "让开发更迅速", "site_root_url": "/doc", - "site_domain": "github.com/quecpython/wiki", + "site_domain": "gitee.com/quecpython/wiki", "site_protocol": "https", + "config_template_dir": "config", "route": { "docs": { "/doc/Quecpython_intro/zh": "docs/Quecpython_intro/zh", - "/doc/Development_env_tools/zh": "docs/Development_env_tools/zh", "/doc/Quick_start/zh": "docs/Quick_start/zh", - "/doc/little_demo/zh": "docs/little_demo/zh", + "/doc/sbs/zh": "docs/sbs/zh", "/doc/Advanced_development/zh": "docs/Advanced_development/zh", "/doc/Product_case/zh": "docs/Product_case/zh", - "/doc/Mass_production/zh": "docs/Mass_production/zh", - "/doc/FAQ/zh": "docs/FAQ/zh", - "/doc/sbs/zh": "docs/sbs/zh" + "/doc/FAQ/zh": "docs/FAQ/zh", + "/doc/Quecpython_intro/en": "docs/Quecpython_intro/en", + "/doc/Quick_start/en": "docs/Quick_start/en", + "/doc/sbs/en": "docs/sbs/en", + "/doc/Advanced_development/en": "docs/Advanced_development/en", + "/doc/Product_case/en": "docs/Product_case/en", + "/doc/FAQ/en": "docs/FAQ/en" + }, "pages": { - "/": "pages/index/zh" + "/": "pages/index/zh", + "/en/": "pages/index/en" }, "assets": { "/static/": "static", diff --git a/translate.py b/translate.py new file mode 100644 index 0000000000000000000000000000000000000000..6c4ba52c19f80ce8123b5edee646a1a611fca904 --- /dev/null +++ b/translate.py @@ -0,0 +1,256 @@ +import requests +import random +from hashlib import md5 +import time +import os +import sys +import logging + +# 日志模块 +logger = logging.getLogger() +logger.setLevel(logging.INFO) +# 创建一个handler,用于写入日志文件 +rq = time.strftime('%Y%m%d%H%M', time.localtime(time.time())) +log_path = os.path.dirname(os.path.abspath(__file__)) + '/logs/' +log_name = log_path + rq + '.log' +logfile = log_name +fh = logging.FileHandler(logfile, mode='w') +formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s") +fh.setFormatter(formatter) +logger.addHandler(fh) + + +# TODO QuecPython 翻译成Quecpthon了 已解决 +# TODO 图片文件不翻译 已解决 +# TODO 代码的首字母被大写了 已解决 +# TODO 括号被汉化了 已解决 +# TODO * * 之间多了个空格 无法正常加粗 已解决 +# TODO 对表格处理 翻译后缺失| +# TODO yaml文件也需要补全处理 已解决 +# TODO 注释多了个空格 已解决 +# TODO 目录只翻译前半段 已解决 + +# Set your own appid/appkey. +appid = '20210722000894813' +appkey = 'QBqv9vS1CIgKSj_foFed' +# For list of language codes, please refer to `https://api.fanyi.baidu.com/doc/21` +# from_lang = 'auto' +from_lang = 'zh' +to_lang = 'en' +endpoint = 'http://api.fanyi.baidu.com' +path = '/api/trans/vip/translate' +url = endpoint + path + + +# 删除源文档 +def delete_txt(file_path): + if os.path.exists(file_path): + try: + os.remove(file_path) + return True + except Exception as e: + info = sys.exc_info() + print("remove file error.", e) + print(info[0], info[1]) + return False + else: + return True + + +# 写文档 +def write_txt(file_path, content): + with open(file_path, 'a+', encoding='utf-8') as f: + f.write(content) + + +# 判断是否有中文字符 +def check_contain_chinese(check_str): + for ch in check_str.decode('utf-8'): + if u'\u4e00' <= ch <= u'\u9fff': + return True + return False + + +# 用于保持和原文一样的格式(only for code-) +def space_str_handle(space_str): + # count = '' + # for i in space_str: + # if i == '#': + # count += ' ' + # continue + # else: + # print('count:', len(count)) + # return [count, space_str] + space_str_list = space_str.split('#', 1) + return space_str_list + + +# 用于保持和原文一样的格式 for yaml +def space_yaml_handle(space_str): + count = '' + for i in space_str: + if i == ' ': + count += ' ' + continue + else: + # print('count:', len(count)) + return [count, space_str] + + +# 用于处理路径翻译部分(路径不能翻译,翻译会多很多空格) +def space_path_handle(space_str: str) -> list: + if space_str.find('](') != -1: + print(space_str) + index = space_str.index(']') + return [space_str[:index+1], space_str[index+1:]] + else: + return [space_str, ''] + + +# 获取英语翻译-> 百度翻译 +def get_english(words: str) -> str: + """ + 功能: 源语言(自动识别)=> 英语 + 传入翻译文字,自动识别,翻译后返回一个列表,每个元素为一段落 + """ + # Set your own appid/appkey. + query = words + + # Generate salt and sign + def make_md5(s, encoding='utf-8'): + return md5(s.encode(encoding)).hexdigest() + + salt = random.randint(32768, 65536) + sign = make_md5(appid + query + str(salt) + appkey) + # Build request + headers = {'Content-Type': 'application/x-www-form-urlencoded'} + payload = {'appid': appid, 'q': query, 'from': from_lang, 'to': to_lang, 'salt': salt, 'sign': sign} + # Send request + time.sleep(2) + try: + r = requests.post(url, params=payload, headers=headers) + result = r.json() + print(result) + + trans = result['trans_result'] + ret = '' + for n in range(len(trans)): + ret += trans[n]['dst'] + # 解决专用名词翻译问题 + ret = ret.replace('Quecpthon', 'QuecPython') + except Exception as e: + ret = query + print(e) + logger.info('翻译失败的大哥:' + ret) + logger.info('翻译失败的原因:' + str(e)) + return ret + + +# 从文件中取翻译内容 +def main(src_path): + out_path = src_path.replace('zh', 'en') + code_flag = False + for line in open(src_path, 'r', encoding='utf-8'): + line = line.strip('\n') + if len(line) < 1: # 该行仅仅是换行 + write_txt(out_path, "\n") + else: + # 图片文件路径不翻译(翻译后找不到文件了) + if line.startswith('!['): + write_txt(out_path, line + "\n") + continue + if line == '```python': + code_flag = True + if line == '```': + code_flag = False + + if check_contain_chinese(line.encode('utf-8')): + # print(code_flag) + if code_flag: + line = space_str_handle(line) + if len(line) == 2: + print('待翻译内容:', line[1]) + data = get_english(line[1]) + write_txt(out_path, line[0] + '#' + data + "\n") # 百度API 方法 + else: + print('待翻译内容:', line[0]) + data = get_english(line[0]) + write_txt(out_path, data + "\n") # 百度API 方法 + else: + if line[0] == " ": # 不是目录 + line = space_yaml_handle(line) + print('待翻译内容:', line[1]) + data = get_english(line[1]) + write_txt(out_path, line[0] + tran_handler(data) + "\n") + else: + line = space_path_handle(line) + print('待翻译内容:', line[0]) + data = get_english(line[0]) + write_txt(out_path, tran_handler(data) + line[1] + "\n") + + else: + write_txt(out_path, line + "\n") + + +# 处理md格式问题 ####后面加空格 +def tran_handler(hanle_str): + hanle_str = hanle_str.replace('* * *', '**') # 去除翻译过程中产生多余的空格(有时候会多一个) + hanle_str = hanle_str.replace('* *', '**') # 去除翻译过程中产生多余的空格 + hanle_str = hanle_str.replace('- >', '-->') # 补全翻译过程缺失的内容 + hanle_str = hanle_str.replace('-Label', '- label') # 补全翻译过程缺失的内容 + + # hanle_str = hanle_str.replace('] (', '](') # 补全翻译过程缺失的内容 + + if hanle_str.startswith('#'): + count = 0 + for j in hanle_str: + if j == "#": + count += 1 + continue + else: + break + str_list = list(hanle_str) + str_list.insert(count, " ") + return ''.join(str_list) + else: + return hanle_str + + +if __name__ == '__main__': + + # 单个文件 + root_list = 'E:\\teedoc_wiki\\Community-document\\config\\config_en.json' + delete_txt(root_list.replace('zh', 'en')) # 删除原文件 + main(root_list) + # 单层目录 + # root_list = 'E:\\teedoc_wiki\\Community-document\\docs\\Quick_start\\zh' + # for root, dirs, files in os.walk(root_list, topdown=False): + # for name in files: + # if name.split(".")[-1] in ('md', 'yaml'): + # # print(os.path.join(root, name)) + # delete_txt(os.path.join(root, name).replace('zh', 'en')) # 删除原文件 + # main(os.path.join(root, name)) + # time.sleep(5) + # 整个项目 + # root_path = 'E:\\teedoc_wiki\\Community-document\\docs\\' + # root_list = os.listdir(root_path) + # for i in root_list: + # # print(os.path.join(root_path, i)) + # for root, dirs, files in os.walk(os.path.join(root_path, i+'\\zh'), topdown=False): + # for name in files: + # if name.split(".")[-1] in ('md', 'yaml'): + # delete_txt(os.path.join(root, name).replace('zh', 'en')) # 删除原文件 + # main(os.path.join(root, name)) + # time.sleep(5) + + # 传参 + # if len(sys.argv) < 2: + # print('No input file provided') + # exit() + # if sys.argv[1] == 'all': + # # 翻译全部 + # pass + # else: + # # 单个文件 + # pass +