Mind+上传模式的第三方Arduino用户库实现——DHT11模块读取温湿度
前言
Mind+是一款拥有自主知识产权的国产青少年编程软件,支持Arduino、micro:bit、掌控板等各种开源硬件,兼容Scratch3.0,支持AI与IoT功能,只需要拖动图形化程序块即可完成编程,还可以使用Python/C/C++等高级编程语言,让大家轻松体验创造的乐趣。
Mind+支持三大主流开源硬件平台(Arduino,micro:bit,掌控板esp32),均可以使用基于arduino
C的库,因此只需要编写一个arduino的库即可达到三平台兼容。Mind+已经支持几十种常用的扩展小模块库,为方便更多用户的使用,从V1.6.2版本开始开放用户自定义库功能,你可以根据自己的需要编写或移植现有的arduino库,自己设计图形模块(block)的外观及形状,自己设计对应生成的代码。
支持通过网络加载Github的用户库或直接本地加载(config.json或.mpext文件)。
注:使用用户库请先升级Mind+到V1.6.2 RC2.0及以上版本。
当Mind+上传模式中,Mind+模块自带的用户库有时候不满足要求的情况下,我们就可以根据自己的需求创建用户库。本博客实现的是DHT11模块用户库的定制。虽然官方自带有DHT11用户库,该博客只是提供一个思路。
1、选择模板或自己建立用户库文件结构
官方提供的模板库教程包括arduino、microPython、实时模式用户库模板。选择自己需要的模板。该博客的例子是在arduino基础下修改而来。也可以通过下方用户库文件结构构建自己的用户库。
用户库文件结构:
│— newExtensions // 项目名称
│— config.json // 本用户库的配置文件
│— LICENSE.TXT // 许可证说明
│— README.md // 文档说明
│— arduinoC // arduino模式用户库根目录
│— main.ts // 图形块描述文件
│— libraries // arduino库文件,列出本扩展库所有需要引用的.c或.h或.cpp文件;若没有则把此文件夹内容删除清空
│— qrcode.h
│— ...
│— _images // 图片文件
│— featured.png // MindPlus扩展库展示图片(600x372像素)
│— icon.svg // MindPlus中图形块上的图标文件
│— ...
│— _locales // 翻译文件,支持多国语言
│— zh-cn.json
│— en.json
│— ...
│— _menus // 下拉菜单参数,每个板子可以独立设置
│— leonardo.json
│— uno.json
│— nano.json
│— mega2560.json
│— microbit.json
│— mpython.json
│—
…
arduino用户库模板开启Mind+ 在用户库中选择开发板导入用户库,选择下载模块中的json文件。可以预览效果
2、修改config.json
删除其中files字段部分代码
修改name和description对应字段,英文部分可以 谷歌翻译
修改author(作者)和email(邮箱)为自己的
修改id为这个扩展库唯一标识,英文数字或下划线,不要用中文和特殊符号,最好与文件夹后的名字相同
version为版本号,可以改成0.0.1,以后每次修改代码数字逐渐升级
board填写支持的板子,无法测试的不要写
其他部分不用动,保存。
具体字段描述见api列表。
{ "name": {
"zh-cn": "温湿度模块",
"en": "DHT11" },
"description": {
"zh-cn": "DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器",
"en": "DHT11 digital temperature and humidity sensor is a temperature and humidity composite sensor with a calibrated digital signal output" },
"author": "xxx",
"email": "xxx@qq.com",
"license": "MIT", "isBoard": false, "id": "dht11_Hum_Temp", //修改id为这个扩展库唯一标识,英文数字或下划线,不要用中文和特殊符号 "platform": ["win","mac","web"], "version": "0.0.1", "asset": {
"arduinoC": {
"dir": "arduinoC/",
"version": "0.0.1",//整个扩展库的版本号,缺少会报错。以后每次修改代码数字逐渐升级
"board": [//填写支持的板子,无法测试的不要写
"microbit",
"esp32",
"arduino"
],
"main": "main.ts"
} } }
详细说明:
name: 名称。模块显示在扩展库中的标题名称。 description: 描述。模块显示在扩展库中的描述。 author:
作者名。请使用英文字母表示。
email: 邮箱。当版本更新需要修改用户库或用户反馈,将通过邮件通知开发者(预留功能)
license:许可证类型。参考链接 isBoard: 主控。当前扩展是否为主控(预留功能,统一为false)
id:模块区分号。同一作者的不同模块需要设置不同的id,建议使用英文和数字符号命名。
platform: 支持平台。有三个选项:“win”,“mac”, “web”,分别表示Mind的windows桌面版,mac桌面版,网页版,当前仅支持win。
asset:各模式配置。当前仅支持上传模式的arduino C模式。
dir: 指定模式路径。/不能遗漏,例如:“dir”:“arduinoC/”,不建议修改。
version:版本信息。三个数字,从小到大,例如:“0.0.1”,建议每次发布都增加一位小数,依次从小到大增加(版本控制功能预留)。 board: 指定支持的主控,主控对应字段见下文“主控列表”。请确认测试通过后添加对应支持主控。若当前主控板不支持或模式不支持,则用户库右上角会显示“不可用”
main: block描述文件的文件名。需要是ts后缀文件,名称自定义,需要在对应路径下
注:若模板中有isTest字段和files字段,则把该两字段部分代码删除。因为从Mind+ 1.6.2RC2.0版本开始删除此两字段。
3、修改资源文件
_images:
删除arduinoC/_images中的所有文件 将一张600x372像素的照片放到文件夹中,命名为featured.png
在iconfont搜索温湿度,找一个合适的图片,点击下载,点击SVG下载,保存到文件夹中,命名为icon.svg可以重新导入模板中的Json文件,查看图片的变化,featured.png为选择用户库时的图片,icon.svg为积木块中的图片。
libraries文件夹
此文件放置生成代码需要调用的arduino库文件,如果不需要库文件,需要将libraries文件夹删除。即如果有arduino库(.h和.cpp文件)时,需要放到此文件夹中;如果不需要库文件,则把此文件夹删除。
这里要使用到dht11的库,已提供gitee地址。
_locales文件夹
此文件夹放置.json翻译文件(注意文件的命名,可以查看官方的规则)。根据文件名对应不同的语言,若没有对应语言的翻译文件则以main.ts中block描述代码中的内容直接显示。
说明: ①在block及menu都可以定义。 ②json格式:
每一行格式为:“用户库名称.函数名|block”:“翻译内容[菜单项]”, 或
菜单项则为:“用户库名称.菜单名.菜单项|menu”:“翻译内容”,
_menus文件夹
在arduino.json中加入下面的代码
{
"Temp": {
"menu": [["temperature","temperature"],["humidity","humidity"]],
"default_set_dht11":"temperature"
},
"PINX": {
"menu": [["2", "2"], ["3", "3"], ["4", "4"],
["5", "5"], ["6", "6"], ["7", "7"],
["8", "8"], ["9", "9"], ["10", "10"], ["11", "11"],["12", "12"],["13", "13"]],
"default_set_dht11":"2"
}
}
每个主控板一个json文件,文件名以板子命名,不可修改,格式为json格式。
注:在官方示例中有所有板子主要引脚文件,可直接取用。
menu字段对应菜单项:[“下拉block中显示的内容”,“生成代码获得的内容”]。
default_函数名_下拉字段名称 可以设置默认下拉引脚。
4、编写main.ts描述文件
main.ts描述文件在arduinoC文件夹下。
文件内容结构:
通过//%后面的内容可以定义图形块(block)外观(积木),即//% 后面的内容确定了block的外观以及输入值的绑定;
通过function定义block对应的生成代码以及位置,即export
fuction中通过Generator确定不同的代码生成的位置和内容。
enum xxxx {
//% 引脚描述内容定义,需要翻译的菜单项需要定义到menu文件中
//% 引脚生成代码定义
}
//% color="#xxxx" 整个扩展block的外观定义,通过 //% 后的描述内容定义
namespace xxxx { //namespace后的xxxx与config.json配置文件中的ID号相同
//% block="xxx [xxx]" blockType="xxx" 第一个block的外观定义描述内容
//% block其他描述内容
export function xxxx(parameter: any, block: any) { //单个block的生成代码定义,通过函数描述生成代码的位置及内容
//生成的代码位置及内容描述
}
//% block="xxx [xxx]" blockType="xxx" 第二个block的外观定义描述内容
//% block其他描述内容
export function xxxx(parameter: any, block: any) {
//生成的代码位置及内容描述
}
//% block="xxx [xxx]" blockType="xxx" 第N个block的外观定义描述内容
//% block其他描述内容
export function xxxx(parameter: any, block: any) {
//生成的代码位置及内容描述
}
}
block外观定义;Generator代码定义;parameter传入参数等语法详情可以查看官方的文件说明。
详细步骤:
1)首先我们设计一下积木块
参考官方的dht11的方式,需要有引脚读取,和温湿度的选择 ,效果如下
实现
main.ts描述文件的代码内容如下:
enum SIZE {
//% block="29*29"
1,
//% block="58*58"
2
}
enum LINE {
//% block="1"
1,
//% block="2"
2,
//% block="3"
3,
//% block="4"
4
}
//% color="#3399FF" iconWidth=50 iconHeight=40
namespace dht11_Hum_Temp {
//% block="读取引脚[PINX]DHT11[Temp]" blockType="reporter"
//% PINX.shadow="dropdown" PINX.options="PINX" PINX.defl="3"
//% Temp.shadow="dropdown" Temp.options="Temp" Temp.defl="Temperature"
export function set_dht11(parameter: any, block: any) {
let p = parameter.PINX.code
let t = parameter.Temp.code
Generator.addInclude("dht11", "#include <dht11.h>")
Generator.addObject(`dht11`, `dht11`, `DHT11;`);
Generator.addSetup("dht11",` DHT11.read(${p}); `);
Generator.addCode(`(float)DHT11.${t}`);
}
代码说明:
积木颜色如果需要修改可以用取色板工具取色后修改; namespace名字修改为与config.json配置文件中的ID相同;
修改block字段设置积木文字和下拉菜单,blocktype设置积木形状;
shadow配置下拉菜单,配置menu文件,如果需要翻译可以修改_locales文件夹下的zh-cn.json文件;
配置block函数内容。
5、测试
1)打开Mind+软件,切换到上传模式,打开扩展,选择主控板为Arduno uno,然后在用户库里导入本地用户库并查看效果。选择json文件
测试硬件功能
①点击刷新按钮会更新积木;
②拖动积木编写程序,查看生成代码正确与否;
编译并上传代码,打开串口监视助手,选择波特率9600
6、导出分享
步骤:
1)右键扩展库导出用户库为.mpext文件
测试完成之后,在扩展库上右键选择导出,稍等即可导出完成。此时查看库文件目录下有一个.mpext文件,此文件直接加载即可,此时没有调试模式的标志。
2)编写README.md文件
以markdown格式编辑本扩展库的教程。
3)分享
推荐分享到Mind+社区,有以下两种方法:
本地加载:直接分享给其他用户加载.mpext文件。
网络加载:将.mpext文件(文件名不要修改否则会出错)导出到与config.json同级目录下,通过git将整个文件夹上传到github或者gitee(码云) (gith教程),将git链接分享给其他用户加载。