Estou fazendo um alimentador para meu gato e preciso de uma ajuda no codigo..

Como não vou utilizar RTC nem nada mais complexo.. O sistema vai funcionar basicamente com o delay entre o rotacionamento do Servo..

No meu codigo, o servo fica em 0° e a cada 30 minutos ele rotaciona para 180° onde permanece por meio segundo assim.. A intenção e ter sempre um pouco de comida.. Em pequenas quantidades..

No entanto, preciso tambem de uma chave que possa fazer o rotacionamento manual (independente do delay de 30 minutos)..

Segue meu codigo:

//Include da biblioteca do servo

#include <Servo.h>

Servo feeder; // Define Servo
int posicaoServo; //Posição em graus do servo
int ledPin; //Pino Led Status
int servoPin; //Pino Servo
int botaoPin; //Pino Alimentação Manual
int valorbotao=digitalRead(botaoPin);

void setup()
{
ledPin = 10; //Pino que fornece o status do alimentador
servoPin = 9; //Pino que faz a comunicação com o servo
botaoPin = 2; //Pino que faz o acionamento manual
posicaoServo = 0; //Posição inicial do Servo (BOCA PARA CIMA)
feeder.attach(servoPin);
feeder.write(0); // Define que o servo em toda inicialização fique com a boca para cima
pinMode(ledPin, OUTPUT); // Define Pino de Led como saida
pinMode(botaoPin, INPUT); //Defino Pino de Botão como entrada
}

void loop()
{

////////////// ACREDITO AQUI DEVO COLOCAR ALGUMA CONDIÇÃO PARA ROTACIONAR O SERVO SEM INTERROMPER O QUE SEGUE..

digitalWrite(ledPin, HIGH);
delay(5000);
digitalWrite(ledPin, LOW);
//Define que o led de stauts permaneca acesso por 5 segundos, indicando a alimentação

delay(1000);
//Define que apos o led de status apagar, 1 segundo depois ocorre a alimentação

feeder.write(170); //Rotaciona o servo 170 - BOCA PARA BAIXO
delay(500); //Depois de virado para baixo, aguarda meio segundo e volta a posição original.
feeder.write(0); //Voltando a posição original 0

delay(1800000L); //Reinicia o alimentador (inicia novamente o loop). //1000x60x30=1800000

Feliz Pascoa Galera, aguardo ajuda! 

Exibições: 624

Responder esta

Respostas a este tópico

Recomendo ao invés de usar a função delay() usar como no exemplo BlinkWithoutDelay http://arduino.cc/en/Tutorial/BlinkWithoutDelay

Assim vc faz a contagem de tempo para o servo, e não "trava" o programa para assim poder fazer a leitura do botão manual a qualquer momento.

No caso, não consigo usar o botão com o delay ? 

Quando vc coloca o delay, o programa pára e fica esperando o tempo do delay, e nesse momento o seu sistema está congelado, não há como efetuar leitura de botões e/ou sensores. Enquanto não terminar o delay, ele não executa nada.

Usando sem o delay, que vc vai apenas trabalhar com variáveis, o sistema fica rodando o tempo inteiro, mas só executa o que quiser quando cair no IF da condição de tempo... E enquanto isso, continua rodando normalmente, efetuando a leitura de botões e sensores.

É bastante simples, e no seu fonte aí que postou, pode substituir somente o último delay, que é oq congela por muito tempo, os demais, pode deixar.

A legal.. Pensei aqui comigo e é mais fácil eu deixar esse codigo que esta rodando aqui em modo de teste e quando eu quiser esse acionamento manual é só eu usar o reset do arduino.. ele vai recomeçar a contagem e liberar o servo! Mais valeu de qualquer forma

Minha sugestão >

Coloque um sensor (uma chave, sensor magnetico) para confirmar que o alimentador esta funcionando corretamente.

Se ele travar, apita um alarme....

Então Jose, eu pensei que seria necessario eu utilizar um sensor pois meu plano inicial era usar um motor dc.. Mais acabei optando pelo servo 1.5kg justamente por ele retornar sempre para a mesma posição.. Tenho o desenho do projeto apenas mental por enquanto.. Quanto eu terminar eu posto aqui para vocês verem..

De qualquer forma, obrigado pela contribuição

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço