Haha to nie żart! :D Ten sejf da się otworzyć jeśli przyłożysz ucho albo stetoskop jak Olsen. Działa tak. Gdy kręcisz pokrętłem sejfu ten cichutko tyka. Dźwięk to prawdziwy dźwięk z zegarka przekonwertowany w postać binarna i zapisany w eepromie procesora. Dźwięk odtwarzany jest za pośrednictwem dwóch pinów procesora i kondensatora. Ja podłączyłem do tego jedną słuchawkę.
Jak w prawdziwym sejfie trzeba najpierw pokręcić w prawo i ustawić Code(1) potem w lewo i ustawić Code(2). Ostatecznie znów w prawo i ustawić Code(3). Jesli jesteś pewien kodu, naciska się przycisk enkodera i drzwi się otwierają. Jeśli gdziekolwiek się pomylisz kosztuje Cię to czas zdefiniowany w programie jako Safetime. Okazuje się jednak że kodu nie musisz znać. Jeśli naciśniesz na 3 sekundy przycisk enkodera to uaktywni sie "Olsen Mode" :D W trybie Olsena można usłyszeć malusieńki dodatkowy "tyk" gdy kod cyfry się zgadza :D Wtedy trzeba już kręcić w druga stronę. Lcd jest tylko do celów szkoleniowych dla włamywaczy :D i gdy u góry w programie wpisze się Lcd_on_board = 0 to nie będzie on w ogóle skompilowany i kod jest dużo mniejszy. Można dopisać sobie procedurę zmiany kodu, której nie potrzebowałem. Kod jest w eepromie.
'------------------------------------------------------------------ ' The real Olsen`s gang Safe from Franc Jager :D ' Sound "tick" is produced when encoder turn. ' In Olsen mode additional "tick" will be heared. 'Special thanks for Evert Dekker ( http://evertdekker.com ) for knowledge sharing. ' Sound pattern is in eeprom and played via two R and C ' BARTek EDC bartek.niveasoft@gmail.com '------------------------------------------------------------------ $regfile = "attiny2313a.dat" $crystal = 12000000 $hwstack = 32 $swstack = 8 $framesize = 16 Const Lcd_on_board = 1 'NOTE THAT LCD IS FOR TRAINING ONLY :D #if Lcd_on_board = 1 Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2 Config Lcd = 16 * 2 Cursor Off Noblink Cls #endif 'Voice pin`s connect together via 10kOhm resistor, then via 100nF to ground. This is audio output. 'headphone or piezo sound good :D 'Sound is realy *.wav "tick" converted to BIN file Config Portd.4 = Output Config Portd.5 = Output Vp1 Alias Portd.4 'Voice pin 1 Vp2 Alias Portd.5 'Voice pin 2 Rygiel Alias Portb.0 'lock Encoder_sw Alias Pind.6 'enkoder switch Encoder_a Alias Pind.2 Portd.3 = 1 Portd.2 = 1 Portd.6 = 1 Portb.0 = 1 ' pomiedzy wyjscia enkodera a mase podłączone kondensatory 22nF Config Int1 = Falling Enable Int1 : On Int1 Encoder_isr '*** Timer0 Config for 10ms Interrupt CTC Mode *** Config Timer0 = Timer , Prescale = 1024 , Compare A = Disconnect , Compare B = Disconnect , Clear Timer = 1 Enable Compare0a : On Compare0a Int_10ms : Compare0a = 116 Config Timer1 = Timer , Prescale = 1 , Compare A = Disconnect , Compare B = Disconnect , Clear Timer = 1 Enable Compare1a : On Compare1a Timer1_int : Compare1a = 272 'Crystal/44100 sample rate Stop Timer1 Dim Bytetodo As Byte , Outbyte As Byte Dim Bitcount As Byte , N As Byte , S As Byte Dim Tick As Byte , Code(4) As Byte , Tick_flag As Byte Dim 1s_flag As Byte , Tryb As Byte , Sounds As Byte Dim Divider As Byte , Divider2 As Byte , Safe As Byte Dim Encoder_turn_left As Byte , Encoder_turn_right As Byte Const Safetime = 8 Const Opentime = 2 Safe = Safetime For N = 1 To 4 Readeeprom Code(n) , N Next N Enable Interrupts 'Turn right to rich Code(1)tick`s then Stop, turn left to Code(2) then Stop, 'next turn right again to Code(3) then Push Encoder Switch. Do '-------------- encoder ------------ If 0 < Encoder_turn_left Then Decr Encoder_turn_left Incr Tick Select Case Tryb Case 1 'First You must turn right so turn left is a mistake Tryb = 0 'so back to start Safe = Safetime 'and wait for another try Case 3 Tryb = 0 Safe = Safetime End Select End If If 0 < Encoder_turn_right Then Decr Encoder_turn_right Incr Tick Select Case Tryb Case 2 'If Code(1) is riched then automatically Tryb 2 is set Tryb = 0 'in Tryb 2 turn right is a mistake Safe = Safetime Case 4 Tryb = 0 Safe = Safetime End Select End If '----------------------------------- Select Case Tryb Case 1 If Tick = Code(tryb) Then Tryb = 2 If Sounds = 1 Then Gosub Play_sound Tick = 0 End If If Encoder_sw = 0 Then Sounds = 1 Case 2 If Tick = Code(tryb) Then Tryb = 3 If Sounds = 1 Then Gosub Play_sound Tick = 0 End If Case 3 If Tick = Code(tryb) Then Tryb = 4 If Sounds = 1 Then Gosub Play_sound Tick = 0 End If Case 4 If Encoder_sw = 0 Then #if Lcd_on_board = 1 Locate 2 , 1 : Lcd "Open" #endif Reset Rygiel Safe = Opentime Tryb = 1 Sounds = 0 End If End Select '------------------ 1s ------------- If 1s_flag = 1 Then 1s_flag = 0 If Safe > 0 Then Decr Safe If Safe = 0 Then If Tryb = 0 Then Tryb = 1 Tick = 0 Sounds = 0 Else #if Lcd_on_board = 1 Locate 2 , 1 : Lcd "Safe" #endif Set Rygiel End If End If If Encoder_sw = 0 Then Incr S Else S = 0 'If pressed 3 sec If S = 3 Then Sounds = 1 '*********** OLSEN MODE ************* End If '----------------------------------- If Tick_flag = 1 Then Tick_flag = 0 Gosub Play_sound End If Loop End '----------------------------------- Encoder_isr: Tick_flag = 1 If Encoder_a = 0 Then Incr Encoder_turn_right Else Incr Encoder_turn_left End If Return '----------------------------------- Play_sound: N = 11 Bytetodo = 112 Start Timer1 Do If Bitcount = 7 Then Readeeprom Outbyte , N Incr N Decr Bytetodo Bitcount = 0 End If Loop Until Bytetodo = 0 Stop Timer1 Vp2 = 0 : Vp1 = 0 Return '----------------------------------------------- Timer1_int: Vp2 = Vp1 If Bitcount > 0 Then Shift Outbyte , Right , 1 Vp1 = Outbyte.0 Incr Bitcount Return '----------------------------------------------- Int_10ms: Incr Divider If Divider = 100 Then Divider = 0 1s_flag = 1 End If #if Lcd_on_board = 1 Incr Divider2 If Divider2 = 10 Then Locate 1 , 1 : Lcd Tick ; " " ; Tryb ; " " ; Safe Divider2 = 0 End If #endif Return '******************* EEPROM CONTENT ***** CODE IS 8-5-6 *********************************** '00000000 00 08 05 06 00 00 00 00 00 00 00 00 6E 55 55 75 02 7F 0E 1E ............nUUu... '00000014 3E 78 7C F0 C0 E8 87 0F FC 38 E0 F7 81 07 0F 1F 1C 86 8F 07 >x|...ç..8..ü....aA. '00000028 0F 0E FF 02 1F 1F 0A 7C 7E 38 38 F0 7A 54 F4 70 F0 E9 E0 C3 .......|~88.zT.p.... '0000003C 83 E3 CB 92 52 5B A9 55 F4 42 F5 92 AA 55 93 56 4B AA B5 AA â..AR[.U.B.A¬UôVK¬.¬ '00000050 AA 52 55 55 B2 B5 54 55 4D 95 D5 4A AA 4D AD AA 54 55 55 55 ¬RUU..TUMo.J¬M!¬TUUU '00000064 55 55 55 B5 52 55 55 55 55 55 A5 A5 A5 55 55 55 55 55 55 55 UUU.RUUUUUNNNUUUUUUU '00000078 55 55 AA UU¬ '****************************************************************************************** $eeprom Data &H00 , &H08 , &H05 , &H06 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 Data &H00 , &H00 , &H6E , &H55 , &H55 , &H75 , &H02 , &H7F , &H0E , &H1E Data &H3E , &H78 , &H7C , &HF0 , &HC0 , &HE8 , &H87 , &H0F , &HFC , &H38 Data &HE0 , &HF7 , &H81 , &H07 , &H0F , &H1F , &H1C , &H86 , &H8F , &H07 Data &H0F , &H0E , &HFF , &H02 , &H1F , &H1F , &H0A , &H7C , &H7E , &H38 Data &H38 , &HF0 , &H7A , &H54 , &HF4 , &H70 , &HF0 , &HE9 , &HE0 , &HC3 Data &H83 , &HE3 , &HCB , &H92 , &H52 , &H5B , &HA9 , &H55 , &HF4 , &H42 Data &HF5 , &H92 , &HAA , &H55 , &H93 , &H56 , &H4B , &HAA , &HB5 , &HAA Data &HAA , &H52 , &H55 , &H55 , &HB2 , &HB5 , &H54 , &H55 , &H4D , &H95 Data &HD5 , &H4A , &HAA , &H4D , &HAD , &HAA , &H54 , &H55 , &H55 , &H55 Data &H55 , &H55 , &H55 , &HB5 , &H52 , &H55 , &H55 , &H55 , &H55 , &H55 Data &HA5 , &HA5 , &HA5 , &H55 , &H55 , &H55 , &H55 , &H55 , &H55 , &H55 Data &H55 , &H55 , &HAA $data
Taka umiejętnością otwierania sejfów można błysnąć przed towarzystwem :D .. Co do odtwarzania dzwięku..okazuje się, że jeśli w swoim projekcie masz nieużywana prawie pamięć Eeprom to możesz pokusić się o dodanie dźwięku do niego. Zastąpić jakiś piszczek ladnym jinglem. Plik w formacie wav konwertuje ten program do bin.
Pamięci jest trochę potrzebne ale jeśli masz wolna to dlaczego nie? Pierwotnie to czytało z zewnętrznych pamięci I2c, przerobiłem sobie do tego pomysłu i w większych prockach nie takie rzeczy można będzie grać :D W dobie pamięci flash to żadne odkrycie ale może niepotrzebna właśnie komuś ich obsługa, ale ma miejsce w eepromie..