智能暖风机——4.暖风机外设驱动实现

前言

 

上一篇文章  涂鸦智能暖风机软件实现之利用B3950实现温度采集功能已经实现了暖风机的温度采集功能,本文将实现暖风机的基本外设驱动,例如驱动继电器开关实现档位调节、驱动摇头电机、驱动蜂鸣器等。

一、智能暖风机的整体功能设定

  • 智能暖风机设定功能如下:
功能说明
开关

触摸按键:1个

按键控制,app控制

控制暖风机开关。

目前开发的开启有三种方式:

1.App面板控制

2:按键控制

3:定时控制

模式

触摸按键:1个

按键控制,app控制

1:风扇功能:只吹风,不制热。

2:1档加热:风扇+加热1

3:2档加热:风扇+加热2(档位更高)

定时

触摸按键:1个

按键控制,app控制

倒计时默认枚举值有cancel, 1h, 2h, 3h, 4h, 5h, 6h,7h, 8h。

倒计时功能针对暖风机开关。

app暖风机倒计时剩余时间。

灯光

触摸按键:1个

按键控制,app控制

4种照明模式: 1 rgb1 2 rgb2 3 rgb3 4 rgb4

设温

触摸按键:1个

按键控制,app控制

温度设置区间为15-40℃,客户可以自行设定温度。

温度显示

硬件:断码显示

按键控制,app控制

只是在设定的时候显示

设备上和当前温度显示复用,app单独显示

设备:温度设定时,显示设定温度,误操作3秒后显示当前室温

摇头

触摸按键:1个

按键可控制,app可控制。

开/关

待机记忆

按键,app,主动操作开关键关机为待机状态。

再开启后恢复上一次设置:

温度设置:上一次设置

温度显示:当前环境温度

灯光模式:上一次设置

设备定时关:默认关闭

app定时关:默认关闭。

app定时开:上一次设置。

断电记忆

断电后为断电状态,再上电恢复上一次设置:

开关状态:默认关

温度设置:上一次设置

温度显示:当前环境温度

灯光模式:上一次设置

设备定时关:默认关闭

app定时关:默认关闭。

app定时开:上一次设置。

二、驱动继电器控制暖风机工作档位

1.驱动原理图

驱动电路如下图,LIN和HIN分别是低加热档和高加热档的控制引脚,控制引脚电平拉高后对应的输出引脚LOUT和HOUT就会输出高电平驱动继电器开启,从而开启低档位或高档位的加热管。

在这里插入图片描述

2.软件方案设定

上一篇文章我们实现了温度采集功能,现在我们在此基础上进行开发。

  • 所用的SOC引脚图如下:

在这里插入图片描述

  • 驱动方案设定

HIN : P20   |P20引脚为高加热档控制引脚
LIN : P22   |P22引脚为低加热档控制引脚
本方案中HIN 和 LIN引脚不能同时拉高

将控制引脚配置为推挽输出模式,初始化为拉低状态,可以根据传入的函数传参执行引脚拉高和拉低,实现控制继电器功能。下面我们开始编写控制程序。

3.程序实现

由于模块化编程思想便于代码的扩展和管理。我们单独创建一个gpio_control.c文件以及其头文件,主要内容是控制IO引脚的代码。

  • gpio_control.h内容:
#ifndef __GPIO_CONTROL_H__
#define __GPIO_CONTROL_H__

#ifdef __cplusplus
    extern "C" {
#endif
/*============================ INCLUDES ======================================*/


#include "tuya_pin.h"
#include "tuya_hal_system.h"


/*============================ MACROS ========================================*/
#define relay_leve1 22 // 低加热档控制引脚
#define relay_leve2 20 // 高加热档控制引脚
#define mode0   0	//工作模式1 只吹风不加热
#define mode1   1	//工作模式2 吹风 + 加热1档
#define mode2   2 	//工作模式3 吹风 + 加热2档
/*============================ MACROFIED FUNCTIONS ===========================*/
void relay_set(int level);
void relay_init();
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif
  • gpio_control.c内容:
#include "gpio_control.h"
//Relay control pin initialization
void relay_init()
{
    tuya_pin_init(relay_leve1, TUYA_PIN_MODE_OUT_PP_LOW);
    tuya_pin_init(relay_leve2, TUYA_PIN_MODE_OUT_PP_LOW);
}
//Heating mode setting
void relay_set(int level)
{
    switch (level){

    case mode0:
        {
        tuya_pin_write(relay_leve1, TUYA_PIN_LOW);
        tuya_pin_write(relay_leve2, TUYA_PIN_LOW);
        }
        break;
    case mode1:
        {
        tuya_pin_write(relay_leve1, TUYA_PIN_HIGH);
        tuya_pin_write(relay_leve2, TUYA_PIN_LOW);
        }
        break;
    case mode2:
        {
        tuya_pin_write(relay_leve1, TUYA_PIN_LOW);
        tuya_pin_write(relay_leve2, TUYA_PIN_HIGH);
        }
        break;
        default:
        break;
    }

}

上述代码实现了暖风机两档加热的控制,relay_init()函数放在工程的初始化函数calorifier_init()中初始化,之后使用relay_set(int level)即可调整暖风机的加热模式。

三、驱动暖风机的风扇电机和摇头电机


1.驱动原理图
 

驱动电路如下图,FAN_IN和SW_IN分别是风扇电机和摇头电机的控制引脚,控制引脚电平拉高后对应的输出引脚FAN_OUT和SW_OUT就会输出高电平驱动继电器开启,从而开启风扇电机和摇头电机,实现暖风机的吹风功能和摇头功能。
在这里插入图片描述

2.软件方案设定

  • 所用的SOC引脚图如下:

在这里插入图片描述

  • 驱动方案设定

SW_IN  : P14   |摇头电机控制引脚
FAN_IN : P16   |风扇电机控制引脚
高电平有效

将控制引脚配置为推挽输出模式,初始化为拉低状态,可以根据传入的函数传参执行引脚拉高和拉低,实现电机控制。下面我们开始编写控制程序。

3.程序实现

我们在gpio_control.c和其头文件中添加代码,内容如下:

  • gpio_control.h添加的代码:
#define fan_motor   16
#define shake_motor 14

void motor_init();//电机控制引脚初始化
void fan_motor_set(IN    BOOL_T bONOFF);
void shake_motor_set(IN     BOOL_T bONOFF);
  • gpio_control.c添加的代码:
void motor_init()
{
    tuya_pin_init(fan_motor, TUYA_PIN_MODE_OUT_PP_LOW);
    tuya_pin_init(shake_motor, TUYA_PIN_MODE_OUT_PP_LOW);
}

void fan_motor_set(IN    BOOL_T bONOFF)
{
    if(bONOFF == TRUE){
    tuya_pin_write(fan_motor, TUYA_PIN_HIGH);
    }else{
    tuya_pin_write(fan_motor, TUYA_PIN_LOW);
    }

}

void shake_motor_set(IN     BOOL_T bONOFF)
{
    if(bONOFF == TRUE){
    tuya_pin_write(shake_motor, TUYA_PIN_HIGH);
    }else{
    tuya_pin_write(shake_motor, TUYA_PIN_LOW);
    }

}

上述代码实现了暖风机的风扇电机和摇头电机的控制,motor_init()函数放在工程的初始化函数calorifier_init()中初始化,之后使用fan_motor_set()和shake_motor_set()函数即可控制风扇电机和摇头电机的开启。

四、驱动蜂鸣器


1.驱动原理图

驱动电路如下图,蜂鸣器在暖风机中用作按键提示音,也是GPIO控制,本方案中选用的是有源蜂鸣器,图中Buzzer引脚输出为高电平时,蜂鸣器工作。
在这里插入图片描述

2.软件方案设定

  • 驱动引脚设定
Buzzer  : P28   |蜂鸣器控制引脚
高电平有效

将控制引脚配置为推挽输出模式,初始化为拉低状态,可以根据传入的函数传参执行引脚拉高和拉低,实现蜂鸣器控制。下面我们开始编写控制程序。

3.程序实现

我们在gpio_control.c和其头文件中添加代码,内容如下:

  • gpio_control.h添加的代码:
#define buzzer_pin  28
void buzzer_set(IN     BOOL_T bONOFF);
  • gpio_control.c添加的代码:
void buzzer_init()
{
    tuya_pin_init(buzzer_pin, TUYA_PIN_MODE_OUT_PP_LOW);
}
void buzzer_set(IN     BOOL_T bONOFF)
{
    if(bONOFF == TRUE){
    tuya_pin_write(buzzer_pin, TUYA_PIN_HIGH);
    }else{
    tuya_pin_write(buzzer_pin, TUYA_PIN_LOW);
    }
}

由于按键提示音不需要很长的时间,故使用定时器开启蜂鸣器,响100ms后关闭蜂鸣器。

  • 在timer.c中添加代码:
void timer1_init(void)
{
    timer1 = (tuya_timer_t *)tuya_driver_find(TUYA_DRV_TIMER, TUYA_TIMER1);
    //The timer uses cycle mode
    TUYA_TIMER_CFG(timer1, TUYA_TIMER_MODE_PERIOD, tuya_timer1_cb, NULL);
    tuya_timer_init(timer1);
    //Start the timer, 1ms is a counting cycle
    tuya_timer_start(timer1, 1000);
    buzzer_set(1);
}
void tuya_timer1_cb(void *arg)
{
    static uint32_t s_tick;
    if (s_tick++ >= 100) {
        s_tick = 0;
        tuya_timer_stop(timer1);
        buzzer_set(0);
    }
}

上述代码实现了蜂鸣器的控制,buzzer_init()函数放在工程的初始化函数calorifier_init()中初始化,之后使用timer1_init函数即可实现按键提示音功能。

技术支持

您可以通过以下方法获得涂鸦的支持:

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值