Omega2+ modül üzerinde python programlama dili ile konum kayıt uygulaması geliştirmeye çalışıyorum. GPRS kısmı henüz aktif değil ama gsm modül ile iletişim, veri alıp gönderme, sms ile işlem yapma, sms cevaplama, GPS konum alma işleme, konum kaydı ve sorgulama şeklinde hazırladım. GSM Modül Quectel MC60 GSM / GPS / GNSS kombo modül.
Projeyi opensource olarak buradan paylaşmak niyetindeyim.
Projede kullanılan donanıma blog sayfamdan ulaşabilirsiniz.
http://fidenetgaraj.blogspot.com/2018/05/omega2-gelistirme-bordu-yapalm.html
Önce Port tanımlamaları:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#serial port configure # terminal seri portu terminal=serial.Serial() terminal.baudrate=115200 terminal.port='/dev/ttyS0' terminal.open() #gsm modül iletişim seri portu ser=serial.Serial() ser.baudrate=115200 ser.port='/dev/ttyS1' ser.open() sleep(0.1) |
GPIO için periphery kütüphanesini kullandım. pyoniongpio isimli bir kütüphane var ama stabil değil.
Raspberry pi için deneyecekler BCM library ile değiştirebilirler.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#pin defines pin0=2 # GPIO Led pin1=3 # GPIO Led pin2=11 # GPIO Led pin3=18 # GPIO Led pin4=19 # GPIO Led pcb çizim hatası nedeniyle off led0= GPIO("/dev/gpiochip0", pin0, "out") led1= GPIO("/dev/gpiochip0", pin1, "out") led2= GPIO("/dev/gpiochip0", pin2, "out") led3= GPIO("/dev/gpiochip0", pin3, "out") led4= GPIO("/dev/gpiochip0", pin4, "out") pinPon=16 # GSM Board Power Enable pinMon=17 # Gsm Module On/Off pinVE=15 # Gsm Module V ext gsmBoardPowerOn=GPIO("/dev/gpiochip0", pinPon, "out") gsmModuleOn=GPIO("/dev/gpiochip0", pinMon, "out") gsmModuleFeedback=GPIO("/dev/gpiochip0", pinVE, "in") |
Ve fonksiyonlar:
Veritabanı Kontrol ediliyor var ise bildirim yapılıyor, yok ise yeniden oluşturuluyor.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
import os import sqlite3 as db def dbCheck(): dosyaMevcut=os.path.exists(dbFile) if not dosyaMevcut: dbCreate() else: print("db dosyası var.\r\n") def dbCreate(): vt=db.connect(dbFile) im=vt.cursor() im.execute(""" CREATE TABLE 'smsLog' ( 'id' INTEGER PRIMARY KEY AUTOINCREMENT, 'telNum' TEXT, 'date' TEXT, 'time' TEXT, 'text' TEXT );""") vt.commit() im.execute(""" CREATE TABLE 'naviLog' ( 'id' INTEGER PRIMARY KEY AUTOINCREMENT, 'lat' TEXT, 'long' TEXT, 'date' TEXT, 'time' TEXT, 'speed' REAL, 'direction' REAL );""") vt.commit() vt.close() print("info>> Veritabanı olusturuldu\r\n") |
Veritabanında iki ayrı tablo var. Biri gelen smsleri loglanması için. Gelen smsleri veritabanına kaydedip sim karttan siliyor. Diğeri konum bilgilerini kayıt ediyor.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
def smsLog(telNum,date,time,text): with db.connect(dbFile) as vt: im=vt.cursor() sorguText="""INSERT INTO smsLog(telNum,date,time,text) values('{}','{}','{}','{}') """.format(telNum,date,time,text) im.execute(sorguText) vt.commit() print("info>> smsLog eklendi") def naviLog(lat,long,date,time,speed,direction): with db.connect(dbFile) as vt: im=vt.cursor() sorguText="""INSERT INTO naviLog(lat,long,date,time,speed,direction) values('{}','{}','{}','{}','{}','{}') """.format(lat,long,date,time,speed,direction) im.execute(sorguText) vt.commit() print("info>> naviLog eklendi\r\n") |
Gsm modüllerle uğraşmanın en büyük sıkıntısı sabit bir komut ve dönüt yapısının olmaması ve arama, internet erişimi gibi bazı komutların cevap süresinin 300 saniyedyi bulabilmesi.
Bazı komut örnekleri:
komut: AT\r\n
olası cevaplar: OK\r\n
komut: ATDxxxxxxxx\r\n
olası cevaplar: CONNECT\r\n, NO CARRIER\r\n vb
Bunun için standart bir kütüphane yapmak ciddi şekilde uğraştırdı beni.
Komut Kütüphanesi:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#namedTuple defines atCmd = namedtuple('atCmd', ['cmdText','timeout','responses']) at = atCmd("AT\r", 300, ["OK", "ERROR"]) # AT atE0 = atCmd("ATE0\r", 300, ["OK", "ERROR"]) # Command Echo atQGSN = atCmd("AT+QGSN\r", 3000, ["OK", "ERROR"]) # Gsm Serial Number atCCID = atCmd("AT+CCID\r", 300, ["OK", "ERROR"]) # Sim Abone No atQNITZ = atCmd("AT+QNITZ=1\r", 300, ["OK", "ERROR"]) # Network Time Sync Enable atCTZU = atCmd("AT+CTZU=3\r", 300, ["OK", "ERROR"]) # Localized Time Sync atCTZR = atCmd("AT+CTZR=1\r", 300, ["OK", "ERROR"]) # Time Sync Bildirimi atCCLK = atCmd("AT+CCLK?\r", 1000, ["OK", "ERROR"]) # Saat? atQGNSSC = atCmd("AT+QGNSSC=1\r", 300, ["OK", "ERROR"]) # GNSS Power On atQGNSS = atCmd("AT+QGNSS=0\r", 300, ["OK", "ERROR","+CME ERROR:"]) # GNSS NMEA Tipi atCMGF = atCmd("AT+CMGF=1\r", 300, ["OK", "ERROR","+CME ERROR:"]) # SMS Format atCNMI = atCmd("AT+CNMI=2,1\r", 300, ["OK", "ERROR","+CME ERROR:"]) # SMS Notification Type atQNSTATUS = atCmd("AT+QNSTATUS\r", 1000, ["OK", "ERROR"]) # Network Status atCSQ = atCmd("AT+CSQ\r", 300, ["OK", "ERROR", "+CME ERROR:"]) # Signal Quality atCREG = atCmd("AT+CREG?\r", 300, ["OK", "ERROR","+CME ERROR:","+CREG:"]) # Signal Quality atCMGL = atCmd("""AT+CMGL="REC UNREAD"\r""",3000, ["OK", "ERROR"]) atCMGD = atCmd("AT+CMGD=1,4\r",3000, ["OK", "ERROR"]) atQGNSSRD = atCmd("AT+QGNSSRD?\r",3000,["OK", "ERROR"]) atCSMP = atCmd("AT+CSMP=17,167,0,0\r",1000,["OK", "ERROR"]) atCSCS = atCmd("""AT+CSCS="GSM"\r""",1000,["OK", "ERROR"]) atCMGS = atCmd("""AT+CMGS="{}"\r""",5000,["OK", "ERROR"]) atQIFGCNT = atCmd("AT+QIFGCNT=0\r",1000,["OK", "ERROR"]) atQICSGP = atCmd('AT+QICSGP=1,"INTERNET","",""\r',1000,["OK", "ERROR"]) atQIREGAPP=atCmd("AT+QIREGAPP\r",5000,["OK", "ERROR"]) atCGATT = atCmd("AT+CGATT?\r",5000,["OK", "ERROR"]) atQIACT = atCmd("AT+QIACT\r",5000,["OK", "ERROR"]) atQLOCCFG = atCmd("AT+QLOCCFG?\r",5000,["OK", "ERROR"]) atQCELLLOC = atCmd("AT+QCELLLOC\r",5000,["OK", "ERROR"]) |
GSM modül uyandırma rutini:
Quectel modül açılış esnasında 3 adet ready mesajı gönderiyor. RDY modülün hazır olduğu, SMS READY sms almak için hazır olunduğu, CALL READY de arama için hazır olduğunu bildiriyor. GSM modül bu üç uyarıyı verene kadar döngü içinde bekliyor.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
def gsmBootProc(): gsmBoardPowerOn.write(True) sleep(0.5) gsmPwrState= int(gsmModuleFeedback.read()) #TODO: sonra kaldır. gsmPwrState= int(gsmModuleFeedback.read()) print("info>> gsmPwrState:{}\r\n".format(gsmPwrState)) #TODO: sonra kaldır. if gsmPwrState==1: print("info>> Gsm module is already on\r\n") blink(0) else: print("info>> Gsm Module boots up\r\n") gsmModuleOn.write(True) sleep(1) gsmModuleOn.write(False) rdyCount=0 while (rdyCount<3): blink(0) print("info>> Wait For RDY's\r\n") if ser.in_waiting>0: sleep(0.01) data=ser.read(ser.in_waiting).decode("utf-8") if "RDY" in data: rdyCount+=1 print("info>> RDY\r\n") if "SMS Ready" in data: rdyCount+=1 print("info>> SMS Ready\r\n") if "Call Ready" in data: rdyCount+=1 print("info>> Call Ready\r\n") print("info>> Gsm Module is ready\r\n") blink(1) |
Komut gönderme yapısı kontrolleri de içerdiği için en uzun fonksiyon oldu. Yapı aslında çok basit. Bir komutu göndermek için komutu ekliyorum. atGonder(ate0) gibi. Bu komutun text kısmını yukardakı listeden bulup seri porta gönderiyor. Sonra maksimum timeout kadar bekleyip cevap var mı kontrol ediyor. Gelen cevabın başlangıç textine göre de işlem yapıyor. Sms işleme, gps koordinatlarını raw data içinden parse etme işlemleri de burada yapılıyor.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 |
def atGonder(cmd,param=""): global smsAlert global mnChange global clkChange global mntChange global yr global mnt global day global mn global clk global sec modname = globals()['__name__'] modobj = sys.modules[modname] #seri portta veri varsa komut göndermeden veriyi al data="" if cmd=="": while(ser.in_waiting>0): data+=ser.read(ser.in_waiting).decode("utf-8") sleep(0.01) print("info>> gsm alert, data:{}\r\n".format(data)) else: komut=getattr(modobj,cmd).cmdText #komut textini al if param!="": komut=komut.format(param) ser.write(komut.encode("utf-8")) sleep(0.1) sayac=0 timeout=getattr(modobj,cmd).timeout #süreyi al dataVar=False timeoutVar=False while(dataVar==False) and (timeoutVar==False): sayac+=1 sleep(0.01) if sayac>timeout: #timeout kontrol timeoutVar=True if ser.in_waiting>0: while(ser.in_waiting>0): data+=ser.read(ser.in_waiting).decode("utf-8") sleep(0.01) if len(data)>0: dataVar=True if timeoutVar==True: print("info>> header: {}, timeout \r\n".format(cmd)) if dataVar==True: print("info>> data:{}, header: {}\r\n".format(data,cmd)) #+CCID: "89902860377864179173" if "+CCID:" in data: ccid=data.split('"')[1] print("info>> ccid:{}\r\n".format(ccid)) #+QGSN: "861359030033482" if "+QGSN:" in data: gsn=data.split('"')[1] print("info>> gsn:{}\r\n".format(gsn)) #+QNITZ: "20/02/21,22:04:26+12,0" if "+QNITZ:" in data: localClkSet=True print("info>> localClkSet\r\n") #+CCLK: "20/02/22,01:11:44+12" if "+CCLK:" in data: rawTime=data.split('"')[1] clkEx=clk clk=rawTime[9:11] mnEx=mn mn=rawTime[12:14] sec=rawTime[15:17] yr=rawTime[0:2] mnt=rawTime[3:5] dayEx=day day=rawTime[6:8] if mnEx!=mn: print("info>> Dakika değişti\r\n") mnChange=True if clkEx!=clk: print("info>> Saat değişti\r\n") clkChange=True if dayEx!=day: print("info>> Gün değişti\r\n") dayChange=True print("info>> Clock: {}:{}:{}, Date: {}.{}.{}\r\n".format(clk,mn,sec,day,mnt,yr)) #RDY if "RDY" in data: print("info>> gsm module ready\r\n") gsmReady=True #+CFUN: 1 #TODO: +CFUN eklenecek sonra #+CPIN: READY if "+CPIN: READY" in data: print("info>> pinReady\r\n") pinReady=True #Call Ready if "Call Ready" in data: callReady=True print("info>> callReady\r\n") #SMS Ready if "SMS Ready" in data: smsReady=True print("info>> sms ready\r\n") #+CIEV: 10,"28603","BIMcell","BIMcell", 0, 0 if "+CIEV:" in data: operatorName=data.split('"')[3] print("info>> Operator Name: {}\r\n".format(operatorName)) #+CMTI: if "+CMTI:" in data: rawData=data.split(",")[1] msgOrder=int(rawData.strip("\r\n")) print("info>> +CMTI: {} sms alert\r\n".format(msgOrder)) smsAlert=True #RING if "RING" in data: print("info>> call alert") callAlert=True #+CREG: 0,1 if "+CREG:" in data: print("info>> Network Status:{}".format(data)) creg=False rawData=int(data.split(",")[1][0]) if rawData==1: creg=True else: creg=False print("info>> CREG: {}\r\n".format(creg)) #+CSQ: 21,0 if "+CSQ:" in data: rawData=data.split(",")[0] rawData=rawData.split(":")[1] rssi=int(rawData.strip()) level="" if 2<rssi<30: level="Normal" elif rssi==31: level="High" elif rssi>31: level="weak" print("info>> +CSQ: {}, Signal is: {}\r\n".format(rssi,level)) #+CMGL: 11,"REC UNREAD","+905056783615","","2020/02/22 03:23:58+12"\r\nYcycycyc\r\nOK\r\n if "+CMGL:" in data: #TODO: sms kontrol print("info>> sms kontrol\r\n") rawSmsData=data.split("\r\n") smsOrigin=rawSmsData[1].split(",") smsBody=rawSmsData[2].strip() smsTelNum=smsOrigin[2].strip('"') # 4: smsOrigin:"2020/02/25 19:14:14+12" sms date time smsRawDateTime=smsOrigin[4] smsDate=smsRawDateTime.split()[0] smsDate=smsDate.strip('"') smsTime=smsRawDateTime.split()[1][:8] print("info>> smsDate:{}, smsTime:{}\r\n".format(smsDate,smsTime)) for i in smsOrigin: print("info>> {}: smsOrigin:{}\r\n".format(smsOrigin.index(i),i)) print("info>> TelNo:{}, smsBody: {}\r\n".format(smsTelNum,smsBody)) #TODO: Mesajla iş bittikten sonra sms'i sil atGonder("atCMGD") print("info>> Toplu SMS silme\r\n") #gelen SMS'i logla smsLog(smsTelNum,smsDate,smsTime,smsBody) if "Blink" in smsBody: for i in range(20): blink(0) if "Loc?" in smsBody: sendSMS(smsTelNum,"Will be prepared soon") #+QGNSSRD: GPS / GNSS Data """ info>> data:+QGNSSRD: $GNRMC,162647.000,A,3708.8978,N,02930.5761,E,2.26,79.50,240220,,,A*44 $GNVTG,79.50,T,,M,2.26,N,4.19,K,A*12 $GNGGA,162647.000,3708.8978,N,02930.5761,E,1,4,2.73,1004.3,M,35.4,M,,*7B $GPGSA,A,3,12,02,05,,,,,,,,,,2.90,2.73,0.98*0A $GLGSA,A,3,76,,,,,,,,,,,,2.90,2.73,0.98*13 $GPGSV,3,1,11,25,77,019,,29,61,291,14,12,50,099,17,02,33,047,14*73 $GPGSV,3,2,11,31,25,312,,05,19,102,18,21,18,208,,24,14,172,18*74 $GPGSV,3,3,11,14,07,277,,32,02,253,,06,01,036,*4C $GLGSV,2,1,06,87,62,256,,77,61,327,,76,59,148,20,86,44,026,*63 $GLGSV,2,2,06,75,09,148,,78,09,327,*65 $GNGLL,3708.8978,N,02930.5761,E,162647.000,A,A*48 OK """ if "+QGNSSRD:" in data: GNRMCList=[] GNVTGList=[] GNGGAList=[] GPGSAList=[] GPGSVList=[] GNGLLList=[] GNSSList=data.split("\r\n") print("info>> GPS Sentence:{}\r\n".format(GNSSList)) print("info>> GPS Sentence Length:{}\r\n".format(len(GNSSList))) #$GNRMC,163650.000,A,3708.8784,N,02930.5870,E,2.88,217.40,240220,,,A*7E for i in GNSSList: print("info>> GNSSList:{}\r\n".format (i)) #$GNRMC,162647.000,A..... if ("$GNRMC" in i) or ("$GPRMC" in i): GNRMCList=i.split(",") gpsClk="" gpsLat="" gpsLatPole="" gpsLong="" gpsLongPole="" gpsDate="" gpsSpeedKn=0.0 gpsSpeedKms=0.0 gpsDirection=0.0 #saat verisi varsa print("info>> GNRMCList:{}\r\n".format(GNRMCList)) if GNRMCList[2]=="A": # Eğer gps verisi geçerli ise if GNRMCList[1]!="": gpsClk=GNRMCList[1][:6] #enlem verisi varsa if GNRMCList[3]!="": print("info>> GPS/GNSS list:{}\r\n".format(GNRMCList)) try: gpsLat=GNRMCList[3] gpsLatPole=GNRMCList[4] except: print("info>> {}\r\n".format(sys.exc_info()[0])) #boylam verisi varsa if GNRMCList[5]!="": print("info>> GPS/GNSS list:{}\r\n".format(GNRMCList)) try: gpsLong=GNRMCList[5] gpsLongPole=GNRMCList[6] except: print("info>> {}\r\n".format(sys.exc_info()[0])) #knot (hız verisi) if GNRMCList[7]!="": gpsSpeedKn=float(GNRMCList[7]) gpsSpeedKms=gpsSpeedKn*knot*3.6 print("info>> gps Speed:{kn:4.1f} knot; {km:3.1f} km/s \r\n".format(kn=gpsSpeedKn,km=gpsSpeedKms)) #Yön verisi if GNRMCList[8]!="": gpsDirection=float(GNRMCList[8]) print("info>> gps Direction:{s:4.2f}\r\n".format(s=gpsDirection)) #tarih verisi varsa if GNRMCList[9]!="": gpsDate=GNRMCList[9] print("info>> GPRMC: clk:{}, Date:{}, Lat:{}{}, Long:{}{}\r\n".format(gpsClk,gpsDate,gpsLat,gpsLatPole,gpsLong,gpsLongPole)) #TODO: naviDate ve naviTime GPS verisi değil gsm verisidir naviDate=yr+ "/"+mnt+ "/"+day naviTime=clk+ ":"+mn+ ":"+sec lat=gpsLat+gpsLatPole long=gpsLong+gpsLongPole #TODO: Girilen saat-tarih verisi gps değil gsm saat-tarih verisidir. naviLog(lat,long,naviDate,naviTime,gpsSpeedKms,gpsDirection) else: print("info>> GPS/GNSS data is invalid\r\n") #$GNVTG,79.50,T,,M... if "$GNVTG" or "$GPVTG" in i: GNVTGList=i.split(",") #$GNGLL,3708.8978,N,02930. if "$GNGLL" or "$GPGLL" in i: GNGLLList=i.split(",") #Seriporttan gelen veriyi değer olarak gönder return data |
SMS Gönderme Rutini atGonder library kullanarak sms gönderme işlemini yapıyor.
Gsm modül aldığı smsi CMTI texti ile bildiriyor. Bu kısımda atGonder içinde algılanıp text işleniyor, sms içeriği, gönderen numara alınıyor. Sms text içinde geçerli On, Off, Blink, Loc? gibi geçerli text varsa ona göre işlem yapılıyor.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#SMS Gönderme fonksiyonu def sendSMS(num,text): print("info>> SMS Rutini") atGonder("atCSMP") atGonder("atCSCS") resp=atGonder("atCMGS",num) if bigger in resp: ser.write(text.encode('utf-8')) ser.write(bckspc) print("info>> smsRutini Sonu\r\n") if bigger in gelen: ser.write(text.encode('utf-8')) ser.write(bckspc) print("smsRutini Sonu\r\n") |
Led Bildirimleri için GPIO library:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
def blink(x): if x==0: led0.write(False) sleep(0.1) led0.write(True) sleep(0.1) if x==1: led1.write(False) sleep(0.1) led1.write(True) sleep(0.1) if x==2: led2.write(False) sleep(0.2) led2.write(True) if x==3: led3.write(False) sleep(0.1) led3.write(True) sleep(0.1) if x==4: led4.write(False) sleep(0.1) led4.write(True) sleep(0.1) |
Eğer cihazınızın birden fazlası aynı veritabanı ile çalışacaksa cihazlarınıza id vermeniz gerekir bunun için de MAC adresini kullanabilirsiniz.
1 2 3 4 |
def getMacAddr(): eth_mac = get_mac_address(interface="apcli0") return eth_mac #print("ethernet Mac:{}\r\n".format(eth_mac)) |
GSM modülün açılıştan sonraki genel ayarları:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
atGonder("at") atGonder("atE0") atGonder("atQGSN") atGonder("atCCID") atGonder("atQNITZ") atGonder("atCTZU") atGonder("atCTZR") atGonder("atCCLK") atGonder("atQGNSSC") atGonder("atCREG") atGonder("atQGNSS") atGonder("atCMGF") atGonder("atCNMI") atGonder("atQNSTATUS") atGonder("atCSQ") #atGonder("atCMGD") |
GPS koordinatları hesabında bir derece 60 dakikaya eşit, Google konum hesabında ise bir derece 100 dakikaya eşit. Bu yüzden verilen Gps datadan alınan değer Google Maps üzerinde görüntülenmek istenirse verilen koordinatların derece kısmı aynı kalıp dakika ve saniye kısmı 60’a bölünerek yeniden derece kısmı ile toplanması sonucu Google formatına dönüştürülmüş oluyor.
Örnek:
GPS Şu koorinatı verdi:
4121.0000E ile işaretli boylamı hesaplayalım. GPS bize bu boylamın 41 derece 21 dakikada bulunduğunu belirtiyor.
Bu koordinatı Google Maps üzerinde işleyeceğimiz zaman 41 derece kısmı sabit kalacak 21 dakika kısmını (gerçek koordinatlardaki saniye ve salise kısmını da) 60’a bölerek 35 ile topluyoruz.
21.0000 / 60 = 0.35
41+0.35 = 41.35
sonra bunu google maps linkine ekliyoruz.
“https://www.google.com.tr/maps/place/{}.{}{}+{}.{}{} “.format(en_der,en_str,en_pol,boy_der,boy_str,boy_pol)
[url=”https://www.google.com.tr/maps/place/41.35E+41.35N”]https://www.google.com.tr/maps/place/41.35E+41.35N[/url]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
def hesapla(enlem,boylam): #https://www.google.com.tr/maps/place/37.186133N+03.219205E en_der=enlem[:2] en_toplu=enlem[2:len(enlem)-1] #print("enlem: {}\r\n".format(enlem)) #print("en_toplu: {}\r\n".format(en_toplu)) en_int=float(en_toplu)/60 en_str=str(en_int)[2:8] en_pol=enlem[len(enlem)-1:len(enlem)] boy_der=boylam[:3] boy_toplu=boylam[3:len(boylam)-1] #print("boylam: {}\r\n".format(boylam)) #print("boy_toplu: {}\r\n".format(boy_toplu)) boy_int=float(boy_toplu)/60 boy_str=str(boy_int)[2:8] #print("boy_str:{}\r\n".format(boy_str)) boy_pol=boylam[len(boylam)-1:len(boylam)] koordinat="""<a href="https://www.google.com.tr/maps/place/{}.{}{}+{}.{}{}" target="_blank">konum</a>""".format(en_der,en_str,en_pol,boy_der,boy_str,boy_pol) return koordinat |
While bloğu:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
while(True): if (sayac%1000==0): print("sayac: {}\r\n".format(int(sayac/1000))) sayac+=1 """ if terminal.in_waiting>0: terminalRespText=terminal.read(terminal.in_waiting).decode('utf-8') # q tuşu programı kırar if "q" in terminalRespText: break # a tuşu sendSMS çağır if "a" in terminalRespText: sendSMS("+905056783615","SMS check. OK") # a tuşu sendSMS çağır if "s" in terminalRespText: atGonder("atQGNSSRD") if "z" in terminalRespText: atGonder("atQIFGCNT") if "x" in terminalRespText: atGonder("atQICSGP") if "c" in terminalRespText: atGonder("atQIREGAPP") if "v" in terminalRespText: atGonder("atQIACT") if "b" in terminalRespText: atGonder("atQLOCCFG") if "n" in terminalRespText: atGonder("atQCELLLOC") sleep(0.001) if ser.in_waiting>0: print("info>> Gsm serial port receive data\r\n") blink(2) data=atGonder("") if (sayac%5000==0): #print("saat:\r\n") blink(0) atGonder("atCCLK") if (sayac%8000==0): #CREG ve Sinyal Seviyesini 8 saniyede bir kontrol et. blink(0) atGonder("atCREG") blink(0) atGonder("atCSQ") #TODO:Gps ortalama 30 saniyede çalışsın. if (sayac %30000==0): blink(2) atGonder("atQGNSSRD") if smsAlert==True: print("info>> SMS Kontrol\r\n") smsAlert=False blink(2) atGonder("atCMGL") # sms Kontrol et #TODO: Dakika saat ve tarih değişiminde çalışacak rutinler buraya eklenebilir. if mnChange==True: # Dakika değişimi mnChange=False # dakikada bir konum al #TODO: Şimdilik GPS 30 sn yede bir çalışsın #blink(2) #atGonder("atQGNSSRD") if clkChange==True: # Saat değişimi clkChange=False if dayChange==True: # Gün değişimi dayChange=False |