Tabla de contenido:
- Suministros
- Paso 1: Descripción del Funcionamiento
- Paso 2: Circuitos
- Paso 3: Programación
- Paso 4: Conclusiones
- Paso 5: Enlaces Y Lecturas Relacionados
Video: Attiny85 Termómetro OLED: 5 Pasos
2024 Autor: John Day | [email protected]. Última modificación: 2024-01-30 08:41
Este proyecto consiste en un termómetro pequeño y simple que muestra la temperatura actual, la humedad relativa y el índice de temperatura. Puede realizar con un ATmega328p, pero lo interesante de esta versión es utilizar un ATtiny85 cuyo tamaño y consumo de batería convergen en un dispositivo pequeño y portátil.
A continuación describiré el funcionamiento, seguido mostraré el circuito y finalizaré con el programa y algunos comentarios sobre el proyecto en general.
Suministros
1 x ATtiny85
1 x Arduino UNO / PRO / etc (programador del ATtiny)
1 x 128x64 pantalla I2C OLED
1 x Sensor de temperatura DHT22
1 x Resistencia 4.7MOhm (1 / 4W)
1 x Condensador electrolítico 0.1uF
1 x Fuente de 3.3V - 5V 10+ x Jumpers
Paso 1: Descripción del Funcionamiento
El objetivo del proyecto es mostrar los tres valores anteriormente mencionados en la pantalla OLED, además, como objetivo secundario, e incluido el uso de la librería sleep.he interrumpt.h para activar el termómetro manualmente y así reducir el consumo para extender la vida de la batería.
Nuestro programa se guiará por el siguiente proceso: Leer temperatura -> Mostrar temperatura en pantalla -> Apagar ATtiny -> Reiniciar al presionar botón.
Para cada uno de estos pasos dejaremos la mayor parte del trabajo a las librerías ya existentes, por lo que no reinventaremos la rueda. La librería DHT sensor library de Adafruit (disponible en el IDE) y Tiny4kOLED de datacute que descargaremos de Github ya que, al parecer, el autor original es datacute y, además, necesitaremos modificarla un poco luego.
El método de reinicio puede ser tanto un botón como dos placas metálicas que se tocan para encender el equipo. En lo personal, encontró la opción de las placas metálicas más interactivas.
Paso 2: Circuitos
En la primer imagen se encuentra el circuito que requiere para programar el ATtiny85. Primeramente se debe programar al Arduino (el capacitor debe estar desconectado) con el sketch ArduinoISP, que se encuentra en Archivos -> Ejemplos -> 11. ArduinoISP. Una vez hecho esto se debe colocar el capacitor para evitar que nuestro Arduino se reinicie al programar el ATtiny85.
El ATtiny se puede alimentar directamente del Arduino. En caso de utilizar una fuente de poder como una batería es necesario conectar la masa (GND) del Arduino y el ATtiny85.
Colocar un botón entre el pin 13 del Arduino y el 2 del ATtiny puede facilitar el hacer pruebas ya que la pantalla no puede estar conectada cuando se programa al ATtiny.
Como se observa en las imágenes. El pin SDA del ATyiny es el 0 y el SCL / CLK es el 2. Nuestro DHT está conectado en el pin 4.
Paso 3: Programación
Primeramente, debemos seleccionar "Arduino as ISP" como el programador. Si aún no han instalado la placa para el ATtiny, recomiendo instalar la placa ATtinyCore de Spence Konde. Esta placa no me generó ningún problema de compilación durante la realización del proyecto.
La placa debe estar configurada sin BOD, con un reloj de 8MHz interno y sin OptiBoot. Si utilizamos 1MHz la comunicación por I2C no es estable y a 16MHz con cristal externo, además de perder dos pines digitales, el consumo energético aumenta considerablemente.
Cabe destacar que modificó un archivo en la librería Tiny4kOLED. El archivo modificado es "font8x16.h" y he cambiado la línea 117 por el siguiente código con el fin de cambiar el símbolo ~ por ° que usaremos en ° C.
0x00, 0x06, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
A continuación ajunto el sketch necesario para el proyecto.
#include #include #include #include #define I_PINB PCINT3 #define I_PIN PB3 #define I_VECTOR PCINT0_vect #define adc_disable () (ADCSRA & = ~ (1 << aden)) disable = "" adc = "" convertidor #define DHTPIN 4 #define DHTTYPE DHT22 DHT dht (DHTPIN, DHTTYPE); const uint8_t ancho = 128; const uint8_t altura = 64; bool volátil convertido = falso; / * * * Manejador de interrupciones * * / ISR (PCINT_VECTOR) {// la interrupción siempre se recupera de la suspensión if (digitalRead (I_PIN) == HIGH) {turn = true; // establece la bandera para volver a dibujar la pantalla}} void setup () {cli (); // apaga las interrupciones PCMSK | = (1 << I_PINB); GIMSK | = (1 << PCIE); pinMode (I_PIN, ENTRADA); sei (); // activa las interrupciones adc_disable (); // ahorra energía apagando el convertidor set_sleep_mode (SLEEP_MODE_PWR_DOWN); // establece el tipo de sueño en sueño profundo oled.begin (width, height, sizeof (tiny4koled_init_128x64br), tiny4koled_init_128x64br); // iniciar el objeto oled oled.setFont (FONT8X16); // esta fuente se ve mejor que la otra drawScreen (); oled.on (); retraso (2000); dht.begin (); convertido = verdadero; // marca para dibujar la pantalla} void sleep () {sleep_enable (); sleep_cpu (); } bucle vacío () {si (girado) {cli (); // apaga las interrupciones oled.on (); float h = dht.readHumidity (); // lectura falsa para restablecer dht cache delay (2200); // espera dht para cargar h = dht.readHumidity (); flotar t = dht.readTemperature (); flotar i = dht.computeHeatIndex (t, h, falso); oled.setCursor (55, 1); oled.print (t); oled.print ("~ C"); oled.setCursor (55, 3); oled.print (h, 0); oled.print ("%"); oled.setCursor (55, 5); oled.print (i); oled.print ("~ C"); // el símbolo ~ se cambió en la biblioteca para que pareciera un símbolo de ° grado de retraso (5000); // mostrar durante 5 segundos oled.off (); convertido = falso; sei (); // adjuntar interrupciones de nuevo} sleep (); // siempre duerme al final} void drawScreen () {// dibuja el marco y el texto principal para (uint8_t y = 0; y <8; y ++) {oled.setCursor (0, y); oled.startData (); para (uint8_t x = 0; x <128; x + = 2) {oled.sendData (0b10101010); oled.sendData (0b01010101); } oled.endData (); } oled.setCursor (0, 0); oled.startData (); oled.sendData (0b11111111); oled.repeatData (0b00000101, ancho - 2); oled.sendData (0b11111111); oled.endData (); para (uint8_t y = 1; y <(altura - 8) / 8; y ++) {oled.setCursor (0, y); oled.startData (); oled.sendData (0b11111111); oled.repeatData (0b00000000, ancho - 2); oled.sendData (0b11111111); oled.endData (); } oled.setCursor (0, (altura - 8) / 8); oled.startData (); oled.sendData (0b11111111); oled.repeatData (0b10100000, ancho - 2); oled.sendData (0b11111111); oled.endData (); oled.setCursor (4, 1); oled.print ("Temp:"); oled.setCursor (4, 3); oled.print ("Hum:"); oled.setCursor (4, 5); oled.print ("Sens:"); }
Paso 4: Conclusiones
A pesar de su tamaño insignificante, el ATtiny85 ofrece una amplia gama de aplicaciones en las que podemos implementar este controlador de bajo costo sin perder funcionalidad. Personalmente no esperaba que fuera posible incluir el control de pantalla y de sleep juntos debido a las limitaciones de memoria. Dichozamente, el programa ha entrado en nuestro ATtiny
Existen otras librerías para las pantallas OLED. La librería GFX de Adafruit no me beneficiará compilar por lo que decidí buscar algo precisamente para el ATtiny, pero existen otras librerías y soluciones que son interesantes de explorar
El consumo del dispositivo es muy bajo. Considerando un uso constante, medido y estimado la vida para una batería de 3000mAh (NiMH o LiIon) en 500 días. El podría reducirse aún más desconectando la pantalla y el consumo directamente desde un pin del ATtiny, pero no lo he considerado necesario
Según Technoblogy.com, el ATtiny puede operar en un consumo tan bajo como el mostrado en la primera imagen, pero en este proyecto se obtuvo un consumo mayor que corresponde a la segunda imagen. El consumo de la batería continúa siendo lo suficientemente bajo como para ser un proyecto factible
Paso 5: Enlaces Y Lecturas Relacionados
www.technoblogy.com/show?KX0&fbclid=IwAR0qu…
github.com/SpenceKonde/ATTinyCore
www.electroschematics.com/am2302-dht22-dat…
ww1.microchip.com/downloads/en/DeviceDoc/A…
embeddedilstts.com/2016/06/06/attiny85-i…
www.instructables.com/id/ATtiny85-Interrup…
www.technoblogy.com/show?WNM
www.technoblogy.com/show?2F5D
Recomendado:
Termómetro luminoso - Luz de jardín vitaminada (eNANO De Jardin): 6 pasos
Termómetro luminoso - Luz de jardín vitaminada (eNANO De Jardin): Luz de jardín vitaminada con arduino NANO y un sensor de temperatura BMP180.Nuestra humilde luz de jardín tendrá un poder secreto: podrá indicar la temperatura exterior mediante un código de colores y parpadeando. Su funcionamiento es el siguiente: I
ATtiny85 Reloj de seguimiento de actividad vibrante portátil y programación ATtiny85 con Arduino Uno: 4 pasos (con imágenes)
ATtiny85 Reloj de seguimiento de actividad con vibración portátil y programación ATtiny85 con Arduino Uno: ¿Cómo hacer el reloj de seguimiento de actividad portátil? Este es un dispositivo portátil diseñado para vibrar cuando detecta estancamiento. ¿Pasas la mayor parte de tu tiempo en la computadora como yo? ¿Estás sentado durante horas sin darte cuenta? Entonces este dispositivo es f
Termómetro de habitación de bricolaje con un módulo OLED: 7 pasos (con imágenes)
Termómetro de habitación de bricolaje con un módulo OLED: aprendemos a construir un termómetro de habitación con el sensor DS18B20 y un módulo OLED. Usamos un Piksey Pico como placa principal, pero el boceto también es compatible con las placas Arduino UNO y Nano, por lo que también puede usarlas
Use el teléfono inteligente como termómetro sin contacto / termómetro portátil: 8 pasos (con imágenes)
Use el teléfono inteligente como termómetro sin contacto / termómetro portátil: mide la temperatura corporal con un termómetro sin contacto / sin contacto como una pistola térmica. Creé este proyecto porque Thermo Gun ahora es muy caro, así que debo buscar una alternativa para hacer bricolaje. Y el propósito es hacer con una versión de bajo presupuesto. SuministrosMLX90614Ardu
Termómetro infrarrojo sin contacto basado en Arduino - Termómetro basado en infrarrojos con Arduino: 4 pasos
Termómetro infrarrojo sin contacto basado en Arduino | Termómetro basado en infrarrojos con Arduino: Hola chicos, en este instructivo, haremos un termómetro sin contacto con arduino, ya que a veces la temperatura del líquido / sólido es demasiado alta o demasiado baja y luego es difícil hacer contacto con él y leer su temperatura entonces en ese escenario