Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Bascom - GSM - Jak odbierać informacje z innego telefonu

atckp 12 Oct 2010 18:18 5238 21
  • #1
    atckp
    Level 14  
    Witam. Potrzebuje pilnie informacji, żeby zrobić następujący programik. Otóż mam podłączonego siemensa C60 do Atmegi16 i do tej pory wykorzystywałem tylko komendę Print "ATDxxxxxxxxx;" żeby komórka dzwoniła jak wystąpi konkretne zdarzenie. Teraz potrzebuje zmodyfikować mój program tak, żebym mógł zadzwonić z mojego prywatnego telefonu na numer komórki podłączonej do atmegi i chodzi o to żeby Atmega wykonała wtedy jakieś zadanie ( np oddzwoniła). Będę wdzięczny za jakieś proste przykładowe gotowe rozwiązanie - potrzebuje w miarę szybko to zrobić a przez najbliższe kilka dni nie mam czasu się tym zająć. Dziękuję z góry za pomoc
  • #3
    M. S.
    Level 34  
    Quote:
    a przez najbliższe kilka dni nie mam czasu się tym zająć.


    My też.
    Na forum znajdziesz dużo podpowiedzi na ten temat pod warunkiem, że będziesz miał czas! Wpisz w szukajkę "GSM", "komendy AT" lub coś podobnego.
  • #4
    medicb
    Level 28  
    Ja robiłem to z wykorzystaniem sms, kod jest oszczędny ale działał podczas zabawy z modułem GSM. O całym kodzie zapomnij.
    Code:

    $crystal = 11059200
    $baud = 115200

    '...

    Poczatek:

    Do
    Loop Until Inkey() = "+"                           'sprawdza nagłówek wiadomości

    Do
    Loop Until Inkey() = "C"                           'sprawdza nagłówek wiadomości

    Do
    Loop Until Inkey() = "M"                           'sprawdza nagłówek wiadomości

    Do
    Loop Until Inkey() = "T"                           'sprawdza nagłówek wiadomości

    Do
    Loop Until Inkey() = ":"                           'sprawdza nagłówek wiadomości

    Do
    Loop Until Inkey() = " "                           'sprawdza nagłówek wiadomości

    Do
    Loop Until Inkey() = 34                           'czeka na enter

    Do
    Loop Until Inkey() = "+"                           'czeka na + (początek numeru nadawcy sms)

    Echo Off
    Input Numer                                          'zapisuje numer
    Echo On
    '-------------------------------------
    Do
    Loop Until Inkey() = "W"                           'sprawdza magiczne słowo w sms

    Do
    Loop Until Inkey() = "y"                           'sprawdza magiczne słowo w sms

    Do
    Loop Until Inkey() = "k"                           'sprawdza magiczne słowo w sms

    Do
    Loop Until Inkey() = "o"                           'sprawdza magiczne słowo w sms

    Do
    Loop Until Inkey() = "n"                           'sprawdza magiczne słowo w sms

    Do
    Loop Until Inkey() = "a"                           'sprawdza magiczne słowo w sms

    Do
    Loop Until Inkey() = "j"                           'sprawdza magiczne słowo w sms

    Do
    Loop Until Inkey() = " "                           'sprawdza magiczne słowo w sms

    Echo Off
    Input Haslo                                          'zapisuje DRUGIE magiczne słowo w sms
    Echo On

    If Haslo = "raport" Then                          'sprawdza DRUGIE magiczne słowo w sms
    Print "AT+CMGS=" ; Chr(34) ; "+" ; Numer ; Chr(34)         'odsyła sms do nadawcy
    Wait 1
    Print "Kasa: " ; Kwota ; Chr(10) ; "Sygnal: " ; Sila ; "%" ; Chr(10) ;   'treść sms Hour_val ; ":" ; Minet_val ; ":" ; Sek_val ; Chr(26) ;                       'treść sms
    Gosub Ok
    Wait 1
    Print "AT"
    Gosub Ok
    Goto Kasa
    Else
    'Print ":( " ; Haslo
    Wait 1
    Print "AT"
    Gosub Ok
    Goto Kasa
    End If

    End

    Ok:                       'sprawdza czy moduł napisał OK po zakończeniu działania
    Do
    Loop Until Waitkey() = 13                                   '13
    Do
    Loop Until Waitkey() = "O"                                  '79
    Do
    Loop Until Waitkey() = "K"                                  '75
    Waitms 100
    Return

  • #5
    atckp
    Level 14  
    Nie no nie chce całego gotowca. Myślałem, że jest np jakaś komenda nasłuchiwania tak jak do dzwonienia służy ATD i numer telefonu to może jest coś odwrotnego. Wystarczył by mi sam fragment programu ten w którym Atmega sprawdza czy ktoś zadzwonił z konkretnego numeru.... Smsy nie są mi w tym momencie potrzebne.
  • #6
    adambehnke
    Level 24  
    Ja to robiłem tak:


    Code:
      Do
    

        Znak = Inkey(#2)
        Select Case Znak
           Case 0                                               'nie ma nic
           Case 13                                              'pomijanie entera
           Case 10 : If Uart_siemens <> "" Then Exit Do         'jesli mamy coś od nowej linii (case 10)
           Case Else
             Uart_siemens = Uart_siemens + Chr(znak)            'budujemy linie
        End Select

        Bufor_siemens = Ischarwaiting(#2)                       'brak znaku
        If Bufor_siemens < 1 Then Bufor_siemens_trx = Bufor_siemens_trx + 1

    Loop Until Bufor_siemens_trx > 100000




    If Left(uart_siemens , 6) = "+CMTI:" Then Flaga_sms_odczyt = 1
    If Left(uart_siemens , 6) = "+CLIP:" Then Flaga_call_incomming = 1



    I jeśli przyszedł jakiś sms to flaga_sms=1 i pobieramy sobie go komendą
    Code:
    AT+CMGR$
    gdzie "$" oznacza pozycję sms-a w telefonie. Potem nalezy zdekodować PDU i to wszystko.


    Oczywiście na początku programu należy wysłać do telefonu komendę :
    Code:
    "AT+CNMI=1,1,0,2"
    (dla Siemens-a) aby telefon informował o nadejściu wiadomości.



    Zresztą ja osobiście korzystałem z pracy kolegi Xury i jego tematu o obsłudze gsm Link .Masz tam wszystko dokładnie i przejrzyście opisane.
  • #7
    atckp
    Level 14  
    Dzięki za odzew pomocy.Z tym że ja nie chce odbierać ani wysyłać SMS. Po prostu chciałbym np załączyć jedna diodę jeśli zadzwonię do Atmegi połączonej przez RS z SIEMENSEM S55 z numeru xxx xxx xxx a inna diodę jeśli bee dzwonił z innego numeru YYYyyyYYY. Na elektrodzie fakt jest pełno pomocy ale głównie chodzi o sms. Tu sądzę że sprawa jest znacznie prostsza ale nie mogę za nic ruszyć. Cały czas nie udaje mi się nic wymyśleć
  • #8
    xury
    Automation specialist
    Poszukaj na forum opisu komend AT do Siemensa. Potem podłącz telefon do komputera np. przez Putty i podpatruj co się dzieje kiedy dzwonisz. Jeżeli nic się nie dzieje to poczytaj uważnie opis komend AT i włącz CLIP na konsoli.
    Po zadzwonieniu powinien się pojawić numer na konsoli. Przyjrzyj się dokładnie co i jak i napisz program parsujący i analizujący na Atmegę i tyle.
  • #9
    atckp
    Level 14  
    Witam. Zrobiłem właśnie tak jak poradził kolega Xury wcześniej. Użyłem programu którego miałem do Siemensa Siemens Mobile Control ( mam nadzieję ze on jest właściwy) i podczas dzwonienia na numer karty włożonej do telefonu Siemens S55 pojawiło się coś takiego jak na ekranie.
    Czy to jest tak że komórka robi tylko przerwanie i dopiero Atmega wysyła komendę zapytania AT+CPAS itd.?

    Druga rzecz to taka że np. jak podpoiłem komórkę starsza A50 to wogóle nic się nie pojawiało. Tzn że z tamtymi komorkami wogóle się tego nie da zrobić?

    Trzecia rzecz to czy dobrze rozczytałem to co pokazał mi ten programik:
    1. Telefon generuje przerwanie ( ale nic nie wysłał )
    2. Porgram SMC ( Siemens Mobile Control) Wysyła zapytanie AT+CPAS -Żądanie informacji na temat statusu aparatu GSM
    3. Telefon odpowiada że ma połączenie przychodzące
    4. SMC wysyła Żądanie podania listy bieżących połączeń
    5. Telefon odpowiada: +CLCC: 1,1,4,0,0,"511359736",129 tzn jest jedno połączenie, połączenie przychodzące, wywołanie wychodzące, tryb głosowy, połączenie typu pojedynczego (abonent <-> abonent) , numer telefonu, 129 –numeracja lokalna

    Jednak nie chce mi to wyjść w połączeniu z atmega. Wiem że to pewnie jest proste do realizacji. Jeśli było by to możliwe to prosiłbym o pomoc w napisaniu programu (w Bascomie) który Będzie sprawdzał w pętli czy dzwoni jakiś numer i jeśli zadzwoni nr np. 511359736 to załączy diodę.Bascom - GSM - Jak odbierać informacje z innego telefonu
  • #11
    atckp
    Level 14  
    Może zacznę od schematu połączenia siemensa
    Bascom - GSM - Jak odbierać informacje z innego telefonu
    (Czy to ma znaczenie - na kilku forach pisano żeby użyć siemens C35 , ja mam S55 - czy on się też nadaje do odbioru informacji o tym kto dzwoni)

    Teraz programik: chciałbym po prostu żeby na LCD był wyświetlany numer telefonu który do mnie dzwoni. Problem w tym że nawet jak chce wyświetlić czy cokolwiek jest w buforze jak dzwonie na numer telefonu podłączony. Niestety cały czas pokazuje mi zawartość bufora równą zero:/
    Nie wiem w czym może być wina (telefon jest sprawny bo przy podłączeniu go do komputera i do programu zczytującego RS (SiMoCo) to siemens wysyła do komputera informacje o tym że ktoś dzwoni. Może ktoś pomoże napisać kawałek takiego programu. Ja już powoli się poddaje.
  • #12
    xury
    Automation specialist
    Najpierw popraw schemat wg zasad opisanych w datasheet.
    Szczególną uwagę zwróć na zasilnie i układ resetu.
    Na kod nie licz - nikt Ci go nie napisze, takie są zasady. Możesz wstawić własny, a wtedy ktoś może wskazać błędy jakie są. No ale na początek musisz opanować zasilanie procesora, bo bez tego nawet najlepszy program nie ruszy.
  • #14
    atckp
    Level 14  
    Przepraszam. Źle się wyraziłem jeśli chodzi o schemat. Tu tylko chciałem pokazać w jaki sposób jest połączony SIEMENS z ATMEGA. W tej chwili pracuję na plytce testowej tak że wszystko jest połączone prawidłowo(jeśli chodzi przynajmniej o zasilanie- i jak sądze SIEMENS również).
    Bascom - GSM - Jak odbierać informacje z innego telefonu
    Natomiast jeśli chodzi o kod to może faktycznie zacznę od tego że napisałem coś takiego żeby mi wogóle pokazało że SIEMENS coś wysłał do ATMEGI jak dzwonię na numer włożony do siemensa. Niestety nic nie chce pokazywać. (Tzn cały czas bufor jest "0" i nie pokazuje żadnego pobranego znaku. Może ktoś zerknie na kod i zasugeruje jakie sa błędy. Dziękuję z góry

    $regfile = "m32def.dat"
    $crystal = 16000000

    $baud = 19200
    Config Lcd = 16 * 2

    Config Serialin = Buffered , Size = 100

    Enable Interrupts
    Declare Sub Oproznij_bufor

    Dim Bufor As Byte
    Dim Kod As String * 100

    Cls : Lcd "Inicjuje"
    Waitms 100
    Print "ATE0" ; Chr(13) 'WYLACZ ECHO
    Waitms 100
    Print "AT+CLIP=0" ; Chr(13) 'Wlaczanie prezentacji numeru
    Waitms 100

    Cls

    Do

    Bufor = Ischarwaiting()
    Kod = Inkey()
    Locate 1 , 1
    Lcd "buf" ; Bufor ; "kod:" ; Kod

    Loop
  • #16
    atckp
    Level 14  
    Witam. Dziękuję za próbę pomocy. Coś jednak mam nie tak. Wgrałem ten program ale niestety dalej nic mi nie pokazuje. Nawet zmieniłem SIEMENSA S55 na A65 bo takiego znalazłem ale nic nie pomogło. Podłączyłem bezpośrednio z telefonem nóżkę 3 (Tx) z pinem PD0(Rx) ale niestety dalej nic nie działa. Ma ktoś pomysł co może być tego przyczyną?

    Dodano po 29 [minuty]:

    Zrobiłem jeszcze test (mam dwa układy testowe z ATMEGA32) i na jednym dałem nadawanie a na drugim ten programik testowy od kolegi Xury i oczywiśćie działa czyli mam jakiś problem z moimi SIEMENSAMI S55 oraz A65. Tak w ogóle to na jakich telefonach koledzy pracowali jakieś Ericssony chyba - może SIEMENS jakoś inaczej działa. Oczywiście masy telefonu oraz ATMEGI połączyłem ze sobą.
  • #17
    atckp
    Level 14  
    Telefon cokolwiek wysyła bo jak podłączyłem wyjście z SIEMENS do portu D.7
    to na wyświetlaczu pokazały sie 3 znaki wysłane przez telefon
    Tak samo jak dzwonie na niego to również coś wysyła - jakiś pakiet znaków.
    Może mam źle ustawione coś z komunikacja RS232 lub może trzeba do telefon wysłać jakąś komendę jeszcze.
    Jak wgram ten poprzedni programik od kolegi Xury to dalej nic nie pojawia mi sie na LCD odnośnie zawartości buforu.

    Poniżej programik który wyświetlał mi tylko informacje czy telefon w ogóle coś podaje przez wyjście Tx
    $regfile = "m32def.dat"
    $crystal = 16000000

    $baud = 9600
    Config Serialin = Buffered , Size = 200
    Config Lcd = 16 * 2
    Cls
    Cursor Off
    Dim A As Bit
    A = 0

    Config Portd.7 = Input
    Reset Portd.7


    Set Portd.6
    Print "ATE0" ; Chr(13) ; 'WYLACZ ECHO
    Waitms 100
    Print "AT+CLIP=1" ; Chr(13)


    Do

    If Pind.7 = 0 Then
    Lcd A
    Toggle A

    End If
    Loop
  • #18
    atckp
    Level 14  
    Witam. W końcu sprzęt zadziałał. Kurcze, jakoś sie okazało ze musiałem dołożyć dwa tranzystory z opornikami żeby zmienić napięcie z telefonu ( te 3,3V niby) na 5V i poszło bez problemu. W sumie zostawiłem sobie to już na sam koniec moich prób gdyż myślałem że bezpośrednie połączenie z telefonu będzie odpowiednie - widocznie w moim przypadku tak nie było, przez co straciłem kilka(jak nie kilkanaście godzin).
    Natomiast bawiłem się trochę tymi programami które znalazłem na forach i mam takie jeszcze pytanie. Czy po każdej komendzie musi być polecenie waitms? Bo faktycznie jak się go nie da to nie zawsze jest odpowiedź OK z telefonu. I ile musi być ten czas - wystarczy 100 ms czy jest to zależne od komend?
  • #19
    mavi
    Level 19  
    dołożyłeś dwa tranzystory w przewodzię łączącym atmege z telefonem? dobrze zrozumiałem? po schemacie wcześniejszym na tyle ile się orientuje brak własnie konwertowania napięcia. Dużo poczytałem ostatnio o układzie max232 który tutaj mógłby się spisać. Napisałeś, że użyłeś dodatkowych tranzystorów. Jeśli właśnie użyłeś je pomiędzy telefonem, a atmegą to czy możesz zmodyfikować wcześniejszy schemat połączenia z atmegą i pokazać w jaki sposób je tam podłączyłeś?
  • #21
    mavi
    Level 19  
    czytam ze zrozumieniem, a jak czegoś nie rozumiem to pojawiają się pytania. Będę chciał niedługo też podłączyć telefon pod atmege i ciekawi mnie schemat podłączenia telefonu.
  • #22
    M. S.
    Level 34  
    Schemat z diodami Zenera jest dobry. Aby to połączenie zaczęło działać trzeba jednak dobrać diodę, bo z moich doświadczeń wynika, że przy małych prądach to co pisze na diodzie nie odpowiada rzeczywistości. Moja rada jest taka: zmienić rezystor na 100Ω, Podłączyć próbnie układ rezystor-dioda do 5V zasilania, zmierzyć napięcie na diodzie. Dobrać diodę. Na linii Tx telefon - Rx mikrokontroler pominąć konwerter napięć - połączyć drutem!