/* Include the HCPCA9685 library */ #include "HCPCA9685.h" /* I2C slave address for the device/module. For the HCMODU0097 the default I2C address   is 0x40 */ #define  I2CAdd 0x40 /* Create an instance of the library */ HCPCA9685 HCPCA9685(I2CAdd); int offset = 20; //change this number to alter the OPEN/CLOSE speed. int wave = 100; // change this number to alter the speed of the WAVE/RIPPLE motion. int slowspeed = 10; //change this number to alter the SLOW OPEN/CLOSE SPEED unsigned int Pos; const int buttonPin2 = 2;     // the number of the pushbutton pin const int buttonPin3 = 3;     // the number of the pushbutton pin const int buttonPin4 = 4;     // the number of the pushbutton pin int UP = 320; // Change this number to alter the upright pos of the blades. The higher number the more upright the blades. int FLAT = 185; // Change this number to alter the lie down pos of the blades. The lower the number the more flat the blades will lie. int buttonstate2 = LOW; //this controls fast up/down movement int buttonstate3 = LOW; //slow open/close movement int buttonstate4 = LOW; //wave movement int buttonPushCounter = 0;   // counter for the number of button presses int buttonState = 0;         // current state of the button int lastButtonState = 0;     // previous state of the button long lastDebounceTime = 0; long debounceDelay = 50; void setup() {  /* Initialise the library and set it to 'servo mode' */  HCPCA9685.Init(SERVO_MODE);  /* Wake the device up */  HCPCA9685.Sleep(false);  //lie all blades flat.  HCPCA9685.Servo(0, FLAT);  delay(offset);  HCPCA9685.Servo(1, FLAT);  delay(offset);  HCPCA9685.Servo(2, FLAT);  delay(offset);  HCPCA9685.Servo(3, FLAT);  delay(offset);  HCPCA9685.Servo(4, FLAT);  delay(offset);  HCPCA9685.Servo(5, FLAT);  delay(offset);  HCPCA9685.Servo(6, FLAT);  delay(offset);  HCPCA9685.Servo(7, FLAT);  delay(offset);  HCPCA9685.Servo(8, FLAT);  delay(offset);  HCPCA9685.Servo(9, FLAT);  delay(offset);  HCPCA9685.Servo(10, FLAT);  delay(offset);  HCPCA9685.Servo(11, FLAT);  delay(offset);  HCPCA9685.Servo(12, FLAT);  delay(offset);  HCPCA9685.Servo(13, FLAT);  delay(offset);  HCPCA9685.Servo(14, FLAT); } void loop() {  buttonstate2 = digitalRead(buttonPin2);  buttonstate3 = digitalRead(buttonPin3);  buttonstate4 = digitalRead(buttonPin4);  // compare the buttonState to its previous state  // if the state has changed, increment the counter  if ( (millis() - lastDebounceTime) > debounceDelay) {    //UP / DOWN CONTROL    if ( (buttonstate2 == HIGH) ) {      buttonPushCounter++;      if (buttonstate2 != lastButtonState) {        HCPCA9685.Servo(0, FLAT);        delay(offset);        HCPCA9685.Servo(1, FLAT);        delay(offset);        HCPCA9685.Servo(2, FLAT);        delay(offset);        HCPCA9685.Servo(3, FLAT);        delay(offset);        HCPCA9685.Servo(4, FLAT);        delay(offset);        HCPCA9685.Servo(5, FLAT);        delay(offset);        HCPCA9685.Servo(6, FLAT);        delay(offset);        HCPCA9685.Servo(7, FLAT);        delay(offset);        HCPCA9685.Servo(8, FLAT);        delay(offset);        HCPCA9685.Servo(9, FLAT);        delay(offset);        HCPCA9685.Servo(10, FLAT);        delay(offset);        HCPCA9685.Servo(11, FLAT);        delay(offset);        HCPCA9685.Servo(12, FLAT);        delay(offset);        HCPCA9685.Servo(13, FLAT);        delay(offset);        HCPCA9685.Servo(14, FLAT);        lastDebounceTime = millis(); //set the current time      }      else {        HCPCA9685.Servo(14, UP);        delay(offset);        HCPCA9685.Servo(13, UP);        delay(offset);        HCPCA9685.Servo(12, UP);        delay(offset);        HCPCA9685.Servo(11, UP);        delay(offset);        HCPCA9685.Servo(10, UP);        delay(offset);        HCPCA9685.Servo(9, UP);        delay(offset);        HCPCA9685.Servo(8, UP);        delay(offset);        HCPCA9685.Servo(7, UP);        delay(offset);        HCPCA9685.Servo(6, UP);        delay(offset);        HCPCA9685.Servo(5, UP);        delay(offset);        HCPCA9685.Servo(4, UP);        delay(offset);        HCPCA9685.Servo(3, UP);        delay(offset);        HCPCA9685.Servo(2, UP);        delay(offset);        HCPCA9685.Servo(1, UP);        delay(offset);        HCPCA9685.Servo(0, UP);        delay(offset);        lastDebounceTime = millis(); //set the current time      }    }    lastButtonState = buttonstate2;            if ( (millis() - lastDebounceTime) > debounceDelay) {      //SLOW OPEN/CLOSE The blades all open slowly to full extension then all return to the flat position.            if ( (buttonstate3 == HIGH) ) {        for (Pos = FLAT; Pos < UP; Pos++)        {          HCPCA9685.Servo(0, Pos);          HCPCA9685.Servo(1, Pos);          HCPCA9685.Servo(2, Pos);          HCPCA9685.Servo(3, Pos);          HCPCA9685.Servo(4, Pos);          HCPCA9685.Servo(5, Pos);          HCPCA9685.Servo(6, Pos);          HCPCA9685.Servo(7, Pos);          HCPCA9685.Servo(8, Pos);          HCPCA9685.Servo(9, Pos);          HCPCA9685.Servo(10, Pos);          HCPCA9685.Servo(11, Pos);          HCPCA9685.Servo(12, Pos);          HCPCA9685.Servo(13, Pos);          HCPCA9685.Servo(14, Pos);          delay(slowspeed);        }        for (Pos = UP; Pos >= FLAT; Pos--)        {          HCPCA9685.Servo(0, Pos);          HCPCA9685.Servo(1, Pos);          HCPCA9685.Servo(2, Pos);          HCPCA9685.Servo(3, Pos);          HCPCA9685.Servo(4, Pos);          HCPCA9685.Servo(5, Pos);          HCPCA9685.Servo(6, Pos);          HCPCA9685.Servo(7, Pos);          HCPCA9685.Servo(8, Pos);          HCPCA9685.Servo(9, Pos);          HCPCA9685.Servo(10, Pos);          HCPCA9685.Servo(11, Pos);          HCPCA9685.Servo(12, Pos);          HCPCA9685.Servo(13, Pos);          HCPCA9685.Servo(14, Pos);          delay(slowspeed);          lastDebounceTime = millis(); //set the current time        }      }    }    if ( (millis() - lastDebounceTime) > debounceDelay) {    //RIPPLE The blades open and close in a sequence that resembles a ripple from left to right.          if ( (buttonstate4 == HIGH) ) {        //all lie flat        HCPCA9685.Servo(0, FLAT);        delay(offset);        HCPCA9685.Servo(1, FLAT);        delay(offset);        HCPCA9685.Servo(2, FLAT);        delay(offset);        HCPCA9685.Servo(3, FLAT);        delay(offset);        HCPCA9685.Servo(4, FLAT);        delay(offset);        HCPCA9685.Servo(5, FLAT);        delay(offset);        HCPCA9685.Servo(6, FLAT);        delay(offset);        HCPCA9685.Servo(7, FLAT);        delay(offset);        HCPCA9685.Servo(8, FLAT);        delay(offset);        HCPCA9685.Servo(9, FLAT);        delay(offset);        HCPCA9685.Servo(10, FLAT);        delay(offset);        HCPCA9685.Servo(11, FLAT);        delay(offset);        HCPCA9685.Servo(12, FLAT);        delay(offset);        HCPCA9685.Servo(13, FLAT);        delay(offset);        HCPCA9685.Servo(14, FLAT);        //start wave        HCPCA9685.Servo(0, UP);        delay(wave);        HCPCA9685.Servo(1, UP);        delay(wave);        HCPCA9685.Servo(2, UP);        delay(wave);        HCPCA9685.Servo(3, UP);        HCPCA9685.Servo(0, FLAT);        delay(wave);        HCPCA9685.Servo(4, UP);        HCPCA9685.Servo(1, FLAT);        delay(wave);        HCPCA9685.Servo(5, UP);        HCPCA9685.Servo(2, FLAT);        delay(wave);        HCPCA9685.Servo(6, UP);        HCPCA9685.Servo(3, FLAT);        delay(wave);        HCPCA9685.Servo(7, UP);        HCPCA9685.Servo(4, FLAT);        delay(wave);        HCPCA9685.Servo(8, UP);        HCPCA9685.Servo(5, FLAT);        delay(wave);        HCPCA9685.Servo(9, UP);        HCPCA9685.Servo(6, FLAT);        delay(wave);        HCPCA9685.Servo(10, UP);        HCPCA9685.Servo(7, FLAT);        delay(wave);        HCPCA9685.Servo(11, UP);        HCPCA9685.Servo(8, FLAT);        delay(wave);        HCPCA9685.Servo(12, UP);        HCPCA9685.Servo(9, FLAT);        delay(wave);        HCPCA9685.Servo(13, UP);        HCPCA9685.Servo(10, FLAT);        delay(wave);        HCPCA9685.Servo(14, UP);        HCPCA9685.Servo(11, FLAT);        delay(wave);        HCPCA9685.Servo(12, FLAT);        delay(wave);        HCPCA9685.Servo(13, FLAT);        delay(wave);        HCPCA9685.Servo(14, FLAT);        //all lie flat        HCPCA9685.Servo(0, FLAT);        delay(offset);        HCPCA9685.Servo(1, FLAT);        delay(offset);        HCPCA9685.Servo(2, FLAT);        delay(offset);        HCPCA9685.Servo(3, FLAT);        delay(offset);        HCPCA9685.Servo(4, FLAT);        delay(offset);        HCPCA9685.Servo(5, FLAT);        delay(offset);        HCPCA9685.Servo(6, FLAT);        delay(offset);        HCPCA9685.Servo(7, FLAT);        delay(offset);        HCPCA9685.Servo(8, FLAT);        delay(offset);        HCPCA9685.Servo(9, FLAT);        delay(offset);        HCPCA9685.Servo(10, FLAT);        delay(offset);        HCPCA9685.Servo(11, FLAT);        delay(offset);        HCPCA9685.Servo(12, FLAT);        delay(offset);        HCPCA9685.Servo(13, FLAT);        delay(offset);        HCPCA9685.Servo(14, FLAT);        delay(10);        lastDebounceTime = millis(); //set the current time      }    }  } } [/code]