Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <Servo.h> // incluir a biblioteca servo
- Servo myServo;
- byte myServoPos = 90; // começa nos 90º
- byte myServoPin = 3; // servo no pin 3
- byte theButton = 2; // buttao no pin 2
- //--------------------------------------
- enum // enumeração para switch case
- {
- no_move_state, // estado parado
- from_90_to_0, // primeiro movimento
- from_0_to_90, // segundo movimento
- from_90_to_180, // terceiro movimento
- from_180_to_90 // quarto movimento
- }
- currentState = no_move_state; // estado atual sem movimento
- unsigned long currentMillis; // tempo atual
- unsigned long previousMillis; // tempo anterior
- int myServoInterval = 28; // 2500/90=27.8 = 2.5 segundos a dividir por 90 angulos -> 27.5 milles/angulo
- int flag = 0; // Controle de giro
- //--------------------------------------
- void setup()
- {
- Serial.begin(9600);
- pinMode (theButton, INPUT_PULLUP); // para evitar o estado de alta inpedancia
- myServo.attach(myServoPin); // associar pin 3 ao motor
- myServo.write(myServoPos); // motor vai para aposicao atual
- }
- //--------------------------------------
- void loop()
- {
- if (digitalRead(theButton) == LOW) // Se theButton foi pressionado
- {
- delay(30); // Debouncing
- if (digitalRead(theButton) == LOW) // Se theButton continua pressionado
- {
- flag = 1; // Permite giro do motor
- }
- }
- if (flag == 1) // Se permitiu giro, faca
- {
- switch (currentState) //Switch case function
- {
- case no_move_state: //case em que o motor esta parado
- currentState = from_90_to_0; //mover motor para de 90ºpara 0º
- break;
- case from_90_to_0: // caso em que o servo esta a 0º
- currentMillis = millis();
- if (currentMillis - previousMillis >= myServoInterval) //tempo atual - tempo previo é maior ou igual a velocidade do mutor
- {
- myServoPos = myServoPos - 1; // retirar 1 angulo a cada millie
- myServo.write(myServoPos); // mover servo para posicao atual = 0
- previousMillis = currentMillis; //fazer seter ao valor dos millies
- }
- if (myServoPos == 0) //se o servo esta na posicao 0º entao...
- {
- currentState = from_0_to_90; // mover servo pata 90º
- }
- break;
- case from_0_to_90:
- currentMillis = millis();
- if (currentMillis - previousMillis >= myServoInterval)
- {
- myServoPos = myServoPos + 1;
- myServo.write(myServoPos);
- previousMillis = currentMillis;
- }
- if (myServoPos == 90)
- {
- currentState = from_90_to_180;
- }
- break;
- case from_90_to_180:
- currentMillis = millis();
- if (currentMillis - previousMillis >= myServoInterval)
- {
- myServoPos = myServoPos + 1;
- myServo.write(myServoPos);
- previousMillis = currentMillis;
- }
- if (myServoPos == 180)
- {
- currentState = from_180_to_90;
- }
- break;
- case from_180_to_90 :
- currentMillis = millis();
- if (currentMillis - previousMillis >= myServoInterval)
- {
- myServoPos = myServoPos - 1;
- myServo.write(myServoPos);
- previousMillis = currentMillis;
- }
- if (myServoPos == 90)
- {
- currentState = no_move_state; // fazer reset
- flag = 0; // Bloqueia giro
- }
- break;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement