Any code samples that work with the Fatuba Vacuum Fluorescent Display (vfd) when using esp-idf rather than arduino

cheseremtitus
Posts: 1
Joined: Sat May 10, 2025 4:51 pm

Any code samples that work with the Fatuba Vacuum Fluorescent Display (vfd) when using esp-idf rather than arduino

Postby cheseremtitus » Sat May 10, 2025 5:05 pm

I have the following code for displaying content on the Fatuba 8 bit VFD.

Code: Select all

/* Blink Example

   This example code is in the Public Domain (or CC0 licensed, at your option.)

   Unless required by applicable law or agreed to in writing, this
   software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
   CONDITIONS OF ANY KIND, either express or implied.
*/
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
#include "led_strip.h"
#include "sdkconfig.h"
#include "driver/gpio.h"
#include "esp_timer.h"
#include <string.h>
#include "esp_rom_sys.h"
static const char *TAG = "example";

/* Use project configuration menu (idf.py menuconfig) to choose the GPIO to blink,
   or you can edit the following line and set a number here.
*/
#define BLINK_GPIO 2


#define DIN_PIN     GPIO_NUM_23
#define CLK_PIN     GPIO_NUM_18
#define CS_PIN      GPIO_NUM_5
#define RESET_PIN   GPIO_NUM_4





static uint8_t s_led_state = 0;

#ifdef CONFIG_BLINK_LED_STRIP

static led_strip_handle_t led_strip;

static void blink_led(void)
{
    /* If the addressable LED is enabled */
    if (s_led_state) {
        /* Set the LED pixel using RGB from 0 (0%) to 255 (100%) for each color */
        led_strip_set_pixel(led_strip, 0, 16, 16, 16);
        /* Refresh the strip to send data */
        led_strip_refresh(led_strip);
    } else {
        /* Set all LED off to clear all pixels */
        led_strip_clear(led_strip);
    }
}

static void configure_led(void)
{
    ESP_LOGI(TAG, "Example configured to blink addressable LED!");
    /* LED strip initialization with the GPIO and pixels number*/
    led_strip_config_t strip_config = {
        .strip_gpio_num = BLINK_GPIO,
        .max_leds = 1, // at least one LED on board
    };
#if CONFIG_BLINK_LED_STRIP_BACKEND_RMT
    led_strip_rmt_config_t rmt_config = {
        .resolution_hz = 10 * 1000 * 1000, // 10MHz
        .flags.with_dma = false,
    };
    ESP_ERROR_CHECK(led_strip_new_rmt_device(&strip_config, &rmt_config, &led_strip));
#elif CONFIG_BLINK_LED_STRIP_BACKEND_SPI
    led_strip_spi_config_t spi_config = {
        .spi_bus = SPI2_HOST,
        .flags.with_dma = true,
    };
    ESP_ERROR_CHECK(led_strip_new_spi_device(&strip_config, &spi_config, &led_strip));
#else
#error "unsupported LED strip backend"
#endif
    /* Set all LED off to clear all pixels */
    led_strip_clear(led_strip);
}

#elif CONFIG_BLINK_LED_GPIO

static void blink_led(void)
{
    /* Set the GPIO level according to the state (LOW or HIGH)*/
    gpio_set_level(BLINK_GPIO, s_led_state);
}

static void configure_led(void)
{
    ESP_LOGI(TAG, "Example configured to blink GPIO LED!");
    gpio_reset_pin(BLINK_GPIO);
    /* Set the GPIO as a push/pull output */
    gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT);
}

#else
#error "unsupported LED type"
#endif

void spi_write_data(uint8_t data) {
    for (int i = 0; i < 8; i++) {
        gpio_set_level(CLK_PIN, 0);
        gpio_set_level(DIN_PIN, data & 0x01);
        data >>= 1;
        gpio_set_level(CLK_PIN, 1);
    }
}

void vfd_command(uint8_t command) {
    gpio_set_level(CS_PIN, 0);
    spi_write_data(command);
    gpio_set_level(CS_PIN, 1);
    esp_rom_delay_us(5);
}

void vfd_show() {
    gpio_set_level(CS_PIN, 0);
    spi_write_data(0xE8);  // Refresh Display
    gpio_set_level(CS_PIN, 1);
}

void vfd_init() {
    gpio_set_level(CS_PIN, 0);
    spi_write_data(0xE0);  // Set number of digits
    esp_rom_delay_us(5);
    spi_write_data(0x07);  // 8 digits
    gpio_set_level(CS_PIN, 1);
    esp_rom_delay_us(5);

    gpio_set_level(CS_PIN, 0);
    spi_write_data(0xE4);  // Set brightness
    esp_rom_delay_us(5);
    spi_write_data(0xFF);  // Max brightness
    gpio_set_level(CS_PIN, 1);
    esp_rom_delay_us(5);
}

void vfd_write_char(uint8_t pos, uint8_t chr) {
    gpio_set_level(CS_PIN, 0);
    spi_write_data(0x20 + pos);
    spi_write_data(chr);
    gpio_set_level(CS_PIN, 1);
}

void app_main(void)
{

    /* Configure the peripheral according to the LED type */
    configure_led();
    gpio_config_t io_conf = {
        .pin_bit_mask = (1ULL << DIN_PIN) | (1ULL << CLK_PIN) | (1ULL << CS_PIN) | (1ULL << RESET_PIN),
        .mode = GPIO_MODE_OUTPUT,
        .pull_up_en = GPIO_PULLUP_DISABLE,
        .pull_down_en = GPIO_PULLDOWN_DISABLE,
        .intr_type = GPIO_INTR_DISABLE,
    };
    gpio_config(&io_conf);

    // Reset the VFD
    gpio_set_level(RESET_PIN, 0);
    esp_rom_delay_us(5);
    gpio_set_level(RESET_PIN, 1);

    vfd_init();

    // Display "$1234"
    vfd_write_char(0, '$');
    vfd_write_char(1, '1');
    vfd_write_char(2, '2');
    vfd_write_char(3, '3');
    vfd_write_char(4, '4');
    vfd_show();
    while (1) {
        ESP_LOGI(TAG, "Turning the LED %s!", s_led_state == true ? "ON" : "OFF");
        blink_led();
        /* Toggle the LED state */
        s_led_state = !s_led_state;
        vTaskDelay(CONFIG_BLINK_PERIOD / portTICK_PERIOD_MS);
    }
}

Who is online

Users browsing this forum: DuckDuckGo [Bot], Google [Bot] and 1 guest