文章目录
前言
前几天做了Mind+的用户库开发,这次来捣鼓一下Mixly的用户库开发,还是熟悉的配方,使用Arduino UNO 和 EMW3080 连接阿里云上报数据
提示:以下是本篇文章正文内容,下面案例可供参考
一、实验准备
1、硬件准备
硬件 | 数量 |
---|---|
Arduino UNO R3 | 1 |
庆科 EMW3080 | 1 |
杜邦线 | 若干 |
接线方式
EMW3080 | Arduino UNO |
---|---|
VIN | 5V |
GND | GND |
RXD | 1 (TXD) |
TXD | 0 (RXD) |
2、软件准备
软件 |
---|
Mixly |
文本编辑器(最好是代码编辑器) |
二、实验过程
1、Mixly库说明
- Mixly是一款图形化编程软件,即使用户不懂C语言的语法,也可以利用图形化程序编写Arduino程序。Mixly的基本原理是将图形化程序转化成C语言,再利用Arduino
IDE上传到硬件中。在我们动手编写第三方库之前,先来了解Mixly是如何将图形化程序转化成C语言的。
整个库的目录中有以下文件
- xxx.xml文件
- 定义了图形块的基本信息,比如类别、名称,ID等。
- block/xxx.js文件,
- 定义了每个图形块的样式,比如颜色、文字、图标等。
- generator/xxx.js文件
- 将图形块程序转化成C语言的关键部分。
- language/xxx/en.js(zh-hans.js)等文件
- 语言文件,en.js是英文语言文件,zh-hans.js是简体中文语言文件,zh-hant.js是繁体中文语言文件。该类文件定义了图形块程序中每一个字段显示的文字内容。
└─xxx // 项目根目录
├─ xxx.xml // 本用户库的配置文件
│
├─ block
│ xxx.js // 图形化样式文件
│
├─ generator
│ xxx.js // 图形块转C语言文件
│
└─ language
└─xxx
zh-hans.js // 简体中文语言文件
注意:除根目录名外,以上文件结构中的xxx均须一致
示例:
2、文件编写
2.1、编写xxx.xml文件
- block 中的 type 相当于积木块的ID,需与block/xxx.js、generator/xxx.js中 “Blockly.Blocks.XX” 的XX一致
- value是积木块中的参数,name为参数的ID,后面会调用到
- shadow 中 type 为输入框中类型,text 表示为文本型
<!--
type="company"
block="block/xxx.js"
generator="generator/xxx.js"
language="language/xxx"
-->
<script type="text/javascript" src="../../blocks/company/xxx.js"></script>
<script type="text/javascript" src="../../generators/arduino/company/xxx.js"></script>
<!--引用所有写好的模块-->
<category id="mixly_EMW3080" name="EMW3080" colour="20">
<category id="mixly_Aliyun" name="阿里云" colour="160">
<!--导入库文件的积木-->
<block type="include_lib">
</block>
<!--连接Wi-Fi的积木块-->
<block type="wifi_connect">
<value name="SSID"> <!---->
<shadow type="text"></shadow> <!---->
</value>
<value name="PASSWORD">
<shadow type="text"></shadow>
</value>
</block>
<!--连接MQTT的积木块-->
<block type="mqtt_connect">
<value name="PRODUCTKEY">
<shadow type="text"></shadow>
</value>
<value name="DEVICENAME">
<shadow type="text"></shadow>
</value>
<value name="MQTT_PASSWORD">
<shadow type="text"></shadow>
</value>
</block>
<block type="send_mqtt_message">
<value name="TOPIC">
<shadow type="text"></shadow>
</value>
<value name="MESSAGE">
<shadow type="text"></shadow>
</value>
</block>
</category>
</category>
2.2、编写block/xxx.js文件
'use strict';
goog.provide('Blockly.Blocks.EMW3080');
goog.require('Blockly.Blocks');
Blockly.Blocks.include_lib = {
init: function () {
this.appendDummyInput("")
.appendField(Blockly.INCLUDE);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setColour(90);
this.setTooltip("");
this.setHelpUrl("");
}
};
Blockly.Blocks.wifi_connect = {
init: function () {
this.appendDummyInput("")
.appendField(Blockly.WIFI_CONNECT);
this.appendDummyInput("")
.appendField(Blockly.WIFI_SSID)
.appendField(new Blockly.FieldTextInput('your_ssid'), "SSID");
this.appendDummyInput("")
.appendField(Blockly.WIFI_PASSWORD)
.appendField(new Blockly.FieldTextInput('your_password'), "PASSWORD");
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setColour(90);
this.setTooltip("");
this.setHelpUrl("");
}
};
Blockly.Blocks.mqtt_connect = {
init: function () {
this.appendDummyInput("")
.appendField(Blockly.MQTT_CONNECT);
this.appendDummyInput("")
.appendField(Blockly.MQTT_PRODUCTKEY)
.appendField(new Blockly.FieldTextInput('your_ProductKey'), "PRODUCTKEY");
this.appendDummyInput("")
.appendField(Blockly.MQTT_DEVICENAME)
.appendField(new Blockly.FieldTextInput('your_DeviceName'), "DEVICENAME");
this.appendDummyInput("")
.appendField(Blockly.MQTT_PASSWORD)
.appendField(new Blockly.FieldTextInput('your_Password'), "MQTT_PASSWORD");
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setColour(90);
this.setTooltip("");
this.setHelpUrl("");
}
};
Blockly.Blocks.send_mqtt_message = {
init: function () {
this.appendDummyInput("")
.appendField(Blockly.MQTT_PUBLISH);
this.appendDummyInput("")
.appendField(Blockly.MQTT_TOPIC)
.appendField(new Blockly.FieldTextInput('your_Topic'), "TOPIC");
this.appendDummyInput("")
.appendField(Blockly.MQTT_MESSAGE)
.appendField(new Blockly.FieldTextInput('MQTT_Message'), "MESSAGE");
this.setPreviousStatement(true);
this.setNextStatement(true);
this.setColour(90);
this.setTooltip("");
this.setHelpUrl("");
}
};
2.3、编写zh-hans.js文件
- 为方便代码编写,这里使用了自定义语言变量
- “Blockly.MIXLY_”是官方的语言变量前缀,为了区分,自定义语言变量不能以此作为前缀。
- 自定义变量可以采用“Blockly.”+自定义库名称+变量名的形式。如EMW3080库中定义的引用库语言变量为Blockly.INCLUDE。
以下是zh-hans.js的内容
Blockly.INCLUDE = "引用EMW3080库";
Blockly.WIFI_CONNECT = "Wi-Fi连接";
Blockly.WIFI_SSID = "Wi-Fi名称";
Blockly.WIFI_PASSWORD = "Wi-Fi密码";
Blockly.MQTT_CONNECT = "MQTT连接";
Blockly.MQTT_PRODUCTKEY = "ProductKey:";
Blockly.MQTT_DEVICENAME = "DeviceName:";
Blockly.MQTT_PASSWORD = "Password:";
Blockly.MQTT_PUBLISH = "MQTT消息上报";
Blockly.MQTT_TOPIC = "Topic:";
Blockly.MQTT_MESSAGE = "MQTT消息:";
2.4、编写generator/xxx.js文件
'use strict';
goog.provide('Blockly.Arduino.EMW3080');
goog.require('Blockly.Arduino');
Blockly.Arduino.include_lib = function() {
Blockly.Arduino.definitions_['define_'] = '#include <EMW3080.h>';
return '';
}
Blockly.Arduino.wifi_connect = function() {
var text_wifi_ssid = this.getFieldValue('SSID');
var text_wifi_password = this.getFieldValue('PASSWORD');
Blockly.Arduino.setups_['setup_connect' + text_wifi_ssid + text_wifi_password] = 'while(1) {\n\tif (!WiFi_init("' + text_wifi_ssid + '", "' + text_wifi_password +'"))continue;\n\tbreak;\n }';
return '';
}
Blockly.Arduino.mqtt_connect = function() {
var text_mqtt_productkey = this.getFieldValue('PRODUCTKEY');
var text_mqtt_devicename = this.getFieldValue('DEVICENAME');
var text_mqtt_password = this.getFieldValue('MQTT_PASSWORD');
Blockly.Arduino.setups_['setup_connect' + text_mqtt_productkey + text_mqtt_devicename + text_mqtt_password] = 'while(1) {\n\tif (!Ali_connect("' + text_mqtt_productkey + '", "' + text_mqtt_devicename + '", "' + text_mqtt_password +'"))continue;\n\tbreak;\n }';
return '';
}
Blockly.Arduino.send_mqtt_message = function() {
var text_mqtt_topic = this.getFieldValue('TOPIC');
var text_mqtt_message = this.getFieldValue('MESSAGE');
var code = 'Upload("' + text_mqtt_topic + '","' + text_mqtt_message + '");'
return code;
}
最后不要忘了导入相应的库文件到 “Mixly_WIN\arduino\portable\sketchbook\libraries"中
3、测试结果
到此Mixly第三方库就完成了。
总结
以上就是Mixly制作第三方库的一些过程,本文仅仅简单介绍了部分积木块的制作和使用。如有写的不好的地方,欢迎大家提点宝贵的建议。