跳到主要内容

sAkura-IO

  • 今日
  • 文章
  • 笔记
  • 游记
  • 友链
  • 作品
  • 我的
今日 文章 笔记 友链

sAkura-IO

  • 今日
  • 文章
  • 笔记
  • 游记
  • 友链
  • 作品
  • 我的

sAkura-IO

  • 今日
  • 文章
  • 笔记
  • 游记
  • 友链
  • 作品
  • 我的

sAkura-IO

  • 今日
  • 文章
  • 笔记
  • 游记
  • 友链
  • 作品
  • 我的

树莓派5 c/c++编程

2026年9月23日 · 1323 字 · 约 4 分钟 · 树莓派5

树莓派5 LVGL开发日志

关闭framebuffer上的终端

sudo systemctl stop getty@tty1.service
sudo systemctl disable getty@tty1.service
sudo vim /boot/firmware/cmdline.txt
末尾加上 vt.global_cursor_default=0

LVGL如何旋转屏幕

编辑代码:lvgl/src/drivers/display/fb/lv_linux_fbdev.c

搜索lv_display_set_resolution

在下面添加代码:

lv_display_set_rotation(disp, LV_DISPLAY_ROTATION_90);   // 旋转90度

LVGL-FFMPEG优化

lv_ffmpeg树莓派libcamera低延迟优化.c

https://github.com/sAkuraOfficial/lvgl

树莓派调用gpiod.hpp

sudo apt install libgpiod2 libgpiod-dev   
cmake_minimum_required(VERSION 3.10)
project(skaMenu)
 
# 查找pkg-config
find_package(PkgConfig REQUIRED)
 
# 使用pkg-config查找libgpiod C++库
pkg_check_modules(GPIODCXX REQUIRED libgpiodcxx)
 
add_executable(skaMenu src/main.cpp)
 
# 链接库和设置include目录
target_link_libraries(skaMenu ${GPIODCXX_LIBRARIES})
target_include_directories(skaMenu PRIVATE ${GPIODCXX_INCLUDE_DIRS})
target_compile_options(skaMenu PRIVATE ${GPIODCXX_CFLAGS_OTHER})
#include <iostream>
#include <gpiod.hpp>
#include <vector>
#include <thread>
#include <chrono>
#include <csignal>
 
const std::vector<unsigned int> BUTTON_PINS = {14, 15, 18};
bool running = true;
 
void signal_handler(int signal)
{
    std::cout << "\n测试结束" << std::endl;
    running = false;
}
 
void setup_gpio(gpiod::chip &chip, std::vector<gpiod::line> &lines)
{
    // 设置GPIO为输入
    for (auto pin : BUTTON_PINS)
    {
        auto line = chip.get_line(pin);
        line.request({"button_test", gpiod::line_request::DIRECTION_INPUT, 0});
        lines.push_back(std::move(line));
    }
}
 
void test_button(std::vector<gpiod::line> &lines)
{
    std::cout << "正在检测14、15、18的按钮" << std::endl;
 
    while (running)
    {
        for (size_t i = 0; i < lines.size(); i++)
        {
            int button_state = lines[i].get_value();
            unsigned int pin = BUTTON_PINS[i];
            if (button_state == 0)
            {
                // low
                std::cout << "🔘 GPIO" << pin << "按钮被按下!" << std::endl;
            }
            else
            {
                std::cout << "⚪ GPIO" << pin << "按钮未按下" << std::endl;
            }
        }
        std::this_thread::sleep_for(std::chrono::milliseconds(100));
        std::cout << "------------------------------" << std::endl;
    }
}
 
int main()
{
    signal(SIGINT, signal_handler); // 捕获ctrl+c
 
    try
    {
        // 打开GPIO芯片
        gpiod::chip chip("gpiochip0");
        std::vector<gpiod::line> lines;
        setup_gpio(chip, lines);
 
        // 测试按钮
        test_button(lines);
    }
    catch (const std::exception &e)
    {
        std::cerr << "错误: " << e.what() << std::endl;
        return 1;
    }
 
    std::cout << "GPIO清理完成" << std::endl;
    return 0;
}

raspi tm1637库 实现旋转180度显示(屏幕倒装)

实现

from time import sleep
import tm1637
import RPi.GPIO as GPIO
 
class TM1637Reversed(tm1637.TM1637):
    """
    继承自 TM1637,用于处理上下颠倒(旋转180度)安装的显示屏。
    这个类会自动翻转数字顺序并旋转每个字符。
    """
 
    def _rotate_byte(self, b):
        """将7段数码管的字节数据旋转180度"""
        # 原始映射: gfedcba -> 旋转后映射: gcfebad
        # 意味着: a->d, b->e, c->f, d->a, e->b, f->c, g->g
        # 小数点(dp)位保持不变
        return (b & 0b11000000) | ((b & 0b00111000) >> 3) | ((b & 0b00000111) << 3)
 
    def write(self, segments, pos=0):
        """
        重写基础的 write 方法。
        在显示前,翻转段(segments)的顺序,并旋转每一个段的字节数据。
        """
        # 翻转显示顺序 (例如 [d1,d2,d3,d4] -> [d4,d3,d2,d1])
        reversed_segments = segments[::-1]
 
        # 将每个字符旋转180度
        transformed_segments = [self._rotate_byte(s) for s in reversed_segments]
 
        # 调用父类的 write 方法发送转换后的数据
        super().write(transformed_segments, pos)

调用例子

 
if __name__ == "__main__":
    # 请根据你的树莓派接线修改这里的 GPIO 引脚号 (BCM模式)
    CLK_PIN = 23
    DIO_PIN = 24
    display = TM1637Reversed(clk=CLK_PIN, dio=DIO_PIN, brightness=7)
 
    print("启动 TM1637 反向显示屏测试...")
 
    try:
        display.scroll("i love you", delay=700)  # delay是滚动的毫秒间隔
        print("测试结束。")
        display.write([0, 0, 0, 0])
 
    except KeyboardInterrupt:
        print("程序被用户中断")
    finally:
        # 确保程序退出时清理GPIO资源
        GPIO.cleanup()
        print("GPIO 已清理")

评论

评论

2 条
?
  1. 1
    1112026/10/4 22:46

    额……全局变量? 不是说不能写,而是说,在c++中,全局变量无法做到统一初始化,如果你需要的话可以选择用函数返回static变量。亦或者写成启动类。

    1. mchaohao159站长2026/10/5 01:26

      回复 @111

      毕竟是demo没有考虑到那么多设计