Picproje Elektronik Sitesi

PROGRAMLAMA DİLLERİ => Python => Konuyu başlatan: fide - 22 Mart 2019, 10:12:02

Başlık: Python hakkında kısa kısa notlar
Gönderen: fide - 22 Mart 2019, 10:12:02
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
Başlık: Ynt: Python hakkında kısa kısa notlar
Gönderen: fide - 22 Mart 2019, 19:44:43
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
Başlık: Ynt: Python hakkında kısa kısa notlar
Gönderen: fide - 23 Mart 2019, 06:31:54
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)
Başlık: Ynt: Python hakkında kısa kısa notlar
Gönderen: fide - 23 Mart 2019, 06:36:20
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")
Başlık: Ynt: Python hakkında kısa kısa notlar
Gönderen: fide - 23 Mart 2019, 06:39:21
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()

Başlık: Ynt: Python hakkında kısa kısa notlar
Gönderen: fide - 25 Mart 2019, 09:22:19
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)
Başlık: Ynt: Python hakkında kısa kısa notlar
Gönderen: fide - 25 Mart 2019, 09:29:50
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()
Başlık: Ynt: Python hakkında kısa kısa notlar
Gönderen: fide - 06 Ocak 2020, 10:34:31
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/ (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.


Başlık: Ynt: Python hakkında kısa kısa notlar
Gönderen: fide - 06 Ocak 2020, 14:30:03
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/ (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))
Başlık: Ynt: Python hakkında kısa kısa notlar
Gönderen: fide - 18 Şubat 2020, 19:43:28
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://docs.python.org/3/library/collections.html#collections.namedtuple)

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

https://www.geeksforgeeks.org/namedtuple-in-python/ (https://www.geeksforgeeks.org/namedtuple-in-python/)
Başlık: Ynt: Python hakkında kısa kısa notlar
Gönderen: fide - 23 Şubat 2020, 20:54:20
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.
Başlık: Ynt: Python hakkında kısa kısa notlar
Gönderen: fide - 25 Nisan 2020, 21:33:17
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