{"id":294,"date":"2017-10-11T01:39:50","date_gmt":"2017-10-10T22:39:50","guid":{"rendered":"https:\/\/www.neyaptik.com\/blog\/?p=294"},"modified":"2019-03-15T22:14:13","modified_gmt":"2019-03-15T19:14:13","slug":"python-ile-serial-baglantisi","status":"publish","type":"post","link":"https:\/\/www.neyaptik.com\/blog\/python-ile-serial-baglantisi\/","title":{"rendered":"Python ile Serial Ba\u011flant\u0131s\u0131"},"content":{"rendered":"<h3>Mevzumuz<\/h3>\n<p>K\u0131\u015f aylar\u0131n\u0131n gelmesiyle kombimiz i\u00e7in mobil kontroll\u00fc bir termostat+timer denemesi yapmaya karar verdim. Hem bizi \u00fc\u015f\u00fctmemeli hem de ciddi bir tasarruf sa\u011flamal\u0131 diyerek yola \u00e7\u0131kt\u0131m. \u0130lk ad\u0131m olan sens\u00f6r verilerini alma, inceleme b\u00f6l\u00fcm\u00fcn\u00fc yap\u0131yorum \u015fu anda. Elimde iki adet geli\u015ftirme kart\u0131 var. Birisi bildi\u011fimiz &#8216;Arduino Uno&#8217;, ikincisi ise daha \u00f6nce bahsetti\u011fim <a href=\"https:\/\/www.neyaptik.com\/proje\/92\/9-dolarlik-chip-bilgisayar-inceleme\">CHIP<\/a>. Chip stok olarak debian ile \u00e7al\u0131\u015f\u0131yor. Daha \u00f6nceleri yapt\u0131\u011f\u0131m denemelere g\u00f6re Chip bu projeyi tek ba\u015f\u0131na yapmakta biraz yetersiz kalacak gibiydi. Sebepleri ise basit. \u0130nternette kaynak yetersizli\u011fi, CPU&#8217;nun y\u00fckte oldu\u011fu durumlarda tutars\u0131z \u00e7\u0131k\u0131\u015f vermesi (\u00d6rne\u011fin: Servo sabit konumda durmas\u0131 gerekirken cpu y\u00fcke binince \u00e7ok fazla oynuyordu.) gibi sayabiliriz.<\/p>\n<h3>Temel S\u0131k\u0131nt\u0131lar<\/h3>\n<p>Konumuza gelirsek, olaylar\u0131 olabildi\u011fince kolayla\u015ft\u0131rabilmek ad\u0131na Py3 kullanmaya karar verdim. Raspberry Pi ile veyahut normal bir bilgisayarda sorunsuzca kullanabilirsiniz. Serial&#8217;den veri okumak ise \u015fu kadar basit:<\/p>\n<pre class=\"lang:python decode:true \">import serial\r\n\r\nard = serial.Serial()\r\nard.baudrate = 9600\r\nard.port = '\/dev\/ttyUSB0' #windows'da com1,com2 diye gitmesi laz\u0131m.\r\nard.open()\r\n\r\nwhile True:\r\n        data=ard.readline()\r\n        print (data)\r\n\r\n<\/pre>\n<p>Arduino&#8217;muzun g\u00f6nderdi\u011fini bize \u00e7\u0131kt\u0131 olarak d\u00f6nd\u00fcr\u00fcyor:<\/p>\n<pre class=\"lang:default decode:true\">root@chip:\/home\/chip# python3 read_serial.py\r\nb'Read DHT22 failed, err=101\\r\\n'\r\nb'24.80,47.40\\r\\n'\r\nb'24.80,48.60\\r\\n'\r\nb'24.80,48.60\\r\\n'\r\n.\r\n.\r\n.<\/pre>\n<p>Anlad\u0131\u011f\u0131m\u0131z \u00fczere bize verileri byte array olarak g\u00f6nderiyor. Hadi bir de T\u00fcrk\u00e7e bir \u015feyler g\u00f6ndermeyi deneyelim. Ba\u015fta normal verilen hatan\u0131n ba\u015f\u0131na \u00f6\u00e7\u011f harflerini ekledim.<\/p>\n<pre class=\"lang:default decode:true\">Arduino IDE'deki Adafruit DHT22 \u00f6rnek kodunun par\u00e7as\u0131.\r\n--------------------------------\r\nSerial.print(\"\u00f6\u00e7\u011fRead DHT22 failed, err=\"); Serial.println(err);delay(2000);\r\n<\/pre>\n<pre class=\"lang:default decode:true\">root@chip:~# python3 ard_serial.py \r\nb'\\xc3\\xb6\\xc3\\xa7\\xc4\\x9fRead DHT22 failed, err=101\\r\\n'<\/pre>\n<p>Evet. Yani verileri \u015fekildeki gibi UTF8 yolluyorsak ve bize byte geliyorsa (do\u011fal olarak gelecek tabii), \u00e7\u00f6zelim! Hemen python&#8217;un bize verdi\u011fi en b\u00fcy\u00fck avantajlardan olan decode komutunu kullan\u0131yoruz.<\/p>\n<pre class=\"lang:default decode:true\">print (data)\r\n\r\nsat\u0131r\u0131n\u0131\r\n\r\nprint (data.decode(\"UTF-8\"))\r\n\r\nolarak de\u011fi\u015ftirdik.<\/pre>\n<p>Sonu\u00e7 ise:<\/p>\n<p><span style=\"color: #808080;\"><em>*Buradan itibaren chip&#8217;de de\u011fil de laptop&#8217;umda test ediyorum. Detaylar sonda.<\/em><\/span><\/p>\n<pre class=\"lang:default decode:true \">kodbraker@lmde2 ~\/Masa\u00fcst\u00fc $ python3 ard_serial.py \r\n\u00f6\u00e7\u011fRead DHT22 failed, err=101\r\n\r\n24.10,48.70\r\n\r\n24.10,49.70\r\n\r\n24.10,49.70\r\n\r\n.\r\n.\r\n.<\/pre>\n<p>olarak geldi. Her seferinde iki sat\u0131r gelmesinin sebebi gelen verimizin sonunda zaten newline karakterinin bulunmas\u0131. Yani gelen veriyi yazd\u0131r\u0131yoruz \u00fcst\u00fcne bir de python print komutuyla newline ekliyor. Bu sorunu<\/p>\n<pre class=\"lang:default decode:true\">print (data.decode(\"UTF-8\").rstrip())<\/pre>\n<p>\u015feklinde \u00e7\u00f6zebiliriz. rstrip komutu sadece sat\u0131r sonu karakterlerini de\u011fil, ayr\u0131ca sondaki b\u00fct\u00fcn g\u00f6r\u00fcnmeyen fazlal\u0131klar\u0131 da siler. \u00d6rn. Tab, bo\u015fluk.<\/p>\n<h3>Son Hali<\/h3>\n<pre class=\"lang:default decode:true\">Kod:\r\n\r\nimport serial\r\nard = serial.Serial()\r\nard.baudrate = 9600\r\nard.port = '\/dev\/ttyUSB0'\r\nard.open()\r\nwhile True:\r\n data=ard.readline()\r\n print (data.decode(\"UTF-8\").rstrip())\r\n\r\n\u00c7\u0131kt\u0131:\r\n\r\nkodbraker@lmde2 ~\/Masa\u00fcst\u00fc $ python3 ard_serial.py \r\n\u00f6\u00e7\u011fRead DHT22 failed, err=101\r\n24.20,48.80\r\n24.20,49.80\r\n24.20,49.60\r\n.\r\n.\r\n.<\/pre>\n<h3>Kapan\u0131\u015f<\/h3>\n<p>Herhangi bir sorun kalmad\u0131\u011f\u0131na g\u00f6re, ben bu verileri MySQL&#8217;e g\u00f6nderip daha sonra inceleyebilirim. Sonraki yaz\u0131 muhtemelen bir haftal\u0131k i\u00e7-d\u0131\u015f hava s\u0131cakl\u0131\u011f\u0131 kar\u015f\u0131la\u015ft\u0131rmas\u0131 olacakt\u0131r.<\/p>\n<p><em><span style=\"color: #808080;\">*CHIP&#8217;teki debian&#8217;da san\u0131r\u0131m UTF8 problemi ya\u015fad\u0131m. locales komutunda g\u00f6rd\u00fc\u011f\u00fcm\u00fcz LC_ALL b\u00f6l\u00fcm\u00fc de\u011fi\u015ftirilmiyordu. Dolay\u0131s\u0131yla (belki de ba\u015fka sebepten) \u00e7\u0131kt\u0131 veremiyordu. UART ve SSH ile de denedim sorun devam etmekte. San\u0131r\u0131m bir ara RPi Zero almak gerek \ud83d\ude42<\/span><\/em><\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Mevzumuz K\u0131\u015f aylar\u0131n\u0131n gelmesiyle kombimiz i\u00e7in mobil kontroll\u00fc bir termostat+timer denemesi yapmaya karar verdim. Hem bizi \u00fc\u015f\u00fctmemeli hem de ciddi bir tasarruf sa\u011flamal\u0131 diyerek yola \u00e7\u0131kt\u0131m. \u0130lk ad\u0131m olan sens\u00f6r verilerini alma, inceleme b\u00f6l\u00fcm\u00fcn\u00fc yap\u0131yorum&#8230;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":295,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[105,110,128,129,115,116,121,122],"tags":[199,235,236,232,230,231,229,234,233],"_links":{"self":[{"href":"https:\/\/www.neyaptik.com\/blog\/wp-json\/wp\/v2\/posts\/294"}],"collection":[{"href":"https:\/\/www.neyaptik.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.neyaptik.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.neyaptik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.neyaptik.com\/blog\/wp-json\/wp\/v2\/comments?post=294"}],"version-history":[{"count":2,"href":"https:\/\/www.neyaptik.com\/blog\/wp-json\/wp\/v2\/posts\/294\/revisions"}],"predecessor-version":[{"id":353,"href":"https:\/\/www.neyaptik.com\/blog\/wp-json\/wp\/v2\/posts\/294\/revisions\/353"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.neyaptik.com\/blog\/wp-json\/wp\/v2\/media\/295"}],"wp:attachment":[{"href":"https:\/\/www.neyaptik.com\/blog\/wp-json\/wp\/v2\/media?parent=294"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.neyaptik.com\/blog\/wp-json\/wp\/v2\/categories?post=294"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.neyaptik.com\/blog\/wp-json\/wp\/v2\/tags?post=294"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}