pessoal tenho uma programaçao de nr-12 e gostaria de colocar um led piscando quando o botao emergencia e ou sensor for acionado, e quando o botao reset for acionado apaga o led, e quando o botao liga for acionado acende o led direto, e quando o botao desliga for acionado apaga o led

se alguem puder me ajudar ficarei grato

segue o codigo 

//#include <LiquidCrystal.h>

//LiquidCrystal lcd(13,11,5,4,3,2);

int liga = 5;
int desliga = 6;
int emergencia = 8;
int reset = 7;
int sensor = 9;
int motor = 10;
int estadoMotor = 0;
int estadoEmergencia = 1;
int liberaLcd = 0;
int liberaReset = 0;
int liberaSensor = 1;
int liberaEmergencia = 1;

void setup()
{
pinMode(liga,INPUT);
pinMode(desliga,INPUT);
pinMode(emergencia,INPUT);
pinMode(reset,INPUT);
pinMode(sensor,INPUT);
pinMode(motor,OUTPUT);
//lcd.begin(16,2);
//lcd.setCursor(0,0);
//lcd.print("SMART NR 12");
//lcd.setCursor(0,1);
//lcd.print("VERSAO 1.0");

// Serial.begin(9600);
// Serial.println("sistema de seguranca SMART NR 12 por MIGUEL");

}

void loop()
{
int acionaLiga = digitalRead(liga);
int acionaDesliga = digitalRead(desliga);
int acionaEmergencia = digitalRead(emergencia);
int acionaReset = digitalRead(reset);
int acionaSensor = digitalRead(sensor);

if (acionaLiga == LOW && estadoMotor == 0 && estadoEmergencia == 0)
{
digitalWrite(motor,HIGH);
delay(100);
estadoMotor = 1;
liberaReset = 1;
liberaSensor = 1;
liberaEmergencia = 1;
// digitalWrite(ledPin, HIGH);
// lcd.clear();
// lcd.setCursor(0,0);
// lcd.print("EQUIPAMENTO");
// lcd.setCursor(0,1);
// lcd.print("LIGADO");
// Serial.println("o motor foi acionado");
}

if (acionaDesliga == LOW && estadoMotor == 1 && liberaLcd == 0)
{
digitalWrite(motor,LOW);
delay(100);
estadoMotor = 0;
liberaReset = 1;
liberaSensor = 1;
liberaEmergencia = 1;
// digitalWrite(ledPin, LOW);
// lcd.clear();
// lcd.setCursor(0,0);
// lcd.print("EQUIPAMENTO");
// lcd.setCursor(0,1);
// lcd.print("DESLIGADO");
// Serial.println("o motor foi desacionado");
}

if (acionaEmergencia == LOW && liberaEmergencia == 1)
{

digitalWrite(motor,LOW);
delay(100);
estadoMotor = 0;
estadoEmergencia = 1;
liberaReset = 0;
liberaSensor = 1;
// lcd.clear();
// lcd.setCursor(0,0);
// lcd.print("BOTAO EMERGENCIA");
// lcd.setCursor(0,1);
// lcd.print("FOI ACIONADO");
// Serial.println("o botao de emergencia foi pressionado");
liberaEmergencia = 0;
}

if (acionaReset == LOW && acionaEmergencia == HIGH && liberaReset == 0)
{
estadoMotor = 0;
estadoEmergencia = 0;
liberaLcd = 0;
liberaEmergencia = 1;
liberaSensor = 1;
// lcd.clear();
// lcd.setCursor(0,0);
// lcd.print("EQUIPAMENTO");
// lcd.setCursor(0,1);
// lcd.print("LIBERADO");
liberaReset = 1;
// Serial.println("o equipamento esta liberado para o uso");
digitalWrite(ledPin, LOW);
}

if (acionaSensor == HIGH && liberaSensor == 1)
{
digitalWrite(motor,LOW);
delay(100);
estadoEmergencia = 1;
liberaLcd = 1;
liberaReset = 0;
liberaEmergencia = 1;
// lcd.clear();
// lcd.setCursor(0,0);
// lcd.print("EQUIPAMENTO");
// lcd.setCursor(0,1);
// lcd.print("BLOQUEADO");
// Serial.println("o equipamento foi bloqueado por seguranca");
liberaSensor = 0;
}
}

Exibições: 1476

Responder esta

Respostas a este tópico

Cara,  tá tarde e eu tô com sono, logo, não vou te passar o codigo todo aqui, mas o que você deseja é conseguido utilizando a função mills()  ou seja você grava o valor de mills em uma variável e manda ligar o led, dai fica mandando fazer comparação a cada ciclo do programa, e quando o mills() atual for igual ao valor setado por vocÊ , tu manda desligar o led.

   Em resumo, com mills você não paralisa o programa como o delay().

Olhe a minha resposta neste tópico, foi feito exatamente isso.

http://labdegaragem.com/forum/topics/ajuda-pra-piscar-esse-led?page...

entao pessoal eu ate fiz isso que vcs me disseram. usei o exemplo do blink without delay mas o led nao pisca ele so fica aceso nao sei pq talves nao estou sabendo onde colocar as variaveis no lugar certo dentro do sketch 

sera que vcs sabem onde coloca-las corretamente?

desde ja agradeço!!!

Tenho o mesmo problema, um raio de um botão, estou apanhando horrores com esse tal de millis, já li tudo quanto é material sobre o assunto, alem de trocentos videos, e todo mundo só cola o mesmo trecho do código, não consigo replicar ele no meu de forma funcional, pois entendi para que serve, mas não entendi o básico de seu funcionamento.


Minha duvida é a seguinte o millis está sempre rodando, quando declaro que "long previousMillis = 0; " ele reseta a contagem é isso? pois não atendi ao certo como eu volto o millis ao valor 0, até onde eu sei ele só zera em 50 dias.

O "long interval = 1000; " esse eu sei como funciona =).

Eu não vejo muito sentido nessa parte, mas entendo em partes :

"if (millis() - previousMillis > interval) {
previousMillis = millis(); "

pelo que entendi se millis menos o previus millis (declarado como 0) for menor que o intervalo que é 1000 eu chamo a segunda parte abaixo:

esta parte entendi mais ou menos:
if (value == LOW) value = HIGH;
else value = LOW;

se valor armazenado for (LOW), mude para (HIGH), senão mude para (LOW) novamente, até aqui beleza, fazer led piscar é sussa.

Mas digamos que eu utilize um IF com um intervalo de hora definido no RTC, para acionar um motor e ler sensor e imprimir o valor na serial para degub, como eu substituo o delay utilizando isso?

Toda vez que eu for declarar um delay e quiser colocar intervalos diferentes eu preciso
repetir todo esse código?

Para imprimir a hora no serial tambem posso utilizar o millis ou só Delay serve?

Tenho vários para retirar no meu código, pois a leitura dos sensores estão travando a leitura do botão em função dos travamentos gerados pelo delay.

Acho que minhas duvidas são essas, talvez contemplem as do José.

Abraços

Olá,

Então o "long previousMillis = 0; "  não é o millis, mas uma variavel do tipo long que serve para armazenar o valor do millis do instante onde ocorreu a ultima mudança de estado do pino.

Esta variavel nunca deve ser reiniciada, apenas atualizada na linha previousMillis = millis(); onde o previousmillis deixa de ser 0 e assume o valor do millis atual.

Desta forma na  próxima comparação "if (millis() - previousMillis > interval) 

previousMillis = millis(); " será verdadeira quando millis for maior que 2000 (2000-1000)>1000.  quando o previous millis será atualizado novamente.

Outra coisa, observe que o pino que deve piscar não esteja sendo escrito em outra linha do código, pois senão ele não irá piscar. 

Finalmente, um conselho, tentem entender o bem  funcionamento do  millis em uma aplicação simples, para depois conseguirem fazer as modificações em seus códigos cada vez mais complexos...

Abraços.

Wiechert, perfeito sempre tive duvidas quanto a essa contagem do millis. Contudo após fazer o desabafo acho que respondi minha própria pergunta, testei aqui e finalmente entendi como se aplica no código, de fato é simples, mas de uma olhada se estou correto. 

você declara as variaveis ex:

long previousMillis = 0; // último momento que o LED foi atualizado
long interval = 1000; // intervalo de 1 segundo
long interval2 = 2000; // intervalo de 2 segundos

a diferença do millis para o delay é que você declara a variável antes ao invés do final ex:

void hora ()
{ // imprime a hora na serial

if (millis() - previousMillis > interval) {

previousMillis = millis(); // resumo se millis for menor que o intervalo execute o que está abaixo

DateTime now = rtc.now();
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
Serial.println();
}

}

Wiechert, só não entendi como funciona quando eu quero que ele espere um tempo antes de encerrar a função, não sei se pode utiliza-lo conforme exemplo abaixo:

void ação () {
digitalWrite(motPin2, HIGH);
delay (variavel de  outra medição); 
if (millis() - previousMillis > interval2) {
previousMillis = millis(); // aguarde 2 segundos
}
}

eu substitui todos os delays do meu código exceto o do botão, visto que ele só vai ser chamado quando for apertado o mesmo, funcionou que uma beleza.

Para finalizar gostaria de saber se posso  reaproveitar o mesmo intervalo para outras funções, ou se devo criar um intervalo para cada função.

Abraços 

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço