Galera, boa noite,

deu no na minha cabeça,

Estou fazendo um skecht onde irei acionar reles para substituir uma placa de lavadora de roupas.

O usuário quer apenas que:

Ao acionar o botão o ciclo começe (Antes disto, aproveitaremos o sensor de água e da porta).

o ciclo resume:

25 segundo motor ligado para direita (baixa velocidade) // rele1

10 segundo desliga;

25 segundos motor ligado para a esquerda (baixa velocidade) // rele2

esta operação irá repetir por 9 minutos (tempo para bater a roupa);

Após irá ligar a bomba dágua (//rele3) para fazer o esgotamento do tambor para poder dar inicio a centrifugação.

Após 3 minutos o motor entra em alta velocidade e também a bomba continua (rele3 e 4);

Após desliga a bomba e o motor, dá um tempo de 15 segundo (para o tambor parar por total) e o ciclo estará completo (led1 aceso).

Nesta etapa o led ficara aceso somente por 10 segundo (junto com um aviso sonoro).

Chegando ai, o processo deverá encerrar, somente irá voltar a novo ciclo se pulsar novamente o botão.

Chique né:

Ai vai o programinha:

int rele1 = 2; // velocidade baixa a direita
int rele2 = 3; // velocidade baixa a esquerda
int rele3 = 4; // bomba dagua
int rele4 = 5; // velocidade alta para centrifugação a direita
int led1 = 6; // avisa processo finalizado
int botao = 8; // botão inicio
int var = 0; // variavel
int var2 = 0;
int estado = 0;

void setup(){

pinMode(rele1,OUTPUT); // pino do rele1 do tipo saida de sinal
pinMode(rele2,OUTPUT); // pino do rele2 do tipo saida de sinal
pinMode(rele3,OUTPUT); // pino da bomba1 do tipo saida de sinal
pinMode(rele4,OUTPUT); // pino do rele3 do tipo saida de sinal
pinMode(led1,OUTPUT); // pino do led1 do tipo saida de sinal
pinMode(botao,INPUT); // pino do botao1 do tipo de entrada de sinal
}

void loop()
{
var=digitalRead(botao); //ler o valor enviado pelo botão: "HIGH" ou "LOW"
if ((var == HIGH) && (var2 == LOW)) {
estado = 1 - estado;
delay(20); // de-bouncing
}
var2=var;
if (estado == 1) {

digitalWrite(rele1,HIGH); //liga rele1
delay(25000); // rele1 aciona por 25 segundos
digitalWrite(rele1,LOW); // desliga rele1
delay(10000); // espera no sistema
digitalWrite(rele2,HIGH); // liga rele2
delay(25000); // rele2 aciona por 25 segundos
digitalWrite(rele2,LOW); // desliga rele2
delay(10000); // espera do sistema
digitalWrite(rele1,HIGH); //liga rele1
delay(25000); // rele1 aciona por 25 segundos
digitalWrite(rele1,LOW); // desliga rele1
delay(10000); // espera no sistema
digitalWrite(rele2,HIGH); // liga rele2
delay(25000); // rele2 aciona por 25 segundos
digitalWrite(rele2,LOW); // desliga rele2
delay(10000); // espera do sistema
digitalWrite(rele1,HIGH); //liga rele1
delay(25000); // rele1 aciona por 25 segundos
digitalWrite(rele1,LOW); // desliga rele1
delay(10000); // espera no sistema
digitalWrite(rele2,HIGH); // liga rele2
delay(25000); // rele2 aciona por 25 segundos
digitalWrite(rele2,LOW); // desliga rele2
delay(10000); // espera do sistema
digitalWrite(rele1,HIGH); //liga rele1
delay(25000); // rele1 aciona por 25 segundos
digitalWrite(rele1,LOW); // desliga rele1
delay(10000); // espera no sistema
digitalWrite(rele2,HIGH); // liga rele2
delay(25000); // rele2 aciona por 25 segundos
digitalWrite(rele2,LOW); // desliga rele2
delay(10000); // espera do sistema
digitalWrite(rele1,HIGH); //liga rele1
delay(25000); // rele1 aciona por 25 segundos
digitalWrite(rele1,LOW); // desliga rele1
delay(10000); // espera no sistema
digitalWrite(rele2,HIGH); // liga rele2
delay(25000); // rele2 aciona por 25 segundos
digitalWrite(rele2,LOW); // desliga rele2
delay(10000); // espera do sistema
digitalWrite(rele1,HIGH); //liga rele1
delay(25000); // rele1 aciona por 25 segundos
digitalWrite(rele1,LOW); // desliga rele1
delay(10000); // espera no sistema
digitalWrite(rele2,HIGH); // liga rele2
delay(25000); // rele2 aciona por 25 segundos
digitalWrite(rele2,LOW); // desliga rele2
delay(10000); // espera do sistema
digitalWrite(rele1,HIGH); //liga rele1
delay(25000); // rele1 aciona por 25 segundos
digitalWrite(rele1,LOW); // desliga rele1
delay(10000); // espera no sistema
digitalWrite(rele2,HIGH); // liga rele2
delay(25000); // rele2 aciona por 25 segundos
digitalWrite(rele2,LOW); // desliga rele2
delay(10000); // espera do sistema
digitalWrite(rele1,HIGH); //liga rele1
delay(25000); // rele1 aciona por 25 segundos
digitalWrite(rele1,LOW); // desliga rele1
delay(10000); // espera no sistema


digitalWrite(rele3,HIGH); // liga bomba
delay(180000); // permanece por 3 minutos e

digitalWrite(rele4,HIGH); // liga rele4 centrifugacao
delay(240000); // centrifuga por 4 minutos com bomba e centrifugaca

digitalWrite(rele3,LOW); // desliga bomba
digitalWrite(rele4,LOW); // desliga centrifugacao

delay(15000); // apos 15 segundos para parada do motor

digitalWrite(led1,HIGH); // liga led pronto
delay(10000); // espera no sistema

}
else {
digitalWrite(rele1, LOW); // desliga o led
}
}

Exibições: 9727

Responder esta

Respostas a este tópico

Ja pensou em usar interrupções?

Cria uma função contendo o codigo de funcionamento do seu projeto, e chama essa função pela interrupção, assim, ela só será executada quando o botão for pressionado.

O problema é que se o botão for pressionado enquanto a maquina estiver em funcionamento, irá reiniciar, portanto necessitaria de um tratamento para isso, por exemplo usando uma variavel

Minha sugestão é a seguinte

int rele1 = 3; // velocidade baixa a direita
int rele2 = 4; // velocidade baixa a esquerda
int rele3 = 5; // bomba dagua
int rele4 = 6; // velocidade alta para centrifugação a direita
int led1 = 7; // avisa processo finalizado
int estado = 0; // variavel de controle

void setup()
{
pinMode(rele1,OUTPUT); // pino do rele1 do tipo saida de sinal
pinMode(rele2,OUTPUT); // pino do rele2 do tipo saida de sinal
pinMode(rele3,OUTPUT); // pino da bomba1 do tipo saida de sinal
pinMode(rele4,OUTPUT); // pino do rele3 do tipo saida de sinal
pinMode(led1,OUTPUT); // pino do led1 do tipo saida de sinal
attachInterrupt(0, blink, FALLING); // declaração da interrupção
}

void funcionamento()
{
if (estado==0){
estado=1;
for(i=0; i<9; i++){
digitalWrite(rele1,HIGH); //liga rele1
delay(25000); // rele1 aciona por 25 segundos
digitalWrite(rele1,LOW); // desliga rele1
delay(10000); // espera no sistema
digitalWrite(rele2,HIGH); // liga rele2
delay(25000); // rele2 aciona por 25 segundos
digitalWrite(rele2,LOW); // desliga rele2
delay(10000); // espera do sistema
}
digitalWrite(rele3,HIGH); // liga bomba
delay(180000); // permanece por 3 minutos e
digitalWrite(rele4,HIGH); // liga rele4 centrifugacao
delay(240000); // centrifuga por 4 minutos com bomba e centrifugaca
digitalWrite(rele3,LOW); // desliga bomba
digitalWrite(rele4,LOW); // desliga centrifugacao
delay(15000); // apos 15 segundos para parada do motor
digitalWrite(led1,HIGH); // liga led pronto
delay(10000); // espera no sistema
digitalWrite(led1,LOW); // desliga o led
estado=0;
}
}

void loop()
{
}

Note que eu alterei o botão para o pino 2 (só pode ser o 2 ou o 3) e desloquei os relês para um numero acima, tambem tirei aquele monte de digitalWrite repetido e coloquei dentro de um for, afinal o for foi feito pra isso hahaha.

Lembre-se de colocar um resistor de pullup no botão.

Outro metodo que seria melhor ainda, é separar cada parte do processo em funções e fazer uma chamar a outra e ao mesmo tempo alterar a variavel de controle, dessa forma, se o botao for pressionado durante o processo, concerteza nada acontecerá (pois na função principal teria o controle disso) e ainda, caso queira, pode ser implementado um sistema de pausa. Mas isso requer um pouco de mais de tempo do que o que eu disponho agora, deixo isso pra você.

Qualquer duvida, pode perguntar.

Espero ter ajudado =]

Uhm interessante esta função for, quer dizer se for igual não é necessário ficar repetindo.

Ainda fico bão nisto João. Somente três semanas "brincando com Arduino e programação" não paro de aprender.

Outra pergunta void loop no fim ? e sem nenhuma função para ele exercer ?

Tentei compilar está dando erro na linha:

attachInterrupt(0, blink, FALLING); // declaração da interrupção

erros:

sketch_jul28c.ino: In function 'void setup()':
sketch_jul28c:14: error: 'blink' was not declared in this scope
sketch_jul28c.ino: In function 'void funcionamento()':
sketch_jul28c:20: error: 'i' was not declared in this scope

Obrigado pela resposta

José Antonio 

A respeito do for, ele é uma função de repetição, você pode observar que no código que eu escrevi ele está assim for(i=0; i<9; i++) isso significa que a variavel i começa em zero e a cada repetição ele aumenta 1, ate chegar a 9, ou seja, repete o codigo 9 vezes.

Dentro do void loop deve ir a função que o arduino repete inumeras vezes, por isso ele é usado na maioria das vezes, nesse caso, como você deseja que a função seja executada apenas 1 vez, e a verificação da interrupção não precisa estar dentro do void loop, ele pode ficar vazio.

Caso queira usa-lo, você pode esquecer a interrupção e verificar o botão dentro do void loop, e ai chamar a função, seria assim

int rele1 = 2; // velocidade baixa a direita
int rele2 = 3; // velocidade baixa a esquerda
int rele3 = 4; // bomba dagua
int rele4 = 5; // velocidade alta para centrifugação a direita
int led1 = 6; // avisa processo finalizado
int botao = 8; // botão inicio
int var = 0;
int estado = 0;

void setup()
{
pinMode(rele1,OUTPUT); // pino do rele1 do tipo saida de sinal
pinMode(rele2,OUTPUT); // pino do rele2 do tipo saida de sinal
pinMode(rele3,OUTPUT); // pino da bomba1 do tipo saida de sinal
pinMode(rele4,OUTPUT); // pino do rele3 do tipo saida de sinal
pinMode(led1,OUTPUT); // pino do led1 do tipo saida de sinal
pinMode(botao,INPUT); // pino do botao1 do tipo de entrada de sinal
}

void funcionamento()
estado=1;
for(i=0; i<9; i++){
digitalWrite(rele1,HIGH); //liga rele1
delay(25000); // rele1 aciona por 25 segundos
digitalWrite(rele1,LOW); // desliga rele1
delay(10000); // espera no sistema
digitalWrite(rele2,HIGH); // liga rele2
delay(25000); // rele2 aciona por 25 segundos
digitalWrite(rele2,LOW); // desliga rele2
delay(10000); // espera do sistema
}
digitalWrite(rele3,HIGH); // liga bomba
delay(180000); // permanece por 3 minutos e
digitalWrite(rele4,HIGH); // liga rele4 centrifugacao
delay(240000); // centrifuga por 4 minutos com bomba e centrifugaca
digitalWrite(rele3,LOW); // desliga bomba
digitalWrite(rele4,LOW); // desliga centrifugacao
delay(15000); // apos 15 segundos para parada do motor
digitalWrite(led1,HIGH); // liga led pronto
delay(10000); // espera no sistema
digitalWrite(led1,LOW); // desliga o led
estado=0;
}

void loop()
{
var=digitalRead(botao);
if(var==HIGH && estado==0){
funcionamento();
}
}

Pensando bem, acho que esse segundo metodo é melhor.

De inicio pensei em interrupções mas acho que usando o loop você terá menos problemas.

Opa que legal. Pelo que li na parte do setup ele executa apenas uma vez e void loop é a parte onde enquanto tiver sendo alimentado o Arduino ele fica em execuçã (sem fim).  Eu vi na net um exemplo de se usar o #include <avr/wdt.h> no inicio do sketch e também no final do do void loop. 


wdt_enable(WDTO_1S);
while(1);

também com pau

estado=1;

erros: 


sketch_jul28a:19: error: expected initializer before 'int'
sketch_jul28a:20: error: expected unqualified-id before 'for'
sketch_jul28a:20: error: expected constructor, destructor, or type conversion before '<' token
sketch_jul28a:20: error: expected constructor, destructor, or type conversion before '++' token
sketch_jul28a:30: error: expected constructor, destructor, or type conversion before '(' token
sketch_jul28a:31: error: expected constructor, destructor, or type conversion before '(' token
sketch_jul28a:32: error: expected constructor, destructor, or type conversion before '(' token
sketch_jul28a:33: error: expected constructor, destructor, or type conversion before '(' token
sketch_jul28a:34: error: expected constructor, destructor, or type conversion before '(' token
sketch_jul28a:35: error: expected constructor, destructor, or type conversion before '(' token
sketch_jul28a:36: error: expected constructor, destructor, or type conversion before '(' token
sketch_jul28a:37: error: expected constructor, destructor, or type conversion before '(' token
sketch_jul28a:38: error: expected constructor, destructor, or type conversion before '(' token
sketch_jul28a:39: error: expected constructor, destructor, or type conversion before '(' token
sketch_jul28a:40: error: expected constructor, destructor, or type conversion before '=' token
sketch_jul28a:41: error: expected declaration before '}' token

A biblioteca wdt.h é responsavel por uma função chamada Watchdog, nunca tinha visto usa-la dessa forma.

Achei interessante

Olha como estou usando (por enquanto amanhã vou mudar a parte do for).

#include <avr/wdt.h>

int rele1 = 2; // velocidade baixa a direita
int rele2 = 3; // velocidade baixa a esquerda
int rele3 = 4; // bomba dagua
int rele4 = 5; // velocidade alta para centrifugação a direita
int led1 = 6; // avisa processo finalizado
int botao = 8; // botão inicio
int var = 0; // variavel
int estado = 0;

void setup()
{
pinMode(rele1,OUTPUT); // pino do rele1 do tipo saida de sinal
pinMode(rele2,OUTPUT); // pino do rele2 do tipo saida de sinal
pinMode(rele3,OUTPUT); // pino da bomba1 do tipo saida de sinal
pinMode(rele4,OUTPUT); // pino do rele3 do tipo saida de sinal
pinMode(led1,OUTPUT); // pino do led1 do tipo saida de sinal
pinMode(botao,INPUT); // pino do botao1 do tipo de entrada de sinal
}

void loop(){

var=digitalRead(botao); //ler o valor enviado pelo botão: "HIGH" ou "LOW"

if (var == HIGH) {
estado = 1 - estado;
delay(20); // de-bouncing
}

if (estado == 1) {

digitalWrite(rele1,HIGH); //liga rele1
delay(25000); // rele1 aciona por 25 segundos
digitalWrite(rele1,LOW); // desliga rele1
delay(10000); // espera no sistema
digitalWrite(rele2,HIGH); // liga rele2
delay(25000); // rele2 aciona por 25 segundos
digitalWrite(rele2,LOW); // desliga rele2
delay(10000); // espera do sistema
digitalWrite(rele1,HIGH); //liga rele1
delay(25000); // rele1 aciona por 25 segundos
digitalWrite(rele1,LOW); // desliga rele1
delay(10000); // espera no sistema
digitalWrite(rele2,HIGH); // liga rele2
delay(25000); // rele2 aciona por 25 segundos
digitalWrite(rele2,LOW); // desliga rele2
delay(10000); // espera do sistema
digitalWrite(rele1,HIGH); //liga rele1
delay(25000); // rele1 aciona por 25 segundos
digitalWrite(rele1,LOW); // desliga rele1
delay(10000); // espera no sistema
digitalWrite(rele2,HIGH); // liga rele2
delay(25000); // rele2 aciona por 25 segundos
digitalWrite(rele2,LOW); // desliga rele2
delay(10000); // espera do sistema
digitalWrite(rele1,HIGH); //liga rele1
delay(25000); // rele1 aciona por 25 segundos
digitalWrite(rele1,LOW); // desliga rele1
delay(10000); // espera no sistema
digitalWrite(rele2,HIGH); // liga rele2
delay(25000); // rele2 aciona por 25 segundos
digitalWrite(rele2,LOW); // desliga rele2
delay(10000); // espera do sistema
digitalWrite(rele1,HIGH); //liga rele1
delay(25000); // rele1 aciona por 25 segundos
digitalWrite(rele1,LOW); // desliga rele1
delay(10000); // espera no sistema
digitalWrite(rele2,HIGH); // liga rele2
delay(25000); // rele2 aciona por 25 segundos
digitalWrite(rele2,LOW); // desliga rele2
delay(10000); // espera do sistema
digitalWrite(rele1,HIGH); //liga rele1
delay(25000); // rele1 aciona por 25 segundos
digitalWrite(rele1,LOW); // desliga rele1
delay(10000); // espera no sistema
digitalWrite(rele2,HIGH); // liga rele2
delay(25000); // rele2 aciona por 25 segundos
digitalWrite(rele2,LOW); // desliga rele2
delay(10000); // espera do sistema
digitalWrite(rele1,HIGH); //liga rele1
delay(25000); // rele1 aciona por 25 segundos
digitalWrite(rele1,LOW); // desliga rele1
delay(10000); // espera no sistema
digitalWrite(rele2,HIGH); // liga rele2
delay(25000); // rele2 aciona por 25 segundos
digitalWrite(rele2,LOW); // desliga rele2
delay(10000); // espera do sistema
digitalWrite(rele1,HIGH); //liga rele1
delay(25000); // rele1 aciona por 25 segundos
digitalWrite(rele1,LOW); // desliga rele1
delay(10000); // espera no sistema
digitalWrite(rele2,HIGH); // liga rele2
delay(25000); // rele2 aciona por 25 segundos
digitalWrite(rele2,LOW); // desliga rele2
delay(10000); // espera do sistema
digitalWrite(rele1,HIGH); //liga rele1
delay(25000); // rele1 aciona por 25 segundos
digitalWrite(rele1,LOW); // desliga rele1
delay(10000); // espera no sistema

digitalWrite(rele3,HIGH); // liga bomba
delay(180000); // permanece por 3 minutos e

digitalWrite(rele4,HIGH); // liga rele4 centrifugacao
delay(20000); // aciona motor para centrifugacao por 20 segundos e bomba
digitalWrite(rele4,LOW); // desliga rele4 centrifugacao
delay(10000); // tempo de desligado 10 segundos
digitalWrite(rele4,HIGH); // liga rele4 centrifugacao
delay(15000); // aciona motor para centrifugacao por 15 segundos e bomba
digitalWrite(rele4,LOW); // desliga rele4 centrifugacao
delay(10000); // tempo de desligado 10 segundos
digitalWrite(rele4,HIGH); // liga rele4 centrifugacao
delay(15000); // aciona motor para centrifugacao por 15 segundos e bomba
digitalWrite(rele4,LOW); // desliga rele4 centrifugacao
delay(10000); // tempo de desligado 10 segundos
digitalWrite(rele4,HIGH); // liga rele4 centrifugacao
delay(30000); // aciona motor para centrifugacao por 30 segundos e bomba
digitalWrite(rele4,LOW); // desliga rele4 centrifugacao
delay(10000); // tempo de desligado 10 segundos
digitalWrite(rele4,HIGH); // liga rele4 centrifugacao
delay(20000); // aciona motor para centrifugacao por 20 segundos e bomba
digitalWrite(rele4,LOW); // desliga rele4 centrifugacao
delay(10000); // tempo de desligado 10 segundos
digitalWrite(rele4,HIGH); // liga rele4 centrifugacao
delay(30000); // aciona motor para centrifugacao por 30 segundos e bomba
digitalWrite(rele4,LOW); // desliga rele4 centrifugacao
delay(10000); // tempo de desligado 10 segundos
digitalWrite(rele4,HIGH); // liga rele4 centrifugacao
delay(30000); // aciona motor para centrifugacao por 30 segundos e bomba

digitalWrite(rele3,LOW); // desliga bomba
digitalWrite(rele4,LOW); // desliga centrifugacao

delay(15000); // apos 15 segundos para parada do motor

digitalWrite(led1,HIGH); // liga led pronto
delay(10000); // espera no sistema

digitalWrite(led1,LOW);

wdt_enable(WDTO_1S);
while(1);

}
}

Por enquanto está funcionando em minha frente. 

Mais como te falei vou dar uma simplificada.

Abçs

Interessante o projeto, para quem está começando você começou com algo bem complexo. Meus Parabéns

Assim,

eu tenho uma noção de lógica, sou Chefe de Eletrica/Eletronica, não sou um programador, mais já programei algo em Ladder (programação em CLP).

Quando iniciei a programar, foi através de um blink (pisca-pisca), e o início é mais ou menos assim. Daí fiz um semáforo de 2 vias, depois incrementei mais dois semáforos para pedestre e fui aprendendo. 

o "for" é uma que aprendi aqui com o meu amigo João, como disse não sou um expert mais sei me virar.

Lembro que ao fazer um termometro com display 5110, tive pouca ajuda, tive de ler, pesquisar e ralar, descobri que tinha de inserir biblioteca, depois apanhei com o display pois no código tinha contraste e ele ficava tudo preto. Fui fuçando e hj está um código legal só não muito operacional (não gostei da exatidão), mais ainda vou fuçar nele.

Mais é isto ai, vamos aprendendo a cada dia e este aqui da máquina recolhi dados do processo e transformei em um código. Isto que é prazeroso no hobby, criar, inventar, pesquisar.

Valeu

José Antonio

Bom saber, mas programar é um pouco complexo, mas depois que pega um pouco de jeito começa a ficar relativamente simples, o pior são as primeiras duvidas, por sorte tenho uns amigos programadores que quebram um galho as vezes, mas o fórum aqui ajuda muito.

Também estou apanhando um pouco pq sou Eng º Agrônomo, mais fora da área que isso impossível. Já faz uns 2 meses que inciei essa brincadeira com o Arduíno e a cada dia fico mais fascinado, é algo que parece mágica rsrs, você manda fazer e ele faz, obviamente tem que saber mandar.

Só uma duvida, a maquina deu certo?

kakakkakkakkaa, é isto mesmo Tiago.

Eu tenho a eletrônica como um hobby e nas horas vagas aproveito para passar meu tempo aprendendo.

Este brinquedinho é o maio barato. Minha história é parecida com a sua, tenho um amigo que programa em PIC e quando quero fazer algo tiro minhas duvidas com ele e aqui no forum, além do Clube do Hardware.

A lógica está legal, com os tempos ainda para ajustar.

Depois vou gravar um atmega328 e colocar numa pcb. Por enquanto somente a preparação do projeto. 

Valeu qq coisa é só perguntar.

Abçs

Amigos existe a possibilidade de nao usar o delay, pois tenho um projeto de um tratamento de agua aqui q nao pode parar o programa pois controla as bombas. existe sem delay???

tem sim pesquisa sobre BlinkWithoutDelay onde é utilizado millis no lugar de delay. Veja se isso se adequá ao seu caso.

Tem uma versão nos exemplos do IDE do arduino na aba digital

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço