嵌入式开源项目GitHub有很多,今天就来分享几个很受欢迎的嵌入式开源项目,既有实用的软件模块,也有完整的硬件项目!
实用软件模块篇
MultiButton - 多按键处理库
项目地址:https://github.com/0x1abin/MultiButton
强大功能:
// 支持多种按键事件
按键事件类型:
├── 单击:PRESS_DOWN, PRESS_UP
├── 长按:LONG_PRESS_START, LONG_PRESS_HOLD
├── 连击:PRESS_REPEAT (连续按下)
├── 组合:多按键同时按下检测
└── 状态:按键按下时长统计

使用示例:
#include "multi_button.h"
struct Button btn1, btn2;
// 按键事件回调函数
void btn1_callback(void *btn) {
struct Button *handle = (struct Button *)btn;
switch(handle->event) {
case PRESS_DOWN:
printf("Button1 press down\n");
break;
case PRESS_UP:
printf("Button1 press up\n");
break;
case LONG_PRESS_START:
printf("Button1 long press start\n");
break;
case LONG_PRESS_HOLD:
printf("Button1 long press hold\n");
break;
}
}
void setup() {
// 初始化按键
button_init(&btn1, read_button1_GPIO, 0);
button_attach(&btn1, PRESS_DOWN, btn1_callback);
button_attach(&btn1, PRESS_UP, btn1_callback);
button_attach(&btn1, LONG_PRESS_START, btn1_callback);
button_start(&btn1);
}
void main_loop() {
// 5ms调用一次
button_ticks();
}
QueueForMcu - 单片机队列神器
项目地址:https://github.com/xiaoxinpro/QueueForMcu
项目亮点:
// 专为单片机设计的队列库
核心特性:
├── 平台兼容:支持8/16/32位单片机
├── 内存高效:占用资源极少
├── 操作简单:入队、出队、查询接口
├── 线程安全:支持中断环境使用
└── 状态监控:队列满、空状态检测

代码示例:
#include "queue.h"
// 定义队列
#define QUEUE_SIZE 32
uint8_t queue_buffer[QUEUE_SIZE];
Queue_t my_queue;
void setup() {
// 初始化队列
Queue_Init(&my_queue, queue_buffer, QUEUE_SIZE);
}
void uart_rx_handler(uint8_t data) {
// 中断中安全入队
if (!Queue_IsFull(&my_queue)) {
Queue_Put(&my_queue, data);
}
}
void main_loop() {
uint8_t data;
// 主循环中处理数据
while (!Queue_IsEmpty(&my_queue)) {
if (Queue_Get(&my_queue, &data)) {
process_received_data(data);
}
}
}
应用场景:
串口数据缓存:接收不定长数据包 按键消息队列:按键事件缓存处理 传感器数据:多个传感器数据排队处理 通信协议:数据包的缓存和解析
StateMachine - 状态机框架
项目地址:https://github.com/kiishor/UML-State-Machine-in-C
核心功能:
// UML标准状态机实现
状态机特性:
├── 标准实现:符合UML状态图规范
├── 层次状态:支持嵌套状态结构
├── 事件驱动:基于事件的状态转换
├── 安全可靠:状态转换的原子性
└── 调试友好:状态转换日志记录

实际应用示例:
// 智能门锁状态机
typedefenum {
STATE_LOCKED,
STATE_UNLOCKING,
STATE_UNLOCKED,
STATE_LOCKING,
STATE_ALARM
} door_state_t;
typedefenum {
EVENT_PASSWORD_CORRECT,
EVENT_PASSWORD_WRONG,
EVENT_TIMEOUT,
EVENT_MANUAL_LOCK,
EVENT_INTRUSION_DETECTED
} door_event_t;
// 状态转换表
conststate_transition_t door_transitions[] = {
{STATE_LOCKED, EVENT_PASSWORD_CORRECT, STATE_UNLOCKING},
{STATE_LOCKED, EVENT_PASSWORD_WRONG, STATE_ALARM},
{STATE_UNLOCKING, EVENT_TIMEOUT, STATE_UNLOCKED},
{STATE_UNLOCKED, EVENT_MANUAL_LOCK, STATE_LOCKING},
{STATE_UNLOCKED, EVENT_TIMEOUT, STATE_LOCKING},
// ... 更多转换规则
};
完整项目篇
TinyGameEngine - 基于STM32的游戏开发框架
项目地址:https://github.com/juj/fbcp-ili9341
项目特色:
// 基于STM32的游戏开发框架
引擎功能:
├── 图形渲染:像素级图形绘制
├── 音效系统:PWM音效播放
├── 输入处理:按键、摇杆输入
├── 碰撞检测:简单的2D碰撞
├── 场景管理:游戏状态切换
└── 存档系统:EEPROM数据保存

经典游戏实现:
贪吃蛇:经典益智游戏 俄罗斯方块:方块消除游戏 打砖块:反弹球游戏 太空射击:飞行射击游戏
HomeAutomation - 智能家居系统
项目地址:https://github.com/home-assistant/core
系统架构:
// 分布式智能家居架构
系统组成:
├── 中央控制器:ESP32主控制板
├── 传感器网络:温湿度、光照、烟雾传感器
├── 执行器:继电器、舵机、LED控制
├── 通信协议:WiFi、蓝牙、Zigbee
├── Web界面:实时监控和控制
└── 数据记录:传感器数据存储

核心功能模块:
// 设备抽象层
typedefstruct {
uint8_t device_id;
device_type_t type;
device_status_t status;
// 设备操作接口
int (*init)(void *device);
int (*read)(void *device, void *data);
int (*write)(void *device, void *data);
int (*control)(void *device, uint8_t cmd, void *param);
} smart_device_t;
// 场景自动化
typedefstruct {
char scene_name[32];
trigger_condition_t trigger;
action_list_t actions;
bool enabled;
} automation_scene_t;
CanBus-Triple - CAN总线分析仪
项目地址:https://github.com/CANBus-Triple/CANBus-Triple
项目功能:
// 专业CAN总线工具
核心功能:
├── 数据监听:实时CAN帧捕获
├── 数据发送:自定义CAN帧发送
├── 协议分析:常见CAN协议解析
├── 数据记录:CAN数据存储回放
├── 远程控制:WiFi远程操作
└── 过滤功能:ID过滤和数据筛选

应用领域:
汽车诊断:OBD-II协议分析 工业控制:CANopen网络调试 设备开发:CAN设备功能测试 逆向工程:未知CAN协议分析
物联网项目篇
ESP32-IoT-Platform - 物联网平台
项目地址:https://github.com/espressif/esp-idf
平台特性:
// 完整的IoT解决方案
技术栈:
├── 硬件平台:ESP32/ESP8266
├── 网络连接:WiFi、蓝牙、LoRa
├── 云端服务:MQTT、HTTP、CoAP
├── 移动应用:Android/iOS APP
├── Web管理:设备管理界面
└── 数据分析:实时数据可视化

典型应用:
// 环境监测站
typedefstruct {
float temperature;
float humidity;
uint16_t pm25;
uint16_t co2;
uint8_t light_level;
uint32_t timestamp;
} env_data_t;
// 数据采集任务
void sensor_task(void *pvParameters) {
env_data_t data;
while(1) {
// 读取传感器数据
data.temperature = read_temperature();
data.humidity = read_humidity();
data.pm25 = read_pm25();
data.co2 = read_co2();
data.light_level = read_light();
data.timestamp = get_timestamp();
// 发送到云端
mqtt_publish("sensor/env", &data, sizeof(data));
vTaskDelay(pdMS_TO_TICKS(60000)); // 1分钟采集一次
}
}
PowerManagement - 低功耗管理
项目地址:https://github.com/espressif/esp-idf/tree/master/examples/system/deep_sleep
功耗优化技术:
// 智能功耗管理系统
功耗策略:
├── 深度睡眠:最低功耗模式
├── 定时唤醒:RTC定时器唤醒
├── 事件唤醒:外部中断唤醒
├── 动态调频:根据负载调整频率
├── 外设管理:按需开启外设
└── 功耗监控:实时功耗测量

实现示例:
#include "esp_sleep.h"
#include "esp_wifi.h"
// 进入低功耗模式
void enter_power_save_mode(uint32_t sleep_time_ms) {
// 关闭WiFi
esp_wifi_stop();
// 关闭不必要的外设
disable_unused_peripherals();
// 配置唤醒源
esp_sleep_enable_timer_wakeup(sleep_time_ms * 1000);
esp_sleep_enable_ext1_wakeup(GPIO_SEL_0, ESP_EXT1_WAKEUP_ANY_HIGH);
// 进入深度睡眠
esp_deep_sleep_start();
}
// 唤醒后处理
void handle_wakeup() {
esp_sleep_wakeup_cause_t wakeup_reason = esp_sleep_get_wakeup_cause();
switch(wakeup_reason) {
case ESP_SLEEP_WAKEUP_TIMER:
printf("定时唤醒,执行数据采集\n");
collect_sensor_data();
break;
case ESP_SLEEP_WAKEUP_EXT1:
printf("外部中断唤醒,处理用户输入\n");
handle_user_input();
break;
}
}
创意项目篇
MusicBox - 音乐盒项目
项目地址:https://github.com/TheRemote/PicoMusicBox
项目功能:
// 基于单片机的音乐播放器
功能特性:
├── 音乐播放:PWM音频输出
├── 文件系统:SD卡音乐文件读取
├── 音效处理:音量控制、音调调节
├── 显示界面:OLED显示歌曲信息
├── 用户交互:按键控制播放
└── 音频输出:DAC高质量音频

SmartClock - 智能时钟
项目地址:https://github.com/witnessmenow/ESP32-Trinity
核心功能:
// 多功能智能时钟
功能模块:
├── 时间显示:NTP网络时间同步
├── 环境监测:温湿度显示
├── 日程提醒:事件提醒功能
├── 天气预报:在线天气获取
├── 音乐闹钟:自定义铃声
├── 氛围灯光:RGB灯效控制
└── 手机控制:APP远程设置

调试工具篇
SerialPlotter - 串口波形显示
项目地址:https://github.com/devinaconley/arduino-plotter
工具特色:
// 实时数据可视化工具
显示功能:
├── 波形显示:多通道数据波形
├── 数值显示:实时数值监控
├── 颜色区分:不同数据源颜色
├── 缩放功能:时间轴缩放
├── 数据保存:波形数据导出
└── 触发功能:数据触发捕获

数据格式:
// 串口数据输出格式
void send_plot_data() {
static uint32_t timestamp = 0;
// 格式:timestamp:channel1:channel2:channel3
printf("%lu:%.2f:%.2f:%.2f\n",
timestamp++,
read_adc_channel(0) * 3.3f / 4095.0f,
read_adc_channel(1) * 3.3f / 4095.0f,
read_temperature());
}
------------ END ------------

深圳行,第一天!

总线CAN和CANFD通信协议区别

我曾经跑了无数次工厂,有几次差点睡在厂房