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:



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/*------------------------------
  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);
  }
}

14 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
  2. Respostas
    1. Seria necessário alterações na função ReadTemp().
      A lógica para exibir o valor no display permanece.

      Excluir
  3. Respostas
    1. Boa tarde! Podemos conversar sobre projetos. Abraços!

      Excluir
    2. Estou tentando fazer um termômetro por aproximação com ESP32, display de 7 segmentos e 4 digitos e um sensor. Queria saber se pode me ajudar a fazer, ou se ja tem um projeto assim pronto.

      Excluir
    3. Qual seria a dúvida e/ou o problema que tem no projeto? Posso tentar ajudar sim.

      Excluir
    4. Eu não sei como executar. Sou novo nessa área. Preciso fazer um termômetro sensível a presença, só que com esp32, Display 7 segmentos e 4 digitos e sensor de presença. Se puder fazer um artigo com passo a passo, desde a montagem ate a programação me ajudaria muito. Não sei se é possivel?!

      Excluir
    5. Olá amigo, tem um contato seu para que podemos conversar e eu tirar as minhas duvidas?

      Excluir
    6. Pode passar por e-mail. fellipe.couto@yahoo.com.br

      Excluir
  4. buenas tardes.
    copie el programa y lo compile, no me funciono

    ResponderExcluir