質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.99%

Raspberry Pi 4 でセンサーの値をLEDへ連続表示させたい

受付中

回答 1

投稿

flag 質問者が4日前に「まだ回答を求めています」と言っています。

  • 評価
  • クリップ 0
  • VIEW 102

atupom

score 0

前提・実現したいこと

ラズベリーパイ初心者です。初めて投稿させて頂きます。
ラズパイマガジン2019年6月号の付録ボードとアマゾンで購入した付録専用キットを組み立て、Raspberry Pi 4のGPIOピンへ直接接続し、マガジンサイトから得たコード(oled_weather.py)を用いて、
温湿度気圧センサー(BME280)の値をOLEDグラフィックディスプレイ(SSD1306、128*64、0.96inch)に1秒おきに取得、表示させたい。

発生している問題・エラーメッセージ

プログラム実行中に、5回目あたりから表示が消えたり、
少しずつ表示開始位置が右へずれて反転した後、消えます。
表示フォントサイズを14から13にすると開始位置のずれは起きませんが、
やはり5回前後で表示が消え真っ黒になります。
エラーメッセージは出ません。

該当のソースコード(oled_weather.py)

import Adafruit_GPIO.SPI as SPI
import Adafruit_SSD1306
import pigpio
import time
import bme280

from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont

BME280_ADDR = 0x76
I2C_CH = 1

RST = 23
DC = 4
SPI_CH = 0
SPI_CS = 1

font_path = "/usr/share/fonts/truetype/fonts-japanese-gothic.ttf"
font_size = 14

pi = pigpio.pi()

sensor = bme280.bme280( pi, I2C_CH, BME280_ADDR )
sensor.setup()

disp = Adafruit_SSD1306.SSD1306_128_64( rst=RST, dc=DC, spi=SPI.SpiDev( SPI_CH, SPI_CS, max_speed_hz=8000000))

disp.begin()
disp.clear()
disp.display()

width = disp.width
height = disp.height
image = Image.new( '1', ( width, height ) )

jpfont = ImageFont.truetype(font_path, font_size, encoding='unic')

draw = ImageDraw.Draw( image )

while True:
    draw.rectangle( ( 0, 0, width, height ), outline=0, fill=0)

    ( temp, humi, press ) = sensor.get_value()

    draw.text( ( 2, 0 ), "温度:" + str( round( temp, 2 ) ) + "度", font=jpfont, fill=255 )
    draw.text( ( 2, 20 ), "湿度:" + str( round( humi, 2 ) ) + "%", font=jpfont, fill=255 )
    draw.text( ( 2, 40 ), "気圧:" + str( round( press, 2 ) ) + "hPa", font=jpfont, fill=255 )

    disp.image(image)
    disp.display()

    time.sleep(1)

試したこと

Thonny python IDEにて、センサーの値を取得するだけのプログラムを実行すると、
外付けモニターのShell上において、
温度、湿度、気圧の値が正しく1秒おきに無限に取得できます。

補足情報(FW/ツールのバージョンなど)

環境は以下の通りです。

お手数おかけしますが、よろしくお願いいたします。

Python 3.7.3

pi@raspberrypi:~ $ lscpu
Architecture:        armv7l
Byte Order:          Little Endian
CPU(s):              4
On-line CPU(s) list: 0-3
Thread(s) per core:  1
Core(s) per socket:  4
Socket(s):           1
Vendor ID:           ARM
Model:               3
Model name:          Cortex-A72
Stepping:            r0p3
CPU max MHz:         1500.0000
CPU min MHz:         600.0000
BogoMIPS:            108.00
Flags:               half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32

pi@raspberrypi:~ $ lsb_release -a
No LSB modules are available.
Distributor ID:    Raspbian
Description:    Raspbian GNU/Linux 10 (buster)
Release:    10
Codename:    buster

pi@raspberrypi:~ $ ls
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
2019-11-13-181758_1920x1080_scrot.png
2019-11-13-181814_1920x1080_scrot.png
2019-11-13-181817_1920x1080_scrot.png
2019-11-13-181818_1920x1080_scrot.png
2019-11-13-181819_1920x1080_scrot.png
2019-11-13-181826_1920x1080_scrot.png
2019-11-13-181834_1920x1080_scrot.png
2019.6
3.py
4inch.py
Adafruit_Python_ILI9340
Adafruit_Python_ILI9341
Adafruit_Python_SSD1306
Desktop
Documents
Downloads
LCD1602.py
MagPi
Music
Pictures
Public
SwiftyGPIO.swift
Templates
Videos
pycache
accel.py
accel1.py
bcm2835-1.60
bcm2835-1.60.tar.gz
bluebacks
bme280.py
bmx055.py
bmx055HP.py
hello.swift
ili9340spi_rpi
image.png
inch.py
init_board.py
kazue.py
key.py
lcd_i2c.py
length.py
lis3dh.py
main.swift
motion.py
motor_foward.py
motor_pwm.py
motor_reverse.py
motor_stop.py
mu_code
oled_image.py
oled_text.py
oled_weather.py
over.py
raspi1-sample.zip
source.zip
sw_led.py
sw_read.py
swift-5.1.1-armv6-RPi01234-RaspbianBuster.tgz
taijuu.py
test.swift
usr
weather.py
ラズ.py

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

+1

さいしょに:
RaspberryPi 3B を持っていながら Python は触ったことがない為、9年前に買ったまま放置しているポケットリファレンス Python(v2.6対応) や Python ドキュメント(v3.7.5) を漁った中での回答となります。


コード内の while true: 部分が while ループで説明されるように条件式が true となっており、シェルで中断するまで永久ループしているのが現状です。

標準モジュールである datetimeモジュール も活用して、ループ内の処理を1秒後まで何もしないように切り分けてcontinue する。といった方法で 1秒おきの取得、表示 ができそうに思います。

冒頭の通り、具体的なコードを示すことはできませんが、参考になればと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/12/03 09:00

    AkitoshiManabe様
    参考になりました。個人的にはグラフィックディスプレイとの相性に問題があるのかなと感じております。ご丁寧にどうもありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる