Olá pessoal,
Não tenho habilidade para programar em arduino, porém, estou fazendo um projeto que será necessário um arduino (UNO ou outro) para executar umas tarefas.
Bom, estudei um pouco com funciona o arduino e explicarei com será a rotina do meu projeto.
(caso não seja possivel com esse arduino Uno) qual devo usar?)
Por favor, se puderem me ajudar com a programação, ficaria muito agradecido.
Aperta botão = pino 2 (3ª vez)
Liga rele = pino 4
Liga motor de passo 1 = Pino 6
Pino 7
Pino 8
Pino 9
Durante 5s sentido horário 1/4 de volta
Depois de 10s,
Liga motor de passo 2 = Pino 10
Pino 11
Pino 12
Pino 13
Durante 5s sentido horário 1/4 de volta
Depois de 5s,
Liga motor de passo 2 = Pino 10
Pino 11
Pino 12
Pino 13
Durante 5s sentido anti-horário 1/4 de volta
Depois,
Liga rele = pino 3
Durante 5s
E pausa o processo.
Aperta botão = pino 2 (4ª vez)
Liga rele = pino 4
Liga rele = pino 5
Depois de 10s,
Liga motor de passo 2 = Pino 10
Pino 11
Pino 12
Pino 13
Durante 5s sentido horário 1/4 de volta
Depois de 20s,
Desliga rele = pino 4
Desliga rele = pino 5
Liga motor de passo 1 = Pino 10
Pino 11
Pino 12
Pino 13
Durante 5s sentido anti-horário 1/4 de volta
Liga motor de passo 2 = Pino 10
Pino 11
Pino 12
Pino 13
Durante 5s sentido anti-horário 1/4 de volta
Acho que aqui toda a gente tem trabalhos e não estamos para trabalhar de borla... por outro lado o intuito do Arduino é aprender e quando dizes que não tens habilidade, estás numa altura ideal para ganhar a mesma.
Todos aqui estão dispostos para te ajudar. Eu acredito muito mais em ensinar-te a caçar e pescar do que fazê-lo por ti então se quiseres estou disposto para te ajudar a resolver isto, passo a passo, sem nunca fazer tudo por ti.
Vamos pelo início, tens teclas logo tens de ver como "ler" o valor na entrada.
Para isso vais ter de usar o digitalRead(). Pesquisa o que sai dessa função e para testares esse conhecimento, lê sobre o digitalWrite() e faz um programa que transfere o valor da tecla para o led do Arduino. Só isso, nada mais.
Depois disto vais ter de aprender sobre encravamentos (ou latches em inglês) e detecção de flanco. Mas começa com encravamentos onde um pino liga o led e o outro desliga o led, mantendo-o ligado entre estes dois eventos. Aqui vais apenas de ter de usar uma variável global para guardar o estado do led.
Depois vais precisar de controlar o motor de passo. Vais precisar de incluir uma biblioteca chamada Stepper. Existem exemplos online que mostram como usar a biblioteca... Aqui, usa o código que criaste em cima para ligar o Led e fazer o motor rodar numa direcção.
Quando chegares a este ponto, eu dou-te mais umas dicas para construires a rotina que tens já que aí sim entras em coisas mais complexas que precisam de mais explicação.
Peço desculpas pelo mau entendido. Na verdade tentei resolver sozinho sim. E tenho um projeto que decidi usar o arduíno. E desde junho tenho tentado fazer com ajuda de algumas pessoas, assim com você. Confesso que estou tendo dificuldade e meu tempo é curto para apresentar o projeto. Respeito de verdade sua opinião. E de forma alguma. Estou tirando proveito da situação.
#include <Stepper.h>
int flag = 0;
const int BOTAO = 2;
const int RELE1 = 5;
const int RELE2 = 4;
const int RELE3 = 3;
const int VOLTAS = 200;
Stepper MOTOR1(VOLTAS, 6 , 7, 8, 9);
Stepper MOTOR2(VOLTAS, 10, 11, 12, 13);
void setup()
{
pinMode(RELE1, OUTPUT); //Rele 1 como saida - liga bomba de entrada do reservatorio simula agua economizada
pinMode(RELE2, OUTPUT); //Rele 2 como saida - liga bomba de saida do chuveiro
pinMode(RELE3, OUTPUT); //Rele 3 como saida - liga bomba de saida do reservatorio simula agua economizada
pinMode(BOTAO, INPUT_PULLUP); //Botão de acionamento
Serial.begin(9600);
MOTOR1.setSpeed(VOLTAS); //velocidade do motor
MOTOR2.setSpeed(VOLTAS);
}
void loop()
{
if (flag == 0){
Serial.print("APERTE O BOTAO\n");
flag = 10;
}
//Apertou a PRIMEIRA vez o botão
if((digitalRead(BOTAO) == LOW) && (flag == 10))
{
delay(1000);
Serial.print("Apertou 1a vez.\n Aciona Rele 2\n");
//Aciona Rele 2
digitalWrite(RELE2, LOW);
flag = 11;
}
//Apertou a SEGUNDA vez o botão
if((digitalRead(BOTAO) == LOW) && (flag == 11))
{
delay(1000);
Serial.print("Apertou 2a vez.\n Desliga Rele 2\n");
//Desliga Rele 2
digitalWrite(RELE2, HIGH);
flag = 1;
}
//Apertou a TERCEIRA vez o botão, entra na rotina 1
if((digitalRead(BOTAO) == LOW) && (flag == 1))
{ //ROTINA 1
Serial.print("Apertou 3a vez.\n\n");
delay(1000); //delay para evitar entrar varias vezes na rotina
Serial.print("Aciona Rele 1 (Motor)\n");
//Aciona Rele 1 (Motor)
digitalWrite(RELE1, LOW);
Serial.print("Aciona Motor de Passo 1 - Vai\n");
//Aciona Motor de Passo 1 - Vai
MOTOR1.step(VOLTAS);
//Delay de 5 segundos
Serial.print("Delay de 5 segundos\n");
delay(1000);
//Aciona Motor de Passo 2 - Vai
Serial.print("Aciona Motor de Passo 2 - Vai\n");
MOTOR2.step(VOLTAS);
//Delay de 5 segundos
Serial.print("Delay de 5 segundos\n");
delay(1000);
//Aciona Motor de Passo 2 - Volta
Serial.print("Aciona Motor de Passo 2 - Volta\n");
MOTOR2.step(-VOLTAS);
//Aciona Rele 2 (Chuveiro)
Serial.print("Aciona Rele 2 e 3.\n");
digitalWrite(RELE1, HIGH);
digitalWrite(RELE2, LOW);
digitalWrite(RELE3, LOW);
Serial.print("Volta Motor de Passo 1 - Volta\n");
//Aciona Motor de Passo 1 - Volta
MOTOR1.step(-VOLTAS);
//Apaga Rele 2 e 3
Serial.print("Apaga Rele 2 e 3\n");
digitalWrite(RELE2, HIGH);
digitalWrite(RELE3, HIGH);
delay(1000);
//Muda a flag psra entrar na outra rotina quando apertar novamente o botao.
Serial.print("Flag = 2\n");
flag = 2;
}
//Aperta a QUARTA vez o botáo
if((digitalRead(BOTAO) == LOW) && (flag == 2))
{
Serial.print("Apertou 4a vez.\n");
delay(1000);
//Aciona Rele 2 (Chuveiro)
Serial.print("Aciona Rele 2\n");
digitalWrite(RELE2, LOW);
Serial.print("Aciona Motor de Passo 1 - Vai\n");
//Aciona Motor de Passo 1 - Vai
MOTOR1.step(VOLTAS);
delay(1000);
Serial.print("Volta Motor de Passo 1 - Volta\n");
//Aciona Motor de Passo 1 - Volta
MOTOR1.step(-VOLTAS);
//Apaga Rele 2 (Chuveiro)
Serial.print("Apaga Rele 2\n");
digitalWrite(RELE2, HIGH);
Serial.print("Flag = 1\n");
flag = 0;
}
Na boa. Na realidade não estás assim tão longe da solução final e acho que o que te falta é um pouco de conhecimento chamado de "máquina de estados" que é o que te falta para terminares o projecto.
Então, uma máquina de estados é um pedaço de código que apenas executa código relativo a um estado em especifico. A implementação é algo deste género:
unsigned int Estado = 0;
#define PARADO 0
#define PASSO1 10
#define PASSO2 20 //aumenta de 10 em 10 porque se precisares de adicionar um passo pelo meio, podes usar o 15, 25, etc... sem mudar o teu código.
#define PASSO3 30 // podes dar o nome que quiseres aos passos e é até boa ideia fazê-lo.
void loop() {
//esta instrução compara a variável com vários valores.
switch (Estado) {
case PARADO:
if(digitalRead(BOTAO) == LOW) { //apertaram o botão pela primeira vez.
digitalWrite(RELE2, LOW);
Estado = PASSO1;
}
break; //isto faz com que a instrução salte fora e tem sempre de ser colocado.
case PASSO1:
if(digitalRead(BOTAO) == LOW) { //apertaram o botão pela segunda vez.
digitalWrite(RELE2, HIGH);
Estado = PASSO2;
}
break;
case PASSO2:
break;
case PASSO3:
break;
}// fim do switch.
}
A tua implementação está muito próxima disto, mas torna-se confusa. Desta forma é mais simples de o fazer e agregar a lógica que pretendes executar apenas num estado específico.
Agora o outro problema que tens é com a rotação do motor. Pelo que entendi tu queres assegurar uma velocidade ao dizeres isto "Durante 5s sentido horário 1/4 de volta".
A biblioteca Stepper tem um método chamado setSpeed (Stepper - Arduino Reference) que podes usar para garantir que os passos que pretendes demoram os 5 segundos a ser realizados.
Experimenta essa funcionalidade da velocidade a ver se resolve o teu problema.
Mais uma vez, a tua implementação não está de todo errada, mas da maneira que mostrei em cima torna-se muito mais claro o que está e deve acontecer. O mecanismo é exactamente igual ao que tinhas, mas "montado" de forma diferente.