红外遥控(IR)
从例程的说明中了解到红外发射脚 EMISSION 接单片机引脚 PB0,红外接收头引脚 RECEPTION 接单片机引脚 PB1(TIM3_CH4 通道)。
这里注意在rt-thread studio中红外需要安装软件包,并配置使能好后才能使用.
在rt-thread studio中安装红外软件包:
在rt thread setting中使能HWTIMER设备驱动程序
打开软件包的配置项,配置如下:
这里可以看见软件包需要pwm,所以我们需要检查pwm是否启用并使能,还要注意红外接收的引脚编号和自己板子的是否一致
完成相关配置后重新构建项目没有问题即可.
主程序流程:选择 NEC 解码器,初始化 GPIO 引脚。然后在 while 循环中扫描按键、打印输出接收到的红外数据,当 KEY0 按下后将会把最近一次接收到的红外数据通过红外发射头发送出去。
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#include "decoder.h"
/* defined the LED0 pin: PE7 */
#define LEDG GET_PIN(E, 8)
#define LEDR GET_PIN(E, 7)
#define KEY0 GET_PIN(D, 10)
#define KEY1 GET_PIN(D, 9)
uint16_t keyboard(){
if(rt_pin_read(KEY0)==0){
HAL_Delay(50);
if(rt_pin_read(KEY0)==0){
return 1;
}
}
return 0;
}
int main(void)
{
int count = 1;
/* set LED0 pin mode to output */
rt_pin_mode(LEDG, PIN_MODE_OUTPUT);
rt_pin_mode(LEDR, PIN_MODE_OUTPUT);
rt_pin_mode(KEY0, PIN_MODE_INPUT_PULLUP);
rt_pin_write(LEDG, PIN_HIGH);
rt_pin_write(LEDR, PIN_HIGH);
uint16_t key=0;
struct infrared_decoder_data Tdata;
ir_select_decoder("nec");
while (count++)
{
key=keyboard();
if(key==1){
key=0;
rt_pin_write(LEDR, PIN_LOW);
//Tdata.data.nec.addr=1;
Tdata.data.nec.repeat=11;
infrared_write("nec", &Tdata);
HAL_Delay(200);
printf("send: addr:0x%02X key:0x%02X repeat:%d \n",
Tdata.data.nec.addr,Tdata.data.nec.key,Tdata.data.nec.repeat);
}
if(infrared_read("nec", &Tdata)==RT_EOK){
rt_pin_write(LEDG, PIN_LOW);
HAL_Delay(200);
printf("recive: addr:0x%02X key:0x%02X repeat:%d \n",
Tdata.data.nec.addr,Tdata.data.nec.key,Tdata.data.nec.repeat);
}
rt_pin_write(LEDG, PIN_HIGH);
rt_pin_write(LEDR, PIN_HIGH);
}
return RT_EOK;
}
LCD屏幕
这个就简单得多,只需要在设置->硬件选项中开启lcd即可.
但是需要注意的是,在新建项目中基于开发板创建项目,如果BSP选择了1.0.1,在开启lcd后编译会爆flash内存,因为1.0.1中添加了wifi等IOT相关外设,导致没有多余的flash启用其他外设.
如果你用了1.0.1版本,只需要在设置->硬件->板载驱动设备关闭wifi框架即可解决.
而用了1.0.0版本的无需担心这个问题.
还有开启lcd后会在applications文件夹中生成一个lcd_sample.c,里面有一个样例,如果你需要使用可以把里面的内容复制到main里.
我不知道会生成这个文件一直在找错误,后来发现它会影响main.c,所以开启lcd后我都会把lcd_sample.c删除(
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#include "drv_lcd.h"
#include "rttlogo.h"
/* defined the LED0 pin: PE7 */
#define LED0_PIN GET_PIN(E, 7)
int main(void)
{
lcd_clear(WHITE);
/* 显示 RT-Thread logo */
lcd_show_image(0, 0, 240, 69, image_rttlogo);
/* 设置背景色和前景色 */
lcd_set_color(WHITE, BLUE);
/* 在 LCD 上显示字符 */
lcd_show_string(10, 69, 16, "Hello, lqq!");
lcd_show_string(10, 69+16, 24, "hello,ljx!");
lcd_show_string(10, 69+16+24, 32, "hello,lwh!");
/* 在 LCD 上画线 */
lcd_draw_line(0, 69+16+24+32, 240, 69+16+24+32);
/* 在 LCD 上画一个同心圆 */
lcd_draw_point(120, 194);
for (int i = 0; i < 46; i += 3)
{
lcd_draw_circle(120, 194, i);
}
/* set LED0 pin mode to output */
rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);
while (1)
{
rt_pin_write(LED0_PIN, PIN_HIGH);
rt_thread_mdelay(500);
rt_pin_write(LED0_PIN, PIN_LOW);
rt_thread_mdelay(500);
}
}
AHT10
也集成在设置中了,在硬件->板载设备驱动中开启aht10
由于潘多拉老旧的问题,最新的2.1.0 AHT10软件包会冲突,最好!一定!使用2.0.0版本,可以完美不报错
短短一句话花了我一下午的时间(
板载设备开启后,连引脚配置都不用写,直接在main中使用即可
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#include "sensor_asair_aht10.h"
#define AHT10_I2C_BUS "i2c4"
int main(void)
{
//定义传感器结构
struct rt_sensor_data temp,humi;
//定义温度和湿度句柄
rt_device_t dev_temp,dev_humi;
//查找aht10传感器
dev_temp=rt_device_find("temp_aht10");
dev_humi=rt_device_find("humi_aht10");
//打开aht10传感器
rt_device_open(dev_temp, RT_DEVICE_FLAG_RDONLY);
rt_device_open(dev_humi, RT_DEVICE_FLAG_RDONLY);
while (1)
{
//分别读取温度和湿度并保存到各自结构中
rt_device_read(dev_temp, 0, &temp, 1);
rt_device_read(dev_humi, 0, &humi, 1);
rt_kprintf("temp: %d.%d \n",temp.data.temp/10,temp.data.temp%10);
rt_kprintf("humi: %d% \n",humi.data.humi/10);
HAL_Delay(2000);
}
return RT_EOK;
}