所有分类
主题 主题
平台 平台
我的工作台
userHead
注册时间 [[userInfo.create_time]]
创造力 [[userInfo.creativity]]
[[userInfo.remark]]
[[d.project_title]]
articleThumb
[[d.material_name]]
timelineThumb
进入工作台
折叠
所有分类 我的工作台
展开
#创意#手势感应定时闹钟
chenhanzhong chenhanzhong 2020-05-25 00:16:23
1
1
简单

【项目介绍】

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

【解决方案】

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

【作品演示】

先上一段演示视频:

projectImage

作品功能:

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

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

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

应用场景:

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

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

【制作过程】

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

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

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

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

projectImage
projectImage
步骤2 步骤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 步骤3
3D设计和打印

外壳分为三个部分:主体、后盖、按钮。使用0.2mm层厚,一共打印了6个小时。

projectImage
步骤4 步骤4
给外壳绘制图案

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

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

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

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

projectImage

【项目总结】

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

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

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

【相关资源】

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

Makelog作者原创文章,未经授权禁止转载。
1
1
评论
[[c.user_name]] [[c.create_time]]
[[c.parent_comment.count]]
[[c.comment_content]]