Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
星火1号_spark_星火一号_开发板
【24嵌入式设计大赛】基于RT-Thread星火一号的家庭环境监测控制系统
发布于 2024-09-17 23:09:19 浏览:312
订阅该版
[tocm] # 星火一号开发板板载资源介绍 星火一号主控采用STM32F407ZGT6,最高主频为 168MHz。 ![board.png](https://oss-club.rt-thread.org/uploads/20240917/f54250dee4f4760af66a43dbc51e0813.png.webp) 在本项目中,使用到了如上图所示的板载的LCD,AHT20,AP3216,红外接收,红外发送等资源。 # 项目组件添加 1.在RT-Thred源码目录下找到星火一号的BSP工程 打开ENV工具,使用scons --dist命令对工程进行打包 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240917/dda76488af12d9da0b1cec7694809de0.png.webp) 2.复制打包的工程,在新目录打开 打开ENV工具,输入menuconfig,打开配置界面,进入Hardware Drivers Config完成对,LDC,AHT20,AP3216,Timer,PWM的配置 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240917/d8e3f477741ff8d46a5eac11413f939b.png.webp) 进入RT-Thread online packages,选择peripheral libraries and drivers,对使用到的组件pack进行配置,打开infrared,AHT10,AP3216C组件包 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240917/ecb709d29d48bb5ce4862b474bcd43e5.png.webp) ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240917/987b00004d847c87ed47b5eeaf619fd4.png) 配置完成保存,使用pkgs --update对工程进行更新,完成更新后使用scons命令进行编译,使用scons --target=mdk5对MDK工程更新 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240917/f486702984e7c4e5b95a9bb6952aad47.png.webp) # 软件代码实现 分别创建线程进行温湿度读取,光照强度读取,LCD显示,在main函数中进行按键处理,实现代码如下。 ```c float humidity = 0.0, temperature = 0.0, brightness = 0.0; rt_mutex_t data_mutex; /* 用于线程间数据同步的互斥锁 */ /* 读取温湿度的线程 */ void read_thread_entry(void *parameter) { aht10_device_t dev; const char *i2c_bus_name = "i2c3"; /* 等待传感器正常工作 */ rt_thread_mdelay(2000); /* 初始化 aht10 */ dev = aht10_init(i2c_bus_name); if (dev == RT_NULL) { LOG_E("AHT10 传感器初始化失败"); return; } while (1) { /* 读取湿度和温度 */ float new_humidity = aht10_read_humidity(dev); float new_temperature = aht10_read_temperature(dev); /* 进入临界区,更新全局变量 */ rt_mutex_take(data_mutex, RT_WAITING_FOREVER); humidity = new_humidity; temperature = new_temperature; rt_mutex_release(data_mutex); // LOG_D("hum: %d.%d %%", (int)humidity, (int)(humidity * 10) % 10); // LOG_D("temp: %d.%d", (int)temperature, (int)(temperature * 10) % 10); rt_thread_mdelay(1000); /* 每秒读取一次 */ } } /* 读取光照强度的线程 */ void read_brightness_thread_entry(void *parameter) { ap3216c_device_t dev; const char *i2c_bus_name = "i2c2"; /* 等待传感器正常工作 */ rt_thread_mdelay(2000); /* 初始化 ap3216c */ dev = ap3216c_init(i2c_bus_name); if (dev == RT_NULL) { LOG_E("AP3216C 传感器初始化失败"); return; } while (1) { /* 读取光照强度 */ float new_brightness = ap3216c_read_ambient_light(dev); /* 进入临界区,更新全局变量 */ rt_mutex_take(data_mutex, RT_WAITING_FOREVER); brightness = new_brightness; rt_mutex_release(data_mutex); // LOG_D("brightness: %d.%d lux", (int)brightness, (int)(brightness * 10) % 10); rt_thread_mdelay(1000); /* 每秒读取一次 */ } } /* 显示温湿度和光照强度的线程 */ void display_thread_entry(void *parameter) { /* 设置蓝色背景,字体为黑色 */ lcd_clear(BLACK); lcd_set_color(BLACK, GREEN); while (1) { /* 进入临界区,读取全局变量 */ rt_mutex_take(data_mutex, RT_WAITING_FOREVER); float display_humidity = humidity; float display_temperature = temperature; float display_brightness = brightness; rt_mutex_release(data_mutex); char buffer[32]; /* 在屏幕上显示湿度和温度 */ lcd_show_string(10, 20, 24, "Humi:"); // 字体大小设为24 rt_sprintf(buffer, "%d.%d %%", (int)display_humidity, (int)(display_humidity * 10) % 10); lcd_show_string(100, 20, 24, buffer); memset(buffer,RT_NULL,sizeof(buffer)); lcd_show_string(10, 60, 24, "Temp:"); // 字体大小设为24 rt_sprintf(buffer, "%d.%d C", (int)display_temperature, (int)(display_temperature * 10) % 10); lcd_show_string(100, 60, 24, buffer); memset(buffer,RT_NULL,sizeof(buffer)); /* 在屏幕上显示光照强度 */ lcd_show_string(100, 100, 24, " "); // 用空格清空显示内容 lcd_show_string(10, 100, 24, "Light:"); // 字体大小设为24 rt_sprintf(buffer, "%d.%d lux", (int)display_brightness, (int)(display_brightness * 10) % 10); lcd_show_string(100, 100, 24, buffer); memset(buffer,RT_NULL,sizeof(buffer)); rt_thread_mdelay(1000); /* 每秒更新一次显示 */ } } int main(void) { /* 定义一个标志位,标记 KEY0 是否被按下 */ static rt_uint8_t key0_pressed_flag = 0; rt_int16_t key; /* 设置按键引脚为输入模式 */ rt_pin_mode(PIN_KEY0, PIN_MODE_INPUT_PULLUP); rt_pin_mode(PIN_KEY1, PIN_MODE_INPUT_PULLUP); /* 设置 RGB 引脚为输出模式*/ rt_pin_mode(PIN_LED_R, PIN_MODE_OUTPUT); rt_pin_mode(PIN_LED_B, PIN_MODE_OUTPUT); rt_pin_write(PIN_LED_R, PIN_HIGH); rt_pin_write(PIN_LED_B, PIN_HIGH); /* 初始化LCD */ lcd_clear(WHITE); /* 设置 LED 引脚为输出模式 */ rt_pin_mode(PIN_LED_B, PIN_MODE_OUTPUT); /* 创建互斥锁 */ data_mutex = rt_mutex_create("data_mutex", RT_IPC_FLAG_FIFO); if (data_mutex == RT_NULL) { LOG_E("创建互斥锁失败"); return -1; } /* 创建读取温湿度线程 */ rt_thread_t read_thread = rt_thread_create("read_thread", read_thread_entry, RT_NULL, 1024, 20, 10); if (read_thread != RT_NULL) { rt_thread_startup(read_thread); } /* 创建读取光照强度线程 */ rt_thread_t read_brightness_thread = rt_thread_create("read_brightness_thread", read_brightness_thread_entry, RT_NULL, 1024, 20, 10); if (read_brightness_thread != RT_NULL) { rt_thread_startup(read_brightness_thread); } /* 创建显示温湿度和光照强度线程 */ rt_thread_t display_thread = rt_thread_create("display_thread", display_thread_entry, RT_NULL, 1024, 20, 10); if (display_thread != RT_NULL) { rt_thread_startup(display_thread); } /* 创建LED闪烁线程 */ rt_thread_t led_blink_thread = rt_thread_create("led_blink_thread", led_blink_thread_entry, RT_NULL, 256, 25, 10); if (led_blink_thread != RT_NULL) { rt_thread_startup(led_blink_thread); } while (1) { /* 按键扫描 */ key = key_scan(); if (key == PIN_KEY0) { /* 设置 KEY0 按下标志 */ key0_pressed_flag = 1; /* 按键 KEY0 按下时,蓝灯亮起 */ rt_pin_write(PIN_LED_B, PIN_LOW); /* 重置红外数据 */ memset(global_ir_data, 0, sizeof(global_ir_data)); global_ir_index = 0; // 重置索引 /* 打开红外接收中断 */ rt_pin_irq_enable(INFRARED_RECEIVE_PIN, PIN_IRQ_ENABLE); rt_thread_mdelay(100); // 等待接收数据 } /* 只有在 KEY0 被按下且有接收到数据时才处理 */ if (key0_pressed_flag && global_ir_index > 0) { /* 数据接收完毕,显示 "Received OK" */ lcd_clear(BLACK); // 清空LCD lcd_show_string(10, 160, 24, "Received OK"); // 显示"Received OK" rt_thread_mdelay(4000); // 显示 4 秒 /* 2秒后清除LCD显示 */ lcd_show_string(10, 160, 24, " "); /* 禁用红外接收中断 */ rt_pin_irq_enable(INFRARED_RECEIVE_PIN, PIN_IRQ_DISABLE); /* 打印接收数据 */ for (int i = 0; i < global_ir_index; i++) { rt_kprintf("Index %d: Level = %d, Time = %d us\n", i, global_ir_data[i].level, global_ir_data[i].us); } /* 重置标志位 */ key0_pressed_flag = 0; } if (key == PIN_KEY1) { /* 关闭红外接收中断 */ rt_pin_irq_enable(INFRARED_RECEIVE_PIN, PIN_IRQ_DISABLE); /* 发送数据 */ rt_err_t send_size = decoder_write_data(global_ir_data, global_ir_index); if (send_size == RT_EOK) { /* 数据发送完毕,显示 "Send OK" */ lcd_clear(BLACK); // 清空LCD lcd_show_string(10, 160, 24, "Send OK"); // 显示"Send OK" rt_thread_mdelay(4000); // 显示 2 秒 /* 2秒后清除LCD显示 */ lcd_show_string(10, 160, 24, " "); } else { /* 发送失败处理逻辑 */ LOG_E("发送失败"); } } rt_thread_mdelay(10); } } ``` 对代码进行编译下载后,验证功能正常:即LCD可显示温湿度光照,红外接收发送正常,可对风扇进行控制。 # 总结与展望 ## 总结 通过本项目,我熟悉了星火一号开发板的硬件资源,包括LCD、AHT20、AP3216以及红外收发。在软件实现方面,我掌握了RT-Thread环境下的多线程操作、传感器数据读取、LCD显示和按键处理等功能。同时,通过红外接收和发送的实现,加深了对PWM信号捕获和数据处理的理解。本项目不仅提升了我对RT-Thread框架的应用能力,也增强了我对嵌入式开发的实际操作技能。 ## 展望 未来,我希望进一步深入学习更多传感器的集成与驱动开发,并探索更多的嵌入式系统设计,例如物联网应用和智能控制。在RT-Thread的生态中,我也将继续学习提升自己在嵌入式系统领域的开发水平,应用于更多的项目中。 如有不当,还望指正。
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
书华_
这家伙很懒,什么也没写!
文章
1
回答
0
被采纳
0
关注TA
发私信
相关文章
1
[星火一号] 代码模板, 手动写启动代码, 开机后 snprintf 不能处理 %llu 了, 是有什么配置上的冲突吗?
2
使用MDK5.37开发星火一号,双击mklinks.bat 文件后,目录下没有 rt-thread 和 libraries 的文件夹图标。
3
studio文件构建丢失
4
rtt中星火一号stm-32怎么把两个示例工程合并成一个
5
星火一号串口发送问题
6
基于开发板建工程的疑问
7
使用星火一号开发板建工程的奇怪问题
8
星火一号板pwm功能,不报错,但也不输出,为什么?
9
星火一号怎么强制改变已占用的引脚的功能呢
10
火星一号的标准库在哪里?外设的数据手册在哪里看?
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
线程
RT-Thread Nano
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
SFUD
msh
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1443
个答案
289
次被采纳
张世争
807
个答案
174
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
4
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
1
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部