/* Respond to a button press. * * This code combines two ways of checking for a button press - * busy polling (the bad way) and button interrupt (the good way). * * This sample code is in the public domain. */ #include "espressif/esp_common.h" #include "espressif/sdk_private.h" #include "FreeRTOS.h" #include "task.h" #include "queue.h" #include "esp8266.h" /* pin config */ const int gpio = 0; /* gpio 0 usually has "PROGRAM" button attached */ const int active = 0; /* active == 0 for active low */ const gpio_interrupt_t int_type = INT_FALLING; #define GPIO_HANDLER gpio00_interrupt_handler /* This task polls for the button and prints the tick count when it's seen. Debounced to 200ms with a simple vTaskDelay. This is not a good example of how to wait for button input! */ void buttonPollTask(void *pvParameters) { printf("Polling for button press on gpio %d...\r\n", gpio); while(1) { while(gpio_read(gpio) != active) { taskYIELD(); } printf("Polled for button press at %ldms\r\n", xTaskGetTickCount()*portTICK_RATE_MS); vTaskDelay(200 / portTICK_RATE_MS); } } /* This task configures the GPIO interrupt and uses it to tell when the button is pressed. The interrupt handler communicates the exact button press time to the task via a queue. This is a better example of how to wait for button input! */ void buttonIntTask(void *pvParameters) { printf("Waiting for button press interrupt on gpio %d...\r\n", gpio); xQueueHandle *tsqueue = (xQueueHandle *)pvParameters; gpio_set_interrupt(gpio, int_type); uint32_t last = 0; while(1) { uint32_t button_ts; xQueueReceive(*tsqueue, &button_ts, portMAX_DELAY); button_ts *= portTICK_RATE_MS; if(last < button_ts-200) { printf("Button interrupt fired at %ldms\r\n", button_ts); last = button_ts; } } } static xQueueHandle tsqueue; void GPIO_HANDLER(void) { uint32_t now = xTaskGetTickCountFromISR(); xQueueSendToBackFromISR(tsqueue, &now, NULL); } void user_init(void) { sdk_uart_div_modify(0, UART_CLK_FREQ / 115200); gpio_enable(gpio, GPIO_INPUT); tsqueue = xQueueCreate(2, sizeof(uint32_t)); xTaskCreate(buttonIntTask, (signed char *)"buttonIntTask", 256, &tsqueue, 2, NULL); xTaskCreate(buttonPollTask, (signed char*)"buttonPollTask", 256, NULL, 1, NULL); }