[Arduino] <아두이노 프로젝트> 소음 감지 및 알림 IoT 프로젝트 Noise Detection and Notification IoT Project




프로젝트 목표는 주변에서 발생하는 소리를
스마트폰을 통해 눈으 혹은 진동으로 파악할 수 있게 하는 것입니다.


1. 부품

사용한 부품은 다음과 같습니다.

Wemos D1 R1 보드
이 보드는 wifi 모듈이 부착되어 있어 추가로 wifi모듈을 연결하지 않아도 됩니다.
MAX 9814
소리 증폭 감지 센서로 주변 소음측정을 위해 필요합니다.

2. 아두이노

아두이노와 연결은 다음과 같이 합니다.
아두이노      -     사운드 센서
GND             GND
5V                 VCC
A0         –        OUT
아두이노 코드는 다음과 같습니다. 


아두이노 3개 모두 알맞게 고쳐서 업로드 합니다.


빨간색 부분은 사용자에 맞게 고쳐야 됩니다.
/**
 * BasicHTTPClient.ino
 *
 *  Created on: 24.05.2015
 *
 */

#include <Arduino.h>

#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>

#include <ESP8266HTTPClient.h>

#define USE_SERIAL Serial

ESP8266WiFiMulti WiFiMulti;

const int sampleWindow = 50;      // 샘플링한 시간 50ms
unsigned int value;               // 소리 증폭 감지 센서 값 받는 변수

void setup() {

    USE_SERIAL.begin(115200);
   // USE_SERIAL.setDebugOutput(true);

    USE_SERIAL.println();
    USE_SERIAL.println();
    USE_SERIAL.println();

    for(uint8_t t = 4; t > 0; t--) {
        USE_SERIAL.printf("[SETUP] WAIT %d...\n", t);
        USE_SERIAL.flush();
        delay(1000);
    }

    WiFi.mode(WIFI_STA);
    WiFiMulti.addAP("와이파이이름", "와이파이비번");    //와이파이 이름 비번 입력

}

void loop() {
    // wait for WiFi connection
      unsigned long startMillis= millis();  // 샘플링 시작
      unsigned int peakToPeak = 0;          // 음성 신호의 진폭

      unsigned int signalMax = 0;           // 최대 크기를 초기에는 0으로 설정
      unsigned int signalMin = 1024;        // 최소 크기를 초기에는 1024로 설정

      while (millis() - startMillis < sampleWindow){  // 데이터를 50ms마다 모으는 while문
        value = analogRead(A0);           // 소리 감지센서에더 데이터 받아오기
        if (value < 1024){                // 받아온 데이터의 값이 1024 이하일 때
           if (value > signalMax)         // 최대 크기 측정
              signalMax = value;          // 최대 크기 signalMax에 저장
           else if (value < signalMin)    // 최소 크기 측정
             signalMin = value;          // 최소 크기 sigmalMin에 저장
          }
        }
   
      peakToPeak = signalMax - signalMin;  // 최대- 최소 = 진폭값
      double volts = (peakToPeak * 5.0) / 1024;  // 전압 단위로 변환 = 소리 크기로 변환
   
    if((WiFiMulti.run() == WL_CONNECTED)) {

        HTTPClient http;

        int temp=volts*100;

        USE_SERIAL.print("[HTTP] begin...\n");
        // configure traged server and url
        //http.begin("https://192.168.1.12/test.html", "7a 9c f4 db 40 d3 62 5a 6e 21 bc 5c cc 66 c8 3e a1 45 59 38"); //HTTPS
        http.begin("http://서버 IP 입력/test1.php?d="+String(temp)); //HTTP

        USE_SERIAL.print("[HTTP] GET...\n");
        // start connection and send HTTP header
        int httpCode = http.GET();

        // httpCode will be negative on error
        if(httpCode > 0) {
            // HTTP header has been send and Server response header has been handled
            USE_SERIAL.printf("[HTTP] GET... code: %d\n", httpCode);

            // file found at server
            if(httpCode == HTTP_CODE_OK) {
                String payload = http.getString();
                USE_SERIAL.println(payload);
            }
        } else {
            USE_SERIAL.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
        }

        http.end();
    }

    delay(1000); 
}


test1.php는 뒤에서 추가할 것입니다.

다음은 케이스 입니다.


아두이노를 케이스에 연결하는 모습니다.



연결하고 정리하면 위와 같은 모습이 됩니다.


2. 데이터 베이스

데이터 베이스는 Mysql을 사용하였습니다.


thingspeak는 최소 업데이트 주기가 15초라서 패스했습니다.


설치나 실행은 제 다른 게시물에서 확인하실 수 있습니다.


mysql은 다음과 같이 test 데이터 베이스 안에

테이블 3개을 추가하였습니다.



그리고 그 테이블의 구조는 아래와 같습니다.



스케줄러를 이용하여 1분마다 데이터가 초기화 되게 하였습니다.



3. PHP 파일

PHP 파일은 아두이노에서 데이터베이스로, 데이터베이스에서 스마트폰으로

센서값을 전송하기위해서 사용하는 파일입니다.


설치와 사용방법은 다른 게시글에서 확인 가능하거나 검색가능합니다.


먼저 아두이노 데이터베이스로 센서값을 전송하기 위한 php파일입니다.


이름은 test1.php 입니다.

(다른 아두이노 2개를 위해서 test2.php, test3.php를 만들고 코드도 알맞게 고쳐야 합니다.)

<?php

$mysql_hostname = '서버 IP';
$mysql_username = 'mysql ID';
$mysql_password = 'mysql 비번';
$mysql_database = 'test';
$mysql_port = '3306';
$mysql_charset = 'utf8';



$dsn = 'mysql:host='.$mysql_hostname.';dbname='.$mysql_database.';port='.$mysql_port.';charset='.$mysql_charset;

$temp = $_GET['d'];

try
{
$connect = new PDO( $dsn, $mysql_username, $mysql_password );

$connect->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$sql = "INSERT INTO sound1 (sound,created) VALUES ('$temp',now())";   //데이터 넣기

    

$connect->exec($sql);

    echo "New record created successfully";

    echo "$temp";


}
catch ( PDOException $e )
{
echo 'Connect failed : ' . $e->getMessage() . '';
return false;
}


$connect = null;

?>


다음은 데이터베이스에서 스마트폰으로 센서값을 전송하기 위한 php 파일입니다.


이름은 test4.php입니다.


<?php

$mysql_hostname = '서버 IP';
$mysql_username = 'mysql ID';
$mysql_password = 'mysql 비번';
$mysql_database = 'test';
$mysql_port = '3306';
$mysql_charset = 'utf8';



$dsn = 'mysql:host='.$mysql_hostname.';dbname='.$mysql_database.';port='.$mysql_port.';charset='.$mysql_charset;


try
{
$connect = new PDO( $dsn, $mysql_username, $mysql_password );

     $statement = $connect->query("select sound from sound1 order by id desc limit 1"); 
while($record1 = $statement->fetch(PDO::FETCH_ASSOC)){
//$result1 .= "<tr>"; 
foreach($record1 as $column){ 
$result1 .=/* "<td>" . */$column/* . "</td>"*/; 
/*$result1 .= "</tr>";*/ }


$statement = $connect->query("select sound from sound2 order by id desc limit 1"); 

while($record2 = $statement->fetch(PDO::FETCH_ASSOC)){
  
foreach($record2 as $column){ 
$result2 .=$column; 
}
     

     $statement = $connect->query("select sound from sound3 order by id desc limit 1"); 
while($record3 = $statement->fetch(PDO::FETCH_ASSOC)){
  
foreach($record3 as $column){ 
$result3 .=$column; 
  }



}
catch ( PDOException $e )
{
echo 'Connect failed : ' . $e->getMessage() . '';
return false;
}


$connect = null;

?>
<?php 
echo "sound1:";
echo 0+$result1;
echo "dB";
echo "sound2:";
echo 0+$result2;
echo "dB";
echo "sound3:";
echo 0+$result3;
echo "dB";
echo "finish" ?>


4. 앱

앱은 앱 인벤터를 이용하여 만들었습니다.

코드를 쓸 수 없으니 사진으로 대체하겠습니다.



입력 완료는 버튼, 장소입력 밑 같은 텍스트 이고 외는 레이블입니다.


시계 1은 1000, 시계 2 또한 1000입니다.




이 블럭을 실행 시키려면 thingspeak.txt파일을 스마트폰 저장공간 가장 바깥쪽에 넣어야 합니다.


thingspeak.txt 내용은 다음과 같습니다.

place1:1.place2:2.place3:3.&http://서버IP/test4.php





위 블록은 장소 텍스트를 변경하는 블록입니다.


위 블록은 소리 값을 화면에 출력하는 블록입니다.


 위 블록은 위위 블록에 이어지는 부분으로 일정 크기 이상 소리가 나면 진동과 배경값이 바뀌게 하는 블록입니다.

마지막으로 위 블록은 업데이트 시간을 알려주는 블록입니다.


다 되었으면 빌드-앱을 눌러 저장 후 핸드폰에 저장하여 설치합니다.


5. 결과

이 모든 것들을 성공적으로 하면

다음과 같은 화면이 나옵니다.


여기까지 소음 감지 및 알림 프로젝트였습니다.

Comments

  1. 안녕하세요!! 저희도 소리를 받아서 앱으로 확인하고 싶어서 따라해보았는데 앱인벤터까지 만들었는데 혹시 보이지않는컴포넌트의 웹1의 url은 무엇으로 해야 되는지 모르겠어서 댓글남깁니다!!ㅜㅜ 알려주시면 감사하겠습니다!

    ReplyDelete
    Replies
    1. url에는 아무것도 입력하지 않았습니다!

      Delete
  2. 그혹시 저기 test.1 php 파일 $temp = get부분에서 타입이맞지않다고뜨는데여

    ReplyDelete
    Replies
    1. 그부분에 대해서는 잘 모르겠네요... 죄송합니다.

      Delete
  3. 저는 발명을 하려고하는 학생입니다. 그런데 //http.begin("https://192.168.1.12/test.html", "7a 9c f4 db 40 d3 62 5a 6e 21 bc 5c cc 66 c8 3e a1 45 59 38"); //HTTPS 이부분도 똑같이 따라 써도 되나요?
    그리고 데이터 베이스 부분도 제가 잘 몰라서 그런데 조금 도와 주세요

    ReplyDelete
  4. 문의를 드립니다. Iot를 이용하여 소음 측정을 해보려고 하고 있습니다. 그런데 하신것과 같이 mysql을 설치하고 아파치를 설치하였다가 나중에 phpmyadmin을 쓰셨길래 다시 받아서 했는데 (서비스에서 아파치서비스와 mysql은 서비스 중지) test1.php에서 new PDO라는 class에서 Fatal에러가 발생해서 인터넷을 찾아보니 myphpadmin에서 설치된 mysql이 5.0버전이라 동작을 안하는 것 같습니다.

    문의사항은 혹시 iot 프로그램에서 사용하신 아파치버전, myspl버전, phpmyadmin버전을 알고싶습니다.

    ReplyDelete
    Replies
    1. 이 문제는 더 높은 xampp를 설치해서 해결하였습니다. 감사합니다.

      Delete
  5. 혹시 앱인벤터 부분만 설명 더 자세히 해주실수 있나요

    ReplyDelete

Post a Comment