温度センサー(DS18B20)と湿温度センサー(DHT11)をRaspberry Pi2に接続

更新日 2017-07-08 (土) 08:47:29

GPIO4にDHT11のI/O、GPIO17にDS18B20のI/O(Pin2)接続

カタログ fileSKU-20-011-986_manual_aki.pdf

温湿度計.jpg

Raspberry Piの

/boot/config.txt

以下を最後尾に追加

# Edit by ISM
dtoverlay=w1-gpio-pullup,gpiopin=4
dtoverlay=w1-gpio-pullup,gpiopin=17

/etc/modules

以下を最後尾に追加

w1-gpio
w1-therm

その後再起動

DS18B20部

  • Raspberry Piで以下のt2.phpをcronで30分ごと実行する。
*/30 * * * * /home/pi/temperature/t2.php
  • 23:45にtmp.htmlファイルを削除
45 23 * * * /bin/rm /home/pi/temperature/tmp.html
  • Webサーバで、23:40に当日日付ファイル(ex. 20170620.html)にindex.htmlをリネーム
35 23 * * * /usr/bin/php /home/okada/script/move_ondo.php  > /dev/null 2>&1

t2.php

#! /usr/bin/php
<?php
$deviceId = '28-041470da67ff';
$today = date("Ymd");
$time = date("H:i");
$sensor_path = '/sys/bus/w1/devices/'.$deviceId.'/w1_slave';
$csv_dir = '/home/pi/temperature/';
$tmp_file = 'tmp.html';
$html_file = 'index.html';
$t = null;
//温度取得
exec("cat ".$sensor_path, $w1_slave);
if(isset($w1_slave[1])){
$tmp = explode('t=', $w1_slave[1]);
if(isset($tmp[1])) $t = $tmp[1] / 1000;
}
//CSV書き込み
if(!file_exists($csv_dir)){
mkdir($csv_dir);
}
if( $handle = fopen( $csv_dir.$tmp_file , 'a' ) ){
fputs( $handle, $today."-".$time." ".$t." <br /> \n" );
fclose($handle);
}

$cmd = '/usr/bin/tac '.$csv_dir.$tmp_file.' > '.$csv_dir.$html_file;
exec($cmd);

$cmd = '/usr/bin/rsync -avz -e ssh /home/pi/temperature/index.html okada@192.168.10.46:/var/www/html/ondo/';
exec($cmd);
return;
?>

move_ondo.php

#! /usr/bin/php
<?php
$today = date("Ymd").'.html';
$cmd = '/bin/mv /var/www/html/ondo/index.html /var/www/html/ondo/'. $today;
exec($cmd);
return;
?>

DHT11部

dht11-1.cはdht11を改造してデータを取り出せるまで繰り返し、取り出したデータを標準出力する。

/*
 *  dht11-1.c:
 *      Simple test program to test the wiringPi functions
 *      DHT11 test
*/

#include <wiringPi.h> 

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#define MAXTIMINGS      85
#define DHTPIN          7
#define OFFSET          2.5
#define OFFSET1         2
#define OFFSET2         0.5
#define OFFSET3         20


int dht11_dat[5] = { 0, 0, 0, 0, 0 };
int flag;

void read_dht11_dat()
{
        uint8_t laststate       = HIGH;
        uint8_t counter         = 0;
        uint8_t j               = 0, i;
        float   f; /* fahrenheit */ 

        dht11_dat[0] = dht11_dat[1] = dht11_dat[2] = dht11_dat[3] = dht11_dat[4] = 0;

        /* pull pin down for 18 milliseconds */
        pinMode( DHTPIN, OUTPUT );
        digitalWrite( DHTPIN, LOW );
        delay( 18 );
        /* then pull it up for 40 microseconds */
        digitalWrite( DHTPIN, HIGH );
        delayMicroseconds( 40 );
        /* prepare to read the pin */
        pinMode( DHTPIN, INPUT );

        /* detect change and read data */
        for ( i = 0; i < MAXTIMINGS; i++ )
        {
                counter = 0;
                while ( digitalRead( DHTPIN ) == laststate )
                {
                        counter++;
                        delayMicroseconds( 1 );
                        if ( counter == 255 )
                        {
                                break;
                        }
                }
                laststate = digitalRead( DHTPIN );

                if ( counter == 255 )
                        break;

                /* ignore first 3 transitions */
                if ( (i >= 4) && (i % 2 == 0) )
                {
                        /* shove each bit into the storage bytes */
                        dht11_dat[j / 8] <<= 1;
                        if ( counter > 16 )
                                dht11_dat[j / 8] |= 1;
                        j++;
                }
        }

        /*
         * check we read 40 bits (8bit x 5 ) + verify checksum in the last byte
         * print it out if data is good
         */
        if ( (j >= 40) &&
            (dht11_dat[4] == ( (dht11_dat[0] + dht11_dat[1] + dht11_dat[2] + dht11_dat[3]) & 0xFF) ) )
        {
                f = (dht11_dat[2] + OFFSET) * 9. / 5. + 32;
                printf( "Humidity = %d.%d %% Temperature = %d.%d *C (%.1f *F) <br /> \n",
                        dht11_dat[0]+OFFSET3, dht11_dat[1], dht11_dat[2]+OFFSET1, dht11_dat[3]+OFFSET2, f );
                flag = 1;
        }else  {
                flag = 0;
        }
}

int main( void )
{
//      printf( "Raspberry Pi wiringPi DHT11 Temperature test program\n" );

        if ( wiringPiSetup() == -1 )
                exit( 1 );

        while ( 1 )
        {
                read_dht11_dat();
                delay( 1000 ); /* wait 1sec to refresh */
                if (flag  == 1) break;
        }

        return(0);
}
  • コンパイル
$ gcc -o dht11-1 dht11-1.c -L/usr/local/lib -lwiringPi

ft.phpはdht11-1実行し、結果をファイルに書き込み、そのファイルを逆に並べかる。 そのファイルをrsyncでサーバの送る。

ft.php

#! /usr/bin/php
<?php 

$today = date("Ymd");
$time = date("H:i");

$outfile = '/home/pi/Thermo/ft_temp';

$cmd = '/home/pi/Thermo/wiringPi/dht11-1  >> '.$outfile;
exec($cmd);


if( $handle = fopen( $outfile , 'a' ) ){
fputs( $handle, $today."-".$time."  \n" );
fclose($handle);
}

$cmd = '/usr/bin/tac /home/pi/Thermo/ft_temp > /home/pi/Thermo/index.html';
exec($cmd);

$cmd = '/usr/bin/rsync -avz -e ssh /home/pi/Thermo/index.html okada@192.168.10.46:/var/www/html/ondo/hum/';
exec($cmd);
return;
?>

実行

  • Raspberry Piのcronで30分おきに実行
*/30 * * * * /home/pi/Thermo/ft.php
  • Raspberry Piのcronで23:50にdht11-1で実行したファイル削除。
50 23 * * * /bin/rm /home/pi/Thermo/ft_temp
  • Webサーバでcronで23:50にmove_hum.phpを実行。1日分のindex.htmlをその日のファイル名に変更
    (ex. 2017/06/22 → 20170622.html)
40 23 * * * /usr/bin/php /home/okada/script/move_hum.php  > /dev/null 2>&1

move_hum.php

#! /usr/bin/php
<?php
$today = date("Ymd").'.html';
$cmd = '/bin/mv /var/www/html/ondo/hum/index.html /var/www/html/ondo/hum/'. $today;
exec($cmd);
return;
?>

実験ページ


添付ファイル: fileSKU-20-011-986_manual_aki.pdf 43件 [詳細] file温湿度計.jpg 44件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-07-08 (土) 08:47:29 (293d)