suncat0504 发表于 2024-5-8 12:02

【AT-START-F405测评】+自动补水加湿器

本帖最后由 suncat0504 于 2024-5-9 08:48 编辑

在完成显示部分和温湿度传感器部分的工作后,追加水位检测传感器和抽水马达、加湿器模块。整个装置如下:水位检测和加湿器部分,都是现成的模块。抽水马达使用继电器模块和专用的驱动电源。因为抽水马达的工作电流比较大,不能使用开发板上的电源,所以单独为它准备了一个电源,是由9V电源通过降压得到3.7左右。开发板通过GPIO口控制继电器模块接通/关断抽水马达的供电,从而控制补水过程。水源由一个矿泉水桶提供,使用的水桶体积比较大,可以使用好长时间,不需要频繁换水。水位传感器:这是一个电容式的水位检测传感器,需要靠近水源即可。感应结果可以直接输入到GPIO口,通过电平信号,确定容器内是否有水。容器的厚度不能太大,否则传感器无法正常感应到是否有水。
整个装置的工作过程:主处理程序:/**
**************************************************************************
* @file   main.c
* @brief    main program
**************************************************************************
*                     Copyright notice & Disclaimer
*
* The software Board Support Package (BSP) that is made available to
* download from Artery official website is the copyrighted work of Artery.
* Artery authorizes customers to use, copy, and distribute the BSP
* software and its related documentation for the purpose of design and
* development in conjunction with Artery microcontrollers. Use of the
* software is governed by this copyright notice and the following disclaimer.
*
* THIS SOFTWARE IS PROVIDED ON "AS IS" BASIS WITHOUT WARRANTIES,
* GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,
* TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR
* STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,
* INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.
*
**************************************************************************
*/

/* includes */
#include "at32f402_405_board.h"
#include "at32f402_405_clock.h"
#include "spitft.h"
#include "gxht30.h"

#define MYMAC_PORT GPIOB
#define MYMAC_WATER_POS_PIN   GPIO_PINS_8         // 水位采集口,输入
#define MYMAC_MOTOR_PIN         GPIO_PINS_9         // 抽水马达控制口,输出
#define MYMAC_H_POWER_PIN       GPIO_PINS_7         // 加湿器电源

// 启动加湿器时的湿度临界点
#define WORK_HUMI60

// 每补水一次,隔多长时间再次见此是否缺水
#define WORK_JIANXIE_SEC-10

// 每次补水的时间
#define WORK_BUSHUI_SEC4

// 控制加湿器电源
#define OPEN_H_POWER()          gpio_bits_set(MYMAC_PORT, MYMAC_H_POWER_PIN);
#define CLOSE_H_POWER()         gpio_bits_reset(MYMAC_PORT, MYMAC_H_POWER_PIN);

// 控制补水马达工作
#define OPEN_MOTOR()            gpio_bits_set(MYMAC_PORT, MYMAC_MOTOR_PIN);
#define CLOSE_MOTOR()         gpio_bits_reset(MYMAC_PORT, MYMAC_MOTOR_PIN);


// 补水标志
int32_t bushui_flag = 0;

/** @addtogroup AT32F405_periph_examples
* @{
*/

/** @addtogroup 405_GPIO_led_toggle GPIO_led_toggle
* @{
*/




/**
* 加湿器相关控制口初始化
* PB8 - 水位传感器采集信号
* PB9 - 抽水马达控制信号
* PB7 - 控制加湿器的电源信号
*/
void mymac_Init(void) {
    gpio_init_type gpio_init_struct;

    // 允许总线时钟
    crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);

    // 设置初始化缺省参数
    gpio_default_para_init(&gpio_init_struct);

    // 设置水位信号采集口,输入模式
    gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
    gpio_init_struct.gpio_out_type= GPIO_OUTPUT_PUSH_PULL;
    gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;
    gpio_init_struct.gpio_pull = GPIO_PULL_DOWN;
    gpio_init_struct.gpio_pins = MYMAC_WATER_POS_PIN;
    gpio_init(MYMAC_PORT, &gpio_init_struct);
   

    // 抽水马达控制口,输出模式; 加湿器电源,输出模式
    gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
    gpio_init_struct.gpio_out_type= GPIO_OUTPUT_PUSH_PULL;
    gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
    gpio_init_struct.gpio_pins = MYMAC_MOTOR_PIN | MYMAC_H_POWER_PIN;
    gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
    gpio_init(MYMAC_PORT, &gpio_init_struct);
   
   
}





/**
* @briefmain function.
* @paramnone
* @retval none
*/
int main(void) {
    float         temperature;      // temperature [°C]
    float      humidity;                // relative humidity [%RH]
    char val={'\0'};
    etError   error;      // error code
   
    system_clock_config();

    at32_board_init();
    uart_print_init(115200);
   

    printf("Start main ...\r\n");
   
    // 初始化TFT显示屏
    Lcd_Init();
   
    // 测试
    Lcd_Clear(BLACK);
    Gui_DrawFont_GBK16(8,10,WHITE, BLACK, (unsigned char *)"Artery & 21IC");
    Gui_DrawFont_GBK16(30,36,WHITE, BLACK, (unsigned char *)"AT32F405");   

    Gui_DrawFont_GBK16(0, 60,WHITE, BLACK, (unsigned char *)"初始化:");
   
    Gui_DrawFont_GBK16(10, 76,WHITE, BLACK, (unsigned char *)"水位控制接口");   
    // 初始化水位传感器、抽水马达控制口
    at32_led_on(LED2);
    mymac_Init();
    Gui_DrawFont_GBK16(10, 92,WHITE, BLACK, (unsigned char *)"OK");   
   
    at32_led_off(LED2);
    at32_led_on(LED3);
    // 初始化温湿度传感器GXHT-30
    Gui_DrawFont_GBK16(10, 76,WHITE, BLACK, (unsigned char *)"温度传感器");
    gxht30_Init(GXHT30_ADDRESS);
    Gui_DrawFont_GBK16(10, 92,WHITE, BLACK, (unsigned char *)"OK");

    Gui_DrawFont_GBK16(0, 60, WHITE, BLACK, (unsigned char *)"            ");
    Gui_DrawFont_GBK16(10, 76,WHITE, BLACK, (unsigned char *)"            ");
    Gui_DrawFont_GBK16(10, 92,WHITE, BLACK, (unsigned char *)"            ");
   
    at32_led_off(LED3);
    Gui_DrawFont_GBK16(0, 110, WHITE, BLACK, (unsigned char *)"温度");
    Gui_DrawFont_GBK16(32,110, WHITE, BLACK, (unsigned char *)"=");
    Gui_DrawFont_GBK16(0, 126,WHITE, BLACK, (unsigned char *)"湿度");
    Gui_DrawFont_GBK16(32,126,WHITE, BLACK, (unsigned char *)"=");
    while(1) {
      //at32_led_toggle(LED2);
      //delay_ms(200);
      //at32_led_toggle(LED3);
      //delay_ms(200);
      //at32_led_toggle(LED4);
      //delay_ms(200);
      
      // 测量温湿度,方法2:OK
      SHT30_read_result(GXHT30_ADDRESS, &temperature, &humidity);
      
      sprintf(val, "%5.1f", temperature);
      Gui_DrawFont_GBK16(48,110,WHITE, BLACK, (unsigned char *)val);

      sprintf(val, "%5.1f", humidity);
      Gui_DrawFont_GBK16(48,126, WHITE, BLACK, (unsigned char *)val);
      
      // 湿度在60以上时,加湿器不工作
      if (humidity >= 60) {
            CLOSE_H_POWER();
            continue;
      } else {
            // 启动加湿器
            OPEN_H_POWER();
      }
      
      // 检查水位
      if (gpio_input_data_bit_read(MYMAC_PORT, MYMAC_WATER_POS_PIN)) {
            Gui_DrawFont_GBK16(0, 60, WHITE, BLACK, (unsigned char *)"            ");
            //gpio_bits_reset(GXHT30_PORT, MYMAC_MOTOR_PIN);
      } else {
            // 水量不足时
            Gui_DrawFont_GBK16(0, 60, WHITE, BLACK, (unsigned char *)"水量不足    ");
            // 设置加水标志
            if (bushui_flag==0) {
                bushui_flag = 1;
            }
      }
      if (bushui_flag==1) {
            // 启动补水马达
            OPEN_MOTOR();
            Gui_DrawFont_GBK16(0, 76, WHITE, BLACK, (unsigned char *)"开始补水    ");
      }

      if (bushui_flag>0) {
            sprintf(val, "开始补水:%d", bushui_flag);
            Gui_DrawFont_GBK16(0,76, WHITE, BLACK, (unsigned char *)val);
            
            bushui_flag++;
            if (bushui_flag > WORK_BUSHUI_SEC) {
                // 补水3秒后,关闭补水马达,清除补水标志
                CLOSE_MOTOR();
                bushui_flag = WORK_JIANXIE_SEC;
                Gui_DrawFont_GBK16(0, 76, WHITE, BLACK, (unsigned char *)"补水完成    ");
            }
      }
      
      if (bushui_flag<0) {
            bushui_flag++;
            sprintf(val, "间歇期:%d", 0-bushui_flag);
            Gui_DrawFont_GBK16(0,76, WHITE, BLACK, (unsigned char *)val);
      }

      
      delay_ms(1000);
    }
}

/**
* @}
*/

/**
* @}
*/
启动抽水马达,开始补水

[鑫森淼焱垚] 发表于 2024-5-8 20:11

牛哇,点赞。。。。

chenqianqian 发表于 2024-5-8 20:59

完整的最小模拟系统,不错啊。
页: [1]
查看完整版本: 【AT-START-F405测评】+自动补水加湿器