Gör din egen Enigma replika (8 / 11 steg)
Steg 8: Mer programvara!
I läge 0, Standardfunktionsläge, är gåtan ingenting annat än en enkel skrivmaskin med en markeringsram som visar dess modellnummer.
Läge 1 ger användaren möjlighet att välja 3 (av 8) rotorer han kommer att använda tillsammans med som en (av 2) reflektor han vill använda.
I läge 2, kan användaren välja inre positionen för varje Rotor.
Läge 3 används för att ange startpositionen (externt) för varje Rotor.
I läge 4, kan en användare ange upp till 10 Swapped bokstavspar.
Läge 5 drivs läge och på den punkten, gåtan kommer att kryptera eller dekryptera en bokstav skrivs på tangentbordet.
Här är komplett skissen som kör hela gåtan:
/ * S & T GeoTronics Enigma kod. Denna Arduino Mega anpassade sköld är programmerad att replikera
exakt hur en sant tyska M4 Enigma-maskin.
Den använder 4 16-segmentet enheter, 5 lysdioder, 26 lampor setup som tangentbord, 26 tangentbord knappar
& 10 funktionstangenter. De 115 light emitting dioder är charlie-plexed att minimera den
mängd stiften behövs ner till 38 och alla 36 tryckknappar nycklar delar totalt 4 stift.
Utformade, monteras och programmerad av Marc Tessier & James Sanderson 9/20/13
*/
Definiera variablerna
osignerade långa tid = millis();
osignerade långa otime = tid;
int inpin [4] = {A0, A1, A2, A3};
int inval [4] = {0, 0, 0, 0};
int keyval = 100;
booleska windex = 0;
booleska windex1 = 0;
booleska windex2 = 0;
int lampval = 100;
int procesval = 0;
int procesvala = 0;
int läge = 0;
osignerade långa mtime;
int mdex = 0;
Definiera varje Nixie tecken
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}.
Definiera 16-segmenten stiften som 2 matriser
int segmentet [17] = {24,22,25,31,38,36,32,30,28,26,23,27,33,35,34,29,37}. katod array
int anod [4] = {39,41,43,45}. annode array commin annode
Definiera 26 lyktorna som ett 2D Array
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}};
Definiera 12 lampa stiften initiering
int lamppin [12] = {2,3,4,5,6,7,8,9,10,11,12,13}. 2 till 10 katod, 11 till 13 gemensamma annode
Definiera varje LTP587P segment: A, B, C, D, E, F, G, H, K, M, N, P, R, S, T, U, dp
booleska segmentvals [40] [17] = {{0,0,0,0,1,1,0,0,1,1,1,0,1,1,1,0,1}, / / = 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,0,0,1,1,0,0,1,1,1,0,1,1,1,0,1}, / / = H 7
{0,0,1,1,0,0,1,1,1,0,1,1,1,0,1,1,1}, / / = jag 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,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,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,0,0,1,1,0,0,1,1,1,1,0,1,0,1,1}, / / = W 22
{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}, / / = utrymme 36
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, / / = fullt upplysta 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
LTP587P segment: A, B, C, D, E, F, G, H, K, M, N, P, R, S, T, U, dp
Definiera de 5 lysdioderna läge
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
Definiera rotor värden A B C D E F G H I J K L M N O P Q
statisk const int rotorvals [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}, / / hjul 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}, / / hjul 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}, / / hjul 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}, / / hjul 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}, / / hjul 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}, / / hjul 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}, / / hjul 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}, / / hjul 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
};
statisk 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 jag
//
{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 jag
{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 jag
{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 jag
{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 jag
{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 jag
{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}, //wheel 7 jag
{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 jag
{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 jag
{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 jag
Definiera en 2D Array för att hålla hjulet platser & positioner
int hjul [3] [3] = {{26,0,0}, {26,0,0}, {26,0,0}};
int återspeglar [2] = {1,0}.
Definiera matris för plugbord värden 25 x2 position 0 innehar använda position 1 håller värdet int plugu innehar den totala nomber av pluggar används (max 10)
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,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() {
Initiera alla 38 LED stift som utdata
för (heltal index = 0; index < = 11; index ++) {
pinMode (lamppin [index], produktionen);
digitalWrite(lamppin[index],1);
}
för (heltal index = 0; index < = 3; index ++) {
pinMode (anoden [index], produktionen);
digitalWrite (anoden [index], 1);
}
för (heltal index = 0; index < = 16; index ++) {
pinMode (segment [index], OUTPUT);
digitalWrite (segment [index], 1);
}
pinMode(led1,OUTPUT);
pinMode(led2,OUTPUT);
pinMode(led3,OUTPUT);
pinMode(led4,OUTPUT);
pinMode(led5,OUTPUT);
Serial.BEGIN(9600);
Initiera alla 4 pusbutton stift som indata
för (heltal index = 0; index < = 3; index ++) {
pinMode (inpin [index], ingång);
}
}
void loop() {
Tangentbord debounce & test för nya nedtryckt
tid = millis();
om (tid > otime + 500) {keyval = readkbde();}
om ((keyval == 45) & & (windex == 1)) {modeselect();}
Hela Enigma machine verksamheten kretsar kring vilket driftsläge är aktuell
IF(mode == 0) {mode0();}
annat if(mode == 1) {mode1();}
annat if(mode == 2) {mode2();}
annat if(mode == 3) {mode3();}
annat if(mode == 4) {mode4();}
annat if(mode == 5) {mode5();}
annat {}
Serial.println(keyval); för debuging utskrifter keybord värde till seriell monitor / / för köra eller del
}
Denna funktion hand tar om räkna ut vilken tangent har tryckts & returnerar ett unikt heltal
int readkbde() {
int kval = 100;
för (heltal index = 0; index < = 3; index ++) {inval [index] = analogRead(inpin[index]);} //Reads analog ingång värden
om ((inval [0] > 925) & & (inval [1] > 828) & & (inval [2] > 730) & & (inval [3] > 828)) {kval = 100;} / / ingen nyckel tryck
annars om ((inval [0] < 924) & & (inval [0] > 915)) {kval = 49;} //up pil 4
annars om ((inval [0] < 914) & & (inval [0] > 903)) {kval = 48.} //up arrow 3
annars om ((inval [0] < 902) & & (inval [0] > 887)) {kval = 47;} //up pil 2
annars om ((inval [0] < 886) & & (inval [0] > 865)) {kval = 46;} //up pil 1
annars om ((inval [0] < 864) & & (inval [0] > 836)) {kval = 45;} //mode
annars om ((inval [0] < 834) & & (inval [0] > 793)) {kval = 44;} //enter
annars om ((inval [0] < 792) & & (inval [0] > 724)) {kval = 43;}
annars om ((inval [0] < 723) & & (inval [0] > 594)) {kval = 42.}
annars om ((inval [0] < 593) & & (inval [0] > 260)) {kval = 41;}
annars om (inval [0] < 259) {kval = 40;}
annars om ((inval [1] < 827) & & (inval [1] > 807)) {kval = 14.}
annars om ((inval [1] < 806) & & (inval [1] > 781)) {kval = 8.}
annars om ((inval [1] < 780) & & (inval [1] > 749)) {kval = 20;}
annars om ((inval [1] < 748) & & (inval [1] > 706)) {kval = 25;}
annars om ((inval [1] < 705) & & (inval [1] > 647)) {kval = 19.}
annars om ((inval [1] < 646) & & (inval [1] > 555)) {kval = 17;}
annars om ((inval [1] < 554) & & (inval [1] > 418)) {kval = 4;}
annars om ((inval [1] < 417) & & (inval [1] > 169)) {kval = 22.}
annars om (inval [1] < 168) {kval = 16.}
annars om ((inval [2] < 729) & & (inval [2] > 699)) {kval = 10.}
annars om ((inval [2] < 698) & & (inval [2] > 660)) {kval = 9.}
annars om ((inval [2] < 659) & & (inval [2] > 611)) {kval = 7.}
annars om ((inval [2] < 610) & & (inval [2] > 547)) {kval = 6;}
annars om ((inval [2] < 546) & & (inval [2] > 455)) {kval = 5.}
annars om ((inval [2] < 454) & & (inval [2] > 331)) {kval = 3;}
annars om ((inval [2] < 330) & & (inval [2] > 127)) {kval = 18;}
annars om (inval [2] < 126) {kval = 0;}
annars om ((inval [3] < 827) & & (inval [3] > 807)) {kval = 11.}
annars om ((inval [3] < 806) & & (inval [3] > 781)) {kval = 12.}
annars om ((inval [3] < 780) & & (inval [3] > 749)) {kval = 13.}
annars om ((inval [3] < 748) & & (inval [3] > 706)) {kval = 1;}
annars om ((inval [3] < 705) & & (inval [3] > 647)) {kval = 21.}
annars om ((inval [3] < 646) & & (inval [3] > 555)) {kval = 2;}
annars om ((inval [3] < 554) & & (inval [3] > 418)) {kval = 23.}
annars om ((inval [3] < 417) & & (inval [3] > 169)) {kval = 24.}
annars om (inval [3] < 169) {kval = 15;}
annat {kval = 100;}
IF(kval < 99) {otime = millis();} //Starts nyckel debounce timer
om ((kval > = 0) & & (kval < = 99)) {windex = 1;} //windex visar sant (1) anger återlämnande av en ny nyckel stroke
returnera kval;
}
Funktion för att ändra driftsläge
void modeselect() {
läge ++;
om (läge > = 6) {läge = 0;}
Windex = 0;
}
Standardläget: Enigma är en skrivmaskin
void mode0() {
om ((keyval > = 0) & & (keyval < = 25)) {lampval = keyval;}
lampita();
Marquee();
lampitb();
}
Välj rotorerna & reflektorn
void mode1() {
heltal index;
digitalWrite (led1, hög);
IF(Windex == 1) {om ((keyval == 43) || (keyval == 46)) {återspeglar [0] ++; om (avspegla [0] > 2) {återspeglar [0] = 1;} windex = 0 ;}}
IF(Windex == 1) {if(keyval == 47) {för (index = wheel [2] [0]; (index == wheel[1][0]) || (index == wheel[0][0]) || (index == wheel[2][0]);
index ++) {if(index > 33) {index = 26;}} hjulet [2] [0] = index. Windex = 0 ;}}
IF(Windex == 1) {if(keyval == 48) {för (index = wheel [1] [0]; (index == wheel[2][0]) || (index == wheel[0][0]) || (index == wheel[1][0]);
index ++) {if(index > 33) {index = 26;}} hjulet [1] [0] = index. Windex = 0 ;}}
IF(Windex == 1) {if(keyval == 49) {för (index = wheel [0] [0]; (index == wheel[2][0]) || (index == wheel[1][0]) || (index == wheel[0][0]);
index ++) {if(index > 33) {index = 26;}} hjulet [0] [0] = index. Windex = 0 ;}}
IF(Windex == 1) {if(keyval == 42) {för (index = wheel [2] [0]; (index == wheel[1][0]) || (index == wheel[0][0]) || (index == wheel[2][0]);
index--) {if(index < 28) {index = 35;}} hjulet [2] [0] = index. Windex = 0 ;}}
IF(Windex == 1) {if(keyval == 41) {för (index = wheel [1] [0]; (index == wheel[2][0]) || (index == wheel[0][0]) || (index == wheel[1][0]);
index--) {if(index < 28) {index = 35;}} hjulet [1] [0] = index. Windex = 0 ;}}
IF(Windex == 1) {if(keyval == 40) {för (index = wheel [0] [0]; (index == wheel[2][0]) || (index == wheel[1][0]) || (index == wheel[0][0]);
index--) {if(index < 28) {index = 35;}} hjulet [0] [0] = index. Windex = 0 ;}}
dig2 = wheel [2] [0]; dig3 = wheel [1] [0]; dig4 = wheel [0] [0]; dig1 = återspeglar [0];
nixisend();
dig1 = 37. dig2 = 37. dig3 = 37. dig4 = 37.
digitalWrite (led1, låg);
}
Placera den inre inställningen av varje Rotor
void mode2() {
digitalWrite (led2, hög);
IF(Windex == 1) {
IF(keyval == 47) {hjul [2] [1] ++; om (hjul [2] [1] > 25) {hjul [2] [1] = 0 ;}}
IF(keyval == 48) {hjulet [1] [1] ++; om (hjulet [1] [1] > 25) {hjulet [1] [1] = 0 ;}}
IF(keyval == 49) {hjulet [0] [1] ++; om (hjulet [0] [1] > 25) {hjulet [0] [1] = 0 ;}}
IF(keyval == 42) {hjul [2] [1]--; om (hjul [2] [1] < 0) {hjul [2] [1] = 25 ;}}
IF(keyval == 41) {hjulet [1] [1]--; om (hjulet [1] [1] < 0) {hjulet [1] [1] = 25 ;}}
IF(keyval == 40) {hjulet [0] [1]--; om (hjulet [0] [1] < 0) {hjulet [0] [1] = 25 ;}}
Windex = 0; }
dig2 = wheel [2] [1]. dig3 = wheel [1] [1]. dig4 = wheel [0] [1]. dig1 = 0;
nixisend();
dig1 = 37. dig2 = 37. dig3 = 37. dig4 = 37.
digitalWrite (led2, låg);
}
Placera Start karaktären av varje hjul
void mode3() {
digitalWrite (led3, hög);
IF(Windex == 1) {
IF(keyval == 46) {återspeglar [1] ++; om (avspegla [1] > 25) {återspeglar [1] = 0 ;}}
IF(keyval == 47) {hjul [2] [2] ++; om (hjul [2] [2] > 25) {hjul [2] [2] = 0 ;}}
IF(keyval == 48) {hjulet [1] [2] ++; om (hjulet [1] [2] > 25) {hjulet [1] [2] = 0 ;}}
IF(keyval == 49) {hjulet [0] [2] ++; om (hjulet [0] [2] > 25) {hjulet [0] [2] = 0 ;}}
IF(keyval == 43) {återspeglar [1]--; om (avspegla [1] < 0) {återspeglar [1] = 25 ;}}
IF(keyval == 42) {hjul [2] [2]--; om (hjul [2] [2] < 0) {hjul [2] [2] = 25 ;}}
IF(keyval == 41) {hjulet [1] [2]--; om (hjulet [1] [2] < 0) {hjulet [1] [2] = 25 ;}}
IF(keyval == 40) {hjulet [0] [2]--; om (hjulet [0] [2] < 0) {hjulet [0] [2] = 25 ;}}
Windex = 0; }
dig2 = wheel [2] [2]. dig3 = wheel [1] [2]. dig4 = wheel [0] [2]. dig1 = återspeglar [1];
nixisend();
dig1 = 37. dig2 = 37. dig3 = 37. dig4 = 37.
digitalWrite (led3, låg);
}
Definiera Plugboard paren
void mode4() {
heltal index = 0;
digitalWrite (led4, hög);
om (pluguse < = 9) {
om (plugval [0] [paindex] == 1) {för (index = paindex;(index == paindex) || (index == pbindex) || (plugval [0] [index] == 1); index ++) {if(index > 24) {index = -1 ;}} paindex = index;}
om (plugval [0] [pbindex] == 1) {för (index = pbindex;(index == pbindex) || (index == paindex) || (plugval [0] [index] == 1); index ++) {if(index > 24) {index = -1 ;}} pbindex = index;}
IF(Windex == 1) {
IF(keyval == 46) {för (index = paindex;(index == paindex) || (index == pbindex) || (plugval [0] [index] == 1); index ++) {if(index > 24) {index = -1 ;}} paindex = index. Windex = 0; }
IF(keyval == 43) {för (index = paindex;(index == paindex) || (index == pbindex) || (plugval [0] [index] == 1); index--) {if(index < 1) {index = 26 ;}} paindex = index. Windex = 0; }
IF(keyval == 49) {för (index = pbindex;(index == pbindex) || (index == paindex) || (plugval [0] [index] == 1); index ++) {if(index > 24) {index = -1 ;}} pbindex = index. Windex = 0; }
IF(keyval == 40) {för (index = pbindex;(index == pbindex) || (index == paindex) || (plugval [0] [index] == 1); index--) {if(index < 1) {index = 26 ;}} pbindex = index. Windex = 0; }
IF(keyval == 44) {plugval [0] [paindex] = 1; plugval [1] [paindex] = pbindex; plugval [0] [pbindex] = 1; plugval [1] [pbindex] = paindex; windex = 0; pluguse ++;}
}
dig2 = 19. dig3 = 14. dig4 = pbindex; dig1 = paindex;
nixisend();
dig1 = 37. dig2 = 37. dig3 = 37. dig4 = 37.
}
annat {done();}
digitalWrite (led4, låg);
}
Detta är Normal driftläge att kryptera/dekryptera
void mode5() {
int pv = 0;
digitalWrite (led5, hög);
om ((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 + (hjulet [0] [2] - wheel[0][1]));
IF(PV < 0) {pv = pv + 26.}
procesval = rotorvals [hjulet [0] [0] -27] [pv];
om (procesval > = 100) {procesval = procesval - 100;}
procesval = (procesval - (hjulet [0] [2] - wheel[0][1]));
IF(procesval < 0) {procesval = procesval + 26.} IF(procesval > 25) {procesval = procesval - 26.}
Serial.Print (procesval); Serial.Print("");
PV = (procesval + (hjulet [1] [2] - wheel[1][1]));
IF(PV < 0) {pv = pv + 26.}
procesval = rotorvals [hjulet [1] [0] -27] [pv];
om (procesval > = 100) {procesval = procesval - 100;}
procesval = (procesval - (hjulet [1] [2] - wheel[1][1]));
IF(procesval < 0) {procesval = procesval + 26.} IF(procesval > 25) {procesval = procesval - 26.}
Serial.Print (procesval); Serial.Print("");
PV = (procesval + (hjul [2] [2] - wheel[2][1]));
IF(PV < 0) {pv = pv + 26.}
procesval = rotorvals [rullar [2] [0] -27] [pv];
om (procesval > = 100) {procesval = procesval - 100;}
procesval = (procesval - (hjul [2] [2] - wheel[2][1]));
IF(procesval < 0) {procesval = procesval + 26.} IF(procesval > 25) {procesval = procesval - 26.}
Serial.Print (procesval); Serial.Print("");
PV = (procesval);
procesval = rotorvals [återspeglar [0] + 7] [pv];
om (procesval > = 100) {procesval = procesval - 100;}
IF(procesval < 0) {procesval = procesval + 26.} IF(procesval > 25) {procesval = procesval - 26.}
Serial.Print (procesval); Serial.Print("");
procesval = rotorvals [återspeglar [0] + 9] [procesval];
Serial.Print (procesval); Serial.Print("");
PV = (procesval + 26);
procesval = rotorvali [återspeglar [0] + 7] [pv];
om (procesval > = 100) {procesval = procesval - 100;}
IF(procesval < 0) {procesval = procesval + 26.} IF(procesval > 25) {procesval = procesval - 26.}
Serial.Print (procesval); Serial.Print("");
PV = (procesval + (hjul [2] [2] - wheel[2][1]));
IF(PV < 0) {pv = pv + 26.}
procesval = rotorvali [rullar [2] [0] -27] [pv];
om (procesval > = 100) {procesval = procesval - 100;}
procesval = (procesval - (hjul [2] [2] - wheel[2][1]));
IF(procesval < 0) {procesval = procesval + 26.} IF(procesval > 25) {procesval = procesval - 26.}
Serial.Print (procesval); Serial.Print("");
PV = (procesval + (hjulet [1] [2] - wheel[1][1]));
IF(PV < 0) {pv = pv + 26.}
procesval = rotorvali [hjulet [1] [0] -27] [pv];
om (procesval > = 100) {procesval = procesval - 100;}
procesval = (procesval - (hjulet [1] [2] - wheel[1][1]));
IF(procesval < 0) {procesval = procesval + 26.} IF(procesval > 25) {procesval = procesval - 26.}
Serial.Print (procesval); Serial.Print("");
PV = (procesval + (hjulet [0] [2] - wheel[0][1]));
IF(PV < 0) {pv = pv + 26.}
procesval = rotorvali [hjulet [0] [0] -27] [pv];
om (procesval > = 100) {procesval = procesval - 100;}
procesval = (procesval - (hjulet [0] [2] - wheel[0][1]));
IF(procesval < 0) {procesval = procesval + 26.} IF(procesval > 25) {procesval = procesval - 26.}
Serial.Print (procesval); Serial.Print("");
procesval = plugval [1] [procesval];
lampval = procesval;
Serial.println(lampval);
dig2 = wheel [2] [2]. dig3 = wheel [1] [2]. dig4 = wheel [0] [2]. dig1 = återspeglar [1];
lampita();
nixisend();
lampitb();
dig1 = 37. dig2 = 37. dig3 = 37. dig4 = 37.
digitalWrite (led5, låg);
}
Hjälpare funktion att tända den rätta nyckeln
void lampita() {
digitalWrite(lamparray[lampval][0],0);
digitalWrite(lamparray[lampval][1],0);
}
void lampitb() {
digitalWrite(lamparray[lampval][0],1);
digitalWrite(lamparray[lampval][1],1);
}
Hjälp-funktionen att belysa "Nixies"
void nixisend() {
sixteenSegWrite (0, dig1);
sixteenSegWrite (1, dig2);
sixteenSegWrite 2, dig3.
sixteenSegWrite (3, dig4).
}
void marquee() {
tid = millis();
om (mtime < tid) {
mtime = tid + 400.
mdex ++;}
dig1 = data [mdex];
dig2 = data [mdex + 1];
dig3 = data [mdex + 2];
dig4 = data [mdex + 3];
om (mdex > = 31) {mdex = 0;}
nixisend();
}
Funktion som faktiskt vänder på varje 17 lämpliga segment på varje "Nixie"
void sixteenSegWrite (int tecken, int tecken) {
digitalWrite(anode[digit],0);
för (heltal index = 0; index < 17; index ++) {
digitalWrite (segment [index], segmentvals[character][index]);
}
Delay(7);
för (heltal index = 0; index < = 16; index ++) {
digitalWrite (segment [index], 1);
}
digitalWrite (anoden [siffra], 1);
}
void done() {
dig1 = 3; dig2 = 14. dig3 = 13. dig4 = 4;
nixisend();
dig1 = 37. dig2 = 37. dig3 = 37. dig4 = 37.
}
void indexwheels() {
Serial.Print(rotorvals[Wheel[0][0]-27][Wheel[0][2]]);
Serial.Print(""); Serial.Print(Wheel[0][0]-27); Serial.Print(""); Serial.println(Wheel[0][2]);
om (rotorvals [hjulet [0] [0] -27] [hjulet [0] [2]] > = 100) {windex1 = 1;}
hjulet [0] [2] ++; om (hjulet [0] [2] > 25) {hjulet [0] [2] = 0;}
Windex = 0;
IF(windex1 == 1) {
om (rotorvals [hjulet [1] [0] -27] [hjulet [1] [2]] > = 100) {windex2 = 1;}
hjulet [1] [2] ++; om (hjulet [1] [2] > 25) {hjulet [1] [2] = 0 ;}}
windex1 = 0;
IF(windex2 == 1) {
hjulet [2] [2] ++; om (hjul [2] [2] > 25) {hjul [2] [2] = 0;}
windex2 = 0; }
}
Om det finns tillräckligt intresse, vi tänker skapar en PCB som skulle gör det möjligt för en mycket lättare montering av denna underbara fullt fungerande Enigma replika. Besök http://www.stgeotronics.com att hitta information om tillgänglighet, priser & att placera din beställning eller Förbeställ nu. Kretsscheman publiceras, så PCB har gått in i sin utvecklingsfas. Snart att testas.