Skip to the content.

Welcome to the Electric Flower Code

#include <Servo.h>
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

Servo myservo;  // create servo object to control a servo
#define servoPin 35 //~
#define pushButtonPin 8 
#define pushButton2Pin 9
#define pushButton3Pin 10 
#define resetButtonPin 11
#define SERVOMIN  135 // this is the 'minimum' pulse length count (out of 4096)
#define SERVOMAX  660 


 uint8_t servonum = 0;
const unsigned int TRIG_PIN=2;//trigger pin attached to digital pin 13
const unsigned int ECHO_PIN=3;//echo pin attached to digital pin 12
const int TOUCH_SENSOR_PIN = 4;
int soundData = analogRead(A1);
int angle =110;    // initial angle  for servo (beteen 1 and 179)
int angleStep =2;
const int minAngle = 0;
const int maxAngle = 40;
int lastTouchState;    // the previous state of touch sensor
int currentTouchState; // the current state of touch sensor

const int type =1;//watch video for details. Link is at the top of this code (robojax)

int buttonPushed =0;
int buttonPushed2 =0;
int resetButton =0;
int buttonPushed3 =0;

int angleToPulse(int ang){
   int pulse = map(ang,0, 180, SERVOMIN,SERVOMAX);// map angle of 0 to 180 to Servo min and Servo max 

   return pulse;
}

void setup() {
   pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);

  Serial.begin(9600);          //  setup serial
  myservo.attach(servoPin);  // attaches the servo on pin 3 to the servo object
  pinMode(pushButtonPin,INPUT_PULLUP);
  pinMode(pushButton2Pin,INPUT_PULLUP);
  pinMode(pushButton3Pin,INPUT_PULLUP);
  pinMode(resetButtonPin,INPUT_PULLUP);
    pinMode(TOUCH_SENSOR_PIN, INPUT);
   Serial.println("Welcome to The Electrically Engineered Flower.");

     pwm.begin();
  
  pwm.setPWMFreq(60);
  
          pwm.setPWM(0, 0, angleToPulse(angle) );
          pwm.setPWM(1, 0, angleToPulse(angle) );
          pwm.setPWM(2, 0, angleToPulse(angle) );
          pwm.setPWM(3, 0, angleToPulse(angle) );
          pwm.setPWM(4, 0, angleToPulse(angle) );
          pwm.setPWM(5, 0, angleToPulse(angle) );
          pwm.setPWM(6, 0, angleToPulse(angle) );
          pwm.setPWM(7, 0, angleToPulse(angle) );

     currentTouchState = digitalRead(TOUCH_SENSOR_PIN);



}



void loop() {
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);

  const unsigned long duration= pulseIn(ECHO_PIN, HIGH);
 int distance= duration * 0.017;

 
  if(digitalRead(pushButtonPin) == LOW){
    buttonPushed = 1;
    
  }

  if(digitalRead(pushButton2Pin) == LOW){
    buttonPushed2 = 1;
    
  }
  
  if(digitalRead(pushButton3Pin) == LOW){
    buttonPushed3 = 1;
    
  }
  
  if(digitalRead(resetButtonPin) == LOW){
    resetButton = 1;
    
  }
  
   if( buttonPushed ){
    Serial.println("Mode1");
  // change the angle for next time through the loop:
  angle = angle - angleStep;
  delay(100);


    // reverse the direction of the moving at the ends of the angle:
    if (angle <= maxAngle) {
      angle = 40;
      }

     pwm.setPWM(0, 0, angleToPulse(angle) );
          pwm.setPWM(1, 0, angleToPulse(angle) );
          pwm.setPWM(2, 0, angleToPulse(angle) );
          pwm.setPWM(3, 0, angleToPulse(angle) );
          pwm.setPWM(4, 0, angleToPulse(angle) );
          pwm.setPWM(5, 0, angleToPulse(angle) );
          pwm.setPWM(6, 0, angleToPulse(angle) );
          pwm.setPWM(7, 0, angleToPulse(angle) );

           lastTouchState    = currentTouchState;             // save the last state
  currentTouchState = digitalRead(TOUCH_SENSOR_PIN);

  if(lastTouchState == LOW && currentTouchState == HIGH) {
    Serial.println("The sensor is touched");
        angle = 110;
    

        buttonPushed = 0;
     pwm.setPWM(0, 0, angleToPulse(angle) );
          pwm.setPWM(1, 0, angleToPulse(angle) );
          pwm.setPWM(2, 0, angleToPulse(angle) );
          pwm.setPWM(3, 0, angleToPulse(angle) );
          pwm.setPWM(4, 0, angleToPulse(angle) );
          pwm.setPWM(5, 0, angleToPulse(angle) );
          pwm.setPWM(6, 0, angleToPulse(angle) );
          pwm.setPWM(7, 0, angleToPulse(angle) );
      Serial.print("Moved to: ");
      Serial.print(angle);   // print the angle
      Serial.println(" degree");

   }
   
  }

   if(buttonPushed2){
   int angle = analogRead(A0);

Serial.println(angle);

// map the light readings to the angle possible by the servo motor 

angle = map (angle, 70, 400, 110, 40);
delay(1000);

// control the servo motor based on the light value read, adjust linearly by angles 

     pwm.setPWM(0, 0, angleToPulse(angle) );
          pwm.setPWM(1, 0, angleToPulse(angle) );
          pwm.setPWM(2, 0, angleToPulse(angle) );
          pwm.setPWM(3, 0, angleToPulse(angle) );
          pwm.setPWM(4, 0, angleToPulse(angle) );
          pwm.setPWM(5, 0, angleToPulse(angle) );
          pwm.setPWM(6, 0, angleToPulse(angle) );
          pwm.setPWM(7, 0, angleToPulse(angle) );
      Serial.print("Moved to: ");
      Serial.print(angle);   // print the angle
      Serial.println(" degree");
  delay(100); // waits for the servo to get there

  
   }

   if(buttonPushed3){

    
    Serial.print("distance to nearest object:");
      Serial.println(distance);
      Serial.println(" cm");
       delay(10);

      
     if(distance < 120){
      angle = angle - 5;
           pwm.setPWM(0, 0, angleToPulse(angle) );
          pwm.setPWM(1, 0, angleToPulse(angle) );
          pwm.setPWM(2, 0, angleToPulse(angle) );
          pwm.setPWM(3, 0, angleToPulse(angle) );
          pwm.setPWM(4, 0, angleToPulse(angle) );
          pwm.setPWM(5, 0, angleToPulse(angle) );
          pwm.setPWM(6, 0, angleToPulse(angle) );
          pwm.setPWM(7, 0, angleToPulse(angle) );

   delay(100);
   if (angle <= 40) {
      angle = 40;
      }

 } 
 if (distance > 120){
  angle = angle + 5;
     pwm.setPWM(0, 0, angleToPulse(  angle  ) );
          pwm.setPWM(1, 0, angleToPulse(  angle  ) );
          pwm.setPWM(2, 0, angleToPulse(  angle  ) );
          pwm.setPWM(3, 0, angleToPulse(  angle  ) );
          pwm.setPWM(4, 0, angleToPulse(  angle  ) );
          pwm.setPWM(5, 0, angleToPulse(  angle  ));
          pwm.setPWM(6, 0, angleToPulse(  angle  ) );
          pwm.setPWM(7, 0, angleToPulse(angle) );

  delay(100);
   if (angle >= 110) {
      angle = 110;
      }
 }

      Serial.print("Moved to: ");
      Serial.print(angle);   // print the angle
      Serial.println(" degree");
  delay(100);
  
   }

   if(resetButton){

    
           lastTouchState    = currentTouchState;             // save the last state
  currentTouchState = digitalRead(TOUCH_SENSOR_PIN);
 
    angle = 110;
    buttonPushed = 0;
    buttonPushed2 = 0;
    resetButton = 0;
    buttonPushed3 = 0;

            pwm.setPWM(0, 0, angleToPulse(110) );
          pwm.setPWM(1, 0, angleToPulse(110) );
          pwm.setPWM(2, 0, angleToPulse(110) );
          pwm.setPWM(3, 0, angleToPulse(110) );
          pwm.setPWM(4, 0, angleToPulse(110) );
          pwm.setPWM(5, 0, angleToPulse(110) );
          pwm.setPWM(6, 0, angleToPulse(110) );
          pwm.setPWM(7, 0, angleToPulse(110) );
   Serial.println("Welcome to The Electrically Engineered Flower.");    
  
    }
   }