
L'auteur a fait de ce thermomètre à LED à deux chiffres un cadeau d'anniversaire au fils de son ami. Il n'a que deux ans et il lit déjà les chiffres, mais pas les lettres. Maintenant, il peut apprendre seul la température à l'extérieur de la fenêtre. Le capteur du thermomètre est une puce DS18B20 fonctionnant selon le protocole 1-Wire, et le microcontrôleur est du type ATtiny84. La planche est carrée avec un côté de 25 mm, de taille comparable à une pièce de 50 pence. L'auteur prévoit de placer la planche dans un boîtier étanche et de la placer à l'extérieur de la fenêtre. L'indication s'allume brièvement toutes les 24 secondes et les piles CR2032 durent environ un an.
Le thermomètre fonctionne dans la plage de -19 à +99 ° C. Si nécessaire, les signes moins et un s'affichent simultanément dans l'ordre supérieur. Hors de portée, les lettres Lo ou Hi s'affichent. Vous pouvez «apprendre» à l'appareil à afficher des températures inférieures à -19 ° C en utilisant un segment avec un point comme moins.
Selon ce schéma, l'appareil était préalablement assemblé sur une planche à pain:

Toutes les sorties du microcontrôleur sont impliquées, le générateur d'horloge intégré de 8 MHz est utilisé. Le prototype était le suivant:

Le prototype utilisait DS18B20 dans le boîtier TO-92, ATtiny84 dans le boîtier PDIP et un indicateur 3621AS de 3,6 pouces. Ensuite, l'auteur a développé la carte à Eagle et l'a commandée à PCBway. Ici, le microcontrôleur est déjà dans le boîtier SOIC, le capteur est dans le boîtier µSOP, et les résistances, condensateurs et écran sont de taille 0805. Tout sauf l'écran est soudé par un sèche-cheveux Youyue 858D + à une température de 250 ° C.
Le prototype et la carte de circuit imprimé ont tous deux des indicateurs avec une anode commune. L'appareil est fabriqué en deux versions, avec des indicateurs de couleurs rouge et jaune. Rouge - sur KDPV, jaune - ici:

Un support pour une pile au lithium de 20 mm (celui dont la désignation commence par 20, c'est-à-dire 2016, 2025 ou 2032) est soudé à l'arrière:

Le micrologiciel est écrit de sorte que le microcontrôleur est en mode veille la plupart du temps et se réveille en cas d'interruption de la minuterie du chien de garde. Dans la mise en œuvre de l'interface 1-Wire,
ce temps de fonctionnement du même auteur est impliqué. Le compteur temporisé 16 bits du microcontrôleur fonctionnant à une fréquence de 1 MHz prend du temps:
void OneWireSetup () { TCCR1A = 0<<WGM10; // Normal mode TCCR1B = 0<<WGM12 | 2<<CS10; // Normal mode, divide clock by 8 }
Le sous-programme DelayMicros () fournit un retard d'un nombre spécifié de microsecondes, basé sur le registre de comparaison de sortie OCR0A:
void DelayMicros (unsigned int micro) { TCNT1 = 0; TIFR1 = 1<<OCF1A; OCR1A = micro; while ((TIFR1 & 1<<OCF1A) == 0); }
La routine DisplayTemperature () lit la valeur de température du capteur et l'affiche. Puisqu'il n'y a qu'un seul capteur sur le bus, vous pouvez ignorer le numéro de série et simplement donner la commande Skip ROM, après quoi toutes les commandes suivantes sont envoyées à n'importe quel périphérique:
void DisplayTemperature () { cli(); // No interrupts if (OneWireReset() != 0) { sei(); DisplayError(0); // Device not found } else { OneWireWrite(SkipROM); OneWireWrite(ConvertT); while (OneWireRead() != 0xFF); OneWireReset(); OneWireWrite(SkipROM); OneWireWrite(ReadScratchpad); OneWireReadBytes(9); sei(); // Interrupts if (OneWireCRC(9) == 0) { int temp = DataWords[0]; Display((temp+8)>>4); // Round to nearest degree } else DisplayError(1); // CRC error } }
En réponse à la demande, le capteur renvoie la valeur de température sous la forme d'un entier signé 16 bits en unités de 1/16 degré. Le nombre est arrondi au degré entier le plus proche et affiché en appelant la routine Display ().
Le sous-programme DisplayError () affiche les erreurs dans l'interaction du microcontrôleur avec le capteur sur le bus 1-Wire:
void DisplayError (int no) { Buffer[0] = Error; Buffer[1] = no; }
E0 - capteur non détecté, E1 - erreur CRC.
Les données d'indication dynamique sont extraites du tableau Buffer []. Par exemple, pour afficher le nombre 20, vous devez faire:
Buffer[0]=2; Buffer[1]=0;
Le compteur de minuterie 0 génère des interruptions à une fréquence de 125 Hz, ce qui est suffisant pour éliminer le scintillement. Tout d'abord, le minuteur est configuré dans setup () "
TCCR0A = 2<<WGM00; // CTC mode; count up to OCR0A TCCR0B = 0<<WGM02 | 4<<CS00; // Divide by 256 OCR0A = 250-1; // Compare match at 125Hz TIMSK0 = 0; // Interrupts initially off
La routine de gestion des interruptions correspondante pendant la comparaison appelle la routine DisplayNextDigit () et compte ensuite dans la direction opposée:
ISR(TIM0_COMPA_vect) { DisplayNextDigit(); Ticks--; }
Le sous-programme DisplayNextDigit () lit les données de la cellule correspondante dans le tableau Buffer [] et inclut les segments souhaités dans le bit d'affichage correspondant. Le programme utilise #define pour choisir entre un indicateur avec une cathode ou une anode commune. Si tous les segments sont allumés immédiatement lors de la mise sous tension, le type d'affichage ne correspond pas à celui spécifié dans le micrologiciel. Pour une cathode commune, le sous-programme doit être remplacé par ce qui suit:
void DisplayNextDigit () { PORTB = PORTB | 1<<digit; // Turn old digit off digit = digit ^ 1; // Toggle between 0 and 1 char segs = charArray[Buffer[digit]]; PORTA = segs; // Lit segments high PORTB = PORTB & ~(1<<digit); // Turn new digit on }
Enfin, la routine Display () produit un nombre à deux chiffres pour écrire dans le tableau Buffer []:
void Display (int n) { int units = n % 10; int tens = n / 10; int temp0 = tens; int temp1 = abs(units); if (tens < -1) {temp0 = Lo; temp1 = Lo+1; } else if (tens > 9) {temp0 = Hi; temp1 = Hi+1; } else if (tens == -1) temp0 = Minus1; else if ((tens == 0) && (units >= 0)) temp0 = Blank; else if ((tens == 0) && (units < 0)) temp0 = Minus; Buffer[0] = temp0; Buffer[1] = temp1; }
Il prend également en compte les cas d'affichage du moins avec l'unité dans l'ordre élevé, ainsi que les messages sur la température en dehors de la plage.
Pour une économie d'énergie maximale possible, les générateurs d'horloge ADC, USI et ADC sont désactivés et le mode veille PWR_DOWN est activé:
ADCSRA &= ~(1<<ADEN); // Disable ADC to save power PRR = 1<<PRUSI | 1<<PRADC; // Turn off clocks to USI & ADC to save power set_sleep_mode(SLEEP_MODE_PWR_DOWN);
Le programme principal affiche la température pendant des dixièmes de seconde, puis active le mode veille. Il s'est avéré qu'il s'agit du temps d'indication minimum, pratique pour la lecture. Deux secondes avant l'affichage de la température, le point clignote brièvement:
void loop () { Buffer[0] = DP; Buffer[1] = Blank; DisplayOn(12); WDDelay(6); // Sleep for 1 second Buffer[0] = Blank; Buffer[1] = DP; DisplayOn(12); WDDelay(6); // Sleep for 1 second DisplayTemperature(); DisplayOn(12); WDDelay(9); // Sleep for 8 seconds WDDelay(9); // Sleep for 16 seconds WDDelay(9); // Sleep for 24 seconds }
L'écran reste éteint pendant 24 secondes en raison de trois appels de la minuterie de surveillance pendant 8 secondes chacun. Avec l'indicateur allumé, la consommation de courant est de 6,6 mA, en mode veille - 4,7 μA, la consommation de courant moyenne est de 1/240 * 6,6 mA. La capacité typique de la cellule CR2032 est de 225 mAh, donc c'est suffisant pour (225 / 6,6) x 240/24 = 340 jours - un peu moins d'un an.
Les plages de température des composants sont les suivantes: microcontrôleur et indicateur - de -40 à + 85 ° C, résistances et condensateur - de -55 à +125 ° C, batteries - de -20 à +70 ° C. Un élément avec une plage de température étendue BR2032 fonctionnera dans la plage de -30 à +85 ° C.
Le microcontrôleur est rendu compatible Arduino avec
ce développement Spence Konde. Dans l'EDI, sélectionnez ATtiny24 / 44/84 dans la section ATTinyCore du menu Board. Ensuite, vous devez définir les options suivantes, sans prêter attention au reste:
Chip: "ATtiny84" Clock: "8 MHz (internal)" BOD: "BOD Disabled" Pin Mapping: "Clockwise (like damellis core)"
Le programme est téléchargé à l'aide du clip de test Pomona, placé au-dessus du microcontrôleur et connecté au programmateur SparkFun Tiny AVR. Vous devez d'abord sélectionner Burn Bootloader, puis Upload.
Liens: le
texte intégral du programme , le
forum et le programme sur GitHub , le
forum sur OSHpark .