Elektroda.pl
Elektroda.pl
X
Relpol przekaźniki
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Atmega8] [BASCOM] Moduł GSM ze sterowaniem SMS

xury 24 Mar 2010 00:32 53942 94
  • #31
    adambehnke
    Poziom 24  
    No właśnie z tym włączaniem nie jest łatwo. Ja z uwagi na to że telefon odda swoje życie mojemu projektowi to uruchamiam go przy pomocy miniaturowego przekaźnika (podłączonego pod pady klawisza czerwonej słuchawki) tj. sprawdzam czy telefon odpowiada - jeśli nie to zwieram przekaźnik na 2s a potem sprawdzam czy telefon prosi już o PIN. Jeśli tak to procesor mu go podaje i to wszystko. Nie mogę używać komend do uruchamiania telefonu ponieważ jeśli telefon jest wyłączony to nie odpowiada na żadne komendy AT. A szkoda bo było by bez problemu.

    Dodano po 3 [minuty]:

    xury napisał:
    Musisz przystosować do poziomu ttl 3,3 V.
    U mnie pomógł rezystor 300Ohm i dioda zenera.


    A co jeśli zastosuję MAX232 pomiędzy prockiem a telefonem? Czy jest to potrzebne? Czy mogę go całkowicie pominąć?

    Ponadto męczę się okrutnie nad zrozumieniem ramek PDU. Nie bardzo wiem na razie jak to "ugryźć".
  • Relpol przekaźniki
  • #32
    revolt
    Poziom 34  
    Nie lepiej tranzystor do włączania?
  • Relpol przekaźniki
  • #34
    xury
    Specjalista automatyka domowa
    adambehnke napisał:


    A co jeśli zastosuję MAX232 pomiędzy prockiem a telefonem? Czy jest to potrzebne? Czy mogę go całkowicie pominąć?

    Ponadto męczę się okrutnie nad zrozumieniem ramek PDU. Nie bardzo wiem na razie jak to "ugryźć".


    Max232 pomiędzy telefonem a uC ?? Nieeee.
    Max232 sluży do przystosowania do portu com w komputerze czyli z -15 +15 do 0-5V.
    A pomiedzy telefonem i uC jest "tylko" 1,7V roznicy. Niestety ta różnica wpływa na końcówkę mocy w telefonie. Przystosować należy tylko RX telefonu, Tx działa dobrze.
    Co do PDU, to najlepiej potestować z pomocą programu PDUspy.
  • #35
    adambehnke
    Poziom 24  
    xury napisał:


    Max232 pomiędzy telefonem a uC ?? Nieeee.


    Nie zrozumieliśmy się . A właściwie namieszałem. Mam atmegę 128 z dwoma sprzętowymi uartami. I na jednym z nich pracuje MAX485 a na drugim telefon. Max232 chciałem zastosować aby podglądać na PC dane jakie wysyła telefon do procka.

    Dodano po 7 [minuty]:

    xury napisał:

    Co do PDU, to najlepiej potestować z pomocą programu PDUspy.


    Właśnie na nim się bawiłem ale jak dla mnie to jest on mocno pokręcony. Chyba że istnieje jakaś spolszczona wersja.
  • #36
    adambehnke
    Poziom 24  
    Mam wielką prośbę do kolegi Xury lub kogoś kto zna się na tym.

    Otóż w nocie jaką zamieszczam w załączniku , na stronie 28 jest podane jak ustawić polecenie:

    Code:
    AT+CNMI=?


    aby sms-y przychodziły bezpośrednio do procesora. Niestety nie mam do końca pojęcia jak powinna wyglądać konfiguracja tej komendy gdyż nie rozumiem niektórych podpunktów. Prośba o pomoc .

    A takie są możliwe ustawienia : +CNMI: (0,1) , (0,1) , (2) , (0,2) , (1)



    Dodano:

    Ok, doszedłem w końcu do takiej postaci:

    Code:
    Print #2 ,"ATZ" ; Chr(13)
    
    Waitms 500
    Print #2 , "ATX0" ; Chr(13)
    Waitms 500
    Print #2 ,"ATE0" ; Chr(13)
    Waitms 500
    Print #2 ,"AT+CLIP=1" ; Chr(13)
    Waitms 500
    Print #2 , "AT+CPMS=" ; Chr(34) ; "SM" ; Chr(34) ; Chr(13)
    Waitms 500
    Print #2 , "AT+CNMI=1,1,0,2" ; Chr(13)


    i kiedy dzwonię na ten telefon to wyświetla mi poprawnie :
    Code:
    +CLIP: "517xxxxx6",129,,,,0 
    Czyli osiągnąłem to co chciałem jesli chodzi o dzwonienie.

    A kiedy wyślę sms-a na ten numer to wyświetla mi :
    Code:
    +CMTI: "SM",4
    czyli informuje że przyszedł sms i jest w ej chwili na karcie SIM pod pozycją 4.
    Ale jak ja go mam odebrać/pobrać ?
  • #37
    revolt
    Poziom 34  
    Używam innego modułu, ale u mnie AT+CMGR=4
  • #38
    _PHIL_
    Poziom 11  
    Jeżeli byłaby taka możliwość prosiłbym o wrzucenie pliku ze schematem w Eaglu, ponieważ mi nie najlepiej idzie rysowanie a chciałbym spróbować przerobić ten schemat na płytkę.
  • #39
    xury
    Specjalista automatyka domowa
    adambehnke na twoje pytanie jest odpowiedż w sms.bas Ja się wzorowałem właśnie na tym kodzie. Generalnie chodzi o to by teraz odebrać tego SMS z pozycji 4. Piszę z pamięci, bo nie mam teraz pod ręką Bascoma i mojego komputera.
    _PHIL_ niestety nie mam kiedy zabrać się za płytkę. W Eagle też eaglem nie jestem.
  • #40
    adambehnke
    Poziom 24  
    Ok. Wszystko na chwilę obecną działa prawidłowo. I im więcej przy tym "dłubię" tym bardziej mi się to podoba.Szkoda że nie mam możliwości włączania telefonu poprzez komendy AT , ale trudno.
    Nie mogę dojść tylko do tego jak pobrać "do końca" nazwę operatora.
    Używam ,oczywiście ze względów ekonomicznych karty PLAY-a , i mogę pobrać samą nazwę operatora czyli "PLUS GSM" ale nie mogę pobrać (nie wiem jakim poleceniem) loga sieci czyli "PLAY" . W sumie nie jest to tak bardzo ważne ale jakoś mnie to gryzie.
    Zastanawiam się także jak sprawdzać saldo karty. Kiedyś wiem że wysyłało się sms-a z zapytaniem o saldo i sieć odsyłała w wiadomości sms stan konta. Można by w taki sposób zrobić automatyczne sprawdzanie salda.
    Nie pamiętam tylko treści i numeru pod który wysyłało się zapytanie o saldo(szukałem w necie ale znajduję tylko do ORANGE).


    Dodano:

    A więc jest sposób aby sprawdzić stan pozostałej kwoty. Wystarczy zadzwonić pod numer: *101#
    Na ekranie pojawi się info o pozostałej kwocie do wykorzystania. Ale pojęcia nie mam jak mógłbym pobrać taką wiadomość i przesłać do atmegi.
    Monitoruję połączenie pomiędzy telefonem a atmegą poprzez terminal. I w momencie nadejścia tej wiadomości nic się nie dzieje. Są ta te dziwne wiadomości sieciowe wyskakujące bezpośrednio na ekranie telefonu. I podejrzewam że nie da się tego odczytać przy pomocy mikrokontrolera. Zastanawiałem się także w jaki sposób wysyła się takie wiadomości.Ale nigdzie nie mogę znaleźć informacji na ten temat.
  • #41
    jousto
    Poziom 16  
    A może zaliczyc taką wiadomość (o stanie konta) do kategorii informacji sieciowych.
    Wtedy należy odpowiednio skonfigurowac powiadomienia o otrzymaniu takiej wiadomości (AT+CNMI), ale wiadomo także , że większość telefonów nie posiada możliwości bezpośredniego przekazania wiadomości do termianala tylko powiadamia o jej nadejściu. Nie wiem jakiego telefonu używaszi jakie sa możliwosci przy uzyciu komendy CNMI.
  • #44
    ludzik
    Poziom 11  
    Witam!
    Chciałbym wykonać to urządzenie jednak słabo stoję z programowaniem i elektroniką.
    Konkretnie na podstawie schematu płytkę sobie wykonam, zaprogramuje też procesor gotowym kodem, nie umiem jednak nanieść sobie Tych wszystkich poprawek które tutaj koledzy wnieśli.
    Czy mógłbym prosić gotowy schemat z poprawkami oraz kod źródłowy?
    Może to wygląda na lenistwo ale naprawdę nie mogę tego ogarnąć.
    Pozdrawiam!
  • #45
    adambehnke
    Poziom 24  
    Zatem może czas ogarnąć naukę programowania.Nic nikomu samo nie przychodzi. Poświęcamy na to ogromne ilości czasu i całkiem pokaźną ilość nieprzespanych nocy. To jest forum i tutaj się pomaga rozwiązywać problemy a nie robi wszystko za Ciebie.
    Chociaż za odpowiednie gratyfikacje możesz zapewne u niektórych nabyć gotowe urządzenie.
  • #46
    ludzik
    Poziom 11  
    W takim razie jak znajdę czas postaram się to skompletować umieścić tu gotowe i poproszę Was o opinie czy dobrze to zrobiłem, jeśli oczywiście nikt nie ma nic przeciwko, pozdrawiam!
  • #48
    Semtex4
    Poziom 11  
    Zmontowałem układ do telefonu T300. Wymieniłem Dz na 5,6V, bo nie działał. A znajomy podpowiedział mi, że to pomoże. Nadal nie działa. Układ jest martwy, w ogóle nie działa. Może ktoś ma pomysł dlaczego.
  • #49
    xury
    Specjalista automatyka domowa
    Dioda z rezystorem ma za zadanie ograniczyć napięcie z 5 V do 3,3V i tak ma być. Jedynie rezystor musi być podłączony z drugiej strony niż na moim schemacie.
    Jeśli nasz układ ma być taktowany z zewnętrznego rezonatora to oczywiste jest, że trzeba ustawić odpowiednie fusebity dla zewnętrznego taktowania rezonatorem kwarcowym.
    Jak znajdę czas to dodam sprawdzanie salda i ważności konta w Play
    Tak jak wcześniej pisałem kod USSD do sprawdzenia to:
    Code:
    AT+CUSD=1,"*101#"

    a odpowiedź jaką otrzymamy to:
    Code:
    +CUSD: 0,"Pozostalo Ci 30,88zl do wykorzystania do 2010-09-11 23:59:59. Dodatkowo w ramach srodkow promocyjnych masz 0,00zl do wykorzystania do No Expiration Date."
    

    OK

    Teraz zostało tylko proste sparsowanie danych
  • #50
    Semtex4
    Poziom 11  
    Jak by ktoś mógł to proszę o wrzucenie opisu sygnałów jakie powinienem otrzymać na wyjściu z uC. Wtedy powinienem dać sobie rade z uruchomieniem. Z góry dzięki!
  • #51
    lnitz
    Poziom 9  
    Witam i pozdrawiam wszystkich.
    Próbowałem uruchomić moduł tak jak opisał to właściciel tego tematu w pierwszym poście.
    Zbudowałem bardzo zbliżoną do tej pokazanej na schemacie nawet wykorzystałem ten sam telefon se T300 próbowałem również z w200 i w300 bo akurat takie posiadam.Jednak nic nie pomogło.
    Przede wszystkim nawet nie działa dzwonienie:
    Print "ATD692496488;" ; Chr(13) ;
    Waitms 200
    Print "ATH" ; Chr(13) ;

    End
    Nie bardzo sie znam na samym programowaniu więc prosiłbym o podpowiedź.
    Poniżej schemat płytki:
    [Atmega8] [BASCOM] Moduł GSM ze sterowaniem SMS

    W załączniku moja przeróbka programu.
    Za wszelkie sugestie będę wdzięczny.
  • #52
    adambehnke
    Poziom 24  
    lnitz napisał:

    Przede wszystkim nawet nie działa dzwonienie:
    Print "ATD692496488;" ; Chr(13) ;
    Waitms 200
    Print "ATH" ; Chr(13) ;

    End


    Po pierwsze telefon nawet nie zdąży zadzwonić pod wskazany numer a już następuje rozłączanie. Zwiększ czas:
    Code:
    Waitms 200
    do co najmniej
    Code:
    Wait 5
  • #53
    lnitz
    Poziom 9  
    Próbowałem nawet 20sekund.
    Problem w tym, że telefon prawdopodobnie nie chce współpracować i nie wiem jak go do tego zmusić.
  • #56
    lnitz
    Poziom 9  
    Jest według Twojego zalecenia Rx do Tx tel i Tx do Rx tel.
    Niestety nadal nic.
    Mam jeszcze pytanie w jakim zakresie powinno zawierać się napięcie na Tx procka?
    Powinno wynosić idealnie 3,3V czy 2,7 wystarczy bo z pominięciem rezystora mam 3,05V.
  • #57
    bikerps
    Poziom 2  
    Witam, zlozylem sobie ten uklad, edytowalem program tak aby wpisac swoje numery tel. i nie moge uruchomic tego ukladu, narazie bazuje na pierwszej wersji programu od Xury'iego i jego schemacie, moze ktos mi powiedziec czy ten program powinien wystartowac?

    Code:
    Rem Projekt powiadomienia o alarmie by Xury
    
    '$sim                                                        'dla symulacji
    $regfile = "m8def.dat"
    $crystal = 8000000                                          'zewnetrzny kwarc 8Mhz - małe błędy przy 9600 baudów
    $baud = 9600
    $hwstack = 64
    $swstack = 32
    $framesize = 86

    '----------------------------EEPROM---------------------------------------------
    'dane SMS do wysłania zapisane jako data w eeprom
    'UWAGA dane PDU należy stworzyć wlasne, te poniższe zamieszczam tylko dla przykładu
    'ważne jest też obliczenie wartości zmiennej info i jest wstawienie póżniej
    'info = ilość znaków w PDU - 16 podzielone na 2
    $eeprom
    Data 0                                                      ' zerowy bajt może zostać wyzerowany - nie zapisujemy nic tutaj
    Pdu_uzbr:
    Data "07918497908952F001000B918487447298F100000955AD50FA543E9D59"       'PLAY NA MÓJ info=21
    Pdu_rozbr:
    Data "07918497908952F001000B918487447298F100000AD2A756287D2A9FCE2C"       ' info=22
    Pdu_alarm_kmicica:
    Data "07918497908952F001000B918487447298F100000D416650DA042D9BC961721804"       'info=25
    Pdu_alarm_kmicica_beti:
    Data "07918497908952F001000B918487444687F900000D416650DA042D9BC961721804"       'PDU na drugi numer - opcja
    'w przkładzie wszystkie numery na ktore wysylane są SMSy są jednakowe
    'w poprzyższym można dać inny
    Pdu_wylaczony:
    Data "07918497908952F001000B918487447298F100000955AD50FA543E9D59"       'info=21
    Pdu_zalaczony:
    Data "07918497908952F001000B918487447298F100000955AD50FA543E9D59"       'info=21
    'powyższe PDU należy dostosować pod siebie.
    '-------------------------------------------------------------------------------
    $data

    Config Serialin = Buffered , Size = 20
    'Config Serialout = Buffered , Size = 20
    'Config Pind.2 = Input                                       'czujnik uzbrojenia/rozbrojenia
    Config Pind.3 = Output                                      'KONFIGURACJA WEJSC I WYJSC
    Config Pind.4 = Input                                       'wejście alarmu
    Config Pind.5 = Output                                      'Led
    Config Pinc.0 = Input                                       'sms do Beaty
    Config Pinc.3 = Output
    'potrzebna będzie jeszcze konfiguracja wyjść sterowanych SMSami

    Config Pind.6 = Output                                      'rozbrojony
    Config Pind.7 = Output                                      'uzbrojony
    Config Pinb.0 = Output                                      'załączenie urządzenia
    Config Pinb.1 = Output                                      'wyłączenie urządzenia

    'Set Portd.2                                                 'wejście rozbrojenia uzbrojenia
    Set Portd.3                                                 'wskaźnik komunikacji z telefonem
    Set Portd.4                                                 'wejscie uzbrajajace
    Set Portd.5                                                 'wskaźnik dzwonienia i wysyłania SMS
    Set Portc.0                                                 'zwora określająca sms do Beaty
    Reset Portc.3                                               'Uaktywnienie ładowarki

    'wyjścia sterujące przez SMS

    Set Portd.6
    Set Portd.7
    Set Portb.0
    Set Portb.1
                                                     'wskaźnik transmisji
    Config Timer1 = Timer , Prescale = 256

    On Timer1 Odmierz_1s                                        'nie zapomnieć ustawić wyjść SMS na stan wysoki

    Enable Interrupts                                           'musi być jeśli używamy bufor
    Enable Timer1

    'Declare Sub Alarm
    'Declare Sub Zalaczenie
    Declare Sub Czysc_bufor()
    Declare Sub Pobierz_linie(t As String )
    Declare Sub Czytaj_sms(t As String)
    Declare Sub Wyslij_sms(d As String , L As Byte)


    Dim Sekunda As Byte
    Dim Minuta As Byte
    Dim Godzina As Byte
    Dim Flag As Bit
    Dim Ladowarka As Bit
    Dim Laduj As Bit
    Dim Wywolany As Bit
    Dim Aktywny As Bit
    Dim Todczyt As String * 70
    Dim Ttemp As String * 8
    Dim Twysyl As String * 70
    Dim Znak As Byte
    Dim Info As Byte
    Dim Bateria As Byte
    Dim Dlugosc As String * 1
    Dim Szuk As Byte
    Dim Rozkaz As String * 10
    Dim Ilosc As Byte


    Counter1 = 34286                                            'załadowanie licznika początowego do timera

    '---------------------Inicjalizacja---------------------------------------------
    Inicjalizacja:

    Wait 1
    Print "AT" ; Chr(13) ;
    Waitms 100                                                  'inicjalizacja modemu
    Print "AT" ; Chr(13) ;
    Waitms 100
    Print "ATE0" ; Chr(13) ;                                    'wyłaczenie echa
    Waitms 100

    Print "ATE0" ; Chr(13) ;
    'Print "ATS4=0"                                              'wyłaczenie <LF>
    Flag = 1
    'Gosub Zalaczenie

    Waitms 200

    'Todczyt = ""
    '-----------------Ustawienia telefonu ------------------------------------------
    'Waitms 50
    Czysc_bufor

    'Todczyt = "+CCLK: {034}09/08/29,06:21:32+04{034}"
    Do
     Print "AT+CNMI=3,3,0,0,0" ; Chr(13) ;                      'wysyłanie PDU bezpośrednio do TE - tylko niektóre telefony
     Flag = 1
     Pobierz_linie Todczyt
     If Todczyt = "OK" Then
        Reset Portd.3
        Exit Do
        Waitms 100
        Exit Do
     End If
    Loop
    Czysc_bufor
    Print "AT+CCLK?" ; Chr(13) ;                                'zapytanie o datę i czas
    Flag = 1
    Pobierz_linie Todczyt
    'Todczyt = "+CCLK: {034}09/08/29,06:21:32+04{034}"           ' DO TESTOW - usunąc
    'Ttemp = Mid(todczyt , 9 , 8)                                'ustawienie daty
    Ttemp = Mid(todczyt , 18 , 2)                               'ustawienie czas
    Godzina = Val(ttemp)
    Ttemp = Mid(todczyt , 21 , 2)
    Minuta = Val(ttemp)
    Ttemp = Mid(todczyt , 24 , 2)
    Sekunda = Val(ttemp)
    Ttemp = ""

    Flag = 0
    Todczyt = ""
    Czysc_bufor

    '---------------------Podprogram  główny selekcyjny-----------------------------

    Do

     Pobierz_linie Todczyt                                      'nasłuchuje sms i sprawdza czy jest alarm
     Info = Instr(todczyt , ":")                                ' szukamy dwukropka :
       If Info > 0 Then                                         'znaleziony
          Ttemp = Left(todczyt , Info)
          Select Case Ttemp                                     'jeśli jest to  np. CMT: 24
             Case "+CMT:" : Czytaj_sms Todczyt                  ' to SMS został odczytany na TE
             'Case "+CBC:" : Gosub Zasilanie
             'Case Else : Czysc_bufor
             'jeszcze inne przypadki, np stan baterii itp.
          End Select
       End If

    Loop

    End
    '--------------------Podprogram obsługi przerwanie timera 1---------------------
    Odmierz_1s:
    Counter1 = Counter1 + 34286

    Incr Sekunda


    If Sekunda = 60 Then
          Sekunda = 0
          Incr Minuta

    End If

    If Minuta = 60 Then
          Minuta = 0
          Incr Godzina

    End If

    If Godzina = 24 Then
       Godzina = 0
    End If
    'TUTAJ MOŻNA EWENTUALNIE WSTAWIĆ SPRAWDZANIE ALARMU LUB COŚ INNEGO CO 1 SEKUNDĘ
    Return

    '---------------------------Alarm-----------------------------------------------
    Alarm:

    Waitms 400
    '  If Pind.2 = 0
       If Pind.4 = 0 Then                                       'sprawdzenie stanu alarmu

        Print "ATD784464789;" ; Chr(13) ;                       'dzwonienie pod mój numer
        Reset Portd.5                                           'sygnalizacja komunikacji
        Wait 20                                                 'czekaj 20 sekund
        Print "ATH" ; Chr(13) ;
            'Czysc_bufor
        Print "AT" ; Chr(13) ;
        Czysc_bufor
        Waitms 100
        Readeeprom Twysyl , Pdu_alarm_kmicica
        Info = 25
        Flag = 1
        Wyslij_sms Twysyl , Info                                'do mnie
       End If
    '  End If
     If Wywolany = 1 Then
       If Pinc.0 = 0 Then
          Wait 7
          Info = 25
          Flag = 1
          Readeeprom Twysyl , Pdu_alarm_kmicica_beti            'do żony - opcja
          Wyslij_sms Twysyl , Info
         'Print "do beaty"
       End If
     End If

     Info = 0
     Set Portd.5                                                'koniec sygnalizacji
     Wywolany = 0
     Czysc_bufor
     Return

    '--------------------------Czyszczenie buforu odczytu---------------------------
     Sub Czysc_bufor()
      Waitms 100

     Do
      Znak = Inkey()

     Loop Until Znak = 0
     End Sub

     '------------------------Pobieranie  z UART -----------------------------------
     Sub Pobierz_linie(t As String)
      T = ""
      Do
        If Flag = 0 Then
         'If Pind.2 = 0 Then                                     'sprawdzenie czy system uzbrojony
          If Pind.4 = 0 Then                                    'sprwadzenie czy alarm wywolany
             Wywolany = 1
             Gosub Alarm
          End If
         'End If
        End If
        If Minuta <> 59 Then
           Laduj = 0
        End If
        'If Sekunda <> 59 Then
         '  Aktywny = 0
        'End If

        If Minuta = 59 Then                                     'obsługa ładowania
          If Laduj = 0 Then
             Gosub Zasilanie
          End If
        End If
        'If Sekunda = 59 Then
         '  If Aktywny = 0 Then
          '     Gosub Zalaczenie
        'End If
        'End If
        'tutaj ewentualnie coś mozna wstawić
        Znak = Inkey()
        Select Case Znak
           Case 0                                               'nie ma nic
           Case 13                                              'pomijanie entera
           Case 10 : If T <> "" Then Exit Do                    'jesli mamy coś od nowej linii (case 10)
           Case Else
             T = T + Chr(znak)                                  'budujemy linie
        End Select

      Loop

    End Sub

    '--------------------------Odczyt SMS------------------------------------------
    Sub Czytaj_sms(t As String)

    Pobierz_linie Todczyt                                       'pobieranie info PDU

    Szuk = Instr(todczyt , "87447298F1")                        'SZUKAMY NUMER TELEFONU w poprzestawianym numerze

    'nalezy się zapoznać jak jest zapisywany numer telefonu w trybie PDU, by uniknąc pomylek
    ' w tym wypadku dałem przypadkowy 604532784 F to wypełnienie (telefony mają 9 cyfr)
    If Szuk > 0 Then
      'Print "Znaleziono numer"                                  'teraz trzeba znaleźć treść
      Dlugosc = Mid(todczyt , 54 , 1)
      Ilosc = Val(dlugosc) * 2                                  'mnoży długość
      Rozkaz = Right(todczyt , Ilosc)
      Todczyt = ""

      Select Case Rozkaz

        Case "D2A7562805"                                       'rozbrojenie ROZBR
          'Print "rozbrajam alarm"
          'podanie na wejście centrali alarmowej 0V, czyli zwarcia do masy na około 0.5 sekundy
          'potrzebne będą cztery wejścia w centrali reagujące na zwarcie do masy
          'oraz cztery wyjścia  na atmedze podciągnięte tym sterujące
          'można ustwić bity i sprawdzać nimi stan alarmu i urządzeń
          If Pind.2 = 0 Then
             Reset Portd.6                                      'sterowanie stanem niskim
             Waitms 500
             Set Portd.6
             Print "ATH" ; Chr(13) ;
             Waitms 100
             Print " AT+CKPD=" ; Chr(34) ; "E" ; Chr(34) ; ",3,0" ; Chr(13) ;       'kasowanie info o sms z wyświetlacza
             Readeeprom Twysyl , Pdu_rozbr
             Info = 22                                          'bardzo ważne długość PDU, jeśli będzie ustawiona niepoprawna sms nie zostanie wysłany
             Print "ATH" ; Chr(13) ;
             Czysc_bufor
             Reset Portd.5
             Wait 5
             Wyslij_sms Twysyl , Info
             Info = 0                                           'czyszczenie zmiennnej
             Set Portd.5
          End If
        Case "55AD500A"
          'Print "Uzbrajam alarm"                                ' uzbrojenie UZBR
          If Pind.2 = 1 Then
             Reset Portd.7
             Waitms 500
             Set Portd.7
             Print "ATH" ; Chr(13) ;
             Waitms 100
             Print " AT+CKPD=" ; Chr(34) ; "E" ; Chr(34) ; ",3,0" ; Chr(13) ;
             Readeeprom Twysyl , Pdu_uzbr
             Info = 21
             Print "ATH" ; Chr(13) ;
             Czysc_bufor
             Reset Portd.5
             Wait 5
             Wyslij_sms Twysyl , Info
             Info = 0                                           'czyszczenie zmiennnej
             Set Portd.5
          End If
        Case "DA2013"                                           'załączenie czegoś np. syrenki   ZAL
          'Print "Zalaczam urządzenie"
          Reset Portb.0
          Waitms 500
          Set Portb.0                                           ' ustawić na stałe i dać przekaźnik
          Print "ATH" ; Chr(13) ;
          Waitms 100
          Print " AT+CKPD=" ; Chr(34) ; "E" ; Chr(34) ; ",3,0" ; Chr(13) ;
          Readeeprom Twysyl , Pdu_zalaczony
          Info = 21
          Print "ATH" ; Chr(13) ;
          Czysc_bufor
          Reset Portd.5
          Wait 5
          Wyslij_sms Twysyl , Info
          Info = 0                                              'czyszczenie zmiennnej
          Set Portd.5

        Case "D72C13"                                           'wyłaczenie urządzenia
          'Print "wyłączam urządzenie"
          Reset Portb.1
          Waitms 500
          Set Portb.1                                           'ustawić na stałe i dać przekaźnik
          Print "ATH" ; Chr(13) ;
          Waitms 100
          Print " AT+CKPD=" ; Chr(34) ; "E" ; Chr(34) ; ",3,0" ; Chr(13) ;
          Readeeprom Twysyl , Pdu_wylaczony
          Info = 21
          Print "ATH" ; Chr(13) ;
          Czysc_bufor
          Reset Portd.5
          Wait 5
          Wyslij_sms Twysyl , Info
          Info = 0                                              'czyszczenie zmiennnej
          Set Portd.5
    'tutaj dodać procedurę sprawdzania stanu alarmu
        Case Else
          'Print "pomyłka"                                       'SMS z mojego, ale treść niezgodna

      End Select


    End If
    Info = 0
    Ttemp = ""
    Czysc_bufor
    End Sub
    '----------------------------Wysyłanie SMS--------------------------------------
    Sub Wyslij_sms(d As String , L As Byte)
    'TO DO
    'dopisać do tej procedury jakaś lepszą obsługę błędów wysyłania
     Do
      Waitms 100
      Print "AT+CMGS=" ; L ; Chr(13) ;
      Waitms 200
      Print D ; Chr(26) ;

      Pobierz_linie Todczyt
      Ilosc = Instr(todczyt , "ERROR")
      If Todczyt = "OK" Then
          Todczyt = ""
          Flag = 0
          Exit Do
      Elseif Ilosc > 0 Then
         Ilosc = 0
         For Ilosc = 1 To 5
          Reset Portd.5
          Waitms 200
          Set Portd.5
          Next

      End If

      Pobierz_linie Todczyt
      If Todczyt = "OK" Then
         Todczyt = ""
         Flag = 0
      End If

     Loop Until Todczyt = "OK"
    End Sub

    '-------------------------Obsługa ładowania baterii-----------------------------
    Zasilanie:
    Laduj = 1
    Print "AT+CBC?"                                             'odczyt stanu baterii
    Pobierz_linie Todczyt
    Ttemp = Mid(todczyt , 7 , 1)

    If Ttemp = "1" Then
       Ladowarka = 1
     Else
      Ladowarka = 0
    End If
     Bateria = Len(todczyt)                                     'sprawdzamy ile znaków nam tel odesłał
     Select Case Bateria
       Case 11                                                  ' jeśli 11 to znaczy że naładowana w 100%
         Ttemp = Mid(todczyt , 9 , 3)
         Bateria = 100
       Case 10                                                  'a jeśli 10 to bateria miedzy 10% a 99%
         Ttemp = Mid(todczyt , 9 , 2)                           'i pobieramy wartosć dwucyfrową
         Bateria = Val(ttemp)
       Case 9
         Ttemp = Mid(todczyt , 9 , 1)                           'a jeśli 9 to znaczy, że bateria słabiutka
         Bateria = Val(ttemp)                                   'i pobieramy wartość jednocyfrową

       Case Else
         Bateria = 0                                            'jakby coś nie tak się odebrało dla bezpieczeństaw załączamy ładowarkę
     End Select
    Todczyt = ""
    Select Case Bateria

       Case 0 To 10
         If Ladowarka = 0 Then
           Set Portc.3                                          'załączenie ładowarki
         End If


       Case 99 To 100
         If Ladowarka = 1 Then
           Reset Portc.3                                        'wyłączenie ładowarki
         End If


       Case Else
           If Minuta <> 59 Then                                 'reset flagi
           Laduj = 0
         End If

    End Select
    Czysc_bufor
    Return
    'poniższy podprogram jest niedopracowany i tymczasowo nie używany

    '------------------------Zalaczenie telefonu------------------------------------
    'Zalaczenie:
    'Print "AT" ; Chr(13) ;
    'Waitms 100
    'Print "ATE0" ; Chr(13) ;
    'Czysc_bufor
    'Print "AT+CFUN?" ; Chr(13) ;
    'Flag = 1
    'Aktywny = 1
    'Bateria = 0
    ' Do
    '   Waitms 5
    '   Znak = Inkey()
    '   Incr Bateria
    '   If Znak = 49 Then
    '       Reset Portd.3
    '       Reset Portc.3
    '       Exit Do
    '   End If
    ' Loop Until Bateria = 255  or znak = 49

    'If Bateria = 255 Then
    '  If Znak <> 49 Then
    '   Set Portc.3
    '   Set Portd.3
    '   Znak = 0
    '   Bateria = 0
    '   Waitms 100
    '   Print "AT+CFUN=1" ; Chr(13) ;
    '   Goto Inicjalizacja
    ' End If
    'End If
    'Czysc_bufor
    'Flag = 0
    'Return
  • #58
    xury
    Specjalista automatyka domowa
    Napisz więcej z czym masz problem. Może fusebity, etc ?
    Jaki telefon podpięty i czy dioda (Pd3) wskaźnik inicjalizacji zapala się po podaniu napięcia na układ ?
    Generalnie polecam nową wersję w której nie trzeba nic wiedzieć o kodowaniu PDU.
    Jedynie na co trzeba uważać w nowej wersji to zmiany w HW. Musiałem zmienić piny dostosowując je do obsługi przerwań. Więc wejścia są na innych pinach.
    Teksty sms można zmieniać do woli a program sam je przekoduje na PDU.
    Tu tez kolejna uwaga, jeśli tekst miałby być dużo dłuższy od najdłuzszego mojego to należy zwiekszyć rozmiar zmiennych tekstowych i bufora odczytu.
  • #59
    bikerps
    Poziom 2  
    nie zapala sie zadna dioda, fuse bity sa raczej ok z tego wzgledu ze jak napisze jakis prosty program np. miganie diody to w tym samym ukladzie na tych samych fuse bitach wszystko chodzi czyli procesor zyje. Niemoge znalezc problemu dlaczego niechce ruszyc, a jezeli chodzi o druga wersje programu to mam jakies bledy przy kompilacji i niemoge dojsc jak to dobrze skompilowac