ArduinoLearn2

Author Avatar
patrickcty 6月 17, 2017

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()
-> 获取距离上次重置所用的毫秒数,这里用来测量按下的时间