Bom dia pessoal, preciso criar uma programação que quando a a logica seja falsa o bloco pare de funcionar, aguem pode me ajudar? desde já Muito Obrigado,segue o programa, abraços.

int uno = 1; // entrada Modo stand bye
int run = 2; // habilita partida do gerador
int pg = 3; // aciona partida do gerador
int kc = 4; // aciona contator da compania
int kg = 5; // aciona contator do gerador
int kca = 6; // aciona contator da carga
int rs = 7; // entrada botão reset
int ffg = 8; // entrada falta de fase do gerador
int ffc = 9; // entrada falta de fase da compania
int fp = 10; // falha de partida

void setup()
{
pinMode(uno, INPUT);
pinMode(run, OUTPUT);
pinMode(pg, OUTPUT);
pinMode(kc, OUTPUT);
pinMode(kg, OUTPUT);
pinMode(kca, OUTPUT);
pinMode(rs, INPUT);
pinMode(ffg, INPUT);
pinMode(ffc, INPUT);
pinMode(fp, OUTPUT);
}

void loop()
{
int leitura1 = digitalRead(uno);
int leitura9 = digitalRead(ffc);
int leitura8 = digitalRead(ffg);
if (leitura1 == HIGH && leitura9 == HIGH && leitura8 == LOW)
{
{
delay(4000);
digitalWrite(kc, HIGH); // aciona contator da compania
delay(3000);
digitalWrite(kca, HIGH);
digitalWrite(kg, LOW);
}
}
}

Exibições: 698

Responder esta

Respostas a este tópico

Olá Danilo.

Da forma como está feito o programa, e conforme a sua solicitação que é "parar" o programa quando a lógica for falsa, bastaria fazer um loop inifinito dentro de um "else" do "if".

Segue exemplo:

if (leitura1 == HIGH && leitura9 == HIGH && leitura8 == LOW){
   delay(4000);
   digitalWrite(kc, HIGH); // aciona contator da compania
   delay(3000);
   digitalWrite(kca, HIGH);
   digitalWrite(kg, LOW);
}else{

  while(1){}

}

 Isso travaria seu programa, mas não é uma solução muito elegante e praticada.

 Melhor que isto é você trabalhar com uma máquina de estados. Onde teriam por exemplo variáveis que te informem se o bloco deve ser executado ou não.

 Não pude ajudar neste sentido pois você mandou poucas informações do que precisa fazer. Por exemplo, se o bloco deve parar de funcionar por um certo tempo, ou se ele deve voltar a funcionar dependendo de outros estados das entradas ou leituras.

 Caso tenha mais informações, informe as mesmas para que eu ou outro colega possa te ajudar.

 Espero ter ajudado.

 T++.

Opa Daniel, vlw pelas infromações amigo, então ainda estou desenvolvendo o projeto sendo que usarei um arduino para monitorar os estados de sinal das entradas e de acordo com cada sinal(como fosse portas logicas) ele mandará um comando, sendo que preciso que quando alterar os estados os comandos ja se alterem de acordo com o estado que se encontra, se vc puder passar seu email te mostro os diagramas do projeto completo, bem bacana, segue as linhas de código que ja fiz e que precisam de melhoria, pois percebi que quando tiro o sinal da entrada está lavando um tempo pra sair o sinal de saída, isso complica por trabalhar com carga e contatores, ainda não tenho certeza se o problema é do softwares, pois estou simulando no Proteus 8.0, Obrigado pelo apoio, abraços.

int uno = 1; // entrada Modo stand bye
int run = 2; // habilita partida do gerador
int pg = 3; // aciona partida do gerador
int kc = 4; // aciona contator da compania
int kg = 5; // aciona contator do gerador
int kca = 12; // aciona contator da carga
int rs = 7; // entrada botão reset
int ffg = 8; // entrada falta de fase do gerador
int ffc = 9; // entrada falta de fase da compania
int fp = 10; // falha de partida

void setup()
{
pinMode(uno, INPUT);
pinMode(run, OUTPUT);
pinMode(pg, OUTPUT);
pinMode(kc, OUTPUT);
pinMode(kg, OUTPUT);
pinMode(kca, OUTPUT);
pinMode(rs, INPUT);
pinMode(ffg, INPUT);
pinMode(ffc, INPUT);
pinMode(fp, OUTPUT);
}

void loop()
{
int leitura1 = digitalRead(uno);
int leitura9 = digitalRead(ffc);
int leitura8 = digitalRead(ffg);
if (leitura1 == HIGH && leitura9 == HIGH && leitura8 == LOW)

{
delay(4000);
digitalWrite(kc, HIGH); // aciona contator da compania
delay(3000);
digitalWrite(kca, HIGH);
digitalWrite(kg, LOW);
}
else
{
digitalWrite(kc, LOW);
digitalWrite(kca, LOW);
}
if(leitura1 == HIGH)
{
if(leitura8 == LOW)
{
if(leitura9 == LOW)
{
digitalWrite(kc, HIGH);
delay(3000);
digitalWrite(kc, LOW);
}
}
}
}

obs: vou testar com o while, mas ainda não conheço bem esta função, abraços.

 Beleza, te dou uma força no que puder. Meu email é:  blogembarcado@gmail.com

 Costumo fazer meus testes simulando com o Proteus também.

 Uso o Simulino no Proteus, e até o momento sempre funcionou bem. ^^

 T++.

vou te mandar agora e quem quiser dar uma olhadinha no projeto é só me passar o email, é bom para todos ^^, abraços.

Bom dia pessoal, aqui segue a lógica do projeto até a parte de acionar o gerador, mas o programa está dando erro quando tento chamar os códigos segue abaixo, desde já obrigado pela ajuda pessoal.


int uno = 1; // habilita modo automatico
int run = 2; // habilita partida do gerador
int pg = 3; // aciona partida do gerador
int kc = 4; // aciona contator da compania
int kg = 5; // aciona contator do gerador
int kca = 6; // aciona contator da carga
int rs = 7; // entrada botão reset
int ffg = 8; // entrada falta de fase do gerador
int ffc = 9; // entrada falta de fase da compania
int fp = 10; // falha de partida
int leitura1 = digitalRead(uno);
int leitura8 = digitalRead(ffg);
int leitura9 = digitalRead(ffc);
int leitura4 = digitalRead(kc);

//controle

void setup(){
pinMode(uno, INPUT);
pinMode(run, OUTPUT);
pinMode(pg, OUTPUT);
pinMode(kc, OUTPUT);
pinMode(kg, OUTPUT);
pinMode(kca, OUTPUT);
pinMode(rs, INPUT);
pinMode(ffg, INPUT);
pinMode(ffc, INPUT);
pinMode(fp, OUTPUT);
}
void loop()
{
if(leitura1 == HIGH && leitura8 == LOW && leitura9 == HIGH) //declaração lógica de comparação para executar a função change1
{
change1()//função declarada para executar o bloco de código
if(leitura1 == HIGH && leitura8 == LOW && leitura9 == LOW)// depois da função executada será necessario fazer outra comparação com if na sequencia
{
change2()
}
}
if(leitura1 == HIGH && (leitura8 == LOW) && (leitura9 == LOW) == (leitura4 == LOW))
{
change3()
}
}
void change1()
{//será colocado uma função aqui com delay e depois desta função necessito fazer outra comparação dentro do loop
}
void change2()
{
//aqui será colocada outra função com delay
}
void change3()
{
// aqui também ira fazer outra execução de acordo com a logica verdadeira
}

segue em anexo o hardware para simular no proteus também, abraços.

Anexos

agora fiz o programa rodar melhorzinho, apenas não consigo fazer parar de rodar quando tiro o sinal da entrada 1 q deveria parar(modo automatico)


int uno = 1; // habilita modo automatico
int run = 2; // habilita partida do gerador
int pg = 3; // aciona partida do gerador
int kc = 4; // aciona contator da compania
int kg = 5; // aciona contator do gerador
int kca = 6; // aciona contator da carga
int rs = 7; // entrada botão reset
int ffg = 8; // entrada falta de fase do gerador
int ffc = 9; // entrada falta de fase da compania
int fp = 10; // falha de partida

//controle

void setup()
{
pinMode(uno, INPUT);
pinMode(run, OUTPUT);
pinMode(pg, OUTPUT);
pinMode(kc, OUTPUT);
pinMode(kg, OUTPUT);
pinMode(kca, OUTPUT);
pinMode(rs, INPUT);
pinMode(ffg, INPUT);
pinMode(ffc, INPUT);
pinMode(fp, OUTPUT);
}
void loop()
{
int leitura1 = digitalRead(uno);
int leitura8 = digitalRead(ffg);
int leitura9 = digitalRead(ffc);
int leitura4 = digitalRead(kc);
int leitura3 = digitalRead(pg);

if(leitura1 == HIGH)
{
if (leitura9 == HIGH)
{
digitalWrite(kg, LOW);
digitalWrite(pg, LOW);
digitalWrite(run, LOW);
delay(300);
digitalWrite(kc, HIGH);
delay(300);
digitalWrite(kca, HIGH);
}
else
{
if(leitura9 == LOW)
{
delay(300);
digitalWrite(kc, LOW);
delay(300);
digitalWrite(kca, LOW);
digitalWrite(run, HIGH);
delay(300);
digitalWrite(kg, HIGH);
}
}
}
}

Tentei a sugestão do nosso amigo Renyer para fazer u reset na programação se o nivel da porta 1 for baixo, mas não funcionaou ainda, ficou assim:


int uno = 1; // habilita modo automatico
int run = 2; // habilita partida do gerador
int pg = 3; // aciona partida do gerador
int kc = 4; // aciona contator da compania
int kg = 5; // aciona contator do gerador
int kca = 6; // aciona contator da carga
int rs = 7; // entrada botão reset
int ffg = 8; // entrada falta de fase do gerador
int ffc = 9; // entrada falta de fase da compania
int fp = 10; // falha de partida

//controle

void setup()
{
pinMode(uno, INPUT);
pinMode(run, OUTPUT);
pinMode(pg, OUTPUT);
pinMode(kc, OUTPUT);
pinMode(kg, OUTPUT);
pinMode(kca, OUTPUT);
pinMode(rs, INPUT);
pinMode(ffg, INPUT);
pinMode(ffc, INPUT);
pinMode(fp, OUTPUT);
}
void loop()
{
int leitura1 = digitalRead(uno);
int leitura8 = digitalRead(ffg);
int leitura9 = digitalRead(ffc);
int leitura4 = digitalRead(kc);
int leitura3 = digitalRead(pg);

if(leitura1 == HIGH)
{
if (leitura9 == HIGH)
{
digitalWrite(kg, LOW);
digitalWrite(pg, LOW);
digitalWrite(run, LOW);
delay(300);
digitalWrite(kc, HIGH);
delay(300);
digitalWrite(kca, HIGH);
}
else
{
int leitura1 = digitalRead(uno);
if(leitura9 ==LOW == leitura1)
{
delay(300);
digitalWrite(kc, LOW);
delay(300);
digitalWrite(kca, LOW);
digitalWrite(run, HIGH);
delay(300);
digitalWrite(kg, HIGH);
}
else
{
digitalWrite(rs, HIGH);
delay(300);
digitalWrite(rs, LOW);
digitalWrite(run, LOW);
digitalWrite(kg, LOW);
digitalWrite(kc, LOW);
digitalWrite(kca, LOW);
}
}
}
}

pelo q parece a porta else ja não está funcionando utilizando a lógica de comparadores =(

mas tem que fazer uma interrupção... quando clicar no botão "reset" ele deve parar TUDO que estiver fazendo e ir pra função de ler os TRES SENSORES INICIAIS...

OBS, as portas de interrupção são PADRÃO, se vc ja estiver usando elas vai ter que mudar...

abraço cara e ta QUASE LÁ...

só pra comentar aqui no tópico ^^, coloquei o reset, mas quando ligo o arduino ele ja fica marrado no reset e não sai mais

não chega a nem fazer as funções, já q a tabela verdade é a que preciso, acho q vou colocar um sinal a amis pra fazer funciona-lo

Danilo.

Pode ser com a função do- while.

http://arduino.cc/en/Reference/DoWhile

Abs

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço