用 gasp 按钮案例

456 阅读1分钟

我们今天使用 gasp 编程语言来设计一个按钮功能。 功能描述如下: 按下按钮打开灯,再按一下关闭灯。

如果没有安装 gasp 的话请参考 gasp 物联网编程语言快速入门 安装部分。

我们新建一个项目

gasp new blink
cd blink

我们修改文件 main.gasp, 将里面的代码删除。

gpio led {
    pin: "LED_BUILTIN",
    state: LOW
}

gpio btn {
    pin: "12",
    emit: LOW,
    fn: toggle_led
}

我们定义一盏灯,输出管脚为 LED_BUILTIN, 默认电位为 LOW。 定义按钮(btn),对应管脚为 12, 按下电位为 LOW, 按下的时候执行函数 toggle_led

执行 gasp compile, 编译后代码如下

unsigned long get_current_time_ms();


#ifndef DEBOUNCE_DELAY_MS
#define DEBOUNCE_DELAY_MS 50
#endif
int gpio_reading = 0;
int gpio_led_pin = LED_BUILTIN;
int gpio_led_state = LOW;

int gpio_btn_pin = 12;
int gpio_btn_state = LOW;
unsigned long last_gpio_btn_debounce_time_ms = get_current_time_ms();
int last_gpio_btn_state = LOW;

void setup() {
    pinMode(gpio_led_pin, OUTPUT);

    pinMode(gpio_btn_pin, INPUT);

}

void loop() {

    gpio_reading = digitalRead(gpio_btn_pin);
    if (gpio_reading != last_gpio_btn_state) {
        last_gpio_btn_debounce_time_ms = get_current_time_ms();
    }
    if ((get_current_time_ms() - last_gpio_btn_debounce_time_ms) > DEBOUNCE_DELAY_MS) {
        if (gpio_reading != gpio_btn_state) {
          gpio_btn_state = gpio_reading;
          if (gpio_btn_state == LOW) {
            toggle_led();
          }
        }
    }
    last_gpio_btn_state = gpio_reading;

}

unsigned long get_current_time_ms() {
    return millis();
}

void open_led() {
    gpio_led_state = HIGH;
    digitalWrite(gpio_led_pin, gpio_led_state);
}

void close_led() {
    gpio_led_state = LOW;
    digitalWrite(gpio_led_pin, gpio_led_state);
}

void toggle_led() {
    if (gpio_led_state == HIGH) {
        close_led();
    } else {
        open_led();
    }
}

最后通过 arduino 编译上传到 arduino 板子上,我们的例子就搞定。