Arduino Password Unlock with 3D Gesture Sensor DFROBOT





SPECIFICATION

  • Operating Voltage: 3.3 - 5V
  • Interface Type: I2C
  • I2C Address: 0x42
  • Gesture Detection Range: 5cm
  • Distance Induction Range: 10cm
  • Dimensions : 72 x 54 mm / 2.83 x 2.12"
  • Operating Temperature: - 20 ℃ ~ + 85 ℃
  • Spatial Resolution: 150 dpi

Arduino Library

https://github.com/DFRobot/DFRobot_Gesture


Arduino Sketch


#include <DFRobot_Gesture.h>
#include <Wire.h>
#include "U8glib.h"


U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0); // I2C / TWI

int testPin= 7;
unsigned char cmd;

const char idle    = 0;
const char inputID = 1;
const char checkID = 2;
const char unlock  = 3;
// current id
const int cid0 = 9;
const int cid1 = 3;
const int cid2 = 5;


char currentState = idle;
uint8_t id0 = 5;
uint8_t id1 = 5;
uint8_t id2 = 5;

uint8_t currentID = 0;
unsigned long previousMillis = 0;
bool isFlip = false;

DFRobot_Gesture myGesture;

void setup()
{
  // assign default color value
  if ( u8g.getMode() == U8G_MODE_R3G3B2 ) {
    u8g.setColorIndex(255);     // white
  }
  else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) {
    u8g.setColorIndex(3);         // max intensity
  }
  else if ( u8g.getMode() == U8G_MODE_BW ) {
    u8g.setColorIndex(1);         // pixel on
  }
  else if ( u8g.getMode() == U8G_MODE_HICOLOR ) {
    u8g.setHiColorByRGB(255,255,255);
  }
  Wire.begin();        // join i2c bus (address optional for master)
  Serial.begin(9600);  // start serial for output
  pinMode(testPin, INPUT);  
  Serial.write("3D Gesture sensor is now running....\r\n");  
}


void loop()
{

  if(digitalRead(testPin)==0)
  {
     
   myGesture.I2C1_MasterRead(md.buf,26,0x42); //The address is:0x42
   cmd = myGesture.mgcProcMsg();     //process the message
          if(cmd != GI_NOGESTURE )
            {

              if( currentState == idle ){
                  if( cmd == GI_FLICK_R || cmd == GI_FLICK_L ){
                     currentState = inputID;
                     
                  }
              }
              else if( currentState == inputID){
                  if( cmd == GI_FLICK_R || cmd == GI_FLICK_L ){
                     currentID++;
                     if( currentID >= 3 ){
                         processCheckID(); 
                     }
                  }
                  else if( cmd == GI_FLICK_D || cmd == GI_FLICK_U ){
                       currentID--;
                       if( currentID < 0) currentID =0;
                  }
              }

              
                switch(cmd)
                {
                 
                    case GI_FLICK_R:
                      Serial.println("RIGHT");
                        break;

                    case GI_FLICK_L:
                        Serial.println("LEFT");
                        break;

                    case GI_FLICK_D:
                     Serial.println("DOWN");
                        break;

                    case GI_FLICK_U:
                       Serial.println("UP");
                        break;
                    case GI_AIRWHEEL_CW://Clockwise in circles
                     Serial.println("CW");
                        processCW();
                        break;

                    case GI_AIRWHEEL_CCW://Counterclockwise circles
                       Serial.println("CCW");
                       processCCW();
                        break;

                    default: break;
                }
            }
  }
  
 else  {};

 // picture loop
  u8g.firstPage(); 
  do {
    draw();
  } while( u8g.nextPage() );

}

void draw(void) {
    unsigned long currentMillis = millis();
  // graphic commands to redraw the complete screen should be placed here 
    u8g.setFont(u8g_font_helvB12);
  //u8g.setFont(u8g_font_osb21);
  
 switch( currentState ){
  case idle:
         
         u8g.drawStr( 0, 22, "Door Lock");
         break;
  case inputID:
         
         processInputID();
         break;  
  
  case  unlock:

         if ( (currentMillis - previousMillis >= 1000)  ) {
    
              previousMillis = currentMillis;
              isFlip = !isFlip;
         }

         if( isFlip){
             u8g.drawStr( 0, 15, "*** DOOR");
             u8g.drawStr( 0, 35, "*** UNLOCK");
         }
         
        break;               
 }
}
void processInputID(){
     char buf[3];
     int x = 0;   
     u8g.drawStr( 0, 15, "Input ID");
     u8g.setFont(u8g_font_fub30);
     if( currentID == 0){
       
       sprintf(buf, "%d",id0);
       u8g.drawStr( x, 55, buf);
     }

    else if( currentID == 1){
      
       sprintf(buf, "%d",id0);
       u8g.drawStr( x, 55, buf);

       
       sprintf(buf, "%d",id1);
       u8g.drawStr( x+30, 55, buf);
     }
   else if( currentID == 2){
      
       sprintf(buf, "%d",id0);
       u8g.drawStr( x, 55, buf);

       
       sprintf(buf, "%d",id1);
       u8g.drawStr( x+30, 55, buf);

       sprintf(buf, "%d",id2);
       u8g.drawStr( x+60, 55, buf);
     } 
  
     

      

     
}
void processCW(){

     if( currentState == inputID ){
      
         if( currentID == 0 ){
          id0++;
          if( id0 > 9)id0 = 0;
         }
        else if( currentID == 1 ){
          id1++;
          if( id1 > 9)id1 = 0;
         }
       else if( currentID == 2 ){
          id2++;
          if( id2 > 9)id2 = 0;
         } 
       
     }
    
}
void processCCW(){
  
    if( currentState == inputID ){
      
        if( currentID == 0 ){
          id0--;
          if( id0 < 0)id0 = 9;
        }
        else if( currentID == 1 ){
          id1--;
          if( id1 < 0)id1 = 9;
        }
        else if( currentID == 2 ){
          id2--;
          if( id2 < 0)id2 = 9;
        }
        
        
          
     }
}
void  processCheckID(){
  
    if( (id0 == cid0) && (id1 == cid1) && (id2 == cid2)  ){
         currentState = unlock;
      
    }
    else{
        currentState = idle;
         currentID = 0;
        id0 = 5;
         id1 = 5;
        id2 = 5;
    }
  
}

ความคิดเห็น