Servo 360 - Ds04-nfc - Projeto Alimentador Pet

Prezados,

Bom dia, sou novo no mundo do Arduino, tenho pesquisado muitos códigos para fazer um alimentador automático para os meus pets usando o servo Ds04-nfc de 360. Porem estou com um grande problema em fazer o servo rotacionar por 10s e parar por 2hs. O código abaixo foi o que peguei nestas consultas que fiz, o que acontece atualmente e que o servo ou fica girando sem fim ou fica no vai e vem.

Codigo 1: Fica rotacionando sem parar

        #include <Servo.h>
        Servo myservo;  
        int pos=0;    
      void setup() 
     {
        myservo.attach(9);
        Serial.begin(9600);
     }
        void loop() 
       {
         for (pos=0; pos<=180; pos=pos+1) 
      { 
        Serial.println("Anti-Horario");
        myservo.write(pos);
        Serial.println(pos);
        delay(15);            
     }
     for (pos=180; pos>=0; pos=pos-1) 
     { 
       myservo.write(pos);          
       Serial.println("Horario");
       Serial.println(pos);
       delay(15);
    }
}

Codigo 2: Ele fica no vai e vem direto nao para nunca.

      # include <Servo.h>
        Servo myservo;  
        int pos=0;    
        int voltas=0;
        void setup() 
       {
          myservo.attach(9);
          Serial.begin(9600);
       }
       void loop() 
      {
        for (pos=70; pos>=0; pos=pos-1) 
     { 
       Serial.println("Anti-Horario");
       myservo.write(pos);
       Serial.println(pos);
       delay(15);            
     }
     pos=70;
     voltas=voltas+1;
     Serial.println(voltas);
     if (voltas>10) { voltas = 0;
     delayMicroseconds(60000);
    }
}

A minha ideia e fazer ele rodar por 10s para liberar a racao, e depois ficar aguardando por 2hs para liberar novamente a racao, isso num loop infinito, pois deixarei ligado direto.

Se alguém puder me ajudar, agradeceria muito.


Olá,
por favor refaça seu tópico colocando o código ente tags </>.

Ajustado, como foi a primeira vez que postei, nao me atentei.

Olá,
veja se é isto que você precisa.

 //include <Servo.h>
 #include <Servo.h>
Servo myservo;
int pos = 180;
int voltas = 0;
unsigned long rodando;  //  1000 * 10;   // Tempo rodando
unsigned long parado;   //  1000 * 60 * 60 * 2;   // Tempo rodando
//-------------------------------------------------
void setup()
{
  Serial.begin(9600);
  myservo.attach(9);
  rodando = millis();
}
//-------------------------------------------------
void loop()
{
  Serial.println("Anti-Horario");
  //while (millis() - rodando < 10 * 1000);    // 10 seg
    while (millis() - rodando < 10 * 1000)   // 10 seg
  //while (millis() - rodando < 1000);  // Teste
  {
    Serial.println(180);
    delay(15);
  }
  Serial.println("Parado");
  parado = millis();
  //while (millis() - parado < 1000 * 60 * 60 * 2);    // 2 Horas
   while (millis() - parado < 1000 * 60 * 60 * 2)    // 2 Horas
  //while (millis() - parado < 1000 );   // teste
  {
    Serial.println(0);
    myservo.write(0);
    delay(15);
  }
  rodando = millis();
}

Caro @ruilviana, você esqueceu de abrir o servo, e atente para o ";" entre o while e suas ações.

while (millis() - rodando < 10 * 1000) // ;    // 10 seg
  //while (millis() - rodando < 1000);  // Teste
  {
    Serial.println(180);
    myservo.write(180);
    delay(15);
  }

Saudações.

Obrigado pela observação.

Corrigi

Carreguei o codigo, porem ele ficou parado nao roda mais.

#include <Servo.h>
Servo myservo;
int pos = 180;
int voltas = 0;
unsigned long rodando;  //  1000 * 10;   // Tempo rodando
unsigned long parado;   //  1000 * 60 * 60 * 2;   // Tempo rodando

//-------------------------------------------------

void setup()
  {
  Serial.begin(9600);
  myservo.attach(9);
  rodando = millis();
  }
 //-------------------------------------------------
void loop()
  {
  Serial.println("Anti-Horario");
  //while (millis() - rodando < 10 * 1000);    // 10 seg
    while (millis() - rodando < 10 * 1000);   // 10 seg
  //while (millis() - rodando < 1000);  // Teste
  {
    Serial.println(180);
    delay(15);
  }
   Serial.println("Parado");
   parado = millis();
  //while (millis() - parado < 1000 * 60 * 60 * 2);    // 2 Horas
    while (millis() - parado < 1000 * 60 * 60 * 2);    // 2 Horas
  //while (millis() - parado < 1000 );   // teste
  {
    Serial.println(0);
    myservo.write(0);
    delay(15);
  }
  rodando = millis();
}

Por que você adicionou o ";" removido por @ruilviana? O código deve ficar assim:

#include <Servo.h>
Servo myservo;
int pos = 180;
int voltas = 0;
unsigned long rodando;  //  1000 * 10;   // Tempo rodando
unsigned long parado;   //  1000 * 60 * 60 * 2;   // Tempo rodando
//-------------------------------------------------
void setup()
{
  Serial.begin(9600);
  myservo.attach(9);
  rodando = millis();
}
//-------------------------------------------------
void loop()
{
  Serial.println("Anti-Horario");
  while (millis() - rodando < 10 * 1000)   // 10 seg
    //while (millis() - rodando < 1000);  // Teste
  {
    Serial.println(180);
    myservo.write(180);
    delay(15);
  }
  Serial.println("Parado");
  parado = millis();
  while (millis() - parado < 1000 * 60 * 60 * 2)    // 2 Horas
    //while (millis() - parado < 1000 );   // teste
  {
    Serial.println(0);
    myservo.write(0);
    delay(15);
  }
  rodando = millis();
}

Try separate power supply for servo motor. Maybe it will work.

Carreguei o codigo, porem o comportamento é igual. Ele iniciou sentido horario (180) e depois ficou rodando direto no anti-horario.(0)

E assim continuará por duas horas, que é o que você queria que fizesse, e repetirá o ciclo. Altere o tempo no while para menores para teste.

Can you explain what you are trying to say?

But I am guessing that you are trying to ask how to that with your current materials.

This project is configured like this today.

I don't know how to configure this configuration you suggested.

O que achei estranho, foi que fiz um primeiro codigo que funcionou. Porem acho que apaguei e nao consigo mais fazer igual.

No meu primeiro codigo nao tinha o serialprint. Sera que isso pode estar influenciando? (Posso estar escrevendo besteira)

Eu alterei tambem a pos para 70. Para ficar rodando so anti-horario. Essa parte ficou ok.

Porem diminui o tempo coloquei 1 ao maximo e ele continua girando sem parar.

Desculpe, estávamos errados desde o início, é um servo 360 Ds04-nfc, é de rotação contínua e difícil de parar em um ângulo específico. Com o comando " myservo.write(0); " ele irá girar em uma direção , com o comando " myservo.write(180); " no outro e com " myservo.write(90); " ele deve parar. E é muito difícil pará-lo em um determinado ângulo. Você tem um servo normal de 180º ?

Consegui fazer funcionar do jeito que queria.

Veja abaixo o código que funcionou.

#include "Servo.h" // Inclui a Biblioteca Servo.h

Servo meuservo; // Cria o objeto servo para programação

int angulo = 0; // Ajusta o ângulo inicial do Servo

void setup() 
  {
   meuservo.attach(9); // Declara o pino do servo
  }

void loop() 
 {
   for (angulo = 15; angulo < 70; angulo += 15) 
      { // Executa movimentos no sentido anti-horário
           meuservo.write(angulo); // Altera sua velocidade de 15 em 15
           delay(2000); // Cada velocidade funciona por 2 segundos
      }
        meuservo.write(90); // Para o servo motor
        delay(60000); // Aguarda 60 segundos para continuar
 }

Quero agradecer a todos pela ajuda.