ARM:0017 – Eik miegot laikrodis

Turim tokį grieką, kad kai žaidžiam žaidimus, žiūrom kokia pornografiją ar šiaip, ir staiga pastebim, kad jau gili naktis. Aišku kažkur yra laikrodukas lentynoje, bet geriau prisukti palei nosį, kad rodytu tuščiai praleistą laiką. 🙂

Tai DIY RTC laikroduko eksperimentas su pačiais pigiausiai komponentais. Kaip tik susirinkti ir ištestuoti. Kogero sunkiausiai bus padaryti korpusą:
OLED RTC to limit gaming time. STM32F103c and I2C OLED USB settings
Tai laikrodis, kuris nusistato per USB (jokių mygtukų), rodo laiką ir laiką nuo paskutinio įjungimo (uptime). Kadangi maitinasi iš USB, tai rodo kiek laiko pajungtas kompiuteris.

Schema paprasta- “blue pill” modulis, OLED modulis, du rezistoriai po 4K7 ant I2C buso, vienas rodos 270R nuosekliai 1N4148 diodui- krauti super kondensatorių ir aišku pats kondensatorius.

Laikas nusistato per USB. Reikia sužinoti kokį COM portą emuliuoja laikrodis. Pas mane COM12. Tada į tą portą pasiunčiam laiko tekstą. Su windows darosi su keistoką komandą bat faile (yra archyve):

set /p x=%TIME% <nul >\\.\COM12

Kodėl taip keistai? Klauskit Billo. Realiai ši komanda veikia su “nestandartiniais” COM porto numeriais ir nesiunčią jokių CRLF. Gal su Linux gautusi paprasčiau. Nėra to kubiko USB įrenginys labai stabilus, todėl jei kas, darykite kaip tikri kompiuterastai: išjungiam ir įjungiam.

Aišku visi failai ir CubeMX projektas:
STM32F103 RTC OLED USB source code and hex..

P.S. vietoje super kondiko galima įdėti 3V batareiką.

5 replies on “ARM:0017 – Eik miegot laikrodis”

  1. Tikrai nežinau. Per naktį ir visą darbo dieną jo įtampa nukrito kažkur 0.06V nuo to kiniško kontrolerio. Kadangi sistemoje 3V max, o po diodo kogero neviršija 2.5V, tai galima įdėti “pusinį” kondiką, 10 faradų.

    super caps for RTC
    Šiuos kondikus išlupaus iš kažkokių GPS-GSM sekimo prietaisų. Gal jie labiau skirti perduoti per GSM kokius duomenis prie avarinių situacijų, nei palaikyti RTC. Tačiau mano patirtis sako, kad man dažnai miršta tos baterijos. O šie kondensatoriai turi būti amžini.

    Praktika parodys.

    Beja, šis čipas (STM32F103) turi ne visai pilnavertį RTC. Jis yra be kalendoriaus. Todėl šiame projekte tai ir nenaudojama. Šis projektas skirtas konkrečiai užduočiai.
    O jei laikrodukas skuba ar veluoja, reikia analizuoti funkcijos “HAL_RTCEx_SetSmoothCalib(…)” veikla. Ir aišku kažkokios žiaurios klaidos kubike.

    Kubike išjungus autorežimą galima įvesti skaičiukus tik nuo 0 iki 127 kaip daliklį. Tada laikrodis sukasi kaip pašėlęs. Reikia didesnio. O neleidžia. O jei ten daugiau paeksperimentuoji, tai laikrodis susikruša pilnai.
    Workarroud.
    Darom auto kalibracija ir main.c darom:

    /* USER CODE BEGIN PD */
    #undef RTC_AUTO_1_SECOND
    #define RTC_AUTO_1_SECOND 32767
    /* USER CODE END PD */

    Čia daliklis. Pas mane laikrodis vėlavo, todėl pasukom per vieną hercą. O toliau fine-tiuningas:

    HAL_RTCEx_SetSmoothCalib(&hrtc,0,0,10);
    Tie nuliai kituose procesoriukuose kažką reiškia. Pas 103-čia nieko nedaro. O va “10” tai stabdis.

    Taip reikia daryti, nes RTC 32kHz kvarciuko kojos išvestos į jungtis, o jos šiame eksperimente dar pasijungia į “breadboardą”. O tai gana didelė talpa. Gal išlitavus jungtis ar nupjovus takelius tokių iškrypimų nereikės.

  2. Va kaip atrodo “aliarmas”, kai per ilgai sėdi prie kompiuterio:

    eik miegot laikrodis
    (aliarmas imituotas, todel apatinis taimeris rodo tą patį laiką).

    Zoomas:
    OLED

  3. Pastaba- nebenaudojant breadboard, nebereikia 4K7 rezistoriaus ant I2C bus, nes nebėra parazitinės breadboardo talpos ir I2C veikia be problemų. Dar, paskutinėje softo versijoje kiek patobulinau laiko nustatymą- išfiltruoja nereikalingas raides ir kogero nereikia tokio sudėtingo skripto.

Leave a Reply

Your email address will not be published. Required fields are marked *