智能暖风机——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 __cplusplusextern "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和其头文件中添加代码,内容如下:
#define fan_motor 16
#define shake_motor 14void motor_init();//电机控制引脚初始化
void fan_motor_set(IN BOOL_T bONOFF);
void shake_motor_set(IN BOOL_T bONOFF);
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);}}
四、驱动蜂鸣器
1.驱动原理图
驱动电路如下图,蜂鸣器在暖风机中用作按键提示音,也是GPIO控制,本方案中选用的是有源蜂鸣器,图中Buzzer引脚输出为高电平时,蜂鸣器工作。
2.软件方案设定
Buzzer : P28 |蜂鸣器控制引脚
高电平有效
将控制引脚配置为推挽输出模式,初始化为拉低状态,可以根据传入的函数传参执行引脚拉高和拉低,实现蜂鸣器控制。下面我们开始编写控制程序。
3.程序实现
我们在gpio_control.c和其头文件中添加代码,内容如下:
#define buzzer_pin 28
void buzzer_set(IN BOOL_T bONOFF);
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后关闭蜂鸣器。
void timer1_init(void)
{timer1 = (tuya_timer_t *)tuya_driver_find(TUYA_DRV_TIMER, TUYA_TIMER1);//The timer uses cycle modeTUYA_TIMER_CFG(timer1, TUYA_TIMER_MODE_PERIOD, tuya_timer1_cb, NULL);tuya_timer_init(timer1);//Start the timer, 1ms is a counting cycletuya_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函数即可实现按键提示音功能。
技术支持
您可以通过以下方法获得涂鸦的支持:
- 涂鸦开发者中心;http://developer.Tuya.com
- 涂鸦帮助中心:http://support.tuya.com/help
- 涂鸦技术支持中心:https://service.console.tuya.com
智能暖风机——4.暖风机外设驱动实现相关推荐
- 2018-2019-1 20165318 20165322 20165326 实验四 外设驱动程序设计
实验四 外设驱动程序设计 实验内容 任务一 任务二 问题及解决方法 参考链接 实验内容 任务一 学习资源中全课中的"hqyj.嵌入式Linux应用程序开发标准教程.pdf"中的第十 ...
- Linux主机驱动与外设驱动分离思想
- by 宋宝华(Barry Song) 1主机.外设驱动分离的意义 在Linux设备驱动框架的设计中,除了有分层设计实现以外,还有分隔的思想.举一个简单的例子,假设我们要通过SPI总线访问某外设,在 ...
- 计算机连接外设的端口驱动,将 KMDF 外设驱动程序连接到串行端口
将 KMDF 外设驱动程序连接到串行端口 04/20/2017 本文内容 SerCx2 管理的串行端口上的外围设备的 KMDF 驱动程序需要某些硬件资源来运行设备. 这些资源包含驱动程序打开串行端口逻 ...
- 2017-2018-1 20155327 实验四 外设驱动程序设计
2017-2018-1 20155327 实验四 外设驱动程序设计 题目一 学习资源中全课中的"hqyj.嵌入式Linux应用程序开发标准教程.pdf"中的第十一章 提交康奈尔笔记 ...
- location驱动包_Zynq SDK 驱动探求(三):论一个外设驱动的全部身家·Xilinx SDK 驱动源码结构...
Processor is ready. Configure programable logic. 在新专栏 Rapid TCP/IP on Zynq 中,将围绕 Xilinx Zynq 系列芯片,从 ...
- 信息安全系统设计基础实验四:外设驱动程序设计 20145222黄亚奇 20145213祁玮
北京电子科技学院(BESTI) 实 验 报 告 封 面 课程:信息安全系统设计基础 班级:1452 姓名: 黄亚奇 祁玮 学号: 20145222 20145213 成绩: 指导教师:娄嘉鹏 实验日期 ...
- spi 外设驱动(spi_driver)
spi驱动模型和i2c的类似,都按照主机外设分离来设计的.但我觉得比i2c的要简明好多. 上文配置的spi驱动最外层是platform总线然后是spi总线然后是字符设备. spi驱动模型分为 spi主 ...
- i2c--ioctl--主机控制器驱动(i2c_adapter)--外设驱动(i2c_driver)
updating... i2c驱动目录 [root@localhost i2c]# pwd /opt/FriendlyArm/mini2440/linux-2.6.32.2/drivers/i2c [ ...
- 2018-2019-1 20165211 实验四 外设驱动程序设计
2018-2019-1 20165211 实验四 外设驱动程序设计 任务一 1.实验要求 学习资源中全课中的"hqyj.嵌入式Linux应用程序开发标准教程.pdf"中的第十一章 ...
- (67)SPI外设驱动接收驱动(六)(第14天)
(67)SPI外设驱动接收驱动(六)(第14天) 1 文章目录 1)文章目录 2)FPGA初级课程介绍 3)FPGA初级课程架构 4)SPI外设驱动接收驱动(六)(第14天) 5)技术交流 6)参考资 ...
最新文章
- Linux那些事儿 之 戏说USB(18)设备的生命线(一)
- Thymeleaf——使用模板动态生成JavaScript脚本文件
- 分享平时工作中那些给力的shell命令
- python elementtree乱码_python ElementTree
- 《统一沟通-微软-实战》-6-部署-7-部署移动功能-1
- 模块化实现(好处,原因)
- json规范,平时不注意的特殊符号
- mysql purge进程_MySQL数据库之Purge死锁问题解析
- element ui级联选择器添加必填验证
- 2011年国庆发布:(cppblog)C++博客十八罗汉造像
- 【NVMe2.0b 8】NVMe 队列仲裁机制
- 阿玛机器人_豪华日本声优阵容,《战斗天赋解析系统》让你耳朵怀孕!
- java精确小数位数的几种方法
- 无法识别的usb跟这台计算机,【实战成功】无法识别的USB设备:跟这台计算机连接的一个USB设备运行不正常,WINDOWS无法识别...
- keil里的debug项里没有 proteus vsm 51解决方案
- 1998年11月11日,马化腾和同学张志东正式注册——腾讯
- 知乎搜索关键字爬取相关图片
- 字节小组长无意得知手下有35K,自己却只有28K;谷歌推出Go版Android 11;Deepin v20正式发布!...
- 点餐系统后台服务器部署,Java后台——点餐小程序在服务器上运行点餐系统供别人访问...
- 如何使用条件格式在 Excel 中隔行加底纹