回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页
best-icon

#创意#手势感应定时闹钟 简单

头像 chenhanzhong 2020.05.24 2932 3

【项目介绍】

时光易逝,年华易老。特别是在生活节奏越来越快的时代,无论在学习、工作还是在运动、休息、下厨的时候,都需要把握时间、提高效率。 因此,想要做一个能够定时提醒的闹钟,让自己能高效利用时间。 市面上很多定时闹钟都是通过按键或者其他接触的动作来设定时间。但我既然是个懒人,便是不想去触摸按键啦。能不能不接触定时闹钟就能设定时间呢? 

【解决方案】

不用接触就能控制定时闹钟,目前我能想到就是用声控、图像识别手势和手势感应。如果用声控或图像识别,有种大材小用的感觉。刚好手头上有之前测评过的手势识别传感器,那就开始安排吧~

【作品演示】

先上一段演示视频:

project-image

作品功能:

1、手对着传感器向分别向上、下、左、右划动,对应调节所需要的定时时间:3、5、10、15分钟;

2、手向前推,则开始倒计时;手向后拉,则进入时间设定模式;

3、如果时间到了,蜂鸣器就会鸣叫,直到用手向前或向后划动取消。

应用场景:

该作品最适用于在厨房烹饪的时候,因为手上可能有水渍或油渍,普通的定时器上可能还有细菌,触摸后还得洗手才能去接触食材。

如果在公共场合使用,可以不用接触它就能使用,特别是在疫情期间,更为适用。

【制作过程】

首先准备电子部分的器材,如下图:

部分零件需要在某宝采购。

project-image

材料清单

  • Beetle控制器 X1 链接
  • Beetle主控器扩展板 X1 链接
  • 可调电源升压板 X1
  • 3.7V锂电池 X1
  • 有源蜂鸣器(方形) X1
  • 手势识别带触摸传感器 X1 链接
  • 锂电池充电板 X1
  • 端子和导线若干 X1
  • 4位数码管 X1
  • 8mm自锁开关 X1
  • 2x5mm自攻螺丝 X4
  • 3x5mm自攻螺丝和垫片 X4
  • 热熔胶枪和胶条 X1
  • 泡沫胶 X1

步骤1 连接电路

使用焊接将电路连接起来。注意要调节升压板的旋钮,将输出电压设定为5V左右。

project-image
project-image

步骤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个小时。

project-image

步骤4 给外壳绘制图案

可以使用彩笔上色,画上自己喜欢的图案。

project-image

步骤5 将电子器材安装到3D打印的外壳里面

数码管和手势传感器、主控器用螺丝固定,其他器件可以使用热熔胶或者泡沫胶来固定。

注意充电口和数据线插口位置。

project-image

【项目总结】

1.我用的锂电池容量有点小,1000mAh,用大概3小时就没电了,还没具体测试过。后期可以改成插电式的,这样就可以不用锂电池和升压板了。

2.代码还可以再优化一下,避免在计时的时候被无意的动作干扰到。也可以让定时的时间自由设定,不局限于3-15分钟。

3.有需要可以添加时钟模块,作为一个钟表使用。

【相关资源】

最后分享程序源文件和外壳的stl文件。

评论

user-avatar
  • wzyz

    wzyz2020.08.20

    你好,可以留个联系方式么,刚毕业公司要求做这个的模拟,到时候有不懂的想请教一下

    0
    • youjingisland

      youjingisland2020.08.03

      应用场景很棒

      0
      • Pippin皮皮

        Pippin皮皮2020.06.12

        在厨房很实用呢!

        0