1) Zasady realizacji
- Wybierz 1 projekt z listy (A–H).
- Projekt ma działać na ATmega328P w stylu bare-metal (rejestry).
- W projekcie ma być użyty co najmniej: timer + przycisk + wyświetlacz 7-seg albo PWM albo ADC (zależnie od projektu).
- Nie używaj długich _delay_ms() do logiki — odmierzanie czasu realizuj tickiem/timerem.
- ISR ma być krótki (flagi/bufor), logika w main.
2) 8 mini-projektów do wyboru
A) Stoper 0.00–99.99 s na 7-seg
Stoper z dokładnością do 0.01 s. Wyświetlacz pokazuje format XX.XX (kropka jako separator).
- START/STOP (klik)
- RESET (klik)
- odliczanie czasu na bazie tick 1 ms (bez blokowania)
- HOLD: długie przytrzymanie zamraża wskazanie
- zapis „lap” (np. 3 ostatnie czasy przewijane przyciskiem)
B) Timer kuchenny (odliczanie) z alarmem
Ustawianie czasu (np. 0–9999 s) i odliczanie w dół do zera. Po dojściu do 0000 alarm dźwiękowy.
- przycisk: + (zwiększa), - (zmniejsza), START
- alarm na brzęczyku (np. melodia 3–5 tonów)
- sygnalizacja trybu (miganie kropki lub całego wyświetlacza)
- przytrzymanie przycisku przyspiesza zmianę wartości (auto-repeat)
- pauza i wznowienie
C) „Miernik napięcia” — ADC + prezentacja na 7-seg
Odczyt napięcia z potencjometru/czujnika i wyświetlanie w mV (np. 0000–5000).
- odczyt ADC (single conversion)
- przeliczenie na mV na podstawie Vref
- filtr: średnia z N próbek (min. 4)
- tryb „min/max” (zapamiętanie skrajnych wartości)
- próg alarmu: przekroczenie → beep / miganie
D) Sterownik jasności LED (PWM) z dwoma trybami
Regulacja jasności LED przez PWM. Tryb ręczny (przyciski) i tryb automatyczny (płynne rozjaśnianie/ściemnianie).
- + / - zmienia duty (0..255)
- START przełącza tryb ręczny/auto
- zmiana jasności bez blokujących opóźnień
- krzywa „gamma” (nieliniowe mapowanie duty)
- zapis ostatniej jasności (EEPROM — opcjonalnie)
E) Licznik impulsów (INT0/INT1) + prezentacja wyniku
Zliczanie impulsów z wejścia INT0 (np. przycisk, czujnik, generator) i wyświetlanie liczby zdarzeń.
- INT0 jako źródło zliczania
- debounce/lockout czasowy (np. 30 ms)
- RESET licznika przyciskiem
- pomiar częstotliwości: licz impulsy w oknie 1 s i pokaż „Hz” jako liczba
- INT1 jako drugi kanał (oddzielny licznik)
F) „Menu” na 7-seg: 3 funkcje w jednym urządzeniu
Urządzenie ma 3 tryby pracy (np. licznik, stoper, miernik ADC). Użytkownik przełącza tryby przyciskiem.
- minimum 3 stany programu (FSM)
- przycisk MODE przełącza tryb, START steruje funkcją
- czytelna sygnalizacja aktualnego trybu (np. miganie dp / inna animacja)
- zapamiętanie ostatniego trybu po restarcie (EEPROM)
- krótka animacja wejścia w tryb
G) „Gra refleks” — reakcja na sygnał
Po losowym czasie pojawia się sygnał (np. LED / dp). Uczeń ma nacisnąć przycisk jak najszybciej. Wynik reakcji wyświetlany w ms na 7-seg.
- losowy czas startu (np. 1–5 s) na bazie licznika czasu / szumu ADC
- pomiar czasu reakcji w ms
- wyświetlanie wyniku i reset gry
- ranking: 5 najlepszych wyników
- kara za „fałszywy start” (klik przed sygnałem)
H) Termometr „symulowany” — ADC + alarm + tryby prezentacji
Zamiast czujnika temperatury możesz użyć potencjometru jako „wejścia temperatury”. Wyświetlaj wynik w °C jako liczba 0–100 (symulacja). Dodaj próg alarmu ustawiany przyciskiem.
- odczyt ADC + mapowanie na 0..100
- tryb prezentacji: TEMP / THR (przełączany przyciskiem)
- alarm (miganie/beep) gdy TEMP > THR
- histereza alarmu (żeby nie „pykało” na granicy)
- min/max temperatury w sesji
3) Wymagania formalne (ocenianie)
- Poprawność działania (40%) — projekt spełnia minimalne wymagania, nie zawiesza się.
- Jakość kodu (30%) — czytelne funkcje, brak chaosu, komentarze tylko tam gdzie trzeba.
- Architektura (20%) — ISR krótki, logika w main, brak blokujących opóźnień w „sterowaniu”.
- Rozszerzenie (10%) — dowolny element „dla chętnych” z listy albo własny pomysł.
Minimalny projekt ma być prosty i stabilny. Rozszerzenia robisz dopiero, gdy baza działa w 100%.
4) Co ma być w sprawozdaniu (krótko)
- Nazwa projektu (A–H) + tytuł własny
- Opis działania (5–10 zdań)
- Lista użytych pinów (wejścia/wyjścia)
- Co działa z wymagań minimalnych + jakie rozszerzenie zrobiłeś