計測値を保存する~Raspberry PiとDHT11~
はじめに
測定器で測定したデータを保存したい場合が多々あると思います。
今回は、DHT11で測定した温湿度のデータをデータベースに保存します。
プログラムはC言語で記述していきます。
準備するもの
Raspberry Pi | Raspberry Pi 4 |
DHT11 | DHT11 |
抵抗 | カーボン抵抗 1/2W 5.1kΩ(100本入) |
ジャンパーケーブル | ジャンパーケーブル |
ブレッドボード | ブレッドボード |
データベースを作る
データを格納するデータベースを作成します。
MariaDBの初期設定が終わってるものとして進めます。
まだ、インストールしていない場合は下記を参照ください。
データベースとテーブルは次のような形で作っていきます。
データベース名:dht
テーブル名:dht
列① 名:date 型:datetime
列② 名:temperature 型:int
列③ 名:humidity 型:int
MariaDB [(none)]> mysql -uroot -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 37
Server version: 10.3.25-MariaDB-0+deb10u1 Raspbian 10
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> create database dht;
Query OK, 1 row affected (0.001 sec)
MariaDB [(none)]> use dht;
Database changed
MariaDB [dht]> create table dht (date datetime, temperature int , humdity int);
Query OK, 0 rows affected (1.509 sec)
MariaDB [dht]> show columns from dht;
+-------------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+----------+------+-----+---------+-------+
| date | datetime | YES | | NULL | |
| temperature | int(11) | YES | | NULL | |
| humidity | int(11) | YES | | NULL | |
+-------------+----------+------+-----+---------+-------+
3 rows in set (0.016 sec)
MariaDB [dht]>
これでデータベースの準備は完了です。
測定データをデータベースに書き込む
DHT11による測定プログラムはこちらを参照ください。
データベースに値を書き込むプログラムです。
今回使用しているのはMariaDBですがMySQLとほぼ同じです。以下のサイトにすべて使い方が載っています。
◎MySQL 5.6 リファレンスマニュアル Connector および API
ただ、若干難しい?日本語だったりするので・・・。仕事でやるのであればしっかり読まなければいけないのでしょうけど、結構な文量で正直めんどいですので適当に・・・。
#include <stdio.h>
#include <time.h>
#include <wiringPi.h>
#include <math.h>
#include <mysql/mysql.h>
//dht parameter
・
・
・
int main()
{
//START
・
・温湿度を計測する処理
・
int tem,hum;
tem = dt[2]; //温度
hum = dt[0]; //湿度
//mysql partmeters
MYSQL *conn = NULL; //接続ハンドル。1つのデータベースに接続するために必須な奴
MYSQL_RES *res = NULL; //クエリの結果を受け取る奴
char *sql_sv = "127.0.0.1"; //データベースサーバのIPアドレス
char *user = "root"; //データベース接続ユーザ名
char *passwd = "root"; //ユーザパスワード
char *db_name = "dht"; //接続するデータベース名
char tblname = "dht" //接続するテーブル名
//datatime
time_t = t;
t = time(NULL);
char str[30];
strftime(str , sizeof(str) , "%Y-%m-%d %H:%M:%S" , localtime(&t) ); //測定日時
//create sql
char query[256];
sprintf(query ,"INSERT INTO %s(date,temperature,humidity) values('%s',%f,%f)" , tblname , str , tem , hum ) ; //テーブルへデータの書き込み用SQL文を作成
// mysql connect
conn = mysql_init(NULL); //データベースへの接続準備(初期化)
if( !mysql_real_connect(conn,sql_sv,user,passwd,db_name,0,NULL,0) ){ //データベースへの接続を行ってエラーだったら終了
// error
fprintf(stderr, "%s\n", mysql_error(conn));
exit(-1);
}
if( mysql_query( conn , query ) ){ //書き込み用SQLを実行。エラーだったら終了
// error
fprintf(stderr, "%s\n", mysql_error(conn));
mysql_close(conn);
exit(-1);
}
res = mysql_use_result(conn); //クエリを実行して、処理した後に必要な奴
mysql_free_result(res); //SQL実行を開放
mysql_close(conn); //データベースを閉じる
retrun 0;
}
コンパイルして実行します。
root@raspberrypi:~# gcc -o sql_dht sql_dht.c -lwiringPi -lmysqlclient
root@raspberrypi:~# ./sql_dht
temperature 22.0 humidity 57.0
root@raspberrypi:~#
結果は表示されませんが、エラーが出ていなければ成功しているはずです。
確認してみます。
root@raspberrypi:~# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 21
Server version: 10.3.27-MariaDB-0+deb10u1 Raspbian 10
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> use dht
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
MariaDB [dht]> select * from dht11 ;
+---------------------+-------------+----------+
| date | temperature | humidity |
+---------------------+-------------+----------+
| 2020-12-01 11:47:50 | 22 | 57 |
+---------------------+-------------+----------+
1 row in set (0.001 sec)
MariaDB [dht]>
しっかりとデータが格納されています。成功です。
終わりに
測定したデータをデータベースに保存しました。
定期的に実行し蓄積すればグラフなどを作ったりもできます。
自宅などで計測すれば時間帯の傾向など見れるようになるので温度湿度の対策に使えるかも?しれません。