//구글광고

 

외부접속이 가능한 유저를 생성한다.


create user 'admin'@'%' identified by 'arduino';

 

유저는 admin , 암호는 arduino로 만들었다. 이는 외부 mysql에서 접속할때 접속자로 사용된다.

 

외부에서 접속해서 사용할 데이터베이스를 생성한다.

create database sensor;

 

생성된 sensor 데이터베이스의 모든 권한을 admin 유저에게 준다. 여기서 admin유저는 외부접속이 가능한 유저이다.
grant all privileges on sensor.* to 'admin'@'%';
flush privileges;
show grants for 'admin'@'%';

이제 운영체제 에서 아래의 내용을 수정한다.
cd /etc
sudo vi my.cnf

bind-address를  127.0.0.1 -> 0.0.0.0 으로 변경

 

 

mysql 서비스를 재시작 하면 이제 외부에서 접속이 가능해진다

접속할때는 SSH모드로 접속하거나(root유저 사용시)

admin유저 사용시는 tcp/ip로 해서 3306으로 접속하면 된다.

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


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생성이 완료 되었다.



온습도계 예제 6 - sms 설정과 sketch


1. sms 설정

본 예제에서는 python 으로 문자 메세지를 전송한다. 
다양한 문자 메세지 회사가 있으니
원하는 곳으로 하자

본 예제에서는 coolsms에서 api를 받아왔다

요즘 스팸 문자가 쏟아져서 법이 개정되었다
발신인의 번호를 인증받아야 한다.

만약 문자 메세지 전송이 안될경우 마이페이지의 전송결과를 조회 해서 실패가 뜨면 인증 부분을 수행해야 한다.



이렇게 발신번호가 없이 예전에 만든 계정이 있다면 발신번호 추가를 통해 발신번호를 꼭 등록하자.



회원가입을 한 후 아두이노 IDE를 실행한다.



상단의 툴 메뉴를 통해 보드와 포트를 설정해준다.





포트선택 화면이다 ip번호가 아닌 com포트를 선택하자.

나중에 시리얼 모니터때 값이 안나오는 문제가 있다.




라이브러리 추가

아래 압축 파일들을 다운받는다.


Adafruit_Sensor-master.zip

DHT-sensor-library-master.zip


2개의  zip 파일을 다운받아 바탕화면이나 아무곳에 저장해 둔다.


스케치 > 라이브러리 포함하기 > .ZIP 라이브러리 추가.. 메뉴를 통해 다운받은 2개의 압축파일을 추가해준다.




아래의 소스 코드를 다운받아서 내용을 붙여넣는다.


온습도계v1.txt



붙여넣은 다음 업로드 버튼을 눌러 코드를 전송한다.




업로드 이후에 우측 상단에 시리얼 모니터 버튼을 클릭한다.

 



시리얼 모니터에 현재 온습도가 나오면 정상 동작하는 것이다.




현재 온도와 습도가 나오고 있다 여기서 변경할 수 있는 변수를 알아보면 ,


#include <Process.h>

#include <stdlib.h>

#include "DHT.h"


#define DHTPIN 8     // 센서의 데이터 핀번호

#define DHTTYPE DHT22   // DHT 22  (AM2302)

DHT dht(DHTPIN, DHTTYPE);


String TEM;

String HUM;

char cTEM[5];

char cHUM[5];


double TEM_LIMIT=30.0;  // 온도 문자 경보수치 30도  이 값을 수정하면 알람 임계치가 바뀐다

double HUM_LIMIT=80.0; // 온도 문자 경보 습도 80퍼센트


unsigned long curMillis=0;

unsigned long eventMillis=0;

unsigned long diffMillis=0;

byte eventFlag=LOW; 

unsigned long eventDelay=600000;   // 문자 경보를 알려주는 딜레이 시간 -- 이전에 경보를 보냈으면 10분 동안에는 보내지 않는다.  

 

void setup() {

  // put your setup code here, to run once:

  Bridge.begin();

  dht.begin();

  Serial.begin(9600);

  Serial.println("init");

}


void loop() {

  // put your main code here, to run repeatedly:

  double h = dht.readHumidity();

  double t = dht.readTemperature();

  Serial.print(" TEM:");  

  Serial.print(t);

  Serial.print("  HUM : ");

  Serial.println(h);

      

  dtostrf(h, 3,1, cHUM);

  dtostrf(t, 3,1, cTEM);  

  

  HUM= String(cHUM);

  TEM= String(cTEM);


  curMillis=millis(); // 현재 밀리를 구한다.

 

if (curMillis < eventMillis )

{

   Serial.println("eventmili reset..");

   eventMillis = curMillis ;

}


diffMillis = curMillis - eventMillis;

  

  if (eventFlag == HIGH)

  {

    if ( diffMillis > eventDelay )

    {

      eventFlag=LOW;

        Serial.print(" evenymilli :");  

        Serial.print(eventMillis);

        Serial.print("  curMillis : ");

        Serial.println(curMillis);

        Serial.print(" diff  :");  

        Serial.print( diffMillis );

        Serial.print("  eventDelay  : ");

        Serial.println(eventDelay );

        Serial.println("Event Flag reset..");

      }

    }


  if ((( t > TEM_LIMIT ) && eventFlag == LOW ) || (( h > HUM_LIMIT ) && eventFlag == LOW ))

  {

      eventMillis = curMillis;

      eventFlag=HIGH;

      Serial.println(" SMS alarm !! ");

   

     Process p1;            

     p1.begin("python");

     p1.addParameter("/root/python/sendSMS.py");      

     p1.addParameter(TEM); 

     p1.addParameter(HUM); 

     p1.run();   

      

    }


  Process p;            

  p.begin("python");

  p.addParameter("/root/python/insertDB.py");      

  p.addParameter("1");  

  p.addParameter(TEM); 

  p.addParameter(HUM); 

  p.run();

  Serial.println("Mysql DB insert");  

  

  delay(30000);  //1000 = 1초 , 30초마다 한번 동작하게 한다. 온도게 스팩상 최소 2초로 할것.


}





파이선 소스코드를 아두이노에 업로드 하자


coolsms.py

sendSMS.py


위의 두 예제 파일 중에서 sendSMS.py 를 메모장으로 열어 필요한 부분을 수정하자.


# -*- coding: ms949 -*-


#SMS전송.


import sys

import time

import coolsms


cs = coolsms.sms()

cs.appversion("TEMP/1.0")

cs.charset("cp949")

cs.setuser( "아이디","비밀번호")


cs.addsms("받는사람번호", "보내는사람번호", "온습도알림. 온도:"+sys.argv[1]+" 습도:"+sys.argv[2])


nsent = 0

if cs.connect():

    # add 된 모든 메세지를 서버로 보냅니다.

    nsent = cs.send()

else:

    # 오류처리

    print "Server connect error!!!"


cs.disconnect()

cs.emptyall()

sys.exit(0)

 


빨간색으로 표시된 부분을 자신의 정보에 맞게 변경하자.


그런다음 sftp 를 이용하여 아두이노 윤의 /root/python 폴더를 만들어서 위의 파일을 복사해 두자



sketch 소스의 변수중에 알람온도를 낮춰서 문자가 오는지 테스트 해보자,

단 문자간의 딜레이를 너무 짧게 주면 문자 폭탄을 맞을수 있으니 주의하자.


이렇게 해서 정상적으로 문자가 오면 문자 메세지 전송 및 온습도 측정 부분은 완성이다.


다음엔 DB에 입력하는 파이선 소스와 웹페이지 부분을 보겠다.


아두이노 윤(yun)을 활용한 문자알림가능한 웹페이지형 온습도계 만들기 5

서버세팅(4)



1. 아두이노 윤의 wifi 세팅과 초기 패스워드 설정

2. 아두이노 윤 ssh 접속  

3. mysql 서버 설치 및 설정

4. php5 설치

5. php- mysql-  python 연동모듈 설치




4. php5 설치


혹시 중간에 접속을 끊고 다시 시작한다면 opkg update 를 수행해 주자.

php 모듈을 설치 한다.



opkg install php5 php5-cgi 

 






php 파일을 사용하기 위해 몇가지 설정을 한다.
vi 에디터를 이용해 설정을 변경할 것이다.


vi /etc/config/uhttpd 

 








이렇게 편집창이 뜰것이다.

 





아래로 화살표를 내려 # list interpreter ".php=/usr/bin/php-cgi"

행을 찾아간다 




해당 행의 # 위에서 x 키를 누르면 #표시가 지워진다 





esc를 누르고 :wq 엔터 를 입력한다. 




이렇게 저장해서 밖으로 빠져나올 것이다. 





이제 httpd 를 재시작한다.

 /etc/init.d/uhttpd restart 






5. php- mysql-  python 연동모듈 설치


이제 연동 모듈들을 설치한다.

 opkg install php5-mod-mysql 





php.ini 에 mysql 을 설정한다.


sed -i 's,;extension=mysql.so,extension=mysql.so,g' /etc/php.ini 

 





python 에서 mysql 에 접속하기 위한 커넥터를 설치한다.


opkg install python-mysql 

 



ftp 설치


opkg install vsftpd openssh-sftp-server

 





이것으로 기본 세팅을 마친다.


아두이노 윤(yun)을 활용한 문자알림가능한 웹페이지형 온습도계 만들기 4

서버세팅(3)



1. 아두이노 윤의 wifi 세팅과 초기 패스워드 설정

2. 아두이노 윤 ssh 접속  

3. mysql 서버 설치 및 설정

4. php5 설치

5. python 과 mysql 연동 모듈 설치

6. php와 mysql 연동 모듈 설치




3. mysql 서버 설치 및 설정



패키지들을 설치 하기 전에 저장소 업데이트를 해준다.



opkg update 

 



이제 mysql 서버를 설치하자



opkg install libpthread libncurses libreadline mysql-server 

 






mysql 관련 환경을 설정해준다.



sed -i 's,^datadir.*,datadir         = /srv/mysql/,g' /etc/my.cnf 


sed -i 's,^tmpdir.*,tmpdir          = /tmp/,g' /etc/my.cnf 


mkdir -p /srv/mysql 

 






mysql db 를 생성해준다.(호스트 네임 관련 오류가 발생하니까 반드시 --force옵션으로 해주자 )



mysql_install_db --force 


 




init.d 에 자동 실행과 관련된 설정을 추가 해준다.



/etc/init.d/mysqld start 


/etc/init.d/mysqld enable 


 




mysql 패스워드를 설정한다. 여기선 arduino 로 하겠다.



mysqladmin -u root password 'arduino' 


 



이것으로 mysql 설치 및 설정은 끝났다.


아두이노 윤(yun)을 활용한 문자알림가능한 웹페이지형 온습도계 만들기 3

서버세팅(2)



1. 아두이노 윤의 wifi 세팅과 초기 패스워드 설정

2. 아두이노 윤 ssh 접속  

3. mysql 서버 설치 및 설정

4. php5 설치

5. python 과 mysql 연동 모듈 설치

6. php와 mysql 연동 모듈 설치





2. 아두이노 윤 ssh 접속


아두이노 윤으로 ssh 접속하여 서버 구성요소들을 설치 진행하여야 한다.

프리웨어 ssh 접속기로 putty 를 사용하여 진행하였다 
여기서 다운받을 수 있다.


 1) putty 를 실행한다.

 2) Host Name 에 arduino.local 을 입력 아래의 Open 버튼을 클릭해서 접속한다.


..

( 만약 arduino.local 로 접속이 안되면, http://kimazfactory.tistory.com/24 을 참조하여 해결하도록 하자. )



3) login as : 창이 뜨면 root 를 입력한다.




4) password 를 묻는 질문에는 이전에 설정했던 암호를 넣어준다.

아래와 같은 접속 환경이 나오면 완료










아두이노 윤(yun)을 활용한 문자알림가능한 웹페이지형 온습도계 만들기 2

서버세팅(1)


본 실습을 위해 아두이노 윤의 리눅스 (openwrt) 에  몇가지 세팅을 하여야 한다. 그중 서버 세팅에 대해 알아보자


세팅할 모든 구성요소를 나열하자면 다음과 같다.


1. 아두이노 윤의 wifi 세팅과 초기 패스워드 설정

2. 아두이노 윤 ssh 접속  

3. mysql 서버 설치 및 설정

4. php5 설치

5. python 과 mysql 연동 모듈 설치

6. php와 mysql 연동 모듈 설치




이제 순서대로 진행해보자.


1. 아두이노 윤의 wifi 세팅과 초기 패스워드 설정


아두이노 yun 에 전원은 연결하고  무선 네트워크를 검색해보면 Arduino Yun-XXXXXXXXXX 형태의 AP가 검색되면 거기로 접속하자.
( 이때 인터넷은 끊어짐으로 주의하자. )



접속한 다음, 인터넷창에 192.168.240.1 로 접속하면 아래의 화면이 나타난다.


기본 패스워드인 arduino 를 입력하고 LOG-IN 버튼을 클릭해서 로그인하자.




접속되었으면 CONFIGURE 버튼을 클릭한다.


TIMEZONE을 Asia/Seoul 로 변경해준다.
암호를 변경하고 싶으면 원하는 걸로 변경해준다. ( 단 본 예제에서 모든 암호는 arduino로 통일한다. )
연결할 wifi를 선택하고( 집에 쓰는 무선공유기 ) 암호가 있다면 정확하게 입력해준다. 

그리고 CONFIGURE & RESTART 버튼을 클릭하여 저장한다.



그러면 이러한 화면이 뜨면서 네트워크 설정을 시작한다.


잠시후면 네트워크 설정이 종료된다.


이제 무선 네트워크를 기존사용하던 무선네트워크로 접속한다.


 

- 여기까지 진행하면서 오류가 생길경우 해결방법

 여기까지 진행하면서 wifi 패스워드를 잘못입력하든지 해서 오류가 생긴경우 
 http://kimazfactory.tistory.com/23 글을 참조하여 초기화 한 뒤 다시 진행한다.



인터넷 주소창에 arduino.local 로 접속한다.





- 만약 arduino.local로 접속이 되지 않는다면

 http://kimazfactory.tistory.com/24 글을 참조하여 해결한다.


 





아두이노 yun 을 이용한 문자알림 웹온습도계 만들기(1)


 회사 전산실에 에어컨이 시원찮아 계속 고장이 난다. 온도가 높아지면 서버들이 다 꺼지는데 큰 문제가 아닐 수 없다.


주말이나 야간에 누군가 조치하러 다녀가고 여간 골치가 아니다.


 FMS 솔루션을 도입하자니 우리 전산실 규모가 그정도는 아니고 오픈소스 하드웨어를 사용해서 저렴하게  온도가 올라가면 문자로 알려주면 정말 좋겠다 싶을때 만들면 좋은 초 심플 프로젝트 되시겠다.



1. 프로젝트 개요

아두이노(Arduino) yun 의 장점을 이용하여 온습도 데이터를 로깅하고 임계점 이상의 값에서 문자 메세지를 보내주는 심플한 프로젝트


2. 주요기능

- 웹으로 현재 온습도를 조회할 수 있다.
- 특정 온습도 이상이면 문자메세지로 알림을 받을수 있다.

3. 준비물

  - H/W(wifi환경이어야 한다.)

                               1. 아두이노 yun 보드


 

                                 2.AM2302 ( AOSONG 사 제품 - DHT22 ) 온습도계 센서


온습도계 센서 스팩


센서명

 AM2302 

 제조사

AOSONG 

 입력전원

3.3v ~ 5.5v DC 

 습도측정범위 

0에서 99.9% 

 온도측정범위 

-40에서 80 도 

 정밀도 

+- 2% 습도  +- 0.5 온도 

 출력 

디지털 1 와이어 

 수집시간 

2초에 1번 

측정에소요되는 전류 

 최대 2.5mA 

 크기

27mm 폭 x 58.75mm 높이 x 13.30mm 깊이 



이센서를 선택한 이유(장점)



1. 오픈소스 하드웨어 만들때 제일 불편한게 케이스임. 이건 하우징이 되어 있어서 만들때 깔끔함

(온습도 측정의 경우 표면온도 이기 때문에 온습도계를 아무데나 놓을순 없기 때문에 플라스틱 하우징으로 깔끔해서 선호 )


2. 가격이 적당히 저렴


3. 온습도 스팩 및 정밀도가 매우 우수함


4. 별도의 풀업저항을 연결할 필요없이 1가닥 와이어로 값을 센싱해올 수 있음. 

(저렴한 온습도 센서는 별도의 저항을 연결해서 배선해야 하지만 이제품은 다 내장 되어있음 )


5. 라이브러리 제공으로 아두이노에서 간단한 코드로 수치 해석 가능






                                3. 아두이노 yun 케이스



   
   - S/W
                            아두이노 개발툴 (  https://www.arduino.cc/en/Main/Software ) : 다운로드 하여 설치한다.



   AM2302(온습도센서) 라이브러리   

       https://github.com/adafruit/DHT-sensor-library 에서 DHT.h 파일을 다운로드 한다.
 
       

DHT.h




   - 기타
   SMS 연동 API
   ( 본 예제에서는 coolsms 의 API를 이용하므로 coolsms 에 회원가입해서 약간의 금액을 충전해야 함. )



4. 배선


                              1. 아두이노 yun 보드를 케이스에 안착시킨다.





                             2. 빨간선을 5V 에 , 검정선을 GND에 연결한다.


                                 

                              3. 노란선(데이터선)을 8번 핀에 연결한다.


 

                              4. 전선을 꾸깃꾸깃 정리 해서 케이스 뚜껑을 닫고 센서를 양면테잎으로 고정해준다.



                        이번강좌에서는 준비물과 하드웨어 배선까지 알아보았다.

                        다음 강좌에서 계속


+ Recent posts