Holiday Notice: DFRobot team is on holiday from Sep 30th to Oct 8th. Orders placed during this time will be processed starting Oct 9th. Thank you for your patience.

PROJECTS Arduino

Gesture controlled home automation

DFRobot Feb 26 2020 261022

Project Maker: saswataphysics3

Using Arduino Uno/Nano and MPU6050 module you cane easily make gesture controlled home automation.

 

Things used in this project

Hardware components

Arduino Nano R3 ×1

Arduino UNO & Genuino UNO × 1

DFRobot 6 DOF Sensor - MPU6050 ×1

ControlEverything.com 4-CHANNEL RELAY CONTROLLER FOR I2C × 1

Breadboard (generic) ×1


Software apps and online services

Arduino IDE


Hand tools and fabrication machines

10 Pc. Jumper Wire Kit, 5 cm Long



 

Story

Necessary hard ware components:

1. ArduinoUNO/NANO

2.MPU6050

3.Relay module

4.Breadboard

5.Jumper wires

 

connections are shown in the image.

necessary library:

you can download from here

https://github.com/jrowberg/i2cdevlib to download I2Cdev library

https://github.com/ElectronicCats/mpu6050 to download mpu6050 library

 

software components

https://www.arduino.cc/en/Main/Software to download Arduino library

 

 

Custom parts and enclosures

Arduino Code

Upload this code

 

Schematics

Gesture controlled Home Automation

Controll your home appliance using gesture

 

 

Code

Gesture controlled Home Automation C/C++

Home automation

Download Code

#define SIMPLE_IMPLEMENTATION false const int frontLed = 3; const int bottomLed = 5; const int rightLed = 6; const int leftLed = 9; long int lastPrintTime; typedef struct {    byte pin;    byte positionInsideGroup;        char thePosition; // Left, Right, Up, Down    byte minAngle;    byte maxAngle;     } ledConfig; typedef struct {    byte maximumAcceptedMovement = 4;    unsigned int millisToConsiderStill = 3000;    byte firstActualAngle = 0;    unsigned long firstActualAngleMillis = 0; } axysStillness; axysStillness xAxys; ledConfig leds[] = {    {3, 1, 'u', 31, 45},      {12, 2, 'u', 16, 30},    {11, 3, 'u', 5, 15},      {5, 1, 'd', 5, 15},      {6, 2, 'd', 16, 30},    {7, 3, 'd', 31, 45},      {8 , 1, 'r', 5, 23},      {9, 2, 'r', 24, 45},    {10, 1, 'l', 5, 23},      {4, 2, 'l', 24, 45}, }; #include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE    #include "Wire.h" #endif MPU6050 mpu; bool dmpReady = false;  // set true if DMP init was successful uint8_t mpuIntStatus;   // holds actual interrupt status byte from MPU uint8_t devStatus;      // return status after each device operation (0 = success, !0 = error) uint16_t packetSize;    // expected DMP packet size (default is 42 bytes) uint16_t fifoCount;     // count of all bytes currently in FIFO uint8_t fifoBuffer[64]; // FIFO storage buffer // orientation/motion vars Quaternion q;           // [w, x, y, z]         quaternion container VectorInt16 aa;         // [x, y, z]            accel sensor measurements VectorInt16 aaReal;     // [x, y, z]            gravity-free accel sensor measurements VectorInt16 aaWorld;    // [x, y, z]            world-frame accel sensor measurements VectorFloat gravity;    // [x, y, z]            gravity vector float euler[3];         // [psi, theta, phi]    Euler angle container float ypr[3];           // [yaw, pitch, roll]   yaw/pitch/roll container and gravity vector volatile bool mpuInterrupt = false;     // indicates whether MPU interrupt pin has gone high void setup() {    #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE        Wire.begin();        TWBR = 24; // 400kHz I2C clock (200kHz if CPU is 8MHz)    #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE        Fastwire::setup(400, true);    #endif    Serial.begin(9600);    while (!Serial); // wait for Leonardo enumeration, others continue immediately    Serial.println(F("Initializing I2C devices..."));    mpu.initialize();    Serial.println(F("Testing device connections..."));    Serial.println(mpu.testConnection() ? F("MPU6050 connection successful") : F("MPU6050 connection failed"));    Serial.println(F("Initializing DMP..."));    devStatus = mpu.dmpInitialize();    mpu.setXGyroOffset(220);    mpu.setYGyroOffset(76);    mpu.setZGyroOffset(-85);    mpu.setZAccelOffset(1788); // 1688 factory default for my test chip    if (devStatus == 0) {        // turn on the DMP, now that it's ready        Serial.println(F("Enabling DMP..."));        mpu.setDMPEnabled(true);        Serial.println(F("Enabling interrupt detection (Arduino external interrupt 0)..."));        attachInterrupt(0, dmpDataReady, RISING);        mpuIntStatus = mpu.getIntStatus();        Serial.println(F("DMP ready! Waiting for first interrupt..."));        dmpReady = true;        packetSize = mpu.dmpGetFIFOPacketSize();    } else {        Serial.print(F("DMP Initialization failed (code "));        Serial.print(devStatus);        Serial.println(F(")"));    }    if (SIMPLE_IMPLEMENTATION) {        initializeLEDsSimple();    } else {        initializeLEDsMultiple();    }    lastPrintTime = millis();     } void updateStillness(byte angle, bool forceReset) {    if (abs(xAxys.firstActualAngle - angle) > xAxys.maximumAcceptedMovement || forceReset) {        xAxys.firstActualAngle = angle;        xAxys.firstActualAngleMillis = millis();      } } bool isAxysStill(byte angle) {    return millis() - xAxys.firstActualAngleMillis >= xAxys.millisToConsiderStill; } void loop() {    if (!dmpReady) return;    mpuInterrupt = false;    mpuIntStatus = mpu.getIntStatus();    fifoCount = mpu.getFIFOCount();    if ((mpuIntStatus & 0x10) || fifoCount == 1024) {        mpu.resetFIFO();        Serial.println(F("FIFO overflow!"));    } else if (mpuIntStatus & 0x02) {        while (fifoCount < packetSize) {          fifoCount = mpu.getFIFOCount();        }        mpu.getFIFOBytes(fifoBuffer, packetSize);                fifoCount -= packetSize;        mpu.dmpGetQuaternion(&q, fifoBuffer);        mpu.dmpGetGravity(&gravity, &q);        mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);        int x = ypr[0] * 180/M_PI;        int y = ypr[1] * 180/M_PI;        int z = ypr[2] * 180/M_PI;        //Serial.print(y);Serial.print("\t");Serial.println(z);          updateStillness(x, false);        if (isAxysStill(x)) {            Serial.println("axys still at");            Serial.println(x);            updateStillness(x, true);        }        if (SIMPLE_IMPLEMENTATION) {                    flashLEDsSimple(x, y, z);        } else {            flashLEDsMultiple(x, y, z);        }    } } void initializeLEDsSimple() {    pinMode(frontLed, OUTPUT);    pinMode(bottomLed, OUTPUT);        pinMode(rightLed, OUTPUT);    pinMode(leftLed, OUTPUT); } void initializeLEDsMultiple() {    for (int i=0; i<10; i++) {        Serial.println(leds[i].pin);        pinMode(leds[i].pin, OUTPUT);    }    delay(3000); } void flashLEDsSimple(int x, int y, int z) {    if (y > 0) {        analogWrite(rightLed, y*4);        analogWrite(leftLed, 0);              } else {        analogWrite(leftLed, y*4*-1);              analogWrite(rightLed, 0);          }    if (z > 0) {        analogWrite(bottomLed, z*4);        analogWrite(frontLed, 0);              } else {        analogWrite(frontLed, z*4*-1);              analogWrite(bottomLed, 0);          }     } void flashLEDsMultiple(int x, int y, int z) {    for (int i=0; i<10; i++) {        //Serial.print(z);Serial.print(",");Serial.print(leds[i].thePosition);Serial.print(",");Serial.println(leds[i].minAngle);        bool modified = false;        if (z < 0 && leds[i].thePosition == 'u' && abs(z) > leds[i].minAngle) {            digitalWrite(leds[i].pin, HIGH);            modified = true;        }        if (z > 0 && leds[i].thePosition == 'd' && abs(z) > leds[i].minAngle) {            digitalWrite(leds[i].pin, HIGH);            modified = true;        }        if (y < 0 && leds[i].thePosition == 'l' && abs(y) > leds[i].minAngle) {            digitalWrite(leds[i].pin, HIGH);            modified = true;        }        if (y > 0 && leds[i].thePosition == 'r' && abs(y) > leds[i].minAngle) {            digitalWrite(leds[i].pin, HIGH);            modified = true;        }        if (!modified) {            digitalWrite(leds[i].pin, LOW);        }    } } void dmpDataReady() {    mpuInterrupt = true; }