Python hakkında kısa kısa notlar

Başlatan fide, 22 Mart 2019, 10:12:02

fide

Arkadaşlar okulda kullanmak için hazırladığım python çalışma notlarını paylaşıyorum.
içinde başlangıç seviyesinden veritabanı ve dosya okuma yazma işlemlerine kadar kısa kısa notlar var.

https://drive.google.com/file/d/1vndDvc25Jf0jbSOFhql1txHVckJkGuzW/view?usp=sharing
https://drive.google.com/file/d/17BoFyXDCtaUuFG2HE-79GzXqGTCwjYuO/view?usp=sharing
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

fide

#1
Serial port erişimi için bunu kullanıyorum.
#gsm modül iletişim seri portu
import serial

ser=serial.Serial()
ser.baudrate=115200
ser.port='/dev/ttyS1'        # windows için  com2 comvb olacak
ser.open()
sleep(0.1)
Veri almak kontrol etmek ve yazmak için de aşağıdaki komutlar kullanılıyor.
ser.inwaiting --> seri port bufferda bekleyen veri miktarını verir.

ser.read() ile istenen byte kadar veri okuma  yapılıyor.

ser.read(ser.inwaiting)  komutuyla da bekleyen verinin tamamı okunur.

komut="AT\r"
ser.write(komut.encode('utf-8')) ile seri port veri gönderme yapılıyor
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

fide

urllib kütüphanesiyle dosya indirme işlemi

import urllib.request

req = urllib.request.Request('http://httpbin.org')
with urllib.request.urlopen(req) as response:
	the_page = response.read().decode('utf-8')
	print ("req Stat:{}\r\n".format(req.status))

dosya=open("/home/site.html","w")
print(the_page,file=dosya,flush=True)
dosya.close()
print("dosyaya yazdim")
#print(the_page)
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

fide

SQlite veritabanı ile işlemlerin fonksiyona dökülmüş hali

#kütüphane import
import sqlite3
import os
dbFile="/home/arts/db/dbArts.sqlite"
# dosya yolunu kendi projenizde değiştirin


Veritabanı dosyası var mı kontrol et
def dbKontrol():
	dosyaMevcut=os.path.exists(dbFile)
	if not dosyaMevcut:
		dbOlustur()
	else:
		print("db dosyası var.\r\n")
Veritabanı dosyası ve tabloları oluştur
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")
Veritabanına veri ekle
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("Veritabanına eklendi")
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

fide

Veritabanınadan sorgu yap

def sorgula():
	global veri
	with db.connect(dbFile) as vt:
		im=vt.cursor()
		sorguText="select * from ogrenci"
		#sorguText="""INSERT INTO 
		#ogrenci(adi,soyadi,ogrNo,sinif) 
		#values('{}','{}','{}','{}') """.format(adi,soyadi,ogrNo,sinif)
		#print (sorguText)
		im.execute(sorguText)
		veri=im.fetchall()
		vt.commit()
		
		#print("veriler: {}".format(veri))

parametrik sorgu yap
def paramSorgu(adi,soyadi,ogrNo,sinif):
	global veri
	with db.connect(dbFile) as vt:
		im=vt.cursor()
		#sorguText="""select * from ogrenci where adi like'%{}%'""".format(adi)
		if adi!="":
			sorguText="""select * from ogrenci where adi='{}'""".format(adi)
		if soyadi!="":
			sorguText="""select * from ogrenci where soyadi='{}'""".format(soyadi)
		if ogrNo!="":
			sorguText="""select * from ogrenci where ogrNo='{}'""".format(ogrNo)
		if sinif!="":
			sorguText="""select * from ogrenci where sinif='{}'""".format(sinif)
		
		if adi=="" and soyadi=="" and ogrNo=="" and sinif=="":
			sorguText="""select * from ogrenci"""
		#sorguText="""INSERT INTO 
		#ogrenci(adi,soyadi,ogrNo,sinif) 
		#values('{}','{}','{}','{}') """.format(adi,soyadi,ogrNo,sinif)
		#print (sorguText)
		im.execute(sorguText)
		veri=im.fetchall()
		vt.commit()
		if len(veri)==0:
			return "Sorgu Sonucu Boş"
		else:
			return veri
		#print("veriler: {}".format(veri))
parametreye dayalı veri sil
def paramSil(adi):
	global veri
	with db.connect(dbFile) as vt:
		im=vt.cursor()
		sorguText="""delete from ogrenci where adi='{}'""".format(adi)
		im.execute(sorguText)
		
		vt.commit()
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

fide

#5
Omega2+ ve GM862 GSM modül ile girilen lokasyonu google maps linki şeklinde SMS atan Python uygulaması

from time import sleep
import onionGpio
import serial


# define pins
pinLed=0 
pinGsmBoot=3
pinGsmPwrCtl=2

# 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

gpsText=""
gsmRespText=""
bekleyen=0

dummyText=""


#_freegpio
#onionGpio._freegpio(pinLed)
#onionGpio._freegpio(pinGsmBoot)
#onionGpio._freegpio(pinGsmPwrCtl)

# pin tanımlama ve konfigürasyonu
led= onionGpio.OnionGpio(pinLed)
gsmBoot= onionGpio.OnionGpio(pinGsmBoot)
gsmPwrCtl= onionGpio.OnionGpio(pinGsmPwrCtl)

# pin direction
led.setOutputDirection(ON)	#led için çıkış
gsmBoot.setOutputDirection(OFF) #gsmBoot için çıkış
gsmPwrCtl.setInputDirection() #gsmPwrCtl için giriş olarak ayarlandı

def gsmBootProc():
	gsmPwrState= int(gsmPwrCtl.getValue())
	#print(type(gsmPwrCtl))
	print("Gsm Power:{}\r\n".format(gsmPwrState))
	if gsmPwrState==1:
		print("Gsm zaten acik\r\n")
	else:
		led.setValue(OFF)	# işaret ver
		gsmBoot.setValue(ON)
		sleep(1)
		gsmBoot.setValue(OFF)
		sleep(5)
		
		print("Gsm Boot\r\n")
	led.setValue(ON)	# işaret ver
def smsGonder(num,text):
	if "+90" in num:
		numType=145
	else:
		numType=129
		
	komut="AT+CMGS={},{}\r".format(num,numType)		# SMS göndermek için başla
	ser.write(komut.encode('utf-8'))
	sleep(3)
	if ser.in_waiting>0:					# > gelirse
		gsmRespText=ser.read(ser.in_waiting).decode('utf-8')
		print("gsmRespText: {} \r\n".format(gsmRespText))
						
	if bigger in gsmRespText: 	
		
		ser.write(text.encode('utf-8'))
		ser.write(bckspc)
	

def atGonder(komut):
	
	if komut.startswith("AT+CPIN="): #komut pin girme ise komutu göndermeden önce pin durumu sorgusu yap 
		atPin="AT+CPIN?\r"			# eğer pin girilmedi ise gir, girildi ise pass geç
		ser.write(atPin.encode('utf-8'))
		sleep(0.5)
		gsmRespText=ser.read(ser.in_waiting).decode('utf-8')
		if "+CPIN: SIM PIN" in gsmRespText:	# eğer SIM PIN dönerse
			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 işi 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 modül açık. bu durumda tekrar pin girme
			print("Pin zaten girilmiş\r\n")
			#break
	elif "AT#MONI" in komut:	#eğer komut "AT#MONI\r" ise
		sayac=0
		while(True):	#Burda sonsuz döngü ile ya bağlanana ya da deneme sayısı aşılana kadar dön
			print("{}\r\n Sayac{}\r\n ".format(komut,sayac))		#komutu yazdır
			sayac=sayac+1
			ser.write(komut.encode('utf-8'))
			sleep(2)
			gsmRespText=ser.read(ser.in_waiting).decode('utf-8')			
			print("{}\r\nSayac:{}".format(gsmRespText,sayac))	# bulduğunu ve sayacı yazdır
			if (sayac>tryOut) or ("BSIC:" in gsmRespText): #Eğer cevap "OK" döndü ise (bu ileride GPSACP gibisonunda bir de OK döndüren komutlarda sıkıntı olabilir.)
				print("MONI: out\r\n")				#tamamsa çık (modül değişince burası da değişecek)
				break
		
	else:		# eğer komut CPIN ve MONI komutu değilse normal işleme devam et			
	
		print(komut+"\r\n")		#komutu yazdır
		ser.write(komut.encode('utf-8'))
		sleep(1)
		gsmRespText=ser.read(ser.in_waiting).decode('utf-8')	
		if "OK" in gsmRespText:  #Eğer cevap "OK" döndü ise (bu ileride GPSACP gibisonunda bir de OK döndüren komutlarda sıkıntı olabilir.)
			pass
			#break
		
#-----------------başlıyoruz ------------------
# terminal seri portu 
terminal=serial.Serial()
terminal.baudrate=115200
terminal.port='/dev/ttyS0'
terminal.open()

gsmBootProc()
#sm modül iletişim seri portu
ser=serial.Serial()
ser.baudrate=115200
ser.port='/dev/ttyS1'
ser.open()

sayac=0

	
atGonder("AT\r")
atGonder("AT+CPIN=3711\r")
atGonder("AT#MONI\r")
atGonder("AT+CNMI=2,1\r")
atGonder("AT+CMGF=1\r")
atGonder("AT+CMGD=1,4\r")
#atGonder("""AT+CMGL="REC UNREAD"\r""") 

while(True):
	print("sayac: {}\r\n".format(sayac))
	sayac=sayac+1
	if terminal.in_waiting>0:
		break

	#led.setValue(OFF)
	
	if ser.in_waiting>4:	# eğer veri varsa al ve değerlendir.
		#seriporttan veri gelirken kesme oluşmadığı için bekleme yaparak 
		#veri alınıyor. Bu bekleme esnasında da bazen veri alınırken veri 
		#ortada kesilebiliyor
		#bunun için küçük 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("gsmRespText:{}\r\n".format(gsmRespText))
	smsKoordinat="Konum: https://www.google.com.tr/maps/place/{}.{}{}+{}.{}{}".format(10,22222,"N",33,15255,"E")
	
	smsGonder("+90505xxxxxxx",smsKoordinat)
	sleep(15)
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

fide

#6
SMS ile led yak / söndür / blink ve google maps linki şeklinde gönderen python uygulaması

Telit GM862  ve Omega2+ üzerinde geliştirildi.


#! /usr/bin/env python
# -*- coding: UTF-8 -*-
#Bismillahirrahmanirrahim
from time import sleep
import onionGpio
import serial
import sqlite3 as db
import os


# define pins
pinLed=0 
pinGsmBoot=3
pinGsmPwrCtl=2

# 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

# tanımlar
dbFile="/home/arts/db/dbArts.sqlite"
gpsText=""
gsmRespText=""
bekleyen=0
# saat ve tarih tanımları
sa=0
dk=0
san=0
gun=0
ay=0
yil=0
dkEx=0

dummyText=""

saat=""
enlem=""
boylam=""
rakim=0
yon=0
hiz=0
tarih=""
uydu=0

#_freegpio
#onionGpio._freegpio(pinLed)
#onionGpio._freegpio(pinGsmBoot)
#onionGpio._freegpio(pinGsmPwrCtl)

# pin tanımlama ve konfigürasyonu
led= onionGpio.OnionGpio(pinLed)
gsmBoot= onionGpio.OnionGpio(pinGsmBoot)
gsmPwrCtl= onionGpio.OnionGpio(pinGsmPwrCtl)

# pin direction
led.setOutputDirection(ON)	#led için çıkış
gsmBoot.setOutputDirection(OFF) #gsmBoot için çıkış
gsmPwrCtl.setInputDirection() #gsmPwrCtl için giriş olarak ayarlandı

#fonksiyonlar
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, enlem VARCHAR(25),boylam VARCHAR(25), rakim  REAL, yon REAL,hiz 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 gsmBootProc():
	gsmPwrState= int(gsmPwrCtl.getValue())
	#print(type(gsmPwrCtl))
	print("Gsm Power:{}\r\n".format(gsmPwrState))
	if gsmPwrState==1:
		print("Gsm zaten acik\r\n")
	else:
		led.setValue(OFF)	# işaret ver
		gsmBoot.setValue(ON)
		sleep(1)
		gsmBoot.setValue(OFF)
		sleep(5)
		
		print("Gsm Boot\r\n")
	led.setValue(ON)	# işaret ver
def smsGonder(num,text):
	if "+9" in num:
		numType=145
	else:
		numType=129
		
	komut="AT+CMGS={},{}\r".format(num,numType)		# SMS göndermek için başla
	ser.write(komut.encode('utf-8'))
	sleep(3)
	if ser.in_waiting>0:					# > gelirse
		gsmRespText=ser.read(ser.in_waiting).decode('utf-8')
		print("gsmRespText: {} \r\n".format(gsmRespText))
						
	if bigger in gsmRespText: 	
		
		ser.write(text.encode('utf-8'))
		ser.write(bckspc)
	

def dbKontrol():
	dosyaMevcut=os.path.exists(dbFile)
	if not dosyaMevcut:
		dbOlustur()
	else:
		print("db dosyası var.\r\n")

def atGonder(komut):
	
	if komut.startswith("AT+CPIN="): #komut pin girme ise komutu göndermeden önce pin durumu sorgusu yap 
		atPin="AT+CPIN?\r"			# eğer pin girilmedi ise gir, girildi ise pass geç
		ser.write(atPin.encode('utf-8'))
		sleep(0.5)
		gsmRespText=ser.read(ser.in_waiting).decode('utf-8')
		if "+CPIN: SIM PIN" in gsmRespText:	# eğer SIM PIN dönerse
			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 işi 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 modül açık. bu durumda tekrar pin girme
			print("Pin zaten girilmiş\r\n")
			#break
	elif "AT#MONI" in komut:	#eğer komut "AT#MONI\r" ise
		sayac=0
		while(True):	#Burda sonsuz döngü ile ya bağlanana ya da deneme sayısı aşılana kadar dön
			print("{}\r\n Sayac{}\r\n ".format(komut,sayac))		#komutu yazdır
			sayac=sayac+1
			ser.write(komut.encode('utf-8'))
			sleep(2)
			gsmRespText=ser.read(ser.in_waiting).decode('utf-8')			
			print("{}\r\nSayac:{}".format(gsmRespText,sayac))	# bulduğunu ve sayacı yazdır
			if (sayac>tryOut) or ("BSIC:" in gsmRespText): #Eğer cevap "OK" döndü ise (bu ileride GPSACP gibisonunda bir de OK döndüren komutlarda sıkıntı olabilir.)
				print("MONI: out\r\n")				#tamamsa çık (modül değişince burası da değişecek)
				break
		
	else:		# eğer komut CPIN ve MONI komutu değilse normal işleme devam et			
	
		print(komut+"\r\n")		#komutu yazdır
		ser.write(komut.encode('utf-8'))
		sleep(1)
		gsmRespText=ser.read(ser.in_waiting).decode('utf-8')	
		if "OK" in gsmRespText:  #Eğer cevap "OK" döndü ise (bu ileride GPSACP gibisonunda bir de OK döndüren komutlarda sıkıntı olabilir.)
			pass
			#break
		
#-----------------başlıyoruz ------------------
dbKontrol() #veritabanı var kontrol et yoksa oluştur varsa aşağıda bağlan
# terminal seri portu 
terminal=serial.Serial()
terminal.baudrate=115200
terminal.port='/dev/ttyS0'
terminal.open()

gsmBootProc()
#sm modül iletişim seri portu
ser=serial.Serial()
ser.baudrate=115200
ser.port='/dev/ttyS1'
ser.open()

sayac=0

	
atGonder("AT\r")
atGonder("AT+CPIN=3711\r")
atGonder("AT#MONI\r")
atGonder("AT+CNMI=2,1\r")
atGonder("AT+CMGF=1\r")
atGonder("AT+CMGD=1,4\r")
#atGonder("""AT+CMGL="REC UNREAD"\r""") 

while(True):
	print("sayac: {}\r\n".format(sayac))
	sayac=sayac+1
	if terminal.in_waiting>0:
		break

	#led.setValue(OFF)
	
	if ser.in_waiting>4:	# eğer veri varsa al ve değerlendir.
		#seriporttan veri gelirken kesme oluşmadığı için bekleme yaparak 
		#veri alınıyor. Bu bekleme esnasında da bazen veri alınırken veri 
		#ortada kesilebiliyor
		#bunun için küçük 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("gsmRespText:{}\r\n".format(gsmRespText))
		#gelen veri üzerinde çalış
		#SMS bildirimi gelince SMS okumak için komut ver
		if "+CMTI:" in gsmRespText:
			print("+CMTI: {}\r\n".format(gsmRespText))
			komut="""AT+CMGL="REC UNREAD"\r"""
			ser.write(komut.encode('utf-8'))
		#gelen SMS i okuma komutu
		if "+CMGL:" in gsmRespText:
			#yeni SMS metnini aldım 
			#gerekli işlemleri yaptıktan sonra SMSi sil, simm kart hafızası dolmasın
			print("SMS:{}\r\n".format(gsmRespText))
			#gelen SMSi parçala ve bildir
			# gelen veri: :b'\r\n+CMGL:  20,"REC UNREAD","+90505xxxxxxxxx"\r\nABCDEFG\r\nOK\r\n'
			
			smsRecvText=gsmRespText[gsmRespText.find("+"):]
			smsTextList=list(smsRecvText.split("\r\n"))
			for i in smsTextList:
				print("smsTextlist:{}\r\n".format(i))
			#Çıktılar:
			#b'\r\n+CMGL:  20
			#"REC UNREAD"
			#"+90505xxxxxxx"\r\nABCDEFG\r\nOK\r\n
			
			smsTelNumList=smsTextList[0].split(",")
			for i in smsTelNumList:
				print ("smsTelNumList:{}\r\n".format(i))
				
			telNum=smsTelNumList[2].replace('"','')
			
			print("Telefon:{}\r\n".format(telNum))
			
			smsBody=smsTextList[1]
			print("smsBody:{}--\r\n".format(smsBody))
			#artık SMS ve telefon ile istediğimi yapabilirim.
			smsComm=["On","Off","Blink","Sms"]
			if smsBody in smsComm:
				#eğer gelen SMS ON OFF blink ise
				if "On" in smsBody:	
					led.setValue(ON)
				if "Off" in smsBody:
					led.setValue(OFF)
				if "Blink" in smsBody:
					for ii in range(25):
						sleep(0.2)
						led.setValue(ii%2)
		
				if "Sms" in smsBody:
					#smsGonder("+90505xxxxxxxx","SMS test for Python")
					#smsKoordinat="e:{}, b:{}, y:{}, h:{}".format(enlem,boylam,yon,hiz)
					#google koordinatlara çevir
					
										
					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)]

					smsKoordinat="Konum: https://www.google.com.tr/maps/place/{}.{}{}+{}.{}{}".format(en_der,en_str,en_pol,boy_der,boy_str,boy_pol)
											
					smsGonder(telNum,smsKoordinat)
					sleep(10)
				#gelen komut için bu komut mu? karşılaştırması koy ve gelen text istenen uzunlukta mı bak	
		if ( ("$GPSACP") in gsmRespText) and (len(gsmRespText)>85): # gelen veri $GPSACP ve 80 karakterden uzunsa
			#eğer gps cümlesinin önünde başka bir komutun cevabı gelirse bölmek sıkıntı oluşturuyor
			#bunun için $GPSACP: konumu alınıp onunla işlem yapılıyor.
		
			gpsText=gsmRespText[gsmRespText.find("$"):]	
			params=list(gpsText.split(","))
			saat=params[0]
			saat=saat[saat.find(":")+2:saat.find(":")+8]
			#saat=saat[8:len(saat)]
			enlem=params[1]
			boylam=params[2]
			rakim=float(params[4])
			yon=round(float(params[6]))
			hiz=round(float(params[7]))
			tarih=params[9]
			uydu=int(params[10][:2])
			#bulduklarını yazdır
			#print( "saat: {}\r\n".format(saat))
			#print( "enlem: {}\r\n".format(enlem))
			#print( "boylam: {}\r\n".format(boylam))
			#print( "rakım: {}\r\n".format(rakim))
			#print( "yön: {}\r\n".format(yon))
			#print( "hiz: {}\r\n".format(hiz))
			#print( "tarih: {}\r\n".format(tarih))
			#print( "uydu: {}\r\n".format(uydu))
			
			dkEx=dk
			#sleep(1)
			# zaman ifadelerini çek
			sa=int(saat[0:2])
			dk=int(saat[2:4])
			san=int(saat[4:6])
			#tarih ifadelerini çek
			gun=int(tarih[0:2])
			ay=int(tarih[2:4])
			yil=int(tarih[4:6])
			
			print("Tarih ve Saat {}/{}/{} {}:{}:{}\r\n".format(gun,ay,yil,sa,dk,san))
			
			# dakika değişiminde çalış
			if dk!=dkEx: 
				#bulduklarını veritabanına yazdır
				
				with db.connect(dbFile) as vt:
					im=vt.cursor()
					sorguText="""INSERT INTO action(enlem,boylam,rakim,yon,hiz,tarih,saat) VALUES("{}","{}","{}","{}","{}","{}","{}")""".format(enlem,boylam,rakim,yon,hiz,tarih,saat)
					#print (sorguText)
					im.execute(sorguText)
					vt.commit()
					print("Veritabanına eklendi")
			
	# gönderilecek komutları buraya gir.
	#sonra bir süre beklet
	#Sonra komut içindeki tüm texti yukarıda ayıklasın
	
	
	komut="AT$GPSACP\r"
	ser.write(komut.encode('utf-8'))
	sleep(0.5)
	
	
	
ser.close()
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

fide

Omega2 üzerinde gpio uygulaması ile ilgili daha önce küçük bir paylaşım yapmıştım ama kendi forumunda Omega2 ile ilgili periphery yada raspberry pi kütüphaneyi kullanın gibi bir yazı okudum.

https://pypi.org/project/python-periphery/

periphery kütüphanesi yukarıdaki linkten indirilebilir.

GPIO yanında Seri port, SPI, I2C, PWM vb kütüphaneleri de içeriyor.

GPIO Kontrol:

16 ve 17 nolu pinler çıkış olarak tanımlandı.

pinA=16
pinB=17


ledA= GPIO("/dev/gpiochip0", pinA, "out")
ledB= GPIO("/dev/gpiochip0", pinB, "out")



for i in range(20):
	
	ledA.write(True)
	ledB.write(False)
	sleep(0.1)
	ledA.write(False)
	ledB.write(True)
	sleep(0.1)

ledA.close()
ledB.close()

Write komutu ile yak / söndür, read komutu ile (pin giriş olarak ayarlanmak şartı ile) pin seviyesi okuması yapılabiliyor.


Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

fide

Kullanılan ağ bağlantısının MAC adresini almak.

Eğer aynı cihazdan birden fazla kullanıp cihazlara id numarası vermeniz gerekirse MAC adresini alıp bunu id olarak verebilirsiniz. ::ok  ::ok

Kütüphane bu adreste. Kulanım  örnekleri de var.
https://pypi.org/project/getmac/
import getmac


def main():
    print(getmac.get_mac_address(interface="eth0"))
    print(getmac.get_mac_address(interface="Ethernet 3"))
    print(getmac.get_mac_address(ip="10.0.0.1"))
    print(getmac.get_mac_address(hostname="localhost"))
    print(getmac.get_mac_address(ip="10.0.0.1", network_request=True))
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

fide

NamedTuple
Python dilinde namdtuple isimli bir yapı var. Bu yapı kullandığınız sözlüğe istediğiniz sayıda değişken eklemenizi ve değişkenlere verdiğiniz isimle ulaşmanızı sağlıyor.

kullanabilmek için collections içinden import etmeniz gerekiyor.

from collections import namedtuple

önce kullanmak istediğimiz yapıya ait değişkenleri belirleyip isim veriyoruz.

Point = namedtuple('Point', ['x', 'y'])

Point isminde bir namedtuple değişken tanımladık. namedtuple içindeki Point kullanacağımız değişken, x ve y ise çağıracağımız değişkenler.

sonraki adım
p = Point(33,22)

print(p.x)
print(p.y)
print(p.x-p.y)


Kullanım örneği:
cmd=namedtuple('cmd', ['cmdText','timeout','responses'])

at=cmd("AT\r",100,["OK","ERROR"])                     #AT
atE0=cmd("ATE0\r",100,["OK","ERROR"])                 #Command Echo
atGSN=cmd("AT+GSN\r",100,["OK","ERROR"])              # GSM Module Serial Number
...

serial.write(at.cmdText.encode("utf-8"))

sleep(at.timeout/10)

if x in at.responses:
    do something

kaynak:
https://docs.python.org/3/library/collections.html#collections.namedtuple

https://pymotw.com/2/collections/namedtuple.html

https://www.geeksforgeeks.org/namedtuple-in-python/
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

fide

#10
Bir önceki yazıda namedtuple isimli yapılardan bahsetmiştim.
namedtuple isminden de anlaşılacağı gibi yapı içindeki öğelere ismi ile ulaşmanızı sağlıyor.

Özellikle gsm modül gibi birçok farklı komut ve parametreye sahip cihazlarla haberleşmek için komutlara ait verileri tutmak için bir yapı ihtiyacım vardı.
namedtuple bunu bir anlamda çözdü ama yeni problem ortaya çıktı.

at=cmd("AT\r",100,["OK","ERROR"])                    #AT
atE0=cmd("ATE0\r",100,["OK","ERROR"])                #Command Echo
atGSN=cmd("AT+GSN\r",100,["OK","ERROR"])              # GSM Module Serial Number

yukarıdaki yapı ile 3 adet komut tanımladım. bunlara at.timeout yada at.cmdText ile rahat bir şekilde ulaşabiliyorum. Ben komut ismini parametre olarak vermek istiyorum ama problem şu her tanımladığım komutu kullanmak için komut ismini yazmam gerekiyor. Komut ismini paramtre olarak vermem için ya namedtuple sınıfının öğelerine erişmem gerek yada tanımladığım komutların isimlerini teker teker başka bir listede tutmam gerek.
Python ve namedtuple ile araştırma yaparken bir komut ile karşılaştım.
modname = globals()['__name__']
modobj = sys.modules[modname]
Bu komut tanımladığınız bir öğeye parametre gibi ulaşmanızı sağlıyor.

Örnek verecek olursak a değişkeni var.
import sys

a=[1,2,3,4]
modname = globals()['__name__']
modobj = sys.modules[modname]
print(getattr(modobj,"a"))

yukarıdaki kodları incelediğimizde yapılan işi şu şekilde açıklayabiliriz. (hatalı olabilirim) Python içindeki globals değişkeni içindeki a değişkenini bul ve içeriğini al.

Buraya kadar a değişkeni benim işime çok yaramıyor ama a değişkeni yerine namedtuple ile tanımladığım yapıyı koyunca işler değişiyor.

at=cmd("AT\r",100,["OK","ERROR"])                    #AT
atE0=cmd("ATE0\r",100,["OK","ERROR"])                #Command Echo
atGSN=cmd("AT+GSN\r",100,["OK","ERROR"]) 
 
yukarıda tanımladığım değişkenlere a listesine uyguladığım işlemi uygularsam istediğim şekilde çağırma ve parametre olarak verme şansım var.

from collections import namedtuple
import sys

cmd=namedtuple('cmd', ['cmdText','timeout','responses'])


at=cmd("AT\r",100,["OK","ERROR"])                    #AT
atE0=cmd("ATE0\r",100,["OK","ERROR"])                #Command Echo
atGSN=cmd("AT+GSN\r",100,["OK","ERROR"])              # GSM Module Serial Number

def atGonder(cmd):
    modname = globals()['__name__']
    modobj = sys.modules[modname]
    print(getattr(modobj,cmd).cmdText)
    
atGonder("atE0")

Burada listeyi asıl oluşturmak istememein sebebi birçok komutta standart olarak farklı bulunan değişkenleri tek bir yapıda toplamaktı. Örneğin ATD komutu için timeout 150sn, olası cevaplar "NO CARRIER", "CONNECT", "ERROR" gibi bunu yukarıdali ATE0 komutu yada atGSN komutu ile aynı yapıda tutabiliyorum.
Komutu göndermek için ise
atGonder("atE0")
yazmam yeterli.
atGonder fonksiyonu içinde artık ister timeout kontrol ederim ister responses'a bakarım yada cmdText ile seri porta komut yazarım. Tamamen programcıya kalmış.

Eğer bu yapıyı namedtuple ile tanımlamış olsaydım:
print(at.cmdText) şeklinde kullanmak zorunda kalacak ve bunu bir fonksiyona parametre olarak gönderemeyecektim. Bu açıdan parametre olarak gönderebilmek benim için çok önemli.

Bu komut yapısı sayesinde omega2+ yada raspberry pi üzerinde çalışacak bir gsm modül kontrol library geliştiriyorum. Bitirince burada paylaşmayı planlıyorum.
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

fide

Tanımlamamnın güzelliğine bakar mısınız?

pins = [machine.Pin(i, machine.Pin.IN) for i in (0, 2, 4, 5, 12, 13, 14, 15)]

Bu kod ne kadar ESP32 micropython için yazılmış olsa da 8 adet pini bir defada tanımlayıp kullanmak için yazılmış güzel bir kod.

kodun açık hali:
pins=[machine.Pin(0, machine.Pin.IN),machine.Pin(2, machine.Pin.IN),machine.Pin(4, machine.Pin.IN),machine.Pin(5, machine.Pin.IN),machine.Pin(12, machine.Pin.IN),machine.Pin(13, machine.Pin.IN),machine.Pin(14, machine.Pin.IN),machine.Pin(15, machine.Pin.IN)]

pin tanımlarken bile fonksiyon yazılabiliyor.  ::op  ::op

Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com