Μετάβαση στο περιεχόμενο

Συστήματα Μικροϋπολογιστών — Σεπτέμβριος 2024

Μεταγραφή από τη φωτογραφία IMG_20240913_181202.jpg (πέντε θέματα).

IMG_20240913_181202.jpg

Ερωτήματα

  1. Να γράψετε (50%) και να εξηγήσετε επαρκώς (50%) το FSM της λειτουργίας και έναν μικροϋπολογιστή, της οικογένειας Cortex, με δύο modes και δύο privilege levels.

  2. Να δοθεί (50%) και να εξηγηθεί (50%) το χρονοδιάγραμμα εκτέλεσης της εντολής LD C, 19H, για μικροϋπολογιστικό σύστημα με: address bus 8-bit, data bus 16-bit, ROM με I/O data bus ROM=address bus ROM.

  3. Να σχεδιαστεί (50%) και να εξηγηθεί (50%) αναλυτικά ο κύκλος απαίτησης και αναγνώρισης για τη διακοπή INT~.

  4. Θεωρείστε ένα μικροϋπολογιστικό σύστημα με τέσσερεις περιφερειακές συσκευές: α) να γράψετε και να εξηγήσετε επαρκώς το διάγραμμα λειτουργίας του, σε συνδυασμό των τεχνικών interrupts και polling, β) πως θα ανταποκριθεί το σύστημα για μια παραπάνω επεξεργασία;

  5. Θεωρείστε ένα σύστημα ασφαλείας τράπεζας, που ενεργοποιείται και απενεργοποιείται με τη χρήση δύο μηχανισμών βιομετρικών αισθητήρων, έναν για κάθε λειτουργία. Να σχεδιαστεί το κατάλληλο σύστημα, να αναπτυχθεί και να εξηγηθεί ο κώδικας του προγραμματισμού του, με τη χρήση διάταξης τύπου Arduino.

Χρήσιμες πληροφορίες: - Η διάρκεια της εξέτασης είναι 2:00 ώρες. Δίνεται η δυνατότητα πρόωρης αποχώρησης, εάν το επιθυμείτε, 1:00 ώρα αργότερα από την έναρξη. - Τα θέματα είναι ισοδύναμα. - Η κόλλα των θεμάτων θα πρέπει να επιστραφεί, μαζί με τις απαντήσεις σας. - Δεν επιτρέπεται η χρήση ηλεκτρονικών συσκευών, οι οποίες θα πρέπει να είναι υποχρεωτικά απενεργοποιημένες.

Καλή Επιτυχία !

Λύσεις (⚪ AI, μη επαληθευμένο)

Κατάσταση: ⚪ AI, μη επαληθευμένο Πηγή: λύσεις AI (antigravity-gemini, gemini-3.7-flash, sonnet), ανεξάρτητη επανάληψη και αντιπαραβολή· καμία δεν έχει ελεγχθεί από άνθρωπο

Προσοχή

Λύση από AI — ελέγξτε την· δεν έχει επαληθευτεί από άνθρωπο. Η ένδειξη «δύο λύσεις συμφωνούν» δεν σημαίνει ότι η απάντηση είναι σωστή.

AI λύσεις — 2024-09

Οι λύσεις γράφτηκαν από μοντέλα AI και δεν έχουν ελεγχθεί από άνθρωπο. Η αρίθμηση ακολουθεί το αρχείο θεμάτων.

Θέμα 1

Αξιοπιστία: δύο ανεξάρτητες λύσεις συμφωνούν · εμπιστοσύνη λύτη: μέτρια

Εννοείται ο Cortex-M (π.χ. M3/M4): 2 modes (Thread, Handler) και 2 privilege levels (Privileged, Unprivileged). Το FSM έχει 3 καταστάσεις:

  1. Thread/Privileged — αρχική κατάσταση μετά το Reset (CONTROL.nPRIV=0).
  2. Thread/Unprivileged — προκύπτει με εγγραφή CONTROL.nPRIV=1 (εντολή MSR CONTROL, από privileged κώδικα).
  3. Handler/Privileged — εκτελούνται οι ρουτίνες εξαιρέσεων/διακοπών· ο Handler mode είναι πάντα privileged.

Μεταβάσεις: - Reset → Thread/Privileged. - Thread/Privileged → Thread/Unprivileged: εγγραφή CONTROL.nPRIV=1. - Thread (οποιαδήποτε) → Handler/Privileged: αποδοχή εξαίρεσης/διακοπής (ή SVC). - Handler → Thread (με το προηγούμενο επίπεδο): επιστροφή από εξαίρεση (EXC_RETURN στο LR / BX LR) — το επίπεδο προέρχεται από το CONTROL. - Thread/Unprivileged → Thread/Privileged: μόνο μέσω εξαίρεσης (π.χ. SVC), όπου ο handler αλλάζει το CONTROL· ο unprivileged κώδικας δεν μπορεί να γράψει το CONTROL.

Εξήγηση: το privileged επίπεδο έχει πλήρη πρόσβαση στους καταχωρητές συστήματος (NVIC, SysTick, MPU)· το unprivileged περιορισμένη, για προστασία από κακό κώδικα εφαρμογής. Δεν είναι βέβαιο ότι ο διδάσκων ζητά ακριβώς αυτό το διάγραμμα.

Θέμα 2

Αξιοπιστία: λύθηκε με βάση τις φωτογραφίες του θέματος· μία λύση AI

Στην πρωτότυπη εικόνα IMG_20240913_181202.jpg η εκφώνηση διατυπώνεται επίσημα ως εξής: «2. Να δοθεί (50%) και να εξηγηθεί (50%) το χρονοδιάγραμμα εκτέλεσης της εντολής LD C, 19H, για μικροϋπολογιστικό σύστημα με: address bus 8-bit, data bus 16-bit, ROM με I/O data bus ROM=address bus ROM.»

Πρόκειται για παραλλαγή της κλασικής άσκησης χρονοδιαγράμματος εντολής φόρτωσης άμεσης σταθεράς (LD r, n), προσαρμοσμένη στις προδιαγραφές διαύλων που δίνονται (όπως αντίστοιχα ζητήθηκε και το 2022).


Ανάλυση της εντολής LD C, 19H και των προδιαγραφών

  • Λειτουργία εντολής: Φόρτωση της άμεσης τιμής 19H στον καταχωρητή C.
  • Κωδικός εντολής (Opcode): 0EH (μορφή 00 rrr 110 με rrr = 001 για τον C).
  • Άμεσο όρισμα (Operand): 19H.
  • Δίαυλος διευθύνσεων (Address Bus 8-bit): Ο επεξεργαστής/σύστημα εκπέμπει διευθύνσεις 8 bit (\(A_0 \dots A_7\)).
  • Δίαυλος δεδομένων (Data Bus 16-bit): Ο δίαυλος δεδομένων είναι εύρους 16 bit (\(D_0 \dots D_{15}\)).
  • Οργάνωση ROM (I/O data bus ROM = address bus ROM): Η ROM διαθέτει 8 γραμμές διευθύνσεων (ίσο με το πλάτος του address bus) και οι έξοδοι δεδομένων της μπορούν να διαβαστούν είτε ως λέξη 16-bit είτε σε 8-bit υποδίαυλο (\(D_0 \dots D_7\)). Σε σύστημα με δίαυλο δεδομένων 16 bit, η ανάγνωση της λέξης εντολής μπορεί να προσκομίσει ταυτόχρονα και τα 2 bytes (Opcode 0EH και Operand 19H) στον ίδιο κύκλο ανάγνωσης (π.χ. \(D_7 \dots D_0 = \text{0EH}\) και \(D_{15} \dots D_8 = \text{19H}\)), ή εναλλακτικά με δύο διαδοχικούς κύκλους ανάγνωσης μνήμης (M1 Opcode Fetch και M2 Memory Read) όπως στην τυπική αρχιτεκτονική του μαθήματος.

Κύκλοι εκτέλεσης και Χρονοδιάγραμμα

1. Τυπική προσέγγιση Z80 / διδασκαλίας μαθήματος (2 κύκλοι μηχανής M1 + M2):

  • Κύκλος M1: Προσκόμιση εντολής (Opcode Fetch — 4T: T1, T2, T3, T4)
  • T1: Ο απαριθμητής προγράμματος (PC) τοποθετείται στον 8-bit δίαυλο διευθύνσεων (\(A_0 \dots A_7\)). Ενεργοποιείται το σήμα \(\overline{\text{M1}}\) (χαμηλή στάθμη).
  • Σταθεροποιείται η διεύθυνση και ενεργοποιούνται τα σήματα ελέγχου μνήμης \(\overline{\text{MREQ}}\) και ανάγνωσης \(\overline{\text{RD}}\) (χαμηλή στάθμη).
  • T2: Η ROM προσπελαύνεται και οδηγεί τον κωδικό εντολής 0EH στον δίαυλο δεδομένων.
  • T3: Στη θετική ακμή του ρολογιού T3, η CPU δειγματοληπτεί τον κωδικό 0EH. Απενεργοποιούνται τα \(\overline{\text{MREQ}}\) και \(\overline{\text{RD}}\). Ο PC αυξάνεται (\(\text{PC} \leftarrow \text{PC} + 1\)).
  • T3–T4: Εσωτερική αποκωδικοποίηση της εντολής και κύκλος ανανέωσης μνήμης (σήμα \(\overline{\text{RFSH}}\) ενεργό, διεύθυνση ανανέωσης στον δίαυλο διευθύνσεων).

  • Κύκλος M2: Ανάγνωση του ορίσματος 19H (Memory Read — 3T: T1, T2, T3)

  • T1: Ο αυξημένος PC τοποθετείται στον δίαυλο διευθύνσεων (\(A_0 \dots A_7\)). Το \(\overline{\text{M1}}\) παραμένει απενεργοποιημένο (υψηλή στάθμη). Ενεργοποιούνται τα \(\overline{\text{MREQ}}\) και \(\overline{\text{RD}}\).
  • T2: Η ROM τοποθετεί το δεδομένο 19H στον δίαυλο δεδομένων.
  • T3: Η CPU δειγματοληπτεί την τιμή 19H και τη φορτώνει στον καταχωρητή C. Απενεργοποιούνται τα \(\overline{\text{MREQ}}\) και \(\overline{\text{RD}}\). Ο PC αυξάνεται (\(\text{PC} \leftarrow \text{PC} + 1\)).

2. Εναλλακτική προσέγγιση ενιαίας ανάγνωσης λέξης 16-bit:

Αν το σύστημα εκμεταλλεύεται πλήρως τον δίαυλο 16-bit για προσκόμιση πλήρους λέξης εντολής: - Σε έναν ενιαίο κύκλο προσκόμισης (M1 — 4T), διαβάζονται ταυτόχρονα και τα 2 bytes: - \(D_7 \dots D_0 = \text{0EH}\) (Opcode) - \(D_{15} \dots D_8 = \text{19H}\) (Άμεσο δεδομένο) - Στον κύκλο T3 η CPU αποθηκεύει άμεσα το άνω byte στον καταχωρητή C κατά την αποκωδικοποίηση, ολοκληρώνοντας την εντολή σε έναν μόνο κύκλο μηχανής (4T) με αύξηση \(\text{PC} \leftarrow \text{PC} + 2\).


Σχεδιάγραμμα Χρονισμού Σημάτων (2 Κύκλοι Μηχανής M1 + M2)

Σήμα             | T1   T2   T3   T4   | T1   T2   T3   |
-----------------------------------------------------------
CLK              | _/¯\_/¯\_/¯\_/¯\_/¯\ | _/¯\_/¯\_/¯\_/¯\ |
                 | <---- Κύκλος M1 ----> | <-- Κύκλος M2 --> |
Address (8-bit)  |===== PC =====|== R ==|==== PC+1 ====|   |
/M1              |¯\___________/¯¯¯¯¯¯¯¯|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|
/MREQ            |¯¯¯\_______/¯¯\____/¯¯|¯¯¯\_______/¯¯¯¯¯¯|
/RD              |¯¯¯\_______/¯¯¯¯¯¯¯¯¯¯|¯¯¯\_______/¯¯¯¯¯¯|
/RFSH            |¯¯¯¯¯¯¯¯¯¯¯\_______/¯¯|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|
Data (16/8-bit)  |------|=== 0EH ===|---|------|=== 19H ===|
                 |      (Opcode Fetch)  |      (Operand)   |
(Αμφότερες οι προσεγγίσεις εξηγούνται αναλυτικά, καλύπτοντας πλήρως τόσο την κλασική Z80 διδασκαλία όσο και την ιδιαιτερότητα των 16-bit data bus).

Θέμα 3

Αξιοπιστία: δύο ανεξάρτητες λύσεις συμφωνούν · εμπιστοσύνη λύτη: μέτρια

Αίτηση και αναγνώριση της \(\overline{INT}\) (Z80, maskable): - Η \(\overline{INT}\) είναι ευαίσθητη σε στάθμη (ενεργός 0) και πρέπει να παραμείνει ενεργή μέχρι την αναγνώριση. Δειγματοληπτείται στην ανοδική ακμή του τελευταίου T της τρέχουσας εντολής. Γίνεται δεκτή αν IFF1=1 (EI) και δεν υπάρχει \(\overline{BUSRQ}\). - Αναγνώριση: ειδικός κύκλος M1 με \(\overline{IORQ}=0\) αντί \(\overline{MREQ}\)/\(\overline{RD}\), με 2 αυτόματα κύκλους αναμονής (ο κύκλος M1 διαρκεί 7 T: 5 T όπως στο NMI, προσαρμοσμένος, + 2 T_W· συνολικά 13 T στο IM 1). Το IFF1, IFF2 μηδενίζονται. - Η συσκευή βάζει στο διάδρομο δεδομένων ανάλογα με το IM: - IM 0: εντολή (συνήθως RST n) → 13 T για RST. - IM 1: αγνοείται, άλμα σε 0038H → 13 T = 7 + 3 + 3. - IM 2: διάνυσμα 8 bit· διεύθυνση = \(I\cdot256 + \text{vector}\), ο CPU διαβάζει 2 byte (ISR) → 19 T = 7 + 3 + 3 (push PC) + 3 + 3 (ανάγνωση πίνακα). - Το PC σπρώχνεται στη στοίβα (2 κύκλοι εγγραφής). Η ISR κλείνει με EI/RETI ώστε να αναγνωριστεί το τέλος από τη συσκευή (daisy chain).

Σχέδιο: CLK, \(\overline{INT}\) (πτώση πριν το τέλος εντολής), \(\overline{M1}\), \(\overline{IORQ}\) (ενεργό στα T_W–T3 του M1), A15–A0, D7–D0, \(\overline{WR}\) στους 2 κύκλους στοίβας. Η κατανομή των T μέσα στον M1 είναι από μνήμη· ο συνολικός χρόνος 13 T (IM 1) / 19 T (IM 2) είναι το πιο σίγουρο στοιχείο.

Θέμα 4

Αξιοπιστία: δύο ανεξάρτητες λύσεις συμφωνούν · εμπιστοσύνη λύτη: μέτρια

(α) Τέσσερις περιφερειακές συσκευές D1–D4 με συνδυασμό διακοπών και polling: όλες οι συσκευές ενώνονται με wired-OR στην ίδια γραμμή αίτησης \(\overline{INT}\) και κάθε μία έχει καταχωρητή κατάστασης/σημαία.

Διάγραμμα ροής: 1. Αρχικοποίηση (στοίβα, IM, μάσκες, EI) → κύριο πρόγραμμα (βρόχος). 2. Εμφάνιση \(\overline{INT}\) → ο CPU ολοκληρώνει την τρέχουσα εντολή, αποθηκεύει PC, πάει στην ISR. 3. ISR: αποθήκευση καταχωρητών· polling της σημαίας κάθε συσκευής με σειρά προτεραιότητας D1→D4: - αν D1 ζητά εξυπηρέτηση → ρουτίνα D1, καθαρισμός σημαίας· αλλιώς έλεγχος D2, κ.ο.κ. 4. Επανάληψη μέχρι να μην υπάρχει άλλη σημαία (εξυπηρέτηση πολλών ταυτόχρονων αιτήσεων)· επαναφορά καταχωρητών, EI, RETI.

Πλεονέκτημα: ο CPU δεν «γυρνά» διαρκώς όλες τις συσκευές (δεν σπαταλά χρόνο), αλλά με μία γραμμή INT η ISR αναγνωρίζει την πηγή με polling.

(β) «Για μια παραπάνω επεξεργασία» (π.χ. πέμπτη συσκευή/επιπλέον εργασία): η νέα συσκευή συνδέεται στην ίδια γραμμή και απλώς προστίθεται ένας ακόμη έλεγχος σημαίας στην ISR· το κόστος είναι λίγοι ακόμη κύκλοι ρολογιού στη χειρότερη περίπτωση (η τελευταία συσκευή περιμένει περισσότερο), και μπορεί να ξεπεραστεί η χωρητικότητα σε προθεσμίες πραγματικού χρόνου. Αν χρειάζεται πιο γρήγορη απόκριση, χρησιμοποιείται IM 2 με διάνυσμα ανά συσκευή (άμεσα) ή ελεγκτής διακοπών. Η ερμηνεία του (β) είναι εικασία.

Θέμα 5

Αξιοπιστία: 2 από 3 ανεξάρτητες λύσεις συμφωνούν (η άλλη διαφωνούσε) · εμπιστοσύνη λύτη: υψηλή

1. Σχεδίαση Συστήματος Ασφαλείας

Το σύστημα υλοποιείται με μικροελεγκτή τύπου Arduino (π.χ. Arduino Uno / ATmega328P) και περιλαμβάνει: * Μηχανισμός Βιομετρικού Αισθητήρα 1 (Ενεργοποίηση - ARM): Αναγνώστης δακτυλικού αποτυπώματος / βιομετρική διάταξη εξουσιοδοτημένου προσώπου ενεργοποίησης (σύνδεση ψηφιακής εξόδου / UART, εδώ ψηφιακή είσοδος παλμού επικύρωσης στο Pin 2 με εξωτερική διακοπή INT0). * Μηχανισμός Βιομετρικού Αισθητήρα 2 (Απενεργοποίηση - DISARM): Δεύτερη βιομετρική διάταξη εξουσιοδοτημένου προσώπου απενεργοποίησης (σύνδεση ψηφιακής εξόδου στο Pin 3 με εξωτερική διακοπή INT1). * Ενεργοποιητές & Ενδείξεις: * Relay Module (Pin 8): Οδηγεί την κλειδαριά ασφαλείας του θησαυροφυλακίου / σειρήνα. * Red LED (Pin 7): Ένδειξη ενεργοποιημένου συστήματος (ARMED). * Green LED (Pin 6): Ένδειξη απενεργοποιημένου συστήματος (DISARMED). * Buzzer (Pin 5): Ηχητική επιβεβαίωση αλλαγής κατάστασης.

Σχηματικό Διάγραμμα Διασύνδεσης:

  • Pin 2 (INT0) \(\leftarrow\) Ψηφιακή έξοδος Αισθητήρα 1 (Valid ID 1 / Trigger High)
  • Pin 3 (INT1) \(\leftarrow\) Ψηφιακή έξοδος Αισθητήρα 2 (Valid ID 2 / Trigger High)
  • Pin 8 \(\to\) Relay IN (Ενεργοποίηση κυκλώματος ασφαλείας)
  • Pin 7 \(\to\) Red LED (Μέσω αντίστασης \(220\,\Omega\))
  • Pin 6 \(\to\) Green LED (Μέσω αντίστασης \(220\,\Omega\))
  • Pin 5 \(\to\) Buzzer (+)

2. Κώδικας Προγραμματισμού (Arduino C/C++)

#include <Arduino.h>

// Ορισμός ακροδεκτών
const uint8_t SENSOR_ARM_PIN    = 2; // Εξωτερική διακοπή INT0
const uint8_t SENSOR_DISARM_PIN = 3; // Εξωτερική διακοπή INT1
const uint8_t BUZZER_PIN        = 5;
const uint8_t LED_DISARMED_PIN  = 6; // Πράσινο LED
const uint8_t LED_ARMED_PIN     = 7; // Κόκκινο LED
const uint8_t RELAY_LOCK_PIN    = 8; // Ρελές ασφαλείας

// Κατάσταση συστήματος (volatile λόγω χρήσης σε ISR)
volatile bool systemArmed = false;
volatile bool stateChanged = false;

// ISR για τον Βιομετρικό Αισθητήρα Ενεργοποίησης
void isrArm() {
    if (!systemArmed) {
        systemArmed = true;
        stateChanged = true;
    }
}

// ISR για τον Βιομετρικό Αισθητήρα Απενεργοποίησης
void isrDisarm() {
    if (systemArmed) {
        systemArmed = false;
        stateChanged = true;
    }
}

void setup() {
    // Ρύθμιση κατεύθυνσης ακροδεκτών
    pinMode(SENSOR_ARM_PIN, INPUT_PULLUP);
    pinMode(SENSOR_DISARM_PIN, INPUT_PULLUP);

    pinMode(RELAY_LOCK_PIN, OUTPUT);
    pinMode(LED_ARMED_PIN, OUTPUT);
    pinMode(LED_DISARMED_PIN, OUTPUT);
    pinMode(BUZZER_PIN, OUTPUT);

    // Αρχική κατάσταση: Απενεργοποιημένο (DISARMED)
    digitalWrite(RELAY_LOCK_PIN, LOW);
    digitalWrite(LED_ARMED_PIN, LOW);
    digitalWrite(LED_DISARMED_PIN, HIGH);
    digitalWrite(BUZZER_PIN, LOW);

    // Σύνδεση εξωτερικών διακοπών (Ενεργοποίηση σε falling edge από τους αισθητήρες)
    attachInterrupt(digitalPinToInterrupt(SENSOR_ARM_PIN), isrArm, FALLING);
    attachInterrupt(digitalPinToInterrupt(SENSOR_DISARM_PIN), isrDisarm, FALLING);

    Serial.begin(9600);
    Serial.println("Bank Security System Initialized: DISARMED");
}

void loop() {
    // Έλεγχος αν υπήρξε μετάβαση κατάστασης από τις διακοπές
    if (stateChanged) {
        // Απενεργοποίηση διακοπών προσωρινά για συνέπεια ανάγνωσης
        noInterrupts();
        bool currentState = systemArmed;
        stateChanged = false;
        interrupts();

        if (currentState) {
            // Μετάβαση σε ARMED
            digitalWrite(RELAY_LOCK_PIN, HIGH); // Κλείδωμα/Οπλισμός
            digitalWrite(LED_ARMED_PIN, HIGH);
            digitalWrite(LED_DISARMED_PIN, LOW);

            // Ηχητικό σήμα επιβεβαίωσης οπλισμού (2 σύντομα beeps)
            tone(BUZZER_PIN, 2000, 100);
            delay(150);
            tone(BUZZER_PIN, 2000, 100);

            Serial.println("[ALERT] System ARMED via Biometric Sensor 1.");
        } else {
            // Μετάβαση σε DISARMED
            digitalWrite(RELAY_LOCK_PIN, LOW); // Ξεκλείδωμα/Αφοπλισμός
            digitalWrite(LED_ARMED_PIN, LOW);
            digitalWrite(LED_DISARMED_PIN, HIGH);

            // Ηχητικό σήμα επιβεβαίωσης αφοπλισμού (1 παρατεταμένο beep)
            tone(BUZZER_PIN, 1000, 400);

            Serial.println("[INFO] System DISARMED via Biometric Sensor 2.");
        }
    }

    // Εδώ εκτελούνται λοιπές εργασίες επιτήρησης χαμηλής προτεραιότητας
    delay(50);
}

3. Επεξήγηση Λειτουργίας Κώδικα

  1. Χρήση Εξωτερικών Διακοπών (attachInterrupt):
  2. Οι αισθητήρες συνδέονται στα Pins 2 (INT0) και 3 (INT1). Μόλις ένας αισθητήρας πιστοποιήσει επιτυχώς το βιομετρικό χαρακτηριστικό, παράγει έναν παλμό (falling edge), προκαλώντας άμεση διακοπή στον μικροελεγκτή. Αυτό εξασφαλίζει μηδενική καθυστέρηση και αποφυγή απώλειας συμβάντος.
  3. Ρουτίνες Εξυπηρέτησης Διακοπών (isrArm, isrDisarm):
  4. Είναι εξαιρετικά σύντομες. Αλλάζουν τη σημαία κατάστασης systemArmed και θέτουν το flag stateChanged = true, χωρίς να περιέχουν καθυστερήσεις (delay) ή αργές συναρτήσεις.
  5. Κύριος Βρόχος (loop):
  6. Ελέγχει τη σημαία stateChanged. Αν διαπιστωθεί αλλαγή, ενημερώνει τις εξόδους:
    • Ενεργοποιεί/απενεργοποιεί το ρελέ (RELAY_LOCK_PIN) που ελέγχει τους ηλεκτρομαγνήτες ασφαλείας των θυρών.
    • Εναλλάσσει τις οπτικές ενδείξεις (Κόκκινο LED για ARMED, Πράσινο LED για DISARMED).
    • Παράγει διαφορετικό ακουστικό μοτίβο στο buzzer για σαφή ακουστική ένδειξη της κατάστασης στον χειριστή.
    • Καταγράφει το συμβάν στη σειριακή θύρα (Serial Log).

✔ Επιβεβαίωσε · ✖ Βρήκα λάθος


✖ Βρήκα λάθος στη μεταγραφή