ラズベリーパイピコとPCを使った温湿度測定

目次

目的

部屋の温度湿度が気になる季節になってきました。そこで部屋の温度湿度の測定を行いたいと思い、ラズベリーパイピコを用いて、温湿度の測定を行ってみたいと思います。

またデータに残せるようにマイコンで測定したデータをPC上に送って保存出来るように致しました。

本記事では、その内容に関して記載していきたいと思います。

温湿度測定

今回の温湿度測定を行うにあたって使用するものは下記の通りになります。

  • ラズベリーパイ ピコ x 1
  • 温湿度センサーDHT11 x 1 (key studioのモジュール)
  • ブレットボード x 1
  • ブレットボードに使用する配線 x 3
  • microUSB-USBケーブル(PCと通信可能なもの) x 1
  • PC x 1
  • C#(Visual studio) x 1(PCにインストール)

上記のものを使用して温湿度測定装置を作成します。次項に主要部品に関しての記載を行います。

温湿度センサーDHT 11

DHT11

DHT11とは温湿度を図るセンサーの事であり、今回はKeyestudioで売っていたモジュール状態で使用してみます。データシートは秋月電子さんのものを参考致しました。

データシート

空気中の温度と湿度を同時に測定することが出来るセンサーであり、データの通信には1wireを用いた独自の規格で通信を行っております。

Micro python用のライブラリもあり、簡単に出力を確認する事が出来ます。

ブレッドボード

ブレッドボード

こちらは電子工作でよくお世話になる。ブレットボードといったものになります。

ブレットボードとは電子部品やジャンパー配線を接続するだけで、回路を組むことが出来るボードの事をさしており、電子工作の試作によく用います。(ただし周波数特性等が悪いため、普通の製品の製作などではなくON/OFF等の基本的には簡単な回路の試作だけで使用致します。)

DHT11を用いた温湿度測定システムでは、このブレッドボードを用いて動作を確認致しました。

ブレットボードは下記の通りの構造をしており、ICや電子部品、配線を接続する事で回路を構成することが出来ます。

ブレットボード外観図

配線、microUSBケーブル

MicoUSB

ラズベリーパイピコとPCを接続するケーブルになります。充電だけ出来るケーブルではなく、PCと通信できるタイプを使用して下さい。

配線はブレットボードでの接続で使用します。先にpinがついたものを使用します。

PCとC#(Visual studio)

Visual Studio

PC上でラズベリーパイピコ上のデータを受け取るのにC#といった言語で製作したGUI(Graphical User Interface)プログラムを使用します。シリアル通信のモジュールを用いることでラズベリーパイピコとの通信を行います。詳細は別途記載致します。

ブロック図

回路ブロック図

今回製作する回路の回路ブロック図は下記の通りになります。

温湿度センサー回路ブロック図

基本的にはKeyestudioのDHT11モジュールとラズベリーパイピコを配線で接続し、ラズベリーパイピコとPCをUSBで接続しただけの回路になります。

ちなみに使用したDHT11モジュールは下記リンク先のものになります。

DHT11モジュール

ソフトウェア動作ブロック図

ここではソフトウェアの動作ブロック図を記載致します。イメージ図としては下記の通りになります。

ソフトウェアブロック図

ソフトウェアブロック図を記載すると、DHT11モジュールとラズベリーパイピコ間は独自のシリアル通信を行ってデータを測定し、得られたデータをラズベリーパイピコとPC上のC#の間のUSBシリアル通信でデータをPC上に上げます。

最終的に得られたデータをC#でグラフとして出力致します。

プログラム

ここでは作成したプログラムに関して記載致します。本装置では、ラズベリーパイピコ上のプログラム(Micro-python)とPC上のGUI作成用プログラム(C#)を用いて装置を作りました。

ラズベリーパイ側プログラム

Micro-pythonのプログラムは下記の通りになります。

from machine import Pin, I2C
import utime as time
from dht import DHT11, InvalidChecksum
led = machine.Pin(25, machine.Pin.OUT)

while True:
    time.sleep(2)
    led.value(1)
    pin = Pin(28, Pin.OUT, Pin.PULL_DOWN)
    sensor = DHT11(pin)
    t  = (sensor.temperature)
    h = (sensor.humidity)
    print(str(t) + "," + str(h))
    time.sleep(2)
    led.value(0)

上記コードは下記のURLのコードを参考にしております。

リンク

基本的にDHT11.pyプログラムとmain.pyプログラムがあり、main.pyプログラムでDHT11.pyプログラムを読み込んで、動作させております。DHT11.pyはライブラリのようなものになります。DHT11.pyのライブラリは上記リンク先からダウンロードをして下さい。

DHT11.pyプログラムの中身は私はよくわかっていないので、本記事ではmain.pyプログラムの中身に関して説明致します。

main.py プログラム 構造

今回使用するPythonのプログラムなのですが、内容はシンプルで、センサーの値を2秒周期で取り込む形になっております。

プログラムとしては、下記の宣言文とメイン文になります。

from machine import Pin, I2C
import utime as time
from dht import DHT11, InvalidChecksum
led = machine.Pin(25, machine.Pin.OUT)

宣言文では、pin,I2C,utime,dht(DHT11.py),Invalidchecksumを宣言致しました。

基本的にpinの出力、DHT11との通信方法(I2C)、時間関数、チェックサムのライブラリを読み込みます。

while True:
#1
    time.sleep(2)
#2
    led.value(1)
#3
    pin = Pin(28, Pin.OUT, Pin.PULL_DOWN)
#4
    sensor = DHT11(pin)
#5
    t  = (sensor.temperature)
    h = (sensor.humidity)
#6
    print(str(t) + "," + str(h))
#7
    time.sleep(2)
#8
    led.value(0)

メインの文は上記のようになります。

動作の流れとしては下記のお降りになります。

  1. 2秒待機
  2. LEDを点灯
  3. ラズパイの28pinを信号入力pinとして設定
  4. DHT11のデータを28pinから取得
  5. t,hの変数に温度と湿度のデータを入れる。
  6. 文字列データにして、PC側にデータを出力
  7. 2秒待機
  8. LEDを消灯

上記1~8の動作を延々と繰り返します。

main.pyのラズパイピコ上で単体動作させる方法は下記のリンク先をご確認下さい。

ラズベリーパイピコ単体でプログラムを動作させる方法

PC側プログラム

PC側のプログラムではC#言語を使用致します。

C#とはIDE(Integrated Development Environment 総合開発環境)であるVisual Studioを用いることで、簡単なGUI(Graphical User Interface)プログラムを作ることが出来るプログラミング言語である。

簡単にプログラム出来る為、初心者の方にもおすすめです。本プログラムのGUIプログラムとコードは下記の通りになります。

C#プログラム
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;
using System.Windows.Forms.DataVisualization.Charting;

namespace WindowsFormsApp3
{
    public partial class Form1 : Form
    {
        static public string dat1 = "";
        static public string dat2 = "";
        static public int i = 0;
        static public int start_flg = 0;
        public Form1()
        {

            InitializeComponent();

            // clear
            chart1.Series.Clear();
            chart1.ChartAreas.Clear();
            chart1.Titles.Clear();

            chart1.Series.Add("series1");
            chart1.Series.Add("series2");
            ChartArea chartAria1 = new ChartArea("chartArea1");
            chart1.ChartAreas.Add(chartAria1);

            Axis y1 = new Axis();
            y1.Interval = 5.0d;
            y1.Minimum = 25.0d;
            y1.Maximum = 30.0d;
            chartAria1.AxisY = y1;
            Axis y2 = new Axis();
            y2.Interval = 5.0d;
            y2.Minimum = 20.0d;
            y2.Maximum = 100.0d;
            chartAria1.AxisY2 = y2;
            chart1.Series["series1"].YAxisType = AxisType.Primary;
            chart1.Series["series2"].YAxisType = AxisType.Secondary;

            chart1.Series["series1"].LegendText = "温度";
            chart1.Series["series2"].LegendText = "湿度";

            chartAria1.AxisX.Title = "Point";
            chartAria1.AxisY.Title = "温度[℃]";
            chartAria1.AxisY2.Title = "湿度[%]";

            if (serialPort1.IsOpen == false)
            {
                serialPort1.BaudRate = 9600;
                serialPort1.Parity = Parity.None;
                serialPort1.DataBits = 8;
                serialPort1.StopBits = StopBits.One;
                serialPort1.Handshake = Handshake.None;
                serialPort1.PortName = "COM3";
                serialPort1.DataReceived += serialPort1_DataReceived;

                serialPort1.Open();
            }
        }

        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            
            string val = serialPort1.ReadLine();
            string[] arr = val.Split(',');
            dat1 = arr[0];
            dat2 = arr[1];
            this.Invoke(new EventHandler(displaydata_event));
        }

        private void displaydata_event(object sender, EventArgs e)
        {
            i = i + 1;
            dataGridView1.Rows.Add(i,DateTime.Now, dat1, dat2);
            chart1.Series["series1"].ChartType = SeriesChartType.Line;
            chart1.Series["series1"].MarkerStyle = MarkerStyle.Circle;
            chart1.Series["series1"].MarkerSize = 10;
            chart1.Series["series2"].ChartType = SeriesChartType.Line;
            chart1.Series["series2"].MarkerStyle = MarkerStyle.Square;
            chart1.Series["series2"].MarkerSize = 10;
            chart1.Series["series1"].Points.AddXY(i, dat1);
            chart1.Series["series2"].Points.AddXY(i, dat2);

        }

        private void Form1_FormClosed(
        object sender, FormClosedEventArgs e)
        {
            // シリアルポートのクローズ
            serialPort1.Close();
        }

    }
}

中身に関して次に記載致します。

宣言文

宣言文は下記の通りになります。

黒の点線の部分はFormプログラムを作る時に入っている宣言文になります。赤の点線部分はUSBシリアル通信とChartを使うのに使った宣言文になります。 この赤の点線部分を追記しました。

初期化宣言文

初期化宣言は下記の通りになります。Formアプリケーションが読みだされた際にプログラムが動作します。内容としては、

  1. ラズベリーパイ ピコから取得データを確保する用のグローバル変数の宣言
  2. シリアル通信の初期化
  3. Chart背景の初期化
  4. シリアル通信のパラメータ

の通りになります。

Chart出力動作

Chart出力動作 部分では、下記の通りにプログラムを動作させます。

  1. シリアル通信データの取得
  2. Chartへの取得データの追加
  3. シリアル通信クローズ

まとめ

本記事では温度湿度センサー,ラズベリーパイピコ,PCを使ったざっくりとした温湿度測定装置に関して記載致しました。各々のプログラムの詳細に関しては、説明が長くなりそうなので、別途記事にして説明しようと思います。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

CAPTCHA


目次