14 de novembro de 2017

Termômetro Ambiente

Um termômetro simples com um display de 7 segmentos / 4 dígitos, e um sensor de temperatura LM35.

Nas fotos, o projeto está montado utilizando um Arduino Pro Mini, em uma uma protoboard de 400 pontos.
O display é o modelo YSD-439AR6B-35 de 16 terminais com anodo comum.

Segue o esquema do display, do circuito, e o código-fonte:




/*------------------------------
  Programa : TERMÔMETRO AMBIENTE
  Autor    : Fellipe Couto
  Data     : 13/11/2017
  ------------------------------*/

/*----- VARIÁVEIS DO DISPLAY -----*/
const int displayLed[7] = {2, 3, 4, 5, 6, 7, 8}; //Pinos dos segmentos do display (A, B, C, D, E, F, G). Modelo: YSD-439AR6B-35
const int d[4] = {9, 10, 11, 12};  //Pinos dos digitos do display
const int decimal = 13; //Pino do ponto decimal do display

/*----- VARIÁVEIS DO LM35 -----*/
const int lm35 = 0; //Sensor LM35 na entrada analógica A0. Pin 1 - Vcc / Pin 2 - Sinal / Pin 3 - GND
const float celsiusBase = 0.4887585532746823; //Base de conversão para graus celsius. Leitura: ValorLido * ((5/1023) * 100)

/*----- VARIÁVEIS -----*/
unsigned long previousMillis = 0;
int interval = 5000;
float temp = 0;

/*----- SETUP -----*/
void setup() {
  for (int i = 0; i < 7; i++) {
    pinMode(displayLed[i], OUTPUT); //Configura os pinos dos segmentos do display como saída
    if (i < 4) {
      pinMode(d[i], OUTPUT); //Configura os pinos dos digitos do display como saída
    }
  }
  pinMode(decimal, OUTPUT);
  temp = ReadTemp();
}

/*----- LOOP PRINCIPAL -----*/
void loop() {
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    temp = ReadTemp();
  }
  DisplayTemperature(temp);
}

/*----- LEITURA SIMPLES DO SENSOR LM35 -----*/
float ReadTemp() {
  float temp = analogRead(lm35) * celsiusBase;
  return temp;
}

/*----- EXIBE A TEMPERATURA NO DISPLAY -----*/
void DisplayTemperature(float num) {
  String aux;
  int n[4];
  int number[11][7] = {
    {0, 0, 0, 0, 0, 0, 1}, //ZERO
    {1, 0, 0, 1, 1, 1, 1}, //UM
    {0, 0, 1, 0, 0, 1, 0}, //DOIS
    {0, 0, 0, 0, 1, 1, 0}, //TRES
    {1, 0, 0, 1, 1, 0, 0}, //QUATRO
    {0, 1, 0, 0, 1, 0, 0}, //CINCO
    {1, 1, 0, 0, 0, 0, 0}, //SEIS
    {0, 0, 0, 1, 1, 1, 1}, //SETE
    {0, 0, 0, 0, 0, 0, 0}, //OITO
    {0, 0, 0, 1, 1, 0, 0}, //NOVE
    {0, 0, 1, 1, 1, 0, 0}  //GRAUS
  };

  if (num < 10) {
    aux += "0" + String(num);
  } else {
    aux += String(num);
  }

  n[0] = aux.substring(0, 1).toInt();
  n[1] = aux.substring(1, 2).toInt();
  n[2] = aux.substring(3, 4).toInt();
  n[3] = 10;

  for (int p = 0; p < 4; p++) { //Acende um digito por vez.
    for (int i = 0; i < 4; i++) { //Apaga todos os digitos
      digitalWrite(d[i], LOW);
    }
    for (int i = 0; i < 7; i++) { //Acende os segmentos do display referente ao digito
      digitalWrite(displayLed[i], number[n[p]][i]);
    }
    if (p == 0 && n[0] == 0) { //Primeiro digito acende somente se for diferente de zero
      digitalWrite(d[p], HIGH); //Apaga a posição do digito.
    } else {
      digitalWrite(d[p], LOW); //Acende a posição do digito.
    }
    if (p == 1) { //Ponto decimal acende somente com o digito dois
      digitalWrite(decimal, LOW);
    } else {
      digitalWrite(decimal, HIGH);
    }
    delay(1);
  }
}

3 comentários:

  1. Eu fiz o código fonte mais agora não sei ligar os display, manda pra mim um esquema de ligação

    ResponderExcluir
    Respostas
    1. Bom dia!
      Com display de dois dígitos, não poderá exibir o valor após o ponto decimal e símbolo de graus (º).
      Será necessário alterar o função DisplayTemperature() retirando n[2] e n[3]. O esquema de ligação do display deve ser o mesmo, porém com apenas 2 dígitos. Deve-se verificar se é anôdo comum ou catado comum. O display que utilizei é modelo anôdo comum.
      Abraços!

      Excluir