Septynių segmentų indikatorius. Arduino ir keturių skaitmenų septynių segmentų indikatorius 4 skaitmenų indikatorius ir Arduino

7 segmentų ekrano prijungimas prie „Arduino“ yra puikus pradinio lygio projektas, norint geriau pažinti savo „Arduino“ plokštę. Bet tai padaryti gana paprasta. Todėl užduotį kiek apsunkinsime ir prijungsime keturženklį septynių segmentų indikatorių.



Šiuo atveju naudosime keturių skaitmenų LED indikatoriaus modulį su bendru katodu.


Kiekvienas indikatoriaus modulio segmentas yra multipleksuotas, tai reiškia, kad jis dalijasi vienu anodo prijungimo tašku su kitais iškrovimo segmentais. Ir kiekvienas iš keturių modulio bitų turi savo prijungimo tašką su bendru katodu. Tai leidžia įjungti arba išjungti kiekvieną skaitmenį atskirai. Be to, šis multipleksavimo metodas leidžia mikrovaldikliui naudoti tik vienuolika ar dvylika kontaktų vietoj trisdešimt dviejų.



Indikatoriaus LED segmentams reikia prijungti srovę ribojančius rezistorius, kai jie maitinami nuo 5 V loginio kaiščio. Rezistoriaus vertė paprastai yra nuo 330 iki 470 omų. Taip pat rekomenduojama naudoti tranzistorius papildomai srovei tiekti, nes kiekvienas mikrovaldiklio kontaktas gali tiekti ne daugiau kaip 40 mA. Jei įjungsite visus iškrovimo segmentus (skaičius 8), srovės suvartojimas viršys šią ribą. Žemiau esančiame paveikslėlyje parodyta keturių skaitmenų septynių segmentų indikatoriaus, naudojant srovę ribojančius tranzistorius, prijungimo schema.



Toliau pateikiamos indikatoriaus prijungimo prie Arduino kaiščių diagramos. Čia naudojami dvipoliai NPN tranzistoriai BC547. Prie A0 plokštės įvesties prijungtas 10 KOhm potenciometras leidžia pakeisti indikatoriaus rodomą reikšmę nuo 0 iki 1023.




Arduino plokštėje skaitmeniniai išėjimai D2-D8 šiuo atveju naudojami segmentams nuo "a" iki "g" valdyti, o skaitmeniniai išėjimai D9-D12 naudojami bitams nuo D0 iki D3 valdyti. Pažymėtina, kad šiame pavyzdyje taškas nenaudojamas, tačiau eskizuose žemiau jį galima panaudoti. Arduino plokštės kaištis D13 yra skirtas taško segmentui valdyti.



Žemiau yra kodas, leidžiantis valdyti keturių skaitmenų segmento indikatorių naudojant Arduino plokštę. Jame skaičių masyvas nurodo skaičių kodus nuo 0 iki 9 dvejetaine forma. Šis eskizas palaiko ir indikatorius su bendru katodu (pagal numatytuosius nustatymus), ir indikatorius su bendru anodu (kad tai padarytumėte, eskizo pabaigoje turite atšaukti vieną eilutę).


// bitai, žymintys segmentus A–G (ir taškus), skaičiams nuo 0 iki 9 const int skaičius = ( //ABCDEFG /dp B11111100, // 0 B01100000, // 1 B11011010, // 2 B11110010, // 0101, //0 3 // 4 B10110110, // 5 B00111110, // 6 B11100000, // 7 B11111110, // 8 B11100110, // 9 ); // taško ir kiekvienos atkarpos kaiščiai // DP,G,F,E,D,C,B,A const int segmentPins = ( 13,8,7,6,5,4,3,2 ); const int nbrDigits= 4; // LED indikatoriaus skaitmenų skaičius // skaitmenys 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; skaitmuo--) ( if(skaičius > 0) ( rodytiSkaičius(skaičius % 10, skaitmuo) ; skaičius = skaičius / 10; ) ) ) ) // Šiame 7 segmentų indikatoriaus skaitmenyje rodyti nurodytą skaičių void showDigit(int numeris, int skaitmuo) ( digitalWrite(digitPins, HIGH); for(int segmentas = 1; segmentas< 8; segment++) { boolean isBitSet = bitRead(numeral, segment); // isBitSet будет истинным, если данный бит будет 1 // isBitSet = ! isBitSet; // опционально // раскомментируйте опциональную строчку выше для индикатора с общим анодом digitalWrite(segmentPins, isBitSet); } delay(5); digitalWrite(digitPins, LOW); }

Darbuotojų prašymu nusprendžiau pakalbėti apie nuostabų dalyką, vadinamą 7 segmentų LED indikatoriumi. Visų pirma, kas tai yra? Štai toks dalykas. Tai yra vienas skaitmuo, taip pat yra du skaitmenys, trys ir keturi skaitmenys. Pamačiau dar šešis skaitmenis. Po kiekvieno skaitmens yra po kablelio. Jei yra keturi skaitmenys, tada dažniausiai po antrojo skaitmens galite rasti dvitaškį, nurodantį sekundes rodant laiką. Išnagrinėję liaukas, pereikime prie grandinės tyrimo. Kas apskritai yra dinaminis ekranas ir kam jis reikalingas? Kadangi indikatorius yra 7 segmentų, skaičiui rodyti naudojami tik 7 segmentai. Jie visada žymimi lotyniškomis raidėmis A, B, C, D, E, F, G ir DP Pažiūrėkime į paveikslėlį. Po kiekvienu segmentu yra šviesos diodas. Visi šviesos diodai yra sujungti viename gale. Anodai arba katodai, o priešingi galai išvedami. Nesunku pastebėti, kad norint parodyti skaičių, reikia naudoti 8 kaiščius. Vienas bendras ir septyni segmentams. Jei tai liečia vieną kategoriją, tai nėra apie ką galvoti, tiesiog viską kabiname viename prievade. Ką daryti, jei yra keturi skaitmenys? Aštuoni, padauginti iš keturių, yra trisdešimt du. Oi... Taip, toks 32 mega indikatorius bus vienas, kad būtų perkeltas. Taip neveiks. Yra du sprendimai. Mūsų ekranas yra dinaminis arba statinis. Norėdami geriau suprasti, pažvelkime į indikatoriaus įjungimo schemą.

Ši schema reiškia dinaminę indikaciją. Taip, aš esu dinamiškas ir statiškas. Koks skirtumas?. Statinė indikacija yra tada, kai kiekvienam skaitmeniui suteikiame savo numerį ir jis nuolat yra įjungtas, o dinaminis indikatorius yra tada, kai rodome skaičių pirmuoju skaitmeniu, tada jį užgesiname ir rodome antruoju skaitmeniu, tada užgesiname ir rodome trečias skaitmuo ir taip toliau, kol iškrovos nesibaigs. Po paskutinės kategorijos vėl einame į pirmą ir taip ratu. Jei tai darysite lėtai, pamatysite skaitmeninį stulpelį, tačiau jei padidinsite greitį, pavyzdžiui, iki 50 Hz, tada akys nebematys mirgėjimo. Taip veikia dinaminis ekranas. Dabar pažiūrėkime į diagramą. Kairėje yra ATmega8 MK už jo D prievade, yra 74ALS373 lustas. Kodėl to reikia? Faktas yra tas, kad indikatorius yra tiesiog 8 šviesos diodai, surinkti į savotišką matricą. Tai reiškia, kad indikatorius gali būti pavaizduotas kaip 8 šviesos diodų linija. Ir, kaip žinote, šviesos diodai valgo daug, palyginti su MK. Žinoma, tiesiogiai jungtis nedraudžiama, tačiau tarp MK ir indikatoriaus geriau pastatyti kokį nors kartotuvą. Šiems tikslams nusprendžiau naudoti 8 bitų fiksavimo buferį. Kodėl jis? Atsižvelgiant į tai, kad aš naudoju indikatorių su bendru anodu, tai yra, skaitmens užduočiai aktyvus lygis yra 0, tada galėčiau saugiai naudoti ULN2003A mikroschemą (7 tranzistorių rinkiniai pagal Darlingtono grandinę), o ne vargti su buferiu, bet... Bet faktas tas, kad ULN2003A yra tik NPN tranzistoriai, o indikatorius galiu naudoti tik su bendru anodu, bet jei reikia naudoti su bendru katodu? Čia padės buferis, nes tai, ką ten parašysiu, bus išvestyje. Jei norite 0, norite 1. Valdymo kojos yra sujungtos vertėjo režimu. Tai yra, buferis išveda tą patį, ką ir įvestis. Aya pseudo galvaninė izoliacija. Po buferio yra srovės ribojimo rezistoriai. Atminkite, kad tai yra šviesos diodai ir be rezistorių jie sudegs. Rezistoriaus vertė turėtų būti pasirinkta šiek tiek mažesnė nei priimtina. Faktas yra tas, kad dinaminis ekranas rodo simbolius su tam tikru dažniu ir yra panašus į PWM, tai yra, kuo didesnis dažnis, tuo didesnis kontrastas, taip sakant. O esant patogiausiam kontrastui, skaičiai švies šiek tiek blankiau. Todėl rezistorius reikia paimti su šiek tiek mažesne vardine verte. Naudojau 360 omų tik todėl, kad turėjau atsargų. Kitas po rezistorių yra mūsų indikatorius. Kitoje pusėje, kur yra anodai, sujungiau pirmuosius keturis prievado C skaitmenis. Taigi, mes tarsi išsiaiškinome grandinę. Dabar aptarkime programos algoritmą. Norėdami po vieną įjungti indikatoriaus skaitmenis, pagrindinėje programos dalyje parašysime atskirą funkciją ir ją be galo iškviesime. Tiksliau, funkcija gaus skaičių nuo 0 iki 9999, išskirs jį į skaitmenis ir išves kiekvieną skaitmenį savo vietoje. Jei skaičių sudaro mažiau nei 4 skaitmenys, tuščios vietos kairėje bus užpildytos nuliais. Mes lygiuojamės su dešiniuoju kraštu. Peržiūrėsime kategorijas iš kairės į dešinę. Kad bet kokie veiksmai būtų matomi, naudosime pertraukimus iš skaitiklio, kad padidintume išvesties skaičių vienu kartą per sekundę. Taigi užduotis yra nustatyta mūšiui. #define F_CPU 7372800UL // Kvarco dažnis #įtraukti #įtraukti #įtraukti nepastovus irsigned int testas = 9980; // Rodiklis rodomas kintamasis ISR (TIMER1_COMPA_vect) // 1 laikmačio rungtynių pertraukimo tvarkytuvas (testas++; // Padidinkite išvesties skaičių if(testas > 9999) testas = 0; // Jei jis viršija keturis skaitmenis, iš naujo nustatykite jį į nulį TCNT1H=0x00; //Atkurti registrą TCNT1L=0x00; // sąskaitos ) void dig_out(int num); // Funkcijos, kuri turi būti rodoma indikatoriuje, deklaracija int main(tuščia) ( DDRC = 0x0F; // Konfigūruoti prievadus DDRD = 0xFF; // darbui su indikatoriumi Prievadas C – skaitmenims, D prievadas – skaičiams TCCR1A=0x00; // Laikmačio nustatymas TCCR1B=0x04; TCNT1H=0x00; TCNT1L=0x00; OCR1AH=0x70; OCR1AL=0x80; TIMSK=0x10; sei(); // Įjungti pertraukimus while(1) ( dig_out(testas); //Nuolat skambinkite funkcijai, kad būtų rodomas dabartinis numeris ) ) void dig_out(int num) // Funkcija, rodanti 4 skaitmenis indikatoriuje (nežymėtas simbolis i = 0; // Skaitiklio kintamasis nepasirašytas char raz = 1; // Skaitmeninis numeris nepasirašytas char dig_num = (0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10); // Indikatoriaus su bendru anodu skaičių kodai unsigned char dig = (0, 0, 0, 0); // Skaitmeninės reikšmės masyvas if(nm ( dig = 0; dig = 0; dig = 0; ) if(num // Norėdami užpildyti kairiuosius bitus nuliais ( dig = 0; dig = 0; ) if(num // Norėdami užpildyti kairiuosius bitus nuliais ( kasti =0; ) while(skaičius > 999) // Gaukite skaičių tūkstančių ( dig++; num -= 1000; ) while(skaičius > 99) // Gaukite šimtų skaičių ( dig++; num -= 100; ) while(skaičius > 9) // Gaukite dešimties skaičių ( dig++; num -= 10; ) dig = skaičius; // Gaukite vienetų skaičių while (raz // Sukite, kol užpildysime visus 4 bitus (PORTC = raz; // Pasirinkite rangą PORTD = dig_num]; // Išveskite numerį raz = raz // Perjungti į kitą skaitmenį i++; //Padidinkite kito skaitmens indeksą _delay_ms(1); // Vėlavimas 1 ms } } Štai ir visas kodas. Neapibūdinsiu, nes kiekvienai eilutei yra komentarų. Žemiau galite atsisiųsti archyvą su projektu, skirtu AtmelStudio6.2. Jei vis dar turite klausimų, kviečiame apsilankyti forume. Na, o išrankiausiems žemiau yra vaizdo įrašas apie visą šią balalaiką))).

Nauji straipsniai

● 7 projektas: 4 skaitmenų 7 segmentų rodiklių matrica. Dinaminio ekrano kūrimas

Šiame eksperimente apžvelgsime Arduino veikimą su 4 bitų septynių segmentų matrica. Įsivaizduokime dinaminį ekraną, kuris leidžia naudoti tuos pačius Arduino kaiščius rodant informaciją keliuose septynių segmentų indikatoriuose.

Reikalingi komponentai:

4 skaitmenų septynių segmentų indikatorių matrica susideda iš keturių septynių segmentų indikatorių ir yra skirta vienu metu rodyti 4 skaitmenis matricoje, taip pat galima rodyti dešimtainį tašką. 4 bitų matricos grandinė ant 7 segmentų indikatorių parodyta fig. 7.1.

Ryžiai. 7.1. 4 bitų matricos schema ant 7 segmentų indikatorių

Norėdami išvesti skaičių, turite uždegti reikiamus šviesos diodus ant kaiščių A-G ir DP ir pasirinkti norimą matricą, pritaikydami LOW prie 6, 8, 9 arba 12 kaiščių.
Prijunkite matricos kontaktus prie Arduino plokštės ir išveskime numerius prie įvairių matricos bitų. Norėdami prisijungti, mums reikia 12 Arduino kaiščių. Ryšio schema, skirta prijungti 4 bitų matricą prie Arduino plokštės, parodyta Fig. 7.2. Jungiant kontaktus naudojami 510 omų ribojantys rezistoriai.

Ryžiai. 7.2. 4 bitų matricos prijungimo schema prie Arduino

Į savavališką matricos registrą įrašykime nuoseklaus skaičių (0-9) išvesties eskizą. Norėdami pasirinkti atsitiktinę reikšmę iš diapazono, naudosime random() funkciją. Skaičių masyve saugomos reikšmės, atitinkančios skaitmenų 0–9 rodymo duomenis (reikšmingiausias baito bitas atitinka indikatoriaus segmento A etiketę, o žemos eilės – G segmentą), kaiščių masyvas. yra segmentų A-G ir DP kontaktų reikšmės, skaitmenų masyve yra kontaktų reikšmės matricos skaitmeniui pasirinkti. Eskizo turinys parodytas 7.1 sąraše.

// kintamasis, skirtas išsaugoti esamo skaitmens reikšmę int skaičius=0 ; // septynių segmentų indikatorius int skaitmuo=0 ; negaliojantis nustatymas ()( for (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 ()( skaičius=(skaičius+1 )%10 ; rodytiSkaičius(skaičius); // DS for (int i=0 ;i<4 ;i++) digitalWrite(pindigits[i],HIGH); digit=random(0 ,4 ); digitalWrite(pindigits,LOW); delay(3000 ); } void showNumber( int num)( for (int i=0 ;i<7 ;i++) { if (bitRead(numbers,7 -i)==HIGH) // apšvieskite segmentą // užgesinti segmentą digitalWrite(pins[i],LOW); ) )
Prisijungimo tvarka:

1. Prijunkite septynių segmentų indikatorių pagal schemą pav. 7.3.
2. Įkelkite eskizą iš 7.2 sąrašo į Arduino plokštę.

// Arduino kaiščių, skirtų prisijungti prie a-g bitų, sąrašas // septynių segmentų indikatorius int pins=(9 ,13 ,4 ,6 ,7 ,10 ,3 ,5 ); // reikšmės, kad būtų rodomi skaičiai nuo 0 iki 9 baitų skaičiai = ( B11111100, B01100000, B11011010, B11110010, B01100110, B10110110, B10111110, B11100000, B11111110, B11); // kintamasis, skirtas dabartinei vertei saugoti ir apdoroti int skaičius=0 ; int skaičius1=0 ; int skaičius2=0 ; // septynių segmentų indikatorius int pindigits=(2 ,8 ,11 ,12 ); // kintamasis, skirtas išsaugoti esamą skaitmenį int skaitmuo=0 ; // išmatuoti 100 ms be ženklų ilgas milis1=0 ; // 1 režimas – veikia chronometras režimas=0 ; const int BUTTON=14 ; // Kaištis 14(A0) mygtukui prijungti int tekButton = LOW; // Kintamasis, skirtas išsaugoti esamą mygtuko būseną int prevButton = LOW; // Kintamasis, skirtas išsaugoti ankstesnę būseną// mygtukams loginis ledOn = false ; // Dabartinė šviesos diodo būsena (įjungta / išjungta) negaliojantis nustatymas (){ // Konfigūruokite mygtuko kaištį kaip įvestį pinMode(mygtukas, INPUT); // Konfigūruoti kaiščius kaip išvestis for (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); if (prevButton == LOW && tekButton == HIGH) // jei paspaustas... ( mode=1 -mode; // pakeisti režimą if (režimas==1 ) skaičius=0 ; ) if (millis()-millis1>=100 && mode==1 ) (millis1=millis1+100 ; skaičius=skaičius+1 ; if (skaičius==10000 ) skaičius=0 ; ) skaičius1=skaičius; for (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 ); } } // funkcija, skirta skaičiams rodyti septynių segmentų indikatoriuje void showNumber( int num, int dig)( for (int i=0 ;i<8 ;i++) { if (bitRead(numbers,7 -i)==HIGH) // apšvieskite segmentą digitalWrite(pins[i],HIGH); Kitas // užgesinti segmentą digitalWrite(pins[i],LOW); ) if (kasti==1 ) // antrojo skaitmens dešimtainis kablelis skaitmeninisWrite (smeigtukai, AUKŠTAS); ) // Atšokimo išlyginimo funkcija. Priima kaip // argumentuoja ankstesnę mygtuko būseną ir grąžina tikrąją. loginis debounce ( loginis paskutinis)( loginė srovė = digitalRead(BUTTON); // Skaityti mygtuko būseną, jei (paskutinis != dabartinis) // jei pasikeitė...(d Elay ( 5 ) ; // 5 m s srovė = digitalRead(BUTTON); // perskaityti mygtuko būseną grąžinimo srovė; // grąžina mygtuko būseną } }

3. Paspaudę mygtuką paleidžiame arba sustabdome chronometrą.

Yra parametrų, apie kuriuos patogiau būtų pateikti objektyvią informaciją, o ne tik indikaciją. Pavyzdžiui, oro temperatūra lauke arba žadintuvo laikas. Taip, visa tai galima padaryti naudojant šviečiančias lemputes ar šviesos diodus. Vienas laipsnis – viena dega LED arba lemputė ir pan. Bet skaičiuojant šias ugniageses – gerai, ne! Tačiau, kaip sakoma, patys paprasčiausi sprendimai yra patikimiausi. Todėl ilgai negalvodami kūrėjai paėmė paprastas LED juosteles ir sutvarkė jas tinkama tvarka.

XX amžiaus pradžioje, atsiradus vakuuminiams vamzdeliams, pasirodė pirmieji dujų išlydžio indikatoriai.

Tokių indikatorių pagalba buvo galima atvaizduoti skaitmeninę informaciją arabiškais skaitmenimis. Anksčiau būtent ant tokių lempų buvo daromos įvairios indikacijos instrumentams ir kitiems elektroniniams prietaisams. Šiuo metu dujų išlydžio elementai beveik niekur nenaudojami. Tačiau retro visada madingas, todėl daugelis radijo mėgėjų sau ir savo artimiesiems renka nuostabius laikrodžius ant dujų išlydžio indikatorių.


Dujų išlydžio lempų trūkumas yra tas, kad jos sunaudoja daug elektros energijos. Dėl patvarumo galima ginčytis. Mūsų universitete dažnio matuokliai su dujų išlydžio indikatoriais vis dar naudojami laboratorijų patalpose.

Septynių segmentų rodikliai

Atsiradus šviesos diodams padėtis iš esmės pasikeitė į gerąją pusę. Patys šviesos diodai sunaudoja mažai srovės. Jei pastatysite juos tinkamoje padėtyje, galėsite rodyti absoliučiai bet kokią informaciją. Norint paryškinti visus arabiškus skaitmenis, pakanka tik septynių šviečiančių LED juostelių - tam tikru būdu išdėstytų segmentų:

Beveik prie visų tokių septynių segmentų rodiklių pridedamas aštuntasis segmentas - taškas, kad būtų galima parodyti bet kurio parametro sveikąjį skaičių ir trupmeninę reikšmę

Teoriškai gauname aštuonių segmentų indikatorių, bet senamadiškai jis dar vadinamas septynių segmentų indikatoriumi.

Koks rezultatas? Kiekviena septynių segmentų indikatoriaus juostelė apšviečiama šviesos diodu arba šviesos diodų grupe. Dėl to, paryškindami tam tikrus segmentus, galime rodyti skaičius nuo 0 iki 9, taip pat raides ir simbolius.

Tipai ir žymėjimas diagramoje

Yra vienženkliai, dviženkliai, triženkliai ir keturženkliai septynių segmentų rodikliai. Niekada nemačiau daugiau nei keturių kategorijų.

Diagramose septynių segmentų indikatorius atrodo maždaug taip:

Tiesą sakant, be pagrindinių gnybtų, kiekvienas septynių segmentų indikatorius taip pat turi bendrą gnybtą su bendru anodu (OA) arba bendru katodu (OC).

Septynių segmentų indikatoriaus su bendru anodu vidinė grandinė atrodys taip:


ir su tokiu bendru katodu:


Jei turime septynių segmentų indikatorių su bendru anodu (OA), tada grandinėje turime tiekti „plius“ maitinimą šiam kaiščiui, o jei su bendru katodu (OC), tada „minusas“ arba įžeminimas.

Kaip patikrinti septynių segmentų indikatorių

Turime šiuos rodiklius:


Norint patikrinti modernų septynių segmentų indikatorių, tereikia multimetro su diodų testavimo funkcija. Pirmiausia ieškome bendros išvados – tai gali būti OA arba OK. Čia tik atsitiktinai. Na, tada mes patikriname likusių indikatoriaus segmentų veikimą pagal aukščiau pateiktas diagramas.

Kaip matote toliau esančioje nuotraukoje, užsidega bandomas segmentas. Taip pat tikriname kitus segmentus. Jei šviečia visi segmentai, toks indikatorius yra nepažeistas ir gali būti naudojamas jūsų plėtrai.


Kartais multimetro įtampos nepakanka segmentui patikrinti. Todėl paimame maitinimo šaltinį ir nustatome jį į 5 voltus. Norėdami apriboti srovę per segmentą, patikriname per 1-2 kiloomų rezistorių.


Tuo pačiu būdu mes patikriname indikatorių iš Kinijos imtuvo


Grandinėse septynių segmentų indikatoriai yra prijungti prie rezistorių prie kiekvieno kaiščio

Mūsų šiuolaikiniame pasaulyje septynių segmentų indikatorius keičia skystųjų kristalų indikatoriai, galintys rodyti absoliučiai bet kokią informaciją.

bet norint juos naudoti, reikia tam tikrų įgūdžių projektuojant tokių įrenginių grandinę. Todėl septynių segmentų indikatoriai dėl mažos kainos ir naudojimo paprastumo naudojami ir šiandien.

Prie Arduino plokštės prijungkime septynių segmentų LED indikatorių ir išmokime jį valdyti naudodami Led4Digits.h biblioteką.

Ankstesnėje pamokoje išsamiai aprašyti mikrovaldikliai. Tokį indikatorių prijungkime prie Arduino plokštės.

Indikatoriaus prijungimo prie Arduino plokštės schema atrodo taip.

Aš jį surinkau ant grandinės plokštės.

Norėdami valdyti rodiklius, parašiau Led4Digits.h biblioteką:

Ir mokėti.

Biblioteka leidžia valdyti septynių segmentų rodiklius:

  • iki keturių skaitmenų dydžio;
  • su bet kokiais valdymo impulsų poliškumo variantais (visi);
  • dirba lygiagrečiame procese;
  • leidžia rodyti indikatoriuje:
    • kiekvienos kategorijos segmentai;
    • kiekvieno skaitmens skaitmuo;
    • sveikasis skaičius 0 ... 9999;
  • norint išvesti sveikąjį skaičių, galima nurodyti skaitmenų skaičių;
  • Yra nereikšmingų skaitmenų slopinimo režimas.

Led4Digits.h biblioteką galite atsisiųsti iš šios nuorodos:

Ir mokėti. Tik 40 rub. per mėnesį, kad gautumėte prieigą prie visų svetainės išteklių!

Kaip įdiegti parašyta .

Šaltinio tekstų nepateiksiu. Galite juos ieškoti bibliotekos failuose. Komentarų, kaip visada, gausu. Išsamiai su pavyzdžiais aprašysiu, kaip naudotis biblioteka.

LED valdymo biblioteka, skirta Arduino Led4Digits.

Čia yra klasės aprašymas. Pateikiau tik viešus metodus ir savybes.

klasė Led4Digits (
viešas:
baito skaitmuo; // bitų segmentų valdymo kodai
void regen(); // regeneracija, metodas turi būti iškviestas reguliariai
void tetradToSegCod(baitų kasimas, baitų tetradas); // tetrados konvertavimas į segmentų kodus
loginis spausdinimas (nepasirašyta int reikšmė, baitų skaitmenų skaičius, tuščias baitas); // sveikasis skaičius



} ;

Konstruktorius.

Led4Digits (baito tipasLed, baitas digitPin0, baitas digitPin1, baitas digitPin2, baitas digitPin3,
baitas segPinA, baitas segPinB, baitas segPinC, baitas segPinD,
baitas segPinE, baitas segPinF, baitas segPinG, baitas segPinH);

tipoLed Nustato valdymo impulsų poliškumą bitų ir segmentų pasirinkimo signalams. Palaiko visas ryšio schemas ().

tipoLed Kategorijos pasirinkimas Segmentų pasirinkimas Grandinės tipas
0 -_- -_- Bendras anodas su iškrovos pasirinkimo mygtukais
1 _-_ -_- Bendras anodas
2 -_- _-_ Bendrasis katodas
3 _-_ _-_ Bendras katodas su išlydžio pasirinkimo klavišais

digitPin0...digitPin3– išėjimai skaitmenims pasirinkti. Jei digitPin = 255, tada skaitmuo išjungtas. Tai leidžia prijungti mažiau skaitmenų turinčius indikatorius. digitPin0 – žemas (dešinysis) skaitmuo.

segPinA...segPinH– segmentų valdymo išėjimai.

Pavyzdžiui,

reiškia: 1 tipo indikatorius; išleidimo išėjimai 5,4,3,2; 6,7,8,9,10,11,12,13 segmentų išėjimai.

void regen() metodas

Metodas turi būti reguliariai iškviestas lygiagrečiame procese. Jis atkuria vaizdą ant indikatorių. Atkūrimo ciklo laikas yra lygus metodo iškvietimo periodui, padaugintam iš bitų skaičiaus.

Pavyzdžiui,

// pertraukų tvarkytuvas 2 ms
void timerInterrupt() (
disp.regen(); // indikatoriaus regeneracija
}

Baitų skaitmenų masyvas

Nurodoma segmentų būsena. skaitmuo yra mažiausiai reikšmingas bitas, mažiausiai reikšmingas skaitmens bitas yra mažiausiai reikšmingo bito „A“ segmentas. 1 bito būsena reiškia, kad segmentas yra apšviestas.

Pavyzdžiui,

skaitmuo = B0000101;

reiškia, kad antrajame skaitmenyje šviečia segmentai „A“ ir „C“.

Programos, kuri nuosekliai apšviečia visus kiekvieno skaitmens segmentus, pavyzdys.

// bėgimo segmentai
#įtraukti
#įtraukti

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

negalioja sąranka () (
laikmačio pertraukimas 2 ms
MsTimer2::start(); // pertraukimo įjungimas
}

void loop() (
už (int i = 0; i< 32; i++) {
jei (i == 0) disp.skaitmuo= 1;
else if (i == 8) disp.skaitmuo= 1;
else if (i == 16) disp.skaitmuo= 1;
else if (i == 24) disp.skaitmuo= 1;
Kitas(
disp.skaitmuo = disp.skaitmuo<< 1;
disp.skaitmuo = disp.skaitmuo<< 1;
disp.skaitmuo = disp.skaitmuo<< 1;
disp.skaitmuo = disp.skaitmuo<< 1;
}
delsimas(250);
}
}

//pertraukų tvarkytuvas 2 ms
void timerInterrupt() (
disp.regen(); // indikatoriaus regeneracija
}

Skaitmenų masyve 1 pasislenka ir tai rodo indikatoriai.

Metodas negalioja tetradToSegCod (baitų kasimas, baitų tetradas)

Šis metodas leidžia rodyti šešioliktainio kodo skaičius ir raides atskirais skaitmenimis. Turi argumentų:

  • dig – skaitmuo 0 ... 3;
  • tetrad – dešimtainio simbolio kodas. Kodas 0 rodys skaičių "0", kodas 1 - skaičių "1", kodas 14 - raidė "E".

Pavyzdžiui,

tetradas(2, 7);

trečiame skaitmenyje bus rodomas skaičius „7“.

Programos, kuri paeiliui keičia kiekvieno skaitmens simbolius, pavyzdys.

// numeriai po vieną
#įtraukti
#įtraukti

// 1 tipo indikatorius; išleidimo išėjimai 5,4,3,2; segmento išėjimai 6,7,8,9,10,11,12,13
Led4Digits disp(1, 5,4,3,2, 6,7,8,9,10,11,12,13);

negalioja sąranka () (
MsTimer2::set(2, timerInterrupt); // laikmačio pertraukimas 2 ms
MsTimer2::start(); // pertraukimo įjungimas
}

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

// pertraukų tvarkytuvas 2 ms
void timerInterrupt() (
disp.regen(); // indikatoriaus regeneracija
}

Būlio spausdinimo metodas (nepasirašyta int reikšmė, baitų skaitmenų skaičius, tuščias baitas)

Metodas rodo sveikąjį skaičių indikatoriuose. Jis konvertuoja dvejetainį skaičių į BCD kiekvienam skaitmeniui. Turi argumentų:

  • reikšmė – indikatoriuje rodomas skaičius.
  • digitNum – numerio skaitmenų skaičius. Tai neturėtų būti painiojama su indikatoriaus skaitmenų skaičiumi. Galbūt norėsite, kad skaičius būtų rodomas iš 2 skaitmenų, o simboliai – ant kitų dviejų skaitmenų.
  • tuščias – nereikšmingų skaitmenų slopinimo ženklas. blank=0 reiškia, kad skaičius turi būti rodomas su visais nuliais. Skaičius „7“ atrodys kaip „0007“. Jei tuščias laukas skiriasi nuo 0, nereikšmingi nuliai bus panaikinti.

Jei skaičiaus reikšmė viršija leistiną pasirinkto skaitmenų skaičiaus (digitNum) skaičių, funkcija rodys „---“ indikatoriuje ir grąžins klaidingą.

Skaičių išvesties programos pavyzdys.

// išvesties numeris
#įtraukti
#įtraukti

// 1 tipo indikatorius; išleidimo išėjimai 5,4,3,2; segmento išėjimai 6,7,8,9,10,11,12,13
Led4Digits disp(1, 5,4,3,2, 6,7,8,9,10,11,12,13);

negalioja sąranka () (
MsTimer2::set(2, timerInterrupt); // laikmačio pertraukimas 2 ms
MsTimer2::start(); // pertraukimo įjungimas
}

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

// pertraukų tvarkytuvas 2 ms
void timerInterrupt() (
disp.regen(); // indikatoriaus regeneracija
}

Paskutiniai du metodai nekeičia „H“ segmento – kablelio – būsenos. Norėdami pakeisti taško būseną, galite naudoti komandas:

skaitmuo |= 0x80; // uždegti dešimtainį tašką
skaitmuo &= 0x7f; // užgesinti dešimtainį tašką

Išvestis į neigiamų skaičių rodiklius (int).

Neigiami skaičiai gali būti išvesti taip:

  • Patikrinkite skaičiaus ženklą.
  • Jei skaičius neigiamas, atspausdinkite minuso ženklą ties reikšmingiausiu skaitmeniu ir funkcijoje print() pakeiskite skaičiaus ženklą į teigiamą.
  • Jei skaičius teigiamas, išjunkite ženklo bitą ir atspausdinkite skaičių naudodami funkciją print().

Čia yra programa, kuri demonstruoja šį metodą. Išveda skaičius nuo -999 iki 999.

// išvesti neigiamus skaičius
#įtraukti
#įtraukti

// 1 tipo indikatorius; išleidimo išėjimai 5,4,3,2; segmento išėjimai 6,7,8,9,10,11,12,13
Led4Digits disp(1, 5,4,3,2, 6,7,8,9,10,11,12,13);

negalioja sąranka () (
MsTimer2::set(2, timerInterrupt); // laikmačio pertraukimas 2 ms
MsTimer2::start(); // pertraukimo įjungimas
}

void loop() (

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

jeigu aš< 0) {
// skaičius yra neigiamas
disp.skaitmuo= B01000000; // ženklas -
disp.print(i * -1, 3, 1);
}
Kitas(
disp.skaitmuo = B00000000; // išvalykite ženklą
disp.print(i, 3, 1);
}

delsimas(50);
}
}

// pertraukų tvarkytuvas 2 ms
void timerInterrupt() (
disp.regen(); // indikatoriaus regeneracija
}

Išvestis į trupmeninių skaičių rodiklius, slankiojo formato.

Yra daug būdų, kaip rodyti slankiojo kablelio skaičius (plaukiojančius) ant indikatorių naudojant standartines C kalbos funkcijas. Tai, visų pirma, funkcija sprint(). Jis veikia labai lėtai, reikalauja papildomų simbolių kodų konvertavimo į dvejetainius dešimtainius kodus, reikia ištraukti tašką iš eilutės. Tos pačios problemos su kitomis funkcijomis.

Aš naudoju kitą metodą, kad rodyčiau plūduriuojančių kintamųjų reikšmes indikatoriuose. Metodas paprastas, patikimas, greitas. Sumažėja iki šių operacijų:

  • Slankaus kablelio skaičius padauginamas iš 10 iki laipsnio, atitinkančio reikiamą skaičių po kablelio. Jei ant indikatorių reikia rodyti 1 dešimtainį skaičių, padauginkite iš 10, jei 2, tada padauginkite iš 100, 3 skaitmenys po kablelio – iš 1000.
  • Tada slankaus kablelio skaičius yra aiškiai konvertuojamas į sveikąjį skaičių (int) ir rodomas indikatoriuose naudojant funkciją print().
  • Į reikiamą skaitmenį įdedamas taškas.

Pavyzdžiui, šiose eilutėse septynių segmentų šviesos diodams bus išvestas kintamasis su dviem skaičiais po kablelio.

plūduriuoti x = 2,12345;

disp.skaitmuo |= 0x80; //

Skaičių padauginame iš 100, o trečiame skaitmenyje padėję tašką, rezultatą padalijame iš 100.

Čia yra programa, rodanti slankiojo kablelio skaičius nuo 0,00 iki 99,99 ant indikatorių.

// slankiojo kablelio išvestis
#įtraukti
#įtraukti

// 1 tipo indikatorius; išleidimo išėjimai 5,4,3,2; segmento išėjimai 6,7,8,9,10,11,12,13
Led4Digits disp(1, 5,4,3,2, 6,7,8,9,10,11,12,13);

negalioja sąranka () (
MsTimer2::set(2, timerInterrupt); // laikmačio pertraukimas 2 ms
MsTimer2::start(); // pertraukimo įjungimas
}

void loop() (
plūduriuoti x = 0;

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

disp.print((int)(x * 100.), 4, 1);
disp.skaitmuo |= 0x80; // apšvieskite trečiojo lygio tašką

delsimas(50);
}
}

//pertraukų tvarkytuvas 2 ms
void timerInterrupt() (
disp.regen(); // indikatoriaus regeneracija
}

Kaip matote, Led4Digits.h biblioteka labai supaprastina darbą su septynių segmentų šviesos diodų (LED) indikatoriais, prijungtais prie Arduino plokštės. Tokios bibliotekos analogo neradau.

Yra bibliotekos, skirtos darbui su LED ekranais per pamainų registrą. Kažkas man parašė, kad rado biblioteką, kuri veikia su LED ekranu, tiesiogiai prijungtu prie Arduino plokštės. Tačiau jį naudojant indikatoriaus skaitmenys šviečia netolygiai ir mirksi.

Skirtingai nuo analogų, Led4Digits.h biblioteka:

  • Vyksta kaip lygiagretus procesas. Pagrindinėje kilpoje programa įkelia duomenis į tam tikrus kintamuosius, kurie automatiškai rodomi ekrane. Informacijos išvestis ir indikatorių regeneravimas vyksta per laikmačio pertraukimą, nematomą pagrindinei programai.
  • Ekrano skaičiai šviečia tolygiai, nemirksi. Šią savybę užtikrina tai, kad regeneracija vyksta ciklu, griežtai apibrėžtu laikmačio pertraukimu.
  • Biblioteka turi kompaktišką kodą, greitai vykdoma ir minimaliai apkrauna valdiklį.

Kitoje pamokoje prie Arduino plokštės vienu metu prijungsime LED indikatorių ir mygtukų matricą. Parašykime biblioteką tokiam dizainui.

Kategorija: . Galite pažymėti jį.