AJUDA: Executar tarefa apenas uma vez

Oi, gente. Sou iniciante e estou fazendo um trabalho para escola, mas estou com um problema no código e não sei o que fazer.
Basicamente, quando o sensor de temperatura estiver acima de 27 o ar condicionado irá ligar. No caso, o ar condicionado será representado por um led (que tem que piscar só uma vez) e um piezo (que também tem que tocar só uma vez.
O problema é que, por causa do código estar dentro do loop, o led e o piezo não acende/toca só uma vez. Eles ficam sempre ligado.
Vou colocar o código completo aqui, mas ignorem as outras partes, pois o projeto tem mais de uma tarefa no mesmo código/arduino.

int led_branco = 13;
int led_verde = 12;
int rgb_verm = 11;
int rgb_azul = 10;
int rgb_verde = 9;
int pinPIR = 6;
int pinSensorTemp = A0;
int gCelsius = 0;
int piezo = 8;

void setup()
{

pinMode(pinSensorTemp, INPUT);
pinMode(led_branco, OUTPUT);
pinMode(led_verde, OUTPUT);
pinMode(rgb_verm, OUTPUT);
pinMode(rgb_azul, OUTPUT);
pinMode(rgb_verde, OUTPUT);
pinMode(pinPIR, INPUT);
pinMode(piezo, OUTPUT);

}

void loop()
{

int vez = 1;
//sensor de temperatura
int sensorTemp = analogRead(pinSensorTemp); //leitura do sensor
gCelsius = map(((analogRead(pinSensorTemp) - 20)*3.04), 0 , 1023, -40, 125);

byte s_mov = digitalRead(pinPIR);

if(s_mov > 0)
{
digitalWrite(led_branco, HIGH);
} else{
digitalWrite(led_branco, LOW);
}

 if(gCelsius > 27){
   digitalWrite(led_verde, HIGH);
   digitalWrite(piezo, HIGH);
}else{
   digitalWrite(led_verde, LOW);
   digitalWrite(piezo, LOW);
}

}

A parte que preciso de ajuda é na condição "if(gCelsius > 27)".
Quero que quando o sensor estiver acima de 27 o led e o piezo irá piscar/tocar só uma vez. (O led ficaria aceso por mais ou menos 0,2 segundos)

Espero que possam me ajudar. Obrigado.

Ola,
Voce postou o seu topico na secao de lingua inglesa.
Ou muda o texto para o ingles ou pede a algum moderador para mudar seu topico para o da lingua portuguesa.

E ao postar codigos use as tags clicando no icone </>

Hi,
You posted your topic in the English language section.
Or change the text to English or ask a moderator to change your topic to the Portuguese language.

And when posting codes use the tags by clicking on the </> icon

Ola, teste este codigo:

//https://forum.arduino.cc/t/ajuda-executar-tarefa-apenas-uma-vez/1006578

int led_branco = 13;
int led_verde = 12;
int rgb_verm = 11;
int rgb_azul = 10;
int rgb_verde = 9;
int pinPIR = 6;
int pinSensorTemp = A0;
int gCelsius = 0;
int piezo = 8;

void setup()
{

  pinMode(pinSensorTemp, INPUT);
  pinMode(led_branco, OUTPUT);
  pinMode(led_verde, OUTPUT);
  pinMode(rgb_verm, OUTPUT);
  pinMode(rgb_azul, OUTPUT);
  pinMode(rgb_verde, OUTPUT);
  pinMode(pinPIR, INPUT);
  pinMode(piezo, OUTPUT);

}

void loop()
{

  int vez = 1;
  //sensor de temperatura
  int sensorTemp = analogRead(pinSensorTemp); //leitura do sensor
  gCelsius = map(((analogRead(pinSensorTemp) - 20) * 3.04), 0 , 1023, -40, 125);

  byte s_mov = digitalRead(pinPIR);

  if (s_mov > 0)
  {
    digitalWrite(led_branco, HIGH);
  } else {
    digitalWrite(led_branco, LOW);
  }

  if (gCelsius > 27) 
  {
    if (digitalRead(led_verde) == LOW)    // <<<<<<<<<<<
    {
      digitalWrite(led_verde, HIGH);
      digitalWrite(piezo, HIGH);
    }
  } else {
    digitalWrite(led_verde, LOW);
    digitalWrite(piezo, LOW);
  }
}

Hey.
Thank you, but It didn't work.

Por quanto tempo o LED deve ficar aceso?

0.2 seconds

Teste este agora:

//https://forum.arduino.cc/t/ajuda-executar-tarefa-apenas-uma-vez/1006578

int led_branco = 13;
int led_verde = 12;
int rgb_verm = 11;
int rgb_azul = 10;
int rgb_verde = 9;
int pinPIR = 6;
int pinSensorTemp = A0;
int gCelsius = 0;
int piezo = 8;
bool flag = true;
void setup()
{

  pinMode(pinSensorTemp, INPUT);
  pinMode(led_branco, OUTPUT);
  pinMode(led_verde, OUTPUT);
  pinMode(rgb_verm, OUTPUT);
  pinMode(rgb_azul, OUTPUT);
  pinMode(rgb_verde, OUTPUT);
  pinMode(pinPIR, INPUT);
  pinMode(piezo, OUTPUT);

}

void loop()
{

  int vez = 1;
  //sensor de temperatura
  int sensorTemp = analogRead(pinSensorTemp); //leitura do sensor
  gCelsius = map(((analogRead(pinSensorTemp) - 20) * 3.04), 0 , 1023, -40, 125);

  byte s_mov = digitalRead(pinPIR);

  if (s_mov > 0)
  {
    digitalWrite(led_branco, HIGH);
  } else {
    digitalWrite(led_branco, LOW);
  }

  if (gCelsius > 27)
  {
    if (flag == true)    // <<<<<<<<<<<
    {
      digitalWrite(led_verde, HIGH);
      digitalWrite(piezo, HIGH);
      delay(200);                       // LED e buzzer por 0,2 seg
      digitalWrite(led_verde, LOW);
      digitalWrite(piezo, LOW);
      flag = false;
    }
  } else {
    flag = true;
    digitalWrite(led_verde, LOW);
    digitalWrite(piezo, LOW);
  }
}

yeahhh, it worked
thank you so much
if you can explain what you did I would be most grateful

Agora estamos na secao em portugues, mas meu teclado nao tem acentos kkkkk.

Eu estabeleci uma variavel boleana que inicia como verdadeira.
Ao atingir 27 entra no if e verifica como esta a variavel
Se ela for verdadeira entra no if e liga o LED, aguarda 200 mseg e desliga o LEDe faz a variavel falsa.
Como ele e' falsa, nao entra mais para ligar o LED.
Ao ficar abaixo de 27 entra no else e torna a variavel novamente verdadeira.
Nem precisa mais desligar o LED e o buzzer no else, mas esqueci de remover.

nossaa :))
muito obrigado

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