初始化提交

This commit is contained in:
王立帮
2024-07-19 10:16:00 +08:00
parent 4c7b571f20
commit 4a2d56dcc4
7084 changed files with 741212 additions and 63 deletions

View File

@@ -0,0 +1,13 @@
## 输入/输出
输入/输出所包含的指令主要分为四部分控制管脚的输入输出按信号类型可分为数字信号和模拟信号、中断、脉冲长度及ShiftOut。
- 输入输出:数字输入、数字输出、模拟输入、模拟输出
- 中断控制:定义中断,取消中断
- 脉冲长度
- 移位输出
<img src="{default}/images/inout/input-output.png" alt="输入/输出分类" style="zoom:50%;" />

View File

@@ -0,0 +1,41 @@
## 数字输出
<img src="{default}/images/inout/digital-pin-output.png" alt="数字输出" style="zoom:67%;" />
```arduino
digitalWrite(2, HIGH);
digitalWrite(2, LOW);
```
### 描述
> 给一个数字引脚写入HIGH或者LOW。
### 参数
- 管脚: 引脚编号如1510A0A3
- 值: 高 或 低
### 范例
将13号端口设置为高电平延迟一秒然后设置为低电平再延迟一秒如此往复。
<img src="{default}/images/inout/digital-pin-output-example.png" alt="数字输出示例" style="zoom:67%;" />
```arduino
void setup(){
pinMode(13, OUTPUT);
}
void loop(){
digitalWrite(13,HIGH);
delay(1000);
digitalWrite(13,LOW);
delay(1000);
}
```
<div class="layui-card" style="box-shadow: 1px 1px 4px 1px rgb(0 0 0 / 20%);">
<div class="layui-card-header icon-attention-circled" style="background: #f0b37e;color:#fff;font-size:16px;">注意</div>
<div class="layui-card-body" style="background: #ffedcc;">数字13号引脚难以作为数字输入使用因为大部分的控制板上使用了一颗LED与一个电阻连接到他。如果启动了内部的20K上拉电阻他的电压将在1.7V左右而不是正常的5V因为板载LED串联的电阻把他使他降了下来这意味着他返回的值总是LOW。如果必须使用数字13号引脚的输入模式需要使用外部上拉下拉电阻</div>
</div>

View File

@@ -0,0 +1,42 @@
## 数字输入
<img src="{default}/images/inout/digital-input.png" alt="数字输入" style="zoom:67%;" />
```arduino
digitalRead(2);
```
### 描述
> 读取指定引脚的值HIGH或LOW。
### 参数
- 管脚: 引脚编号如1,5,10,A0,A3
### 返回
HIGH 或 LOW
### 范例
读取数字0号引脚的值并通过串口打印出来。
<img src="{default}/images/inout/digital-input-example.png" alt="数字输入示例" style="zoom:67%;" />
```arduino
void setup(){
pinMode(2, INPUT);
Serial.begin(9600);
}
void loop(){
Serial.println(digitalRead(2));
delay(1000);
}
```
<div class="layui-card" style="box-shadow: 1px 1px 4px 1px rgb(0 0 0 / 20%);">
<div class="layui-card-header icon-attention-circled" style="background: #f0b37e;color:#fff;font-size:16px;">注意</div>
<div class="layui-card-body" style="background: #ffedcc;">如果引脚悬空digitalRead()会返回HIGH或LOW随机变化。</div>
</div>

View File

@@ -0,0 +1,44 @@
## 模拟输出
<img src="{default}/images/inout/analog-pin-output.png" alt="模拟输出" style="zoom:67%;" />
```arduino
analogWrite(3, 100);
```
### 描述
> 从一个引脚输出模拟值PWM。 可用于让LED以不同的亮度点亮或驱动电机以不同的速度旋转。
### 参数
- 管脚:引脚编号如3,5,6,9,10,11不同的开发板模拟输入引脚数量不一样。
- 赋值:0完全关闭到255完全打开之间。
### 范例
控制LED实现呼吸灯效果。
<img src="{default}/images/inout/analog-pin-output-example.png" alt="模拟输出示例" style="zoom:67%;" />
```arduino
void setup(){
}
void loop(){
for (int i = 0; i <= 255; i = i + (1)) {
analogWrite(10, i);
delay(10);
}
for (int i = 255; i >= 0; i = i + (-1)) {
analogWrite(10, i);
delay(10);
}
}
```
<div class="layui-card" style="box-shadow: 1px 1px 4px 1px rgb(0 0 0 / 20%);">
<div class="layui-card-header icon-attention-circled" style="background: #f0b37e;color:#fff;font-size:16px;">注意</div>
<div class="layui-card-body" style="background: #ffedcc;">analogWrite函数与模拟引脚、analogRead函数没有直接关系。 在大多数Arduino板ATmega168或ATmega328只有引脚356910和11可以实现该功能。 在Arduino Mega上引脚2到13可以实现该功能。</div>
</div>

View File

@@ -0,0 +1,43 @@
## 模拟输入
<img src="{default}/images/inout/analog-pin-input.png" alt="模拟输入" style="zoom: 67%;" />
```arduino
analogRead(A0);
```
### 描述
> 从指定的模拟引脚读取数据值。
>
> Arduino板包含一个6通道Mini和Nano有8个通道Mega有16个通道10位模拟数字转换器。这意味着它将0至5伏特之间的输入电压映射到0至1023之间的整数值。
### 参数
- 管脚: 引脚编号如A0,A1,A2,A3不同的开发板模拟输入引脚数量不一样。
### 返回
从0到1023的整数值
### 范例
读取模拟A0引脚的值并通过串口打印出来。
<img src="{default}/images/inout/analog-pin-input-example.png" alt="模拟输入示例" style="zoom: 67%;" />
```arduino
void setup(){
pinMode(A0, INPUT);
Serial.begin(9600);
}
void loop(){
Serial.println(analogRead(A0));
}
```
<div class="layui-card" style="box-shadow: 1px 1px 4px 1px rgb(0 0 0 / 20%);">
<div class="layui-card-header icon-attention-circled" style="background: #f0b37e;color:#fff;font-size:16px;">注意</div>
<div class="layui-card-body" style="background: #ffedcc;">如果模拟输入引脚没有连入电路由analogRead()返回的值将根据多项因素(例如其他模拟输入引脚,你的手靠近板子等)产生波动。</div>
</div>

View File

@@ -0,0 +1,84 @@
## 硬件中断
<img src="{default}/images/inout/interrupt-pin.png" alt="中断管脚" style="zoom:67%;" />
```arduino
void attachInterrupt_fun_RISING_2() {
}
void setup(){
pinMode(2, INPUT_PULLUP);
}
void loop(){
attachInterrupt(digitalPinToInterrupt(2),attachInterrupt_fun_RISING_2,RISING);
}
```
### 1.1 描述
> 当发生外部中断时,调用一个指定函数。当中断发生时,该函数会取代正在执行的程序。
>
> 大多数的Arduino板有两个外部中断0数字引脚2和1数字引脚3
>
> Arduino Mege有四个外部中断数字2引脚21320针4引脚195引脚18
>
> ESP8266 、ESP32系列有更多中断。
### 1.2 参数
- 管脚: 引脚编号如2,3不同的开发板中断引脚不一样。
- 模式:
> 改变:当引脚电平发生改变时,触发中断
>
> 上升:当引脚由低电平变为高电平时,触发中断
>
> 下降:当引脚由高电平变为低电平时,触发中断
### 1.3 范例
利用2号引脚中断控制13号引脚的LED亮灭。
<img src="{default}/images/inout/interrupt-pin-example.png" alt="中断管脚示例" style="zoom:67%;" />
```arduino
volatile boolean state;
void attachInterrupt_fun_RISING_2() {
state = !state;
digitalWrite(13,state);
}
void setup(){
state = false;
pinMode(2, INPUT_PULLUP);
pinMode(13, OUTPUT);
attachInterrupt(digitalPinToInterrupt(2),attachInterrupt_fun_RISING_2,RISING);
}
void loop(){
}
```
<div class="layui-card" style="box-shadow: 1px 1px 4px 1px rgb(0 0 0 / 20%);">
<div class="layui-card-header icon-attention-circled" style="background: #f0b37e;color:#fff;font-size:16px;">注意</div>
<div class="layui-card-body" style="background: #ffedcc;">当中断函数发生时delay()和millis()的数值将不会继续变化。当中断发生时,串口收到的数据可能会丢失。你应该声明一个变量来在未发生中断时储存变量。</div>
</div>
## 取消硬件中断
<img src="{default}/images/inout/detach-interrupt-pin.png" alt="取消中断" style="zoom:67%;" />
```arduino
detachInterrupt(digitalPinToInterrupt(2));
```
### 2.1 描述
> 关闭给定的中断。
### 2.2 参数
- 管脚: 引脚编号如23不同的开发板中断引脚不一样。

View File

@@ -0,0 +1,17 @@
## 管脚模式
<img src="{default}/images/inout/pinmode.png" alt="管脚模式" style="zoom:67%;" />
```arduino
pinMode(2, INPUT);
```
### 描述
> 设置指定管脚的模式。
### 参数
- 管脚: 引脚编号如23不同的开发板中断引脚不一样。
- 模式: 要将管脚设置成的模式,包括输入、输出、上拉输入。

View File

@@ -0,0 +1,42 @@
## 脉冲长度
<img src="{default}/images/inout/pin-pulseIn.png" alt="脉冲长度" style="zoom:67%;" />
```arduino
pulseIn(0, HIGH);
pulseIn(0, HIGH, 1000000);
```
### 描述
> 读取一个引脚的脉冲HIGH或LOW
>
> 例如如果value是HIGHpulseIn()会等待引脚变为HIGH开始计时再等待引脚变为LOW并停止计时。返回脉冲的长度单位微秒。如果在指定的时间内无脉冲函数返回。 此函数的计时功能由经验决定长时间的脉冲计时可能会出错。计时范围从10微秒至3分钟。1秒=1000毫秒=1000000微秒
### 参数
- 管脚:你要进行脉冲计时的引脚号int
- 状态:要读取的脉冲类型HIGH或LOWint
- 超时 (可选):指定脉冲计数的等待时间单位为微秒默认值是1秒unsigned long
### 返回
脉冲长度微秒如果等待超时返回0unsigned long
### 范例
读取6号引脚脉冲时长。
<img src="{default}/images/inout/pin-pulseIn-example.png" alt="脉冲长度示例" style="zoom:67%;" />
```arduino
void setup(){
pinMode(6, INPUT);
Serial.begin(9600);
}
void loop(){
Serial.println(pulseIn(6, HIGH));
}
```

View File

@@ -0,0 +1,19 @@
## ShiftOut
<img src="{default}/images/inout/shiftout.png" alt="image-20220528150921075" style="zoom:67%;" />
```arduino
shiftOut(2, 3, MSBFIRST, 0); // 高位先入
shiftOut(2, 3, LSBFIRST, 0); // 低位先入
```
### 描述
> 将一个数据的一个字节一位一位的移出。从最高有效位(最左边)或最低有效位(最右边)开始。依次向数据脚写入每一位,之后时钟脚被拉高或拉低,指示刚才的数据有效。
### 参数
- 数据管脚:输出每一位数据的引脚(int)
- 时钟管脚:时钟脚,当数据管脚有值时此引脚电平变化(int)
- 顺序:输出位的顺序,最高位优先或最低位优先
- 数值: 要移位输出的数据(byte)

View File

@@ -0,0 +1,57 @@
## 软件中断
<img src="{default}/images/inout/software-interrupt.png" alt="软件中断" style="zoom:67%;" />
```arduino
#include <PinChangeInt.h>
void attachPinInterrupt_fun_RISING_2() {
}
void setup(){
pinMode(2, INPUT);
PCintPort::attachInterrupt(2,attachPinInterrupt_fun_RISING_2,RISING);
}
void loop(){
}
```
### 1.1 描述
> 当发生外部中断时,调用一个指定函数。当中断发生时,该函数会取代正在执行的程序。
>
> 本模块为模拟中断,支持所有管脚使用。
### 1.2 参数
- 管脚: 引脚编号如2,3不同的开发板中断引脚不一样。
- 模式:
改变:当引脚电平发生改变时,触发中断上升:当引脚由低电平变为高电平时,触发中断下降:当引脚由高电平变为低电平时,触发中断
### 1.3 范例
利用中断控制13号引脚的LED亮灭。
<div class="layui-card" style="box-shadow: 1px 1px 4px 1px rgb(0 0 0 / 20%);">
<div class="layui-card-header icon-attention-circled" style="background: #f0b37e;color:#fff;font-size:16px;">注意</div>
<div class="layui-card-body" style="background: #ffedcc;">当中断函数发生时delay()和millis()的数值将不会继续变化。当中断发生时,串口收到的数据可能会丢失。你应该声明一个变量来在未发生中断时储存变量。</div>
</div>
## 取消软件中断
<img src="{default}/images/inout/software-detachInterrupt.png" alt="取消软件中断" style="zoom:67%;" />
```arduino
PCintPort::detachInterrupt(2);
```
### 2.1 描述
> 关闭给定的中断。
### 2.2 参数
- 管脚: 引脚编号如23不同的开发板中断引脚不一样。

View File

@@ -0,0 +1,56 @@
## 多功能按键
<img src="{default}/images/inout/OneButton.png" alt="多功能按键" style="zoom:67%;" />
```arduino
#include <OneButton.h>
OneButton button2(2, false);
void attachClick2() {
}
void setup(){
button2.attachClick(attachClick2);
}
void loop(){
button2.tick();
}
```
### 描述
> 设置特定管脚连接的按钮为多功能按钮,并确定不同模式下执行不同的程序。
### 参数
- 多功能按键: 引脚编号如1,5,10A0A3
- 模式: 单击 双击 长按开始 长按中 长按结束
### 范例
将2号端口连接的按钮设置为多功能按钮单击时串口提示“one Click”。
<img src="{default}/images/inout/OneButton-example.png" alt="多功能按键示例" style="zoom:67%;" />
```arduino
#include <OneButton.h>
OneButton button2(2, false);
void attachClick2() {
Serial.println("one click");
}
void setup(){
button2.attachClick(attachClick2);
Serial.begin(9600);
}
void loop(){
button2.tick();
}
```

View File

@@ -0,0 +1,5 @@
## 控制
控制类别中包括了时间延迟、条件执行、循环执行、获取运行时间、初始化、Switch执行等 控制模块中主要执行的内容是对程序结构进行的相应控制。
<img src="{default}/images/control/control.png" alt="控制分类" style="zoom:50%;" />

View File

@@ -0,0 +1,61 @@
## 初始化
<img src="{default}/images/control/setup.png" alt="初始化" style="zoom:67%;" />
```arduino
void setup(){
pinMode(3, OUTPUT);
digitalWrite(3, HIGH);
}
void loop(){
}
```
### 描述
> 在Arduino中程序运行时将首先调用 setup()函数。 用于初始化变量、设置针脚的输出输入类型、配置串口、引入类库文件等等。
### 范例1
初始化时声明变量。
<img src="{default}/images/control/setup-example1.png" alt="初始化示例1" style="zoom:67%;" />
```arduino
volatile int item;
void setup(){
item = 0;
}
void loop(){
}
```
### 范例2
在初始化时定义中断函数。
<img src="{default}/images/control/setup-example2.png" alt="初始化示例2" style="zoom:67%;" />
```arduino
void attachInterrupt_fun_RISING_2() {
digitalWrite(13, LOW);
}
void setup(){
pinMode(13, OUTPUT);
pinMode(2, INPUT_PULLUP);
digitalWrite(13, HIGH);
attachInterrupt(digitalPinToInterrupt(2), attachInterrupt_fun_RISING_2,RISING);
}
void loop(){
}
```
<div class="layui-card" style="box-shadow: 1px 1px 4px 1px rgb(0 0 0 / 20%);">
<div class="layui-card-header icon-attention-circled" style="background: #f0b37e;color:#fff;font-size:16px;">注意</div>
<div class="layui-card-body" style="background: #ffedcc;">每次 Arduino 上电或重启后setup 函数只运行一次。</div>
</div>

View File

@@ -0,0 +1,36 @@
## while 循环
<img src="{default}/images/control/while.png" alt="while" style="zoom:67%;" />
```arduino
while (true) {
}
```
### 描述
> while循环会无限的循环直到括号内的判断语句变为假。 必须要有能改变判断语句的东西要不然while循环将永远不会结束。你可以使用一个传感器的值或者一个变量来控制什么时候停止该循环。
### 参数
- 满足条件:为真或为假的一个条件。
### 范例
当温度高于30度时亮灯否则灭灯。
<img src="{default}/images/control/while-example.png" alt="while示例" style="zoom:67%;" />
```arduino
void setup(){
pinMode(13, OUTPUT);
}
void loop(){
while (analogRead(A0)*0.488 > 30) {
digitalWrite(13, HIGH);
}
digitalWrite(13, LOW);
}
```

View File

@@ -0,0 +1,43 @@
## 延时
<img src="{default}/images/control/delay.png" alt="延时" style="zoom:67%;" />
```arduino
delay(1000);
```
### 描述
> 使程序暂定设定的时间单位毫秒一秒等于1000毫秒
### 参数
- 毫秒:暂停的毫秒数。
### 范例
13号引脚灯亮1秒灭1秒往复循环。
<img src="{default}/images/control/delay-example.png" alt="延时示例" style="zoom:67%;" />
```arduino
void setup(){
pinMode(13, OUTPUT);
}
void loop(){
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(1000);
}
```
<div class="layui-card" style="box-shadow: 1px 1px 4px 1px rgb(0 0 0 / 20%);">
<div class="layui-card-header icon-attention-circled" style="background: #f0b37e;color:#fff;font-size:16px;">注意</div>
<div class="layui-card-body" style="background: #ffedcc;">虽然创建一个使用delay()的闪烁LED很简单并且许多例子将很短的delay用于消除开关抖动。
<br /><br />
但delay()确实拥有很多显著的缺点。在delay函数使用的过程中读取传感器值、计算、引脚操作均无法执行因此它所带来的后果就是使其他大多数活动暂停。大多数熟练的程序员通常避免超过10毫秒的delay(),除非arduino程序非常简单。
<br /><br />
利用定时器就可以解决这个问题可以避免由于delay()带来的CPU暂停也能很好地实现每隔一定时间执行动作。</div>
</div>

View File

@@ -0,0 +1,86 @@
## if 选择
<img src="{default}/images/control/if.png" alt="if" style="zoom:67%;" />
```arduino
if (false) {
}
```
### 描述
> if 语句与比较运算符一起用于检测某个条件是否达成,如某个传感器的值是否等于某个值。
### 参数
- 条件:比较表达式
### 用法
增加条件:如果需要增加条件,可以点开齿轮,然后将左侧的“否则如果”或者“否则”模块拖到右侧的“如果”之中。
<img src="{default}/images/control/if-else.png" alt="if-else" style="zoom:67%;" />
### 范例1
当连接在2号引脚的按键按下时点亮13号引脚的灯。
<img src="{default}/images/control/if-else-example1.png" alt="if-else示例1" style="zoom:67%;" />
```arduino
void setup(){
pinMode(2, INPUT);
pinMode(13, OUTPUT);
}
void loop(){
if (digitalRead(2) == 1) {
digitalWrite(13, HIGH);
}
}
```
如果判断的条件大于等于1时可以省略等于判断因为只要 该表达式的结果不为0则为真。
所以,上面的写法与下面的写法等效。
<img src="{default}/images/control/if-else-example2.png" alt="if-ese示例2" style="zoom:67%;" />
```arduino
void setup(){
pinMode(2, INPUT);
pinMode(13, OUTPUT);
}
void loop(){
if (digitalRead(2)) {
digitalWrite(13, HIGH);
}
}
```
### 范例2
当连接在2号引脚的按键按下时点亮13号引脚的灯;当按键松开时,灯灭。
<img src="{default}/images/control/if-else-example3.png" alt="if-else示例3" style="zoom:67%;" />
```arduino
void setup(){
pinMode(2, INPUT);
pinMode(13, OUTPUT);
}
void loop(){
if (digitalRead(2)) {
digitalWrite(13, HIGH);
} else {
digitalWrite(13, LOW);
}
}
```
<div class="layui-card" style="box-shadow: 1px 1px 4px 1px rgb(0 0 0 / 20%);">
<div class="layui-card-header icon-attention-circled" style="background: #f0b37e;color:#fff;font-size:16px;">注意</div>
<div class="layui-card-body" style="background: #ffedcc;">另外一种进行多种条件分支判断的语句是switch case语句。</div>
</div>

View File

@@ -0,0 +1,55 @@
## switch 选择
<img src="{default}/images/control/switch.png" alt="switch" style="zoom:67%;" />
```arduino
switch (NULL) {
}
```
### 描述
> 和if语句相同switch…case通过设定的在不同条件下执行的代码控制程序的流程。
>
> 特别地switch语句将变量值和case语句中设定的值进行比较。当一个case语句中的设定值与变量值相同时这条case语句将被执行。
>
> 关键字break可用于退出switch语句通常每条case语句都以break结尾。如果没有break语句switch语句将会一直执行接下来的语句一直向下直到遇见一个break或者直到switch语句结尾。
### 参数
- var: 用于与下面的case中的标签进行比较的变量值
- label: 与变量进行比较的值
### 用法
增加case如果需要增加条件可以点开齿轮然后将左侧的“case”或者“default”模块拖到右侧的“switch”之中。
<img src="{default}/images/control/switch-case.png" alt="switch-case" style="zoom:67%;" />
### 范例
当连接在2号引脚的按键按下时点亮13号引脚的灯否则13号引脚的灯灭。
<img src="{default}/images/control/switch-case-example.png" alt="switch-case示例" style="zoom:67%;" />
```arduino
void setup(){
pinMode(2, INPUT);
pinMode(13, OUTPUT);
}
void loop(){
switch (digitalRead(2)) {
case true:
digitalWrite(13, HIGH);
break;
default:
digitalWrite(13, HIGH);
}
}
```
<div class="layui-card" style="box-shadow: 1px 1px 4px 1px rgb(0 0 0 / 20%);">
<div class="layui-card-header icon-attention-circled" style="background: #f0b37e;color:#fff;font-size:16px;">注意</div>
<div class="layui-card-body" style="background: #ffedcc;">每个switch可以有多个case但是最多不超过一个default当不满足任何一个case时执行default中的程序。</div>
</div>

View File

@@ -0,0 +1,54 @@
## for 循环
<img src="{default}/images/control/for.png" alt="for" style="zoom:67%;" />
```arduino
for (int i = 1; i <= 10; i = i + (1)) {
}
```
### 描述
> for循环用于重复执行一段的程序。通常使用一个增量计数器计数并终止循环。
>
> for循环用于重复性的操作非常有效通常与数组结合起来使用来操作数据、引脚。
### 参数
- 变量名用于记录for循环次数的变量名。
- 起始值循环的计数起始值一般从0开头也可以从其他数值开始。
- 终点值:循环的计数终点值。
- 步长每次循环的步长一般为1也可以是其他整数。
### 用法
可自行设置循环的变量名称,并确定循环的开始和终止以及循环方向,最后一个数字可以为负数。
<img src="{default}/images/control/for-example1.png" alt="for示例1" style="zoom:67%;" />
### 范例
将连接在3号引脚的灯制作成呼吸灯每一次亮度变化之间间隔50毫秒。
<img src="{default}/images/control/for-example2.png" alt="for示例2" style="zoom:67%;" />
```arduino
void setup(){
}
void loop(){
for (int i = 0; i <= 255; i = i + (1)) {
analogWrite(3, i);
delay(50);
}
for (int i = 255; i >= 0; i = i + (-1)) {
analogWrite(3, i);
delay(50);
}
}
```
<div class="layui-card" style="box-shadow: 1px 1px 4px 1px rgb(0 0 0 / 20%);">
<div class="layui-card-header icon-attention-circled" style="background: #f0b37e;color:#fff;font-size:16px;">注意</div>
<div class="layui-card-body" style="background: #ffedcc;">for循环中定义的变量有名字可以用字母i,j,k或单词red,state等有意义的词语表示。</div>
</div>

View File

@@ -0,0 +1,46 @@
## 跳出循环
<img src="{default}/images/control/break.png" alt="break" style="zoom:67%;" />
```arduino
break;
```
### 描述
> 跳出循环用于终止一段重复的程序,一般使用时作为条件语句的执行部分,当循环中的变量满足某个条件时,执行跳出循环语句。
>
> 跳出循环在处理循环中的特殊情况时十分有用。
### 参数
- 操作:可以选择跳出循环和跳到下一个循环两种操作,结果不同。
### 范例
引脚3上的数字从0到255逐一增加每一次增加之间间隔50毫秒当数字增加到150时停止增加。
<img src="{default}/images/control/break-example.png" alt="break示例" style="zoom:67%;" />
```arduino
void setup(){
pinMode(A0, INPUT);
pinMode(3, OUTPUT);
}
void loop(){
for (int i = 0; i <= 255; i = i + (1)) {
if (analogRead(A0) == 130) {
break;
} else {
analogWrite(3, i);
delay(50);
}
}
}
```
<div class="layui-card" style="box-shadow: 1px 1px 4px 1px rgb(0 0 0 / 20%);">
<div class="layui-card-header icon-attention-circled" style="background: #f0b37e;color:#fff;font-size:16px;">注意</div>
<div class="layui-card-body" style="background: #ffedcc;">注意跳到下一个循环的使用,可以方便的将循环中不需要的步骤跳过。</div>
</div>

View File

@@ -0,0 +1,36 @@
## 系统运行时间
<img src="{default}/images/control/get-time.png" alt="系统运行时间" style="zoom: 50%;" />
```arduino
millis(); // 系统运行时间(毫秒)
micros(); // 系统运行时间(微秒)
```
### 描述
> 返回自硬件启动或重启以来的时间值。
### 返回
自硬件启动或重启以来的时间,毫秒数或者微秒数。
### 范例
自动换行打印系统运行时间。
<img src="{default}/images/control/get-time-example.png" alt="系统运行时间示例" style="zoom:67%;" />
```arduino
void setup(){
pinMode(2, INPUT);
Serial.begin(9600);
}
void loop(){
if (digitalRead(2)) {
Serial.println(millis());
}
}
```

View File

@@ -0,0 +1,65 @@
## MsTimer2 定时器
<img src="{default}/images/control/ms-timer2.png" alt="MsTimer2" style="zoom:67%;" />
```arduino
MsTimer2::set(500, msTimer2_func);
```
### 1.1 描述
> 每隔设置的毫秒数执行相应的程序
### 1.2 范例
利用定时器控制13号引脚LED每隔1秒亮灭一次。
<img src="{default}/images/control/ms-timer2-example.png" alt="MsTimer2示例" style="zoom:67%;" />
```arduino
#include <MsTimer2.h>
volatile boolean state;
void msTimer2_func() {
state = !state;
digitalWrite(13, state);
}
void setup(){
state = false;
pinMode(13, OUTPUT);
MsTimer2::set(1000, msTimer2_func);
MsTimer2::start();
}
void loop(){
}
```
<div class="layui-card" style="box-shadow: 1px 1px 4px 1px rgb(0 0 0 / 20%);">
<div class="layui-card-header icon-attention-circled" style="background: #f0b37e;color:#fff;font-size:16px;">注意</div>
<div class="layui-card-body" style="background: #ffedcc;">利用定时器可以提高硬件的工作效率。
<br/><br/>
但在一个程序中只能使用一个MsTimer2定时器如果要实现多个时间的定时可以配合变量计数来完成。</div>
</div>
## MsTimer2 定时器启动
<img src="{default}/images/control/ms-timer2-start.png" alt="MsTimer2启动" style="zoom:67%;" />
```arduino
MsTimer2::start();
```
### 2.1 描述
> MsTimer2定时器开始计时
## MsTimer2 定时器停止
<img src="{default}/images/control/ms-timer2-stop.png" alt="MsTimer2停止" style="zoom:67%;" />
### 3.1 描述
> MsTimer2定时器停止计时

View File

@@ -0,0 +1,56 @@
## 简单定时器
<img src="{default}/images/control/simple-timer.png" alt="简单定时器" style="zoom:67%;" />
```arduino
#include <SimpleTimer.h>
SimpleTimer timer;
void Simple_timer_1() {
}
void setup(){
timer.setInterval(1000L, Simple_timer_1);
}
void loop(){
timer.run();
}
```
### 描述
> 设置不同的简单定时器,每隔指定秒数执行相应的程序常用于多任务处理。
### 范例
1213分别连接LED灯每隔200ms12引脚LED灯切换亮灭 每隔300msD13引脚LED灯切换亮灭。
<img src="{default}/images/control/simple-timer-example.png" alt="简单定时器示例" style="zoom:67%;" />
```arduino
#include <SimpleTimer.h>
SimpleTimer timer;
void Simple_timer_1() {
digitalWrite(12,digitalRead(12));
}
void Simple_timer_2() {
digitalWrite(13,digitalRead(13));
}
void setup(){
pinMode(12, OUTPUT);
timer.setInterval(200L, Simple_timer_1);
pinMode(13, OUTPUT);
timer.setInterval(300L, Simple_timer_2);
}
void loop(){
timer.run();
}
```

View File

@@ -0,0 +1,68 @@
## 允许中断
<img src="{default}/images/control/interrupts.png" alt="允许中断" style="zoom:67%;" />
```arduino
interrupts();
```
### 1.1 描述
> 允许输入/输出模块中管脚中断的运行
### 1.2 范例
使用按钮模拟开关每次按下LED灯切换亮灭。
<img src="{default}/images/control/interrupts-example.png" alt="允许中断示例" style="zoom:67%;" />
```arduino
void attachInterrupt_fun_RISING_2() {
digitalWrite(10,digitalRead(10));
}
void setup(){
pinMode(2, INPUT_PULLUP);
pinMode(10, OUTPUT);
interrupts();
attachInterrupt(digitalPinToInterrupt(2), attachInterrupt_fun_RISING_2,RISING);
}
void loop(){
}
```
## 禁止中断
<img src="{default}/images/control/no-interrupts.png" alt="禁止中断" style="zoom:67%;" />
```arduino
noInterrupts();
```
### 2.1 描述
> 禁止输入/输出模块中管脚中断的运行
### 2.2 范例
在允许中断范例的基础上,尝试禁止中断。
<img src="{default}/images/control/no-interrupts-example.png" alt="禁止中断示例" style="zoom:67%;" />
```arduino
void attachInterrupt_fun_RISING_2() {
digitalWrite(10,digitalRead(10));
}
void setup(){
pinMode(2, INPUT_PULLUP);
pinMode(10, OUTPUT);
noInterrupts();
attachInterrupt(digitalPinToInterrupt(2), attachInterrupt_fun_RISING_2,RISING);
}
void loop(){
}
```

View File

@@ -0,0 +1,69 @@
## SCoop Task
<img src="{default}/images/control/scoop-task.png" alt="SCoop Task" style="zoom:67%;" />
```arduino
#include "SCoop.h"
defineTask(scoopTask1)
void scoopTask1::setup(){
}
void scoopTask1::loop(){
}
void setup(){
mySCoop.start();
}
void loop(){
yield();
sleep(1000);
}
```
### 描述
> SCoop模块用于执行多线程任务最多支持8个任务。
### 范例
利用SCoop控制13号引脚LED灯以2秒的频率闪烁同时控制12号引脚的LED灯以200毫秒的频率闪烁。
<img src="{default}/images/control/scoop-task-example.png" alt="SCoop Task示例" style="zoom:67%;" />
```arduino
#include "SCoop.h"
defineTask(scoopTask1)
void scoopTask1::setup(){
pinMode(13, OUTPUT);
}
void scoopTask1::loop(){
digitalWrite(13, HIGH);
sleep(1000);
digitalWrite(13, LOW);
sleep(1000);
}
defineTask(scoopTask2)
void scoopTask2::setup(){
pinMode(12, OUTPUT);
}
void scoopTask2::loop(){
digitalWrite(12, HIGH);
sleep(100);
digitalWrite(12, LOW);
sleep(100);
}
void setup(){
pinMode(13, OUTPUT);
mySCoop.start();
pinMode(12, OUTPUT);
}
void loop(){
yield();
}
```

View File

@@ -0,0 +1,221 @@
## 快捷键
### 1.1 页面操作快捷键
| 页面操作 | 快捷键 |
| :------------------: | :--------------------: |
| 重载页面 | `Ctrl` + `R` |
| 还原页面 | `Ctrl` + `0` |
| 关闭窗口 | `Ctrl` + `W` |
| 最小化窗口 | `Ctrl` + `M` |
| 打开新窗口 | `Ctrl` + `Shift` + `N` |
| 缩小页面 | `Ctrl` + `Shift` + `-` |
| 放大页面 | `Ctrl` + `Shift` + `=` |
| 打开或关闭开发者工具 | `Ctrl` + `Shift` + `I` |
### 1.2 Blockly图形块操作快捷键
| Blockly图形块操作 | 快捷键 |
| :---------------: | :--------------------: |
| 复制 | `Ctrl` + `C` |
| 粘贴 | `Ctrl` + `V` |
| 查找 | `Ctrl` + `F` |
| 跨页面复制 | `Ctrl` + `Shift` + `C` |
| 跨页面粘贴 | `Ctrl` + `Shift` + `V` |
### 1.3 代码编辑器操作快捷键
| 代码编辑器操作 | 快捷键 |
| :------------: | :--------------------: |
| 命令面板 | `F1` |
| 查找 | `Ctrl` + `F` |
| 替换 | `Ctrl` + `H` |
| 增大字体 | `Ctrl` + `=` |
| 减小字体 | `Ctrl` + `-` |
| 切换行注释 | `Ctrl` + `/` |
| 切换块注释 | `Ctrl` + `Shift` + `/` |
### 1.4 状态栏操作快捷键
| 状态栏操作 | 快捷键 |
| :--------: | :--------------------: |
| 增大字体 | `Ctrl` + `=` |
| 减小字体 | `Ctrl` + `-` |
| 清空状态栏 | `Ctrl` + `E` |
| 串口终端 | `Ctrl` + `T` |
| 发送Ctrl+C | `Ctrl` + `Shift` + `C` |
| 发送Ctrl+D | `Ctrl` + `Shift` + `D` |
## 界面介绍
Mixly软件主要分成图形化程序选择区、图形化程序编辑区、代码预览区、系统功能区、消息提示区。
<img src="{default}/images/base/interface-2.png" alt="界面1" style="zoom: 33%;" />
### 2.1 图形化程序选择区
图形化程序选择区中包含了各类图形化程序,每一个类别中都包含多个图形化。通过将这些图形块拖动到图形化程序编辑区就可以完成编程。
<img src="{default}/images/base/interface-3.png" alt="图形化程序选择区" style="zoom: 50%;" />
如果你是初次使用,不知道某些图形块所处的分类名,也可以通过图形化程序选择区上方的搜索框来查找带有某一个或几个关键词的图形块。通过输入多个关键词可实现精确查找。
| ![查找1]({default}/images/base/interface-4.png) | ![查找2]({default}/images/base/interface-5.png) |
| ----------------------------------------------- | ----------------------------------------------- |
<div class="layui-card" style="box-shadow: 1px 1px 4px 1px rgb(0 0 0 / 20%);">
<div class="layui-card-header icon-attention-circled" style="background: #f0b37e;color:#fff;font-size:16px;">注意</div>
<div class="layui-card-body" style="background: #ffedcc;">在图形化程序选择区中查找图形块时,多个关键词之间需用空格分隔开。</div>
</div>
### 2.2 程序编写区
<img src="{default}/images/base/interface-6.png" alt="程序编写区" style="zoom: 33%;" />
#### 1. 程序编写
我们通常把能完成一定功能的代码块拖动到该区域处进行连接。
#### 2. 程序删除
- 将不需要的代码拖到右下方的垃圾桶。
- 将不用的代码拖到最左侧的图形化程序选择区。
- 选中不用的代码后点击键盘Delete或者Backspace键。
#### 3. 程序缩放
在右下角垃圾桶上方有缩放按钮。
- 第一个按钮是图形块大小正常化并居中。
- 第二个是放大图形块。
- 第三个是缩小图形块。
<img src="{default}/images/base/interface-7.png" alt="程序缩放" style="zoom: 67%;" />
当然,你也可以直接使用鼠标滚轮进行缩放。
#### 4. 程序整理
当编写的程序比较多时,需要对程序进行整理。
在空白区右击,选择清理块。
| 清理前 | 清理后 |
| :----------------------------------------------: | :----------------------------------------------: |
| ![清理前]({default}/images/base/interface-8.png) | ![清理后]({default}/images/base/interface-9.png) |
#### 5. 程序复制
在图形块上右击,选择复制,会产生一个一样的块,但该方式只能复制一个块。
<img src="{default}/images/base/interface-19.png" alt="程序复制" style="zoom:50%;" />
先用鼠标拖住多个块,再按下 `Ctrl` + `Shift` + `C``Ctrl` + `Shift` + `V` 可以复制多块。
#### 6. 撤销及重做
在返回主页面按钮右边有两个连续的按钮分别是撤销undo`Ctrl` + `Z`及重做redo`Ctrl` + `Y`)。
撤销功能是当我们编写代码时误删代码后,便可点击左箭头或直接按 `Ctrl` + `Z` 来恢复误删代码。
而重做则是和 `Ctrl` + `Z` 相反,它是恢复上一步操作,该功能也可通过点击右箭头或直接键入 `Ctrl` + `Y` 来实现。
#### 7. 垃圾桶
被删除的块可以在垃圾桶里找到,点击右下角垃圾桶图标即可显示此前被删除的所有图形块。
| 无被删除的图形块 | 有被删除的图形块 |
| :----------------------------------------------------------: | :----------------------------------------------------------: |
| <img src="{default}/images/base/interface-10.png" alt="垃圾桶无可回收块" style="zoom:67%;" /> | <img src="{default}/images/base/interface-11.png" alt="垃圾桶" style="zoom:67%;" /> |
#### 8. 背包
在图形块上右击,选择加入背包即可将当前图形块放入背包,你可以将任意图形块或拼接块加入背包。
<img src="{default}/images/base/interface-12.png" alt="加入背包" style="zoom:67%;" />
在背包中用鼠标悬浮与某个块同时右击,选择从背包中移除即可将此块从背包中删除。如果想清空背包中的所有块,鼠标在右上角的书包上右击,选择清空即可。
| 背包 | 从背包中移除 | 清空背包 |
| :----------------------------------------------------------: | :----------------------------------------------------------: | :----------------------------------------------------------: |
| <img src="{default}/images/base/interface-14.png" alt="背包" style="zoom: 67%;" /> | <img src="{default}/images/base/interface-13.png" alt="从背包中移除" style="zoom: 67%;" /> | <img src="{default}/images/base/interface-15.png" alt="清空背包" style="zoom: 67%;" /> |
#### 9. 查找图形块
当图形化程序编写区中图形块过多时,你可以使用图形块查找工具来快速定位你所要查看的图形块。通过在图形化程序编写区中右击,选择查找图形块,你可以打开图形块查找工具。
| <img src="{default}/images/base/interface-16.png" alt="查找图形块按钮" style="zoom:67%;" /> | <img src="{default}/images/base/interface-17.png" alt="查找图形块工具" /> |
| :----------------------------------------------------------: | :----------------------------------------------------------: |
<img src="{default}/images/base/interface-18.png" alt="查找图形块示例" style="zoom: 55%;" />
输入一个关键词即可查找出对应的图形化模块,其中灰色块为当前查找所定位的图形块,而黑色块为查找出的全部图形块,你可以使用此工具中的上下箭头来定位上一个或下一个图形块。
#### 10. 打开wiki
当在板卡页面配置中开启wiki并且当某个图形块关联了此wiki中某一页时将会在图形化的右键菜单里显示打开wiki选项点击后即可在新页面下打开关联的wiki页。
### 2.3 代码预览区
<img src="{default}/images/base/interface-20.png" alt="代码预览区" style="zoom: 50%;" />
该区域可通过点击右侧深灰色箭头来显示或隐藏。
在图形化程序选择区拖拽图形块后,在代码编辑区会生成对应的代码。可以帮助用户掌握代码的学习。
<div class="layui-card" style="box-shadow: 1px 1px 4px 1px rgb(0 0 0 / 20%);">
<div class="layui-card-header icon-attention-circled" style="background: #f0b37e;color:#fff;font-size:16px;">注意</div>
<div class="layui-card-body" style="background: #ffedcc;">在该区域无法直接对代码进行编辑,需要点击图形化程序选择区左上角的 代码 按钮才能进行编辑。</div>
</div>
### 2.4 消息提示区
#### 1. 输出
输出栏通常是给学生予以信息反馈的场所。比如编译或上传进程中,编译或上传是否成功,如果失败原因是什么。
![输出]({default}/images/base/interface-21.png)
#### 2. 串口
串口栏用于实时显示串口收到的数据,如果代码中包含 `Serial.begin(xxx);` 则在代码上传完成后打开串口时自动将波特率设置为xxx。注意xxx只可以在[9600, 19200, 28800, 38400, 57600, 115200]中取值,如果代码中设置的值不在此范围内,串口打开时的波特率将会使用配置文件中的默认值。
串口栏支持同时接收多个串口的数据并支持使用mixly提供的相关串口指令操作串口。当然你也可以在串口栏中右击来选择需要进行的操作。
| 打开多个串口 | 右键菜单 | 串口终端 |
| :----------------------------------------------------------: | :----------------------------------------------------------: | :----------------------------------------------------------: |
| <img src="{default}/images/base/interface-22.png" alt="打开多个串口" style="zoom:67%;" /> | <img src="{default}/images/base/interface-23.png" alt="右键菜单" style="zoom: 67%;" /> | <img src="{default}/images/base/interface-24.png" alt="串口终端" style="zoom:67%;" /> |
### 2.5 系统功能区
系统功能区主要执行的功能有新建、打开、保存、另存为、导入库、管理库、编译、上传、选择主控板型号及端口、串口监视器及工作区切换等功能。
<img src="{default}/images/base/interface-25.png" alt="系统功能区" style="zoom:50%;" />
## 编译&上传
当用户编写完代码后,如果想要检查代码逻辑是否有误,可点击编译。
如果显示“编译失败”,则需要根据提示检查自己的代码,如显示“编译成功”则证明代码逻辑上无误,可上传。
如果出现“上传失败”大多数情况插拔USB线即可解决该问题。
如果出现“上传成功”,则证明代码已上传至板子上。当然,如果用户对于代码逻辑信心十足,可直接点击上传按钮。
## 板卡&端口
当用户点击主控板下拉三角时即可看到有众多主控板型号可供选择。用户需按照当前手中主控板型号予以选择。
<img src="{default}/images/base/interface-26.png" alt="板卡" style="zoom:67%;" />
选择好板卡后,还需要选择该板卡对应的端口号,端口号是计算机与板卡通信的通道。
<img src="{default}/images/base/interface-27.png" alt="端口" style="zoom:67%;" />
## 串口监视器
串口监视器与模块选择区的通信模块中的串口通信指令一起使用。 可以用于输出变量、传感器数值等。
| ![串口监视器]({default}/images/base/interface-28.png) | ![串口可视化]({default}/images/base/interface-29.png) |
| :---------------------------------------------------: | :---------------------------------------------------: |