Hardware components | ||||||
| × | 1 | ||||
![]() |
| × | 1 | |||
| × | 2 | ||||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
Software apps and online services | ||||||
| ||||||
|
I like to learn something by using it in project. I want to learn Python coding. So I designed a development board that includes GSM+GNSS+GPS module, Omega2+.
All the PCBs produced by PCBWAY. The PCB quality is excellent!
I shared project pcbs on PCBWAY. Here is the links of pcbs. You can order pcbs using links.
GSM Dev Board: https://www.pcbway.com/project/shareproject/W225760ASH10_FD_GSM_DEV___CADCAM.html
Python Dev Board:
https://www.pcbway.com/project/shareproject/W225760ASH9_FD_PYT_DEV___CADCAM.html
If you sign in by using this link PCBWAY will give me bonus for new project pcbs :)
https://www.pcbway.com/setinvite.aspx?inviteid=78068
Cream solder apply with plastic stencil.
After cream solder
Solder with infrared heater
DIP components
Final of soldering
Proteus Design For GSM GNSS Board
Python Code for Track Something by GPS / GNSS coordinates
Python#! /usr/bin/env python
# -*- coding: UTF-8 -*-
#Bismillahirrahmanirrahim
from time import sleep
import onionGpio
import serial
import sqlite3 as db
import os
# define pins
pinLed0=2 # GPIO Led
pinLed1=3 # GPIO Led
pinLed2=11 # GPIO Led
pinLed3=18 # GPIO Led
pinLed4=19 # GPIO Led pcb izim hatas nedeniyle off
pinPon=16 # GSM Board Power Enable
pinMon=17 # Gsm Module On/Off
pinVE=15 # Gsm Module V ext
# define states
ON=1
OFF=0
gsmPwrState=0
line=""
commResp=["OK","ERROR","+CPIN: SIM PIN","+CPIN: READY","$GPSACP:","+CREG:","#MONI:"]
bckspc=bytes([26])
bigger=">"
tryOut=30
sayac=0
# tanmlar
IMEI=""
CCID=""
CSQ=""
dbFile="/home/arts/db/dbArts.sqlite"
gsmRespText=""
terminalRespText=""
bekleyen=0
# saat ve tarih tanmlar
sa=0
dk=0
sn=0
gun=0
ay=0
yil=0
dkEx=0
saEx=0
gunEx=0
ayEx=0
gsmTarihSaat=""
gsmTarihSaatListe=list()
gsmTarih=""
gsmTarihListe=list()
gsmSaat=""
gsmSaatListe=list()
zaman=list()
GNSSListe=list()
GGAListe=list()
RMCListe=list()
GLLListe=list()
GSVListe=list()
VTGListe=list()
GSAListe=list()
dummyText=""
latitude=["",""]
longitude=["",""]
rakim=0.0
yon=0.0
kms=0.0
knot=0.0
uydu=0
gnssTarihSaatListe=list()
gnssTarih=""
gnssSaat=""
#_freegpio
#onionGpio._freegpio(pinLed)
#onionGpio._freegpio(pinGsmBoot)
#onionGpio._freegpio(pinGsmPwrCtl)
# pin tanmlama ve konfigrasyonu
led0= onionGpio.OnionGpio(pinLed0)
led1= onionGpio.OnionGpio(pinLed1)
led2= onionGpio.OnionGpio(pinLed2)
led3= onionGpio.OnionGpio(pinLed3)
led4= onionGpio.OnionGpio(pinLed4)
gsmBoardPowerOn=onionGpio.OnionGpio(pinPon)
gsmModuleOn=onionGpio.OnionGpio(pinMon)
gsmModuleFeedback=onionGpio.OnionGpio(pinVE)
# pin direction
led0.setOutputDirection(ON)
led1.setOutputDirection(ON)
led2.setOutputDirection(ON)
led3.setOutputDirection(ON)
#led4.setOutputDirection(ON)
gsmBoardPowerOn.setOutputDirection(ON)
gsmModuleOn.setOutputDirection(ON)
gsmModuleFeedback.setInputDirection() #gsm module ak kapal bildirimi iin giri olarak ayarland
gsmModuleOn.setValue(OFF) # yanllkla modulu kapatmamak iin kapatld.
led0.setValue(ON)
led1.setValue(OFF)
led2.setValue(OFF)
led3.setValue(OFF)
#led0.setValue(ON)
#fonksiyonlar
def dbKontrol():
dosyaMevcut=os.path.exists(dbFile)
if not dosyaMevcut:
dbOlustur()
else:
print("db dosyas var.\r\n")
def dbOlustur():
vt=db.connect(dbFile)
im=vt.cursor()
#im.execute("CREATE TABLE arac(id,plate,marka,model,yas,barcode)")
#vt.commit()
im.execute("""
CREATE TABLE action(
'id' INTEGER PRIMARY KEY AUTOINCREMENT,
'longitude' VARCHAR(25),
'longitudeDir' VARCHAR(5),
'latitude' VARCHAR(25),
'latitudeDir' VARCHAR(5),
'rakim' REAL,
'yon' REAL,
'kms' REAL,
'knot' REAL,
'tarih' VARCHAR(10),
'saat' VARCHAR(10)
)""")
#im.execute("CREATE TABLE action(id,enlem,boylam,rakim,yon,hiz,tarih,saat)")
vt.commit()
vt.close()
print("Veritaban olusturuldu\r\n")
def veriGir(longitude,longitudeDir,latitude,latitudeDir,rakim,yon,kms,knot,gsmTarih,gsmSaat):
with db.connect(dbFile) as vt:
im=vt.cursor()
sorguText="""INSERT INTO
action(longitude,longitudeDir,latitude,latitudeDir,rakim,yon,kms,knot,tarih,saat)
values('{}','{}','{}','{}','{}','{}','{}','{}','{}','{}') """.format(longitude,longitudeDir,latitude,latitudeDir,rakim,yon,kms,knot,gsmTarih,gsmSaat)
#print (sorguText)
im.execute(sorguText)
vt.commit()
print("Veritabanna eklendi")
def gsmBootProc():
gsmBoardPowerOn.setValue(ON)
sleep(0.1)
gsmPwrState= int(gsmModuleFeedback.getValue())
#print(type(gsmPwrCtl))
print("Gsm Power:{}\r\n".format(gsmPwrState))
if gsmPwrState==1:
print("Gsm zaten acik\r\n")
else:
led0.setValue(OFF) # iaret ver
gsmModuleOn.setValue(ON)
sleep(1)
gsmModuleOn.setValue(OFF)
sleep(5)
print("Gsm Boot\r\n")
led0.setValue(ON) # iaret ver
def smsGonder(num,text):
komut="AT+CSMP=17,167,0,0\r"
ser.write(komut.encode('utf-8'))
sleep(0.1)
gsmRespText=ser.read(ser.in_waiting).decode('utf-8')
print("smsGonder CSMP: {} \r\n".format(gsmRespText))
komut="""AT+CSCS="GSM"\r"""
ser.write(komut.encode('utf-8'))
sleep(0.1)
gsmRespText=ser.read(ser.in_waiting).decode('utf-8')
print("smsGonder CSCS: {} \r\n".format(gsmRespText))
komut="""AT+CMGS="{}"\r""".format(num) # SMS gndermek iin bala
ser.write(komut.encode('utf-8'))
while(ser.in_waiting==0):
sleep(0.1)
print("SMS Bekleme\r\n")
if ser.in_waiting>0: # > gelirse
gsmRespText=ser.read(ser.in_waiting).decode('utf-8')
print("smsGonder Rutini: {} \r\n".format(gsmRespText))
print("sms metni: {}\r\n".format(text))
if bigger in gsmRespText:
ser.write(text.encode('utf-8'))
ser.write(bckspc)
print("smsRutini Sonu\r\n")
def atGonder(komut):
if komut.startswith("AT+CPIN="): #komut pin girme ise komutu gndermeden nce pin durumu sorgusu yap
atPin="AT+CPIN?\r" # eer pin girilmedi ise gir, girildi ise pass ge
ser.write(atPin.encode('utf-8'))
while(ser.in_waiting==0):
sleep(0.1)
print("PIN Bekleme\r\n")
gsmRespText=ser.read(ser.in_waiting).decode('utf-8')
print("SIMM : {}\r\n".format(gsmRespText))
if "+CPIN: SIM PIN" in gsmRespText: # eer SIM PIN dnerse
print("Simm Pin\r\n")
ser.write(komut.encode('utf-8')) #pin gir"
sleep(1)
gsmRespText=ser.read(ser.in_waiting).decode('utf-8')
if "OK" in gsmRespText: # pin girme ii tamam
print("Pin Ok\r\n")
#break
elif "ERROR" in gsmRespText: # pinde hata var burayla ilgili uyar yap
print("Pin ERROR\r\n")
#break
elif "+CPIN: READY" in gsmRespText: # diyelim ki board resetlendi ama gsm modl ak. bu durumda tekrar pin girme
print("Pin zaten girilmi\r\n")
#break
elif "+CME ERROR:" in gsmRespText: # diyelim ki board resetlendi ama gsm modl ak. bu durumda tekrar pin girme
print("SIM Card Yok\r\n")
#break
gsmBoardPowerOn.setValue(OFF) # Sm Card yoksa GSM Modl kapat
quit() # program kr
elif "AT+QNSTATUS" in komut: #eer komut "AT+QNSTATUS\r" ise
sayac=0
while(True): #Burda sonsuz dng ile ya balanana ya da deneme says alana kadar dn
print("{}\r\n Sayac{}\r\n ".format(komut,sayac)) #komutu yazdr
sayac=sayac+1
ser.write(komut.encode('utf-8'))
sleep(1)
gsmRespText=ser.read(ser.in_waiting).decode('utf-8')
print("{}\r\nSayac:{}".format(gsmRespText,sayac)) # bulduunu ve sayac yazdr
if (sayac>tryOut) or ("0" in gsmRespText): #Eer cevap "OK" dnd ise (bu ileride GPSACP gibisonunda bir de OK dndren komutlarda sknt olabilir.)
print("AT+QNSTATUS: out\r\n") #tamamsa k (modl deiince buras da deiecek)
break
elif "AT+GSN" in komut: #eer komut "AT+GSN\r" ise
print(komut+"\r\n") #komutu yazdr
ser.write(komut.encode('utf-8'))
sleep(0.5)
gsmRespText=ser.read(ser.in_waiting).decode('utf-8')
IMEI=gsmRespText;
print("Gsm Serial:{}\r\n".format(gsmRespText))
elif "AT+CSQ" in komut: #eer komut "AT+CSQ\r" ise
print(komut+"\r\n") #komutu yazdr
ser.write(komut.encode('utf-8'))
sleep(0.3)
gsmRespText=ser.read(ser.in_waiting).decode('utf-8')
CSQ=gsmRespText[gsmRespText.find(" ")+1:];
print("Gsm Signal Quality:{}\r\n".format(CSQ))
elif "AT+CCID" in komut: #eer komut "AT+CCID\r" ise
print(komut+"\r\n") #komutu yazdr
ser.write(komut.encode('utf-8'))
sleep(0.3)
gsmRespText=ser.read(ser.in_waiting).decode('utf-8')
CCID=gsmRespText[gsmRespText.find(" ")+1:len(gsmRespText)-8].replace('"','')
#+CCID: "89902860377864179173"
print("Gsm CCID:{}\r\n".format(CCID))
else: # eer komut CPIN ve MONI komutu deilse normal ileme devam et
print(komut+"\r\n") #komutu yazdr
ser.write(komut.encode('utf-8'))
sleep(1)
gsmRespText=ser.read(ser.in_waiting).decode('utf-8')
print("gelen:{}\r\n".format(gsmRespText))
if "OK" in gsmRespText: #Eer cevap "OK" dnd ise (bu ileride GPSACP gibisonunda bir de OK dndren komutlarda sknt olabilir.)
pass
#break
# gelen veri GNSS verisi ise
if "+QGNSSRD:" in gsmRespText:
global latitude
global longitude
global rakim
global yon
global kms
global knots
global uydu
global gnssTarihSaatListe
global gnssTarih
global gnssSaat
GNSSListe=gsmRespText.split()
#print("GNSS: {}\r\n".format(GNSSListe))
for i in GNSSListe:
if "VTG" in i:
VTGListe=i.split(",")
print("liste: {}\r\n".format(VTGListe))
if "RMC" in i:
RMCListe=i.split(",")
print("liste: {}\r\n".format(RMCListe))
if "GSA" in i:
GSAListe=i.split(",")
print("liste: {}\r\n".format(GSAListe))
if "GLL" in i:
GLLListe=i.split(",")
print("liste: {}\r\n".format(GLLListe))
if "GSV" in i:
GSVListe=i.split(",")
print("liste: {}\r\n".format(GSVListe))
if "GGA" in i:
GGAListe=i.split(",")
print("liste: {}\r\n".format(GGAListe))
#RMCListe[3] elamann uzunluu 3 ten bykse yle ilem yap
if len(RMCListe[3])>3:
latitude.clear()
latitude.append(RMCListe[3])
latitude.append(RMCListe[4])
longitude.clear()
longitude.append(RMCListe[5])
longitude.append(RMCListe[6])
print("latitude: {} ; longitude: {}\r\n".format(latitude, longitude))
yon=float(RMCListe[8])
knot=float(RMCListe[7]) # knot cinsinden hz
kms=float(VTGListe[7]) # km/s cinsinden hz
rakim=float(GGAListe[9])
print("hz: {:.2f} knots, {:.2f} km/s, yon: {:.2f} derece, rakm: {:.2f} mt\r\n".format(knot,kms,yon,rakim))
gnssSaat=(RMCListe[1].split("."))[0]
print("gnssSaat: {}\r\n".format(gnssSaat))
gnssTarih=RMCListe[9]
gnssTarihSaatListe.clear()
gnssTarihSaatListe.append(gnssTarih[4:6])
gnssTarihSaatListe.append(gnssTarih[2:4])
gnssTarihSaatListe.append(gnssTarih[:2])
gnssTarihSaatListe.append(gnssSaat[:2])
gnssTarihSaatListe.append(gnssSaat[2:4])
gnssTarihSaatListe.append(gnssSaat[4:6])
print("gnssTarihSaatListe: {}\r\n".format(gnssTarihSaatListe))
# Saat verisi ile
if "+CCLK:" in gsmRespText:
#+CCLK: "18/04/23,01:25:37+12"
global zaman
global sa
global dk
global sn
global gun
global ay
global yil
global dkEx
global saEx
global gunEx
global ayEx
global gsmTarih
global gsmSaat
gsmTarihSaat=gsmRespText[gsmRespText.index(" "):].replace('"','')
gsmTarihSaatListe=gsmTarihSaat.split(",")
gsmTarih=gsmTarihSaatListe[0]
gsmTarihListe=gsmTarih.split('/')
gsmSaat=(gsmTarihSaatListe[1])[:8]
gsmSaatListe=gsmSaat.split(':')
gunEx=gun
gun=int(gsmTarihListe[2])
ayEx=ay
ay=int(gsmTarihListe[1])
yil=int(gsmTarihListe[0])
saEx=sa
sa=int(gsmSaatListe[0])
dkEx=dk
dk=int(gsmSaatListe[1])
sn=int((gsmSaatListe[2])[:2])
#print("gun: {}, ay: {}, yl: {} sa: {} dk: {} sn: {}\r\n".format(gun,ay,yil,sa,dk,sn))
zaman.clear()
zaman=[yil,ay,gun,sa,dk,sn]
#-----------------balyoruz ------------------
dbKontrol() #veritaban var kontrol et yoksa olutur varsa aada balan
# terminal seri portu
terminal=serial.Serial()
terminal.baudrate=115200
terminal.port='/dev/ttyS0'
terminal.open()
gsmBootProc()
#sm modl iletiim seri portu
ser=serial.Serial()
ser.baudrate=115200
ser.port='/dev/ttyS1'
ser.open()
sleep(0.1)
atGonder("AT\r") #AT
atGonder("ATE0\r") #Command Echo
atGonder("AT+CPIN=3711\r") #Pin
atGonder("AT+GSN\r") #Gsm Serial Number
atGonder("AT+CCID\r") #Sim Abone No
atGonder("AT+QNSTATUS\r") #Network Status
atGonder("AT+CSQ\r") #Signal Quality
atGonder("AT+QNITZ=1\r") #Network Time Sync Enable
atGonder("AT+CTZU=3\r") #Localized Time Sync
atGonder("AT+CTZR=1\r") #Time Sync Bildirimi
atGonder("AT+CCLK?\r") #Saat?
#atGonder("AT+QGNSSC=1\r") #GNSS Power On
#atGonder("AT+QGNSSCMD=0\r") #GNSS NMEA Tipi
#atGonder("AT+QGNSSEPO=1\r") #EPO Aktif
atGonder("AT+CMGF=1\r")
atGonder("AT+CNMI=2,1\r")
smsGonder("+905056783615","MC60 SMS App.")
sayac=0
while(True):
print("sayac: {}\r\n".format(sayac))
sayac=sayac+1
if terminal.in_waiting>0:
terminalRespText=terminal.read(terminal.in_waiting).decode('utf-8')
if "q" in terminalRespText:
break
#led.setValue(OFF)
if ser.in_waiting>2: # eer veri varsa al ve deerlendir.
#seriporttan veri gelirken kesme olumad iin bekleme yaparak
#veri alnyor. Bu bekleme esnasnda da bazen veri alnrken veri
#ortada kesilebiliyor
#bunun iin kk bir bekleme test rutini ekledim.
bekleyen=ser.in_waiting
sleep(0.1)
if ser.in_waiting != bekleyen:
sleep(0.2)
gsmRespText=ser.read(ser.in_waiting).decode('utf-8')
print("Veri: {}".format(gsmRespText))
print("------------------------\r\n")
print("Saat verisi: {}\r\n".format(zaman))
if dkEx!=dk:
print("dakika deiti.\r\n")
if len(longitude[0])>0 and len(latitude[0])>0:
veriGir(longitude[0],longitude[1],latitude[0],latitude[1],rakim,yon,kms,knot,gsmTarih,gsmSaat)
if saEx!=sa:
print("saat deiti.\r\n")
if gunEx!=gun:
print("gun deiti.\r\n")
if ayEx!=ay:
print("ay deiti.\r\n")
atGonder("AT+QGNSSRD?\r") # GNSS veri oku
atGonder("AT+CCLK?\r")
sleep(0.5)
led3.setValue(sayac%2)
#atGonder("AT+CNMI=2,1\r")
#atGonder("AT+CMGF=1\r")
#atGonder("AT+CMGD=1,4\r")
#sayac=0
ser.close()
Comments
Please log in or sign up to comment.