Eski tartı göstergesinin RS-232 çıkışını Pi 4 GPIO’ya doğrudan bağladım, saçma karakterler geliyor
Selam, ben yazılımcıyım, donanım tarafı biraz yabancı, o yüzden saçmalıyorsam söyleyin.
Bir müşterinin depo girişinde eski bir kantar göstergesi var, arkasında DB9 RS-232 çıkışı var. Kılavuza göre her tartımda satır satır ağırlık basıyor. Amacım bunu Raspberry Pi 4 ile okuyup Hermetry’ye telemetri olarak göndermek, sonra dashboard’da günlük tonaj göstermek.
Yaptığım: DB9’un 2, 3 ve 5 numaralı pinlerini jumper kabloyla Pi’nin GPIO14 (TX), GPIO15 (RX) ve GND pinine bağladım. raspi-config’den serial’i açtım. Python’da şöyle okuyorum:
import serial
s = serial.Serial('/dev/serial0', 9600, timeout=2)
while True:
print(s.readline())
Çıktı şöyle:
b'ùæ þ'
b'ø '
b'àþ'
Hiç anlamlı bir şey yok. Bir de arada bir terminalde kendi login ekranım gibi bir şey çıkıyor, onu da anlamadım. Göstergeyi ve Pi’yi yakar mıyım diye de içim rahat değil açıkçası, gösterge çıkışında multimetreyle -9 V gibi bir şey ölçtüm.
Baud doğru mu? Göstergenin menüsünde 4800 falan olabilir.
Menüden baktım, 9600 8N1 yazıyor. Kılavuz da öyle diyor.
Baud değil, voltaj sorunu. -9 V ölçtüysen zaten cevap orada.
RS-232 sinyali yaklaşık ±3 ile ±15 V arası ve mantığı ters: boşta negatif, “1” negatif, “0” pozitif. Pi’nin UART’ı ise 3.3 V TTL, 0 ile 3.3 V arası ve düz mantık. Doğrudan bağlayınca hem seviye hem polarite yanlış, çıktıdaki çöp tam olarak bu. Üstelik GPIO15’e negatif ve 9 V civarı gerilim vermek pini öldürebilir. Hemen sök, Pi’nin hâlâ sağlam olması şans.
Bende iki depoda aynı iş var, iki yol kullandım:
1. MAX3232 modülü (MAX232 değil, 3232; 3.3 V ile çalışan). VCC’yi Pi’nin 3.3 V’una ver, TTL tarafı GPIO14/15, RS-232 tarafı DB9’a. 2. Daha temizi: USB-RS232 çevirici (PL2303 ya da FTDI çipli). /dev/ttyUSB0 olarak çıkıyor, GPIO ile hiç uğraşmıyorsun.
Login ekranı meselesi: Pi seri konsolu /dev/serial0 üzerinden açık. raspi-config > Interface > Serial Port’ta “login shell over serial” sorusuna Hayır, “serial port hardware” sorusuna Evet de.
Bir de TX/RX çaprazlaması: gösterge DCE mi DTE mi bilmiyoruz. Veri gelmezse 2 ile 3’ü yer değiştir.
Okuduktan sonra Hermetry’ye gönderme kısmı basit, paho ile access token’la v1/telemetry‘ye yayınlıyorsun:
import re, json, serial
import paho.mqtt.client as mqtt
c = mqtt.Client(client_id="kantar-1")
c.username_pw_set(TOKEN, "")
c.tls_set()
c.connect(BROKER_HOST, 8883, keepalive=60)
c.loop_start()
s = serial.Serial('/dev/ttyUSB0', 9600, timeout=2)
while True:
line = s.readline().decode('ascii', 'ignore')
m = re.search(r'(-?d+.d+)s*kg', line)
if m:
c.publish("v1/telemetry", json.dumps({"weight_kg": float(m.group(1))}), qos=1)
Regex’le sayıya çevirmesi önemli. Gösterge " 12.45 kg" gibi metin basıyorsa ve onu olduğu gibi gönderirsen Hermetry’de metin olarak kalır, grafikte çizilmez, saatlik ortalama ya da toplam da çıkmaz. Biz bir projede iki hafta metin göndermişiz, fark ettiğimizde geçmiş veri işe yaramıyordu.
Çözüldü, sağ olun.
USB-RS232 çevirici bulamadım, elektronikçiden MAX3232 modülü aldım. Bağladım, yine çöp geldi, sonra Esra’nın dediği gibi 2 ile 3’ü çaprazladım, satırlar düzgün gelmeye başladı. Seri konsolu da kapattım, login ekranı kayboldu. GPIO15 da sağlam çıktı, şanslıymışım.
Tuğba’nın notu sayesinde ilk günden weight_kg sayı olarak gidiyor, dashboard’da grafik çiziliyor.
- Bu konuyu yanıtlamak için giriş yapmış olmalısınız.
Sohbete katılın
Soru sormak ve yanıtlamak, yararlı gönderileri beğenmek ve sorununuzu çözen yanıtı işaretlemek için oturum açın. Her katkı puan ve seviye kazandırır.

