#include #include // --------------------------------------------------------- // DANE SIECI WI-FI (TRYB ACCESS POINT) // --------------------------------------------------------- const char* ssid = "Dekoder_Morse"; const char* password = "TajneHaslo123"; ESP8266WebServer server(80); // Definicje pinów (Gracz 1) const int PIN_INPUT = 5; // D1 (Przycisk nadawania) const int PIN_SUBMIT = 4; // D2 (Przycisk zatwierdzania) const int PIN_LED = 14; // D5 (Dioda LED) const int PIN_BUZZER = 12; // D6 (Buzzer) // Parametry czasowe const int DEBOUNCE_TIME = 30; const int DOT_DASH_THRESHOLD = 250; const int BLINK_DOT_TIME = 200; const int BLINK_DASH_TIME = 600; const int BLINK_GAP_TIME = 200; unsigned long pressStartTime = 0; bool isInputPressed = false; bool lastSubmitState = HIGH; // Zmienne - GRACZ 1 (Lokalny) String aktualnyMorse1 = ""; String aktualnaLitera1 = "-"; String calyTekst1 = ""; // Zmienne - GRACZ 2 (Zdalny - z Drugiej Płytki) String aktualnyMorse2 = ""; String aktualnaLitera2 = "-"; String calyTekst2 = ""; const int DICT_SIZE = 26; const String morseCodes[DICT_SIZE] = { ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.." }; const char letters[DICT_SIZE] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' }; // --------------------------------------------------------- // STRONA HTML + CSS + JAVASCRIPT // --------------------------------------------------------- const char index_html[] PROGMEM = R"rawliteral( Centrum Morse'a

Centrum Łączności Morse'a


Alfabet Morse'a

A.-
B-...
C-.-.
D-..
E.
F..-.
G--.
H....
I..
J.---
K-.-
L.-..
M--
N-.
O---
P.--.
Q--.-
R.-.
S...
T-
U..-
V...-
W.--
X-..-
Y-.--
Z--..
)rawliteral"; void setup() { Serial.begin(115200); randomSeed(analogRead(0)); pinMode(PIN_INPUT, INPUT_PULLUP); pinMode(PIN_SUBMIT, INPUT_PULLUP); pinMode(PIN_LED, OUTPUT); pinMode(PIN_BUZZER, OUTPUT); digitalWrite(PIN_LED, LOW); noTone(PIN_BUZZER); Serial.println("\nUruchamianie AP..."); WiFi.softAP(ssid, password); Serial.print("Adres strony: "); Serial.println(WiFi.softAPIP()); server.on("/", []() { server.send(200, "text/html", index_html); }); server.on("/data", []() { String json = "{"; json += "\"m1\": \"" + aktualnyMorse1 + "\", \"l1\": \"" + aktualnaLitera1 + "\", \"t1\": \"" + calyTekst1 + "\","; json += "\"m2\": \"" + aktualnyMorse2 + "\", \"l2\": \"" + aktualnaLitera2 + "\", \"t2\": \"" + calyTekst2 + "\""; json += "}"; server.send(200, "application/json", json); }); // ODBIÓR OD GRACZA 2 server.on("/update2", []() { if(server.hasArg("m")) { aktualnyMorse2 = server.arg("m"); } if(server.hasArg("l")) { aktualnaLitera2 = server.arg("l"); calyTekst2 += aktualnaLitera2; aktualnyMorse2 = ""; } server.send(200, "text/plain", "OK"); }); server.on("/reset", []() { aktualnyMorse1 = ""; aktualnaLitera1 = "-"; calyTekst1 = ""; aktualnyMorse2 = ""; aktualnaLitera2 = "-"; calyTekst2 = ""; server.send(200, "text/plain", "OK"); }); server.on("/quiz", []() { String quizType = server.arg("type"); int r = random(0, DICT_SIZE); String codeToBlink = morseCodes[r]; char correctLetter = letters[r]; for (int i = 0; i < codeToBlink.length(); i++) { if (quizType == "visual") digitalWrite(PIN_LED, HIGH); else if (quizType == "audio") tone(PIN_BUZZER, 800); if (codeToBlink[i] == '.') delay(BLINK_DOT_TIME); else if (codeToBlink[i] == '-') delay(BLINK_DASH_TIME); digitalWrite(PIN_LED, LOW); noTone(PIN_BUZZER); delay(BLINK_GAP_TIME); } server.send(200, "text/plain", String(correctLetter)); }); server.begin(); } void loop() { server.handleClient(); // OBSŁUGA GRACZA 1 bool currentInputState = digitalRead(PIN_INPUT); if (currentInputState == LOW) { digitalWrite(PIN_LED, HIGH); tone(PIN_BUZZER, 800); } else { digitalWrite(PIN_LED, LOW); noTone(PIN_BUZZER); } if (currentInputState == LOW && !isInputPressed) { isInputPressed = true; pressStartTime = millis(); delay(DEBOUNCE_TIME); } else if (currentInputState == HIGH && isInputPressed) { isInputPressed = false; unsigned long pressDuration = millis() - pressStartTime; if (pressDuration > DEBOUNCE_TIME) { if (pressDuration < DOT_DASH_THRESHOLD) aktualnyMorse1 += "."; else aktualnyMorse1 += "-"; } delay(DEBOUNCE_TIME); } bool currentSubmitState = digitalRead(PIN_SUBMIT); if (currentSubmitState == LOW && lastSubmitState == HIGH) { if (aktualnyMorse1.length() > 0) { aktualnaLitera1 = "-"; for (int i = 0; i < DICT_SIZE; i++) { if (morseCodes[i] == aktualnyMorse1) { aktualnaLitera1 = String(letters[i]); break; } } calyTekst1 += aktualnaLitera1; aktualnyMorse1 = ""; } delay(50); } lastSubmitState = currentSubmitState; }