Buat Replika Enigma Sendiri: 11 Langkah (dengan Gambar)

Buat Replika Enigma Sendiri: 11 Langkah (dengan Gambar)

Isi kandungan:

Anonim

EDIT: Instructable ini telah memenangi Hadiah Kedua dalam Contest Microcontroller Radio Shack 2013. Terima kasih kepada semua yang mengundi!

EDIT2: Enigma Terbuka dengan Tiub Stand Nixie palsu seperti yang digambarkan dalam Pengajaran ini tidak lama lagi akan tersedia sebagai edisi Khas Kickstarter.

Ini adalah Instructable pertama kami dan panduan langkah demi langkah ini akan menunjukkan kepada anda cara membina replika elektronik berfungsi sepenuhnya dari mesin Enigma Jerman yang terkenal di dunia. Projek Sumber Terbuka Arduino ini dapat menyulitkan & menyahsulit sebarang mesej Enigma M4 yang dikodkan.

Ini pertama kali Berfungsi sepenuhnya Open Source Enigma "tepat" Replica telah diilhamkan oleh Permainan Kid kepada Arduino Enigma Machine oleh sketchsk3tch.

Menggunakan Multiplexing untuk LED, litar ini dengan 115 diod pemancar cahaya menggunakan hanya 38 pin dan butang 36 push menggunakan hanya 4 pin terima kasih kepada perintang diletakkan dengan betul (dan MOSFET P-Saluran) di gelung papan kekunci. Memaparkan 4 16 Segmen & LED untuk setiap butang keyboard akan menambah dengan cepat jumlah pin yang diperlukan dan bahkan Arduino Mega akan kehabisan pin tanpa 2 metode yang disebutkan di atas ….

Sebagai tindak balas terhadap permintaan yang menggalakkan, kami merancang PCB dan menjadikannya tersedia melalui www.stgeotronics.com. Langkau ke Langkah 10 & seterusnya untuk mendapatkan maklumat lanjut. Kami juga menawarkannya sebagai kit elektronik lengkap & produk yang lengkap dan diuji.

Bekalan:

Langkah 1: Bukti Konsep di Breadboard

Sebelum mengesahkan perkembangan replika Enigma elektronik ini, kami ingin memastikan kami dapat memandu 16 Segmen LED dengan betul. Jika kita boleh berbuat demikian, daripada kita akan dapat melakukan segala-galanya …

Langkah 2: Mengumpul Bahan Baku …

Anda perlu:

1 Arduino Mega

26 Butang Alpha

26 1/4 "Jacks Mono

10 1/4 "Plugs Mono

36 Pushbuttons

1 Hidupkan / Matikan / Hidupkan

4 16Segment Orange

4 Suntikan acuan 2-Liter Soda Bottle preform (tiub ujian)

1 Kes Papan lapis

1 Hinge & Hooks

1 Kunci Separa-Mortise

1 Perfboard

38 Resistors 470 Ohms

40 Resistors 1K Ohms

7 IRF9Z24N P-Channel MOSFET

1 keping cat logam & semburan

Pilihan:

Kes Bateri

Bateri boleh dicas semula

Pengecas Bateri / Penyambung

Jika kita melakukannya semula, kita tidak akan menggunakan 1/4 "Jacks & Plag kerana ini cukup besar dan cenderung untuk mengatasi Enigma keseluruhan. Palam & bilah pisang lebih kecil & lebih dekat dengan penyambung asal yang digunakan oleh Jerman sebenar Enigmas.

Langkah 3: Letakkan Components Down

The Shack 6 "x 8" Micro Shake Radio adalah saiz yang sempurna untuk menjadi tuan rumah semua komponen kerana ia menyediakan jumlah ruang yang sesuai untuk semua yang sesuai & akan sesuai sempurna di dalam kotak Enigma.

Kami mula membahagikan ruang di Perfboard sama-sama antara 3 rantau, tetapi menyedari tidak lama lagi bahawa ini akan menjadikan Enigma elektikik lebih lama daripada yang sebenar, jadi kami memampatkan semuanya ke jarak yang sepatutnya.

Setelah berpuas hati dengan kedudukan setiap komponen, langkah seterusnya adalah pematerian.

Langkah 4: Pematerian, Pematerian & Lebih Kecil Pematerian

OK, ini terbukti menjadi pateri paling banyak yang pernah saya gunakan pada satu projek. Dengan 18 pin setiap 16 Segmen, kali 4 ditambah 26 kekunci keyboard + 26 lampu papan kekunci + beberapa LED & 1 SPDT hidup / mati / di suis, yang banyak solder.

Keputusan kami untuk menaikkan 16 Segmen memaparkan untuk menjadikan mereka kelihatan seperti tiub Nixie lama kali pasti menambah banyak mata pateri!

Tugasan Arduino Mega Pin kami:

17 Segmen:

DuinoPin Wire Pin Pin

a 2 biru 24

b 1 putih 22

c 16 wh-bl 25

d 13 hijau 31

e 9 wh-br 38

f 8 coklat 36

g 6 hijau 32

h 5 wh-atau 30

k 4 orang 28

m 3 wh-bl 26

n 17 biru 23

p 15 orang 27

r 12 wh-gr 33

s 11 coklat 35

t 7 wh-gr 34

u 14 wh-atau 29

dp 10 wh-br 37

anode1 18 merah 39

anode2 18 merah 41

anode3 18 merah 43

anode4 18 merah 45

LED:

1 40

2 42

3 44

4 46

5 48

Lampu:

QAP 10

WSY 9

EDX 8

RFC 7

TGV 6

ZHB 5

UJN 4

IKM 3

OL 2

anod1 (baris pertama) 11

anod2 (baris kedua) 12

anode3 (Ketiga baris) 13

Kunci Fungsi:

A0

Papan kekunci:

First Row A1

Kedua Row A2

Ketiga baris A3

Langkah 5: Buat Kotak dan Potong & Gerakkan Plat Atas.

Setelah memperoleh dimensi tepat kotak kayu M4 yang asal, kami membeli sekeping papan lapis & memotongnya sehingga kami boleh memasang kes kami.

Kami memutuskan untuk memotong plat keluli dari pelayan yang dipasang dengan usang kerana ia hanya ketebalan logam yang tepat untuk keperluan kami. Setelah membuat ketelusan yang menunjukkan di mana setiap butang / lampu terletak & memotongnya, kami dapat menumpuknya pada bahagian logam dan menarik setiap lubang yang diperlukan dengan tajam.

Kami kemudian menyembur melukis berwarna hitam untuk kelihatan seperti Enigma sebenar.

Langkah 6: Ujian Integrasi

Pertama adalah pemasangan kekal plat logam di atas perfboard memastikan setiap butang berfungsi dan setiap LED boleh bersinar.

Kemudian adalah pemasangan pemasangan pepejal ini ke dalam kes kayu yang memastikan kami tidak memperkenalkan di mana-mana sahaja.

Langkah 7: Perisian - Ohhhh …. Ouch!

Semasa setiap fasa pemasangan perkakasan, kami telah mencipta lakaran Arduino kecil yang akan menguji bahagian individu tertentu yang kami kerjakan:

Satu kod yang menguji bahawa setiap butang keyboard dibaca dengan tepat.

Kod kedua yang menguji setiap 10 butang fungsi.

Lukisan Enigma_POST (Power On Self Test) yang menguji setiap lampu keyboard dapat menyalakan dengan tepat dan menggerakkan setiap LED melalui setiap mod, dengan beberapa pengubahsuaian kepada kod asal roti papan untuk memastikan setiap segmen 4 16-Segmen LED berfungsi dengan sempurna.

Tetapi, walaupun dengan semua kod sampel di tangan yang menguji setiap bahagian perkakasan pada mesin, tugas mengeluarkan semula fungsi penyulitan / penyahsulitan enigma M4 sebenar adalah matematik pelancongan-de-daya!

Semua lakaran Arduino akan tersedia di Github kami yang kami buat sekarang.

Berikut adalah lakaran Enigma_POST:

/ * Kod Pembangunan Enigma untuk Ujian setiap 4 Nixies, 5 LED, kemudian Hidupkan setiap Lamp mengikut urutan.

Ditulis oleh Marc Tessier & James Sanderson 9/8/13

*/

// Tentukan Pins 16-Segmen

int segment 17 = {24,22,25,31,38,36,32,30,28,26,23,27,33,35,34,29,37};

int anode 4 = {39,41,43,45};

// Tentukan 9 Pin lampu

int lamp 9 = {10,9,8,7,6,5,4,3,2};

int lanode 3 = {11,12,13};

// Segmen LTP587P: A, B, C, D, E, F, G, H, K, M, N, P, R, S, T, U, dp

segmen boolean 39 17 = {{0,0,0,0,1,1,0,0,1,1,1,0,1,1,1,0,1}, // = A

{0,0,0,0,0,0,1,1,1,0,1,0,1,0,1,1,1}, // = B

{0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1}, // = C

{0,0,0,0,0,0,1,1,1,0,1,1,1,0,1,1,1}, // = D

{0,0,1,1,0,0,0,0,1,1,1,0,1,1,1,0,1}, // = E

{0,0,1,1,1,1,0,0,1,1,1,0,1,1,1,0,1}, // = F

{0,0,1,0,0,0,0,0,1,1,1,0,1,1,1,1,1}, // = G

{1,1,0,0,1,1,0,0,1,1,1,0,1,1,1,0,1}, // = H

{0,0,1,1,0,0,1,1,1,0,1,1,1,0,1,1,1}, // = I

{1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1}, // = J

{1,1,1,1,1,1,0,0,1,1,0,1,0,1,1,0,1}, // = K

{1.1, 1, 1, 1, {1.1, 1, 1, 1, {1.1, 1, 1, 1, {0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1}, // = O

{0,0,0,1,1,1,0,0,1,1,1,0,1,1,1,0,1}, // = P

{0,0,0,0,0,0,0,0,1,1,1,1,0,1,1,1,1}, // = Q

{0,0,0,1,1,1,0,0,1,1,1,0,0,1,1,0,1}, // = R

{0,0,1,0,0,0,1,0,1,1,1,0,1,1,1,0,1}, // = S

{0,0,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1}, // = T

{1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1}, // = U

{1,1,1,1,1,1,0,0,1,1,0,1,1,1,0,1,1}, // = V

{1.1, 1, 1, 1, {1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1}, // = X

{1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1}, // = Y

{0,0,1,1,0,0,1,1,1,1,0,1,1,1,0,1,1}, // = Z

{ 0,0,0,0,0,0,0,0,1,1,0,1,1,1,0,1,1 }, // = 0

{ 1,1,0,0,1,1,1,1,1,1,0,1,1,1,1,1,1 }, // = 1

{ 0,0,0,1,0,0,0,1,1,1,1,0,1,1,1,0,1 }, // = 2

{ 0,0,0,0,0,0,1,1,1,1,1,0,1,1,1,1,1 }, // = 3

{ 1,1,0,0,1,1,1,0,1,1,1,0,1,1,1,0,1 }, // = 4

{ 0,0,1,0,0,0,1,0,1,1,1,0,1,1,1,0,1 }, // = 5

{ 0,0,1,0,0,0,0,0,1,1,1,0,1,1,1,0,1 }, // = 6

{ 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1 }, // = 7

{ 0,0,0,0,0,0,0,0,1,1,1,0,1,1,1,0,1 }, // = 8

{ 0,0,0,0,0,0,1,0,1,1,1,0,1,1,1,0,1 }, // = 9

{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, // = Ruang

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, // = Lit penuh

{1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1} // = SS

};

// Segmen LTP587P: A, B, C, D, E, F, G, H, K, M, N, P, R, S, T, U, dp

lampiran boolean 9 9 = {{0,1,1,1,1,1,1,1,1}, // = Q atau A atau P

{1,0,1,1,1,1,1,1,1}, // = W atau S atau Y

{1,1,0,1,1,1,1,1,1}, // = E atau D atau X

{1,1,1,0,1,1,1,1,1}, // = R atau F atau C

{1,1,1,1,0,1,1,1,1}, // = T atau G atau V

{1,1,1,1,1,0,1,1,1}, // = Z atau H atau B

{1,1,1,1,1,1,0,1,1}, // = U atau J atau N

{1,1,1,1,1,1,1,0,1}, // = I atau K atau M

{1,1,1,1,1,1,1,1,0} // = O atau L

};

int value_row1 = 0;

int value_row2 = 0;

int value_row3 = 0;

kunci char = 91;

int led1 = 40;

int led2 = 42;

int led3 = 44;

int led4 = 46;

int led5 = 48;

int menunggu = 100;

void setup () {

untuk (int index = 0; index <= 3; index ++) {

pinMode (anod indeks, OUTPUT);

digitalWrite (anod indeks, 1);

}

untuk (int index = 0; index <= 16; index ++) {

pinMode (segmen indeks, OUTPUT);

digitalWrite (segmen indeks, 1);

}

// Inisikan pin digital sebagai output.

pinMode (led1, OUTPUT);

pinMode (led2, OUTPUT);

pinMode (led3, OUTPUT);

pinMode (led4, OUTPUT);

pinMode (led5, OUTPUT);

untuk (int index = 0; index <= 2; index ++) {

pinMode (lanode indeks, OUTPUT);

digitalWrite (lanode indeks, 1);

}

untuk (int index = 0; index <= 8; index ++) {

pinMode (lampu indeks, OUTPUT);

digitalWrite (lampu indeks, 1);

}

}

kekosongan gelung () {

enam belas SegWrite (0, 38);

enam belas SegWrite (1, 38);

enam belas SegWrite (2, 38);

enam belas SegWrite (3, 38);

digitalWrite (led1, HIGH); / / putar LED pada (TINGGI adalah tahap voltan)

kelewatan (200); // tunggu sebentar

digitalWrite (led1, LOW); // Matikan lampu LED dengan membuat voltan LOW

kelewatan (tunggu); // tunggu sebentar

digitalWrite (led2, HIGH); / / putar LED pada (TINGGI adalah tahap voltan)

kelewatan (200); // tunggu sebentar

digitalWrite (led2, LOW); // Matikan lampu LED dengan membuat voltan LOW

kelewatan (tunggu); // tunggu sebentar

digitalWrite (led3, HIGH); / / putar LED pada (TINGGI adalah tahap voltan)

kelewatan (200); // tunggu sebentar

digitalWrite (led3, LOW); // Matikan lampu LED dengan membuat voltan LOW

kelewatan (tunggu); // tunggu sebentar

digitalWrite (led4, HIGH); / / putar LED pada (TINGGI adalah tahap voltan)

kelewatan (200); // tunggu sebentar

digitalWrite (led4, LOW); // Matikan lampu LED dengan membuat voltan LOW

kelewatan (tunggu); // tunggu sebentar

digitalWrite (led5, HIGH); / / putar LED pada (TINGGI adalah tahap voltan)

kelewatan (200); // tunggu sebentar

digitalWrite (led5, LOW); // Matikan lampu LED dengan membuat voltan LOW

kelewatan (tunggu); // tunggu sebentar

untuk (int index = 0; index <= 2; index ++) {

digitalWrite (lanode index, 0);

untuk (int mychar = 0; mychar <9; mychar ++) {

untuk (int sindex = 0; sindex <9; sindex ++) {

digitalWrite (lamp sindex, lampvals mychar sindex);

kelewatan (30);

}

}

digitalWrite (lanode indeks, 1);

}

}

tidak sah sixteenSegWrite (int digit, int character) {

digitalWrite (anod digit, 0);

untuk (int index = 0; index <17; index ++) {

digitalWrite (segmen indeks, bahagian-bahagian watak indeks);

}

}

Langkah 8: Perisian Lebih Banyak!

Jadi kami mula-mula mencipta fungsi untuk setiap mod yang Enigma beroperasi dalam:

Dalam Mod 0, Mod Lalai, Enigma hanyalah mesin taip yang mudah dengan Marquee yang memaparkan Nombor Modelnya.

Mode 1 membolehkan pengguna memilih 3 (daripada 8) Rotor yang akan digunakan bersama dengan satu (dari 2) Reflektor yang ingin digunakan.

Dalam Mod 2, pengguna boleh memilih kedudukan Dalaman setiap Rotor.

Mod 3 digunakan untuk menentukan kedudukan permulaan (luaran) bagi setiap Rotor.

Dalam Mod 4, pengguna boleh memasukkan sehingga 10 pasang swap surat.

Mod 5 adalah mod Run dan pada ketika itu, Enigma akan menyulitkan atau menyahsulit sebarang huruf yang ditaip pada papan kekunci.

Berikut adalah lakaran lengkap yang mengendalikan Enigma keseluruhan:

/ * Kod Enigma S & T GeoTronics. Perisai adat Arduino Mega ini diprogramkan untuk ditiru

betul-betul tingkah laku mesin Enigma M4 Jerman yang benar.

Ia menggunakan 4 unit 16 Segmen, 5 LED, 26 Lampiran sebagai papan kekunci, 26 butang keyboard

& 10 Kekunci fungsi. 115 diod pemancaran cahaya adalah charlie-plexed untuk meminimumkan

jumlah pin diperlukan hingga 38 dan semua 36 kekunci pushbuttons berkongsi sebanyak 4 pin.

Direka, dipasang & diprogramkan oleh Marc Tessier & James Sanderson 9/20/13

*/

// Tentukan pembolehubah

masa yang tidak ditandatangani = millis ();

tidak lama lama otime = masa;

int inpin 4 = {A0, A1, A2, A3};

int inval 4 = {0, 0, 0, 0};

int keyval = 100;

boolean windex = 0;

boolean windex1 = 0;

boolean windex2 = 0;

int lampval = 100;

int procesval = 0;

int procesvala = 0;

int mod = 0;

mtime lama yang tidak ditandatangani;

int mdex = 0;

// Tentukan setiap watak Nixie

int dig1 = 37;

int dig2 = 37;

int dig3 = 37;

int dig4 = 37;

int data 36 = {36,36,36,36,18,39,19,36,6,4,14,19,17,14,13,8,2,18,36,4,13,8, 6,12,0,36,12,0,17,10,36,30,36,36,36,36};

// Tentukan Pins 16-Segmen sebagai 2 Arrays

int segment 17 = {24,22,25,31,38,36,32,30,28,26,23,27,33,35,34,29,37}; / / array katod

int anode 4 = {39,41,43,45}; // annode array commin annode

// Tentukan 26 Lampu sebagai Arahan 2D

int lamparray 26 2 = {{12,10}, {13,5}, {13,7}, {12,8}, {11,8}, {12,7,}, {12, 6}, {12,5}, {11,3}, {12,4}, {12,3},{13,2},{13,3},{13,4},{11,2},{13,10},{11,10},{11,7},{12,9},{11,6}, {11,4},{13,6},{11,9},{13,8},{13,9},{11,5}};

/ / Tentukan 12 Lampang Pin untuk permulaan

int lamppin 12 = {2,3,4,5,6,7,8,9,10,11,12,13}; / 2 hingga 10 katod, 11 hingga 13 annode biasa

// Tentukan setiap Segmen LTP587P: A, B, C, D, E, F, G, H, K, M, N, P, R, S, T, U, dp

segmen boolean 40 17 = {{0,0,0,0,1,1,0,0,1,1,1,0,1,1,1,0,1}, // = A 0

{0,0,0,0,0,0,1,1,1,0,1,0,1,0,1,1,1}, // = B 1

{0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1}, // = C 2

{0,0,0,0,0,0,1,1,1,0,1,1,1,0,1,1,1}, // = D 3

{0,0,1,1,0,0,0,0,1,1,1,0,1,1,1,0,1}, // = E 4

{0,0,1,1,1,1,0,0,1,1,1,0,1,1,1,0,1}, // = F 5

{0,0,1,0,0,0,0,0,1,1,1,0,1,1,1,1,1}, // = G 6

{1.1, 1, 1, 1, {0,0,1,1,0,0,1,1,1,0,1,1,1,0,1,1,1}, // = I 8

{1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1}, // = J 9

{1,1,1,1,1,1,0,0,1,1,0,1,0,1,1,0,1}, // = K 10

{1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1}, // = L 11

{1,1,0,0,1,1,0,0,0,1,0,1,1,1,1,1,1}, // = M 12

{1,1,0,0,1,1,0,0,0,1,1,1,0,1,1,1,1}, // = N 13

{0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1}, // = O 14

{0,0,0,1,1,1,0,0,1,1,1,0,1,1,1,0,1}, // = P 15

{0,0,0,0,0,0,0,0,0,1,1,1,1,0,1,1,1,1}, // = Q 16

{0,0,0,1,1,1,0,0,1,1,1,0,0,1,1,0,1}, // = R 17

{0,0,1,0,0,0,1,0,1,1,1,0,1,1,1,0,1}, // = S 18

{0,0,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1}, // = T 19

{1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1}, // = U 20

{1,1,1,1,1,1,0,0,1,1,0,1,1,1,0,1,1}, // = V 21

{1.1, 1, 1, 1, {1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,1}, // = X 23

{1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1}, // = Y 24

{0,0,1,1,0,0,1,1,1,1,0,1,1,1,0,1,1}, // = Z 25

{ 0,0,0,0,0,0,0,0,1,1,0,1,1,1,0,1,1 }, // = 0 26

{ 1,1,0,0,1,1,1,1,1,1,0,1,1,1,1,1,1 }, // = 1 27

{ 0,0,0,1,0,0,0,1,1,1,1,0,1,1,1,0,1 }, // = 2 28

{ 0,0,0,0,0,0,1,1,1,1,1,0,1,1,1,1,1 }, // = 3 29

{ 1,1,0,0,1,1,1,0,1,1,1,0,1,1,1,0,1 }, // = 4 30

{ 0,0,1,0,0,0,1,0,1,1,1,0,1,1,1,0,1 }, // = 5 31

{ 0,0,1,0,0,0,0,0,1,1,1,0,1,1,1,0,1 }, // = 6 32

{ 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1 }, // = 7 33

{ 0,0,0,0,0,0,0,0,1,1,1,0,1,1,1,0,1 }, // = 8 34

{ 0,0,0,0,0,0,1,0,1,1,1,0,1,1,1,0,1 }, // = 9 35

{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, // = Ruang 36

{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, // = Lit penuh 37

{1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1}, // = SS 38

{ 0,1,1,1,0,0,0,1,0,0,1,1,0,1,1,0,1} }; // = & 39

// Segmen LTP587P: A, B, C, D, E, F, G, H, K, M, N, P, R, S, T, U, dp

// Tentukan LED Mod 5

int led1 = 40;

int led2 = 42;

int led3 = 44;

int led4 = 46;

int led5 = 48;

//4,10,12, 5,11, 6, 3,16,21,25,13,19,14,22,24, 7,23,20,18,15, 0, 8, 1,17, 2, 9

// Tentukan nilai pemutar A B C D E F G H I J K L M N O P Q

statik int rotorvals int 12 78 = {{4,10,12, 5,11, 6, 3,16,21,25,13,19,14,22,24, 7,123,20,18,15, 0, 8, 1,17, 2, 9, 4,10,12, 5,11, 6, 3,16,21,25,13,19,14,22,24, 7,123,20,18,15, 0, 8, 1,17, 2, 9, 4,10,12, 5,11, 6, 3,16,21,25,13,19,14,22,24, 7,123,20,18,15, 0, 8, 1,17, 2, 9}, // roda 1

{ 0, 9, 3,10,118, 8,17,20,23, 1,11, 7,22,19,12, 2,16, 6,25,13,15,24, 5,21,14, 4, 0, 9, 3,10,118, 8,17,20,23, 1,11, 7,22,19,12, 2,16, 6,25,13,15,24, 5,21,14, 4, 0, 9, 3,10,118, 8,17,20,23, 1,11, 7,22,19,12, 2,16, 6,25,13,15,24, 5,21,14, 4}, // roda 2

{ 1, 3, 5, 7, 9,11, 2,15,17,19,23,21,25,13,24, 4, 8,22, 6, 0,10,112,20,18,16,14, 1, 3, 5, 7, 9,11, 2,15,17,19,23,21,25,13,24, 4, 8,22, 6, 0,10,112,20,18,16,14, 1, 3, 5, 7, 9,11, 2,15,17,19,23,21,25,13,24, 4, 8,22, 6, 0,10,112,20,18,16,14}, // roda 3

{ 4,18,14,21,15,25, 9, 0,24,116,20, 8,17, 7,23,11,13, 5,19, 6,10, 3, 2,12,22, 1, 4,18,14,21,15,25, 9, 0,24,116,20, 8,17, 7,23,11,13, 5,19, 6,10, 3, 2,12,22, 1, 4,18,14,21,15,25, 9, 0,24,116,20, 8,17, 7,23,11,13, 5,19, 6,10, 3, 2,12,22, 1}, // roda 4

{ 21,25, 1,17, 6, 8,19,24,20,15,18, 3,13, 7,11,23, 0,22,12, 9,16,14, 5, 4, 2,110, 21,25, 1,17, 6, 8,19,24,20,15,18, 3,13, 7,11,23, 0,22,12, 9,16,14, 5, 4, 2,110, 21,25, 1,17, 6, 8,19,24,20,15,18, 3,13, 7,11,23, 0,22,12, 9,16,14, 5, 4, 2,110}, // roda 5

{ 9,15, 6,21,14,20,12, 5,24,16, 1, 4,113, 7,25,17, 3,10, 0,18,23,11, 8, 2,19,122, 9,15, 6,21,14,20,12, 5,24,16, 1, 4,113, 7,25,17, 3,10, 0,18,23,11, 8, 2,19,122, 9,15, 6,21,14,20,12, 5,24,16, 1, 4,113, 7,25,17, 3,10, 0,18,23,11, 8, 2,19,122}, / / roda 6

{ 13,25, 9, 7, 6,17, 2,23,12,24,18,22,101,14,20, 5, 0, 8,21,11,15, 4,10,16, 3,119, 13,25, 9, 7, 6,17, 2,23,12,24,18,22,101,14,20, 5, 0, 8,21,11,15, 4,10,16, 3,119, 13,25, 9, 7, 6,17, 2,23,12,24,18,22,101,14,20, 5, 0, 8,21,11,15, 4,10,16, 3,119}, / / roda 7

{ 5,10,16, 7,19,11,23,14, 2, 1, 9,18,115, 3,25,17, 0,12, 4,22,13, 8,20,24, 6,121, 5,10,16, 7,19,11,23,14, 2, 1, 9,18,115, 3,25,17, 0,12, 4,22,13, 8,20,24, 6,121, 5,10,16, 7,19,11,23,14, 2, 1, 9,18,115, 3,25,17, 0,12, 4,22,13, 8,20,24, 6,121}, / / roda 8

{ 11,4,24,9,21,2,13,8,23,22,15,1,16,12,3,17,19,0,10,25,6,5,20,7,14,18, 11,4,24,9,21,2,13,8,23,22,15,1,16,12,3,17,19,0,10,25,6,5,20,7,14,18, 11,4,24,9,21,2,13,8,23,22,15,1,16,12,3,17,19,0,10,25,6,5,20,7,14, 18}, // Beta

{ 5,18,14,10,0,13,20,4,17,7,12,1,19,8,24,2,22,11,16,15,25,23,21,6,9,3, 5,18,14,10,0,13,20,4,17,7,12,1,19,8,24,2,22,11,16,15,25,23,21,6,9,3, 5,18,14,10,0,13,20,4,17,7,12,1,19,8,24,2,22,11,16,15,25,23,21,6,9, 3}, // Gamma

{ 4,13,10,16,0,20,24,22,9,8,2,14,15,1,11,12,3,23,25,21,5,19,7,17,6,18, 4,13,10,16,0,20,24,22,9,8,2,14,15,1,11,12,3,23,25,21,5,19,7,17,6,18, 4,13,10,16,0,20,24,22,9,8,2,14,15,1,11,12,3,23,25,21,5,19,7,17,6, 18}, // = UKW-B

{ 17,3,14,1,9,13,19,10,21,4,7,12,11,5,2,22,25,0,23,6,24,8,15,18,20,16, 17,3,14,1,9,13,19,10,21,4,7,12,11,5,2,22,25,0,23,6,24,8,15,18,20,16, 17,3,14,1,9,13,19,10,21,4,7,12,11,5,2,22,25,0,23,6,24,8,15,18,20, 16} // = UKW-C

};

stat const int rotorvali 10 78 = {{20,22,24, 6, 0, 3, 5,15,21,25, 1, 4, 2,10,12,19, 7,23,18, 11,17, 8,13,16,14, 9, 20,22,24, 6, 0, 3, 5,15,21,25, 1, 4, 2,10,12,19, 7,23,18,11,17, 8,13,16,14, 9, 20,22,24, 6, 0, 3, 5,15,21,25, 1, 4, 2,10,12,19, 7,23,18,11,17, 8,13,16,14, 9}, // wheel 1 i

//

{ 0, 9,15, 2,25,22,17,11, 5, 1, 3,10,14,19,24,20,16, 6, 4,13, 7,23,12, 8,21,18, 0, 9,15, 2,25,22,17,11, 5, 1, 3,10,14,19,24,20,16, 6, 4,13, 7,23,12, 8,21,18, 0, 9,15, 2,25,22,17,11, 5, 1, 3,10,14,19,24,20,16, 6, 4,13, 7,23,12, 8,21, 18}, // wheel 2 i

{ 19, 0, 6, 1,15, 2,18, 3,16, 4,20, 5,21,13,25, 7,24, 8,23, 9,22,11,17,10,14,12, 19, 0, 6, 1,15, 2,18, 3,16, 4,20, 5,21,13,25, 7,24, 8,23, 9,22,11,17,10,14,12, 19, 0, 6, 1,15, 2,18, 3,16, 4,20, 5,21,13,25, 7,24, 8,23, 9,22,11,17,10,14, 12}, // wheel 3 i

{ 7,25,22,21, 0,17,19,13,11, 6,20,15,23,16, 2, 4, 9,12, 1,18,10, 3,24,14, 8, 5, 7,25,22,21, 0,17,19,13,11, 6,20,15,23,16, 2, 4, 9,12, 1,18,10, 3,24,14, 8, 5, 7,25,22,21, 0,17,19,13,11, 6,20,15,23,16, 2, 4, 9,12, 1,18,10, 3,24,14, 8, 5}, // wheel 4 i

{ 16, 2,24,11,23,22, 4,13, 5,19,25,14,18,12,21, 9,20, 3,10, 6, 8, 0,17,15, 7, 1, 16, 2,24,11,23,22, 4,13, 5,19,25,14,18,12,21, 9,20, 3,10, 6, 8, 0,17,15, 7, 1, 16, 2,24,11,23,22, 4,13, 5,19,25,14,18,12,21, 9,20, 3,10, 6, 8, 0,17,15, 7, 1}, // wheel 5 i

{ 18,10,23,16,11, 7, 2,13,22, 0,17,21,06,12, 4, 1, 9,15,19,24, 5, 3, 25,20, 8,14, 18,10,23,16,11, 7, 2,13,22, 0,17,21,06,12, 4, 1, 9,15,19,24, 5, 3, 25,20, 8,14, 18,10,23,16,11, 7, 2,13,22, 0,17,21,06,12, 4, 1, 9,15,19,24, 5, 3, 25,20, 8, 14}, // wheel 6 i

{ 16,12,6,24,21,15,4,3,17,2,22,19,8,0,13,20,23,5,10,25,14,18,11,7,9,1, 16,12,6,24,21,15,4,3,17,2,22,19,8,0,13,20,23,5,10,25,14,18,11,7,9,1, 16,12,6,24,21,15,4,3,17,2,22,19,8,0,13,20,23,5,10,25,14,18,11,7,9, 1}, // roda 7 i

{ 16,9,8,13,18,0,24,3,21,10,1,5,17,20,7,12,2,15,11,4,22,25,19,6,23,14, 16,9,8,13,18,0,24,3,21,10,1,5,17,20,7,12,2,15,11,4,22,25,19,6,23,14, 16,9,8,13,18,0,24,3,21,10,1,5,17,20,7,12,2,15,11,4,22,25,19,6,23, 14}, // wheel 8 i

{ 17,11,5,14,1,21,20,23,7,3,18,0,13,6,24,10,12,15,25,16,22,4,9,8,2,19, 17,11,5,14,1,21,20,23,7,3,18,0,13,6,24,10,12,15,25,16,22,4,9,8,2,19, 17,11,5,14,1,21,20,23,7,3,18,0,13,6,24,10,12,15,25,16,22,4,9,8,2, 19}, // Beta i

{ 4,11,15,25,7,0,23,9,13,24,3,17,10,5,2,19,18,8,1,12,6,22,16,21,14,20, 4,11,15,25,7,0,23,9,13,24,3,17,10,5,2,19,18,8,1,12,6,22,16,21,14,20, 4,11,15,25,7,0,23,9,13,24,3,17,10,5,2,19,18,8,1,12,6,22,16,21,14, 20}}; // Gamma i

// Tentukan Array 2D untuk menjaga kedudukan dan kedudukan roda

roda int 3 3 = {{26,0,0}, {26,0,0}, {26,0,0}};

int mencerminkan 2 = {1,0};

// Tentukan Array untuk nilai plugbord 25 x2 kedudukan 0 memegang kedudukan guna 1 memegang nilai int plugu memegang total nomber dari palam yang digunakan (10 max)

int plugval 2 26 = {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0}, {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25}};

int pluguse = 0; int paindex = 0; int pbindex = 1;

void setup () {

// Inisialkan semua 38 pin LED sebagai Output

untuk (int index = 0; index <= 11; index ++) {

pinMode (lamppin indeks, OUTPUT);

digitalWrite (lamppin indeks, 1);

}

untuk (int index = 0; index <= 3; index ++) {

pinMode (anod indeks, OUTPUT);

digitalWrite (anod indeks, 1);

}

untuk (int index = 0; index <= 16; index ++) {

pinMode (segmen indeks, OUTPUT);

digitalWrite (segmen indeks, 1);

}

pinMode (led1, OUTPUT);

pinMode (led2, OUTPUT);

pinMode (led3, OUTPUT);

pinMode (led4, OUTPUT);

pinMode (led5, OUTPUT);

// Serial.begin (9600);

/ / Inisialkan semua 4 pusbutton pin sebagai Input

untuk (int index = 0; index <= 3; index ++) {

pinMode (inpin index, INPUT);

}

}

kekosongan gelung () {

// Keyboard debounce & test untuk kekunci baru yang ditekan

masa = millis ();

jika (masa> otime + 500) {keyval = readkbde ();}

jika ((keyval == 45) && (windex == 1)) {modeselect ();}

// Operasi mesin Enigma keseluruhan berkisar di mana Mod Operasi adalah semasa

jika (mod == 0) {mode0 ();}

lain jika (mode == 1) {mode1 ();}

lain jika (mode == 2) {mode2 ();}

lain jika (mode == 3) {mode3 ();}

lain jika (mode == 4) {mode4 ();}

lain jika (mode == 5) {mode5 ();}

lain {}

//Serial.println(keyval); // untuk debug cetakan nilai keybord ke monitor bersiri // untuk run atau del

}

/ // Fungsi ini menjaga mencari kunci yang telah ditekan & mengembalikan Integer yang unik

int readkbde () {

int kval = 100;

untuk (int index = 0; index <= 3; index ++) {inval index = analogRead (inpin index); } // Membaca nilai input analog

jika (inval 0> 925) && (inval 1> 828) && (inval 2> 730) && (inval 3> 828)

lain jika ((inval 0 <924) && (inval 0> 915)) {kval = 49;} // up arrow 4

lain jika ((inval 0 <914) && (inval 0> 903)) {kval = 48;} // up arrow 3

lain jika ((inval 0 <902) && (inval 0> 887)) {kval = 47;} // up arrow 2

lain jika ((inval 0 <886) && (inval 0> 865)) {kval = 46;} // up arrow 1

lain jika ((inval 0 <864) && (inval 0> 836)) {kval = 45;} // mode

lain jika ((inval 0 <834) && (inval 0> 793)) {kval = 44;} // masukkan

lain jika ((inval 0 <792) && (inval 0> 724)) {kval = 43;}

lain jika ((inval 0 <723) && (inval 0> 594)) {kval = 42;}

lain jika ((inval 0 <593) && (inval 0> 260)) {kval = 41;}

lain jika (inval 0 <259) {kval = 40;}

lain jika ((inval 1 <827) && (inval 1> 807)) {kval = 14;}

lain jika ((inval 1 <806) && (inval 1> 781)) {kval = 8;}

lain jika ((inval 1 <780) && (inval 1> 749)) {kval = 20;}

lain jika ((inval 1 <748) && (inval 1> 706)) {kval = 25;}

lain jika ((inval 1 <705) && (inval 1> 647)) {kval = 19;}

lain jika ((inval 1 <646) && (inval 1> 555)) {kval = 17;}

lain jika ((inval 1 <554) && (inval 1> 418)) {kval = 4;}

lain jika ((inval 1 <417) && (inval 1> 169)) {kval = 22;}

lain jika (inval 1 <168) {kval = 16;}

lain jika ((inval 2 <729) && (inval 2> 699)) {kval = 10;}

lain jika ((inval 2 <698) && (inval 2> 660)) {kval = 9;}

lain jika ((inval 2 <659) && (inval 2> 611)) {kval = 7;}

lain jika ((inval 2 <610) && (inval 2> 547)) {kval = 6;}

lain jika ((inval 2 <546) && (inval 2> 455)) {kval = 5;}

lain jika ((inval 2 <454) && (inval 2> 331)) {kval = 3;}

lain jika ((inval 2 <330) && (inval 2> 127)) {kval = 18;}

lain jika (inval 2 <126) {kval = 0;}

lain jika ((inval 3 <827) && (inval 3> 807)) {kval = 11;}

lain jika ((inval 3 <806) && (inval 3> 781)) {kval = 12;}

lain jika ((inval 3 <780) && (inval 3> 749)) {kval = 13;}

lain jika ((inval 3 <748) && (inval 3> 706)) {kval = 1;}

lain jika ((inval 3 <705) && (inval 3> 647)) {kval = 21;}

lain jika ((inval 3 <646) && (inval 3> 555)) {kval = 2;}

lain jika ((inval 3 <554) && (inval 3> 418)) {kval = 23;}

lain jika ((inval 3 <417) && (inval 3> 169)) {kval = 24;}

lain jika (inval 3 <169) {kval = 15;}

lain {kval = 100;}

jika (kval <99) {otime = millis ();} // Mulakan pemasa debounce utama

jika {(kval> = 0) && (kval <= 99)) {windex = 1;} // windex menunjukkan benar (1) menunjukkan kembalinya strok kunci

kembali kval;

}

// Fungsi untuk menukar Mod pengendalian

void modeselect () {

mod ++;

jika (mod> = 6) {mod = 0;}

windex = 0;

}

// Mod Lalai: Enigma adalah Typewriter

void mode0 () {

jika ((keyval> = 0) && (keyval <= 25)) {lampval = keyval;}

lampita ();

marquee ();

lampitb ();

}

// Pilih Rotors & Reflektor

void mode1 () {

indeks int;

digitalWrite (led1, HIGH);

jika (windex == 1) {if ((keyval == 43) || (keyval == 46)) {mencerminkan 0 ++; jika (mencerminkan 0> 2) {mencerminkan 0 = 1;} windex = 0;}}

jika {windex == 1} {if (keyval == 47) {untuk (index = wheel 2 0; index == wheel 1 0) || (index == wheel 2 0);

indeks ++) {if (index> 33) {index = 26;}} wheel 2 0 = index; windex = 0;}}

jika (windex == 1) {if (keyval == 48) {untuk (index = wheel 1 0; index == wheel 2 0) || (index == wheel 1 0);

indeks ++) {if (index> 33) {index = 26;}} wheel 1 0 = index; windex = 0;}}

jika (windex == 1) {jika (keyval == 49) {untuk (indeks = roda 0 0; (indeks == roda 2 0 0) || (index == wheel 0 0);

indeks ++) {if (index> 33) {index = 26;}} wheel 0 0 = index; windex = 0;}}

jika (windex == 1) {if (keyval == 42) {untuk (index = wheel 2 0; (index == wheel 1 0) || (index == wheel 2 0);

index--) {if (index <28) {index = 35;}} wheel 2 0 = index; windex = 0;}}

jika (windex == 1) {if (keyval == 41) {untuk (index = wheel 1 0; index == wheel 2 0) || (index == wheel 1 0);

index--) {if (index <28) {index = 35;}} wheel 1 0 = index; windex = 0;}}

jika (windex == 1) {if (keyval == 40) {untuk (index = wheel 0 0; index == wheel 2 0 0) || (index == wheel 0 0);

index--) {if (index <28) {index = 35;}} wheel 0 0 = index; windex = 0;}}

dig2 = roda 2 0; dig3 = roda 1 0; dig4 = roda 0 0; dig1 = mencerminkan 0;

nixisend ();

dig1 = 37; dig2 = 37; dig3 = 37; dig4 = 37;

digitalWrite (led1, LOW);

}

/ / Posisi tetapan dalaman setiap Rotor

void mode2 () {

digitalWrite (led2, HIGH);

jika (windex == 1) {

jika (keyval == 47) {wheel 2 1 ++; jika (roda 2 1> 25) {roda 2 1 = 0;}}

jika (keyval == 48) {wheel 1 1 ++; jika (roda 1 1> 25) {roda 1 1 = 0;}}

jika (keyval == 49) {wheel 0 1 ++; jika (roda 0 1> 25) {roda 0 1 = 0;}}

jika (keyval == 42) {wheel 2 1 -; jika (roda 2 1 <0) {roda 2 1 = 25;}}

jika (keyval == 41) {wheel 1 1 -; jika (roda 1 1 <0) {roda 1 1 = 25;}}

jika (keyval == 40) {wheel 0 1 -; jika (roda 0 1 <0) {roda 0 1 = 25;}}

windex = 0; }

dig2 = roda 2 1; dig3 = roda 1 1; dig4 = roda 0 1; dig1 = 0;

nixisend ();

dig1 = 37; dig2 = 37; dig3 = 37; dig4 = 37;

digitalWrite (led2, LOW);

}

// Posisi watak Mula setiap Roda

void mode3 () {

digitalWrite (led3, HIGH);

jika (windex == 1) {

jika (keyval == 46) {mencerminkan 1 ++; jika (mencerminkan 1> 25) {mencerminkan 1 = 0;}}

jika (keyval == 47) {wheel 2 2 ++; jika (roda 2 2> 25) {roda 2 2 = 0;}}

jika (keyval == 48) {wheel 1 2 ++; jika (roda 1 2> 25) {roda 1 2 = 0;}}

jika (keyval == 49) {wheel 0 2 ++; jika (roda 0 2> 25) {roda 0 2 = 0;}}

jika (keyval == 43) {mencerminkan 1 -; jika (mencerminkan 1 <0) {mencerminkan 1 = 25;}}

jika (keyval == 42) {wheel 2 2 -; jika (roda 2 2 <0) {roda 2 2 = 25;}}

jika (keyval == 41) {wheel 1 2 -; jika (roda 1 2 <0) {roda 1 2 = 25;}}

jika (keyval == 40) {wheel 0 2 -; jika (roda 0 2 <0) {roda 0 2 = 25;}}

windex = 0; }

dig2 = roda 2 2; dig3 = roda 1 2; dig4 = roda 0 2; dig1 = mencerminkan 1;

nixisend ();

dig1 = 37; dig2 = 37; dig3 = 37; dig4 = 37;

digitalWrite (led3, LOW);

}

/ / Tetapkan pasangan Plag

void mode4 () {

int index = 0;

digitalWrite (led4, HIGH);

jika (sekat <= 9) {

jika (plugval 0 paindex == 1) {untuk (index = paindex; (index == paindex) || (index == pbindex) || (plugval 0 index == 1); index ++) {if (index> 24) {index = -1;}} paindex = index;}

jika {plugval 0 pbindex == 1) {for (index = pbindex; (index == pbindex) || (index == paindex) || (plugval 0 index == 1); index ++) {if (index> 24) {index = -1;}} pbindex = index;}

jika (windex == 1) {

jika (keyval == 46) {untuk (index = paindex; (index == paindex) || (index == pbindex) || (plugval 0 index == 1); index ++) 24) {index = -1;}} paindex = index; windex = 0; }

if (keyval == 43) {for (index = paindex; (index == paindex) || (index == pbindex) || (plugval 0 index == 1); index--) {if (indeks <1) {index = 26;}} paindex = index; windex = 0; }

jika {keyval == 49} {for (index = pbindex; (index == pbindex) || (index == paindex) || (plugval 0 index == 1); index + 24) {index = -1;}} pbindex = index; windex = 0; }

if (keyval == 40) {for (index = pbindex; (index == pbindex) || (index == paindex) || (plugval 0 index == 1); index-- indeks <1) {index = 26;}} pbindex = index; windex = 0; }

jika (keyval == 44) {plugval 0 paindex = 1; palam 1 paindex = pbindex; palam 0 pbindex = 1; palam 1 pbindex = paindex; windex = 0; palam ++;}

}

dig2 = 19; dig3 = 14; dig4 = pbindex; dig1 = paindex;

nixisend ();

dig1 = 37; dig2 = 37; dig3 = 37; dig4 = 37;

}

lain {done ();}

digitalWrite (led4, LOW);

}

// Ini adalah Mod Operasi Biasa untuk Menyulitkan / Menyahsulit

void mode5 () {

int pv = 0;

digitalWrite (led5, HIGH);

jika ((keyval> = 0) && (keyval <= 25)) {if (windex == 1) {procesvala = keyval; indexwheels ();}}

windex = 0;

procesval = procesvala;

procesval = plugval 1 procesval;

/ / Serial.print (procesval); Serial.print ("");

pv = (procesval + (roda 0 2 - roda 0 1));

jika (pv <0) {pv = pv + 26;}

procesval = rotorvals roda 0 0 -27 pv;

jika (procesval> = 100) {procesval = procesval - 100;}

procesval = (procesval - (roda 0 2 - roda 0 1));

jika (procesval <0) {procesval = procesval + 26;} jika (procesval> 25) {procesval = procesval - 26;}

/ / Serial.print (procesval); Serial.print ("");

pv = (procesval + (roda 1 2 - roda 1 1));

jika (pv <0) {pv = pv + 26;}

procesval = rotorvals roda 1 0 -27 pv;

jika (procesval> = 100) {procesval = procesval - 100;}

procesval = (procesval - (roda 1 2 - roda 1 1));

jika (procesval <0) {procesval = procesval + 26;} jika (procesval> 25) {procesval = procesval - 26;}

/ / Serial.print (procesval); Serial.print ("");

pv = (procesval + (roda 2 2 - roda 2 1));

jika (pv <0) {pv = pv + 26;}

procesval = rotorvals roda 2 0 -27 pv;

jika (procesval> = 100) {procesval = procesval - 100;}

procesval = (procesval - (roda 2 2 - roda 2 1));

jika (procesval <0) {procesval = procesval + 26;} jika (procesval> 25) {procesval = procesval - 26;}

/ / Serial.print (procesval); Serial.print ("");

pv = (procesval);

procesval = rotorvals mencerminkan 0 + 7 pv;

jika (procesval> = 100) {procesval = procesval - 100;}

jika (procesval <0) {procesval = procesval + 26;} jika (procesval> 25) {procesval = procesval - 26;}

//Serial.print (procesval); Serial.print ("");

procesval = rotorvals mencerminkan 0 + 9 procesval;

//Serial.print (procesval); Serial.print ("");

pv = (procesval +26);

procesval = rotorvali mencerminkan 0 + 7 pv;

jika (procesval> = 100) {procesval = procesval - 100;}

jika (procesval <0) {procesval = procesval + 26;} jika (procesval> 25) {procesval = procesval - 26;}

/ / Serial.print (procesval); Serial.print ("");

pv = (procesval + (roda 2 2 - roda 2 1));

jika (pv <0) {pv = pv + 26;}

procesval = rotorvali roda 2 0 -27 pv;

jika (procesval> = 100) {procesval = procesval - 100;}

procesval = (procesval - (roda 2 2 - roda 2 1));

jika (procesval <0) {procesval = procesval + 26;} jika (procesval> 25) {procesval = procesval - 26;}

//Serial.print (procesval); Serial.print ("");

pv = (procesval + (roda 1 2 - roda 1 1));

jika (pv <0) {pv = pv + 26;}

procesval = rotorvali roda 1 0 -27 pv;

jika (procesval> = 100) {procesval = procesval - 100;}

procesval = (procesval - (roda 1 2 - roda 1 1));

jika (procesval <0) {procesval = procesval + 26;} jika (procesval> 25) {procesval = procesval - 26;}

//Serial.print (procesval); Serial.print ("");

pv = (procesval + (roda 0 2 - roda 0 1));

jika (pv <0) {pv = pv + 26;}

procesval = rotorvali roda 0 0 -27 pv;

jika (procesval> = 100) {procesval = procesval - 100;}

procesval = (procesval - (roda 0 2 - roda 0 1));

jika (procesval <0) {procesval = procesval + 26;} jika (procesval> 25) {procesval = procesval - 26;}

/ / Serial.print (procesval); Serial.print ("");

procesval = plugval 1 procesval;

lampval = procesval;

//Serial.println(lampval);

dig2 = roda 2 2; dig3 = roda 1 2; dig4 = roda 0 2; dig1 = mencerminkan 1;

lampita ();

nixisend ();

lampitb ();

dig1 = 37; dig2 = 37; dig3 = 37; dig4 = 37;

digitalWrite (led5, LOW);

}

// Fungsi Penolong untuk menyalakan kekunci yang betul

void lampita () {

digitalWrite (lamparray lampval 0, 0);

digitalWrite (lamparray lampval 1, 0);

}

void lampitb () {

digitalWrite (lamparray lampval 0, 1);

digitalWrite (lamparray lampval 1, 1);

}

// Fungsi Bantuan untuk menerangi "Nixies"

void nixisend () {

sixteenSegWrite (0, dig1);

sixteenSegWrite (1, dig2);

sixteenSegWrite (2, dig3);

sixteenSegWrite (3, dig4);

}

void marquee () {

masa = millis ();

jika (mtime <time) {

mtime = time + 400;

mdex ++;}

dig1 = data mdex;

dig2 = data mdex + 1;

dig3 = data mdex + 2;

dig4 = data mdex + 3;

jika (mdex> = 31) {mdex = 0;}

nixisend ();

}

// Fungsi yang sebenarnya bertukar pada setiap 17 segmen yang sesuai pada setiap "Nixie"

tidak sah sixteenSegWrite (int digit, int character) {

digitalWrite (anod digit, 0);

untuk (int index = 0; index <17; index ++) {

digitalWrite (segmen indeks, bahagian-bahagian watak indeks);

}

kelewatan (7);

untuk (int index = 0; index <= 16; index ++) {

digitalWrite (segmen indeks, 1);

}

digitalWrite (anod digit, 1);

}

tidak sah dilakukan () {

dig1 = 3; dig2 = 14; dig3 = 13; dig4 = 4;

nixisend ();

dig1 = 37; dig2 = 37; dig3 = 37; dig4 = 37;

}

batal indeks () {

/ // Serial.print (rotorvals wheel 0 0 -27 wheel 0 2);

/ // Serial.print (""); Serial.print (roda 0 0 -27); Serial.print (""); Serial.println (roda 0 2);

jika (rotorvals roda 0 0 -27 roda 0 2> = 100) {windex1 = 1;}

roda 0 2 ++; jika (roda 0 2> 25) {wheel 0 2 = 0;}

windex = 0;

jika (windex1 == 1) {

jika (rotorvals roda 1 0 -27 roda 1 2> = 100) {windex2 = 1;}

roda 1 2 ++; jika (roda 1 2> 25) {roda 1 2 = 0;}}

windex1 = 0;

jika (windex2 == 1) {

roda 2 2 ++; jika (roda 2 2> 25) {roda 2 2 = 0;}

windex2 = 0; }

}

JIKA ada minat yang mencukupi, kami merancang membuat PCB yang akan memudahkan perhimpunan Enigma yang berfungsi sepenuhnya dengan mudah. Sila layari http://www.stgeotronics.com untuk mengetahui ketersediaan, harga & untuk membuat tempahan atau pra-tempahan sekarang. Skema litar diterbitkan, jadi PCB telah memasuki peringkat pembangunannya. Tidak lama lagi akan diuji.

Langkah 9: Skema Circuit

Sebagai tindak balas kepada permintaan yang popular, berikut adalah dua Schematics Circuit.

Yang pertama menunjukkan bagaimana tabung nixie palsu kami (4 unit Segmen 16 tinggi) yang berwayar untuk memberikan respons yang diberikan oleh rotors pada mesin Enigma sebenar. Mereka juga digunakan dalam setiap mod persediaan untuk memberi maklum balas mengenai penubuhan mesin.

Yang kedua menunjukkan bagaimana setiap satu daripada 26 butang keyboard dan 10 kunci fungsi, 26 lampu utama & 5 LEDS semua berwayar.

Semua pemancar LED adalah 470 Ohms dan semua Pushbutton resistor adalah 1KOhm.

Tunggu untuk fail reka bentuk PCB …

Kami berharap anda menikmati pengajaran pertama kami!

Terima kasih atas waktunya.

Langkah 10: Papan prototaip

Kerana permintaan popular, kami merancang & mengarahkan beberapa Papan Litar Bercetak. Nah, PCB kami akhirnya masuk dan pada pandangan pertama, mereka kelihatan cantik! Kami telah sibuk mengisi & menguji salah satu untuk memastikan ia melakukan sebaik yang kelihatan dan yang lebih penting, serta peranti bukti-konsep kami.

Papan yang kami pesan hampir sempurna: setiap mereka memerlukan wayar jumper kecil untuk membaiki kecacatan reka bentuk yang kecil. Kesilapan kecil ini tidak menjejaskan tingkah laku atau fungsi dan merupakan pembaikan yang mudah.

Dengan jumper ini di tempat, kini anda boleh membuat Enigma Replica anda sendiri lebih mudah & lebih cepat daripada menjalankan semua wayar menunjukkan ini boleh dipelajari. Oleh itu, kami kini gembira melaporkan bahawa ujian itu selesai dan papan baru berfungsi dengan baik!

Kami kini menerima pesanan di www.stgeotronics.com & telah memulakan penghantaran.

Gambar perhimpunan telah ditambah sebagai Langkah 11.

Terima kasih atas sokongan anda yang luar biasa & maklum balas yang luar biasa!

Langkah 11: Kit Dipasang

Perhimpunan ini mengambil satu malam & anda boleh melihat gambar pemasangan di atas untuk gambaran keseluruhan proses.

Terima kasih atas sokongan & maklum balas!

Hadiah Kedua di Malaysia

Peraduan Microcontroller