본문 바로가기

컴퓨터 프로그래밍/라즈베리파이

라즈베리파이2에서 php을 이용하여 온도 저장으로 그래프로 출력하기.

저번 시간에 이어 ds1820 온도센서를 이용해서 온도를 자동 저장하고 그래프로 출력하는 법에 대해서 강좌 하도록 하겠다.

아래의 강좌을 읽으면 프로그램을 이해하는데 도움이 된다.

  1. 2015/05/14 라즈베리파이 2 DS18B20 온도센서 PHP 프로그램, MySQL DB 저장 (2)
  2. 2015/05/13 라즈베리파이 2에서 APM(Apache,PHP,Mysql) 구축및 환경설정
  3. 2015/05/09 아두이노 라즈베리파이 온도센서 방수형 DS18B20 사용법
  4. 2015/05/09 라즈베리파이 아두이노 온도센서 방수형 DS18b20 상품 설명과 구매

crontab에 아래와 같이 일분에 한번 실행되도록 등록한다.

----------- 아래 --------
#temperature  auto save
* *     * * *   root    /usr/bin/php -q /home/pi/daemon_php/temp_save.php

----------- 아래 --------

 

crontab은 /etc/crontab 에 있으니 vi등을 이용해서 추가하면된다.

php는 웹폴더에 두지말고, 다른 폴더를 생성하기 바란다.

필자는 /home/pi/daemon_php/ 에 파일을 생성했다.

 

---------------------------- temp_save.php-------------------------------

<?php
// mysql 접속 계정 정보
$mysql_host = 'localhost';
$mysql_user = 'pi';
$mysql_password = 'XXXX';
$mysql_db = 'pi';

// 접속
$conn = mysql_connect($mysql_host, $mysql_user, $mysql_password);
$dbconn = mysql_select_db($mysql_db, $conn);


// charset 설정, 설정하지 않으면 기본 mysql 설정으로 됨, 대체적으로 euc-kr를 많이 사용
//mysql_query("set names utf8"); 


//리눅스 명령어를 cat을 실행해서 온도센서의 데이터를 읽어 들인다.
$re=exec("cat /sys/bus/w1/drivers/w1_slave_driver/28-*/w1_slave");

//데이터중 온도값의 값을 추출하기위해서 "t="기준으로 배열로 분리한다.
$tem_c=explode("t=",$re);
//온도
$data['temp_c']=round($tem_c[1]/1000,2);
//날짜
$data['temp_ymd']=date("Ymd");
//시간
$data['temp_his']=date("His");



//쿼리, news 라는 테이블이 존재, id, title, content 필드가 존재할 경우
$query = "INSERT INTO `temperature`(`time_ymd`, `time_his`, `temperature`, `regday`) ";
$query .= "VALUES ('".$data['temp_ymd']."','".$data['temp_his']."', '".$data['temp_c']."', now() )";

//테스트를 위해서 쿼리출력
echo $query;

//쿼리 실행
$res = mysql_query($query, $conn);

?>
---------------------------- temp_save.php-------------------------------

 

 

프로그램이 정상적으로 실행되면 아래 처럼 일분에 한번씩 온도가 자동 저장된다.

 

 

저장된 온도를 하이차트를 이용해서 그래프로 출력하는 법을 익혀보겠다.

간단한 통계처리라면 구글차트도 좋지만, 하이차트는 개인 홈페이지는 무료이고 상용홈페이지도 저렴한 가격이고 다양한 그래프을 제공한다.

자바스크립트환경이고 모바일도 잘 지원된다.

아래의 사이트에서 방문해 보시기 바란다.

http://www.highcharts.com/demo

 

설치법은 해당프로그램 다운받고, 압축을 풀어서 웹폴더에 올리기만 하면된다.

 

최근 12시간의 온도 변화를 보여주는 프로그램은 아래와 같다.

 

----------------- temp.php-------------------------

<?php

$mysql_host = 'localhost';
$mysql_user = 'pi';
$mysql_password = 'XXXX';
$mysql_db = 'pi';

// 접속
$conn = mysql_connect($mysql_host, $mysql_user, $mysql_password);
$dbconn = mysql_select_db($mysql_db, $conn);


// charset 설정, 설정하지 않으면 기본 mysql 설정으로 됨, 대체적으로 euc-kr를 많이 사용
//mysql_query("set names utf8");


$sql="
select * from (
SELECT DATE_FORMAT( regday,  '%m-%d %HH' )  mdh , COUNT( * ) cnt, SUM( temperature ) , round(SUM( temperature ) / COUNT( * ),2)  atemper
FROM  `temperature`
GROUP BY DATE_FORMAT( regday,  '%Y%m%d%H' )
order by regday desc
limit 12 
) t_a
order by t_a.mdh
";
//echo $sql;

 

$result = mysql_query($sql) ;


$str_mdh="";
$str_atemper="";
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
// echo($row['mdh']."--------------".$row['atemper']."<br>");
 $str_mdh .="'".$row['mdh']."',";
 $str_atemper .="".$row['atemper'].",";
}
$str_mdh= substr($str_mdh,0,-1);
$str_atemper= substr($str_atemper,0,-1);
//echo $str_atemper;

?><!DOCTYPE HTML>
<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <title>Temperature Example</title>

  <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
  <style type="text/css">
${demo.css}
  </style>
  <script type="text/javascript">
$(function () {
    $('#container').highcharts({
        chart: {
            type: 'line'
        },
        title: {
            text: 'Average Temperature'
        },
        subtitle: {
            text: 'Source: ilikesan.com'
        },
        xAxis: {
            categories: [<?php echo $str_mdh?>]
        },
        yAxis: {
            title: {
                text: 'Temperature (°C)'
            }
        },
        plotOptions: {
            line: {
                dataLabels: {
                    enabled: true
                },
                enableMouseTracking: false
            }
        },
        series: [{
            name: 'Home',
            data: [<?php echo $str_atemper?>]
        }
   /*
   , {
            name: 'London',
            data: [3.9, 4.2, 5.7, 8.5, 11.9, 15.2, 17.0, 16.6, 14.2, 10.3, 6.6, 4.8]
        }
  */
  ]
    });
});
  </script>
 </head>
 <body>
<script src="/highchart/js/highcharts.js"></script>
<script src="/highchart/js/modules/exporting.js"></script>

<div id="container" style="min-width: 310px; height: 400px; margin: 0 auto"></div>

 </body>
</html>

----------------- temp.php-------------------------

 

웹에서 확인하면, 아래와 같이 잘 나온다.

 

 

다음 강좌에서는 릴레이을 이용해서 여러개의 전원을 php 프로그램을 이용해서 컨트롤 하는 법에 대해서 다루어 보겠다.