Cómo conectar el sensor de temperatura con dos pantallas LED de 7 segmentos con Atmega16

No es una pregunta fácil de responder. En primer lugar, aclare si (1) el Atmega es un CI independiente o (2) construido como una plataforma de creación de prototipos (por ejemplo, un Arduino). Teóricamente, ambas versiones son iguales, quiero decir, un Arduino tiene todas las partes necesarias para funcionar correctamente y se construye fácilmente, mientras que la versión (1) necesita muchas más habilidades y experiencia para terminar. Veamos que necesitas.

1. Poder
Necesitarás 5V DC. 500 mA deberían ser suficientes. Si tiene un voltaje más alto, necesitará un regulador de voltaje, por ejemplo, un LF50CV o equivalente. Para la reducción de ruido, un condensador también puede ser útil.

2. controlador LED
Sugiero usar un registro de desplazamiento. Para dos piezas de LED de 7 segmentos, dos piezas del 74HC595 muy común y barato es lo suficientemente lejos. Por cierto, necesitará una resistore conectada en cada pin de segmentos. También prefiero MAX72xx, que puede manejar hasta 8 dígitos de pantallas de 7 segmentos directamente (sin resistencias), pero también necesita una programación algo complicada.

3. Sensor
No es un gran trato. Existen muchas soluciones comunes, desde termómetros directos (termorresistencias) hasta digitales (1 cable, I2C, etc.). La mejor solución debe elegirse en función de su objetivo, cómo y dónde va a utilizar el termómetro, ¿necesita una precisión absoluta o relativa?

4. Interfaz / programador
Necesitará una interfaz de conexión para conminar y programar el microcontrolador. Esta parte es mucho más fácil con una plataforma de creación de prototipos. En pocas palabras: si tiene que preguntar, debe aprender mucho para hacer esta parte.

5. Software
Finalmente, debe escribir un software para leer datos de temperatura sin procesar, convertirlos a valores legibles por humanos (por ejemplo, Celsius, Kelvin o Farenheit) y escribirlos en los registros de desplazamiento / pantallas LED. No es un gran problema con una plataforma de creación de prototipos, pero es algo complicado sin ella, ya que debe codificar casi todas las partes del “SO” para administrar el microcontrolador. De nuevo, mucho que aprender.

6. Todo lo demás
Para un trabajo adecuado y seguro, necesitará algunos componentes más, una PCB, una carcasa, una fuente de alimentación externa / interna, conectores, cables, resistencias, etc.

Finalmente. Mientras escribí esta descripción, pude construir lo que estamos hablando con un Arduino, incluida la codificación necesaria (supongamos que tengo todos los componentes necesarios). Si empiezo con un Atmel 16 “en bruto”, puede tomar alrededor de un día terminar, incluyendo todas las soldaduras, la construcción, la codificación y las pruebas (nuevamente, supongamos que tengo todos los componentes necesarios).

Necesita un conocimiento básico de la programación AVR para este proyecto. La parte principal de este proyecto es comprender la conversión analógica a digital (ADC) y la multiplexación de circuitos de siete segmentos. Visita para sensor de temperatura y proyecto de siete segmentos con AVR ATmega8

Espero que este código esté basado en ATmega8. También funcionará para ATmega16.

#include

#include

#include

int cuenta = 0;
int d0, d1, seg;
int delay = 5;
int ReadADC (uint8_t ch)
{
ADMUX = ch;
// Iniciar conversión única
ADCSRA | = (1 << ADSC);
// Espera a que se complete la conversión
while (! (ADCSRA & (1 << ADIF)));
ADCSRA | = (1 << ADIF);
retorno (ADC);
}
nulo initADC ()
{
ADMUX = (1 << REFS0);
ADCSRA = (1 << ADEN) | (1 << ADIE) | (1 << ADPS2) | (1 << ADPS1);
}
nulo segmento_código (int seg)
{
interruptor (seg)
{
caso 1:
PORTD = 0b11111001; // 1
_delay_ms (retraso);
descanso;
caso 2:
PORTD = 0b10100100; // 2
_delay_ms (retraso);
descanso;
caso 3:
PORTD = 0b10110000; // 3
_delay_ms (retraso);
descanso;
caso 4:
PORTD = 0b10011001; // 4
_delay_ms (retraso);
descanso;
caso 5:
PORTD = 0b10010010; // 5
_delay_ms (retraso);
descanso;
caso 6:
PORTD = 0b10000010; // 6
_delay_ms (retraso);
descanso;
caso 7:
PORTD = 0b11111000; // 7
_delay_ms (retraso);
descanso;
caso 8:
PORTD = 0b10000000; // 8
_delay_ms (retraso);
descanso;
caso 9:
PORTD = 0b10010000; // 9
_delay_ms (retraso);
descanso;
caso 0:
PORTD = 0b11000000; // 0
_delay_ms (retraso);
descanso;
}
}

int main ()
{
DDRC = 0b0000000;
DDRD = 0xFF; // PUERTO D como puerto de salida
DDRB = 0xFF; // PB0 y PB1 son pines de selección de segmento
initADC ();
int analogVal;
mientras que (1)
{
analogVal = ReadADC (0);
analogVal = analogVal / 2;
cuenta = analogVal;
// variable que contiene el décimo dígito de temperatura
d0 = cuenta% 10;
seg = d0;
PORTB = 0b11111101; // seleccionar segmento 0
segmento_código (seg); // coincide y muestra
// obtener el centésimo dígito de temperatura
d1 = cuenta / 10;
d1 = d1% 10;
seg = d1;
PORTB = 0b11111110; // seleccionar segmento 1
segmento_código (seg); // coincide y muestra
}
devuelve 0;
}

Visita para otros proyectos de microcontroladores AVR