#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_log.h"
#define LED_GREEN_GPIO GPIO_NUM_7
#define LED_YELLOW_GPIO GPIO_NUM_6
#define LED_BLUE_GPIO GPIO_NUM_5
#define LED_WHITE_GPIO GPIO_NUM_4
#define BUTTON_GREEN_GPIO GPIO_NUM_1
#define BUTTON_YELLOW_GPIO GPIO_NUM_2
#define DEBOUNCE_DELAY_MS 50
static const char *TAG = "4bit_counter";
static void update_leds(uint8_t counter)
{
// Update LEDs to represent 4-bit counter value in binary
gpio_set_level(LED_GREEN_GPIO, (counter >> 0) & 0x01);
gpio_set_level(LED_YELLOW_GPIO, (counter >> 1) & 0x01);
gpio_set_level(LED_BLUE_GPIO, (counter >> 2) & 0x01);
gpio_set_level(LED_WHITE_GPIO, (counter >> 3) & 0x01);
}
void app_main(void)
{
uint8_t counter = 0;
update_leds(counter);
int last_button_green_state = 1;
int last_button_yellow_state = 1;
while (1)
{
int button_green_state = gpio_get_level(BUTTON_GREEN_GPIO);
int button_yellow_state = gpio_get_level(BUTTON_YELLOW_GPIO);
// Check green button (increment)
if (last_button_green_state == 1 && button_green_state == 0)
{
// Button pressed
counter = (counter + 1) & 0x0F; // 4-bit wrap-around
ESP_LOGI(TAG, "Incremented counter: %d", counter);
update_leds(counter);
vTaskDelay(pdMS_TO_TICKS(DEBOUNCE_DELAY_MS));
}
last_button_green_state = button_green_state;
// Check yellow button (decrement)
if (last_button_yellow_state == 1 && button_yellow_state == 0)
{
// Button pressed
counter = (counter - 1) & 0x0F; // 4-bit wrap-around
ESP_LOGI(TAG, "Decremented counter: %d", counter);
update_leds(counter);
vTaskDelay(pdMS_TO_TICKS(DEBOUNCE_DELAY_MS));
}
last_button_yellow_state = button_yellow_state;
vTaskDelay(pdMS_TO_TICKS(10)); // Polling interval
}
}