我们今天使用 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 板子上,我们的例子就搞定。