本帖最后由 WangChong 于 2023-12-19 17:24 编辑
项目背景介绍
由于近期连日降雨,且温差过大,很多单片机的电路板引脚都上锈了。因为有一个湿温度传感器放在室内是非常有必要的。可以在湿度适宜的情况下让各个单片机晒晒太阳去去潮。 本着永远不让开发板吃灰的原则,就拿出了我的M61-32s-kit DIY了这个作品来满足我的需要。
配件清单
名称 | 数量 | 说明 | AI-M61-32s-kit | 1 | 核心控制MCU | 面板板 | 1 | 简化电路连接 | 跳线 | 若干 | 连接电路 | DHT11湿温度传感器 | 1 | 检测湿度和温度数据并且传递给MCU | 滑动变阻器 | 1 | 用于控制1.8寸SPI屏幕亮度 | 1.8寸SPI屏幕 | 1 | 用来显示湿温度数据 | 面包板供电模块 | 1 | 用于给面包板供电 |
电子元件介绍
- 面包板供电模块
此面包板供电模块可以接收两个电源输入口,分别是USB-typeA 和 DC (7-12v), 然后通过两个电压转换芯片可以将输入电压转换到3v或者5v(根据跳线帽选择)
- DHT11湿温度传感器
DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复 合传感器。它包括一个电阻式感湿元件和一个 NTC 测温元件。每个 DHT11 传 感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在 OTP 内存中,传感器内部在检测信号的处理过程中要调用这些校准系数,用户 无需重新校准。单线制串行接口,使系统集成变得简易快捷。超小的体积、 极低的功耗,信号传输距离可达 20 米以上。
- 滑动变阻器
滑动变阻器模块通常具有三个脚,一个脚输入,另外两个脚输出。 通常被串联到电路中。由于串联分压,当滑动变阻器有阻值的时候即可起控制作用. - 1.8寸SPI屏幕
这个屏幕采用SPI驱动,其中一共是八根线。GND接电源地, VCC接5V,SCL接SPI时钟线,SDA接SPI的Master out slaver in (MOSI),RES接单片机任意具有驱动能力的PIN(也可以不接)DC可以不接没什么, CS 接 SPI CS 片选线。 BL线接地的话熄灭屏幕,接VCC的话最大亮度。我们可以通过将BL线接到滑动变阻器上,滑动变阻器的另一端接到GND上即可控制这个屏幕的亮度
接线映射(PIN MAPPING)
AI-m61-32s | DHT11 | 1.8SPI屏幕 | (三脚)滑动变阻器 | 5V-面包板5v | 5V | 5V | | GND-面包板GND | GND | GND | 中脚(接地) | IO13(SCL) | | Scl(时钟线) | | IO13(MOSI) | | SDA(数据线) | | IO12(CS) | | CS(片选线) | | | | BL(控制亮度) | 左1 | IO26 | | RES(重置线) |
|
IO27 | | DC(没有实际作用) | | IO25 | DHT11信号线 | | |
|
| | |
核心代码:
根据DHT11时序图得知,当主机想开启一次数据传输的时候,首先需要发送起始信号,然后等待DHT11响应。 在响应信号之后才是真正的数据。
发送起始信号代码:
- // 发送开始信号
- bflb_gpio_set(gpio, DHT_PIN);
- bflb_mtimer_delay_ms(50);
- bflb_gpio_reset(gpio, DHT_PIN);
- bflb_mtimer_delay_ms(20);
- bflb_gpio_set(gpio, DHT_PIN);
- bflb_mtimer_delay_us(30);
复制代码 接收DHT11的响应:
- // 切换为输入模式并等待DHT11的响应
- bflb_gpio_init(gpio, DHT_PIN, GPIO_INPUT | GPIO_PULLUP | GPIO_SMT_EN);
- // 读取DHT11的响应
- while (bflb_gpio_read(gpio, DHT_PIN) == 1)
- {
- }
- while (bflb_gpio_read(gpio, DHT_PIN) == 0)
- {
- }
- while (bflb_gpio_read(gpio, DHT_PIN) == 1)
- {
- }
复制代码 读取DHT11的数据代码:
- // 读取温湿度数据 共 40bits
- // 8bit湿度整数数据+8bit湿度小数数据
- // +8bi温度整数数据+8bit温度小数数据
- // +8bit校验和
- uint8_t data[5] = {0};
- for (int i = 0; i < 5; i++)
- {
- data[i] = 0;
- for (int j = 0; j < 8; j++)
- {
- while (bflb_gpio_read(gpio, DHT_PIN) == 0)
- {
- }
- bflb_mtimer_delay_us(30);
- if (bflb_gpio_read(gpio, DHT_PIN) == 1)
- {
- data[i] |= (1 << (7 - j));
- while (bflb_gpio_read(gpio, DHT_PIN) == 1)
- {
- }
- }
- }
- }
复制代码 DHT11数据解析代码(不带数据校验)
- // // 关闭GPIO
- // bflb_gpio_deinit(gpio, DHT_PIN);
- // 解析数据
- uint8_t humidity_integer = data[0];
- uint8_t humidity_decimal = data[1];
- uint8_t temperature_integer = data[2];
- uint8_t temperature_decimal = data[3];
- // 计算小数部分
- float humidity = humidity_integer + (humidity_decimal / 10.0);
- float temperature = temperature_integer + (temperature_decimal / 10.0);
复制代码 之后便是如何把湿温度数据显示到1.8寸SPI屏幕上了。这个地方的屏幕驱动代码是我问商家要的, 然后自己结合M61-32s的SPI进行的移植。
初始化SPI及其对应的屏幕上的引脚, 注释掉的内容为 board_spi0_gpio_init();内的代码。便于查看
- board_spi0_gpio_init();
- gpio1 = bflb_device_get_by_name("gpio");
- // res
- bflb_gpio_init(gpio1, GPIO_PIN_26, GPIO_OUTPUT | GPIO_PULLUP);
- // dc
- bflb_gpio_init(gpio1, GPIO_PIN_27, GPIO_OUTPUT | GPIO_PULLUP);
- // blk
- bflb_gpio_init(gpio1, GPIO_PIN_28, GPIO_OUTPUT | GPIO_PULLUP);
- // /* spi cs */
- // bflb_gpio_init(gpio, GPIO_PIN_12, GPIO_FUNC_SPI0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);
- // /* spi clk */
- // bflb_gpio_init(gpio, GPIO_PIN_13, GPIO_FUNC_SPI0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);
- // /* spi miso */
- // bflb_gpio_init(gpio, GPIO_PIN_18, GPIO_FUNC_SPI0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);
- // /* spi mosi */
- // bflb_gpio_init(gpio, GPIO_PIN_19, GPIO_FUNC_SPI0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);
复制代码 配置并且初始化SPI
- // 配置SPI
- struct bflb_spi_config_s spi_cfg =
- {
- #if (SPI_CASE_SELECT == SPI_MASTER_CASE)
- //.freq = 1 * 1000 * 1000, // 主模式时的频率设置
- .freq = 80 * 1000 * 1000,
- .role = SPI_ROLE_MASTER,
- #else
- .freq = 32 * 1000 * 1000, // 从模式时的频率设置
- .role = SPI_ROLE_SLAVE,
- #endif
- .mode = SPI_MODE3,
- .data_width = SPI_DATA_WIDTH_8BIT,
- .bit_order = SPI_BIT_MSB,
- .byte_order = SPI_BYTE_LSB,
- .tx_fifo_threshold = 0,
- .rx_fifo_threshold = 0,
- };
- // 获取并初始化SPI设备
- spi0 = bflb_device_get_by_name("spi0");
- bflb_spi_init(spi0, &spi_cfg);
- // 关闭CS片选信号的间隔设置
- bflb_spi_feature_control(spi0, SPI_CMD_SET_CS_INTERVAL, 0);
复制代码
显示湿度和温度数据到屏幕上:
- LCD_ShowString(1, 50, "Temperature:", BLACK, WHITE, 12, 1);
- LCD_ShowFloatNum1(73, 48, temperature, 4, RED, WHITE, 16);
- LCD_ShowString(1, 80, "Humidity:", BLACK, WHITE, 12, 1);
- LCD_ShowFloatNum1(73, 78, humidity, 4, RED, WHITE, 16);
复制代码
效果图展示:
屏幕最小亮度(熄屏)
正常亮度:
DHT11数据手册.pdf
(677.52 KB, 下载次数: 2)
|
|