Go Down

Topic: Problema Em Acionar Saidas Temporizadas (Read 200 times) previous topic - next topic

LucasST

Estou tentando fazer um projeto com Arduino mega e dois sensores reflexivo infravermelho E18-d80nk  para Acionar, 8 Saídas Digitais que estão ligadas a um modulo relé com 8 reles, o seguinte projeto gostaria que as saídas fossem acionadas temporizadas uma seguida da outra e depois fossem desligadas da mesma maneira temporizadas, tentei usar a função delay mais não está funcionando direito,quando passo perto de um dos sensores ele demora para começar a acionar as saídas.Depois tentei procurar na internet outras alternativas encontrei um biblioteca que segundo o autor era parecida com um temporizador TON muito utilizado na logica ladder que é um temporizador de retardo na energização não deu certo também se alguém puder me ajudar agradeço.

Essa código foi feito com a função delay.

Code: [Select]


int rele_1=30;
int rele_2=23;
int rele_3=24;
int rele_4=25;
int rele_5=26;
int rele_6=27;
int rele_7=28;
int rele_8=31;
int pino_sensor=2;
int pino_sensor2=3;
unsigned long time;
void setup() {

pinMode (rele_1,OUTPUT);
pinMode (rele_2,OUTPUT);
pinMode (rele_3,OUTPUT);
pinMode (rele_4,OUTPUT);
pinMode (rele_5,OUTPUT);
pinMode (rele_6,OUTPUT);
pinMode (rele_7,OUTPUT);
pinMode (rele_8,OUTPUT);
pinMode(pino_sensor,INPUT);
pinMode(pino_sensor2,INPUT);
 

}

void loop() {
   
if (digitalRead(pino_sensor) == HIGH )
{
  digitalWrite(rele_8,HIGH);
  delay(280);
  digitalWrite(rele_7,HIGH);
  delay(280);
  digitalWrite(rele_6,HIGH);
  delay(280);
  digitalWrite(rele_5,HIGH);
  delay(280);
  digitalWrite(rele_4,HIGH);
  delay(280);
  digitalWrite(rele_3,HIGH);
  delay(280);
  digitalWrite(rele_2,HIGH);
  delay(280);
  digitalWrite(rele_1,HIGH);
  delay(280); 
   
if(digitalRead(pino_sensor) == LOW)
{
 
  digitalWrite(rele_1,LOW);
  digitalWrite(rele_2,LOW);
  digitalWrite(rele_3,LOW);
  digitalWrite(rele_4,LOW);
  digitalWrite(rele_5,LOW);
  digitalWrite(rele_6,LOW);
  digitalWrite(rele_7,LOW);
  digitalWrite(rele_8,LOW);
       }
 }

  if (digitalRead(pino_sensor2) == HIGH )
{
  digitalWrite(rele_1,HIGH);
  delay(280);
  digitalWrite(rele_2,HIGH);
  delay(280);
  digitalWrite(rele_3,HIGH);
  delay(280);
  digitalWrite(rele_4,HIGH);
  delay(280);
  digitalWrite(rele_5,HIGH);
  delay(280);
  digitalWrite(rele_6,HIGH);
  delay(280);
  digitalWrite(rele_7,HIGH);
  delay(280);
  digitalWrite(rele_8,HIGH);
  delay(280); 
   
if(digitalRead(pino_sensor2) == LOW)
{
 
  digitalWrite(rele_1,LOW);
  digitalWrite(rele_2,LOW);
  digitalWrite(rele_3,LOW);
  digitalWrite(rele_4,LOW);
  digitalWrite(rele_5,LOW);
  digitalWrite(rele_6,LOW);
  digitalWrite(rele_7,LOW);
  digitalWrite(rele_8,LOW);
       }
 }
}




Esse é o outro codigo utilizando a biblioteca que encontrei na internet. Link da Biblioteca Temporizador

Code: [Select]

int sensorPin = 31;   
int rele1 =  30;
int rele2 =  23;
int rele3 =  24;
int rele4 =  25;
int rele5 =  26;   
unsigned long tempo = 0; // variável para receber valores do millis()
unsigned long temp1 = 0;
unsigned long temp2 = 0;
unsigned long temp3 = 0;
unsigned long temp4 = 0;
int temporizador = 0;// variável para indicar quando o temporizador está operando
int tempor1 = 0;
int tempor2 = 0;
int tempor3 = 0;
int tempor4 = 0;
int sensorState = 0;

void setup() {
  pinMode(rele1, OUTPUT);
  pinMode(rele2, OUTPUT);   
  pinMode(rele3, OUTPUT);
  pinMode(rele4, OUTPUT);
  pinMode(rele5, OUTPUT);
  pinMode(sensorPin, INPUT);   
}

void loop(){

sensorState = digitalRead(sensorPin); // lê o estado do botão

if (sensorState == HIGH && temporizador == 0) {  // se botão acionado
           temporizador = 1; // inicia o temporizador
           tempo = millis(); // passa à variável o valor de millis()


if (sensorState == HIGH && tempor1 == 0) {  // se botão acionado
           tempor1 = 1; // inicia o temporizador
           temp1 = millis(); // passa à variável o valor de millis()
}

if (sensorState == HIGH && tempor2 == 0) {  // se botão acionado
           tempor2 = 1; // inicia o temporizador
           temp2 = millis(); // passa à variável o valor de millis()
}

if (sensorState == HIGH && tempor3 == 0) {  // se botão acionado
           tempor3 = 1; // inicia o temporizador
           temp3 = millis(); // passa à variável o valor de millis()
}

if (sensorState == HIGH && tempor4 == 0) {  // se botão acionado
           tempor4 = 1; // inicia o temporizador
           temp4 = millis(); // passa à variável o valor de millis()
}

if (millis() - tempo >= 1000 && temporizador == 1){ // após 1 segundo e temporizador
                                                                                 // ligado
           digitalWrite(rele1, HIGH); // aciona o LED
}

 if (millis() - temp1 >= 1200 && tempor1 == 1){ // após 1 segundo e temporizador
                                                                                 // ligado
           digitalWrite(rele2, HIGH); // aciona o LED
}

if (millis() - temp2 >= 1400 && tempor2 == 1){ // após 1 segundo e temporizador
                                                                                 // ligado
           digitalWrite(rele3, HIGH); // aciona o LED
}

if (millis() - temp3 >= 1600 && tempor3 == 1){ // após 1 segundo e temporizador
                                                                                 // ligado
           digitalWrite(rele4, HIGH); // aciona o LED
}

if (millis() - temp4 >= 1800 && tempor4 == 1){ // após 1 segundo e temporizador
                                                                                 // ligado
           digitalWrite(rele5, HIGH); // aciona o LED
}

if (millis() - tempo >= 2000 && temporizador == 1){ // após 2 seg. e temporizador
                                                                                 //desligado

     digitalWrite(rele1, LOW); // apaga o LED
     temporizador = 0; // desliga o temporizador
}

 if (millis() - temp1 >= 2200 && tempor1 == 1){ // após 2 seg. e temporizador
                                                                                 //desligado

     digitalWrite(rele2, LOW); // apaga o LED
     tempor1 = 0; // desliga o temporizador
}
if (millis() - temp2 >= 2400 && tempor2 == 1){ // após 2 seg. e temporizador
                                                                                 //desligado

     digitalWrite(rele3, LOW); // apaga o LED
     tempor2 = 0; // desliga o temporizador
}
if (millis() - temp3 >= 2600 && tempor3 == 1){ // após 2 seg. e temporizador
                                                                                 //desligado

     digitalWrite(rele4, LOW); // apaga o LED
     tempor3 = 0; // desliga o temporizador
}

if (millis() - temp4 >= 2800 && tempor4 == 1){ // após 2 seg. e temporizador
                                                                                 //desligado

     digitalWrite(rele5, LOW); // apaga o LED
     tempor4 = 0; // desliga o temporizador
}

}



bubulindo

O segundo código parece fazer o que pretendes... porque é que não está a funcionar?
This... is a hobby.

LucasST

Quando eu ligo o Arduino, na USB, ele fica acionando sozinho sem eu ao menos encostar no sensor.

bubulindo

Como ligaste o sensor? Que sensor é?
This... is a hobby.

LucasST

#4
Dec 03, 2018, 01:20 am Last Edit: Dec 03, 2018, 01:21 am by LucasST
Esse é o esquemático da ligação dos dois sensores Reflexivo Infravermelho E18-d80nk.



bubulindo

Interessante... o teu código apenas usa um sensor.

Experimenta isto no teu código:

Code: [Select]
pinMode(sensorPin, INPUT_PULLUP);

Adicionar o Pull Up pode resolver o que estás a ver... é estranho porque o sensor deveria manter o estado da saída sem pull up, mas experimenta.

Outra possibilidade se tiveres um multimetro será ver como é que o sensor reage com o ambiente à volta dele. Pode ser que o sensor realmente esteja a activar devido à luminosidade ou movimento. Sensores industriais deste tipo tem um ajuste para ser possível ajustar a sensibilidade, mas este suponho que não tenha isso. Dá uma vista de olhos.
This... is a hobby.

LucasST

Eu Inclui o   pinMode (sensorPin,INPUT_PULLUP) , e mudei a entrada digital do sensor , uma coisa que reparei foi que quando aproximo a mão ou algum objeto do sensor as saídas, digitais ficam acionando e desacionando até eu colocar a mão ou outro objeto próximo do sensor, ai essas saídas ficam acionadas e não desacionam,será que tem algum erro no código.?

Code: [Select]
#include <Crescer.h>
int sensorPin = 3;   
int rele1 =  30;
int rele2 =  23;
int rele3 =  24;
int rele4 =  25;
int rele5 =  26;   
unsigned long tempo = 0; // variável para receber valores do millis()
unsigned long temp1 = 0;
unsigned long temp2 = 0;
unsigned long temp3 = 0;
unsigned long temp4 = 0;
int temporizador = 0;// variável para indicar quando o temporizador está operando
int tempor1 = 0;
int tempor2 = 0;
int tempor3 = 0;
int tempor4 = 0;
int sensorState = 0;

void setup() {
  pinMode(rele1, OUTPUT);
  pinMode(rele2, OUTPUT);   
  pinMode(rele3, OUTPUT);
  pinMode(rele4, OUTPUT);
  pinMode(rele5, OUTPUT);
  pinMode(sensorPin,INPUT_PULLUP);   
}

void loop(){

sensorState = digitalRead(sensorPin); // lê o estado do botão

if (sensorState == HIGH && temporizador == 0) {  // se botão acionado
           temporizador = 1; // inicia o temporizador
           tempo = millis(); // passa à variável o valor de millis()


if (sensorState == HIGH && tempor1 == 0) {  // se botão acionado
           tempor1 = 1; // inicia o temporizador
           temp1 = millis(); // passa à variável o valor de millis()
}

if (sensorState == HIGH && tempor2 == 0) {  // se botão acionado
           tempor2 = 1; // inicia o temporizador
           temp2 = millis(); // passa à variável o valor de millis()
}

if (sensorState == HIGH && tempor3 == 0) {  // se botão acionado
           tempor3 = 1; // inicia o temporizador
           temp3 = millis(); // passa à variável o valor de millis()
}

if (sensorState == HIGH && tempor4 == 0) {  // se botão acionado
           tempor4 = 1; // inicia o temporizador
           temp4 = millis(); // passa à variável o valor de millis()
}

if (millis() - tempo >= 1000 && temporizador == 1){ // após 1 segundo e temporizador
                                                                                 // ligado
           digitalWrite(rele1, HIGH); // aciona o LED
}

 if (millis() - temp1 >= 1200 && tempor1 == 1){ // após 1 segundo e temporizador
                                                                                 // ligado
           digitalWrite(rele2, HIGH); // aciona o LED
}

if (millis() - temp2 >= 1400 && tempor2 == 1){ // após 1 segundo e temporizador
                                                                                 // ligado
           digitalWrite(rele3, HIGH); // aciona o LED
}

if (millis() - temp3 >= 1600 && tempor3 == 1){ // após 1 segundo e temporizador
                                                                                 // ligado
           digitalWrite(rele4, HIGH); // aciona o LED
}

if (millis() - temp4 >= 1800 && tempor4 == 1){ // após 1 segundo e temporizador
                                                                                 // ligado
           digitalWrite(rele5, HIGH); // aciona o LED
}

if (millis() - tempo >= 2000 && temporizador == 1){ // após 2 seg. e temporizador
                                                                                 //desligado

     digitalWrite(rele1, LOW); // apaga o LED
     temporizador = 0; // desliga o temporizador
}

 if (millis() - temp1 >= 2200 && tempor1 == 1){ // após 2 seg. e temporizador
                                                                                 //desligado

     digitalWrite(rele2, LOW); // apaga o LED
     tempor1 = 0; // desliga o temporizador
}
if (millis() - temp2 >= 2400 && tempor2 == 1){ // após 2 seg. e temporizador
                                                                                 //desligado

     digitalWrite(rele3, LOW); // apaga o LED
     tempor2 = 0; // desliga o temporizador
}
if (millis() - temp3 >= 2600 && tempor3 == 1){ // após 2 seg. e temporizador
                                                                                 //desligado

     digitalWrite(rele4, LOW); // apaga o LED
     tempor3 = 0; // desliga o temporizador
}

if (millis() - temp4 >= 2800 && tempor4 == 1){ // após 2 seg. e temporizador
                                                                                 //desligado

     digitalWrite(rele5, LOW); // apaga o LED
     tempor4 = 0; // desliga o temporizador
}

}

pksato

Ola,
Se ao aproximar a mão ou outro objeto os sensores ficam "louco", pode ser problema de falta do comum (terra, gnd, ground). Verifique se essa conexão esta bem feita.
Também e recomendado a colocação de um capacitor de 100nF bem próximo ao pinos de alimentação do sensor. Caso seja uma placa/modulo e de se esperar que esse capacitor já esteja presente.

Go Up