//구글광고

아두이노 윤으로 만드는 문자알림 웹온습도계 예제 - 마지막


1. DB입력하는 파이선 프로그램

아누이노 회로에서 센싱한 온습도를 mysql db에 저장하는 파이선 프로그램이다.

첨부파일을 다운로드 받아서  /root/python 경로에 ftp로 업로드 한다.

insertDB.py


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# -*- coding: ms949 -*-
# 온습도 센서 데이터입력모듈 버전0.1
# 프로그램명 : insertDB.py
# 사용법 python insertDB.py 센서ID 온도값 습도값
# 개발언어: Python
# 필요환경 : MySQL , ArduinoYUN
# 호출자 : Arduino Sketch (온,습도값을 측정후 호출)
# 필요한 라이브러리 모듈 로딩
import MySQLdb
import sys
import time
# 데이터베이스 접속구문 설정
host = "127.0.0.1"
user = "root"
passw = "arduino"
base = "tnh"
# 환경변수 설정
# ENABLE_LOG가 설정되어있으면 TEXT 파일로 로그파일을 생성한다.
# INSERT_ROW값은 현재 시간설정이 맞지 않으면(보통은 인터넷이 단절되었다고 생각한다.)
# 온도값을 업데이트 하지 않고 문자메세지 발송도 처리하지 않는다.
ENABLE_LOG=True
#ENABLE_LOG=False
INSERT_ROW=False
# 로깅이 활성화 되어있으면, 로그를 쓴다. 모드는 append. 프로그램 호출로그
if ( ENABLE_LOG == True ):
   fileHandle = open ( '/root/python/insertDB_log.log''a' )
   fileHandle.write ( ' ProgramCall with Arg[1]:'+sys.argv[1]+' Arg[2]:'+sys.argv[2]+' Arg[3]:'+sys.argv[3]+'\n')
   fileHandle.close()
# 로직 : Timestamp Check Logic
# 설명 : 현재 온습도 데이터가 저장되어있는 테이블의 최근날짜와 현재 시간을 비교한다.
#        현재시간보다 큰행이 있으면, 그건 현재 아두이노 보드의 시간이 제대로 초기화 되어있지 않은 상태이므로
#        데이터를 넣지 않는다.
try:
   db= MySQLdb.connect(host,user,passw,base)
   cur = db.cursor()
   cur.execute(" select count(*) from tnh where timestamp > now() " )
   checkdate = cur.fetchone()
   if ( checkdate[0== 0 ):
      INSERT_ROW = True
   if ( ENABLE_LOG == True ):
      fileHandle = open ( '/root/python/insertDB_log.log''a' )
      fileHandle.write ( ' TCL Get Count:'+str(checkdate[0])+'\n' )
      fileHandle.close()
except MySQLdb.Error, e:
    if ( ENABLE_LOG == True ):
          fileHandle = open ( '/root/python/insertDB_log.log''a' )
          fileHandle.write ( ' TCL : MySQLdb error %d: %s ' % (e.args[0],e.args[1]) )
          fileHandle.close()
    sys.exit(1)
db.close()
# Timestamp Check Logic  끝.
# 로직 : Old data Delete Logic
# 설명 : 현재 시간보다 2400시간 이전의 데이터는 삭제한다 (100일치)
#        데이터가 많아질경우 응답시간의 저하와 용량full등의 문제가 생기기 때문이다.
try:
   db= MySQLdb.connect(host,user,passw,base)
   cur = db.cursor()
   if ( ENABLE_LOG == True ):
       fileHandle = open ( '/root/python/insertDB_log.log''a' )
       fileHandle.write ( ' Old Data Delete start\n' )
       fileHandle.close()
   cur.execute(" delete from tnh where timestamp < DATE_ADD(date_format(now(), '%Y-%m-%d %H'), INTERVAL -2400 hour) ")
   db.commit()
   if ( ENABLE_LOG == True ):
      fileHandle = open ( '/root/python/insertDB_log.log''a' )
      fileHandle.write ( ' old data delete COMPLETED.\n' )
      fileHandle.close()
except MySQLdb.Error, e:
    if ( ENABLE_LOG == True ):
          fileHandle = open ( '/root/python/insertDB_log.log''a' )
          fileHandle.write ( ' Old data delete : MySQLdb error %d: %s ' % (e.args[0],e.args[1]) )
          fileHandle.close()
    sys.exit(1)
db.close()
# Old data Delete Logic 끝
# 로직 : Data Insert Logic
# 설명 : 아두이노 센서에서 수집한 온습도 데이터를 DB에 입력하는 로직
if (INSERT_ROW==True):
   try:
      db= MySQLdb.connect(host,user,passw,base)
      cur = db.cursor()
      resultado = cur.execute(""" insert into tnh (timestamp, sensor_id, tem, hum) values ( now(), %s, %s, %s) """,(sys.argv[1],sys.argv[2],sys.argv[3]))
      if (resultado == 1 ):
         if ( ENABLE_LOG == True ):
            fileHandle = open ( '/root/python/insertDB_log.log''a' )
            fileHandle.write ( 'Data Insert [Success]\n' )
            fileHandle.close()
            db.close()
      else:
         if ( ENABLE_LOG == True ):
            fileHandle = open ( '/root/python/insertDB_log.log''a' )
            fileHandle.write ( 'Data Insert  [Error!!]\n' )
            fileHandle.close()
         print (' Error insert DB - with Arg[1]:'+sys.argv[1]+' Arg[2]:'+sys.argv[2]+' Arg[3]:'+sys.argv[3])
         db.close()
         sys.exit(1)
   except MySQLdb.Error, e:
       if ( ENABLE_LOG == True ):
             fileHandle = open ( '/root/python/insertDB_log.log''a' )
             fileHandle.write ( 'insert DB MySQLdb error %d: %s ' % (e.args[0],e.args[1]) )
             fileHandle.close()
       sys.exit(1)
# Data Insert Logic 의 끝
cs

 


정상적으로 동작하고 /root/python 경로에 insertDB_log.log 에 값이 잘 나오는것을 확인하면 

붉은 색으로 표시한 #ENABLE_LOG=False 의 # 부분을 제거 하고 #ENABLE_LOG=True 부분에 #으로 주석을 처리하자

그렇지 않으면 로그파일용량이 꽉 차서 오류가 생길것이다.



잘 동작하면 이렇게 로그가 찍힐 것이다.




이 파이선 소스는 우선 아두이노 윤의 설정에서 시간대 설정이후 현재 날짜와 초기 날짜를 비교해서 날짜가 과거이면
데이터를 입력하지 않는다. 이는 정상적인 세팅이 아니라고 판단해서 이다. 무조건 넣기를 원하면 해당 부분을 삭제 하면 된다.

로그데이터 보관주기는 INTERVAL -2400 hour 부분의 시간을 변경하면 된다.

2. 온습도 데이터를 보여주는 php 프로그램

아래의 첨부파일 2개를 /www 폴더에 ftp를 이용하여 업로드 해준다.

conn.php

tnh.php


conn.php 에서 DB 접속정보를 수정해 주면 된다.


웹페이지를 조회하는 주소는 http://arduino.local/tnh.php 을 웹브라우저에 입력하면 된다.


conn.php의 내용


1
2
3
4
5
6
7
8
9
10
<?php 
$server="127.0.0.1"
$username="root"
$password="arduino"
$database_name="tnh"
 
$connection=mysql_connect($server$username$password) or die("Error on connect MySQL db. 111"); 
 
$bd_sel=mysql_select_db($database_name) or die("Error on connect MySQL db. 222"); 
?>
cs



tnh.php의 내용



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
<html>
<meta http-equiv="refresh" content="5">
<title>온습도 모니터링</title>
<body>
<?php
include("conn.php");
echo "<b><font size=\"7\">온습도 모니터링 시스템</b>";
echo "<br><br>";
$query = " SELECT * FROM tnh ORDER BY timestamp desc limit 1";
$result = mysql_query($query) or die("Error on SQL QUERY");
if ($row = mysql_fetch_array($result)){
echo "<b><font size=\"5\">현재 온습도</b>";
echo "<table width=\"820\" bgcolor=\"#FFFFFF\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"0\">";
echo "<tr> ";
echo "<br>";
echo "<td align=\"center\"><b>수집시간</b></td> ";
echo "<td align=\"center\"><b>온도</b></td> ";
echo "<td align=\"center\"><b>습도</b></td> ";
echo "</tr> ";
do {
echo "<tr> ";
echo "<td align=\"center\">".$row["timestamp"]."</td> ";
echo "<td align=\"center\">".$row["tem"]."</td> ";
echo "<td align=\"center\">".$row["hum"]."</td> ";
echo "</tr> ";
while ($row = mysql_fetch_array($result));
echo "</table>";
else {
echo "'Error 1010-1'";
}
echo "<br>";
$query = " select date_format(timestamp, '%Y-%m-%d'), format(avg(tem),2), format(avg(hum),2), format(max(tem),2), format(max(hum),2) from tnh group by  date_format(timestamp, '%Y-%m-%d') ";
$result = mysql_query($query) or die("Error on SQL QUERY");
if ($row = mysql_fetch_array($result)){
echo "<b><font size=\"5\">일평균 온도데이터</b>";
echo "<br>";
echo "<br>";
echo "<table width=\"820\" bgcolor=\"#FFFFFF\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"0\">";
echo "<tr> ";
echo "<td align=\"center\"><b>시간</b></td> ";
echo "<td align=\"center\"><b>평균온도</b></td> ";
echo "<td align=\"center\"><b>평균습도</b></td> ";
echo "<td align=\"center\"><b>최고온도</b></td> ";
echo "<td align=\"center\"><b>최고습도</b></td> ";
echo "</tr> ";
do {
echo "<tr> ";
echo "<td align=\"center\">".$row["date_format(timestamp, '%Y-%m-%d')"]."</td> ";
echo "<td align=\"center\">".$row["format(avg(tem),2)"]."</td> ";
echo "<td align=\"center\">".$row["format(avg(hum),2)"]."</td> ";
echo "<td align=\"center\">".$row["format(max(tem),2)"]."</td> ";
echo "<td align=\"center\">".$row["format(max(hum),2)"]."</td> ";
echo "</tr> ";
while ($row = mysql_fetch_array($result));
echo "</table>";
else {
echo "'Error 1010-1'";
}
$query = " select date_format(timestamp, '%m월 %d일 %H시'), format(avg(tem),2), format(avg(hum),2), format(max(tem),2), format(max(hum),2) from tnh group by  date_format(timestamp, '%m월 %d일 %H시') ";
$result = mysql_query($query) or die("Error on SQL QUERY");
if ($row = mysql_fetch_array($result)){
echo "<br><br><br>";
echo "<b><font size=\"5\">시간별평균 온도데이터</b>";
echo "<br>";
echo "<br>";
echo "<table width=\"820\" bgcolor=\"#FFFFFF\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"0\">";
echo "<tr> ";
echo "<td align=\"center\"><b>시간</b></td> ";
echo "<td align=\"center\"><b>평균온도</b></td> ";
echo "<td align=\"center\"><b>평균습도</b></td> ";
echo "<td align=\"center\"><b>최고온도</b></td> ";
echo "<td align=\"center\"><b>최고습도</b></td> ";
echo "</tr> ";
do {
echo "<tr> ";
echo "<td align=\"center\">".$row["date_format(timestamp, '%m월 %d일 %H시')"]."</td> ";
echo "<td align=\"center\">".$row["format(avg(tem),2)"]."</td> ";
echo "<td align=\"center\">".$row["format(avg(hum),2)"]."</td> ";
echo "<td align=\"center\">".$row["format(max(tem),2)"]."</td> ";
echo "<td align=\"center\">".$row["format(max(hum),2)"]."</td> ";
echo "</tr> ";
while ($row = mysql_fetch_array($result));
echo "</table>";
else {
echo "'Error 1010-1'";
}
$query = " SELECT * FROM tnh ORDER BY timestamp desc limit 20";
$result = mysql_query($query) or die("Error on SQL QUERY");
if ($row = mysql_fetch_array($result)){
echo "<br><br><br>";
echo "<b><font size=\"5\">최근 20개의 온도데이터(최근데이터순)</b>";
echo "<table width=\"820\" bgcolor=\"#FFFFFF\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"0\">";
echo "<tr> ";
echo "<br>";
echo "<td align=\"center\"><b>시간</b></td> ";
echo "<td align=\"center\"><b>온도</b></td> ";
echo "<td align=\"center\"><b>습도</b></td> ";
echo "</tr> ";
do {
echo "<tr> ";
echo "<td align=\"center\">".$row["timestamp"]."</td> ";
echo "<td align=\"center\">".$row["tem"]."</td> ";
echo "<td align=\"center\">".$row["hum"]."</td> ";
echo "</tr> ";
while ($row = mysql_fetch_array($result));
echo "</table>";
else {
echo "'Error 1010-1'";
}
echo "<br>";
?>
</body>
</html>
cs

 


데이터를 가공하기 편하게 여러가지 경우의 수를 나타내 보았다 

필요한 부분을 가공해서 사용하면 될 것이다.


php 로 이렇게 결과가 나올것이다.



이상으로 아두이노 윤을 이용한 문자알림 웹온습도계 예제를 마칩니다.


+ Recent posts