Portal kuhusu ukarabati wa bafuni. Vidokezo muhimu

Saa kwenye mzunguko wa matrices ya LED. Kufanya saa ya elektroniki kwenye Arduino na mikono yako mwenyewe

Faida za LED hazikubaliki; leo ziko kila mahali, ikiwa ni pamoja na kuona. Tutaangalia faida na hasara za kuona kulingana na matrices ya LED katika makala. Mwishoni mwa makala, mwongozo wa kina wa hatua kwa hatua hutolewa kwa kufanya kifaa mwenyewe.

Ni nini

Saa za matrix ya LED ni saa za kielektroniki zinazotumia matrices ya LED nyingi kwa ajili ya kuonyesha. Matumizi ya viashiria vya aina tofauti ni tofauti yao pekee.

Matrix ni mkusanyiko wa LED zilizokusanywa pamoja kwenye gridi ya taifa na anode moja au cathode. Kama sheria, azimio la viashiria vile - idadi ya dots wima na usawa - ni 8x8.

Kwa nini saa kama hizo zinapata umaarufu, faida:

  1. Bei. Matrices ya LED ni nafuu zaidi kuliko viashiria vya sehemu saba za ukubwa sawa.
  2. Mwangaza. Taa za LED zinang'aa zaidi ya viashiria vya sehemu saba na ni rahisi kuona katika maeneo yaliyo wazi kwa jua. Wazalishaji wengi pia hutoa ulinzi wa miundo kwa diode kutoka kwenye jua.
  3. Utendaji. Kutumia matrix ya LEDs, unaweza kuonyesha sio nambari tu, bali pia herufi mbalimbali, alama za uakifishaji na alama. Kutumia seti ya matrices ya LED, unaweza kuonyesha habari fulani kwa namna ya mstari wa kutambaa.

Matrices ya LED pia yana hasara:

  • Kuongezeka kwa utata wa udhibiti. Kutokana na idadi kubwa ya vipengele (kuna 64 katika matrix ya kawaida), ni rahisi kusimamia viashiria vya tumbo kuliko viashiria vya sehemu saba. Kwa kusudi hili, microcontrollers, dalili ya nguvu na rejista za mabadiliko hutumiwa.
  • Pembe ya kutazama. Upekee wa LEDs ni kwamba wanazingatia mwanga katika mwelekeo mmoja. Hii inasababisha ukweli kwamba picha kwenye matrix ya LED inaonekana wazi tu kutoka kwa pembe fulani.
  • Kutovumilia kwa joto la juu. Joto hupunguza ufanisi wa LEDs na kufupisha maisha yao.
  • Kuchomwa kwa taa za kibinafsi kutasababisha athari ya "pikseli iliyokufa" na kuzorota kwa ubora wa picha.

Saa za kutengeneza nyumbani kwenye matrices ya LED

Licha ya umaarufu mkubwa wa kuona kulingana na matrices ya LED, hakuna mipango mingi kwenye RuNet ya kujifanya mwenyewe. Hebu tuangalie moja maarufu zaidi.

Ujuzi unaohitajika ili kuunganisha kifaa:

  • uzalishaji wa bodi za mzunguko zilizochapishwa;
  • soldering ya vipengele: mzunguko unachukua muundo wa SMD, ambayo ina maana kwamba vipengele vitawekwa moja kwa moja kwenye uso wa bodi;
  • firmware ya microcontroller: mzunguko hutumia microcontroller ATMega16A;
  • Programu ya MK: hii sio lazima, kwani kifaa hiki tayari kina firmware ya mtawala. Ujuzi huu utakuwa muhimu ikiwa unataka kubadilisha hali ya uendeshaji ya saa au kupanua utendaji wake, kwa mfano, kwa kuongeza vipengele vya ziada kama vile vitambuzi vya joto au unyevu.

Zana utahitaji:

  • kit kwa ajili ya kufanya bodi za mzunguko;
  • programu ya MK;
  • chuma cha soldering

Hebu tuangalie kwa karibu mchoro wa kifaa. Kipengele kikuu cha kudhibiti ni ATMega16A microcontroller hutoa uwezo wafuatayo wa kifaa:

  1. Kuhesabu na kalenda. Inaendelea hata wakati nguvu imezimwa.
  2. Kengele. Kuna 9 kati yao hapa, unaweza kuzipanga kufanya kazi kwa siku ya juma.
  3. Kipimo cha joto. Muundo wa saa hukuruhusu kufunga sensorer mbili za joto kwa vipimo ndani ya chumba na nje.
  4. Njia ya mstari wa kutambaa. Inaonyesha habari ifuatayo: siku ya wiki, mwezi, mwaka, joto.
  5. Marekebisho ya saa.

Kazi nyingi hupewa microcontroller, ambayo inakuwezesha kupakua mzunguko na kutumia idadi ndogo ya vipengele.

Kifaa kinatumia microcircuits mbili tu: microcontroller na rejista ya kuhama TPIC6B595 unaweza pia kuunganisha sensorer mbili za joto za DS18B20 - moja ya nje na nyingine ya ndani.

Matrices tatu za 8x8 za LED hutumiwa kuonyeshwa. Ni bora kutumia diode ya Schottky kama diode D1. Diode katika mzunguko hutoa mpito kwa nguvu za dharura, na diode ya Schottky ina kushuka kwa voltage ya chini na kasi ya juu ya kubadili.

Mchakato wa utengenezaji:


Baadhi ya vipengele wakati wa kuunganisha saa kwenye matrix ya LED na ATMega 16A imeelezwa wazi katika video ifuatayo.

Saa kwenye matrices ya LED ina faida nyingi juu ya vifaa vilivyo na aina zingine za maonyesho: ni ya bei nafuu, haipatikani na jua, na inaweza kutumika kuonyesha kiasi kikubwa cha habari. Kuna idadi kubwa ya mifano ya saa kulingana na matrices ya LED, na kila mtu atapata kifaa kilicho na utendaji unaohitajika. Pia, saa kama hiyo sio ngumu kujitengeneza, kama ulivyoona kutoka kwa mwongozo wa hatua kwa hatua hapo juu, hauitaji zana maalum au ujuzi maalum.

Wachezaji wengi wa redio wanaoanza, na sio wengine tu, wanapenda "kuanzisha tena gurudumu" - kila mtu anataka kuunda saa yao ya elektroniki. Hatima hii haikuniepuka pia. Kuna miundo mingi ya saa kwenye Mtandao, lakini kuna saa chache tu kwenye matrices ya LED. Kwenye mtandao wa lugha ya Kirusi nilipata muundo mmoja tu uliokamilika kabisa na maelezo.
Wakati huo huo, matrices ya LED hivi karibuni imeshuka kwa kiasi kikubwa kwa bei, na gharama zao zinaweza hata kuwa chini ya viashiria vya sehemu saba za ukubwa sawa. Kwa mfano, nilinunua GNM23881AD iliyotumiwa na ukubwa wa 60x60mm kwa dola moja na nusu (viashiria vitatu vina gharama ya dola nne na nusu), kwa aina hiyo ya fedha huwezi kununua viashiria vinne vya sehemu saba za ukubwa sawa. Lakini kuweka habari kwenye kiashiria cha matrix itatoa mengi zaidi. Mbali na onyesho la dijiti, matrix ya LED inaweza kuonyesha herufi mbalimbali, ishara, na, kwa kutumia mstari wa kusogeza, maandishi. Baada ya kuchambua haya yote, iliamuliwa kujenga saa ya kazi nyingi kwenye matrices ya LED, wakati kulikuwa na tamaa ya kutokuwa na ugumu wa mzunguko zaidi kuliko viashiria vya sehemu saba. Pia nilitaka mpango huo uwe wa kazi nyingi na sio sawa na wengine. Hivi ndivyo mpango huu ulivyozaliwa.

Utendaji wa saa:
Muda, kalenda, siku za wiki. (mwaka wa kurukaruka huzingatiwa, lakini hakuna mabadiliko ya majira ya joto / majira ya baridi). Uhifadhi wa utendaji wa saa wakati chanzo cha nguvu cha nje kimezimwa (matumizi ya sasa ni 15 μA tu). Marekebisho ya saa + - 59.9 sec/siku, hatua 0.1 sec. 9 kengele. Tatu kati yao ni "wakati mmoja", na 6 ni "ya kudumu", inaweza kubinafsishwa kibinafsi kwa siku ya juma. Muda wa ishara ya sauti kwa kila kengele inaweza kubadilishwa kibinafsi (dakika 1-15).

Uthibitishaji wa sauti wakati wa kushinikiza vifungo (kazi inaweza kulemazwa). Kila saa kuna ishara ya sauti (kazi inaweza kuzimwa). Kutoka 00-00 hadi 08-00 mode ya usingizi, hakuna ishara inayotolewa. Sensorer 1 au 2 za joto (Mtaa na nyumba). Mstari wa kukimbia unaoweza kubinafsishwa, ambao unaweza kuonyesha maelezo yote (isipokuwa wakati) Marekebisho ya kiharusi na mipangilio ya "mstari wa kukimbia" huhifadhiwa kwenye kumbukumbu hata wakati chanzo cha nishati chelezo kimezimwa.

AtMega16A ilichaguliwa kama "moyo" wa saa; vigezo vilikuwa nafuu na uwezo wake wa kumudu. Miguu yake 40 itawawezesha kutambua mawazo yako yote. Kulikuwa na hamu ya kurahisisha mzunguko iwezekanavyo, na kwa hiyo utendaji wote ulipewa mtawala. Matokeo yake yalikuwa mzunguko na chips mbili tu, mtawala na rejista ya TPIC6B595. Ikiwa haiwezekani kupata TPIC6B595, basi inawezekana kabisa kuibadilisha na 74HC595 + ULN2803. Chaguzi zote zimeangaliwa. Unaweza pia kujaribu kuibadilisha na TPIC6C595, lakini ni dhaifu na ina joto kidogo, lakini ilifanya kazi kwa utulivu.

Muda unahesabiwa kwa kutumia timer ya asynchronous - T2. Ikiwa nguvu kuu imepotea, saa inaendelea kukimbia Katika kesi hii, karibu mzunguko mzima umepunguzwa, na mtawala hutumiwa kutoka kwa betri, betri au ionistor. Kulikuwa na tamaa ya "kucheza karibu" na ionistor, ndiyo sababu niliitumia. Saa hutumia takriban 15 µA katika hali ya kusubiri. Kwa nguvu ya chelezo kutoka kwa ionistor ya 1F, uwezo huo ulitosha kwa siku nne, ambayo inatosha kuweka saa kukimbia wakati wa kukatika kwa mtandao. Ikiwa unatumia betri ya CR2032, malipo yatadumu kwa mwaka na nusu.

Mdhibiti husikiliza uwepo wa mtandao kupitia pini. PB3 (ingizo la kulinganisha linalogeuza). Voltage ya usambazaji hutolewa kwa njia ya mgawanyiko R2-R3 kwa pini. PB3, na takriban sawa na 1.5 V. Ikiwa voltage ya usambazaji inashuka hadi volts 4.1, basi voltage kwenye pini. PB3 itakuwa chini ya 1.2 V, na usumbufu kutoka kwa kulinganisha utatolewa, na katika kidhibiti cha usumbufu huu nodi zote za "ziada" za mtawala zitazimwa na mtawala yenyewe atalala. Katika hali hii, tu timer T2 inaendelea kufanya kazi. Wakati nguvu ya nje inaonekana, voltage kwenye PB3 inaongezeka tena juu ya 1.23V, mtawala "kuona" hii itaweka nodes zote katika hali ya kazi. Ikiwa badala ya ionistor betri ya CR2032 hutumiwa, basi lazima iunganishwe kwa njia ya diode (ikiwezekana diode ya Schottky). Anode ya diode imeunganishwa na betri +, na cathode kwa cathode VD1.

Katika hali ya kawaida, skrini huonyesha muda katika umbizo la saa-dakika. Ticker huanza kufanya kazi kwa vipindi vya dakika moja. Mstari unaoendesha unaonyesha siku ya wiki, tarehe, mwaka, joto. nyumbani, na joto. mitaani. Ticker inaweza kubinafsishwa, i.e. Unaweza kuwasha/kuzima onyesho la vipengele vyovyote. (kwa mfano, mimi huzima onyesho la mwaka kila wakati). Wakati vipengele vyote vimezimwa, ticker haianza na saa huonyesha wakati wa sasa kila wakati.

Saa 9 za kengele zimegawanywa katika 3 zinazoweza kutumika na 6 zinazoweza kutumika tena. Unapowasha kengele 1-3, zinasikika mara moja tu. Ili zifanye kazi tena, lazima ziwashwe kwa mikono tena. Na saa za kengele 4-9 zinaweza kutumika tena, i.e. watafanya kazi kila siku kwa wakati uliowekwa. Kwa kuongeza, kengele hizi zinaweza kuwekwa ili kuzimwa tu siku fulani za wiki. Hii ni rahisi, kwa mfano, ikiwa hutaki kengele kukuamsha mwishoni mwa wiki. Au kwa mfano, unahitaji kuamka siku za wiki saa 7-00, na Alhamisi saa 8-00, na mwishoni mwa wiki huhitaji saa ya kengele. Kisha tunaweka moja inayoweza kutumika tena saa 7-00 Jumatatu-Jumatano na Ijumaa, na ya pili saa 8-00 siku ya Alhamisi ..... Kwa kuongeza, saa zote za kengele zina mpangilio wa muda wa ishara, na ikiwa wewe, kwa utaratibu. kuamka, usiwe na ishara ya kutosha kwa dakika 1, basi unaweza kuiongeza kwa muda kutoka dakika 1 hadi 15.

Kozi hiyo inasahihishwa mara moja kwa siku, saa 00-00. Ikiwa saa ni ya haraka, kwa mfano, kwa sekunde 5 kwa siku, basi saa 00-00-00 wakati utawekwa 23-59-55, lakini ikiwa saa ni polepole, basi saa 00-00-00 wakati huo. itawekwa 00-00-05. Hatua ya kurekebisha - 0.1 sec. Usahihishaji wa juu - 59.9 sec / siku. Kwa quartz inayofanya kazi, hakuna uwezekano wa kuhitaji zaidi. Urekebishaji pia unafanywa katika hali ya kusubiri wakati inaendeshwa na betri.

Unaweza kutumia matrix yoyote ya LED ya 8 * 8 LED na cathode ya kawaida. Kama ilivyotajwa tayari, nilitumia GNM23881AD. Lakini unaweza "kukusanya" matrix kutoka kwa LED za kibinafsi. Microcontroller ya AtMega16a inaweza kubadilishwa na "zamani" AtMega16 na barua L. Wakati huo huo, kinadharia, matumizi ya sasa kutoka kwa betri yanapaswa kuongezeka kidogo. Labda tu AtMega16 itafanya kazi, lakini shida zinaweza kutokea wakati wa kufanya kazi kwa nguvu ya betri. Diode D1 - ikiwezekana diode yoyote ya Schottky. Pia inafanya kazi na kirekebishaji cha kawaida, lakini ili kujikinga na glitches mbalimbali zinazohusiana na ukweli kwamba sehemu ya mzunguko inaendeshwa na voltage "kabla ya diode", na sehemu "baada ya diode", ni bora kutafuta. Schottky voltage. Transistor VT1 - n-p-n yoyote.

Saa inadhibitiwa na vifungo viwili. Idadi yao inaweza kuongezeka hadi vipande 8 bila kuongeza vipengele vingine isipokuwa vifungo wenyewe, lakini nilitaka kujaribu "kutoka" na mbili tu. Vifungo vinaitwa kwa kawaida "Sawa" na "HATUA". Kitufe cha "STEP" kawaida huhamia kwenye kipengee cha menyu kinachofuata, na kitufe cha "Sawa" hubadilisha vigezo vya menyu ya sasa. Ishara ya kengele iliyowashwa inaweza pia kuzimwa kwa kutumia vitufe vya "OK" au "STEP". Kubonyeza kitufe chochote kengele inapolia huizima. Mpango wa udhibiti uligeuka kama hii.

Wapenzi wengi wa redio, wanaoanza na wengine, wanapenda "kuanzisha tena gurudumu" - huunda saa zao za elektroniki. Hatima hii pia haikuniacha. Leo, bila shaka, kuna miundo mingi ya kuangalia kwenye mtandao, lakini kwa sababu fulani kuna saa chache tu kwenye matrices ya LED kati yao. Kwenye mtandao unaozungumza Kirusi nilipata moja tu iliyokamilishwa kabisa na iliyoelezea muundo. Wakati huo huo, matrices ya LED sasa yamekuwa ya bei nafuu zaidi, na gharama zao si za juu, au hata chini, kuliko viashiria vya sehemu saba za ukubwa sawa. Kwa mfano, GNM23881AD niliyotumia na ukubwa wa 60x60 mm ilinunuliwa kwa euro 1.5 (viashiria 3 vina gharama ya euro 4.5), kwa pesa hii huwezi kununua viashiria vinne vya sehemu saba za ukubwa sawa. Lakini habari nyingi zaidi zinaweza kuwekwa kwenye kiashiria cha matrix. Mbali na nambari, wanaweza kuonyesha barua yoyote, ishara, na kwa msaada wa mstari wa kutambaa, pia maandishi. Kulingana na hili, kulikuwa na tamaa ya kujenga saa kwenye matrices ya LED, lakini ili mzunguko usiwe ngumu zaidi kuliko wale wa sehemu saba. Nilitaka pia ifanye kazi kabisa na sio kama wengine. Hivyo mpango ufuatao ulizaliwa.

Utendaji wa saa ni kama ifuatavyo:

Kuhesabu, kalenda, siku ya wiki. (miaka ya kurukaruka inazingatiwa, mpito wa majira ya joto / majira ya baridi haufanyiki).

Uhifadhi wa saa katika tukio la kupoteza nguvu za nje (matumizi ni microns 15).

Marekebisho ya kiharusi + - 59.9 sek/siku, katika nyongeza za sekunde 0.1.

9 kengele. 3 kati ya hizo ni za "wakati mmoja", na 6 "za kudumu", ambazo zinaweza kubinafsishwa kibinafsi kulingana na siku ya juma.

Muda wa kubadilishwa wa mtu binafsi wa ishara ya sauti kwa kila kengele (dakika 1-15).

Uthibitisho wa sauti wa mibonyezo ya kitufe (inaweza kulemazwa).

Beep ya kila saa (inaweza kuzimwa). Kutoka 00-00 hadi 08-00 hakuna ishara.

Sensorer 1 au 2 za halijoto (Mtaani na nyumbani).

Tia inayoweza kubinafsishwa, ambayo habari yote huonyeshwa (isipokuwa wakati)

Thamani ya urekebishaji wa kiharusi na mipangilio ya "mstari wa kukimbia" huhifadhiwa hata kama nguvu ya chelezo imepotea.

AtMega16A ilichaguliwa kama "moyo" wa saa, kwa sababu ya upatikanaji wake, bei nafuu na "uhalali". Nilitaka kurahisisha mzunguko iwezekanavyo, kwa hivyo kila kitu kilichowezekana kilipewa mtawala. Kwa hivyo, tulifanikiwa kupita tukiwa na miduara midogo miwili tu, kidhibiti na rejista ya TPIC6B595. Ikiwa TPIC6B595 haipatikani kwa mtu, basi unaweza kuibadilisha na 74HC595 + ULN2803. Chaguzi zote mbili zimejaribiwa. Unaweza pia kujaribu kutumia TPIC6C595, ni dhaifu kidogo na ilipata joto kidogo, lakini kwa ujumla ilifanya kazi kwa utulivu. Muda unahesabiwa kwa kutumia muda wa asynchronous - T2. Saa inaendelea kufanya kazi hata ikiwa kuna hitilafu ya nguvu. Kwa wakati huu, zaidi ya mzunguko ni de-energized, na mtawala ni powered na betri, accumulator, au ionistor. Nilikuwa na nia ya "kucheza karibu" na ionistor, kwa hiyo niliitumia. Matumizi ya sasa ya saa katika hali ya kusubiri ni mikroni 15. Wakati inaendeshwa na ionistor ya 1F, saa "ilidumu" kwa siku nne. Hii inatosha kabisa kudumisha kasi wakati wa kukatika kwa umeme. Ikiwa unatumia betri ya CR2032, basi kinadharia, kulingana na mahesabu, malipo yanapaswa kutosha kwa miaka 1.5. Mdhibiti "husikiliza" kwa uwepo wa voltage ya mtandao kupitia pini PB.3 Pini hii ni pembejeo ya inverting ya comparator. Voltage ya usambazaji, kupitia kigawanyaji R2-R3, hutolewa kwa pini PB.3, na katika hali ya kawaida ni takriban 1.5 V. Ikiwa voltage ya nje itashuka chini ya volts 4.1, basi voltage kwenye pini RV.3 itakuwa chini ya volts 1.23, na usumbufu kutoka kwa kulinganisha utatolewa, na katika kidhibiti cha usumbufu nodi zote za "ziada" za mtawala zitageuka. mbali na mtawala mwenyewe atalala. Katika hali hii, tu timer T2 inaendelea kufanya kazi. Wakati nguvu ya nje inaonekana, voltage kwenye RV.3 itaongezeka tena juu ya 1.23V, mtawala "kuona" hii itaweka nodes zote katika hali ya kazi. Ikiwa badala ya ionistor betri ya CR2032 hutumiwa, basi lazima iunganishwe kwa njia ya diode (ikiwezekana diode ya Schottky). Anode ya diode imeunganishwa na betri +, na cathode kwa cathode VD1.

Katika hali ya kawaida, skrini huonyesha muda katika umbizo la saa-dakika. Ticker huanza kufanya kazi kwa vipindi vya dakika moja. Mstari unaoendesha unaonyesha siku ya wiki, tarehe, mwaka, joto. nyumbani, na joto. mitaani. Ticker inaweza kubinafsishwa, i.e. Unaweza kuwasha/kuzima onyesho la vipengele vyovyote. (kwa mfano, mimi huzima onyesho la mwaka kila wakati). Wakati vipengele vyote vimezimwa, ticker haianza na saa huonyesha wakati wa sasa kila wakati.

Saa 9 za kengele zimegawanywa katika 3 zinazoweza kutumika na 6 zinazoweza kutumika tena. Unapowasha kengele 1-3, zinasikika mara moja tu. Ili zifanye kazi tena, lazima ziwashwe kwa mikono tena. Na saa za kengele 4-9 zinaweza kutumika tena, i.e. watafanya kazi kila siku kwa wakati uliowekwa. Kwa kuongeza, kengele hizi zinaweza kuwekwa ili kuzimwa tu siku fulani za wiki. Hii ni rahisi, kwa mfano, ikiwa hutaki kengele kukuamsha mwishoni mwa wiki. Au kwa mfano, unahitaji kuamka siku za wiki saa 7-00, na Alhamisi saa 8-00, na mwishoni mwa wiki huhitaji saa ya kengele. Kisha tunaweka moja inayoweza kutumika tena saa 7-00 Jumatatu-Jumatano na Ijumaa, na ya pili saa 8-00 siku ya Alhamisi ..... Kwa kuongeza, saa zote za kengele zina mpangilio wa muda wa ishara, na ikiwa wewe, kwa utaratibu. kuamka, usiwe na ishara ya kutosha kwa dakika 1, basi unaweza kuiongeza kwa muda kutoka dakika 1 hadi 15.

Kozi hiyo inasahihishwa mara moja kwa siku, saa 00-00. Ikiwa saa ni ya haraka, kwa mfano, kwa sekunde 5 kwa siku, basi saa 00-00-00 wakati utawekwa 23-59-55, lakini ikiwa saa ni polepole, basi saa 00-00-00 wakati huo. itawekwa 00-00-05. Hatua ya kurekebisha - 0.1 sec. Usahihishaji wa juu zaidi - sekunde 59.9 / siku. Kwa quartz inayofanya kazi, hakuna uwezekano wa kuhitaji zaidi. Urekebishaji pia unafanywa katika hali ya kusubiri wakati inaendeshwa na betri.

Matrices ya LED yanaweza kutumia LED yoyote 8 * 8 na cathode ya kawaida. Kama ilivyoelezwa tayari, nilitumia GNM23881AD. Kimsingi, unaweza "kukusanya" matrix kutoka kwa LED za kibinafsi. Microcontroller ya AtMega16a inaweza kubadilishwa na "zamani" AtMega16 na barua L. Wakati huo huo, kinadharia, matumizi ya sasa kutoka kwa betri yanapaswa kuongezeka kidogo. Labda tu AtMega16 itafanya kazi, lakini shida zinaweza kutokea wakati wa kufanya kazi kwa nguvu ya betri. Diode D1 - ikiwezekana diode yoyote ya Schottky. Pia inafanya kazi na kirekebishaji cha kawaida, lakini ili kujikinga na glitches mbalimbali zinazohusiana na ukweli kwamba sehemu ya mzunguko inaendeshwa na voltage "kabla ya diode", na sehemu "baada ya diode", ni bora kutafuta. Schottky voltage. Transistor VT1 - yoyote n-p-n.

Saa inadhibitiwa na vifungo viwili. Idadi yao inaweza kuongezeka hadi vipande 8 bila kuongeza vipengele vingine isipokuwa vifungo wenyewe, lakini nilitaka kujaribu "kutoka" na mbili tu. Vifungo vinaitwa kwa kawaida "Sawa" na "HATUA". Kitufe cha "STEP" kawaida huhamia kwenye kipengee cha menyu kinachofuata, na kitufe cha "Sawa" hubadilisha vigezo vya menyu ya sasa. Ishara ya kengele iliyowashwa inaweza pia kuzimwa kwa kutumia vitufe vya "OK" au "STEP". Kubonyeza kitufe chochote kengele inapolia huizima. Mpango wa udhibiti uligeuka kama hii:

Kimuundo, saa inafanywa kwenye PCB moja. Ukubwa wa PP unafanana na ukubwa wa viashiria. Upana wa chini wa barabara za PP ni 0.4mm, umbali kati yao ni 0.4mm. Kwa hivyo wapenzi wa LUT wanaweza kutengeneza bodi wenyewe kwa urahisi.

Kuna njia nyingi za kukusanya saa ya elektroniki na mikono yako mwenyewe: michoro zinawasilishwa sana katika fasihi na kwenye mtandao. Utekelezaji mwingi wa kisasa unategemea vidhibiti vidogo. Kukamilisha miradi hiyo mara nyingi kunahitaji ujuzi mkubwa wa vitendo na ujuzi wa kinadharia katika uwanja wa umeme: uwezo wa kutumia programu maalumu, kuunda bodi za mzunguko zilizochapishwa nyumbani kwa kutumia etching ya kloridi ya feri, na soldering nzuri. Pia unahitaji kuwa na aina mbalimbali za zana na vifaa.

Walakini, kuna njia rahisi na ya bei nafuu ya kukusanya saa ya elektroniki na mikono yako mwenyewe nyumbani: tumia jukwaa la Arduino. Ni programu na vifaa tata iliyoundwa mahsusi kwa ajili ya kufundisha misingi ya programu na vifaa vya elektroniki. Kwa msaada wa Arduino, mtu yeyote, hata bila mafunzo maalum ya awali, anaweza kujenga saa ya umeme kwa mikono yao wenyewe: michoro za mzunguko, mipango ya uhandisi na hata chuma cha soldering hazihitajiki!

Uunganisho wa vifaa vyote vya elektroniki hufanywa kwenye bodi maalum ya mawasiliano ("isiyo na soko"), ambayo huondoa hatari ya kuchoma, kupunguzwa na majeraha mengine - kwa hivyo, unaweza kufanya kazi na mbuni wa Arduino pamoja na watoto. Njia ya kuona ya kuwasilisha mchoro wa mzunguko itakusaidia kuepuka kufanya makosa wakati wa kukusanya kifaa.

Hatua ya 1. Orodha ya vipengele

Ili kukusanya saa rahisi kwenye matrices ya LED utahitaji vipengele vichache tu vya bei nafuu:

  • Jukwaa la Arduino. Mifano rahisi zaidi itafanya - au Micro;
  • wasiliana na bodi ya mkate;
  • kuunganisha waya kwa bodi ya mkate;
  • Moduli ya saa ya Adafruit DS3231;
  • Moduli ya matrix ya LED 32x8 MAX7219;
  • vifungo viwili.

Utahitaji pia kompyuta ya kibinafsi na kebo ya USB-mini-USB ili kupakia programu ya udhibiti kwenye kumbukumbu. Hiyo yote - chuma cha soldering, strippers ya insulation, visu za kuziweka na zana nyingine za kitaaluma hazihitajiki: shughuli zote zinafanywa kwa mkono. Labda katika hali zingine ni rahisi zaidi kutumia kibano, lakini unaweza kufanya bila hiyo.


Hatua ya 2. Kukusanya mzunguko wa umeme

Mzunguko wa saa ya elektroniki iliyo na kiashiria cha LED kwa kutumia Arduino itaonekana rahisi sana hata kwa amateurs wasio na uzoefu wa redio. Waya chache tu zinahitajika kwa mkusanyiko. Jedwali la uunganisho:

Moduli ya Arduino → 32x8 MAX7219 matrix ya LED

Moduli ya Arduino → saa ya saa ya Adafruit DS3231

Arduino moduli → vifungo

D2 - kitufe cha 1

D3 - kitufe cha 2

Pini ya pili ya vifungo imeunganishwa na GND.

Unahitaji tu kuzingatia na kukumbuka jinsi shimo za mawasiliano kwenye ubao wa mkate zimeunganishwa kwa kila mmoja. Mchoro ufuatao unaonyesha njia ya uunganisho wa ndani wa mashimo ya mawasiliano:


Safu mlalo mbili (1 na 4) kwa pande zote mbili zimefupishwa kwa mlalo - kwa kawaida hutumiwa kama njia ya umeme ya +5V na ardhi ya GND. Anwani zote za ndani (2 na 3) zimefungwa kwa wima. Katika kesi hii, bodi ya mzunguko imegawanywa kwa wima na kwa usawa katika sehemu mbili za ulinganifu zinazojitegemea. Hii inaruhusu, kwa mfano, kukusanya vifaa viwili tofauti kwenye ubao mmoja.

Mchoro wa saa ya elektroniki yenye dalili ya LED, pamoja na mpangilio wa vipengele kwenye bodi ya mzunguko, inavyoonyeshwa kwenye mfano:

Angalia kwa uangalifu kwamba viunganisho vyote vinazingatia mchoro ulioonyeshwa. Pia hakikisha kwamba waendeshaji wamehifadhiwa vizuri katika mashimo ya mawasiliano ya bodi ya mzunguko.


Hatua ya 3. Firmware ya Arduino

Mara tu mkusanyiko na upimaji wa mzunguko ukamilika, unaweza kuanza kupakia programu ya udhibiti (au "firmware") kwenye kumbukumbu ya Arduino.


Ili kufanya hivyo, unahitaji kufunga mazingira ya bure ya maendeleo rasmi -. Utahitaji pia msimbo wa chanzo wa mradi, ambao unaweza kupakua hapa chini kwenye kumbukumbu na maktaba zote na mchoro, na ikiwa unahitaji tu mchoro, unaweza kuinakili kando:

// ni pamoja na maktaba: #pamoja na "LedControl.h" #include // Maktaba ya herufi #pamoja na // Saa ya DS1307 #pamoja na "RTClib.h" // Saa ya DS1307 #pamoja na // Maktaba ya Kitufe na Alexander Brevig // Weka Matrix ya LED // pin 12 imeunganishwa kwenye DataIn kwenye onyesho // pin 11 imeunganishwa na CLK kwenye onyesho // pin 10 imeunganishwa kwa LOAD kwenye onyesho LedControl lc = LedControl(6, 5, 4, 4); // huweka pini 3 kama 12, 11 & 10 na kisha kuweka maonyesho 4 (max ni maonyesho 8) //vigeu vya kimataifa ukubwa wa byte = 7; // Uzito/mwangaza chaguomsingi (0-15) byte clock_mode = 0; // Hali ya saa chaguo-msingi. Chaguo-msingi = 0 (mode_ya_msingi) bool random_mode = 0; // Fafanua hali ya nasibu - hubadilisha aina ya onyesho kila baada ya masaa machache. Chaguo-msingi = 0 (zime) byte old_mode = clock_mode; // Huhifadhi hali ya saa iliyotangulia, kwa hivyo ikiwa tunaenda hadi sasa au chochote, tunajua ni hali gani ya kurudi nyuma. bool ampm = 0; // Bainisha muda wa saa 12 au 24. 0 = saa 24. 1 = saa 12 byte change_mode_time = 0; // Hushikilia saa ambapo modi ya saa itabadilika tena ikiwa katika hali ya nasibu. unsigned muda mrefu wa kuchelewa = 500; // Sisi daima kusubiri kidogo kati ya updates ya kuonyesha int rtc; // Hushikilia muda halisi wa pato la siku za char = ( "Jua", "Mon", "Jumanne", "Wed", "Thu", "Fri", "Sat" ); //safu ya siku - inatumika katika hali ya slaidi, msingi_na njia za jumble (The DS1307 hutoa maadili 1-7 kwa siku ya wiki) char dayfull = ( "Jumapili", "Jumatatu", "Jumanne", "Jumanne", "Alhamisi ", "Ijumaa", "Jumamosi"); kiambishi cha char = ("st", "nd", "rd", "th" ); // safu ya kiambishi cha tarehe, inayotumika katika hali ya slaidi, modi_msingi na modi za jumble. e,g, 2 ya 1 ... //fafanua viunga #fafanua NUM_DISPLAY_MODES 3 // Njia za kuonyesha nambari (kubadilisha sufuri kama modi ya kwanza) #fafanua NUM_SETTINGS_MODES 4 // Mipangilio ya nambari = 6 (ikibadilisha sifuri kama modi ya kwanza) # fafanua SLIDE_DELAY 20 // Muda katika milisekunde kwa madoido ya slaidi kwa kila herufi katika modi ya slaidi. Ifanye hii iwe juu zaidi kwa athari ya polepole #fafanua cls clear_display // Onyesha wazi RTC_DS1307 ds1307; // Unda Kitufe cha Kitufe cha RTC = Kitufe (2, BUTTON_PULLUP); // Kitufe cha kusanidi (kwa kutumia maktaba ya kifungo) Kitufe cha kitufeB = Kitufe (3, BUTTON_PULLUP); // Kitufe cha kusanidi B (kwa kutumia vitufe) usanidi utupu() (DijitaliWrite(2, HIGH); // washa kipingamizi cha kuvuta kwa kitufe kwenye pini 2 ya kidijitaliWrite(3, HIGH); // washa kipingamizi cha kuvuta kwa kitufe kwenye pini 3 digitalWrite(4, HIGH); // washa kipingamizi cha kuvuta kwa kitufe kwenye pin 4 Serial.begin(9600); vifaa vya int vya LedControl = lc.getDeviceCount();< devices; address++) { /*The MAX72XX is in power-saving mode on startup*/ lc.shutdown(3-address, false); /* Set the brightness to a medium values */ lc.setIntensity(3-address, intensity); /* and clear the display */ lc.clearDisplay(3-address); } //Setup DS1307 RTC #ifdef AVR Wire.begin(); #else Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino #endif ds1307.begin(); //start RTC Clock if (! ds1307.isrunning()) { Serial.println("RTC is NOT running!"); ds1307.adjust(DateTime(__DATE__, __TIME__)); // sets the RTC to the date & time this sketch was compiled } //Show software version & hello message printver(); //enable red led digitalWrite(13, HIGH); } void loop() { //run the clock with whatever mode is set by clock_mode - the default is set at top of code. switch (clock_mode){ case 0: basic_mode(); break; case 1: small_mode(); break; case 2: slide(); break; case 3: word_clock(); break; case 4: setup_menu(); break; } } //plot a point on the display void plot (byte x, byte y, byte val) { //select which matrix depending on the x coord byte address; if (x >= 0 && x<= 7) { address = 3; } if (x >= 8 && x<= 15) { address = 2; x = x - 8; } if (x >= 16 && x<= 23) { address = 1; x = x - 16; } if (x >= 24 && x<= 31) { address = 0; x = x - 24; } if (val == 1) { lc.setLed(address, y, x, true); } else { lc.setLed(address, y, x, false); } } //clear screen void clear_display() { for (byte address = 0; address < 4; address++) { lc.clearDisplay(address); } } //fade screen down void fade_down() { //fade from global intensity to 1 for (byte i = intensity; i >0; i--) ( kwa (anwani ya baiti = 0; anwani< 4; address++) { lc.setIntensity(address, i); } delay(30); //change this to change fade down speed } clear_display(); //clear display completely (off) //reset intentsity to global val for (byte address = 0; address < 4; address++) { lc.setIntensity(address, intensity); } } //power up led test & display software version number void printver() { byte i = 0; char ver_a = "MADE"; char ver_b = "IN"; char ver_c = "RUSSIA"; //test all leds. for (byte x = 0; x <= 32; x++) { for (byte y = 0; y <= 7; y++) { plot(x, y, 1); } } delay(300); fade_down(); while (ver_a[i]) { puttinychar((i * 4), 1, ver_a[i]); delay(35); i++; } delay(500); fade_down(); i = 0; while (ver_b[i]) { puttinychar((i * 4), 1, ver_b[i]); delay(35); i++; } delay(500); fade_down(); i = 0; while (ver_c[i]) { puttinychar((i * 4), 1, ver_c[i]); delay(35); i++; } delay(500); fade_down(); } // puttinychar // Copy a 3x5 character glyph from the myfont data structure to display memory, with its upper left at the given coordinate // This is unoptimized and simply uses plot() to draw each dot. void puttinychar(byte x, byte y, char c) { byte dots; if (c >= "A" && c<= "Z" || (c >= "a" && c<= "z")) { c &= 0x1F; // A-Z maps to 1-26 } else if (c >= "0" && c<= "9") { c = (c - "0") + 32; } else if (c == " ") { c = 0; // space } else if (c == ".") { c = 27; // full stop } else if (c == ":") { c = 28; // colon } else if (c == "\"") { c = 29; // single quote mark } else if (c == "!") { c = 30; // single quote mark } else if (c == "?") { c = 31; // single quote mark } for (byte col = 0; col < 3; col++) { dots = pgm_read_byte_near(&mytinyfont[c]); for (char row = 0; row < 5; row++) { if (dots & (16 >> safu)) njama (x + col, y + safu, 1);<= "Z" || (c >= "a" && c<= "z")) { // c &= 0x1F; // A-Z maps to 1-26 // } if (c >= "A" && c<= "Z") { c &= 0x1F; // A-Z maps to 1-26 } else if (c >= "a" && c<= "z") { c = (c - "a") + 41; // A-Z maps to 41-67 } else if (c >= "0" && c<= "9") { c = (c - "0") + 31; } else if (c == " ") { c = 0; // space } else if (c == ".") { c = 27; // full stop } else if (c == "\"") { c = 28; // single quote mark } else if (c == ":") { c = 29; // clock_mode selector arrow } else if (c == ">njama nyingine (x + col, y + safu, 0);<= -67) { c *= -1; } for (char col = 0; col < 5; col++) { dots = pgm_read_byte_near(&myfont[c]); for (char row = 0; row < 7; row++) { //check coords are on screen before trying to plot //if ((x >) ) ) utupu putnormalchar(byte x, byte y, char c) ( nukta ndogo; // ikiwa (c >= "A" && c<= 31) && (y >") ( c = 30; // mshale wa kiteuzi cha clock_mode ) vinginevyo ikiwa (c >= -80 && c<= 7)){ if (dots & (64 >= 0) && (x< 10) { buffer = buffer; buffer = "0"; } puttinychar(20, 1, ":"); //seconds colon puttinychar(24, 1, buffer); //seconds puttinychar(28, 1, buffer); //seconds old_secs = secs; } //if minute changes change time if (mins != rtc) { //reset these for comparison next time mins = rtc; byte hours = rtc; if (hours > < 1) { hours = hours + ampm * 12; } //byte dow = rtc; // the DS1307 outputs 0 - 6 where 0 = Sunday0 - 6 where 0 = Sunday. //byte date = rtc; //set characters char buffer; itoa(hours, buffer, 10); //fix - as otherwise if num has leading zero, e.g. "03" hours, itoa coverts this to chars with space "3 ". if (hours < 10) { buffer = buffer; //if we are in 12 hour mode blank the leading zero. if (ampm) { buffer = " "; } else { buffer = "0"; } } //set hours chars textchar = buffer; textchar = buffer; textchar = ":"; itoa (mins, buffer, 10); if (mins < 10) { buffer = buffer; buffer = "0"; } //set mins characters textchar = buffer; textchar = buffer; //do seconds textchar = ":"; buffer; secs = rtc; itoa(secs, buffer, 10); //fix - as otherwise if num has leading zero, e.g. "03" secs, itoa coverts this to chars with space "3 ". if (secs < 10) { buffer = buffer; buffer = "0"; } //set seconds textchar = buffer; textchar = buffer; byte x = 0; byte y = 0; //print each char for (byte x = 0; x < 6 ; x++) { puttinychar(x * 4, 1, textchar[x]); } } delay(50); } fade_down(); } // basic_mode() // show the time in 5x7 characters void basic_mode() { cls(); char buffer; //for int to char conversion to turn rtc values into chars we can print on screen byte offset = 0; //used to offset the x postition of the digits and centre the display when we are in 12 hour mode and the clock shows only 3 digits. e.g. 3:21 byte x, y; //used to draw a clear box over the left hand "1" of the display when we roll from 12:59 ->= 0) && (y< 1) { hours = hours + ampm * 12; } //do offset conversion if (ampm && hours < 10) { offset = 2; } //set the next minute we show the date at //set_next_date(); // initially set mins to value 100 - so it wll never equal rtc on the first loop of the clock, meaning we draw the clock display when we enter the function byte secs = 100; byte mins = 100; int count = 0; //run clock main loop as long as run_mode returns true while (run_mode()) { //get the time from the clock chip get_time(); //check for button press if (buttonA.uniquePress()) { switch_mode(); return; } if (buttonB.uniquePress()) { display_date(); return; } //check whether it"s time to automatically display the date //check_show_date(); //draw the flashing: as on if the secs have changed. if (secs != rtc) { //update secs with new value secs = rtc; //draw: plot (15 - offset, 2, 1); //top point plot (15 - offset, 5, 1); //bottom point count = 400; } //if count has run out, turn off the: if (count == 0) { plot (15 - offset, 2, 0); //top point plot (15 - offset, 5, 0); //bottom point } else { count--; } //re draw the display if button pressed or if mins != rtc i.e. if the time has changed from what we had stored in mins, (also trigggered on first entering function when mins is 100) if (mins != rtc) { //update mins and hours with the new values mins = rtc; hours = rtc; //adjust hours of ampm set to 12 hour mode if (hours >> safu)) ( // safu 7 pekee. plot(x + col, y + safu, 1); ) vinginevyo ( plot(x + col, y + row, 0); ) //) ) ) //small_mode // onyesha muda katika herufi ndogo 3x5 huku sekunde zikionyesha hali ya utupu ndogo_() ( char textchar; // herufi 16 kwenye onyesho la byte mins = 100; //mins byte secs = rtc; //seconds byte old_secs = secs; / /hushikilia thamani ya sekunde za zamani - kutoka sekunde za mara ya mwisho zilisasishwa o onyesho - lililotumiwa kuangalia ikiwa sekunde zimebadilika kitanzi kikuu cha saa (//run saa ilimradi run_mode inarudi kweli wakati (run_mode()) ( get_time(); / /angalia ubonyeze kitufe ikiwa (buttonA.uniquePress()) ( switch_mode(); rudisha; ) ikiwa (buttonB.uniquePress()) ( display_date(); return; ) //kama sekunde zimebadilika basi zisasishe kwenye onyesho secs = rtc; ikiwa (sekunde != old_secs) ( //secs char buffer; itoa(secs, buffer, 10); //fix - vinginevyo ikiwa num ina sifuri inayoongoza, k.m. "03" sekunde, itoa inashughulikia hii hadi chari zilizo na nafasi. "3".kama(sekunde< 1) { hours = hours + ampm * 12; } itoa(hours, buffer, 10); //if hours < 10 the num e.g. "3" hours, itoa coverts this to chars with space "3 " which we dont want if (hours < 10) { buffer = buffer; buffer = "0"; } //print hours //if we in 12 hour mode and hours < 10, then don"t print the leading zero, and set the offset so we centre the display with 3 digits. if (ampm && hours < 10) { offset = 2; //if the time is 1:00am clear the entire display as the offset changes at this time and we need to blank out the old 12:59 if ((hours == 1 && mins == 0)) { cls(); } } else { //else no offset and print hours tens digit offset = 0; //if the time is 10:00am clear the entire display as the offset changes at this time and we need to blank out the old 9:59 if (hours == 10 && mins == 0) { cls(); } putnormalchar(1, 0, buffer); } //print hours ones digit putnormalchar(7 - offset, 0, buffer); //print mins //add leading zero if mins < 10 itoa (mins, buffer, 10); if (mins < 10) { buffer = buffer; buffer = "0"; } //print mins tens and ones digits putnormalchar(19 - offset, 0, buffer); putnormalchar(25 - offset, 0, buffer); } } fade_down(); } //like basic_mode but with slide effect void slide() { byte digits_old = {99, 99, 99, 99}; //old values we store time in. Set to somthing that will never match the time initially so all digits get drawn wnen the mode starts byte digits_new; //new digits time will slide to reveal byte digits_x_pos = {25, 19, 7, 1}; //x pos for which to draw each digit at char old_char; //used when we use itoa to transpose the current digit (type byte) into a char to pass to the animation function char new_char; //used when we use itoa to transpose the new digit (type byte) into a char to pass to the animation function //old_chars - stores the 5 day and date suffix chars on the display. e.g. "mon" and "st". We feed these into the slide animation as the current char when these chars are updated. //We sent them as A initially, which are used when the clocl enters the mode and no last chars are stored. //char old_chars = "AAAAA"; //plot the clock colon on the display cls(); putnormalchar(13, 0, ":"); byte old_secs = rtc; //store seconds in old_secs. We compare secs and old secs. WHen they are different we redraw the display //run clock main loop as long as run_mode returns true while (run_mode()) { get_time(); //check for button press if (buttonA.uniquePress()) { switch_mode(); return; } if (buttonB.uniquePress()) { display_date(); return; } //if secs have changed then update the display if (rtc != old_secs) { old_secs = rtc; //do 12/24 hour conversion if ampm set to 1 byte hours = rtc; if (hours >> safu)) ( // safu 7 pekee. plot(x + col, y + safu, 1); ) vinginevyo ( plot(x + col, y + row, 0); ) //) ) ) //small_mode // onyesha muda katika herufi ndogo 3x5 huku sekunde zikionyesha hali ya utupu ndogo_() ( char textchar; // herufi 16 kwenye onyesho la byte mins = 100; //mins byte secs = rtc; //seconds byte old_secs = secs; / /hushikilia thamani ya sekunde za zamani - kutoka sekunde za mara ya mwisho zilisasishwa o onyesho - lililotumiwa kuangalia ikiwa sekunde zimebadilika kitanzi kikuu cha saa (//run saa ilimradi run_mode inarudi kweli wakati (run_mode()) ( get_time(); / /angalia ubonyeze kitufe ikiwa (buttonA.uniquePress()) ( switch_mode(); rudisha; ) ikiwa (buttonB.uniquePress()) ( display_date(); return; ) //kama sekunde zimebadilika basi zisasishe kwenye onyesho secs = rtc; ikiwa (sekunde != old_secs) ( //secs char buffer; itoa(secs, buffer, 10); //fix - vinginevyo ikiwa num ina sifuri inayoongoza, k.m. "03" sekunde, itoa inashughulikia hii hadi chari zilizo na nafasi. "3".kama(sekunde< 1) { hours = hours + ampm * 12; } //split all date and time into individual digits - stick in digits_new array //rtc = secs //array pos and digit stored //digits_new = (rtc%10); //0 - secs ones //digits_new = ((rtc/10)%10); //1 - secs tens //rtc = mins digits_new = (rtc % 10); //2 - mins ones digits_new = ((rtc / 10) % 10); //3 - mins tens //rtc = hours digits_new = (hours % 10); //4 - hour ones digits_new = ((hours / 10) % 10); //5 - hour tens //rtc = date //digits_new = (rtc%10); //6 - date ones //digits_new = ((rtc/10)%10); //7 - date tens //draw initial screen of all chars. After this we just draw the changes. //compare digits 0 to 3 (mins and hours) for (byte i = 0; i <= 3; i++) { //see if digit has changed... if (digits_old[i] != digits_new[i]) { //run 9 step animation sequence for each in turn for (byte seq = 0; seq <= 8 ; seq++) { //convert digit to string itoa(digits_old[i], old_char, 10); itoa(digits_new[i], new_char, 10); //if set to 12 hour mode and we"re on digit 2 (hours tens mode) then check to see if this is a zero. If it is, blank it instead so we get 2.00pm not 02.00pm if (ampm && i == 3) { if (digits_new == 0) { new_char = " "; } if (digits_old == 0) { old_char = " "; } } //draw the animation frame for each digit slideanim(digits_x_pos[i], 0, seq, old_char, new_char); delay(SLIDE_DELAY); } } } /* //compare date digit 6 (ones) and (7) tens - if either of these change we need to update the date line. We compare date tens as say from Jan 31 ->1:00 asubuhi katika hali ya saa 12.<=2 ; day_char++){ //run the anim sequence for each char for (byte seq = 0; seq <=8 ; seq++){ //the day (0 - 6) Read this number into the days char array. the seconds number in the array 0-2 gets the 3 chars of the day name, e.g. m o n slideanim(6*day_char,8,seq,old_chars,days); //6 x day_char gives us the x pos for the char delay(SLIDE_DELAY); } //save the old day chars into the old_chars array at array pos 0-2. We use this next time we change the day and feed it to the animation as the current char. The updated char is fed in as the new char. old_chars = days; } //change the date tens digit (if needed) and ones digit. (the date ones digit wil alwaus change, but putting this in the "if" loop makes it a bit neater code wise.) for (byte i = 7; i >//fanya ubadilishaji wa saa 12/24 ikiwa ampm imewekwa kwa saa 1 byte = rtc;<=8 ; seq++){ itoa(digits_old[i],old_char,10); itoa(digits_new[i],new_char,10); slideanim(digits_x_pos[i],8,seq,old_char,new_char); delay(SLIDE_DELAY); } } } //print the day suffix "nd" "rd" "th" etc. First work out date 2 letter suffix - eg st, nd, rd, th byte s = 3; //the pos to read our suffix array from. byte date = rtc; if(date == 1 || date == 21 || date == 31) { s = 0; } else if (date == 2 || date == 22) { s = 1; } else if (date == 3 || date == 23) { s = 2; } for (byte suffix_char = 0; suffix_char <=1 ; suffix_char++){ for (byte seq = 0; seq <=8 ; seq++){ slideanim((suffix_char*6)+36,8,seq,old_chars,suffix[s]); // we pass in the old_char array char as the current char and the suffix array as the new char delay(SLIDE_DELAY); } //save the suffic char in the old chars array at array pos 3 and 5. We use these chars next time we change the suffix and feed it to the animation as the current char. The updated char is fed in as the new char. old_chars = suffix[s]; } }//end do date line */ //save digita array tol old for comparison next loop for (byte i = 0; i <= 3; i++) { digits_old[i] = digits_new[i]; } }//secs/oldsecs }//while loop fade_down(); } //called by slide //this draws the animation of one char sliding on and the other sliding off. There are 8 steps in the animation, we call the function to draw one of the steps from 0-7 //inputs are are char x and y, animation frame sequence (0-7) and the current and new chars being drawn. void slideanim(byte x, byte y, byte sequence, char current_c, char new_c) { // To slide one char off and another on we need 9 steps or frames in sequence... // seq# 0123456 <-rows of the display // | ||||||| // seq0 0123456 START - all rows of the display 0-6 show the current characters rows 0-6 // seq1 012345 current char moves down one row on the display. We only see it"s rows 0-5. There are at display positions 1-6 There is a blank row inserted at the top // seq2 6 01234 current char moves down 2 rows. we now only see rows 0-4 at display rows 2-6 on the display. Row 1 of the display is blank. Row 0 shows row 6 of the new char // seq3 56 0123 // seq4 456 012 half old / half new char // seq5 3456 01 // seq6 23456 0 // seq7 123456 // seq8 0123456 END - all rows show the new char //from above we can see... //currentchar runs 0-6 then 0-5 then 0-4 all the way to 0. starting Y position increases by 1 row each time. //new char runs 6 then 5-6 then 4-6 then 3-6. starting Y position increases by 1 row each time. //if sequence number is below 7, we need to draw the current char if (sequence < 7) { byte dots; // if (current_c >ikiwa (saa > 12) ( masaa = saa - ampm * 12; ) ikiwa (saa<= "z")) { // current_c &= 0x1F; // A-Z maps to 1-26 // } if (current_c >12) ( masaa = masaa - ampm * 12; ) ikiwa (masaa<= "Z") { current_c &= 0x1F; // A-Z maps to 1-26 } else if (current_c >Februari 01 basi tarakimu moja "haibadiliki ikiwa ((tarakimu_zamani != tarakimu_mpya) || (tarakimu_zamani != tarakimu_mpya)) ( //badilisha siku iliyoonyeshwa. Kitanzi hapa chini kinapitia kila herufi 3 kwa zamu k.m. "MON" kwa (byte day_char = 0; day_char<= "z") { current_c = (current_c - "a") + 41; // A-Z maps to 41-67 } else if (current_c >= 6; i--)( ikiwa (tarakimu_zamani[i] != tarakimu_mpya[i]) ( kwa (baiti seq = 0; seq<= "9") { current_c = (current_c - "0") + 31; } else if (current_c == " ") { current_c = 0; // space } else if (current_c == ".") { current_c = 27; // full stop } else if (current_c == "\"") { current_c = 28; // single quote mark } else if (current_c == ":") { current_c = 29; //colon } else if (current_c == ">= "A" && || (current_c >= "a" && current_c<= curr_char_row_max; curr_char_row++) { for (byte col = 0; col < 5; col++) { dots = pgm_read_byte_near(&myfont); if (dots & (64 >> curr_char_row)) plot(x + col, y + start_y, 1); // njama inayoongozwa kwenye njama nyingine (x + col, y + start_y, 0); //else plot led off ) start_y++;//ongeza moja kwa y ili tuchore safu mlalo inayofuata moja chini ) ) //chora mstari tupu kati ya herufi ikiwa mfuatano ni kati ya 1 na 7. Tusipofanya hivi tunapata masalio ya chari za sasa nafasi ya mwisho iliyoachwa kwenye onyesho ikiwa (mlolongo >= 1 && mlolongo<= 8) { for (byte col = 0; col < 5; col++) { plot(x + col, y + (sequence - 1), 0); //the y position to draw the line is equivalent to the sequence number - 1 } } //if sequence is above 2, we also need to start drawing the new char if (sequence >= 2) ( //fanyia kazi vitone vya char byte; //kama (new_c >= "A" && new_c<= "Z" || (new_c >= "a" && new_c<= "z")) { // new_c &= 0x1F; // A-Z maps to 1-26 //} if (new_c >= "A" && new_c<= "Z") { new_c &= 0x1F; // A-Z maps to 1-26 } else if (new_c >= "a" && new_c<= "z") { new_c = (new_c - "a") + 41; // A-Z maps to 41-67 } else if (new_c >= "0" && new_c<= "9") { new_c = (new_c - "0") + 31; } else if (new_c == " ") { new_c = 0; // space } else if (new_c == ".") { new_c = 27; // full stop } else if (new_c == "\"") { new_c = 28; // single quote mark } else if (new_c == ":") { new_c = 29; // clock_mode selector arrow } else if (new_c == ">") ( new_c = 30; // mshale wa kichaguzi cha clock_mode ) byte newcharrowmin = 6 - (mfuatano - 2); //nambari ya safu mlalo ya chini ya kuchora kwa char mpya - hii hutoa matokeo ya 6 hadi 0 wakati nambari za mfuatano zilishwa 2-8 . Hii ndio safu mlalo ya chini zaidi ya kuchora kwa char byte start_y = 0 nafasi ya kuanzia - ni sawa na nambari ya mlolongo tunaijumlisha kila safu mlalo kutoka chini ya safu mlalo (inayokokotolewa na nambari ya mlolongo ) ) hadi 6 kwa (byte newcharrow = newcharrowmin; newcharrow<= 6; newcharrow++) { for (byte col = 0; col < 5; col++) { dots = pgm_read_byte_near(&myfont); if (dots & (64 >> newcharrow)) plot(x + col, y + start_y, 1); // njama inayoongozwa kwenye njama nyingine (x + col, y + start_y, 0); //else plot has been off ) start_y++;//ongeza moja hadi y ili tuchore safu mlalo inayofuata moja chini) ) ) //chapisha saa kwa kutumia maneno badala ya nambari batili word_clock() ( cls(); char numbers = ( "moja ", "mbili", "tatu", "nne", "tano", "sita", "saba", "nane", "tisa", "kumi", "kumi na moja", "kumi na mbili", "kumi na tatu", "kumi na nne", "kumi na tano", "kumi na sita", "kumi na saba", "kumi na nane", "kumi na tisa" ); // uwezekano wa mistari 3 ya kuonyesha char str_c;< 1) { hours = hours + ampm * 12; } get_time(); //get the time from the clock chip byte old_mins = 100; //store mins in old_mins. We compare mins and old mins & when they are different we redraw the display. Set this to 100 initially so display is drawn when mode starts. byte mins; //run clock main loop as long as run_mode returns true while (run_mode()) { //check for button press if (buttonA.uniquePress()) { switch_mode(); return; } if (buttonB.uniquePress()) { display_date(); } get_time(); //get the time from the clock chip mins = rtc; //get mins //if mins is different from old_mins - redraw display if (mins != old_mins) { //update old_mins with current mins value old_mins = mins; //reset these for comparison next time mins = rtc; hours = rtc; //make hours into 12 hour format if (hours >12) ( masaa = saa - 12; ) ikiwa (saa == 0) ( masaa = 12; ) //split mins thamani hadi tarakimu mbili tofauti int minsdigit = rtc % 10;<= 10 , then top line has to read "minsdigti past" and bottom line reads hours if (mins < 10) { strcpy (str_a, numbers); strcpy (str_b, "PAST"); strcpy (str_c, numbers); } //if mins = 10, cant use minsdigit as above, so soecial case to print 10 past /n hour. if (mins == 10) { strcpy (str_a, numbers); strcpy (str_b, " PAST"); strcpy (str_c, numbers); } //if time is not on the hour - i.e. both mins digits are not zero, //then make first line read "hours" and 2 & 3rd lines read "minstens" "mins" e.g. "three /n twenty /n one" else if (minsdigitten != 0 && minsdigit != 0) { strcpy (str_a, numbers); //if mins is in the teens, use teens from the numbers array for the 2nd line, e.g. "fifteen" //if (mins >byte minsdigitten = (rtc / 10) % 10;<= 19) { if (mins <= 19) { strcpy (str_b, numbers); } else { strcpy (str_b, numberstens); strcpy (str_c, numbers); } } // if mins digit is zero, don"t print it. read read "hours" "minstens" e.g. "three /n twenty" else if (minsdigitten != 0 && minsdigit == 0) { strcpy (str_a, numbers); strcpy (str_b, numberstens); strcpy (str_c, ""); } //if both mins are zero, i.e. it is on the hour, the top line reads "hours" and bottom line reads "o"clock" else if (minsdigitten == 0 && minsdigit == 0) { strcpy (str_a, numbers); strcpy (str_b, "O"CLOCK"); strcpy (str_c, ""); } }//end worknig out time //run in a loop //print line a "twelve" byte len = 0; while (str_a) { len++; }; //get length of message byte offset_top = (31 - ((len - 1) * 4)) / 2; // //plot hours line byte i = 0; while (str_a[i]) { puttinychar((i * 4) + offset_top, 1, str_a[i]); i++; } //hold display but check for button presses int counter = 1000; while (counter >0)( //angalia ubonyeze kitufe ikiwa (buttonA.uniquePress()) ( switch_mode(); rudisha; ) ikiwa (buttonB.uniquePress()) ( display_date(); ) delay(1); counter--; ) fade_down ();< 6; c++) { putnormalchar(x[c],y,message[ chara[c] ]); //draw a line of pixels turned off after each char,otherwise the gaps between the chars have pixels left in them from the previous char for (byte yy = 0 ; yy < 8; yy ++) { plot(x[c] + 5, yy, 0); } //take one off each chars position x[c] = x[c] - 1; } //reset a char if it"s gone off screen for (byte i = 0; i <= 5; i++) { if (x[i] < -5) { x[i] = 31; chara[i] = p; p++; } } } } //display_date - print the day of week, date and month with a flashing cursor effect void display_date() { cls(); //read the date from the DS1307 byte dow = rtc; // day of week 0 = Sunday byte date = rtc; byte month = rtc - 1; //array of month names to print on the display. Some are shortened as we only have 8 characters across to play with char monthnames = { "January", "February", "March", "April", "May", "June", "July", "August", "Sept", "October", "November", "December" }; //print the day name //get length of text in pixels, that way we can centre it on the display by divindin the remaining pixels b2 and using that as an offset byte len = 0; while(daysfull) { len++; }; byte offset = (31 - ((len-1)*4)) / 2; //our offset to centre up the text //print the name int i = 0; while(daysfull[i]) { puttinychar((i*4) + offset , 1, daysfull[i]); i++; } delay(1000); fade_down(); cls(); // print date numerals char buffer; itoa(date,buffer,10); offset = 10; //offset to centre text if 3 chars - e.g. 3rd // first work out date 2 letter suffix - eg st, nd, rd, th etc // char suffix={"st", "nd", "rd", "th" }; is defined at top of code byte s = 3; if(date == 1 || date == 21 || date == 31) { s = 0; } else if (date == 2 || date == 22) { s = 1; } else if (date == 3 || date == 23) { s = 2; } //print the 1st date number puttinychar(0+offset, 1, buffer); //if date is under 10 - then we only have 1 digit so set positions of sufix etc one character nearer byte suffixposx = 4; //if date over 9 then print second number and set xpos of suffix to be 1 char further away if (date >9)( suffixposx = 8; puttinychar(4+offset, 1, buffer); offset = 8; //rekebisha maandishi katikati ikiwa herufi 4) //chapisha viambishi tamati 2 puttinychar(kiambishi tamati, 1, kiambishi tamati[s) ]);< 35 ; count++) { //if user hits button, change the clock_mode if (buttonA.uniquePress() || firstrun == 1) { count = 0; cls(); if (firstrun == 0) { clock_mode++; } if (clock_mode >NUM_DISPLAY_MODES + 1) ( clock_mode = 0; ) //print kishale na jina la sasa la clock_mode kwenye mstari wa kwanza na uchapishe jina linalofuata la clock_mode kwenye mstari wa pili char str_top;< 35 ; count++) { //if user hits button, change the clock_mode if(buttonA.uniquePress() || firstrun == 1){ count = 0; cls(); if (firstrun == 0) { setting_mode++; } if (setting_mode >NUM_SETTINGS_MODES) ( setting_mode = 0; ) //print mshale na jina la sasa la clock_mode kwenye mstari wa kwanza na uchapishe jina la clock_mode inayofuata kwenye mstari wa pili char str_top;< 4; address++) { lc.setIntensity(address, intensity); } delay(150); } } } // display a horizontal bar on the screen at offset xposr by ypos with height and width of xbar, ybar void levelbar (byte xpos, byte ypos, byte xbar, byte ybar) { for (byte x = 0; x < xbar; x++) { for (byte y = 0; y <= ybar; y++) { plot(x+xpos, y+ypos, 1); } } } //set time and date routine void set_time() { cls(); //fill settings with current clock values read from clock get_time(); byte set_min = rtc; byte set_hr = rtc; byte set_date = rtc; byte set_mnth = rtc; int set_yr = rtc; //Set function - we pass in: which "set" message to show at top, current value, reset value, and rollover limit. set_date = set_value(2, set_date, 1, 31); set_mnth = set_value(3, set_mnth, 1, 12); set_yr = set_value(4, set_yr, 2013, 2099); set_hr = set_value(1, set_hr, 0, 23); set_min = set_value(0, set_min, 0, 59); ds1307.adjust(DateTime(set_yr, set_mnth, set_date, set_hr, set_min)); cls(); } //used to set min, hr, date, month, year values. pass //message = which "set" message to print, //current value = current value of property we are setting //reset_value = what to reset value to if to rolls over. E.g. mins roll from 60 to 0, months from 12 to 1 //rollover limit = when value rolls over int set_value(byte message, int current_value, int reset_value, int rollover_limit){ cls(); char messages = { "Set Mins", "Set Hour", "Set Day", "Set Mnth", "Set Year"}; //Print "set xyz" top line byte i = 0; while(messages[i]) { puttinychar(i*4 , 1, messages[i]); i++; } delay(2000); cls(); //print digits bottom line char buffer = " "; itoa(current_value,buffer,10); puttinychar(0 , 1, buffer); puttinychar(4 , 1, buffer); puttinychar(8 , 1, buffer); puttinychar(12, 1, buffer); delay(300); //wait for button input while (!buttonA.uniquePress()) { while (buttonB.isPressed()){ if(current_value < rollover_limit) { current_value++; } else { current_value = reset_value; } //print the new value itoa(current_value, buffer ,10); puttinychar(0 , 1, buffer); puttinychar(4 , 1, buffer); puttinychar(8 , 1, buffer); puttinychar(12, 1, buffer); delay(150); } } return current_value; } void get_time() { //get time DateTime now = ds1307.now(); //save time to array rtc = now.year(); rtc = now.month(); rtc = now.day(); rtc = now.dayOfWeek(); //returns 0-6 where 0 = Sunday rtc = now.hour(); rtc = now.minute(); rtc = now.second(); //flash arduino led on pin 13 every second //if ((rtc % 2) == 0) { // digitalWrite(13, HIGH); //} //else { // digitalWrite(13, LOW); //} //print the time to the serial port - useful for debuging RTC issues /* Serial.print(rtc); Serial.print(":"); Serial.print(rtc); Serial.print(":"); Serial.println(rtc); */ }

strcpy(str_top, set_modes);


Kukusanya msimbo wa programu na kuipakia zaidi kwenye kumbukumbu ya microcontroller itachukua muda, kwa kawaida si zaidi ya dakika moja. Kukamilika kwa operesheni kwa mafanikio kutaripotiwa katika kiweko cha Arduino IDE. Baada ya hayo yote iliyobaki ni kuanzisha upya Arduino kwa kutumia kifungo cha Rudisha kwenye kifaa - saa rahisi kwenye matrices ya LED iko tayari!

Saa iliyo tayari kwenye Arduino

Saa imewekwa kwa kutumia vifungo viwili. Kifaa hiki kinaweza kutumia fomati za saa 12 na 24, huonyesha tarehe na siku ya juma, na huonyesha muda kwa sekunde au bila. Inawezekana pia kubadili mwangaza wa LEDs.


Pengine utataka kuongeza vipengele zaidi katika siku zijazo (kwa mfano, thermometer), au kufunga kifaa katika mwili wa muundo wako mwenyewe - matokeo mazuri yanaweza kupatikana kwa utengenezaji kwenye mashine za kukata laser. Lakini sasa unaweza kusema kwa usalama kuwa umekusanya saa ya elektroniki iliyojaa na mikono yako mwenyewe!

Saa rahisi kwenye matrices ya LED. Wapenzi wengi wa redio, wanaoanza na wengine, wanapenda "kuanzisha tena gurudumu" - huunda saa zao za elektroniki. Hatima hii pia haikuniacha. Leo, bila shaka, kuna miundo mingi ya kuangalia kwenye mtandao, lakini kwa sababu fulani kuna saa chache tu kwenye matrices ya LED kati yao. Kwenye mtandao unaozungumza Kirusi nilipata moja tu iliyokamilishwa kabisa na iliyoelezea muundo. Wakati huo huo, matrices ya LED sasa yamekuwa ya bei nafuu zaidi, na gharama zao si za juu, au hata chini, kuliko viashiria vya sehemu saba za ukubwa sawa. Kwa mfano, GNM23881AD niliyotumia na ukubwa wa 60x60 mm ilinunuliwa kwa euro 1.5 (viashiria 3 vina gharama ya euro 4.5), kwa pesa hii huwezi kununua viashiria vinne vya sehemu saba za ukubwa sawa. Lakini habari nyingi zaidi zinaweza kuwekwa kwenye kiashiria cha matrix. Mbali na nambari, wanaweza kuonyesha barua yoyote, ishara, na kwa msaada wa mstari wa kutambaa, pia maandishi.

Kulingana na hili, kulikuwa na tamaa ya kujenga saa kwenye matrices ya LED, lakini ili mzunguko usiwe ngumu zaidi kuliko wale wa sehemu saba. Nilitaka pia ifanye kazi kabisa na sio kama wengine. Hivyo mpango ufuatao ulizaliwa.

Utendaji wa saa ni kama ifuatavyo:

  • Kuhesabu, kalenda, siku ya wiki. (miaka ya kurukaruka inazingatiwa, mpito wa majira ya joto / majira ya baridi haufanyiki).
  • Uhifadhi wa saa katika tukio la kupoteza nguvu za nje (matumizi ni microns 15).
  • Marekebisho ya kiharusi + - 59.9 sek/siku, katika nyongeza za sekunde 0.1. 9 kengele. 3 kati ya hizo ni za "wakati mmoja", na 6 "za kudumu", ambazo zinaweza kubinafsishwa kibinafsi kulingana na siku ya juma.
  • Muda wa kubadilishwa wa mtu binafsi wa ishara ya sauti kwa kila kengele (dakika 1-15).
  • Uthibitisho wa sauti wa mibonyezo ya kitufe (inaweza kulemazwa).
  • Beep ya kila saa (inaweza kuzimwa).
  • Kutoka 00-00 hadi 08-00 hakuna ishara.
  • Sensorer 1 au 2 za halijoto (Mtaani na nyumbani).
  • Tia inayoweza kubinafsishwa, ambayo habari yote huonyeshwa (isipokuwa wakati)
  • Thamani ya urekebishaji wa kiharusi na mipangilio ya "mstari wa kukimbia" huhifadhiwa hata kama nguvu ya chelezo imepotea.

AtMega16A ilichaguliwa kama "moyo" wa saa, kwa sababu ya upatikanaji wake, bei nafuu na "uhalali". Nilitaka kurahisisha mzunguko iwezekanavyo, kwa hivyo kila kitu kilichowezekana kilipewa mtawala. Kwa hivyo, tulifanikiwa kupita tukiwa na miduara midogo miwili tu, kidhibiti na rejista ya TPIC6B595. Ikiwa TPIC6B595 haipatikani kwa mtu, basi unaweza kuibadilisha na 74HC595 + ULN2803. Chaguzi zote mbili zimejaribiwa. Unaweza pia kujaribu kutumia TPIC6C595, ni dhaifu kidogo na ilipata joto kidogo, lakini kwa ujumla ilifanya kazi kwa utulivu. Muda unahesabiwa kwa kutumia muda wa asynchronous - T2. Saa inaendelea kufanya kazi hata ikiwa kuna hitilafu ya nguvu. Kwa wakati huu, zaidi ya mzunguko ni de-energized, na mtawala ni powered na betri, accumulator, au ionistor. Nilikuwa na nia ya "kucheza karibu" na ionistor, kwa hiyo niliitumia. Matumizi ya sasa ya saa katika hali ya kusubiri ni mikroni 15. Wakati inaendeshwa na ionistor ya 1F, saa "ilidumu" kwa siku nne. Hii inatosha kabisa kudumisha kasi wakati wa kukatika kwa umeme. Ikiwa unatumia betri ya CR2032, basi kinadharia, kulingana na mahesabu, malipo yanapaswa kutosha kwa miaka 1.5. Mdhibiti "husikiliza" kwa uwepo wa voltage ya mtandao kupitia pini PB.3 Pini hii ni pembejeo ya inverting ya comparator. Voltage ya usambazaji, kupitia kigawanyaji R2-R3, hutolewa kwa pini PB.3, na katika hali ya kawaida ni takriban 1.5 V. Ikiwa voltage ya nje itashuka chini ya volts 4.1, basi voltage kwenye pini RV.3 itakuwa chini ya volts 1.23, na usumbufu kutoka kwa kulinganisha utatolewa, na katika kidhibiti cha usumbufu nodi zote za "ziada" za mtawala zitageuka. mbali na mtawala mwenyewe atalala. Katika hali hii, tu timer T2 inaendelea kufanya kazi. Wakati nguvu ya nje inaonekana, voltage kwenye RV.3 itaongezeka tena juu ya 1.23V, mtawala "kuona" hii itaweka nodes zote katika hali ya kazi. Ikiwa badala ya ionistor betri ya CR2032 hutumiwa, basi lazima iunganishwe kwa njia ya diode (ikiwezekana diode ya Schottky). Anode ya diode imeunganishwa na betri +, na cathode kwa cathode VD1. Katika hali ya kawaida, skrini huonyesha muda katika umbizo la saa-dakika. Ticker huanza kufanya kazi kwa vipindi vya dakika moja. Mstari unaoendesha unaonyesha siku ya wiki, tarehe, mwaka, joto. nyumbani, na joto. mitaani. Ticker inaweza kubinafsishwa, i.e. Unaweza kuwasha/kuzima onyesho la vipengele vyovyote. (kwa mfano, mimi huzima onyesho la mwaka kila wakati). Wakati vipengele vyote vimezimwa, ticker haianza na saa huonyesha wakati wa sasa kila wakati. Saa 9 za kengele zimegawanywa katika 3 zinazoweza kutumika na 6 zinazoweza kutumika tena. Unapowasha kengele 1-3, zinasikika mara moja tu. Ili zifanye kazi tena, lazima ziwashwe kwa mikono tena. Na saa za kengele 4-9 zinaweza kutumika tena, i.e. watafanya kazi kila siku kwa wakati uliowekwa. Kwa kuongeza, kengele hizi zinaweza kuwekwa ili kuzimwa tu siku fulani za wiki. Hii ni rahisi, kwa mfano, ikiwa hutaki kengele kukuamsha mwishoni mwa wiki. Au kwa mfano, unahitaji kuamka siku za wiki saa 7-00, na Alhamisi saa 8-00, na mwishoni mwa wiki huhitaji saa ya kengele. Kisha tunaweka moja inayoweza kutumika tena saa 7-00 Jumatatu-Jumatano na Ijumaa, na ya pili saa 8-00 siku ya Alhamisi ..... Kwa kuongeza, saa zote za kengele zina mpangilio wa muda wa ishara, na ikiwa wewe, kwa utaratibu. kuamka, usiwe na ishara ya kutosha kwa dakika 1, basi unaweza kuiongeza kwa muda kutoka dakika 1 hadi 15. Kozi hiyo inasahihishwa mara moja kwa siku, saa 00-00. Ikiwa saa ni ya haraka, kwa mfano, kwa sekunde 5 kwa siku, basi saa 00-00-00 wakati utawekwa 23-59-55, lakini ikiwa saa ni polepole, basi saa 00-00-00 wakati huo. itawekwa 00-00-05. Hatua ya kurekebisha - 0.1 sec. Usahihishaji wa juu - 59.9 sec / siku. Kwa quartz inayofanya kazi, hakuna uwezekano wa kuhitaji zaidi. Urekebishaji pia unafanywa katika hali ya kusubiri wakati inaendeshwa na betri. Matrices ya LED yanaweza kutumia LED yoyote 8 * 8 na cathode ya kawaida. Kama ilivyoelezwa tayari, nilitumia GNM23881AD. Kimsingi, unaweza "kukusanya" matrix kutoka kwa LED za kibinafsi. Microcontroller ya AtMega16a inaweza kubadilishwa na "zamani" AtMega16 na barua L. Wakati huo huo, kinadharia, matumizi ya sasa kutoka kwa betri yanapaswa kuongezeka kidogo. Labda tu AtMega16 itafanya kazi, lakini shida zinaweza kutokea wakati wa kufanya kazi kwa nguvu ya betri. Diode D1 - ikiwezekana diode yoyote ya Schottky. Pia inafanya kazi na kirekebishaji cha kawaida, lakini ili kujikinga na glitches mbalimbali zinazohusiana na ukweli kwamba sehemu ya mzunguko inaendeshwa na voltage "kabla ya diode", na sehemu "baada ya diode", ni bora kutafuta. Schottky voltage. Transistor VT1 - n-p-n yoyote. Saa inadhibitiwa na vifungo viwili. Idadi yao inaweza kuongezeka hadi vipande 8 bila kuongeza vipengele vingine isipokuwa vifungo wenyewe, lakini nilitaka kujaribu "kutoka" na mbili tu. Vifungo vinaitwa kwa kawaida "Sawa" na "HATUA". Kitufe cha "STEP" kawaida huhamia kwenye kipengee cha menyu kinachofuata, na kitufe cha "Sawa" hubadilisha vigezo vya menyu ya sasa. Ishara ya kengele iliyowashwa inaweza pia kuzimwa kwa kutumia vitufe vya "OK" au "STEP". Kubonyeza kitufe chochote kengele inapolia huizima. Mpango wa udhibiti uligeuka kama hii:

Video ya jinsi kila kitu kinavyofanya kazi!