Botão de Emergência e leitura do botão

Boa noite galera!
estou com um problema na minha programação , estou com um projeto no qual necessito de algumas funções como botão de emergência ,meu problema é que eu tenho um modulo relé sendo acionado pelo pino13 só que para fazer a emergência antes de ir para o relé o fio que sai do pino13 passa por um botão de contato fechado que quando pressionado corta o comando do pino13 para o relé desligando o relé e é ai que esta o problema quando solto o botão de emergência o relé volta ligado e por motivo de segurança eu quero que quando o botão de emergência soltar o pino13 não retorne ligando direto o relé , alguém sabe como fazer isso quando a emergência for acionada corta o relé e quando solta a emergência o relé permanece desligado ate que eu volte o estado do botão de ligar para nível logico 0 e o pressione outra vez enviando agora nível logico 1

espero ter conseguido expressar meu problema de forma clara para que alguém consiga me ajuda desde já agradeço!

Olá,

Geralmente um botão de emergência depois de accionado permanece na posição de emergência até que o operador o accione novamente. Em alguns casos até é necessário usar uma chave para o desbloquear e voltar à posição de não emergência.

Dependendo da situação, algo a considerar seria colocar o botão de emergência a cortar a alimentação do circuito de controlo (Arduino) (isto funciona se ao iniciar o relé está desligado por omissão).

Independentemente do tipo de botão, uma maneira do microcontrolador saber que a emergência foi accionada será ligar uma entrada do Arduino à linha de alimentação da bobina do relé, depois do botão de emergência (isto se a alimentação do relé for a mesma do Arduino). Normalmente quando o relé está activo a tensão nesse ponto será baixa, deverá ter um nível lógico "zero". Ao accionar o botão de emergência (ou ao desligar o relé) a tensão nesse ponto será alta (nível lógico "um").

Depois no código é necessário monitorizar (por interrupção ou polling) se a entrada vem a "zero" quando o relé está accionado.

Não mencionas, mas no meu esquema adicionei um díodo de protecção para o indutor do relé e um transístor para interface de potência. Verifica se esse módulo tem esses componentes para evitar mau funcionamento/avaria...

Olá! tinyelectr

O meu botão de emergência já interrompe o acionamento do meu relê , Eu criei um supervisório onde controlo o acionamento do relê pelo PC definindo se ele vai ser ligado ou não ok !
então no meu supervisório existe um botão digital que se comunica com o Arduino quando acionado liga meu relê .
Se eu apertar meu botão de emergência ele vai corta a alimentação do rele que vem do pino13 que é uma saída , quando o botão de emergência é solto automaticamente o rele volta no estado de ligado porem por segurança eu preciso que quando o botão de emergência for pressionado corte a alimentação do relê que vem do pino13 e quanto eu libera essa emergência virando não emergência o arduino tem que identificar isso e não permitir que o pino13 mantenha ligado o rele precisando que no supervisório eu clique no botão para desligar e aperte para ligar novamente e ai sim o relé voltar aligar .

Eu tenho essa necessidade como já falei por motivo de segurança pois numa eventual falta de energia o PC e o arduino irão ser desligado e como no supervisório o ultimo comando foi para ligar na volta da energia quando o arduino for alimentado novamente o relê voltara ligado e eu preciso eliminar esse risco , alguma ideia ou código que eu possa incorpora ao meu ???

Pelo que entendi, seu pino 13 que aciona o relé e o botão de emergência (BE) corta esse condutor. Nesse caso, porque você não coloca algum digitalRead lendo essa mesma linha depois do BE. Assim, você vai ler que ele foi acionado e pode fazer alguma ação com essa informação, como digitalWrite(13, LOW).

falkenauge

Esse botão de emergência só corta o acionamento do Relê pelo pino13 e o pino 8 faz a leitura da da falha

esse é o codigo

#include <Modbusino.h>

const int TC01 = 13;
const int TC02 = 12;

//TC01
int falha1 = 0;
int falha2 = 0;
int emergencia1 = 8;
int desalinhamento1 = 7;
int sensor1 = 4;
int giro1 = 0;

//TC02
int falha3 = 0;
int falha4 = 0;
int emergencia2 = 6;
int desalinhamento2 = 5;

int motor1;
int motor2;
ModbusinoSlave modbusino_slave(1);

uint16_t tab_reg[10];

void setup() {
pinMode(TC01, OUTPUT);
pinMode(TC02, OUTPUT);
pinMode(emergencia1 , INPUT);
pinMode(emergencia2 , INPUT);
pinMode(desalinhamento1 , INPUT);
pinMode(desalinhamento2 , INPUT);
pinMode(sensor1 , INPUT);

modbusino_slave.setup(9600);
Serial.begin(9600);
}

void loop() {
modbusino_slave.loop(tab_reg, 10);

motor1 = tab_reg[0];
motor2 = tab_reg[1];
tab_reg[5] = falha1;
tab_reg[6] = falha2;
tab_reg[7] = falha3;
tab_reg[8] = falha4;
tab_reg[9] = giro1;

//TC01
falha1 = digitalRead(emergencia1);

if (falha1 == LOW) {
digitalWrite(motor1, LOW);
Serial.println("LIGADO!!");
} else {
digitalWrite(motor1, HIGH);
Serial.println("EMERGENCIA!!");
}

falha2 = digitalRead(desalinhamento1);

if (falha2 == LOW) {
digitalWrite(motor1, LOW);
Serial.println("LIGADO!!");
digitalWrite(motor1, HIGH);
Serial.println("DESALINHAMENTO!!");
}

giro1 = digitalRead(sensor1);

if (giro1 == LOW) {
digitalWrite(motor1, LOW);
Serial.println("LIGADO!!");
digitalWrite(motor1, HIGH);
Serial.println("SENSOR DE GIRO!!");
}

// TC02
falha3 = digitalRead(emergencia2);
if (falha3 == LOW) {
  digitalWrite(motor2, LOW);
  Serial.println("LIGADO!!");
} else {
  digitalWrite(motor2, HIGH);
  Serial.println("EMERGENCIA!!");
}


falha4 = digitalRead(desalinhamento2);

if (falha4 == LOW) {
  digitalWrite(motor2, LOW);
  Serial.println("LIGADO!!");
  digitalWrite(motor2, HIGH);
  Serial.println("DESALINHAMENTO!!");
}


digitalWrite(TC01 , 1 - motor1);
digitalWrite(TC02 , 1 - motor2);

}

@cvaz001, favor colocar seu código na formatação adequada. A formatação bem feita ajuda a comunidade a entender o seu problema.
Exemplo:

digitalWrite(TC01 , 1 - motor1);
digitalWrite(TC02 , 1 - motor2);

Basta colocar três acentos graves (`) seguidos antes e depois do código.

O pino8 lê o acionamento do relé, pino 13, isso?

Você escreve digitalWrite(motor1, LOW); em várias parte do código, isso está correto? Não seria a situação que caso não existam falhas que o motor deve ser ligado? Porque aparentemente se a falha1 existir ele desligará o motor, mas se não tiver a falha dois ele vai ligá-lo novamente.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.