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;
}
}
Tags:
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
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por