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;
}