Ir ao conteúdo
  • Cadastre-se

C {iniciante} Como, e onde usar "millis()" nesse programa


Boladoloko

Posts recomendados

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);
      }
    }
  }
}

 

Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!