GSM Modülü

Başlatan sahinler64, 11 Haziran 2020, 12:11:41

sahinler64

Merhaba. Başta Ete Ustam ve Diğer Ustalarım. GSM Modülü İle İlgili Bazı uygulamalar Yapmaya Çalışıyorum. Bir Konuda Takıldım. Modüler Gelen Mesajı Okuyup O mesajı (11 yada 12 Haneli) bir değişkene kayıt edebilirmiyiz. Serin2 ve Serout2 komutlarıyla At komutları gönderip cevap alabiliyorum.

ete

12 haneli bilginin nasıl geldiği yada alındığı burada önem kazanıyor.
Mevcut imkanlarla 65535 e kadar bilgiyi kaydedebiliyoruz. Bunu hane sayısı ile ifade edecek olursak 5 hane gibi gözüksede 5 haneli olup bu sayıdan değer olarak büyükleri kayıt altına almak mümkün değil.
Ama sayılar bölünebilirler. Temel sayı 8 bitlik olarak ele alınır ise 12 haneli bilgiyi şayet rakam ise uygun bir mantık ile bölerek birden fazla sayıya dönüştürüp onu kaydetmek yada en doğrusu 12 hanenin her bir hanesini tek değişken olarak kayıt altına almak bence daha uygun olur.
Tabiiki hane ile ifade edilen karekterler rakam ise farklı uygulama , karekter ise farklı uygulama yapmak gerekecek.
Öncelikle karekter dizisine bakmak gerekiyor. Ondan sonra daha tutarlı bir bilgi oluşturulabilir.

Ete

oguztkn

Alıntı yapılan: sahinler64 - 11 Haziran 2020, 12:11:41Modüler Gelen Mesajı Okuyup O mesajı (11 yada 12 Haneli) bir değişkene kayıt edebilirmiyiz.

Merhaba, gsm modül ile bende uğraşıyorum. Gelen veriler string olarak geldiğinden her bir karakteri bir diziye alıp o şekilde kullanabiliyor. Tabi bu değerler her bir karakterin ascii karşılığı olarak dizinin elemanlarına yerleşiyor. Bu kısma kadar biliyorum ama sonrasında sanırım bir lookup gibi birşey kullanıp ascii den dönüştürme işlemi yapılmalı.  ??? ?

sahinler64

Biraz Kafa Yoracağız. Amaç Aslında şu. GSM Modülünü Alarm Bilgisi Almak İçin Kullanacağım. Sistemin Alarm Anında (Elektrikler Gittiğinde Yada İstemediğimiz Bir Durum Oluştuğunda) Alarm Mesajını Atacağı Telefon Numarasını Belirlemek... Verdiğiniz Fikirler İçin Çok Teşekkür Ederim. Uğraşıp Deneyeyim.

Dtmf

Formda sim800 diye arayin uygulamalar var

sahinler64

Ustalar Merhaba. Biraz Uzun ve Uğraşlı Bir İş Oldu Benim İçin. Ama Yaptığımı Paylaşmak İstedim.
Mesajla Yapamadım Ama Oldu.
İlk Önce At Komutları İle Haberleşmeyi Yapabildim.

SEROUT TX,T9600,["AT+DDET=1",13,10]    ;DTMF KODLARINI ALMAK İÇİN KULLANIYORUM
Sonra Modülü Arayıp
SEROUT TX,T9600,["ATA",13,10]  Komutuyla Cevap Veriyorum.

N          VAR BYTE
N1          VAR BYTE
N2          VAR BYTE
N3          VAR BYTE
N4          VAR BYTE
N5          VAR BYTE
N6          VAR BYTE
N7          VAR BYTE
N8          VAR BYTE
N9          VAR BYTE
N10        VAR BYTE

GOSUB TUSKONTROL
N1=DTMF
GOSUB TUSKONTROL
N2=DTMF
GOSUB TUSKONTROL
N3=DTMF
GOSUB TUSKONTROL
N4=DTMF
GOSUB TUSKONTROL
N5=DTMF
GOSUB TUSKONTROL
N6=DTMF
GOSUB TUSKONTROL
N7=DTMF
GOSUB TUSKONTROL
N8=DTMF
GOSUB TUSKONTROL
N9=DTMF
GOSUB TUSKONTROL
N10=DTMF

--------------------------------------------
TUSKONTROL1:
        
SerIn2 RX,84,5000,TUSKONTROL,[Wait(" "),DTMF]


SELECT CASE DTMF
CASE 0 ;0
DTMF=48
CASE 1 ;1
DTMF=49
CASE 2 ;2
DTMF=50
CASE 3 ;3
DTMF=51
CASE 4 ;4
DTMF=52
CASE 5 ;5
DTMF=53
CASE 6 ;6
DTMF=54
CASE 7 ;7
DTMF=55
CASE 8 ;8
DTMF=56
CASE 9 ;9
DTMF=57

END SELECT
RETURN


Kod Uzun Olduğu İçin Hepsini Paylaşmadım. Bunun Kısa Bir Yolu Veya Pratik Başka Bir Yöntem Varmı.

Dtmf

Cep.tel.mesaj olarak A1 gonder porta.2 deki ledi yak.sen oraya A1 DEGIL B1 Yap veya baska bisey koy


Device=16F877A
XTAL=4
ALL_DIGITAL TRUE
Include "MODEDEFS.BAS"
TRISA = 3:PORTA=0
TRISB = 0:PORTB=0
TRISC = 0:PORTC=0
PORTD = 0:PORTD=0
PORTE = 0:PORTE=0
Declare LCD_TYPE alpha
Declare LCD_LINES 2
Declare LCD_INTERFACE 4
Declare LCD_DTPIN PORTB.4
Declare LCD_RSPIN PORTB.0
Declare LCD_ENPIN PORTB.1
;=====================================================================
Print At 1,1,"...SIMCON.... "
DelayMS 4000
DON:
               Print At 1,1,"AT             "
               SerOut PORTC.6,84,["AT",13,10]
               DelayMS 5
               SerOut PORTC.6,84,["AT",13,10]
               DelayMS 5
               SerOut PORTC.6,84,["AT",13,10]
               DelayMS 5
               SerIn PORTC.7,84,5000,DON,[Wait("OK")]
               Print At 2,1,"OK           "
;=================================================================================================================                           
DelayMS 3000
DON1:
               Print At 1,1,"CFUN=1       "
              SerOut PORTC.6,84,["AT+CFUN=1",13,10] ;SerOut PORTC.6,84,["AT+CFUN=",34,"1",34,13]
               DelayMS 10
               SerOut PORTC.6,84,["AT+CFUN=1",13,10]
               SerOut PORTC.6,84,["AT+CFUN=1",13,10]
               SerOut PORTC.6,84,["AT+CFUN=1",13,10]
               SerOut PORTC.6,84,["AT+CFUN=1",13,10]
               SerIn PORTC.7,84,5000,DON1,[Wait("OK")]
               Print At 2,4,"OK"
DelayMS 3000
DON2:
                Print At 1,1,"CMGF=1   "
                SerOut PORTC.6,84,["AT+CMGF=1",13,10]
                SerOut PORTC.6,84,["AT+CMGF=1",13,10]
                SerOut PORTC.6,84,["AT+CMGF=1",13,10]
                SerOut PORTC.6,84,["AT+CMGF=1",13,10]
                SerIn PORTC.7,84,5000,DON2,[Wait("OK")]
                Print At 2,8,"OK"
DelayMS 3000
Cls
;=========================================================================
BASLA:
Print At 1,1,"...SIMCON.... "
SerOut PORTC.6,84,["AT+CMGR=1",13,10]
SerOut PORTC.6,84,["AT+CMGR=1",13,10]
SerOut PORTC.6,84,["AT+CMGR=1",13,10]
SerOut PORTC.6,84,["AT+CMGR=1",13,10]
             
               SerIn PORTC.7,84,5000,HAT,[Wait("A1")]
               SerIn PORTC.7,84,5000,HAT,[Wait("A1")]
               PORTA.2=1
               Print At 2,1,"  VERI ALINDI    "
               DelayMS 2000

DelayMS 3000
SerOut PORTC.6,84,["AT+CMGD=1",13,10]
SerOut PORTC.6,84,["AT+CMGD=1",13,10]
SerOut PORTC.6,84,["AT+CMGD=1",13,10]
SerOut PORTC.6,84,["AT+CMGD=1",13,10]
GoTo BASLA
;=================================
HAT:
PORTA.2=0             
Print At 2,1,"      MSJ HATA     "
DelayMS 500
Cls
GoTo BASLA




sahinler64

Allah Razı Olsun. Peki Mesaj İçinde A1 Gelince Açacak. Ama Aynı Kod İçinde A0 Gelir ise Kapatacak Kısmını Nasıl Çözerim.

SerIn PORTC.7,84,5000,HAT,[Wait("A1")]
;A1 Bilgisi Gelince Alt Satıra İniyor. Denedim. İş Görüyor. Ama Bunu ;

SerIn PORTC.7,84,5000,HAT,[Wait("  "),Mesaj]
;Bu Şekilde Yapıp
If Mesaj=0 then Ledyak
IF Mesaj=1 then ledson
;Yaptığımda LedYanıyor Fakat Sönmüyor.

dnaci

#8
@sahinler64  3 yıl önce bende ete hocaya bu konuda bir şeyler danışmıştım. Verdiği bilgiler sayesinde bir şeyler yapmıştım. Aşağıdaki kod parçasında aradığın soruların cevabı var. Proton basic ile g510 modülü için yazmıştım.

Skip komutu ile 5. haneden gsm no alınıp gsm no değişkenine atılıyor.

28. haneden mesaj başlangıcı ile mesaj içeriği mesaj değişkenine atılıyor. Veriler daha sonra lcd ekranda gösteriliyor.

Kullandığın modülü bilmiyorum komutlarda farklılıklar olabilir ama mantık bu şekilde çalışıyor.

Dim GSMNO[12] As Byte
Dim MESAJ[9]  As Byte 

mlist:

HSerOut["AT+CMGL",13,10] 'SMSLER LİSTELENİYOR...
HSerIn 5000,mlist,[Wait("REC UNREAD"),skip 5,Str GSMNO\12,skip 28,Str MESAJ\9] 'okunmayan ilk smsten gsm no ve mesaj içeriği alınıyor...
For SAY=0 To 8
  MESAJ[SAY]=MESAJ[SAY]-48
Next
For SAY=0 To 11
  GSMNO[SAY]=GSMNO[SAY]-48
Next
Cls
HSerOut [26]

Print At 1,1,"GSM NO:"
Print At 2,1,#GSMNO[0],#GSMNO[1],#GSMNO[2],#GSMNO[3],#GSMNO[4],#GSMNO[5],#GSMNO[6],#GSMNO[7],#GSMNO[8],#GSMNO[9],#GSMNO[10]
DelayMS 2000
Cls
Print At 1,1,"MESAJ:"
Print At 2,1,#MESAJ[0],#MESAJ[1],#MESAJ[2],#MESAJ[3],#MESAJ[4],#MESAJ[5],#MESAJ[6],#MESAJ[7],#MESAJ[8]
DelayMS 1000
Cls

Mcu'da bir pini on of yapmak için de aşağıdaki gibi bir satır kullanılabilir:

If MESAJ[0] = 17 And MESAJ[1] = 1 Then portb.0=1 ' mesajda ilk hanede A ikinci hanede 1 gelirse çıkış olacaktır.

If MESAJ[0] = 17 And MESAJ[1] = 2 Then portb.0=0 ' mesajda ilk hanede A ikinci hanede 2 gelirse çıkış olmayacaktır.

Dtmf

A1 yerine bir degisken ata mesela OKU1 degiskeni olsun
Alıntı YapIf OKU1=A1 THEN porta.2=1
If OKU1=A2 THEN porta.2=0

Powered by EzPortal