Bom dia Pessoal!

Estou com um problema em um projeto e preciso de ajudo na programação.

Basicamente tenho 8 emissores IR e 8 receptores. Eles estão montados em grupos de 4 para detectar movimento ao romper um dos sensores.

Quando um dos primeiros 4 sensores é rompido aciona uma câmera fotográfica, se o segundo grupo de sensores não for acionado em um tempo X, a câmera desliga, mas se for acionado, o flash dispara. Entretanto, se o movimento for contrário, acionando o segundo grupo de sensores primeiro, nada acontece.

Sensor_cam = sensores IR que disparam a câmera

sensibilidade_cam = é o controle de sensibilidade que define o ponto de corte do sensor IR que dispara a câmera

Sensor_flash =  sensores IR que disparam o flash

sensibilidade_flash = é o controle de sensibilidade que define o ponto de corte do sensor IR que dispara o flash

void disparo() {
if((Sensor_cam1 > sensibilidade_cam)||(Sensor_cam2 > sensibilidade_cam)||(Sensor_cam3 > sensibilidade_cam)||(Sensor_cam4 > sensibilidade_cam)&&(Sensor_flash1 < sensibilidade_flash)||(Sensor_flash2 < sensibilidade_flash)||(Sensor_flash2 < sensibilidade_flash)||(Sensor_flash3 < sensibilidade_flash))

{digitalWrite(led_cam, HIGH);
Canon();
digitalWrite (cam, HIGH);
time = 0;
estado = 1;}

if(time >= 500)

{digitalWrite(led_cam, LOW);
digitalWrite (cam, LOW);
Canon();
time = 0;
estado = 0;}

if((Sensor_flash1 > sensibilidade_flash)||(Sensor_flash2 > sensibilidade_flash)||(Sensor_flash3 > sensibilidade_flash)||(Sensor_flash4 > sensibilidade_flash))

{if (estado == 1)
{digitalWrite(led_flash, HIGH);
digitalWrite (flash, HIGH);
delay(500);
digitalWrite(led_flash, LOW);
digitalWrite (flash, LOW);
digitalWrite(led_cam, LOW);
Canon();
digitalWrite(led_espera, HIGH);
delay (espera);
digitalWrite(led_espera, LOW);
estado = 0;}}
time++;}

Deste modo que fiz, da alguns problemas. As vezes, rompendo a primeira barreira de sensores, toda sequência já ocorre mesmo sem o rompimento da barreira seguinte.

Teria como melhorar isso? Simplificar e ter mais segurança?

Abraços

Exibições: 195

Responder esta

Respostas a este tópico

O uso de estados como você fez é o caminho correto.
As regras de mudança de estados estão bem definidas.

Quanto à ter mais segurança? O que quer dizer?
O software garante a execução de regras, ou melhor, um algorítmo.
Segurança seria no esquema de funcionamento, no serviço, na fiação, no hardware, na instalação física, na duplicidade e redundância, em estar escondido, .... ?

O problema que está acontecendo é com essas linhas:

if((Sensor_cam1 > sensibilidade_cam)||(Sensor_cam2 > sensibilidade_cam)||(Sensor_cam3 > sensibilidade_cam)||(Sensor_cam4 > sensibilidade_cam)&&(Sensor_flash1 < sensibilidade_flash)||(Sensor_flash2 < sensibilidade_flash)||(Sensor_flash2 < sensibilidade_flash)||(Sensor_flash3 < sensibilidade_flash))

if((Sensor_flash1 > sensibilidade_flash)||(Sensor_flash2 > sensibilidade_flash)||(Sensor_flash3 > sensibilidade_flash)||(Sensor_flash4 > sensibilidade_flash))

Frequentemente ocorre o acionamento do sistema completo apenas obstruindo alinha dos primeiros sensores (Sensor_cam1 até o 4) quando deveria completar se o segundo conjunto de sensores fosse interrompido.

Quando testo usando apenas um sensor de cada barreiro, funciona perfeito, mas quando uso esse monte de || as coisas não andam tão bem.

Codificar é escrever em formas e regras do computador uma reflexão encadeada de uma situação qualquer.

Crie diagramas, desenhos, escreva as regras ou sequências  em "Portugol" para tudo aquilo que quer que aconteça. Somente depois de tudo isso feito, codifique em C/C++ para o Arduino.

Exemplo de Portugol:

Estado = Inativo

Se (Estado é Inativo E os 4 primeiros sensores forem ativados) Estado = Tirar Foto

Se (Estado é Inativo E os 4 últimos sensores forem ativados) Estado = Pessoa Saindo

Se (Estado é Pessoa Saindo E os 4 primeiros sensores forem ativados) Estado = Inativo

Se (Estado é Tirar Foto E os 4 últimos sensores forem ativados) Estado = Flash

Se (Estado é Flash E ....

Deveria ser possível desenhar um diagrama de estados dentro de círculos com setas indicado de que estado pode mudar para qual outro estado, associado a uma regra para que essa mudança possa ocorrer.

Esse diagrama vai ajudar a visualizar o que deveria ocorrer e simular as várias situações (casos de uso) para verificar se o diagrama cobre todas as possíveis situações reais. Posteriormente esse diagrama pode ser "traduzido" em um algoritmo em "Portugol". Por fim codifica-se isso na linguagem própria para a máquina desejada.

Isso vai trazer mais clareza para visualizar o que deveria ocorrer ao longo da execução do algoritmo.

E assim codificar baseado em esse diagrama ou pelo algoritmo em "Portugol".

Os "if(), ||, &&" são a etapa final...

Para entender mais sobre essa máquina de estados e os seus diagramas:

https://www.cin.ufpe.br/~gta/rup-vc/core.base_rup/guidances/guideli...

Brigadão, Consegui resolver e ficou funcional.

void disparo() {

if(valor_Sensor_A6 > sensibilidade_cam) {disparo_cam = 1;}
if(valor_Sensor_A7 > sensibilidade_cam) {disparo_cam = 1;}
if(valor_Sensor_A8 > sensibilidade_cam) {disparo_cam = 1;}
if(valor_Sensor_A9 > sensibilidade_cam) {disparo_cam = 1;}

if(valor_Sensor_A2 > sensibilidade_flash) {disparo_flash = 1;} else {disparo_flash = 0;}
if(valor_Sensor_A3 > sensibilidade_flash) {disparo_flash = 1;} else {disparo_flash = 0;}
if(valor_Sensor_A4 > sensibilidade_flash) {disparo_flash = 1;} else {disparo_flash = 0;}
if(valor_Sensor_A5 > sensibilidade_flash) {disparo_flash = 1;} else {disparo_flash = 0;}

if (disparo_cam == 1 && disparo_flash == 0)

{digitalWrite(led_cam, HIGH);
digitalWrite (cam, HIGH);
time = 0;
estado = 1;
disparo_cam = 0;
Canon();}


if(time >= 500)

{digitalWrite(led_cam, LOW);
digitalWrite (cam, LOW);
time = 0;
estado = 0;
disparo_cam = 0;
disparo_flash = 0;}

if(disparo_flash == 1)
{if (estado == 1)
{digitalWrite(led_flash, HIGH);
digitalWrite (flash, HIGH);
delay(500);
digitalWrite(led_flash, LOW);
digitalWrite (flash, LOW);
digitalWrite(led_cam, LOW);
digitalWrite (cam, LOW);
digitalWrite(led_espera, HIGH);
delay (espera);
digitalWrite(led_espera, LOW);
estado = 0;
disparo_cam = 0;
disparo_flash = 0;}}
time++;}

abraços

Que bom! Fico feliz em saber que conseguiu chegar ao resultado desejado!
Abraços!

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço