RT-Thread 学习记录(2)-红外遥控,LCD,AHT10

本文介绍了如何在rt-thread平台上配置红外遥控器,包括红外发射和接收模块的连接、NEC解码器的使用,以及LCD屏幕和AHT10温湿度传感器的集成。开发者需注意安装必要的软件包,配置GPIO和I2C通信,并在主程序中处理按键输入和传感器读取。
摘要由CSDN通过智能技术生成

红外遥控(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;
}
  • 29
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值