Mixly第三方用户库开发Arduino UNO使用EMW3080连接阿里云

3 篇文章 0 订阅
1 篇文章 0 订阅


前言

前几天做了Mind+的用户库开发,这次来捣鼓一下Mixly的用户库开发,还是熟悉的配方,使用Arduino UNO 和 EMW3080 连接阿里云上报数据


提示:以下是本篇文章正文内容,下面案例可供参考

一、实验准备

1、硬件准备

硬件数量
Arduino UNO R31
庆科 EMW30801
杜邦线若干

接线方式

EMW3080Arduino UNO
VIN5V
GNDGND
RXD1 (TXD)
TXD0 (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制作第三方库的一些过程,本文仅仅简单介绍了部分积木块的制作和使用。如有写的不好的地方,欢迎大家提点宝贵的建议。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
连接ESP01S和Arduino Uno开发板到阿里云需要进行以下几个步骤: 1. 注册阿里云账号并创建设备 2. 下载阿里云物联网套件,安装并打开 3. 在套件中创建产品和设备 4. 在Arduino IDE中安装ESP8266WiFi库和PubSubClient库 - 打开Arduino IDE,点击菜单栏的“工具”->“管理库” - 在搜索框中输入“ESP8266WiFi”,搜索并安装 - 在搜索框中输入“PubSubClient”,搜索并安装 5. 在Arduino IDE中编写代码,实现ESP01S与阿里云的通信 以下是一份简单的Arduino代码示例,可以将其上传到Arduino Uno开发板来实现ESP01S与阿里云连接: ``` #include <SoftwareSerial.h> #include <ESP8266WiFi.h> #include <PubSubClient.h> // WiFi网络配置 const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; // 阿里云物联网平台配置 const char* mqttServer = "your_MQTT_SERVER"; const int mqttPort = 1883; const char* mqttUsername = "your_MQTT_USERNAME"; const char* mqttPassword = "your_MQTT_PASSWORD"; const char* mqttClientId = "your_MQTT_CLIENTID"; const char* mqttTopic = "your_MQTT_TOPIC"; SoftwareSerial espSerial(2, 3); // RX, TX ESP8266WiFiMulti wifiMulti; WiFiClient espClient; PubSubClient client(espClient); void setup() { Serial.begin(9600); espSerial.begin(115200); delay(1000); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } Serial.println("Connected to WiFi!"); client.setServer(mqttServer, mqttPort); client.setCallback(callback); while (!client.connected()) { Serial.println("Connecting to MQTT server..."); if (client.connect(mqttClientId, mqttUsername, mqttPassword)) { Serial.println("Connected to MQTT server!"); client.subscribe(mqttTopic); } else { Serial.print("Failed to connect to MQTT server with state "); Serial.print(client.state()); delay(2000); } } } void loop() { if (espSerial.available()) { Serial.write(espSerial.read()); client.publish(mqttTopic, espSerial.readStringUntil('\n').c_str()); } if (!client.connected()) { reconnect(); } client.loop(); } void callback(char* topic, byte* payload, unsigned int length) { // 处理接收到的消息 } void reconnect() { while (!client.connected()) { Serial.println("Connecting to MQTT server..."); if (client.connect(mqttClientId, mqttUsername, mqttPassword)) { Serial.println("Connected to MQTT server!"); client.subscribe(mqttTopic); } else { Serial.print("Failed to connect to MQTT server with state "); Serial.print(client.state()); delay(2000); } } } ``` 在代码中,需要填入你自己的WiFi网络配置和阿里云物联网平台配置信息。ESP01S通过SoftwareSerial库与Arduino Uno通信,需要将其RX和TX引脚分别连接Arduino Uno的2和3引脚。 上传代码后,打开串口监视器,你应该能看到ESP01S成功连接到WiFi网络,并通过串口与Arduino Uno通信。同时,ESP01S也连接到了阿里云物联网平台,并订阅了mqttTopic主题。你可以在串口监视器中输入一些数据,这些数据应该会被ESP01S通过MQTT协议发送到阿里云物联网平台。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Simply myself

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值