//구글광고

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


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 로 이렇게 결과가 나올것이다.



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


온습도계 예제 7 - mysql DB 생성


1. DB생성

mysql DB에 tnh 라는 데이터베이스를 생성한다.


putty로 ardoino.local 로 ssh 접속을 한다.


다음 명령어로 mysql 관리자로 접속한다.


 

mysql -u root -p



password를 물어보면 mysql 생성시 입력한 암호를 입력한다.

본예제의 패스워드는 arduino다.




접속하였으면 다음의 명령어로 데이터베이스를 생성한다.

mysql에서의 데이터베이스는 oracle db의 user와 비슷한 개념이다.



 create database tnh;

  




이제 tnh 라는 데이터 베이스가 생성되었다.

다음의 명령어로 tnh 데이터베이스로 접속한다.

( 오라클 데이터베이스의 conn 유저명/패스워드 와 비슷한 개념이다. )



 use tnh;

 


database changed 라는 메세지가 나올 것이다.


그럼 아래의 테이블 생성 구문으로 데이터가 들어갈 

tnh 테이블을 생성하자.


 

create table tnh

(

timestamp datetime  ,

sensor_id tinyint(4),

tem       float    , 

hum       float     

)





테이블의 구조는 다음과 같다.


컬럼명 

데이터타입 

설명 

timestamp 

datetime 

센서가 정보를 수집한 시각이다. 

sensor_id 

tinyint(4) 

센서Id이다. 추후에 여러개의 센서를 추가할 것을 대비해 만들어둔다. 

tem 

float 

온도값, 소수 

hum 

float

습도값, 소수 


이것으로 DB생성이 완료 되었다.



UTF-8 방식의 한글 JSP 개발 환경 세팅하기(Elipse + Tomcat )


1. jdk 설치

다운로드 해서 설치한다.


2. JAVA 환경변수 설정

윈도우 고급 시스템설정에서 환경변수에 아래항목 적용한다.

 변수명

값 

 PATH

jdk설치경로\bin 

 CLASSPATH

jdk설치경로\lib\tools.jar 

JAVA_HOME 

 jdk설치경로



3. Tomcat 설치

Tomcat 은 그냥 받아서 압축을 풀어주면 된다


4. Tomcat 환경설정하기

윈도우 고급 시스템설정에서 환경변수에 아래항목 적용한다.

 변수명

값 

 CATALINA_HOME

설치경로(예시c:\apache-tomcat-8.0.9) 



5. Eclipse 설치

웹프로젝트용 Eclipse IDE for Java EE Developers 를 다운받아 압축해제.

6. Eclipse 설정

1) 웹페이지 한글 깨짐 방지 설정(UTF-8)
   [Window]메뉴 [Preference] 창에서 [General] – [Workspace] 클릭
   [Text file encoding] 의 [Other] – [ UTF-8] 선택후 [Apply] 버튼클릭



2) 소스코드 라인부여설정

  [Window]메뉴 [Preference] 창에서 [General] - [Editors] – [Text Editors] 선택

  [Show line numbers] 체크후 [Apply ] 버튼 클릭




7. Eclipse 에서 Tomcat 연동설정하기


1)웹서버 등록하기

  이클립스에서 [File] – [New] – [Others] 메뉴선택

  [New]창의 [Wizard]에서 [Server] - [Server] 선택후 [Next] 선택



[New Server] 창의 [Define a New Server ] 화면에서 [Select the server type] 에서 

[Apache]의 [Tomcat v8.0 Server(현재설치한 톰캣버전)] 선택한후 [Next] 클릭



8. eclipse에서 tomcat 서비스용으로 war파일 내보내기(WAR export)

eclipse 에서 생성한 프로젝트를 war로 export한다

프로젝트에서 오른쪽클릭 [export] – [WAR file] 선택

[Export] 창에서 [Destination]의 [Browse] 버튼을 눌러 ‘tomcat홈\webapps’로 

내보낸다. 



9. Eclipse 의 page template 설정

모바일웹과 한글 깨짐 방지를 위해 새로 작성하는 jsp파일마다 UTF-8 로 매번 페이지 설정하는 번거로움을 

없애기 위해 Eclipse page template 을 통해 등록해둔다.


[Window] – [Preferences] 메뉴 선택.

[Prefrences] 창에서 [Web] – [JSP Files] 선택 후, [Encoding] 값을 

[ISO10646/Unicode(UTF-8)] 로 지정한 후 [Apply] 버튼 클릭




[JSP Files] – [Editor] – [Templates] 선택후 [New] 버튼 클릭

[Name]에 적절한 이름을 적고 (예:New JSP File(HTML5)) 

[Context]에서 [New JSP]를 선택한 뒤 [ Pattern] 에 아래내용 추가



<%@ page language="java" contentType="text/html; charset=${encoding}"

 pageEncoding="${encoding}"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="${encoding}">

<title>Insert title here</title>

</head>

<body>

${cursor}

</body>

</html> 




10. Tomcat 기반에서 한글처리

1) 서버에서 웹 브라우저에 응답되는 페이지의 한글처리
모든 웹페이지에 필수로 기재해줌(템플릿처리해둠)

<%@ page contentType=”text/html;charset=utf-8”%>

2) 웹브라우저에서 서버로 넘어오는 파라미터의 한글처리(Post방식)
폼에서 파라미터를 넘겨받는 페이지에는 반드시 처리해줌

<% request.setCharacterEncoding(“utf-8”);%>

3) 웹브라우저에서 서버로 넘어오는 파라미터의 한글처리(Get방식)
위의 작업을 해줘도 메소드가 get방식으로 넘어오면 한글이 깨짐
 Server.xml 파일에 한글인코딩을 지정해줘야함
(ajax로 처리할때도 필요 )

-이클립스상에서 운영되는 tomcat 에서 Get방식 한글처리추가하기

이클립스의 [Project Explorer] 뷰에서 [Servers] – [Tomcat v8.0 ~ ] 에 있는 server.xml 파일을 더블클릭한다.
 [Source] 탭을 클릭하여 <connector> 태그에 URIEncoding=”UTF-8” 추가

<Connector connectionTimeout=”20000” port=”8080” protocol=”HTTP/1.1” redirectPort=”8443” URIEncoding=”UTF-8” /> 



- 운영중인 Tomcat 상에서 한글처리방식 추가

Tomcat홈 [conf] 폴더의 server.xml 파일에 <connect> 태그를 찾아서 URIEncoding=”UTF-8" 추가해준다.

<Connector connectionTimeout=”20000” port=”8080” protocol=”HTTP/1.1” redirectPort=”8443” URIEncoding=”UTF-8” /> 






+ Recent posts