もがき系プログラマの日常

もがき系エンジニアの勉強したこと、日常のこと、気になっている技術、備忘録などを紹介するブログです。

Symfony5を試してみた

はじめに

こんにちは。

この記事はSymfony Advent Calendar 2019 24日目の記事です。

昨日は@ringtail003さんのSymfony4+ で Server-Sent events を使ってみようでした。

直近ではLaravelを触っており、SymfonyはAdvent Calendarを書くときだけ触っています。

なので1年ぶりなので完全に忘れています。

ちなみに去年のAdvent CalendarはSymfony4でNelmioApiDocBundleを試してみたという記事を書いています。

今回は先月Symfony5がリリースされたので、インストールして試してみようと思います。

こちらの記事をみるに、新規機能はなく不具合の修正が中心とのことです。

なので、今回やることはSymfony4でも再現できるものだと思います。

では早速始めます。

参考サイト

本題

インストール

以下のコマンドでインストールしてみます。

$ composer create-project symfony/website-skeleton sample_project
$ ./bin/console -V
Symfony 5.0.2 (env: dev, debug: true)

5.0.2入りました。

参考サイトで紹介されている通り、ローカルサーバを立てる用のコマンドを入れたいのでインストールします。

$ composer req server

[InvalidArgumentException]                                                    
Could not find package symfony/web-server-bundle in a version matching 5.0.*  

5系ではまだ使えないようでした...

しょうがないのでphpコマンドで行きます。

$ php -S localhost:8080 -t public
PHP 7.3.8 Development Server started at Tue Dec 24 01:14:16 2019
Listening on http://localhost:8080
Document root is /Users/yudai_fujita/projects/study/php/symfony/sample_project
Press Ctrl-C to quit.

f:id:kojirooooocks:20191224023743p:plain

入りました。

CRUD作成

試しに簡単なCRUDをつくってみます。 コマンドは以下

$ ./bin/console make:crud

ただ、Entityを先に作る必要があるので、適当に作っておきます。

$ php bin/console make:entity SampleUser

 created: src/Entity/SampleUser.php
 created: src/Repository/SampleUserRepository.php

Entityは以下です。

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\SampleUserRepository")
 */
class SampleUser
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\GeneratedValue()
     * @ORM\Column(type="string", length=128)
     */
    private $name;

    /**
     * @ORM\GeneratedValue()
     * @ORM\Column(type="string", length=255)
     */
    private $email;

    /**
     * @ORM\Column(type="text")
     */
    private $description;

    public function getId(): ?int
    {
        return $this->id;
    }
}

作成したEntityからマイグレショーンファイルを作成します。

$ php bin/console doctrine:migrations:diff
Generated new migration class to "/Users/yudai_fujita/projects/study/php/symfony/sample_project/src/Migrations/Version20191223164904.php"

To run just this migration for testing purposes, you can use migrations:execute --up 20191223164904

To revert the migration you can use migrations:execute --down 20191223164904

出来たマイグレーションファイルを流し込みます。

$ php bin/console doctrine:migrations:migrate
                                                              
                    Application Migrations                    
                                                              

WARNING! You are about to execute a database migration that could result in schema changes and data loss. Are you sure you wish to continue? (y/n)y
Migrating up to 20191223164904 from 0

  ++ migrating 20191223164904

     -> CREATE TABLE sample_user (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(128) NOT NULL, email VARCHAR(255) NOT NULL, description LONGTEXT NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB

  ++ migrated (took 221.3ms, used 20M memory)

  ------------------------

  ++ finished in 268.5ms
  ++ used 20M memory
  ++ 1 migrations executed
  ++ 1 sql queries
——

色々詳細が出てるのがいいなぁ。

とか思いつつ、やっとCRUD作成コマンドを実行します。

$ ./bin/console make:crud SampleUser

 created: src/Controller/SampleUserController.php
 created: src/Form/SampleUserType.php
 created: templates/sample_user/_delete_form.html.twig
 created: templates/sample_user/_form.html.twig
 created: templates/sample_user/edit.html.twig
 created: templates/sample_user/index.html.twig
 created: templates/sample_user/new.html.twig
 created: templates/sample_user/show.html.twig

           
  Success! 
           

 Next: Check your new CRUD by going to /sample/user/

出来たみたいです。 CRUD画面にアクセスしてみます。

f:id:kojirooooocks:20191224023809p:plain

出来てます!

さっそくデータを作ってみようと Create New をクリックすると

f:id:kojirooooocks:20191224023822p:plain

エラー。

Entityで用意したプロパティにSetter/Getterを追加してませんでした。。。

追加すると問題なく新規作成ができました。

修正も問題ありません。

f:id:kojirooooocks:20191224023907p:plain

EasyAdminBundle導入

せっかくなので、なんらかのBundleを入れてみようと思ったのですが、まだ5系対応されてないのが多かったです。。。 調べるとEasyAdminBundleは5系対応されていたので、入れてみました。

インストールは以下

$ composer require easycorp/easyadmin-bundle
Using version ^2.3 for easycorp/easyadmin-bundle
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Restricting packages listed in "symfony/symfony" to "5.0.*"

Prefetching 2 packages 🎵 💨
  - Downloading (100%) 

Package operations: 2 installs, 0 updates, 0 removals
  - Installing pagerfanta/pagerfanta (v2.1.3): Loading from cache
  - Installing easycorp/easyadmin-bundle (v2.3.4): Loading from cache
Writing lock file
Generating autoload files
ocramius/package-versions: Generating version class...
ocramius/package-versions: ...done generating version class
Symfony operations: 1 recipe (c89d68f6646119e76a9f3a281a2b655c)
  - Configuring easycorp/easyadmin-bundle (>=2.0): From github.com/symfony/recipes:master
Executing script cache:clear [OK]
Executing script assets:install public [OK]

Some files may have been created or updated to configure your new packages.
Please review, edit and commit them: these files are yours.

次に、 設定ファイルを修正します。

config/packages/easy_admin.yaml

easy_admin:
    entities:
        - App\Entity\SampleUser

とりあえず最低限これで設定は終わりなので、 /admin にアクセスしてみます。

f:id:kojirooooocks:20191224024028p:plain

バッチリ入りました。

Image from Gyazo

いい感じです。

本来はもっと細かく設定ができるのですが、今回は試すだけなので一旦ここまでで。

終わりに

こんな感じの簡単なお試しブログになりましたが、以上です。

冒頭でも書いたのですが、基本的に Advent Calendarを書く年末だけにしか触らないので、来年はもう少し触れたらと思っています。

一個Bundleのネタもあるので、作れたらなと。

ラストは @cube_3110さんの記事です!

よろしくおねがいします!

リモートワークして2年以上たった

はじめに

こんにちは。

この記事は、テレワーク・リモートワークAdvent Calendar 2019の15日目の記事です。

adventar.org

自分がリモートワークを始めて2年2ヶ月が経過しました。

なぜ正確に覚えているかというと、子供が生まれたタイミングで自宅でのリモートワークをし始めたからです。

あんなに小さかった子供も現在は2歳になり、今はイヤイヤ期の真っ最中。何をするのも「アー!」と叫んでおります。

さて、そんな感じで自分が切り替えたように、子供ができたことでリモートワークを考える人は多いと思います。

今回は子供のためにリモートワークに切り替えたことが実際に良かったのかどうかを簡単に振り返ってみたいと思います。

当然ですが前提として、自分の子供の話なので全子供に該当するわけではありません。

本題

実際にリモートワークがよかったかどうかというと、半分半分といったところです。

自分の子供の場合でいうと、0ヶ月〜24ヶ月すべての期間で必要だったかというとおそらく答えはNOでした。

当然必要な期間はありましたが、すべての期間で家にいたほうがいいという感じでもありませんでした。

自宅リモートワークをやっててよかったと思った期間

  • 0ヶ月〜6ヶ月

    子供のケアはもちろん、奥さんも産後でナイーブになっているため、一緒にいてあげて話を聞いてあげることが大事だった。(できていたかどうかは明言しません...)

  • 24ヶ月〜

    今現在イヤイヤ期で、子供が体格もいいこともあり、奥さん一人では静止しきれない場面などもあるため。

自宅リモートワークがキツイなと思った期間

  • 24ヶ月〜

    とんでもなく大騒ぎしているので、なかなか昼間は集中できない。

とまぁこんな感じで、今まさにキツイ期間で、奥さんと交代交代で相手をしたりしているので、完全に昼夜逆転の仕事をしています。

自宅リモートワークをやっててよかったこと

また期間という切り口ではなく、やっててよかったことも羅列してみます。

  • 煮詰まったときに子供の顔を見ると元気になる

    自分的にはこれが一番ありがたいです。リフレッシュも出来るし、癒やしにもなります。

  • プレ幼稚園などの送迎を手伝ってバス代を節約できる

    幼稚園代って結構するんですよね...。少しでも自宅で作業させてもらっていれば、そのへんも手伝って節約することができます。

おわりに

このような感じで、いい事だらけではない自宅でのリモートワークですが、平日の仕事の合間に子供と遊んだり、仕事しながらも子供の成長を間近でみることができるのはとてもありがたいです。

直近ではお仕事を頂いているので、自宅でのリモートを続けることになりますが、今後常駐に切り替わるのかは不明です。

できれば、子供が幼稚園に入る再来年くらいまではリモートを続けられたらなと思っています。

php系の案件ありましたら連絡お待ちしております!

f:id:kojirooooocks:20191202032722j:plain

ラズパイ カメラで撮影してみた!

はじめに

こんにちは。

この記事は Kojirock1一人 Advent Calendar 2019の11日目の記事です。

adventar.org

今回も、事前に買った初心者キットに入っていたものを使いながら色々遊んでみます。

今回はついに念願のカメラを使ってみます。

こちらの参考記事を拝見しながら、実際にやってみました。

raspi-wannabe.com

接続自体は簡単だったのですが、ひと悶着ありました。

やってみた

ラズパイ側の設定は最初に終わっているので、つなぐところからやりました。

f:id:kojirooooocks:20191208032711j:plain

f:id:kojirooooocks:20191208032722j:plain

静止画撮影

以下のコマンドを実行します。

$ raspistill -o test.jpg
mmal: Cannot read camera info, keeping the defaults for OV5647
mmal: mmal_vc_component_create: failed to create component 'vc.ril.camera' (1:ENOMEM)
mmal: mmal_component_create_core: could not create component 'vc.ril.camera' (1)
mmal: Failed to create camera component
mmal: main: Failed to create camera component
mmal: Camera is not detected. Please check carefully the camera module is installed correctly

むむ。 参考サイトであれば、これで撮影できるはず...

カメラの設定やってると思ってたけど、やってなかったかな?と raspi-config を実行して確認してみます。

f:id:kojirooooocks:20191208033101p:plain

やはりenabledになっていました。

エラー文言で探すと以下の情報が。

PiCam異常時の現象 | Research

接続の問題...?

なんか嫌な予感

とりあえず以下のコマンドでそもそも検出されているかどうかも確認します。

$ vcgencmd get_camera
supported=1 detected=0

検出されていない。。。

ケーブルの接続をし直したり、再起動したりどうやっても、最初に上げたエラーのままでした。

藁にもすがる思いで、 raspi-config で出てくるアップデートをしてみます。

f:id:kojirooooocks:20191208033505p:plain

そして、検出チェック...

$ vcgencmd get_camera
supported=1 detected=1

きました!!

実際に撮影してみます!

$ raspistill -o test.jpg

$ ll test.jpg 
-rw-r--r-- 1 pi pi 3668114 12月  8 03:32 test.jpg

できてました!

さっとく取得して撮影具合を見てみます。

f:id:kojirooooocks:20191208034038j:plain

無事にデブ活をしている、うちの猫(こじろう)を撮影することができました!!!

動画撮影

次は参考サイトでも書かれている通り動画も撮影してみます。

すでにカメラモジュールは検出済みなので、コマンドを打てば動きます。

$ raspivid -o test.h264

$ ls -la test.h264 
-rw-r--r-- 1 pi pi 10033476 128 03:41 test.h264

作成されました! 次にmp4に変換します。そのためにgpacというツールをインストールします。

$ sudo  apt-get install gpac -y
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
  gpac-modules-base libfreenect0.5 libgpac4
以下のパッケージが新たにインストールされます:
  gpac gpac-modules-base libfreenect0.5 libgpac4
アップグレード: 0 個、新規インストール: 4 個、削除: 0 個、保留: 111 個。
1,787 kB のアーカイブを取得する必要があります。
この操作後に追加で 5,340 kB のディスク容量が消費されます。
取得:1 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libgpac4 armhf 0.5.2-426-gc5ad4e4+dfsg5-5 [1,287 kB]
取得:2 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf libfreenect0.5 armhf 1:0.5.3-1 [38.2 kB]
取得:3 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf gpac-modules-base armhf 0.5.2-426-gc5ad4e4+dfsg5-5 [200 kB]
取得:4 http://ftp.jaist.ac.jp/pub/Linux/raspbian-archive/raspbian buster/main armhf gpac armhf 0.5.2-426-gc5ad4e4+dfsg5-5 [262 kB]
1,787 kB を 3秒 で取得しました (674 kB/s)
以前に未選択のパッケージ libgpac4:armhf を選択しています。
(データベースを読み込んでいます ... 現在 161131 個のファイルとディレクトリがインストールされています。)
.../libgpac4_0.5.2-426-gc5ad4e4+dfsg5-5_armhf.deb を展開する準備をしています ...
libgpac4:armhf (0.5.2-426-gc5ad4e4+dfsg5-5) を展開しています...
以前に未選択のパッケージ libfreenect0.5:armhf を選択しています。
.../libfreenect0.5_1%3a0.5.3-1_armhf.deb を展開する準備をしています ...
libfreenect0.5:armhf (1:0.5.3-1) を展開しています...
以前に未選択のパッケージ gpac-modules-base:armhf を選択しています。
.../gpac-modules-base_0.5.2-426-gc5ad4e4+dfsg5-5_armhf.deb を展開する準備をしています ...
gpac-modules-base:armhf (0.5.2-426-gc5ad4e4+dfsg5-5) を展開しています...
以前に未選択のパッケージ gpac を選択しています。
.../gpac_0.5.2-426-gc5ad4e4+dfsg5-5_armhf.deb を展開する準備をしています ...
gpac (0.5.2-426-gc5ad4e4+dfsg5-5) を展開しています...
libfreenect0.5:armhf (1:0.5.3-1) を設定しています ...
libgpac4:armhf (0.5.2-426-gc5ad4e4+dfsg5-5) を設定しています ...
gpac-modules-base:armhf (0.5.2-426-gc5ad4e4+dfsg5-5) を設定しています ...
gpac (0.5.2-426-gc5ad4e4+dfsg5-5) を設定しています ...
man-db (2.8.5-2) のトリガを処理しています ...
libc-bin (2.28-10+rpi1) のトリガを処理しています ...

その後以下のコマンドで変換を実行します。

$ MP4Box -fps 30 -add test.h264 test.mp4
AVC-H264 import - frame size 1920 x 1080 at 30.000 FPS
AVC Import results: 146 samples - Slices: 3 I 143 P 0 B - 0 SEI - 3 IDR
Saving to test.mp4: 0.500 secs Interleaving

$ ls -la test.mp4 
-rw-r--r-- 1 pi pi 10034938 12月  8 03:43 test.mp4

Image from Gyazo

デブ活をみられたこじろうの逆襲ドアップ動画がとれました!

終わりに

一時はどうなるかと思いましたが、なんとかなりましたw

やっぱカメラ楽しいですね!

もうちょい色々としたいのですが、ラズパイの記事は今回で終了になります。

次からはアプリの記事を予定してますが、仕事が忙しくなって、そもそも記事をあげられない可能性ありです...

現場からは以上です。

ラズパイ DHT11で温湿度を表示してみた

はじめに

こんにちは。

この記事は Kojirock1一人 Advent Calendar 2019の10日目の記事です。

adventar.org

今回も、事前に買った初心者キットに入っていたものを使いながら色々遊んでみます。

今回はDHT11モジュールという温湿度を図れるもの使ってみます。

こちらの参考記事を見つけましたので、再現してみようと思います。

qiita.com

やってみた

つなぎ方は参考サイトに乗せていただいているものと一緒です。

f:id:kojirooooocks:20191201025452j:plain

f:id:kojirooooocks:20191201025508j:plain

f:id:kojirooooocks:20191201025528j:plain

スクリプト

参考サイトのものを使用させてもらっています。

# coding: UTF-8
# RaspberryPiでDHT11センサーから温湿度データを取得

import time
import dht11
import RPi.GPIO as GPIO

#定義
#GPIO 14 as DHT11 data pin
Temp_sensor=14

#温湿度データ取得
def get_temp():

    GPIO.setwarnings(False)
    GPIO.setmode(GPIO.BCM)

    instance = dht11.DHT11(pin=Temp_sensor)

    while True:
        #データ取得
        result = instance.read()
        return result.temperature,result.humidity

if __name__ == '__main__':
    try:
        while True:
            #温湿度データ取得
            temperature,humidity = get_temp()

            #画面出力
            if temperature == 0:
                continue
            print("Temperature = ",temperature,"C"," Humidity = ",humidity,"%")

            #指定された秒数スリープ
            time.sleep(5)

    except:
        pass

実際に動かしてみました

表示されました!

終わりに

最初は以下の参考記事で再現しようと思っていましたが、例のごとく購入した初心者キットにはいっていたDHT11moduleは 三脚のもので、以下の参考記事とは合致しなかったです。

qiita.com

こういう温度・湿度取れるのはいいですね。 稼働しっぱなしなるかもですが、赤ちゃんがいる部屋を監視して適切な温度・湿度を保つようにとかできそう。

てゆかそういうのはもうあるか...w

現場からは以上です。

ラズパイ I2C LCDで日本語を表示してみた

はじめに

こんにちは。

この記事は Kojirock1一人 Advent Calendar 2019の9日目の記事です。

adventar.org

今回も、事前に買った初心者キットに入っていたものを使いながら色々遊んでみます。

前回の記事で I2C LCDで文字を表示してみました。

今回は日本語を表示してみます。

参考記事を見つけましたので、再現してみようと思います。

terutakke.com

やってみた

つなぎ方は以前の記事と同様です。

f:id:kojirooooocks:20191123043611j:plain

スクリプト

前回のスクリプトの表示部分を変えています。

text1 = u'コンニチワ!'
text2 = u'RasberryPi デス'
text1 = text1.encode('shift-jis')
text2 = text2.encode('shift-jis')

lcd_string(text1, LCD_LINE_1)
lcd_string(text2, LCD_LINE_2)

実際に動かしてみました!

f:id:kojirooooocks:20191126042315j:plain

表示されました!

これって漢字は表示できるのかな?と思ったので、以下のようにスクリプトを編集しました。

text1 = u'コンニチワ!'
text2 = u'埼玉にいるよ'
text1 = text1.encode('shift-jis')
text2 = text2.encode('shift-jis')

lcd_string(text1, LCD_LINE_1)
lcd_string(text2, LCD_LINE_2)

f:id:kojirooooocks:20191126042428j:plain

できませんでした。。。

終わりに

以下のサイトのようにFontをインストールしてゴニョゴニョすればいけるっぽい記事があったので、やってみたのですが、自分ではできませんでした...

一瞬誓っと光るだけで、文字は表示されませんでした。

kinokorori.hatenablog.com

仕事が忙しくなってきたので、今回はこれですいません。。。

現場からは以上です。

write-blog-every-week2回目のアドベントカレンダー

はじめに

こんにちは。

この記事は『write-blog-every-week』のアドベントカレンダー8日目の記事です。

adventar.org

WBEWは今年1周年を迎えました。

なので、今年は2回目のアドベントカレンダーです。

2年目となる今年、若干のメンバーの減少がありながらも、皆さん精力的にブログを書いています。

ちなみに自分の去年のアドベントカレンダー関連記事は以下。

kojirooooocks.hatenablog.com

kojirooooocks.hatenablog.com

kojirooooocks.hatenablog.com

本題

今回の自分の記事では、自分の1年のwbewへの振り返りを行いたいと思います。

よかったところ(Keep)

1. 今年も継続することができた。

病気になったり、仕事がとても忙しくなったり、あとは引っ越しをしたりで、危うく退会寸前まで行きましたが、なんとか続けることができました。

代わりに筋トレとかが全く続かなかったりで、その他が微妙でした...

2. オンライン輪読会が楽しかった。

WBEWではないですが、別のチームでも一緒に活動している @tada_infraさん @kdnaktさんとオンライン輪読会をすることができて、とても勉強になりました。

プライベート・仕事が忙しく、時々抜けてしまう時がありましたが、なんとか完走することができました。

3. ブログにするためにOSSへの貢献が増えた。

普通逆だろって感じですが、OSS貢献へのいいキッカケになりました。

これは来年も積極的に行っていこうと思います。

4. 2回目のアドベントカレンダーを作ることができた。

1年の振り返りでも書きましたが、去年に引き続き、二回目を開催することができました。

ただ、メンバーが純減しているので全部埋まってはいませんが...

まぁ新規メンバーを募集していないのでしょうがないかw

反省すべきところ(Problem)

1. 基本的にブログの質が低水準になった

忙しくなったというのが主な原因ですが、三分の一くらいは、これでもいいか。みたいな、やっつけ感が出てきてしまいました。

どうしても日に追われて書いてしまうことが多くなってたのが原因です。

来年からは1週間の計画をきちんと立てて行動しようと思います。

今後やってみたいこと(Try)

1. 1週間も落とさずかきあげたい。

ルールとして2週連続で書けなければ退会というルールなので、つまり1週書けなくてもセーフになります。

そのルールに甘えて、1週書けなかったときが何度もありました。

毎週書くというチームなので、来年こそは毎週書きたいなと思います。

終わりに

こんな形で、今年の振り返りは以上です。

前年度のアドベントカレンダーでも同じことを言ってますが、やはり書き続けることがとにかく大事です。

WBEWを始める前、僕は本当に継続力のない三日坊主常習犯のダメなやつでした。

そんな僕でも1年間続けることができたんです。

もし参加したい・継続力をつけたいという意欲のある方は、twitterでDMくれれば、招待させていただきます !!

さぁ。来年も頑張るぞ!

ラズパイ I2C LCDで文字を表示してみた

はじめに

こんにちは。

この記事は Kojirock1一人 Advent Calendar 2019の8日目の記事です。

adventar.org

今回も、事前に買った初心者キットに入っていたものを使いながら色々遊んでみます。

今回はI2C LCDというやつを使ってみます。

こちらは、比較的色々と参考記事があったので以下のサイトを参考に再現してみます。

terutakke.com

やってみた

早速つなげてみました。

f:id:kojirooooocks:20191123043611j:plain

コードは参考サイトのものをコピーさせていただき、少し修正を行いました。

バスと、アドレスは 以下のコードで事前に調べています。

コマンド

$ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- 27 -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --            

スクリプト

# -*- coding: utf-8 -*-
#!/usr/bin/python
from time import sleep
from time import gmtime, strftime
import datetime
import smbus

#initialize GPIO
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.cleanup()

I2C_ADDR  = 0x27
LCD_WIDTH = 16
LCD_CHR = 1
LCD_CMD = 0
LCD_LINE_1 = 0x80
LCD_LINE_2 = 0xC0
LCD_BACKLIGHT  = 0x08
ENABLE = 0b00000100
E_PULSE = 0.0005
E_DELAY = 0.0005
bus = smbus.SMBus(1) # Rev 2 Pi uses 1

def lcd_init():
  # Initialise display
  lcd_byte(0x33,LCD_CMD) # 110011 Initialise
  lcd_byte(0x32,LCD_CMD) # 110010 Initialise
  lcd_byte(0x06,LCD_CMD) # 000110 Cursor move direction
  lcd_byte(0x0C,LCD_CMD) # 001100 Display On,Cursor Off, Blink Off
  lcd_byte(0x28,LCD_CMD) # 101000 Data length, number of lines, font size
  lcd_byte(0x01,LCD_CMD) # 000001 Clear display
  sleep(E_DELAY)

def lcd_byte(bits, mode):
  bits_high = mode | (bits & 0xF0) | LCD_BACKLIGHT
  bits_low = mode | ((bits<<4) & 0xF0) | LCD_BACKLIGHT

  # High bits
  bus.write_byte(I2C_ADDR, bits_high)
  lcd_toggle_enable(bits_high)

  # Low bits
  bus.write_byte(I2C_ADDR, bits_low)
  lcd_toggle_enable(bits_low)

def lcd_toggle_enable(bits):
  sleep(E_DELAY)
  bus.write_byte(I2C_ADDR, (bits | ENABLE))
  sleep(E_PULSE)
  bus.write_byte(I2C_ADDR,(bits & ~ENABLE))
  sleep(E_DELAY)


def lcd_string(message,line):
  # Send string to display
  message = message.ljust(LCD_WIDTH," ")
  lcd_byte(line, LCD_CMD)
  for i in range(LCD_WIDTH):
    lcd_byte(ord(message[i]),LCD_CHR)

def main():
    lcd_init()
    while True:
      local_time = datetime.datetime.now()
      lcd_string("Current Time is", LCD_LINE_1)
      lcd_string(local_time.strftime("%H:%M"), LCD_LINE_2)
      sleep(1)

try:
  main()
except KeyboardInterrupt:
  pass
finally:
  LCD_BACKLIGHT = 0x00
  lcd_byte(0x01, LCD_CMD)
  GPIO.cleanup()

実際に動かしてみました!

f:id:kojirooooocks:20191123043631j:plain

表示されました!

終わりに

今回も参考サイトがあったので助かりましたw

こういう表示系はテンションが上ります。

日本語は表示できないのかな?

もうちょい調べてみます。

現場からは以上です。