Ir ao conteúdo

Posts recomendados

Postado

olá alguém pode me dizer 'como, quando e onde' usar a função "millis" nesse programa ? 
criei esse programa e descobri que o "delay" esta deixando meu programa com mal funcionamento (esta atrapalhando o giro do meu motor de passo),
e como sou iniciante não sei usar o "millis", por favor ajudem esse jovem aprendiz. Necessito de ajuda rápido :(.

programa:

/*livrarias usadas*/
#include "DHT.h"

/*pinos usados sensores*/
#define pinSensorA0 A0
#define pinSensorChuva A1

#define DHTPIN A3
#define ldr_pin_sensor_light A4

/*pinos usados Atuadores*/
#define pinSolenoide 4
#define COOLER 3
#define pinMotor 5

/*PINOS FIM DE CURSO */
#define sunroof_open_switch   11
#define sunroof_closed_switch 12

/*Declaração do Dht e do tipo*/
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

/*Variaveis globais*/
int pino_passo = 5;
int pino_direcao = 4;

/*direção do giro*/
int direcao = 1;

// Volta completa pra formar 1 giro
// Ajuste de acordo com o seu motor
int passos_motor = 700;

int sunroof_open_switch_value;
int sunroof_closed_switch_value;

void setup()
{
  pinMode(COOLER, OUTPUT);
  pinMode(pinSolenoide, OUTPUT);
  pinMode(pino_passo, OUTPUT);
  pinMode(pino_direcao, OUTPUT);
  pinMode(sunroof_open_switch, INPUT_PULLUP);
  pinMode(sunroof_closed_switch, INPUT_PULLUP);
  Serial.begin(9600);
  dht.begin();
}
void loop() {

  /*declaraçao de variavel*/
  float t = dht.readTemperature();
  float ht = analogRead(pinSensorA0);

  /*monitoramento Serial*/
  Serial.println("  ");
  Serial.print("TempDHT: ");
  Serial.print(t);
  Serial.println(" *C");
  Serial.print("  Atuador1:");
  Serial.println("     ");
  Serial.print(ht);
  Serial.print("  umidade:");
  Serial.print("  ");
  delay(500);// delay de 1 seg para atualizaçao de dados

  /*Monitoramento da´parte do motor e sensores do motor*/
  Serial.print("  SensorChuva:");
  Serial.print(analogRead(pinSensorChuva));
  Serial.print(" sensor chegada: ");
  Serial.print(analogRead(ldr_pin_sensor_light));
  Serial.print(" ");
  Serial.print("  Atuador:");
  Serial.println(" ");
  
/*Controle do teto*/
  void Controle_teto();

  if (analogRead(ldr_pin_sensor_light) >= 500 || analogRead(pinSensorChuva)  >  700)
  {
    // if the sunroof is not full open
    sunroof_open_switch_value = digitalRead(sunroof_open_switch);
    if (sunroof_open_switch_value == 1)    // switch not closed, prepare to run motor
    {
      Serial.println("TETO FECHADO");
      direcao = 0;
      digitalWrite(pino_direcao, direcao);
      for (int p = 0 ; p < passos_motor; p++)
      {
        sunroof_open_switch_value = digitalRead(sunroof_open_switch);
        if (sunroof_open_switch_value == 0)   // switch is closed, DO NOT make motor run
          break;
        digitalWrite(pino_passo, 1);
        millis(1000);
        digitalWrite(pino_passo, 0);
        millis(1000);
      }
    }
  }
  else
  {
    // if the sunroof is not full closed
    sunroof_closed_switch_value = digitalRead(sunroof_closed_switch);
    if (sunroof_closed_switch_value == 1)     // switch not closed, prepare to run motor
    {
      Serial.println("TETO ABERTO");
      direcao = 1;
      digitalWrite(pino_direcao, direcao);
      for (int p = 0 ; p < passos_motor; p++)
      {
        sunroof_closed_switch_value = digitalRead(sunroof_closed_switch);
        if (sunroof_closed_switch_value == 0)   // switch is closed, DO NOT make motor run
          break;
        digitalWrite(pino_passo, 1);
        millis(1000);
        digitalWrite(pino_passo, 0);
        millis(1000);
      }

      /*configuração do cooler*/
      void controle_Atuadores();

      if (t >= 25.00)
      {
        Serial.println("Cooler ON");
        digitalWrite(COOLER, LOW);
      }
      else
      {
        (t <= 24.00);
        Serial.println("Cooler OFF");
        digitalWrite(COOLER, HIGH);
      }

      /*configuração da solenoide*/
      if (ht > 600) {
        Serial.println ("Aberta solenoide");
        digitalWrite (pinSolenoide, HIGH);
      } else {
        Serial.println ("Fechadao solenoide");
        digitalWrite (pinSolenoide, LOW);
      }
    }
  }
}

 

Postado

Já que pino_passo e pino_direcao são variáveis globais que não mudam, o mais coerente é utilizar #define igual já está sendo utilizado constantemente.


millis é uma função que não aceita parâmetros e só possui retorno do tipo unsigned long, https://www.arduino.cc/reference/en/language/functions/time/millis/
Portanto millis não é para dar um delay, a função correta a se usar é void delay(unsigned long).
A cada digitalWrite não é necessário o uso de delay, é efetivo imediato.


As variáveis t e ht são recriadas a cada return loop(), portanto são danosas à performance e o recomendável é transformá-las em variável global.
Cada variável é recomendável inicializar a um determinado valor.


O Serial.print sequencial pode ser recriado para facilitar a legibilidade.
É necessário utilizar \t, \n, caracteres definidos no padrão C - não se deve utilizar '    ' em nenhum momento.
 

Código parcialmente atualizado e sem testes:

/*livrarias usadas*/
#include "DHT.h"

/*pinos usados sensores*/
#define pinSensorA0 A0
#define pinSensorChuva A1
#define ldr_pin_sensor_light A4

/*pinos usados atuadores*/
#define pinSolenoide 4
#define COOLER 3
#define pinMotor 5

/*PINOS FIM DE CURSO */
#define sunroof_open_switch     11
#define sunroof_closed_switch 12

/*Declaração do Dht e do tipo*/
#define DHTTYPE DHT11
#define DHTPIN A3
DHT dht(DHTPIN, DHTTYPE);

#define pino_passo 5
#define pino_direcao 4

/*Variaveis globais*/
int direcao = 1; /*direção do giro*/
float t = 0.0F;
float ht = 0.0F;

/*Volta completa pra formar 1 giro, ajuste de acordo com o seu motor*/
int passos_motor = 700;

int sunroof_open_switch_value = 0;
int sunroof_closed_switch_value = 0;

void setup(){
    Serial.begin(9600);
    pinMode(COOLER, OUTPUT);
    pinMode(pinSolenoide, OUTPUT);
    pinMode(pino_passo, OUTPUT);
    pinMode(pino_direcao, OUTPUT);
    pinMode(sunroof_open_switch, INPUT_PULLUP);
    pinMode(sunroof_closed_switch, INPUT_PULLUP);
    dht.begin();
}
void loop() {
    t = dht.readTemperature();
    ht = analogRead(pinSensorA0);

    /*monitoramento Serial*/
    Serial.print("\tTempDHT: " + t + "*C\n" + 
    "\tAtuador1: \t\t\n" + 
    ht + "\tUmidade: \t\n");
    delay(1000);// delay de 1 seg para atualizaçao de dados

    /*Monitoramento da´parte do motor e sensores do motor*/
    Serial.print("    SensorChuva:");
    Serial.print(analogRead(pinSensorChuva));
    Serial.print(" sensor chegada: ");
    Serial.print(analogRead(ldr_pin_sensor_light));
    Serial.print(" ");
    Serial.print("    Atuador:");
    Serial.println(" ");
    
/*Controle do teto*/
    void Controle_teto();

    if(analogRead(ldr_pin_sensor_light) >= 500 || analogRead(pinSensorChuva) > 700)
    {
        // if the sunroof is not full open
        sunroof_open_switch_value = digitalRead(sunroof_open_switch);
        if (sunroof_open_switch_value == 1)        // switch not closed, prepare to run motor
        {
            Serial.println("TETO FECHADO");
            direcao = 0;
            digitalWrite(pino_direcao, direcao);
            for (int p = 0 ; p < passos_motor; p++)
            {
                sunroof_open_switch_value = digitalRead(sunroof_open_switch);
                if (sunroof_open_switch_value == 0)     // switch is closed, DO NOT make motor run
                    break;
                digitalWrite(pino_passo, 1);
                delay(1000);
                digitalWrite(pino_passo, 0);
            }
        }
    }
    else
    {
        // if the sunroof is not full closed
        sunroof_closed_switch_value = digitalRead(sunroof_closed_switch);
        if (sunroof_closed_switch_value == 1)         // switch not closed, prepare to run motor
        {
            Serial.println("TETO ABERTO");
            direcao = 1;
            digitalWrite(pino_direcao, direcao);
            for (int p = 0 ; p < passos_motor; p++)
            {
                sunroof_closed_switch_value = digitalRead(sunroof_closed_switch);
                if (sunroof_closed_switch_value == 0)     // switch is closed, DO NOT make motor run
                    break;
                digitalWrite(pino_passo, 1);
                delay(1000);
                digitalWrite(pino_passo, 0);
            }

            /*configuração do cooler*/
            void controle_Atuadores();

            if (t >= 25.00)
            {
                Serial.println("Cooler ON");
                digitalWrite(COOLER, LOW);
            }
            else
            {
                (t <= 24.00);
                Serial.println("Cooler OFF");
                digitalWrite(COOLER, HIGH);
            }

            /*configuração da solenoide*/
            if (ht > 600) {
                Serial.println ("Aberta solenoide");
                digitalWrite (pinSolenoide, HIGH);
            } else {
                Serial.println ("Fechadao solenoide");
                digitalWrite (pinSolenoide, LOW);
            }
        }
    }
}

 

  • Obrigado 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!