树莓派5 c/c++编程
树莓派5 LVGL开发日志
关闭framebuffer上的终端
sudo systemctl stop getty@tty1.service
sudo systemctl disable getty@tty1.servicesudo vim /boot/firmware/cmdline.txt
末尾加上 vt.global_cursor_default=0LVGL如何旋转屏幕
编辑代码: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优化
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 已清理")
额……全局变量? 不是说不能写,而是说,在c++中,全局变量无法做到统一初始化,如果你需要的话可以选择用函数返回static变量。亦或者写成启动类。
毕竟是demo没有考虑到那么多设计