arduino程序—模拟输出(基础知识)
- 1-25 模拟输出1-analogWrite
- 电路
- 效果演示
- 模拟输出analog output
- 复合运算符
- 示例程序
- Analogwrite()
- 1-26 模拟输出2-PWM
- PWM概念(极其重要)
- 1-27 模拟输出3-for
- 电路
- 效果演示
- 程序示例
- For循环
- Brightness+=5
1-25 模拟输出1-analogWrite
在这之前是数字输入输出实验
这里是模拟输出输入
开关两种情况
LED开关外还需要亮度,以及速度等需要模拟输入输出
小LED亮度调节模拟输出和模拟输入
电路
LED正极连接电阻,连接arduino开发板的9号引脚(发现引脚有波浪线,3、5、6、10、11也都有,开发板还有说明PWM=~,非常重要)
我们要调节led亮度的话,只能使用带有~波浪线的引脚,其余的引脚都不行
LED负极接在GND引脚上
按键开关一个接在8号引脚,一个接在2号引脚,另外接地
效果演示
通电后,led点亮
按下右侧的按键,led亮度变暗,最后熄灭数值为0
按下左侧按键,led亮度变亮,最后达到最大值255
模拟输出analog output
数字输出模式下,只有熄灭点亮两种状态
对led亮度调节时,需要模拟输出,0~255共256个级别的数值
Analogwrite不仅能控制led亮度还有控制电机
复合运算符
示例程序
示例程序非ide自带,而是太极创客编写,可以到官网查看
模拟输出的信号值大于255以及小于0不会对led产生损害
/*
25 模拟输出1 - analogWrite
太极创客
www.taichi-maker.com
此程序用于太极创客<<零基础入门学用Arduino教程>>
25 模拟输出1 - analogWrite
演示如何通过两个按键开关通过analogWrite指令
进行模拟输出操作。具体电路和其它信息请参考
太极创客网站本教程相关页面。
2017-04-28
*/
boolean pushButton1; // 创建布尔型变量用来存储按键开关1的电平状态
boolean pushButton2; // 创建布尔型变量用来存储按键开关2的电平状态
int ledPin = 9; //LED引脚号
int brightness = 128; //LED亮度参数
void setup() {
// put your setup code here, to run once:
pinMode(2, INPUT_PULLUP); //将引脚2设置为输入上拉模式
pinMode(8, INPUT_PULLUP); //将引脚8设置为输入上拉模式
pinMode(ledPin, OUTPUT); //将LED引脚设置为输出模式
Serial.begin(9600); //启动串口通讯
}
void loop() {
// put your main code here, to run repeatedly:
pushButton1 = digitalRead(2); //读取引脚2电平状态并将其赋值给布尔变量
pushButton2 = digitalRead(8); //读取引脚8电平状态并将其赋值给布尔变量
if (!pushButton1 && brightness > 0){ // 当按下按键开关1并且LED亮度参数大于0(防止范围超出0~255)
brightness--; // 减低LED亮度参数
//(brightness-- 相当于 brightness = brightness - 1;)
} else if (!pushButton2 && brightness < 255) { //当按下按键开关2并且LED亮度参数小于255
brightness++; //增加LED亮度参数
//(brightness++ 相当于 brightness = brightness + 1;)
}
analogWrite(ledPin, brightness); //模拟输出控制LED亮度
Serial.println(brightness); //将LED亮度参数显示在串口监视器上
delay(10); //延时10ms,稍微减缓速度,防止亮度变化太快
}
Analogwrite()
Analogwrite并不简单,每次对引脚执行此命令,都会给其一个固定频率的PWM信号,PWM信号的频率大约为490HZ
注意只支持analogwrite的3,5,10,11引脚操作,其他引脚是不能使用此操作的
在调用此analogwrite之前,可以不用pinmode引脚设置,也可以设置不影响
1-26 模拟输出2-PWM
只有3,5,10,11的引脚才能作为亮度调节的引脚(PWM=~)
PWM概念(极其重要)
PWM 脉冲宽度调制
使用analogwrite函数时,实际就是PWM控制
让led点亮,就让其保持在5V即可
让LED熄灭,就让其保持0V即可
让一段时间
在1
点亮1秒熄灭1秒
若是1毫秒呢?
例子,人物动起来的,个画面动
当非常快的速度让led闪烁时,速度快到一定程度以后就再也看不到闪烁的效果了
实际看到的是保持点亮状态的led
因为长时间闪烁所,所以看到其亮度是减弱的,led点亮和熄灭比较那个长,那个短
点亮和熄灭时间各占50%,那么亮度就是50%
点亮的时间占75%,熄灭的时间占25%,那么亮度就是75%
点亮的时间占25%,熄灭的时间占75%,那么亮度就是75%
255就是led的最大亮度,127就是50%的亮度,analogwrite函数只能给参数整数,无法写127.5的,所以127或者128都是可以的
设置为75%时,如下
Arduino的PWM的时间间隔周期并不是2毫秒的,这里只是演示,不同的开发板的周期也会有所不同
具体的led灯亮度型号不同,亮度也会有所不同,不同灯的同一个级别50%的亮度也会有所不一样
1-27 模拟输出3-for
电路
Led正极连接电阻,连接9号引脚(PWM~)
负极接地GND
效果演示
Led进行着明暗的交替变化,串口监视器中的数字也在变化,从小(0)到大(255)变化,再从大(255)到小(0)变化
程序示例
如何让led产生忽明忽暗的呼吸灯效果呢?
需要程序编写
http://www.taichi-maker.com/homepage/arduino-basic-tutorial-index/arduino-basic-tutorial-27/
/*
27 模拟输出3 - for
太极创客
www.taichi-maker.com
此程序用于太极创客<<零基础入门学用Arduino教程>>
27 模拟输出3 - for
演示如何通过for循环语句实现LED明暗交替(呼吸灯)效果。
2017-04-28
*/
void setup() {
pinMode(9, OUTPUT); //设置9号引脚为输出模式
Serial.begin(9600); //启动串口通讯
}
void loop() {
// LED由暗到明
for (int brightness = 0; brightness <= 255; brightness++){
analogWrite(9, brightness);
Serial.println(brightness);
delay(10);
}
// LED由明到暗
for (int brightness = 255; brightness >=0 ; brightness--){
analogWrite(9, brightness);
Serial.println(brightness);
delay(10);
}
}
For循环
Brightness+=5
将自加修改后如下(+=5,每次都会隔着5个增加或者减小,变化速度变快了)