Python ile Serial Bağlantısı

Mevzumuz

Kış aylarının gelmesiyle kombimiz için mobil kontrollü bir termostat+timer denemesi yapmaya karar verdim. Hem bizi üşütmemeli hem de ciddi bir tasarruf sağlamalı diyerek yola çıktım. İlk adım olan sensör verilerini alma, inceleme bölümünü yapıyorum şu anda. Elimde iki adet geliştirme kartı var. Birisi bildiğimiz ‘Arduino Uno’, ikincisi ise daha önce bahsettiğim CHIP. Chip stok olarak debian ile çalışıyor. Daha önceleri yaptığım denemelere göre Chip bu projeyi tek başına yapmakta biraz yetersiz kalacak gibiydi. Sebepleri ise basit. İnternette kaynak yetersizliği, CPU’nun yükte olduğu durumlarda tutarsız çıkış vermesi (Örneğin: Servo sabit konumda durması gerekirken cpu yüke binince çok fazla oynuyordu.) gibi sayabiliriz.

Temel Sıkıntılar

Konumuza gelirsek, olayları olabildiğince kolaylaştırabilmek adına Py3 kullanmaya karar verdim. Raspberry Pi ile veyahut normal bir bilgisayarda sorunsuzca kullanabilirsiniz. Serial’den veri okumak ise şu kadar basit:

import serial

ard = serial.Serial()
ard.baudrate = 9600
ard.port = '/dev/ttyUSB0' #windows'da com1,com2 diye gitmesi lazım.
ard.open()

while True:
        data=ard.readline()
        print (data)

Arduino’muzun gönderdiğini bize çıktı olarak döndürüyor:

root@chip:/home/chip# python3 read_serial.py
b'Read DHT22 failed, err=101\r\n'
b'24.80,47.40\r\n'
b'24.80,48.60\r\n'
b'24.80,48.60\r\n'
.
.
.

Anladığımız üzere bize verileri byte array olarak gönderiyor. Hadi bir de Türkçe bir şeyler göndermeyi deneyelim. Başta normal verilen hatanın başına öçğ harflerini ekledim.

Arduino IDE'deki Adafruit DHT22 örnek kodunun parçası.
--------------------------------
Serial.print("öçğRead DHT22 failed, err="); Serial.println(err);delay(2000);
root@chip:~# python3 ard_serial.py 
b'\xc3\xb6\xc3\xa7\xc4\x9fRead DHT22 failed, err=101\r\n'

Evet. Yani verileri şekildeki gibi UTF8 yolluyorsak ve bize byte geliyorsa (doğal olarak gelecek tabii), çözelim! Hemen python’un bize verdiği en büyük avantajlardan olan decode komutunu kullanıyoruz.

print (data)

satırını

print (data.decode("UTF-8"))

olarak değiştirdik.

Sonuç ise:

*Buradan itibaren chip’de değil de laptop’umda test ediyorum. Detaylar sonda.

kodbraker@lmde2 ~/Masaüstü $ python3 ard_serial.py 
öçğRead DHT22 failed, err=101

24.10,48.70

24.10,49.70

24.10,49.70

.
.
.

olarak geldi. Her seferinde iki satır gelmesinin sebebi gelen verimizin sonunda zaten newline karakterinin bulunması. Yani gelen veriyi yazdırıyoruz üstüne bir de python print komutuyla newline ekliyor. Bu sorunu

print (data.decode("UTF-8").rstrip())

şeklinde çözebiliriz. rstrip komutu sadece satır sonu karakterlerini değil, ayrıca sondaki bütün görünmeyen fazlalıkları da siler. Örn. Tab, boşluk.

Son Hali

Kod:

import serial
ard = serial.Serial()
ard.baudrate = 9600
ard.port = '/dev/ttyUSB0'
ard.open()
while True:
 data=ard.readline()
 print (data.decode("UTF-8").rstrip())

Çıktı:

kodbraker@lmde2 ~/Masaüstü $ python3 ard_serial.py 
öçğRead DHT22 failed, err=101
24.20,48.80
24.20,49.80
24.20,49.60
.
.
.

Kapanış

Herhangi bir sorun kalmadığına göre, ben bu verileri MySQL’e gönderip daha sonra inceleyebilirim. Sonraki yazı muhtemelen bir haftalık iç-dış hava sıcaklığı karşılaştırması olacaktır.

*CHIP’teki debian’da sanırım UTF8 problemi yaşadım. locales komutunda gördüğümüz LC_ALL bölümü değiştirilmiyordu. Dolayısıyla (belki de başka sebepten) çıktı veremiyordu. UART ve SSH ile de denedim sorun devam etmekte. Sanırım bir ara RPi Zero almak gerek 🙂

Be the first to comment on "Python ile Serial Bağlantısı"

Leave a comment

Your email address will not be published.


*