• Email
  • Forum

Sejf jak z filmów o gangu Olsena :D

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ę.

[Rozmiar: 5761 bajtów]

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 ( https://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.

[Rozmiar: 68016 bajtów]

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..

Email

Jeśli mogę w czymś pomóc, napisz.