{"id":4311,"date":"2023-11-17T09:18:14","date_gmt":"2023-11-17T01:18:14","guid":{"rendered":"http:\/\/www.wangkaixuan.tech\/?p=4311"},"modified":"2023-11-17T09:42:22","modified_gmt":"2023-11-17T01:42:22","slug":"%e5%85%a5%e5%9d%91%e6%a0%91%e8%8e%93%e6%b4%be-04-oled%e5%b1%8f%e5%b9%95","status":"publish","type":"post","link":"http:\/\/www.wangkaixuan.tech\/?p=4311","title":{"rendered":"\u5165\u5751\u6811\u8393\u6d3e-04-OLED\u5c4f\u5e55"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\">1.\u70b9\u4eae\u5c4f\u5e55<\/h1>\n\n\n\n<p>OLED\u5c4f\u5e55\u6307\u7684\u662f\u8fd9\u4e2a\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"403\" height=\"450\" src=\"http:\/\/www.wangkaixuan.tech\/wp-content\/uploads\/2023\/11\/image-35.png\" alt=\"\" class=\"wp-image-4312\" srcset=\"http:\/\/www.wangkaixuan.tech\/wp-content\/uploads\/2023\/11\/image-35.png 403w, http:\/\/www.wangkaixuan.tech\/wp-content\/uploads\/2023\/11\/image-35-269x300.png 269w, http:\/\/www.wangkaixuan.tech\/wp-content\/uploads\/2023\/11\/image-35-242x270.png 242w\" sizes=\"auto, (max-width: 403px) 100vw, 403px\" \/><\/figure>\n\n\n\n<p>\u8fd9\u662f\u57570.96\u5bf8\u7684\u5355\u8272\u5c4f\u5e55\uff0c\u5206\u8fa8\u7387\u662f\uff1a128*64\uff0c\u82af\u7247\u578b\u53f7\u662fSSD1306\u3002<\/p>\n\n\n\n<p>\u5f00\u542f\u5b83\u4f9d\u7136\u9700\u8981\u542f\u7528I2C\u603b\u7ebf\u5e76\u5b89\u88c5smbus\u5e93\uff0c\u65b9\u6cd5\u5728<a href=\"http:\/\/www.wangkaixuan.tech\/?p=4272\">\u4e0a\u4e00\u7bc7\u6587\u7ae0<\/a>\u4e2d\u53ef\u4ee5\u627e\u5230\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"532\" height=\"254\" src=\"http:\/\/www.wangkaixuan.tech\/wp-content\/uploads\/2023\/11\/image-37.png\" alt=\"\" class=\"wp-image-4316\" srcset=\"http:\/\/www.wangkaixuan.tech\/wp-content\/uploads\/2023\/11\/image-37.png 532w, http:\/\/www.wangkaixuan.tech\/wp-content\/uploads\/2023\/11\/image-37-300x143.png 300w\" sizes=\"auto, (max-width: 532px) 100vw, 532px\" \/><\/figure>\n\n\n\n<p>\u4f7f\u7528i2cdetect\u547d\u4ee4\u80fd\u770b\u5230\u603b\u7ebf\u5730\u5740\uff0c\u5176\u4e2d0x3c\u5c31\u662fOLED\u5c4f\u5e55\u7684\u5730\u5740\u3002<\/p>\n\n\n\n<p>\u53e6\u5916\u8fd8\u8981\u5b89\u88c5\u4e00\u4e2a<strong>Adafruit_Python_SSD1306<\/strong>\u7684\u5e93\uff08\u4e4b\u524d\u7684\u4f8b\u7a0b\u4e2d\u5df2\u7ecf\u8fd0\u884c\u8fc7\u7684\u5c31\u4e0d\u7528\u518d\u8fd0\u884c\u4e86\uff0c\u6211\u4e5f\u4e0d\u77e5\u9053\u8fd9\u91cc\u9762\u54ea\u4e9b\u4ee3\u7801\u662f\u771f\u6b63\u6709\u7528\u7684\uff0c\u6ca1\u8bd5\uff0c\u76f4\u63a5\u5168\u90e8\u5b89\u88c5\u4e86\uff09\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>apt-get update\napt-get upgrade\npip3 install --upgrade setuptools\napt-get install python3-pip\npip3 install RPI.GPIO\npip3 install adafruit-circuitpython-ssd1306\napt-get install python3-pip\napt-get install python3-pil\ngit clone https:\/\/github.com\/adafruit\/Adafruit_CircuitPython_SSD1306.git \ncd Adafruit_CircuitPython_SSD1306-master\npython setup.py install<\/code><\/pre>\n\n\n\n<p>\u8fd0\u884c\u4e0b\u9762\u7684python\u4ee3\u7801\uff0c\u5c31\u53ef\u4ee5\u70b9\u4eae\u5c4f\u5e55\u4e86\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import time\nimport busio\nimport adafruit_ssd1306\nfrom board import SCL, SDA\nfrom PIL import Image, ImageDraw, ImageFont\n\nOLED_WIDTH  = 128\nOLED_HEIGHT = 64\n\ni2c = busio.I2C(SCL, SDA)\noled = adafruit_ssd1306.SSD1306_I2C(OLED_WIDTH, OLED_HEIGHT, i2c)\n\nwhile True:\n    oled.fill(0)\n\n    image = Image.new('1', (oled.width, oled.height))\n    draw = ImageDraw.Draw(image)\n    font = ImageFont.truetype('\/root\/board\/fonts\/Courier_New.ttf', 32)\n\n    draw.text((0, 0),  'Hello', font=font, fill=255)\n    draw.text((0, 32),  'World', font=font, fill=255)\n\n    oled.image(image)\n    oled.show()\n\n    time.sleep(1)<\/code><\/pre>\n\n\n\n<p>\u6548\u679c\u5982\u4e0b\uff08\u7531\u4e8e\u76f8\u673a\u548c\u5c4f\u5e55\u5237\u65b0\u9891\u7387\u95ee\u9898\uff0c\u62cd\u4e0d\u5168\uff09\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"612\" height=\"790\" src=\"http:\/\/www.wangkaixuan.tech\/wp-content\/uploads\/2023\/11\/image-39.png\" alt=\"\" class=\"wp-image-4319\" srcset=\"http:\/\/www.wangkaixuan.tech\/wp-content\/uploads\/2023\/11\/image-39.png 612w, http:\/\/www.wangkaixuan.tech\/wp-content\/uploads\/2023\/11\/image-39-232x300.png 232w, http:\/\/www.wangkaixuan.tech\/wp-content\/uploads\/2023\/11\/image-39-209x270.png 209w\" sizes=\"auto, (max-width: 612px) 100vw, 612px\" \/><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\">2.\u5c55\u793a\u66f4\u591a\u4fe1\u606f<\/h1>\n\n\n\n<p>\u63a5\u4e0b\u6765\u6211\u4eec\u5c31\u53ef\u4ee5\u7528\u8fd9\u5757\u5c4f\u5e55\u5c55\u793a\u4e00\u4e9b\u6709\u7528\u7684\u4fe1\u606f\u4e86\u3002<\/p>\n\n\n\n<p>\u6bd4\u5982\uff0cip\u5730\u5740\u4fe1\u606f\uff08\u4e0a\u9762\u7684\u662fwifi\u5730\u5740\uff0c\u4e0b\u9762\u7684\u662f\u6709\u7ebf\u7f51\u5361\u5730\u5740\uff09\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"444\" height=\"344\" src=\"http:\/\/www.wangkaixuan.tech\/wp-content\/uploads\/2023\/11\/image-40.png\" alt=\"\" class=\"wp-image-4322\" srcset=\"http:\/\/www.wangkaixuan.tech\/wp-content\/uploads\/2023\/11\/image-40.png 444w, http:\/\/www.wangkaixuan.tech\/wp-content\/uploads\/2023\/11\/image-40-300x232.png 300w, http:\/\/www.wangkaixuan.tech\/wp-content\/uploads\/2023\/11\/image-40-348x270.png 348w\" sizes=\"auto, (max-width: 444px) 100vw, 444px\" \/><\/figure>\n\n\n\n<p>\u65e5\u671f\u65f6\u95f4\u4fe1\u606f\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"401\" height=\"282\" src=\"http:\/\/www.wangkaixuan.tech\/wp-content\/uploads\/2023\/11\/image-41.png\" alt=\"\" class=\"wp-image-4323\" srcset=\"http:\/\/www.wangkaixuan.tech\/wp-content\/uploads\/2023\/11\/image-41.png 401w, http:\/\/www.wangkaixuan.tech\/wp-content\/uploads\/2023\/11\/image-41-300x211.png 300w, http:\/\/www.wangkaixuan.tech\/wp-content\/uploads\/2023\/11\/image-41-384x270.png 384w\" sizes=\"auto, (max-width: 401px) 100vw, 401px\" \/><\/figure>\n\n\n\n<p>\u7cfb\u7edf\u7edf\u8ba1\u4fe1\u606f\uff08CPU\u8d1f\u8f7d\u3001\u5185\u5b58\u5360\u7528\u3001\u78c1\u76d8\u5360\u7528\u3001CPU\u6e29\u5ea6\uff09<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"351\" height=\"265\" src=\"http:\/\/www.wangkaixuan.tech\/wp-content\/uploads\/2023\/11\/image-42.png\" alt=\"\" class=\"wp-image-4324\" srcset=\"http:\/\/www.wangkaixuan.tech\/wp-content\/uploads\/2023\/11\/image-42.png 351w, http:\/\/www.wangkaixuan.tech\/wp-content\/uploads\/2023\/11\/image-42-300x226.png 300w\" sizes=\"auto, (max-width: 351px) 100vw, 351px\" \/><\/figure>\n\n\n\n<p>\u73af\u5883\u6e29\u6e7f\u5ea6\u4fe1\u606f\uff08\u6e29\u5ea6\u597d\u50cf\u4e0d\u51c6\uff0c\u865a\u9ad8\uff09\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"399\" height=\"297\" src=\"http:\/\/www.wangkaixuan.tech\/wp-content\/uploads\/2023\/11\/image-43.png\" alt=\"\" class=\"wp-image-4325\" srcset=\"http:\/\/www.wangkaixuan.tech\/wp-content\/uploads\/2023\/11\/image-43.png 399w, http:\/\/www.wangkaixuan.tech\/wp-content\/uploads\/2023\/11\/image-43-300x223.png 300w, http:\/\/www.wangkaixuan.tech\/wp-content\/uploads\/2023\/11\/image-43-363x270.png 363w\" sizes=\"auto, (max-width: 399px) 100vw, 399px\" \/><\/figure>\n\n\n\n<p>\u6e29\u6e7f\u5ea6\u7684\u4f20\u611f\u5668\u662f\u8fd9\u4e2a\uff08DHT11\uff09\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"406\" height=\"480\" src=\"http:\/\/www.wangkaixuan.tech\/wp-content\/uploads\/2023\/11\/image-44.png\" alt=\"\" class=\"wp-image-4326\" srcset=\"http:\/\/www.wangkaixuan.tech\/wp-content\/uploads\/2023\/11\/image-44.png 406w, http:\/\/www.wangkaixuan.tech\/wp-content\/uploads\/2023\/11\/image-44-254x300.png 254w, http:\/\/www.wangkaixuan.tech\/wp-content\/uploads\/2023\/11\/image-44-228x270.png 228w\" sizes=\"auto, (max-width: 406px) 100vw, 406px\" \/><\/figure>\n\n\n\n<p>\u4f7f\u7528\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u9700\u8981\u5b89\u88c5\u989d\u5916\u7684\u5e93\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git clone https:\/\/github.com\/adafruit\/Adafruit_Python_DHT.git\r2. \ncd Adafruit_Python_DHT\r\npython setup.py install\r\npython3 setup.py install<\/code><\/pre>\n\n\n\n<p>CPU\u5404\u6838\u5fc3\u5b9e\u65f6\u9891\u7387\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"383\" height=\"296\" src=\"http:\/\/www.wangkaixuan.tech\/wp-content\/uploads\/2023\/11\/image-45.png\" alt=\"\" class=\"wp-image-4327\" srcset=\"http:\/\/www.wangkaixuan.tech\/wp-content\/uploads\/2023\/11\/image-45.png 383w, http:\/\/www.wangkaixuan.tech\/wp-content\/uploads\/2023\/11\/image-45-300x232.png 300w, http:\/\/www.wangkaixuan.tech\/wp-content\/uploads\/2023\/11\/image-45-349x270.png 349w\" sizes=\"auto, (max-width: 383px) 100vw, 383px\" \/><\/figure>\n\n\n\n<p>\u4ee3\u7801\u5982\u4e0b\uff08\u5404\u4e2a\u5c4f\u5e55\u6eda\u52a8\u5c55\u793a\uff09\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import sys\nimport time\n\nimport socket\nimport fcntl\nimport struct\nimport board\nimport busio\nimport subprocess\n\nimport Adafruit_DHT\nimport adafruit_ssd1306\n\nfrom board import SCL, SDA\nfrom PIL import Image, ImageDraw, ImageFont\n\nfont_cn = ImageFont.truetype('\/root\/board\/fonts\/\u5fae\u8f6f\u96c5\u9ed1.ttf', 14)\nfont_en = ImageFont.truetype('\/root\/board\/fonts\/Courier_New.ttf', 14)\n\ndef get_ip_address(ifname):\n    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)\n    return socket.inet_ntoa(fcntl.ioctl(\n        s.fileno(),\n        0x8915,  # SIOCGIFADDR\n        struct.pack('256s', str.encode(ifname&#91;:15]))\n    )&#91;20:24])\n\ndef show_screen_ip():\n    oled.fill(0)\n    WIFIADDR = \"\"\n    WIREADDR = \"\"\n    try:\n        WIFIADDR += get_ip_address('wlan0')\n    except IOError:\n        WIFIADDR += \"0.0.0.0\"\n    try:\n        WIREADDR += get_ip_address('eth0')\n    except IOError:\n        WIREADDR += \"0.0.0.0\"\n    image = Image.new('1', (oled.width, oled.height))\n    draw = ImageDraw.Draw(image)\n    draw.text((0, 10), WIFIADDR, font=font_en, fill=255)\n    draw.text((0, 30), WIREADDR, font=font_en, fill=255)\n    oled.image(image)\n    oled.show()\n\ndef show_screen_time():\n    oled.fill(0)\n    image = Image.new('1', (oled.width, oled.height))\n    draw = ImageDraw.Draw(image)\n    draw.text((0, 0),  time.strftime(\"%A\"), font=font_en, fill=255)\n    draw.text((0, 20), time.strftime(\"%Y-%m-%d\"), font=font_en, fill=255)\n    draw.text((0, 40), time.strftime(\"%X\"), font=font_en, fill=255)\n    oled.image(image)\n    oled.show()\n\ndef show_screen_stats():\n    oled.fill(0)\n    image = Image.new('1', (oled.width, oled.height))\n    draw = ImageDraw.Draw(image)\n\n    cmd = \"top -bn1 | grep load | awk '{printf \\\"%.2f\\\", $(NF-2)}'\"\n    cpustr = subprocess.check_output(cmd, shell=True).decode(\"utf-8\")\n    cmd = \"free -m | awk 'NR==2{printf \\\"%s MB\\\", $3 }'\"\n    memstr = subprocess.check_output(cmd, shell=True).decode(\"utf-8\")\n    cmd = \"df -h | awk '$NF==\\\"\/\\\"{printf \\\"%d GB\\\", $3}'\"\n    diskstr = subprocess.check_output(cmd, shell=True).decode(\"utf-8\")\n    cmd = \"expr `cat \/sys\/class\/thermal\/thermal_zone0\/temp` \/ 1000\"\n    tempstr = subprocess.check_output(cmd, shell=True).decode(\"utf-8\")\n\n    draw.text((0, 0),  \"CPU: \" + cpustr, font=font_en, fill=255)\n    draw.text((0, 14), \"MEM: \" + memstr, font=font_en, fill=255)\n    draw.text((0, 28), \"DSK: \" + diskstr, font=font_en, fill=255)\n    draw.text((0, 44), \"TMP: \" + tempstr, font=font_en, fill=255)\n\n    oled.image(image)\n    oled.show()\n\ndef show_screen_climate():\n    oled.fill(0)\n    image = Image.new('1', (oled.width, oled.height))\n    draw = ImageDraw.Draw(image)\n\n    humistr, tempstr = Adafruit_DHT.read_retry(Adafruit_DHT.DHT11, 4)\n\n    draw.text((0, 0),  '\u6e29\u5ea6 : {0:0.1f}\u5ea6'.format(tempstr), font=font_cn, fill=255)\n    draw.text((0, 20), '\u6e7f\u5ea6 : {0:0.1f}%'.format(humistr), font=font_cn, fill=255)\n\n    oled.image(image)\n    oled.show()\n\ndef show_screen_cpufreq():\n    oled.fill(0)\n    image = Image.new('1', (oled.width, oled.height))\n    draw = ImageDraw.Draw(image)\n\n    cmd = \"expr `cat \/sys\/devices\/system\/cpu\/cpu0\/cpufreq\/scaling_cur_freq` \/ 1000\"\n    cpu0str = subprocess.check_output(cmd, shell=True).decode(\"utf-8\")\n    cmd = \"expr `cat \/sys\/devices\/system\/cpu\/cpu1\/cpufreq\/scaling_cur_freq` \/ 1000\"\n    cpu1str = subprocess.check_output(cmd, shell=True).decode(\"utf-8\")\n    cmd = \"expr `cat \/sys\/devices\/system\/cpu\/cpu2\/cpufreq\/scaling_cur_freq` \/ 1000\"\n    cpu2str = subprocess.check_output(cmd, shell=True).decode(\"utf-8\")\n    cmd = \"expr `cat \/sys\/devices\/system\/cpu\/cpu3\/cpufreq\/scaling_cur_freq` \/ 1000\"\n    cpu3str = subprocess.check_output(cmd, shell=True).decode(\"utf-8\")\n\n    draw.text((0, 0),   \"CPU0 : \" + cpu0str, font=font_en, fill=255)\n    draw.text((0, 15),  \"CPU1 : \" + cpu1str, font=font_en, fill=255)\n    draw.text((0, 30),  \"CPU2 : \" + cpu2str, font=font_en, fill=255)\n    draw.text((0, 45),  \"CPU3 : \" + cpu3str, font=font_en, fill=255)\n\n    oled.image(image)\n    oled.show()\n\ni2c = busio.I2C(SCL, SDA)\noled = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c)\n\nwhile True:\n    # ip\u5730\u5740\n    show_screen_ip()\n    time.sleep(2)\n    # \u65f6\u95f4\n    show_screen_time()\n    time.sleep(2)\n    # \u7edf\u8ba1\u4fe1\u606f\n    show_screen_stats()\n    time.sleep(2)\n    # \u73af\u5883\u4fe1\u606f\n    show_screen_climate()\n    time.sleep(2)\n    # CPU\u9891\u7387\n    show_screen_cpufreq()\n    time.sleep(2)<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>1.\u70b9\u4eae\u5c4f\u5e55 OLED\u5c4f\u5e55\u6307\u7684\u662f\u8fd9\u4e2a\uff1a \u8fd9\u662f\u57570.96\u5bf8\u7684\u5355\u8272\u5c4f\u5e55\uff0c\u5206\u8fa8\u7387\u662f\uff1a128*64\uff0c\u82af\u7247\u578b\u53f7\u662fSSD1306\u3002 \u5f00\u542f\u5b83\u4f9d\u7136\u9700\u8981\u542f\u7528I2C\u603b\u7ebf\u5e76\u5b89\u88c5smb&#8230;<\/p>\n<p class=\"read-more\"><a class=\"btn btn-default\" href=\"http:\/\/www.wangkaixuan.tech\/?p=4311\"> Read More<span class=\"screen-reader-text\">  Read More<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17],"tags":[],"class_list":["post-4311","post","type-post","status-publish","format-standard","hentry","category-03-01-"],"_links":{"self":[{"href":"http:\/\/www.wangkaixuan.tech\/index.php?rest_route=\/wp\/v2\/posts\/4311","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.wangkaixuan.tech\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.wangkaixuan.tech\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.wangkaixuan.tech\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/www.wangkaixuan.tech\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4311"}],"version-history":[{"count":0,"href":"http:\/\/www.wangkaixuan.tech\/index.php?rest_route=\/wp\/v2\/posts\/4311\/revisions"}],"wp:attachment":[{"href":"http:\/\/www.wangkaixuan.tech\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4311"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.wangkaixuan.tech\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4311"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.wangkaixuan.tech\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4311"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}