ArduinoLearn2
Arduino 学习(二): 高级输入输出
传感器型开关
上一次的学习中使用的是瞬时按键来控制开关,其实瞬时按键只是传感器型开关的一种,它能检测它是否被按下。而类似的传感器型开关还有:
- 拨动开关:类似于灯的开关
- 温控器:根据温度来调节
- 磁力开关:两个小金属片,靠近磁场的时候会吸在一起
- 压力开关:压力达到一定程度就会检测到
- 倾斜开关:由一些触点和小球构成,倾斜小球会离开触点
- PIR 传感器:检测人是否在范围内移动
灯光逐渐点亮熄灭
在之前控制亮灭的时候中间要有一定时间的延时,因为间隔太小的话人眼是无法捕捉相应的变化的。而间隔太小的时候虽然无法看出闪烁,但是能感觉到亮度比一直亮着的时候要暗,这种通过改变脉冲宽度来改变亮度的技术叫做脉宽调制,或 PWN。
而在 Arduino 中为了避免代码的长度给调节亮度造成的影响于是有了 analogWrite() 函数。
下面便是逐渐点亮和熄灭 LED 灯的代码,电路则只用把 LED 灯一边接在 9 端口,一边接在 GND,当然保护电阻也是不可少的:
const int LED = 9;
int i = 0;
void setup() {
pinMode(LED, OUTPUT);
}
void loop() {
for (; i < 255; ++i) {
analogWrite(LED, i);
delay(10); // 延时,否则看不到变化
}
for (; i > 0; --i) {
analogWrite(LED, i);
delay(10); // 延时,否则看不到变化
}
}
analogWrite(引脚号, 亮度)
-> 这里亮度是从 0~255,0 是全灭,255 是全亮,引脚号只能为3、5、6、9、10、11,因为这个功能需要硬件的支持。
通过按钮控制灯管亮度
如果想通过瞬时开关来进行亮度调节,则需要捕捉按下按键时间了,在下面的代码里面,按开关则改变灯的状态,而长按则调整亮度,亮度达到顶峰就变为零。
电路图为上面的电路图和上一次电路图的结合。
const int LED = 9;
const int BUTTON = 7;
int val = 0;
int old_val = 0;
int state = 0;
int brightness = 128;
unsigned long startTime = 0;
void setup() {
pinMode(LED, OUTPUT);
pinMode(BUTTON, INPUT);
}
void loop() {
val = digitalRead(BUTTON);
if (val == HIGH && old_val == LOW) { // 按下按钮则改变状态
state = 1 - state;
startTime = millis(); // millis 返回距离上次重置所用的毫秒数
delay(10);
}
if (val == HIGH && old_val == HIGH) { // 长按则调节亮度
if (state == 1 && (millis() - startTime) > 500) {
brightness++;
delay(10);
if (brightness > 255) {
brightness = 0;
}
}
}
old_val = val;
if (state == 1) {
analogWrite(LED, brightness);
}
else {
analogWrite(LED, 0);
}
}
millis()
-> 获取距离上次重置所用的毫秒数,这里用来测量按下的时间