본문 바로가기

Computer/Linux

라즈베리파이 온습도계 소스




TABLE 생성


생성할 database는 temperature

생성할 table name 은 log

생성할 항목은 date, clock, temp, hum


mysql -u root -p
show databases;

create database temperature;

use temperature;


create table log(

recorddate datetime not null,

date int(10) not null,

clock int(10) not null,

temp decimal(10,1) not null,

hum decimal(10,1) not null,

PRIMARY KEY (`recorddate`)

);


show tables;






완성예제


crontab 을 사용해서 HTML 코드를 출력해서 10분마다 온습도를 표로 볼 수 있게 만드는거, 



run.php

<?php


$temhum = escapeshellcmd('/var/www/html/temp_execute/temhum.py');

$temhumrun = shell_exec($temhum);

$data=explode("|", $temhumrun);


echo "<html><head><title>Temperature & Humidity ".date('d/m/Y H:i', time())."</title></head><body>";

echo "<table width='100%'><tr align='center'><td>";

echo "<div style='border:2px solid; border-radius:25px;box-shadow: 10px 10px 5px #888888;padding: 10px;width:400px;background-color:#EAEAEA;'>";

echo "<span style='font:Arial;font-size:20'>Temperature and Humidity monitoring</span><br \><br \>";

if($data[0] > 0) {

    echo "<table padding='0'>";

    echo "<tr><td colspan='4'><center>TEMPERATURE</center></td></tr>";

    echo "<tr>";

    echo "<td>0</td><td align='right' width='".($data[0]*3)."' bgcolor='green'><span style='color:white;'>$data[0] C</span></td>";

    echo "<td width='".(300-$data[0]*3)."' bgcolor='grey'></td><td>100</td>";

    echo "</tr></table>";

    echo "<table padding='0'>";

    echo "<tr><td colspan='4'><center>HUMIDITY</center></td></tr>";

    echo "<tr>";

    echo "<td>0</td><td align='right' width='".($data[1]*3)."' bgcolor='purple'><span style='color:white;'> $data[1] %</span></td>";

    echo "<td width='".(300-$data[1]*3)."' bgcolor='grey'></td><td>100</td>";

    echo "</tr>";

    echo "<tr><td colspan='4'></td></tr>";

    echo "<tr><td colspan='4'>";

    echo "<center><span style='font:Arial;font-size:11'>".date('d/m/Y H:i', time())."</span></center>";

    echo "</td></tr></table>";

} else

    echo "No data. Please try again";

echo "<br \><span style='font:Arial;font-size:10'>HEESEOP.COM</span>";

echo "</div>";

echo "</td></tr></table";

echo "</body></html>"


?>






temhum.py

   

#!/usr/bin/env python

# Copyright (c) 2014 Adafruit Industries

# Author: Tony DiCola


import sys

import Adafruit_DHT

sensor = Adafruit_DHT.DHT22

pin = 4


humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)


if humidity is not None and temperature is not None:

   print '{0:0.1f}|{1:0.1f}'.format(temperature, humidity)

else:

   print 'Failed to get a reading. Please try again!'




mysql.php 파일을 통해서 MySql로 저장


<?php

function connect_db()

{

   $server="localhost";

   $dbname="temperature";

   $uid="root";

   $pwd="password";

   $conn = @mysql_connect($server, $uid, $pwd);


   if(!$conn)

        die("Unable to connect to the database.");


   $select = mysql_select_db($dbname, $conn);


   return($conn);


}



$conn=connect_db();


date_default_timezone_set("Asia/Seoul");

$tdate=date("Ymd");

$tclock=date("His");

$record=date("YmdHis");


$temhum = escapeshellcmd('/var/www/html/temp_execute/temhum.py');

$temhumrun = shell_exec($temhum);

$data=explode("|", $temhumrun);



if($data[0] > 0) {

    $sql ="INSERT INTO log (date,clock,temp,hum,recorddate) VALUES ($tdate,$tclock,$data[0], $data[1],$record)";

    $rs=mysql_query($sql, $conn);

    if (!$rs) die("MYSQL: ".mysql_error($conn)."<br><b>$sql</b>");

} else

    echo "No data. Please try again";


?>






Mysql에서 data불러와서 highchart graph 출력

//highchart 다운로드받아서 /hightchart 폴더에서 압축풀기

wget http://code.highcharts.com/zips/Highcharts-4.2.3.zip


<?php

$mysql_host = 'localhost';

$mysql_user = 'root';

$mysql_password = 'PASSWORD';

$mysql_db = 'temperature';

// 접속

$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( recorddate,  '%m-%d %HH' )  mdh , COUNT( * ) cnt, SUM( temp) , round(SUM( temp ) / COUNT( * ),2)  atemper

FROM  `log

GROUP BY DATE_FORMAT( recorddate,  '%Y%m%d%H' ) 

order by recorddate desc

limit 24

) 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>



기타 소스코드


python 으로 tem = 온도, hum = 습도를 저장하게 만드는



import Adafruit_DHT as dht

import datetime


wtime = datetime.datetime.now()


h,t = dht.read_retry(dht.DHT22, 4)


tem= '{0:0.1f}'.format(t)

hum= '{1:0.1f}'.format(t,h)


print wtime,tem,hum, 'Temp={0:0.1f}*C  Humidity={1:0.1f}%'.format(t, h)



#$data=explode("|", $temhumrun); 를 써서 "|" 기준으로 data[0] 와 data[1] 를 분리




<?php

    echo "It works, can you see it?\n";


$temhum = escapeshellcmd('/var/www/html/temp/temhum.py');

$temhumrun = shell_exec($temhum);

$data=explode("|", $temhumrun);


echo "Data zero is first and Data one is humidity\n";

echo $data[0];

echo $data[1];



?>







#!/usr/bin/env python

# Copyright (c) 2014 Adafruit Industries

# Author: Tony DiCola


import sys

import Adafruit_DHT

sensor = Adafruit_DHT.DHT22

pin = 4


humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)


if humidity is not None and temperature is not None:

   print '{0:0.1f}|{1:0.1f}'.format(temperature, humidity)

else:

   print 'Failed to get a reading. Please try again!'





php를 사용해서 온도 습도 불러오기 


http://stackoverflow.com/questions/32236588/passing-dht22-output-in-python-to-php


read_dht.py

#!/usr/bin/env python
# Copyright (c) 2014 Adafruit Industries
# Author: Tony DiCola
print 'Hello World...'

import sys
import Adafruit_DHT
sensor = Adafruit_DHT.DHT22
pin = 4

humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)

if humidity is not None and temperature is not None:
   print '{0:0.1f}|{1:0.1f}'.format(temperature, humidity)
else:
   print 'Failed to get a reading. Please try again!'

get_readings.php

<?php
$command = escapeshellcmd('/var/www/cgi-bin/read_dht.py');
$output = shell_exec($command);
echo $output;
?>


- 위젯으로 그래프 만들어서 data 받아오게끔,

- 설정온도 이하로 떨어질 경우, 이상으로 올라갈 경우 알람

- 클릭시 CCTV앱으로 연결

- server는 무료서버에서 받아오는걸로, 1차는 RPi SD카드에, 2차로는 무료서버, 3차로 NAS FTP로 주기적으로 백업




온도 습도 출력


import Adafruit_DHT as dht

import datetime


wtime = datetime.datetime.now()


h,t = dht.read_retry(dht.DHT22, 4)

print wtime, 'Temp={0:0.1f}*C  Humidity={1:0.1f}%'.format(t, h) 



crontab -e 실행해서 아래 문구 삽입하면 10분마다 temp.txt 파일이 웹페이지 temp.txt 파일로 ascending으로 저장됨

*/10 * * * * sudo python /var/www/temp.py >> /var/www/temp.txt





센서 테스트

Read from anj AM2302 Connected to GPIO#4

sudo /home/pi/Adafruit_Python_DHT/examples/AdafruitDHT.py 2302 4





GPIO Pin 활성화


/boot/config.txt 에 gpiopin 4번을 추가하도록 합니다.

$sudo nano /boot/config.txt

-> dtoverlay=w1-gpio,gpiopin=4

 

온도 센서를 기본 모듈에 추가합니다.

$sudo nano /etc/modules

-> w1-gpio

-> w1-therm

 

reboot을 통해 설정값을 적용합니다.

$sudo reboot

 

 

 








#!/usr/bin/python

import MySQLdb

import subprocess

import re

import sys

import time

import datetime


# Open database connection

conn = MySQLdb.connect("localhost","root","le_password","temperatures")


# Continuously append data

while(True):


date = time.strftime("%d/%m/%Y")

clock = time.strftime("%H:%M")


# Run the DHT program to get the humidity and temperature readings!


output = subprocess.check_output(["./DHT", "2302", "4"]);

#print output

matches = re.search("Temp =\s+([0-9.]+)", output)

if (not matches): time.sleep(0) continue

temp = float(matches.group(1))


# search for humidity printout

matches = re.search("Hum =\s+([0-9.]+)", output)

if (not matches): time.sleep(0) continue

humidity = float(matches.group(1))


# print "T %.1f " % temp

# print "H %.1f " % humidity


# MYSQL DATA Processing

c = conn.cursor()


c.execute("INSERT INTO data_th (date, clock, temp, hum) VALUES (%s, %s, %s, %s)",

(date, clock, temp, humidity))


#print "DB Loaded"


time.sleep(360)






참조


http://blog.naver.com/jsmjhd/220357189047

http://blog.naver.com/yeri_i/220358205538

http://blog.naver.com/kkasis/220357802502

http://blog.naver.com/getalone/220453711797

http://www.instructables.com/id/Raspberry-PI-and-DHT22-temperature-and-humidity-lo/step9/Setting-up-the-MySql-for-storing-the-temperature-d/

http://www.instructables.com/id/PART-1-Send-Arduino-data-to-the-Web-PHP-MySQL-D3js/?ALLSTEPS

https://www.youtube.com/watch?v=Rbl0yj9Q3Zs