# MicroPython QRCode CModule
**Repository Path**: zilin__zhang/micropython-qrcode-cmodule
## Basic Information
- **Project Name**: MicroPython QRCode CModule
- **Description**: 生成并显示指定内容的二维码
- **Primary Language**: C
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 4
- **Created**: 2022-03-06
- **Last Updated**: 2022-05-24
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
MicroPython QRCode CModule

### 项目介绍
生成并显示指定内容的二维码
### 添加模块
* 将`ports/esp32/`下的文件复制到`MicroPython`项目对应位置
* 修改`ports/esp32/CMakeLists.txt`文件,增加如下内容:
```doc
set(EXTRA_COMPONENT_DIRS $ENV{IDF_PATH}/examples/common_components/qrcode)
```
* 修改`ports/esp32/main/CMakeLists.txt`文件:
```doc
# 在 set(MICROPY_SOURCE_PORT 下边增加
${PROJECT_DIR}/modqrcode.c
# 在 set(IDF_COMPONENTS 下边增加
qrcode
# 在 idf_component_register( 下的 SRCS、INCLUDE_DIRS 分别增加
${EXTRA_COMPONENT_DIRS}
```
* 编译固件即可增加`qrcode`模块
### 显示效果
| 控制台 | TFT | OLED |
| :-: | :-: | :-: |
|  |  |  |
### 简单示例
生成二维码,并在控制台打印输出
```python
>>> import qrcode
>>> _qrcode = qrcode.QRCODE()
>>> _qrcode.ecc_level(qrcode.ECC_HIGH)
>>> _qrcode.generate('https://gitee.com/walkline/micropython-qrcode-cmodule')
I (66945) QRCODE_MODULE: Encoding below text with ECC LVL 3 & QR Code Version 40
I (66945) QRCODE_MODULE: https://gitee.com/walkline/micropython-qrcode-cmodule
>>> print(_qrcode)
>>> _qrcode.print()
>>>
```
### 更多示例
```bash
# 使用 ab 工具烧录固件
$ ab --flash
# 使用 ab 工具上传相关文件
$ ab
# 使用 ab 工具打开串口
$ ab --repl
# 使用快捷键 ctrl+r,并选择以 demo_ 开头的文件
```
### 模块方法列表
* `qrcode.QRCODE([ecc_level, max_version])`
* `ecc_level`:容错等级(默认值`ECC_MED`),详情见`模块常量列表`
* `max_version`:可生成二维码的最大版本号(默认值`VERSION_MAX`),详情见`模块常量列表`
> **适当降低最大版本号可以减少占用的缓存**
> ```python
> # 版本号对应缓存大小计算方法
> ((version * 4 + 17) ** 2 + 7) // 8 + 1
> ```
* `ecc_level([level])`:获取或设置容错等级
* `version()`:获取已生成二维码的版本号
> ```python
> # 版本号计算方法
> (QRCODE.length() - 17) // 4
> ```
* `length()`:获取已生成二维码的边长
* `generate(text)`:使用指定字符串生成二维码
* `print()`:在控制台打印二维码预览图
* `raw_data()`:获取二维码点阵元组数据,形如`((1, 0, ...), (0, 1, ...), ...)`
* `buffer_data(byetarray, format[, scales, color, bg_color])`:将二维码数据以指定格式填充到数组
* `bytearray`:已初始化大小的`byetarray`数组
* `format`:数据格式,详情见`模块常量列表`
* `scales`:放大倍数(默认值`1`)
* `color`:前景颜色(默认值`1`或`0xffff`)
* `bg_color`:背景颜色(默认值`0x0000`)
> ```python
> # bytearray 初始化长度计算方法:
>
> # FORMAT_MONO_HLSB 格式
> (QRCODE.length() * scales - 1) // 8 + 1) * (QRCODE.length() * scales)
>
> # FORMAT_RGB565 格式
> (QRCODE.length() * scales) ** 2 * 2
> ```
### 模块常量列表
* `ECC_LOW`:`7%`容错率,代表二维码内容缺失`7%`后仍可被正确识别,容错率与数据长度成正比,下同
* `ECC_MED`:`15%`容错率
* `ECC_QUART`:`25%`容错率
* `ECC_HIGH`:`30%`容错率
* `VERSION_MIN`:二维码支持的最低版本,`1`
* `VERSION_MAX`:二维码支持的最高版本,`40`
* `FORMAT_MONO_HLSB`:指定`buffer_data()`函数填充数组的方式,适用于`OLED`屏幕
* `FORMAT_RGB565`:指定`buffer_data()`函数填充数组的方式,适用于`TFT`屏幕
### 参考资料
* [QR Code generator component](https://github.com/espressif/esp-idf/tree/master/examples/common_components/qrcode)
* [MicroPython QRCode Research](https://gitee.com/walkline/micropython-qrcode-research)
* [ESP32-C3 MicroPython 固件编译环境搭建教程](https://gitee.com/walkline/esp32-c3_micropython_firmware)
* [WSL 下加速 Github 克隆速度](https://walkline.wang/blog/archives/263)
* [AMPY Batch Tool](https://gitee.com/walkline/a-batch-tool)
### 合作交流
* 联系邮箱:
* QQ 交流群:
* 走线物联:[163271910](https://jq.qq.com/?_wv=1027&k=xtPoHgwL)
* 扇贝物联:[31324057](https://jq.qq.com/?_wv=1027&k=yp4FrpWh)

