【项目介绍】
时光易逝,年华易老。特别是在生活节奏越来越快的时代,无论在学习、工作还是在运动、休息、下厨的时候,都需要把握时间、提高效率。
因此,想要做一个能够定时提醒的闹钟,让自己能高效利用时间。
市面上很多定时闹钟都是通过按键或者其他接触的动作来设定时间。但我既然是个懒人,便是不想去触摸按键啦。能不能不接触定时闹钟就能设定时间呢?
【解决方案】
不用接触就能控制定时闹钟,目前我能想到就是用声控、图像识别手势和手势感应。如果用声控或图像识别,有种大材小用的感觉。刚好手头上有之前测评过的手势识别传感器,那就开始安排吧~
【作品演示】
先上一段演示视频:
作品功能:
1、手对着传感器向分别向上、下、左、右划动,对应调节所需要的定时时间:3、5、10、15分钟;
2、手向前推,则开始倒计时;手向后拉,则进入时间设定模式;
3、如果时间到了,蜂鸣器就会鸣叫,直到用手向前或向后划动取消。
应用场景:
该作品最适用于在厨房烹饪的时候,因为手上可能有水渍或油渍,普通的定时器上可能还有细菌,触摸后还得洗手才能去接触食材。
如果在公共场合使用,可以不用接触它就能使用,特别是在疫情期间,更为适用。
【制作过程】
首先准备电子部分的器材,如下图:
部分零件需要在某宝采购。
步骤1 连接电路
使用焊接将电路连接起来。注意要调节升压板的旋钮,将输出电压设定为5V左右。
步骤2 写入程序测试
首先要导入手势传感器和数码管的库文件。
手势传感器的库文件可以在这里找:https://github.com/DFRobot/DFRobot_Gesture_Touch
数码管的库文件要在Arduino IDE的库管理器里搜索:Grove - 4 Digit Display,然后下载。
#include <MsTimer2.h> //定时器库的 头文件
#include "TM1637.h"
#include "DFRobot_Gesture_Touch.h"
#ifdef __AVR__
#include "SoftwareSerial.h"
SoftwareSerial mySerial(10, 11); // example for uno, use software serial
#elif defined ESP_PLATFORM
#include "HardwareSerial.h"
HardwareSerial mySerial(1);
#endif
DFRobot_Gesture_Touch DFGT(&mySerial); // init sensor object, request write and read function
#define Buzz A2 //蜂鸣器
// Pins definitions for TM1637 and can be changed to other ports
const int CLK = A0;
const int DIO = A1;
TM1637 tm1637(CLK, DIO);
static boolean point_flag = HIGH;//显示中间两个点
static boolean alarm = LOW;//时间到了报警提示
int8_t TimeDisp[] = {0x00, 0x00, 0x00, 0x00};
int Sec = 0;//定义秒
int Min = 0;//定义分
bool setting = 0; //设置时间模式
bool start_count = 0; //开始计时
int time_num ;
void flash() //中断处理函数,改变灯的状态
{
point_flag = !point_flag;
if(start_count == 1){
Sec--;
}
tm1637.point(POINT_ON);
}
void Ring()
{
digitalWrite(Buzz,HIGH);
delay(50);
digitalWrite(Buzz,LOW);
delay(50);
}
void setup()
{
Serial.begin(115200);
mySerial.begin(9600);
delay(500);
while(mySerial.available()) // flush serial buffer
mySerial.read();
Serial.println("gesture&touch sensor test");
DFGT.setGestureDistance(15); // suggest default value
DFGT.enableFunction(DFGT_FUN_ALL); // enable all functions
//DFGT.disableFunction(DFGT_FUN_RIGHT | DFGT_FUN_LEFT); // disable function test
DFGT.enableFunction(DFGT_FUN_RIGHT | DFGT_FUN_LEFT); // enable function test
DFGT.setSleep(6); // set auto sleep time out, in sleep mode, something approach will weak it up
pinMode(Buzz,OUTPUT);
tm1637.init();
tm1637.set(BRIGHT_TYPICAL);//BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7;
Min = 0;
Sec = 0 ;
tm1637.display(TimeDisp);
tm1637.displayStr("LOUE");
//tm1637.displayNum(1234,0);
delay(1000);
MsTimer2::set(1000, flash); // 中断设置函数,每 1000ms 进入一次中断
MsTimer2::start(); //开始计时
}
void loop() {
int8_t rslt = DFGT.getAnEvent(); // get an event that data saved in serial buffer
if(rslt != DF_ERR) {
// DFGT.setSleep(DFGT_SLEEP_DISABLE); // disable auto sleep
switch(rslt) {
case DFGT_EVT_BACK: {
Serial.println("get event back");
Ring();
if(setting == 1){
Min = 5;
Sec = 0;
}
} break;
case DFGT_EVT_FORWARD: {
Serial.println("get event forward");
Ring();
if(setting == 1){
Min = 15;
Sec = 0;
}
} break;
case DFGT_EVT_RIGHT: {
Ring();
Serial.println("get event right");
if(setting == 1){
Min = 10;
Sec = 0;
}
} break;
case DFGT_EVT_LEFT: {
Serial.println("get event left");
Ring();
if(setting == 1){
Min = 3;
Sec = 0;
}
} break;
case DFGT_EVT_PULLUP: {
Serial.println("get event pull up");
Ring();
setting = 1;//进入设置模式*/
start_count = 0;//停止计时
alarm = 0;
Min=88;
Sec=88;
} break;
case DFGT_EVT_PULLDOWN: {
Serial.println("get event pull down");
Ring();
Ring();
alarm = 0;
if( Min>0 && Sec==0){
start_count = 1;//开始计时
setting = 0;//退出设置模式*/
}
} break;
case DFGT_EVT_PULLREMOVE: {
Serial.println("get event pull and remove");
/*digitalWrite(Buzz,HIGH);
delay(200);
digitalWrite(Buzz,LOW);
delay(200);
setting = 1;//进入设置模式*/
} break;
/* case DFGT_EVT_TOUCH1: {
Serial.println("get event touch1");
digitalWrite(Buzz,HIGH);
delay(50);
digitalWrite(Buzz,LOW);
delay(50);
} break;
case DFGT_EVT_TOUCH2: {
Serial.println("get event touch2");
} break;
case DFGT_EVT_TOUCH3: {
Serial.println("get event touch3");
} break;
case DFGT_EVT_TOUCH4: {
Serial.println("get event touch4");
} break;
case DFGT_EVT_TOUCH5: {
Serial.println("get event touch5");
} break;*/
}
}
if(Sec == -1)
{
Sec = 59;
Min--;
}
if(start_count==1 && Min == 0 && Sec ==0 )
{
Min = 0;
Sec = 0;
start_count = 0;
TimeDisp[3] = Sec % 10;
tm1637.display(TimeDisp);
alarm = 1;
}
if( start_count || setting ) {
TimeDisp[0] = Min / 10;
TimeDisp[1] = Min % 10;
TimeDisp[2] = Sec / 10;
TimeDisp[3] = Sec % 10;
tm1637.display(TimeDisp);
}
if(point_flag){
tm1637.point(POINT_ON);
if(alarm){
digitalWrite(Buzz,HIGH);
}
}
else {
tm1637.point(POINT_OFF);
if(alarm){
digitalWrite(Buzz,LOW);
}
}
}
步骤3 3D设计和打印
外壳分为三个部分:主体、后盖、按钮。使用0.2mm层厚,一共打印了6个小时。
步骤4 给外壳绘制图案
可以使用彩笔上色,画上自己喜欢的图案。
步骤5 将电子器材安装到3D打印的外壳里面
数码管和手势传感器、主控器用螺丝固定,其他器件可以使用热熔胶或者泡沫胶来固定。
注意充电口和数据线插口位置。
【项目总结】
1.我用的锂电池容量有点小,1000mAh,用大概3小时就没电了,还没具体测试过。后期可以改成插电式的,这样就可以不用锂电池和升压板了。
2.代码还可以再优化一下,避免在计时的时候被无意的动作干扰到。也可以让定时的时间自由设定,不局限于3-15分钟。
3.有需要可以添加时钟模块,作为一个钟表使用。
【相关资源】
最后分享程序源文件和外壳的stl文件。
wzyz2020.08.20
你好,可以留个联系方式么,刚毕业公司要求做这个的模拟,到时候有不懂的想请教一下
youjingisland2020.08.03
应用场景很棒
Pippin皮皮2020.06.12
在厨房很实用呢!