【电子DIY作品】环境湿温度监控器-基于安信可M61-32s-kit

[复制链接]
查看1587 | 回复9 | 2023-12-19 17:18:56 | 显示全部楼层 |阅读模式
本帖最后由 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 用于给面包板供电
面包板供电DC线 1 用于给面包板供电




电子元件介绍


  • 面包板供电模块
    360截图171205267995100.png
    此面包板供电模块可以接收两个电源输入口,分别是USB-typeA 和 DC (7-12v), 然后通过两个电压转换芯片可以将输入电压转换到3v或者5v(根据跳线帽选择)

  • DHT11湿温度传感器
    360截图16751024284358.png
    DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复 合传感器。它包括一个电阻式感湿元件和一个 NTC 测温元件。每个 DHT11 传 感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在 OTP 内存中,传感器内部在检测信号的处理过程中要调用这些校准系数,用户 无需重新校准。单线制串行接口,使系统集成变得简易快捷。超小的体积、 极低的功耗,信号传输距离可达 20 米以上。

  • 滑动变阻器
    360截图18230102261831.png
    滑动变阻器模块通常具有三个脚,一个脚输入,另外两个脚输出。 通常被串联到电路中。由于串联分压,当滑动变阻器有阻值的时候即可起控制作用.
  • 1.8寸SPI屏幕
    360截图18720124404162.png
    这个屏幕采用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信号线



微信图片_20231219165509.jpg


核心代码:

360截图1700101610086137.png
根据DHT11时序图得知,当主机想开启一次数据传输的时候,首先需要发送起始信号,然后等待DHT11响应。 在响应信号之后才是真正的数据。

发送起始信号代码:
  1. // 发送开始信号
  2.     bflb_gpio_set(gpio, DHT_PIN);
  3.     bflb_mtimer_delay_ms(50);
  4.     bflb_gpio_reset(gpio, DHT_PIN);
  5.     bflb_mtimer_delay_ms(20);
  6.     bflb_gpio_set(gpio, DHT_PIN);
  7.     bflb_mtimer_delay_us(30);
复制代码
接收DHT11的响应:
  1. // 切换为输入模式并等待DHT11的响应
  2.     bflb_gpio_init(gpio, DHT_PIN, GPIO_INPUT | GPIO_PULLUP | GPIO_SMT_EN);

  3.     // 读取DHT11的响应
  4.     while (bflb_gpio_read(gpio, DHT_PIN) == 1)
  5.     {
  6.     }
  7.     while (bflb_gpio_read(gpio, DHT_PIN) == 0)
  8.     {
  9.     }
  10.     while (bflb_gpio_read(gpio, DHT_PIN) == 1)
  11.     {
  12.     }
复制代码
读取DHT11的数据代码:
  1. // 读取温湿度数据 共 40bits
  2.     // 8bit湿度整数数据+8bit湿度小数数据
  3.     // +8bi温度整数数据+8bit温度小数数据
  4.     // +8bit校验和

  5.     uint8_t data[5] = {0};
  6.     for (int i = 0; i < 5; i++)
  7.     {
  8.         data[i] = 0;
  9.         for (int j = 0; j < 8; j++)
  10.         {
  11.             while (bflb_gpio_read(gpio, DHT_PIN) == 0)
  12.             {
  13.             }
  14.             bflb_mtimer_delay_us(30);
  15.             if (bflb_gpio_read(gpio, DHT_PIN) == 1)
  16.             {
  17.                 data[i] |= (1 << (7 - j));
  18.                 while (bflb_gpio_read(gpio, DHT_PIN) == 1)
  19.                 {
  20.                 }
  21.             }
  22.         }
  23.     }
复制代码
DHT11数据解析代码(不带数据校验)
  1. // // 关闭GPIO
  2.     // bflb_gpio_deinit(gpio, DHT_PIN);

  3.     // 解析数据
  4.     uint8_t humidity_integer = data[0];
  5.     uint8_t humidity_decimal = data[1];
  6.     uint8_t temperature_integer = data[2];
  7.     uint8_t temperature_decimal = data[3];

  8.     // 计算小数部分
  9.     float humidity = humidity_integer + (humidity_decimal / 10.0);
  10.     float temperature = temperature_integer + (temperature_decimal / 10.0);
复制代码
之后便是如何把湿温度数据显示到1.8寸SPI屏幕上了。这个地方的屏幕驱动代码是我问商家要的, 然后自己结合M61-32s的SPI进行的移植。

初始化SPI及其对应的屏幕上的引脚, 注释掉的内容为 board_spi0_gpio_init();内的代码。便于查看
  1. board_spi0_gpio_init();

  2.         gpio1 = bflb_device_get_by_name("gpio");
  3.         // res
  4.         bflb_gpio_init(gpio1, GPIO_PIN_26, GPIO_OUTPUT | GPIO_PULLUP);
  5.         // dc
  6.         bflb_gpio_init(gpio1, GPIO_PIN_27, GPIO_OUTPUT | GPIO_PULLUP);
  7.         // blk
  8.         bflb_gpio_init(gpio1, GPIO_PIN_28, GPIO_OUTPUT | GPIO_PULLUP);

  9.         // /* spi cs */
  10.         // bflb_gpio_init(gpio, GPIO_PIN_12, GPIO_FUNC_SPI0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);
  11.         // /* spi clk */
  12.         // bflb_gpio_init(gpio, GPIO_PIN_13, GPIO_FUNC_SPI0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);
  13.         // /* spi miso */
  14.         // bflb_gpio_init(gpio, GPIO_PIN_18, GPIO_FUNC_SPI0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);
  15.         // /* spi mosi */
  16.         // bflb_gpio_init(gpio, GPIO_PIN_19, GPIO_FUNC_SPI0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);
复制代码
配置并且初始化SPI
  1. // 配置SPI
  2.         struct bflb_spi_config_s spi_cfg =
  3.         {
  4. #if (SPI_CASE_SELECT == SPI_MASTER_CASE)
  5.                 //.freq = 1 * 1000 * 1000, // 主模式时的频率设置
  6.                 .freq = 80 * 1000 * 1000,
  7.                 .role = SPI_ROLE_MASTER,
  8. #else
  9.                 .freq = 32 * 1000 * 1000, // 从模式时的频率设置
  10.                 .role = SPI_ROLE_SLAVE,
  11. #endif
  12.                 .mode = SPI_MODE3,
  13.                 .data_width = SPI_DATA_WIDTH_8BIT,
  14.                 .bit_order = SPI_BIT_MSB,
  15.                 .byte_order = SPI_BYTE_LSB,
  16.                 .tx_fifo_threshold = 0,
  17.                 .rx_fifo_threshold = 0,
  18.         };

  19.         // 获取并初始化SPI设备
  20.         spi0 = bflb_device_get_by_name("spi0");
  21.         bflb_spi_init(spi0, &spi_cfg);

  22.         // 关闭CS片选信号的间隔设置
  23.         bflb_spi_feature_control(spi0, SPI_CMD_SET_CS_INTERVAL, 0);
复制代码


显示湿度和温度数据到屏幕上:
  1. LCD_ShowString(1, 50, "Temperature:", BLACK, WHITE, 12, 1);
  2.     LCD_ShowFloatNum1(73, 48, temperature, 4, RED, WHITE, 16);
  3.     LCD_ShowString(1, 80, "Humidity:", BLACK, WHITE, 12, 1);
  4.     LCD_ShowFloatNum1(73, 78, humidity, 4, RED, WHITE, 16);
复制代码


效果图展示:


屏幕最小亮度(熄屏)
微信图片_20231219171242.jpg


正常亮度:
微信图片_20231219171423.jpg


DHT11数据手册.pdf (677.52 KB, 下载次数: 2)

本帖被以下淘专辑推荐:

回复

使用道具 举报

bzhou830 | 2023-12-19 17:37:24 | 显示全部楼层
王哥优秀
选择去发光,而不是被照亮
回复

使用道具 举报

爱笑 | 2023-12-20 08:39:02 | 显示全部楼层
用心做好保姆工作
回复

使用道具 举报

lazy | 2023-12-20 08:43:05 | 显示全部楼层
大佬
回复

使用道具 举报

WT_0213 | 2023-12-20 09:06:20 | 显示全部楼层
回复

使用道具 举报

1084504793 | 2023-12-20 11:03:08 | 显示全部楼层
回复

使用道具 举报

1084504793 | 2023-12-20 11:04:34 | 显示全部楼层
学到了
回复

使用道具 举报

大白 | 2023-12-20 14:11:24 | 显示全部楼层
加油
回复

使用道具 举报

lza | 2024-2-12 18:38:17 | 显示全部楼层
回复

使用道具 举报

salmawisoky | 2024-3-1 11:28:07 | 显示全部楼层
可以通过滑动变阻器手动控制屏幕的亮度.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则