玩转Mixly – 2、Arduino AVR编程 之 输入输出

以下内容源自Mixly官方技术文档:

https://mixly.readthedocs.io/zh_CN/latest/Arduino/AVR/01Input-Output.html

 

输入/输出

输入/输出所包含的指令主要分为四部分:控制管脚的输入输出(按信号类型可分为数字信号和模拟信号)、中断、脉冲长度及ShiftOut。

  • 输入输出:数字输入、数字输出、模拟输入、模拟输出

  • 中断控制:定义中断,取消中断

  • 脉冲长度

  • 移位输出

1.数字输出

1

2

digitalWrite(0,HIGH);//输出高电平

digitalWrite(0,LOW);//输出低电平

 

 

1.1 描述

给一个数字引脚写入HIGH或者LOW。

1.2 参数

  • 管脚: 引脚编号(如1,5,10,A0,A3)

  • 值: 高 或 低

1.3 范例

将13号端口设置为高电平,延迟一秒,然后设置为低电平,再延迟一秒,如此往复。

1

2

3

4

5

6

7

8

9

void setup(){

pinMode(13, OUTPUT);

}

void loop(){

digitalWrite(13,HIGH);

delay(1000);

digitalWrite(13,LOW);

delay(1000);

}

 

 

注意

数字13号引脚难以作为数字输入使用,因为大部分的控制板上使用了一颗LED与一个电阻连接到他。如果启动了内部的20K上拉电阻,他的电压将在1.7V左右,而不是正常的5V,因为板载LED串联的电阻把他使他降了下来,这意味着他返回的值总是LOW。如果必须使用数字13号引脚的输入模式,需要使用外部上拉下拉电阻。

注意

模拟引脚也可以当做数字引脚使用,使用方法是管脚设置为A0,A1,A2等。

2.数字输入

1

digitalRead(0);

 

 

2.1 描述

读取指定引脚的值,HIGH或LOW。

2.2 参数

  • 管脚: 引脚编号(如1,5,10,A0,A3)

2.3 返回

HIGH 或 LOW

2.4 范例

读取数字0号引脚的值,并通过串口打印出来。

1

2

3

4

5

6

7

void setup(){

Serial.begin(9600);

pinMode(0, INPUT);

}

void loop(){

Serial.println(digitalRead(0));

}

 

 

注意

如果引脚悬空,digitalRead()会返回HIGH或LOW(随机变化)。

3.模拟输入

1

analogRead(A0);

 

 

3.1 描述

从指定的模拟引脚读取数据值。

Arduino板包含一个6通道(Mini和Nano有8个通道,Mega有16个通道),10位模拟数字转换器。这意味着它将0至5伏特之间的输入电压映射到0至1023之间的整数值。

3.2 参数

  • 管脚: 引脚编号(如A0,A1,A2,A3)不同的开发板模拟输入引脚数量不一样。

3.3 返回

从0到1023的整数值

3.4 范例

读取模拟A0引脚的值,并通过串口打印出来。

1

2

3

4

5

6

void setup(){

Serial.begin(9600);

}

void loop(){

Serial.println(analogRead(A0));

}

 

 

注意

如果模拟输入引脚没有连入电路,由analogRead()返回的值将根据多项因素(例如其他模拟输入引脚,你的手靠近板子等)产生波动。

4.模拟输出

1

analogWrite(3,100);

 

 

4.1 描述

从一个引脚输出模拟值(PWM)。 可用于让LED以不同的亮度点亮或驱动电机以不同的速度旋转。

4.2 参数

  • 管脚:引脚编号(如3,5,6,9,10,11)不同的开发板模拟输入引脚数量不一样。

  • 赋值:0(完全关闭)到255(完全打开)之间。

4.3 范例

控制LED实现呼吸灯效果。

1

2

3

4

5

6

7

8

9

10

11

12

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);

}

}

 

 

注意

analogWrite函数与模拟引脚、analogRead函数没有直接关系。 在大多数Arduino板(ATmega168或ATmega328),只有引脚3,5,6,9,10和11可以实现该功能。 在Arduino Mega上,引脚2到13可以实现该功能。

5.中断指令

1

2

3

4

5

6

7

8

void attachInterrupt_fun_2() {

}

void setup(){

pinMode(2, INPUT);

}

void loop(){

attachInterrupt(digitalPinToInterrupt(2),attachInterrupt_fun_2,RISING);

}

 

 

5.1 描述

当发生外部中断时,调用一个指定函数。当中断发生时,该函数会取代正在执行的程序。

大多数的Arduino板有两个外部中断:0(数字引脚2)和1(数字引脚3)。

Arduino Mege有四个外部中断:数字2(引脚21),3(20针),4(引脚19),5(引脚18)。

ESP8266 、ESP32系列有更多中断。

5.2 参数

  • 管脚: 引脚编号(如2,3)不同的开发板中断引脚不一样。

  • 模式:

改变:当引脚电平发生改变时,触发中断

上升:当引脚由低电平变为高电平时,触发中断

下降:当引脚由高电平变为低电平时,触发中断

5.3 范例

利用2号引脚中断,控制13号引脚的LED亮灭。

1

2

3

4

5

6

7

8

9

10

11

12

13

volatile boolean state;

void attachInterrupt_fun_2() {

state = !state;

digitalWrite(13,state);

}

void setup(){

state = false;

pinMode(2, INPUT);

pinMode(13, OUTPUT);

attachInterrupt(digitalPinToInterrupt(2),attachInterrupt_fun_2,RISING);

}

void loop(){

}

 

 

注意

当中断函数发生时,delay()和millis()的数值将不会继续变化。当中断发生时,串口收到的数据可能会丢失。你应该声明一个变量来在未发生中断时储存变量。

6.取消中断

1

detachInterrupt(digitalPinToInterrupt(2));

 

 

6.1 描述

关闭给定的中断。

6.2 参数

  • 管脚: 引脚编号(如2,3)不同的开发板中断引脚不一样。

7. 脉冲长度

1

2

pulseIn(0, HIGH);

pulseIn(0, HIGH, 1000000);

 

 

7.1 描述

读取一个引脚的脉冲(HIGH或LOW)。

例如,如果value是HIGH,pulseIn()会等待引脚变为HIGH,开始计时,再等待引脚变为LOW并停止计时。返回脉冲的长度,单位微秒。如果在指定的时间内无脉冲,函数返回。 此函数的计时功能由经验决定,长时间的脉冲计时可能会出错。计时范围从10微秒至3分钟。(1秒=1000毫秒=1000000微秒)

7.2 参数

  • 管脚:你要进行脉冲计时的引脚号(int)。

  • 状态:要读取的脉冲类型,HIGH或LOW(int)。

  • 超时 (可选):指定脉冲计数的等待时间,单位为微秒,默认值是1秒(unsigned long)。

7.3 返回

脉冲长度(微秒),如果等待超时返回0(unsigned long)

7.4 范例

读取6号引脚脉冲时长。

1

2

3

4

5

6

7

void setup(){

Serial.begin(9600);

pinMode(6, INPUT);

}

void loop(){

Serial.println(pulseIn(6, HIGH));

}

 

 

8.管脚模式

1

pinMode(0, INPUT);

 

 

8.1 描述

设置指定管脚的模式。

8.2 参数

  • 管脚: 引脚编号(如2,3)不同的开发板中断引脚不一样。

  • 模式: 要将管脚设置成的模式,包括输入、输出、上拉输入。

9.ShiftOut

1

2

shiftOut(0,0,MSBFIRST,0);//高位先入

shiftOut(0,0,LSBFIRST,0);//低位先入

 

 

9.1 描述

将一个数据的一个字节一位一位的移出。从最高有效位(最左边)或最低有效位(最右边)开始。依次向数据脚写入每一位,之后时钟脚被拉高或拉低,指示刚才的数据有效。

9.2 参数

  • 数据管脚:输出每一位数据的引脚(int)

  • 时钟管脚:时钟脚,当数据管脚有值时此引脚电平变化(int)

  • 顺序:输出位的顺序,最高位优先或最低位优先

  • 数值: 要移位输出的数据(byte)

10.管脚中断

1

PCintPort::attachInterrupt(0,attachPinInterrupt_fun_0,RISING);

 

 

10.1 描述

当发生外部中断时,调用一个指定函数。当中断发生时,该函数会取代正在执行的程序。

本模块为模拟中断,支持所有管脚使用。

10.2 参数

  • 管脚: 引脚编号(如2,3)不同的开发板中断引脚不一样。

  • 模式:

改变:当引脚电平发生改变时,触发中断

上升:当引脚由低电平变为高电平时,触发中断

下降:当引脚由高电平变为低电平时,触发中断

10.3 范例

利用中断,控制13号引脚的LED亮灭。

注意

当中断函数发生时,delay()和millis()的数值将不会继续变化。当中断发生时,串口收到的数据可能会丢失。你应该声明一个变量来在未发生中断时储存变量。

11.取消管脚中断

1

detachInterrupt(digitalPinToInterrupt(2));

 

 

11.1 描述

关闭给定的中断。

11.2 参数

  • 管脚: 引脚编号(如2,3)不同的开发板中断引脚不一样。

12.多功能按键

1

2

3

4

5

6

7

8

9

OneButton button0(0,true);

void attachClick0() {

}

void setup(){

button0.attachClick(attachClick0);

}

void loop(){

button0.tick();

}

 

 

12.1 描述

设置特定管脚连接的按钮为多功能按钮,并确定不同模式下执行不同的程序。

12.2 参数

  • 多功能按键: 引脚编号(如1,5,10,A0,A3)

  • 模式: 单击 双击 长按开始 长按中 长按结束

12.3 范例

将2号端口连接的按钮设置为多功能按钮,单击时串口提示“one Click”

1

2

3

4

5

6

7

8

9

10

11

OneButton button2(2,true);

void attachClick2() {

Serial.println("one Click");

}

void setup(){

button2.attachClick(attachClick2);

Serial.begin(9600);

}

void loop(){

button2.tick();

}

 

微信关注图中张十三的博客公众号,与张十三一起探讨更多mixly开发问题:

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值