Etti segmentli ko'rsatkich. Arduino va to'rt xonali etti segmentli ko'rsatkich 4 raqamli ko'rsatkich va Arduino

7-segmentli displeyni Arduino-ga ulash Arduino platangizni yaxshiroq bilish uchun boshlang'ich darajadagi ajoyib loyihadir. Lekin buni qilish juda oson. Shuning uchun biz vazifani biroz murakkablashtiramiz va to'rt xonali etti segmentli ko'rsatkichni bog'laymiz.



Bunday holda, biz umumiy katodli to'rt raqamli LED ko'rsatkich modulidan foydalanamiz.


Ko'rsatkich modulidagi har bir segment multiplekslangan, ya'ni u bitta anodli ulanish nuqtasini o'z zaryadsizlanishining boshqa segmentlari bilan baham ko'radi. Va moduldagi to'rtta bitning har biri umumiy katod bilan o'z ulanish nuqtasiga ega. Bu har bir raqamni mustaqil ravishda yoqish yoki o'chirish imkonini beradi. Bundan tashqari, ushbu multiplekslash usuli mikrokontrollerga o'ttiz ikkita o'rniga faqat o'n bir yoki o'n ikkita pinni ishlatishga imkon beradi.



Ko'rsatkichning LED segmentlari mantiqiy pinda 5 V dan quvvatlanganda oqim cheklovchi rezistorlarni ulashni talab qiladi. Qarshilik qiymati odatda 330 dan 470 ohmgacha olinadi. Bundan tashqari, qo'shimcha oqimni ta'minlash uchun tranzistorlardan foydalanish tavsiya etiladi, chunki mikrokontrollerning har bir piniga maksimal 40 mA quvvat berishi mumkin. Agar siz barcha tushirish segmentlarini (8-raqam) yoqsangiz, joriy iste'mol bu chegaradan oshib ketadi. Quyidagi rasmda oqim cheklovchi rezistorli tranzistorlar yordamida to'rt xonali etti segmentli indikator uchun ulanish diagrammasi ko'rsatilgan.



Quyida indikatorni Arduino pinlariga ulash uchun diagrammalar keltirilgan. Bu erda BC547 bipolyar npn tranzistorlari qo'llaniladi. A0 platasining kirishiga ulangan 10 KOhm potentsiometr indikatorda ko'rsatilgan qiymatni 0 dan 1023 gacha o'zgartirishga imkon beradi.




Arduino platasida D2-D8 raqamli chiqishlari bu holda "a" dan "g"gacha bo'lgan segmentlarni boshqarish uchun ishlatiladi va D9-D12 raqamli chiqishlari D0 dan D3 gacha bo'lgan bitlarni boshqarish uchun ishlatiladi. Shuni ta'kidlash kerakki, bu misolda nuqta ishlatilmaydi, lekin pastdagi eskizda undan foydalanish mumkin. Arduino platasining D13 pinlari nuqta segmentini boshqarish uchun ajratilgan.



Quyida Arduino platasi yordamida to'rt xonali segment ko'rsatkichini boshqarishga imkon beruvchi kod mavjud. Unda sonlar massivi ikkilik shaklda 0 dan 9 gacha raqamlar kodlarini belgilaydi. Ushbu eskiz umumiy katodli ikkala ko'rsatkichni (sukut bo'yicha) va umumiy anodli ko'rsatkichlarni qo'llab-quvvatlaydi (buni amalga oshirish uchun siz eskiz oxirida bitta qatorni izohlashingiz kerak).


// A dan G gacha bo'lgan segmentlarni (va nuqtalarni) ifodalovchi bitlar 0-9 raqamlari uchun int raqam = ( //ABCDEFG /dp B11111100, // 0 B01100000, // 1 B11011010, // 2 B11110010, // 3 B010, // 110, // 4 B10110110, // 5 B00111110, // 6 B11100000, // 7 B11111110, // 8 B11100110, // 9); // nuqta va har bir segment uchun pinlar // DP,G,F,E,D,C,B,A const int segmentPins = ( 13,8,7,6,5,4,3,2 ); const int nbrDigits= 4; // LED indikatorining raqamlari soni // raqamlar 0 1 2 3 const int digitPins = ( 9,10,11,12 ); void setup() ( for(int i=0; i< 8; i++) { pinMode(segmentPins[i], OUTPUT); // устанавливаем выводы для сегментов и точки на выход } for(int i=0; i < nbrDigits; i++) { pinMode(digitPins[i], OUTPUT); } } void loop() { int value = analogRead(0); showNumber(value); } void showNumber(int number) { if(number == 0) { showDigit(0, nbrDigits-1) ; // отображаем 0 в правом разряде } else { // отображаем значение, соответствующее каждой цифре // крайняя левая цифра 0, правая на единицу меньше, чем число позиций for(int digit = nbrDigits-1; digit >= 0; raqam--) ( if(raqam > 0) ( showDigit(raqam % 10, raqam) ; raqam = raqam / 10; ) ) ) ) // Belgilangan raqamni 7-segmentli indikatorning ushbu raqamida ko'rsatish void showDigit(int) raqam, int raqam) ( digitalWrite(digitPins, HIGH); for(int segment = 1; segment< 8; segment++) { boolean isBitSet = bitRead(numeral, segment); // isBitSet будет истинным, если данный бит будет 1 // isBitSet = ! isBitSet; // опционально // раскомментируйте опциональную строчку выше для индикатора с общим анодом digitalWrite(segmentPins, isBitSet); } delay(5); digitalWrite(digitPins, LOW); }

Ishchilarning iltimosiga ko'ra, men 7 segmentli LED indikatori deb ataladigan ajoyib narsa haqida gapirishga qaror qildim. Birinchidan, bu nima? Gap shundaki. Bu bitta raqam, ikkita raqam ham bor, uch va to'rtta raqam. Men yana oltita raqamni ko'rdim. Har bir raqamdan keyin kasr nuqtasi mavjud. Agar to'rtta raqam bo'lsa, ko'pincha ikkinchi raqamdan keyin vaqtni ko'rsatishda soniyalarni ko'rsatadigan ikki nuqtani topishingiz mumkin. Bezlar bilan shug'ullangandan so'ng, sxemani o'rganishga o'taylik. Baribir dinamik displey nima va u nima uchun kerak? Ko'rsatkich 7 segmentli bo'lgani uchun raqamni ko'rsatish uchun faqat 7 segment ishlatiladi. Ular har doim lotin harflari bilan belgilanadi A, B, C, D, E, F, G va DP Keling, rasmga qaraylik. Har bir segment ostida LED mavjud. Barcha LEDlar bir uchida ulangan. Yoki anodlar yoki katodlar va qarama-qarshi uchlari chiqariladi. Raqamni ko'rsatish uchun 8 ta pinni ishlatish kerakligini tushunish oson. Bitta umumiy va ettita segmentlar uchun. Agar bu bitta toifaga tegishli bo'lsa, unda o'ylashning hojati yo'q, biz hamma narsani bitta portga osib qo'yamiz. Agar to'rtta raqam bo'lsa-chi? Sakkizni to'rtga ko'paytirsak, o'ttiz ikkiga teng bo'ladi. Oh ... Ha, bunday 32 mega ko'rsatkich bir porlash uchun bo'ladi. Bu shunday ishlamaydi. Ikkita yechim bor. Bizniki dinamik displey yoki statik. Keyinchalik tushunish uchun indikatorni yoqish diagrammasini ko'rib chiqaylik.

Ushbu sxema dinamik ko'rsatkichni nazarda tutadi. Ha, men dinamik va statikman. Farqi nimada?. Statik ko'rsatkich har bir raqamga o'z raqamini berganimizda va u doimo yonib turadi, dinamik ko'rsatkich esa raqamni birinchi raqamda ko'rsatganimizda, keyin uni o'chirganimizda va ikkinchi raqamda ko'rsatganimizda, keyin uni o'chirganimizda va uni oynada ko'rsatganimizda. uchinchi raqam va shunga o'xshash zaryadsizlanishlar tugamaguncha. Oxirgi toifadan so'ng biz yana birinchisiga o'tamiz va hokazo. Agar siz buni asta-sekin qilsangiz, raqamli belgini ko'rishingiz mumkin, lekin agar siz tezlikni, masalan, 50 Gts ga oshirsangiz, ko'zlaringiz miltillashni ko'rmaydi. Dinamik displey shunday ishlaydi. Endi diagrammaga qaraylik. Chap tomonda ATmega8 MK uning orqasida D portida 74ALS373 chipi mavjud. Nima uchun kerak? Gap shundaki, indikator shunchaki matritsada yig'ilgan 8 ta LED. Ya'ni, indikator 8 ta LED chizig'i sifatida ifodalanishi mumkin. Va siz bilganingizdek, LEDlar MKga nisbatan juda ko'p ovqatlanadilar. Albatta, to'g'ridan-to'g'ri ulanish taqiqlangan emas, lekin MK va indikator o'rtasida qandaydir takrorlagichni joylashtirish yaxshiroqdir. Ushbu maqsadlar uchun men mandalli 8 bitli buferdan foydalanishga qaror qildim. Nega u? Men indikatorni umumiy anod bilan ishlatganimni hisobga olsak, ya'ni raqamning vazifasi uchun faol daraja 0 ga teng bo'lsa, men ULN2003A mikrosxemasidan (Darlington sxemasiga ko'ra 7 tranzistorli birikma) xavfsiz foydalanishim mumkin edi. bufer bilan bezovta qiling, lekin ... Lekin haqiqat shundaki, ULN2003A bortida faqat NPN tranzistorlari bor va men indikatorni faqat umumiy anod bilan ishlatishim mumkin, lekin men uni umumiy katod bilan ishlatishim kerak bo'lsa-chi? Bu erda bufer yordam beradi, chunki u erda yozganlarim chiqishda bo'ladi. Agar siz 0 ni xohlasangiz, 1. Boshqaruv oyoqlari tarjimon rejimida ulangan. Ya'ni, bufer kirish bilan bir xil narsani chiqaradi. Aya psevdo galvanik izolyatsiya. Buferdan keyin oqim cheklovchi rezistorlar keladi. Esingizda bo'lsin, bu LEDlar va rezistorlarsiz ular yonib ketadi. Qarshilik qiymati qabul qilinadiganidan bir oz kamroq tanlanishi kerak. Gap shundaki, dinamik displey ma'lum chastotali belgilarni ko'rsatadi va u PWM ga o'xshaydi, ya'ni chastota qanchalik baland bo'lsa, kontrast shunchalik yuqori bo'ladi. Va eng qulay kontrast bilan raqamlar biroz xiraroq porlaydi. Shuning uchun rezistorlarni bir oz past nominal qiymat bilan olish kerak. Men 360 Ohmni faqat zaxirada bo'lganligi uchun ishlatganman. Rezistorlardan keyin bizning ko'rsatkichimiz. Boshqa tomondan, anodlar joylashgan joyda, men C portining birinchi to'rtta raqamini uladim. Shunday qilib, biz sxemani aniqladik. Endi dastur algoritmini muhokama qilaylik. Ko'rsatkich raqamlarini birma-bir yoqish uchun biz alohida funktsiya yozamiz va uni dasturning asosiy qismida cheksiz chaqiramiz. Aniqroq aytganda, funktsiya 0 dan 9999 gacha bo'lgan raqamni oladi, uni raqamlarga ajratadi va keyin har bir raqamni o'z o'rniga chiqaradi. Agar raqam 4 tadan kam bo'lsa, chapdagi bo'sh joylar nol bilan to'ldiriladi. Biz o'zimizni o'ng chekka bilan tekislaymiz. Biz chapdan o'ngga toifalar bo'ylab harakat qilamiz. Har qanday harakatlarni ko'rinadigan qilish uchun biz hisoblagichdagi uzilishlardan foydalanamiz va chiqish sonini soniyada bir marta oshiramiz. Shunday qilib, jang uchun vazifa qo'yiladi. #F_CPU 7372800UL ni aniqlang // Kvars chastotasi #o'z ichiga oladi #o'z ichiga oladi #o'z ichiga oladi uchuvchan unsigned int test = 9980; // Indikatorda ko'rsatiladigan o'zgaruvchi ISR (TIMER1_COMPA_vect) // Taymer 1 mosligi uchun uzilish ishlovchisi (test++; // Chiqish sonini oshiring if(test > 9999) test = 0; // Agar u to'rtta raqamdan oshsa, uni nolga qaytaring TCNT1H=0x00; //Registrni tiklash TCNT1L=0x00; // hisoblar ) void dig_out(int num); // Indikatorda aks ettiriladigan funksiya deklaratsiyasi int main(void) ( DDRC = 0x0F; // Portlarni sozlash DDRD = 0xFF; // raqamlar uchun C porti, raqamlar uchun D porti bilan ishlash uchun TCCR1A=0x00; // Taymerni sozlash TCCR1B=0x04; TCNT1H=0x00; TCNT1L=0x00; OCR1AH=0x70; OCR1AL=0x80; TIMSK=0x10; sei(); // Uzilishlarni yoqish while(1) ( qazib chiqarish(test); //Joriy raqamni ko'rsatish uchun funksiyani doimiy ravishda chaqirish ) ) void dig_out (int num) // Indikatorda 4 ta raqamni ko'rsatish funksiyasi ( imzosiz belgi i = 0; // Hisoblagich o'zgaruvchisi unsigned char raz = 1; // Raqamli raqam unsigned char dig_num = (0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10); // Umumiy anodli indikator uchun raqam kodlari unsigned char dig = (0, 0, 0, 0); // Raqamli qiymat uchun massiv agar (raqam ( qazish =0; qazish =0; qazish =0; ) if(son // Chap bitlarni nol bilan to'ldirish uchun ( qazish =0; qazish =0; ) if(son // Chap bitlarni nol bilan to'ldirish uchun ( qazish =0; ) while(son > 999) // Minglar sonini oling ( dig++; son -= 1000; ) while(son > 99) // Yuzlar sonini oling ( dig++; son -= 100; ) while(son > 9) // O'nlik sonini oling ( dig++; son -= 10; ) dig = son; // Birliklar sonini oling esa (raz // Barcha 4 bitni to'ldirgunimizcha aylantiring (PORTC = raz; // Darajani tanlang PORTD = dig_num]; // Raqamni chiqaring raz = raz // Keyingi raqamga o'tish i++; //Keyingi raqam indeksini oshiring _kechikish_ms(1); // Kechikish 1 ms } } Hamma kod shu. Men buni tasvirlamayman, chunki unda har bir satr uchun sharhlar mavjud. Quyida siz AtmelStudio6.2 loyihasi bilan arxivni yuklab olishingiz mumkin. Agar sizda hali ham savollaringiz bo'lsa, forumga xush kelibsiz. Xo'sh, eng tezkorlar uchun quyida bu balalaykaning videosi bor))).

Yangi maqolalar

● 7-loyiha: 7-segmentli ko'rsatkichlarning 4-raqamli matritsasi. Dinamik displey yaratish

Ushbu tajribada biz Arduino ning 4 bitli etti segmentli matritsa bilan ishlashini ko'rib chiqamiz. Keling, bir nechta etti segmentli ko'rsatkichlar bo'yicha ma'lumotni ko'rsatishda bir xil Arduino pinlaridan foydalanishga imkon beruvchi dinamik displey haqida tasavvurga ega bo'laylik.

Kerakli komponentlar:

Etti segmentli ko'rsatkichlarning 4 xonali matritsasi to'rtta etti segmentli ko'rsatkichlardan iborat bo'lib, matritsada bir vaqtning o'zida 4 ta raqamni ko'rsatish uchun mo'ljallangan, shuningdek, kasr nuqtasini ko'rsatish mumkin; 7-segmentli ko'rsatkichlar bo'yicha 4 bitli matritsaning sxemasi rasmda ko'rsatilgan. 7.1.

Guruch. 7.1. 7 segmentli ko'rsatkichlar bo'yicha 4 bitli matritsa sxemasi

Raqamni chiqarish uchun siz A-G va DP pinlarida kerakli LEDlarni yoqishingiz va 6, 8, 9 yoki 12-pinlarga LOW tugmasini qo'llash orqali kerakli matritsani tanlashingiz kerak.
Keling, matritsa kontaktlarini Arduino platasiga ulaymiz va matritsaning turli bitlariga raqamlarni chiqaramiz. Ulanish uchun bizga 12 ta Arduino pin kerak. 4-bitli matritsani Arduino platasiga ulash uchun ulanish diagrammasi rasmda ko'rsatilgan. 7.2. Kontaktlarni ulashda 510 Ohm cheklovchi rezistorlar ishlatiladi.

Guruch. 7.2. 4-bitli matritsa uchun Arduino-ga ulanish diagrammasi

Matritsaning ixtiyoriy registriga (0-9) sonlarning ketma-ket chiqishining eskizini yozamiz. Diapazondan tasodifiy qiymatni tanlash uchun biz random() funksiyasidan foydalanamiz. Raqamlar massivi 0-9 raqamlarini ko'rsatish uchun ma'lumotlarga mos keladigan qiymatlarni saqlaydi (baytning eng muhim biti indikatorning A segmenti yorlig'iga va past tartibli bit G segmentiga to'g'ri keladi), pinlar massivi A-G va DP segmentlari uchun kontakt qiymatlarini o'z ichiga oladi, pindigitlar qatori matritsa raqamini tanlash uchun kontakt qiymatlarini o'z ichiga oladi. Eskizning mazmuni 7.1 ro'yxatda ko'rsatilgan.

// joriy raqamning qiymatini saqlash uchun o'zgaruvchi int raqami=0; // etti segmentli ko'rsatkich int digit = 0; bekor o'rnatish()(uchun (int i=0 ;i<8 ;i++) pinMode(pins[i],OUTPUT); for (int i=0 ;i<4 ;i++) {pinMode(pindigits[i],OUTPUT); digitalWrite(pindigits[i],HIGH); } } void loop()( raqam=(raqam+1 )%10 ; ko‘rsatishNumber(raqam); // (int i=0 ;i) uchun DS<4 ;i++) digitalWrite(pindigits[i],HIGH); digit=random(0 ,4 ); digitalWrite(pindigits,LOW); delay(3000 ); } ko'rsatuv raqamini bekor qilish ( int raqami)(uchun (int i=0 ;i<7 ;i++) { if (bitRead(numbers,7 -i)==HIGH) // segmentni yoqing // segmentni o'chirish digitalWrite(pins[i],LOW); ))
Ulanish tartibi:

1. Rasmdagi diagramma bo'yicha etti segmentli indikatorni ulang. 7.3.
2. Listing 7.2 dan eskizni Arduino platasiga yuklang.

// a-g bitlariga ulanish uchun Arduino pinlari ro'yxati // etti segmentli ko'rsatkich int pinlari=(9 ,13 ,4 ,6 ,7 ,10 ,3 ,5 ); // 0-9 raqamlarini ko'rsatish uchun qiymatlar bayt raqamlari = ( B11111100, B01100000, B11011010, B11110010, B01100110, B10110110, B10111110, B11100000, B11111110, B11111110, B); // joriy qiymatni saqlash va qayta ishlash uchun o'zgaruvchi int raqami=0; int soni1=0; int raqami2=0; // etti segmentli ko'rsatkich int pindigits=(2 ,8 ,11 ,12 ); // joriy raqamni saqlash uchun o'zgaruvchi int digit = 0; // 100 ms o'lchash uchun unsigned long millis1=0 ; // 1-rejim - sekundomer ishlayapti rejim=0; const int BUTTON=14 ; // Tugmani ulash uchun pin 14(A0). int tekButton = LOW; // Tugmaning joriy holatini saqlash uchun o'zgaruvchi int prevButton = LOW; // Oldingi holatni saqlash uchun o'zgaruvchi// tugmalarga boolean ledOn = false ; // LEDning joriy holati (yoqish/o'chirish) bekor o'rnatish(){ // Tugma pinini kirish sifatida sozlang pinMode (TUGMA, KIRISH); // Pinlarni chiqish sifatida sozlang uchun (int i=0;i<8 ;i++) pinMode(pins[i],OUTPUT); for (int i=0 ;i<4 ;i++) {pinMode(pindigits[i],OUTPUT); digitalWrite(pindigits[i],HIGH); } } void loop()( tekButton = debounce(prevButton); agar (prevButton == LOW && tekButton == YUKOR) // bosilsa... ( mode=1 -rejim; // rejimni o'zgartirish agar (rejim==1 ) raqam=0 ; ) agar (millis()-millis1>=100 && rejimi==1 ) (millis1=millis1+100 ; raqam=raqam+1 ; agar (son==10000 ) raqam=0 ; ) raqam1=raqam; uchun (int i=0;i<4 ;i++) { number2=number1%10 ; number1=number1/10 ; showNumber(number2,i); for (int j=0 ;j<4 ;j++) digitalWrite(pindigits[j],HIGH); digitalWrite(pindigits[i],LOW); delay(1 ); } } // yetti segmentli indikatorda raqamlarni ko'rsatish funktsiyasi ko'rsatuv raqamini bekor qilish ( int num, int dig)(uchun (int i=0 ;i<8 ;i++) { if (bitRead(numbers,7 -i)==HIGH) // segmentni yoqing digitalWrite(pins[i],HIGH); boshqa // segmentni o'chirish digitalWrite(pins[i],LOW); ) agar (qazish==1 ) // ikkinchi raqam uchun kasr nuqtasi digitalWrite (pinlar, HIGH); ) // Tegishli tekislash funksiyasi. Sifatida qabul qiladi // tugmaning oldingi holatini argumentlash va haqiqiy holatni qaytaradi. mantiqiy debuns ( oxirgi mantiqiy)( mantiqiy oqim = raqamli o'qish (TUGMASI); // Tugmaning holatini o'qing, agar (oxirgi!= joriy) // agar u o'zgargan bo'lsa ...(d elay ( 5 ) ; // dem 5 m s joriy = digitalRead(TUGMASI); // tugma holatini o'qing qaytish oqimi; // tugma holatini qaytaring } }

3. Tugmachani bosib biz sekundomerni ishga tushiramiz yoki to'xtatamiz.

Faqat ko'rsatma emas, balki ob'ektiv ma'lumotlarni taqdim etish qulayroq bo'lgan parametrlar mavjud. Masalan, tashqaridagi havo harorati yoki budilnikdagi vaqt. Ha, bularning barchasi yonib turgan lampalar yoki LEDlar yordamida amalga oshirilishi mumkin. Bir daraja - bitta yonayotgan LED yoki lampochka va boshqalar. Ammo bu o't o'chiruvchilarni sanash - yaxshi, yo'q! Lekin, ular aytganidek, eng oddiy echimlar eng ishonchli hisoblanadi. Shuning uchun, uzoq vaqt o'ylamasdan, ishlab chiquvchilar oddiy LED chiziqlarini olib, ularni to'g'ri tartibda joylashtirdilar.

Yigirmanchi asrning boshlarida vakuum naychalarining paydo bo'lishi bilan birinchi gazni tushirish ko'rsatkichlari paydo bo'ldi.

Bunday ko'rsatkichlar yordamida raqamli ma'lumotlarni arab raqamlarida ko'rsatish mumkin edi. Ilgari, aynan shunday lampalarda asboblar va boshqa elektron qurilmalar uchun turli xil ko'rsatkichlar qilingan. Hozirgi vaqtda gaz chiqarish elementlari deyarli hech qanday joyda ishlatilmaydi. Ammo retro har doim moda, shuning uchun ko'plab radio havaskorlari o'zlari va yaqinlari uchun gaz chiqarish ko'rsatkichlari bo'yicha ajoyib soatlar to'plashadi.


Gaz chiqarish lampalarining kamchiliklari shundaki, ular juda ko'p elektr energiyasini iste'mol qiladilar. Chidamlilik haqida bahslashish mumkin. Universitetimizda hozirgacha laboratoriya xonalarida gaz-razryad ko'rsatkichlaridan foydalanadigan chastota o'lchagichlardan foydalaniladi.

Etti segmentli ko'rsatkichlar

LEDlarning paydo bo'lishi bilan vaziyat yaxshi tomonga keskin o'zgardi. LEDlarning o'zi kam oqim iste'mol qiladi. Agar siz ularni to'g'ri joyga qo'ysangiz, siz mutlaqo har qanday ma'lumotni ko'rsatishingiz mumkin. Barcha arab raqamlarini ajratib ko'rsatish uchun faqat ettita yorug'likli LED tasmasi kifoya qiladi - ma'lum bir tarzda o'rnatilgan segmentlar:

Deyarli barcha yetti segmentli ko'rsatkichlarga sakkizinchi segment ham qo'shiladi - nuqta, shuning uchun har qanday parametrning butun va kasr qiymatini ko'rsatish mumkin.

Nazariy jihatdan biz sakkiz segmentli indikatorni olamiz, ammo eski uslubda u etti segmentli ko'rsatkich deb ham ataladi.

Natija qanday? Etti segmentli indikatordagi har bir chiziq LED yoki LEDlar guruhi bilan yoritiladi. Natijada, ma'lum segmentlarni ajratib ko'rsatish orqali biz 0 dan 9 gacha raqamlarni, shuningdek, harflar va belgilarni ko'rsatishimiz mumkin.

Diagrammadagi turlar va belgilash

Bir xonali, ikki xonali, uch xonali va to'rt xonali etti segmentli ko'rsatkichlar mavjud. Men hech qachon to'rtdan ortiq toifani ko'rmaganman.

Diagrammalarda etti segmentli indikator quyidagicha ko'rinadi:

Aslida, asosiy terminallarga qo'shimcha ravishda, har bir etti segmentli indikator umumiy anod (OA) yoki umumiy katod (OC) bilan umumiy terminalga ega.

Umumiy anodli etti segmentli indikatorning ichki sxemasi quyidagicha ko'rinadi:


va shunga o'xshash umumiy katod bilan:


Agar bizda umumiy anodli (OA) etti segmentli indikator mavjud bo'lsa, unda biz ushbu pinga "ortiqcha" quvvatni etkazib berishimiz kerak, agar umumiy katod (OC) bo'lsa, u holda "minus" yoki tuproq.

Etti segmentli indikatorni qanday tekshirish mumkin

Bizda quyidagi ko'rsatkichlar mavjud:


Zamonaviy yetti segmentli indikatorni tekshirish uchun bizga faqat diodli sinov funksiyasiga ega multimetr kerak bo'ladi. Birinchidan, biz umumiy xulosa izlayapmiz - bu OA yoki OK bo'lishi mumkin. Bu erda faqat tasodifiy. Xo'sh, keyin biz yuqoridagi diagrammalarga muvofiq indikatorning qolgan segmentlarining ishlashini tekshiramiz.

Quyidagi fotosuratda ko'rib turganingizdek, sinovdan o'tayotgan segment yonadi. Boshqa segmentlarni xuddi shu tarzda tekshiramiz. Agar barcha segmentlar yoqilgan bo'lsa, unda bunday ko'rsatkich buzilmagan va ishlanmalaringizda ishlatilishi mumkin.


Ba'zan multimetrdagi kuchlanish segmentni sinash uchun etarli emas. Shuning uchun biz quvvat manbaini olamiz va uni 5 voltga o'rnatamiz. Segment orqali oqimni cheklash uchun biz 1-2 Kilo-Ohm qarshilik orqali tekshiramiz.


Xuddi shu tarzda biz xitoylik qabul qiluvchidan indikatorni tekshiramiz


Sxemalarda etti segmentli ko'rsatkichlar har bir pindagi rezistorlarga ulangan

Bizning zamonaviy dunyomizda etti segmentli ko'rsatkichlar mutlaqo har qanday ma'lumotni aks ettira oladigan suyuq kristalli ko'rsatkichlar bilan almashtiriladi.

ammo ulardan foydalanish uchun siz bunday qurilmalarning sxemalarini loyihalashda ma'lum ko'nikmalarga ega bo'lishingiz kerak. Shu sababli, arzonligi va foydalanish qulayligi tufayli etti segmentli ko'rsatkichlar bugungi kunda ham qo'llaniladi.

Keling, yetti segmentli LED indikatorni Arduino platasiga ulaymiz va uni Led4Digits.h kutubxonasidan foydalanib boshqarishni o‘rganamiz.

Oldingi darsda mikrokontrollerlar batafsil tavsiflangan. Keling, bunday indikatorni Arduino platasiga ulaymiz.

Ko'rsatkichni Arduino platasiga ulash diagrammasi shunday ko'rinadi.

Men uni elektron plataga yig'dim.

Ko'rsatkichlarni boshqarish uchun men Led4Digits.h kutubxonasini yozdim:

Va to'lash.

Kutubxona sizga etti segmentli ko'rsatkichlarni boshqarish imkonini beradi:

  • o'lchamdagi to'rtta raqamgacha;
  • impuls polaritlarining har qanday variantlari bilan (barchasi);
  • parallel jarayonda ishlaydi;
  • indikatorda ko'rsatishga imkon beradi:
    • har bir toifadagi segmentlar;
    • har bir raqamning raqami;
    • butun 0 ... 9999;
  • butun sonni chiqarish uchun raqamlar sonini belgilash mumkin;
  • Ahamiyatsiz raqamlarni bostirish rejimi mavjud.

Led4Digits.h kutubxonasini ushbu havoladan yuklab olishingiz mumkin:

Va to'lash. Faqat 40 rub. barcha sayt resurslariga kirish uchun oyiga!

Qanday qilib o'rnatish haqida yozilgan.

Men manba matnlarni bermayman. Siz ularni kutubxona fayllaridan qidirishingiz mumkin. Har doimgidek, u erda ko'plab sharhlar mavjud. Men kutubxonadan qanday foydalanishni misollar bilan batafsil tasvirlab beraman.

Arduino Led4Digits uchun LED boshqaruv kutubxonasi.

Bu erda sinf tavsifi. Men faqat ommaviy usullar va xususiyatlarni taqdim etdim.

sinf Led4Digits (
ommaviy:
bayt raqami; // bit segmentini boshqarish kodlari
void regen(); // regeneratsiya, usulni muntazam ravishda chaqirish kerak
bekor tetradToSegCod(bayt qazish, bayt tetrad); // tetradni segment kodlariga aylantirish
mantiqiy bosma (imzosiz int qiymati, bayt digitNum, bayt bo'sh); // butun son chiqishi



} ;

Konstruktor.

Led4Digits (bayt turiLed, bayt raqamliPin0, bayt raqamliPin1, bayt raqamliPin2, bayt raqamliPin3,
bayt segPinA, bayt segPinB, bayt segPinC, bayt segPinD,
bayt segPinE, bayt segPinF, bayt segPinG, bayt segPinH);

typeLed Bit va segmentni tanlash signallari uchun impulsning nazorat polaritlarini o'rnatadi. Har qanday ulanish sxemalarini qo'llab-quvvatlaydi ().

typeLed Kategoriya tanlash Segment tanlash Sxema turi
0 -_- -_- Deşarj tanlash tugmalari bilan umumiy anod
1 _-_ -_- Umumiy anod
2 -_- _-_ Umumiy katod
3 _-_ _-_ Bo'shatish tanlash kalitlari bilan umumiy katod

digitPin0...digitPin3– raqamlarni tanlash uchun chiqishlar. Agar digitPin = 255 bo'lsa, raqam o'chirilgan. Bu sizga ko'rsatkichlarni kamroq raqamlar bilan ulash imkonini beradi. digitPin0 - past (o'ng) raqam.

segPinA...segPinH– segmentlarni boshqarish chiqishlari.

Masalan,

anglatadi: ko'rsatkich turi 1; tushirish chiqishi 5,4,3,2; 6,7,8,9,10,11,12,13 segmentlarning chiqishi.

void regen() usuli

Usul parallel jarayonda muntazam ravishda chaqirilishi kerak. U indikatorlardagi tasvirni tiklaydi. Regeneratsiya siklining vaqti bitlar soniga ko'paytirilgan usulni chaqirish davriga teng.

Masalan,

// uzilish ishlovchisi 2 ms
void timerInterrupt() (
disp.regen(); // indikator regeneratsiyasi
}

Bayt raqamli massiv

Segmentlarning holatini o'z ichiga oladi. raqam eng kam ahamiyatli bit, raqamning eng muhim biti esa eng kam ahamiyatli bitning “A” segmentidir. Bit holati 1 bo'lsa, segment yonadi.

Masalan,

raqam = B0000101;

ikkinchi raqamda "A" va "C" segmentlari yonadi degan ma'noni anglatadi.

Har bir raqamning barcha segmentlarini ketma-ket yorituvchi dasturga misol.

// ishlaydigan segmentlar
#o'z ichiga oladi
#o'z ichiga oladi

//
Led4Digits disp(1, 5,4,3,2, 6,7,8,9,10,11,12,13);

bekor o'rnatish() (
taymer uzilishi 2 ms
MsTimer2::start(); // uzilishni yoqish
}

void loop() (
uchun (int i = 0; i< 32; i++) {
agar (i == 0) disp.digit= 1;
else if (i == 8) disp.digit= 1;
else if (i == 16) disp.digit= 1;
else if (i == 24) disp.digit= 1;
boshqa(
disp.digit = disp.digit<< 1;
disp.digit = disp.digit<< 1;
disp.digit = disp.digit<< 1;
disp.digit = disp.digit<< 1;
}
kechikish (250);
}
}

//uzilish ishlovchisi 2 ms
void timerInterrupt() (
disp.regen(); // indikator regeneratsiyasi
}

Raqamlar qatorida 1 siljiydi va ko'rsatkichlar buni ko'rsatadi.

TetradToSegCodni bekor qilish usuli (bayt qazish, bayt tetrad)

Usul sizga o'n oltilik kodning raqamlari va harflarini alohida raqamlarda ko'rsatishga imkon beradi. Argumentlari bor:

  • qazish - 0 ... 3 raqamli raqam;
  • tetrad - o'nlik belgilar kodi. 0 kodi "0" raqamini, 1-kod - "1" raqamini, 14-kod - "E" harfini ko'rsatadi.

Masalan,

tetrad(2, 7);

uchinchi raqamda "7" raqamini ko'rsatadi.

Har bir raqamdagi belgilarni navbat bilan o'zgartiruvchi dasturga misol.

// raqamlar birma-bir
#o'z ichiga oladi
#o'z ichiga oladi

// 1-toifa ko'rsatkich; tushirish chiqishi 5,4,3,2; segment chiqishi 6,7,8,9,10,11,12,13
Led4Digits disp(1, 5,4,3,2, 6,7,8,9,10,11,12,13);

bekor o'rnatish() (
MsTimer2::set(2, timerInterrupt); // taymer uzilishi 2 ms
MsTimer2::start(); // uzilishni yoqish
}

void loop() (
uchun (int i = 0; i< 64; i++) {
disp.tetradToSegCod(i>>4, i);
kechikish (250);
}
}

// uzilish ishlovchisi 2 ms
void timerInterrupt() (
disp.regen(); // indikator regeneratsiyasi
}

Boolean chop etish usuli (imzosiz int qiymati, bayt digitNum, bayt bo'sh)

Usul indikatorlarda butun sonni ko'rsatadi. U har bir raqam uchun ikkilik sonni BCD ga aylantiradi. Argumentlari bor:

  • qiymat - indikatorda ko'rsatilgan raqam.
  • digitNum - raqam uchun raqamlar soni. Buni ko'rsatkich raqamlari soni bilan aralashtirib yubormaslik kerak. Raqamni 2 ta raqamda, qolgan ikkitasida esa belgilarni raqam yordamida ko'rsatishni xohlashingiz mumkin.
  • bo'sh - ahamiyatsiz raqamlarni bostirish belgisi. bo'sh = 0 raqam barcha nollar bilan ko'rsatilishi kerakligini anglatadi. "7" raqami "0007" ga o'xshaydi. Agar bo'sh 0 dan farq qiladigan bo'lsa, ahamiyatsiz nollar bostiriladi.

Agar raqamning qiymati tanlangan raqamlar soni (digitNum) uchun ruxsat etilgan raqamdan oshsa, funktsiya indikatorda "---" belgisini ko'rsatadi va noto'g'ri qaytaradi.

Raqamlarni chiqarish dasturiga misol.

// chiqish raqami
#o'z ichiga oladi
#o'z ichiga oladi

// 1-toifa ko'rsatkich; tushirish chiqishi 5,4,3,2; segment chiqishi 6,7,8,9,10,11,12,13
Led4Digits disp(1, 5,4,3,2, 6,7,8,9,10,11,12,13);

bekor o'rnatish() (
MsTimer2::set(2, timerInterrupt); // taymer uzilishi 2 ms
MsTimer2::start(); // uzilishni yoqish
}

void loop() (
uchun (int i = 0; i< 12000; i++) {
disp.print(i, 4, 1);
kechikish (50);
}
}

// uzilish ishlovchisi 2 ms
void timerInterrupt() (
disp.regen(); // indikator regeneratsiyasi
}

Oxirgi ikkita usul "H" segmentining holatini o'zgartirmaydi - kasr nuqtasi. Nuqta holatini o'zgartirish uchun quyidagi buyruqlardan foydalanishingiz mumkin:

raqam |= 0x80; // kasr nuqtasini yoqing
raqam &= 0x7f; // kasr nuqtasini o'chiring

Salbiy sonlar ko'rsatkichlariga chiqish (int).

Salbiy raqamlarni quyidagicha chiqarish mumkin:

  • Raqamning belgisini tekshiring.
  • Agar raqam manfiy bo'lsa, eng muhim raqamga minus belgisini chop eting va print() funksiyasida raqamning belgisini ijobiyga o'zgartiring.
  • Agar raqam ijobiy bo'lsa, belgi bitini o'chiring va print() funksiyasidan foydalanib raqamni chop eting.

Mana bu usulni ko'rsatadigan dastur. U -999 dan 999 gacha raqamlarni chiqaradi.

// manfiy raqamlarni chiqaring
#o'z ichiga oladi
#o'z ichiga oladi

// 1-toifa ko'rsatkich; tushirish chiqishi 5,4,3,2; segment chiqishi 6,7,8,9,10,11,12,13
Led4Digits disp(1, 5,4,3,2, 6,7,8,9,10,11,12,13);

bekor o'rnatish() (
MsTimer2::set(2, timerInterrupt); // taymer uzilishi 2 ms
MsTimer2::start(); // uzilishni yoqish
}

void loop() (

uchun (int i = -999; i< 1000; i++) {

agar (ya'ni< 0) {
// raqam manfiy
disp.digit= B01000000; // belgisi -
disp.print(i * -1, 3, 1);
}
boshqa(
disp.digit= B00000000; // belgini tozalang
disp.print(i, 3, 1);
}

kechikish (50);
}
}

// uzilish ishlovchisi 2 ms
void timerInterrupt() (
disp.regen(); // indikator regeneratsiyasi
}

Kasr sonlar ko'rsatkichlariga chiqish, float formati.

Standart C tili funktsiyalaridan foydalangan holda indikatorlarda suzuvchi nuqta raqamlarini (floats) ko'rsatishning ko'plab usullari mavjud. Bu, birinchi navbatda, sprint() funktsiyasi. U juda sekin ishlaydi, belgilar kodlarini ikkilik kasrli kodlarga qo'shimcha konvertatsiya qilishni talab qiladi, siz satrdan nuqta ajratib olishingiz kerak. Boshqa funktsiyalar bilan bir xil muammolar.

Ko'rsatkichlar bo'yicha float o'zgaruvchilari qiymatlarini ko'rsatish uchun boshqa usuldan foydalanaman. Usul oddiy, ishonchli, tez. Quyidagi operatsiyalarga qisqartiradi:

  • O'zgaruvchan nuqta raqami kerakli o'nlik kasrlar soniga mos keladigan quvvatga 10 ga ko'paytiriladi. Agar siz indikatorlarda 1 kasrni ko'rsatishingiz kerak bo'lsa, 10 ga ko'paytiring, agar 2 bo'lsa, keyin 100 ga, 3 kasrni 1000 ga ko'paytiring.
  • Keyinchalik, suzuvchi nuqta raqami aniq butun songa (int) aylantiriladi va print() funksiyasi yordamida indikatorlarda ko'rsatiladi.
  • Kerakli raqamga nuqta qo'yiladi.

Masalan, quyidagi satrlar yetti segmentli LEDlarga ikkita kasrli suzuvchi o'zgaruvchini chiqaradi.

float x = 2,12345;

disp.digit |= 0x80; //

Biz raqamni 100 ga ko'paytiramiz va uchinchi raqamga nuqta qo'yib, natijani 100 ga bo'lamiz.

Bu erda indikatorlarda 0,00 dan 99,99 gacha bo'lgan suzuvchi nuqta raqamlarini ko'rsatadigan dastur.

// suzuvchi nuqta chiqishi
#o'z ichiga oladi
#o'z ichiga oladi

// 1-toifa ko'rsatkich; tushirish chiqishi 5,4,3,2; segment chiqishi 6,7,8,9,10,11,12,13
Led4Digits disp(1, 5,4,3,2, 6,7,8,9,10,11,12,13);

bekor o'rnatish() (
MsTimer2::set(2, timerInterrupt); // taymer uzilishi 2 ms
MsTimer2::start(); // uzilishni yoqish
}

void loop() (
float x = 0;

uchun (int i = 0; i< 10000; i++) {
x += 0,01;

disp.print((int)(x * 100.), 4, 1);
disp.digit |= 0x80; // uchinchi darajali nuqtani yoqing

kechikish (50);
}
}

//uzilish ishlovchisi 2 ms
void timerInterrupt() (
disp.regen(); // indikator regeneratsiyasi
}

Ko‘rib turganingizdek, Led4Digits.h kutubxonasi Arduino platasiga ulangan yetti segmentli yorug‘lik chiqaradigan diod (LED) indikatorlari bilan ishlashni ancha soddalashtiradi. Men bunday kutubxonaning analogini topmadim.

Shift registri orqali LED displeylar bilan ishlash uchun kutubxonalar mavjud. Kimdir menga Arduino platasiga bevosita ulangan LED displey bilan ishlaydigan kutubxona topilganini yozdi. Ammo uni ishlatganda indikator raqamlari notekis yonadi va ko'z qisib turadi.

Analoglaridan farqli o'laroq, Led4Digits.h kutubxonasi:

  • Parallel jarayon sifatida ishlaydi. Asosiy tsiklda dastur ma'lumotlarni ma'lum o'zgaruvchilarga yuklaydi, ular avtomatik ravishda displeyda ko'rsatiladi. Ma'lumot chiqishi va indikatorning tiklanishi asosiy dasturga ko'rinmaydigan taymer uzilishida sodir bo'ladi.
  • Displey raqamlari miltillamasdan bir tekis yonadi. Bu xususiyat regeneratsiya taymer uzilishi bilan qat'iy belgilangan tsiklda sodir bo'lishi bilan ta'minlanadi.
  • Kutubxona ixcham kodga ega, tez ishlaydi va kontrollerni minimal yuklaydi.

Keyingi darsda biz bir vaqtning o'zida LED indikatori va tugma matritsasini Arduino platasiga ulaymiz. Keling, bunday dizayn uchun kutubxona yozaylik.

Kategoriya: . Xatcho'p qo'yishingiz mumkin.