{"id":2007,"date":"2025-06-29T12:00:00","date_gmt":"2025-06-29T10:00:00","guid":{"rendered":"http:\/\/www.daniel.slask.pl\/?p=2007"},"modified":"2025-04-12T23:18:56","modified_gmt":"2025-04-12T21:18:56","slug":"uruchamianie-skryptu-pythona-w-screen-na-przykladzie-sterowania-wentylatorem-w-rpi4","status":"publish","type":"post","link":"https:\/\/daniel.slask.pl\/m\/uruchamianie-skryptu-pythona-w-screen-na-przykladzie-sterowania-wentylatorem-w-rpi4\/","title":{"rendered":"Uruchamianie skryptu pythona w screen &#8211; na przyk\u0142adzie sterowania wentylatorem w RPI4"},"content":{"rendered":"\n<p>Jaki\u015b czas temu na swojej malince nr 4 zamontowa\u0142em obudow\u0119 z wentylatorem &#8211; wentylator jest na 3piny, wi\u0119c jest mo\u017cliwo\u015b\u0107 sterowania jego obrotami. Napisa\u0142em wi\u0119c ma\u0142y skrypt (zmodyfikowa\u0142em to co znalaz\u0142em w internecie &#8211; niestety \u017ar\u00f3d\u0142a ju\u017c nie potrafi\u0119 znale\u017a\u0107) kt\u00f3ry to steruje obrotami tego wentylatora na podstawie temperatury procka. Wszystko dzia\u0142a pi\u0119knie, tylko gdy uruchomi\u0119 ponownie malink\u0119 to r\u0119cznie musz\u0119 uruchamia\u0107 ten skrypt. Wpad\u0142em wi\u0119c na pomys\u0142 aby uruchamia\u0107 go w &#8222;wirtualnej konsoli&#8221; czyli w aplikacji screen (ma\u0142a aplikacja, kt\u00f3ra umo\u017cliwia utworzenie wielu sesji konsoli). A dlaczego tak? &#8211; bo program wypluwa informacj\u0119 dot temp i obrot\u00f3w wentylatora, a tworz\u0105c us\u0142ug\u0119 nie mia\u0142bym takie \u0142atwego dost\u0119pu do tych danych.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><a href=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2025\/04\/01-2.png\"><img loading=\"lazy\" decoding=\"async\" width=\"979\" height=\"512\" src=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2025\/04\/01-2.png\" alt=\"\" class=\"wp-image-2074\" style=\"width:294px;height:auto\" srcset=\"https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2025\/04\/01-2.png 979w, https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2025\/04\/01-2-300x157.png 300w, https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2025\/04\/01-2-768x402.png 768w, https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2025\/04\/01-2-956x500.png 956w, https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2025\/04\/01-2-400x209.png 400w\" sizes=\"(max-width: 979px) 100vw, 979px\" \/><\/a><\/figure><\/div>\n\n\n<h3 class=\"wp-block-heading\">Skrypt steruj\u0105cy wentylatorem<\/h3>\n\n\n\n<p>Poni\u017cej przedstawiam skrypt do sterowania wentylatorem (niestety nie pami\u0119tam \u017ar\u00f3d\u0142a tego skryptu wi\u0119c podam tylko jego cz\u0119\u015b\u0107). Wentylator zasilany jest napi\u0119ciem 5VDC<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python line-numbers\">#!\/usr\/bin\/python\n# -*- coding: utf-8 -*-\n\nimport RPi.GPIO as GPIO\nimport time\nimport subprocess\n\n# Configuration\nFAN_PIN = 14  # BCM pin used to drive transistor's base\nWAIT_TIME = 1  # [s] Time to wait between each refresh\nFAN_MIN = 25  # [%] Fan minimum speed.\nPWM_FREQ = 50  # [Hz] Change this value if fan has strange behavior\n\n# Configurable temperature and fan speed steps\ntempSteps = [40, 70]  # [\u00b0C]\nspeedSteps = [0, 100]  # [%]\n\n# Fan speed will change only of the difference of temperature is higher than hysteresis\nhyst = 1\n\n# Setup GPIO pin\nGPIO.setmode(GPIO.BCM)\nGPIO.setup(FAN_PIN, GPIO.OUT, initial=GPIO.LOW)\nfan = GPIO.PWM(FAN_PIN, PWM_FREQ)\nfan.start(0)\n\ni = 0\ncpuTemp = 0\nfanSpeed = 0\ncpuTempOld = 0\nfanSpeedOld = 0\n\ndef PrintTemp():\n    print('CPU temperature is')\n    time.sleep(5)\n\n# We must set a speed value for each temperature step\nif len(speedSteps) != len(tempSteps):\n    print(\"Numbers of temp steps and speed steps are different\")\n    exit(0)\n\nprint('Start')\n\n<\/code><\/pre>\n\n\n\n<p> <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Uruchomienie us\u0142ugi dla screen<\/h3>\n\n\n\n<p>Tworzymy us\u0142ug\u0119 fan_start.service w katalogu systemd\/system\/ poprzez otwarcie go w edytorze a nast\u0119pnie zapisaniu.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">sudo nano \/etc\/systemd\/system\/fan.service<\/code><\/pre>\n\n\n\n<p>W us\u0142udze tej wpisujemy nast\u0119puj\u0105cy kod powoduj\u0105cy uruchomienie skryptu bash.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">[Unit]\nDescription=Test Screen Creation\nAfter=network.target\n\n[Service]\nEnvironment=\"PYTHONPATH=\/home\/daniel\/skrypty\" #gdzie znajduje si\u0119 nasz skrypt\nEnvironment=\"OTHER_VAR=value\"\nUser=daniel #u\u017cytkownik kt\u00f3ry to uruchamia\nWorkingDirectory=\/home\/daniel\/skrypty #\u015bcie\u017cka do naszych skrypt\u00f3w\nExecStart=\/usr\/bin\/screen -dmS wentylator python3 \/home\/daniel\/skrypty\/fan_ctrl.py #nasz skrypt\nType=forking\nRemainAfterExit=yes\nEnvironment=TERM=xterm\n\n[Install]\nWantedBy=multi-user.target<\/code><\/pre>\n\n\n\n<p>Us\u0142uga ta uruchamia powoduje utworzenie wirtualnej konsoli i uruchomienie w niej naszego programu.<\/p>\n\n\n\n<p>Aby sprawdzi\u0107 dzia\u0142anie skryptu w pierwszej kolejno\u015bci aktywujemy nasz\u0105 us\u0142ug\u0119 a nast\u0119pnie sprawdzamy status tej us\u0142ugi. Czasem dobrze jest zresetowa\u0107 nasz\u0105 malink\u0119.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">sudo systemctl enable fan.service\nsudo systemctl start fan.service\nsudo systemctl status fan.service<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Jaki\u015b czas temu na swojej malince nr 4 zamontowa\u0142em obudow\u0119 z wentylatorem &#8211; wentylator jest na 3piny, wi\u0119c jest mo\u017cliwo\u015b\u0107 sterowania jego obrotami. Napisa\u0142em wi\u0119c ma\u0142y skrypt (zmodyfikowa\u0142em to co znalaz\u0142em w internecie &#8211; niestety \u017ar\u00f3d\u0142a ju\u017c nie potrafi\u0119 znale\u017a\u0107)&#8230;<br \/><a class=\"read-more-button\" href=\"https:\/\/daniel.slask.pl\/m\/uruchamianie-skryptu-pythona-w-screen-na-przykladzie-sterowania-wentylatorem-w-rpi4\/\">Wi\u0119cej<\/a><\/p>\n","protected":false},"author":1,"featured_media":2075,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[23,178],"tags":[272,164,273],"views":75,"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2025\/04\/rpi-python-scaled.jpg","jetpack_shortlink":"https:\/\/wp.me\/pcPgV3-wn","_links":{"self":[{"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/posts\/2007"}],"collection":[{"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/comments?post=2007"}],"version-history":[{"count":2,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/posts\/2007\/revisions"}],"predecessor-version":[{"id":2076,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/posts\/2007\/revisions\/2076"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/media\/2075"}],"wp:attachment":[{"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/media?parent=2007"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/categories?post=2007"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/tags?post=2007"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}