ラズパイとDHT11を使って温度を測定する

概要

ラズパイとDHT11を使用して、周囲の温度を測定し、データベースに保存する

用意するもの

ラズパイ 3-4

DHT11 本体

自分の環境は ラズパイ 3 b+ に上のDHT11モジュールを使用しています。

参考サイト

https://www.souichi.club/raspberrypi/temperature-and-humidity/

DHT11とラズパイとの接続図

ピン配置は上の通り

プログラム

実はPythonにあまり触れたことがなく、知識も浅いのでとりあえずJSONにしてコマンドラインで出力を行うことにした。

import GPi.GPIO as GPIO
import dht11
import time
import datetime
import json

# ◆儀式◆
# 詳しくはわかりません
GPIO.setwarnings(True)
GPIO.setmode(GPIO.BCM)

# Output が GPIO 4 なので
# pin=4 になります
ins = dht11.DHT11(pin=4)

while True:
  result = ins.read()
  if result.is_valid():
    # JSON 出力用に辞書作成
    d = dict()
    # 日付
    d["date"] = str(datetime.datetime.now())
    # 温度
    d["temp"] = result.temperature
    # 湿度
    d["humi"] = result.humidity

    # 出力
    print(json.dumps(d, ensure_ascii=False, indent=2))
    break
  # 取得失敗
  # 1秒待って再度チャレンジ
  time.sleep(1)

GPIO.cleanup()

コマンドラインで実行すると

{
"date": "2021-06-18 20:29:05.163202",
"humi": 48.0,
"temp": 28.1,
}

というようなデータが取れるようになります。

データベースに保存するのにはPHPを使用します。

以下のようなコードでJSONを取得できます。

$raw = shell_exec("python output.py");
$json = json_decode($raw, true);

shell_exec でコマンドを実行して、出力データを $raw に代入し、

$raw を json_decode で配列に変換しています。

温度は $json[“temp”] で取得できるようになっています。

あとはこのデータをデータベースに保存するだけです。

【PHP】クラスローダーの自作

クラスローダーとは?

登録さえしておけば、毎回 require_once をしなくても、ファイルを読み込んでくれる機能です。

簡単な作り方

はじめに、ClassLoader.php というファイルを作成し、

@ ClassLoader.php

class ClassLoader {

    private static $dirs;

    public static function loadClass($class) {

        foreach (self::directories() as $directory) {

            $file_name = $directory . "/" . $class . ".php";

            if (is_file($file_name)) {

                require $file_name;

                return true;

            }

        }

    }

    private static function directories() {

        if (empty(self::$dirs)) {

            $base = __DIR__;

            self::$dirs = array(
                // 参照を行うフォルダ
                // フォルダ内に探したいファイルがない場合は
                // エラーになるので 注意
                // * 優先度は上から順です

                $base . "/library",

                $base . "/classes",

            );

        }

        return self::$dirs;

    }

}
@ index.php
require_once __DIR__ . '/ClassLoader.php';
spl_autoload_register(array("ClassLoader", "loadClass"));
ClassLoader.php の最後に
spl_autoload_register(array("ClassLoader", "loadClass"));

を直接記述すれば、 ClassLoader.php を読み込むだけで初期設定が完了する。

 

あとは自由に呼び出しを行えばいいだけだ。

 

例:

require_once "ClassLoader.php";
spl_autoload_register(array("ClassLoader", "loadClass"));

// User Class を呼び出す
// User.php があれば、エラーにならない
$user = new User();

 

動画配信サイトを自作してみる

自分用の動画配信サイトが欲しいなって思ったのが作ろうと思ったきっかけです。

初めにサーバーを用意しなければいけないのですが、普通のウェブサーバーではもの足りません。

なぜなら、動画のエンコードや結合をおこなえないからです。

その為今回はVPSや自宅鯖という手段を使っていることを前提として話を進めさせていただきます。

 

1.初期設定

必要なアプリケーションをインストールします

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install apache php php-mbstring ffmpeg

次に php.ini を設定します。

変更する箇所は

memory_limit

post_max_size

upload_max_filesize

になります

memory_limit = 1024M
post_max_size = 1024M
upload_max_filesize = 1024M

今回は1024M (1G)までのファイルをアップロードできるようにします。

クラウドフレアというサービスを利用している場合は最大100Mとなるので注意してください。

また、memory_limit の値は post_max_size より多くしてください。

設定できたら

sudo apache2ctl restart

を実行しサーバーを再起動させます。

 

2.データベース設計

動画のメタ情報を管理するためにMySQLサーバーを使用します。

テーブル構造を考えた時に、初めにユーザーアカウント情報、動画情報は最低でも必要になるので先に作成しておきます。コメントなどは後からでも追加できるので今回はパスです。

create table user(
id int not null auto_increment primary key,
created_at datetime default current_timestamp,
username varchar(30) not null,
password varchar(30) not null
)

create table video(
id varchar(20) not null primary key,
created_at datetime default current_timestamp,
author int not null,
title varchar(50) not null,
description text not null,
publish int not null default 1
)

user テーブルの解説から行います。

id はユーザーごとにことなるキーのプライマリキーになります。

created_at はユーザーを作成した日時になります。

username、password はそのままの意味です。

video テーブルの解説に入ります。

id は動画ごとに異なる特別なキーになり、これが動画を視聴する際に必要となります。

created_at は動画が投稿(INSERT)されたときの日時になります。

author は投稿者IDになります。user テーブルのid がこれにあたります。

title、description はそのままの意味です。

publish は公開状況です。

0 は非公開 1 は公開 です。

 

3.コーディング

コーディングといってもHTMLでフォームを作成して、PHPで処理するだけです。

HTML のフォームは今回割愛させていただきます。

<?php

function makeRandStr($length = 12) { $str = array_merge(range('a', 'z'), range('0', '9'), range('A', 'Z')); $r_str = null; for ($i = 0; $i < $length; $i++) { $r_str .= $str[rand(0, count($str) - 1)]; } return $r_str; }
$file = $_FILES["upload"];
$path = makeRandStr() . ".mp4";
move_uploaded_file($file["tmp_name"], $path);

エラーチェックもろもろしてません。

本番環境ではしてくださいね。

次にコマンドラインをたたかせてFFMPEGを実行させます。

今回はサムネイルの作成を行います。

shell_exec("nohup ffmpeg -i " . $path . " -pix_fmt yuvj422p -deinterlace -an -ss 0 -f mjpeg -t 1 -r 1 -y -s 1280x720 " . $path . ".jpg > /dev/null &");

あとはデータベースに動画の情報を挿入して完了です。