#define KEY_PIN 20
#define LED_PIN 14
SemaphoreHandle_t led = NULL; // 二进制信号量
void led_task(void *param_t){
  pinMode(LED_PIN, OUTPUT);
  while(1){
    if(xSemaphoreTake(led, 1000) == pdTRUE){ //pdTRUE 和 pdPASS 值是相同的,用哪个都可以
      digitalWrite(LED_PIN,!digitalRead(LED_PIN));
      vTaskDelay(200);
    }
  }
}

// 按键监控
void key_task(void *param_t){
  pinMode(KEY_PIN, INPUT_PULLUP);   // 设置为带输出的上拉
  while(1){
    if(digitalRead(KEY_PIN)==LOW){
      // 按键按下了
      xSemaphoreGive(led);
      vTaskDelay(200); // 等待去抖,这里不用换算,是为了节省时间,我们不需要精确延时
    }
  }
}

void setup() {
  Serial.begin(115200);
  led = xSemaphoreCreateBinary(); //创建二进制信号量
  xTaskCreate(key_task, "KEY-MON", 1024, NULL, 1, NULL);
  xTaskCreate(led_task, "LED-DSP", 1024, NULL, 1, NULL);
}

void loop() {
  delay(10);
}