아두이노-PHP와 DB사용하기

2019. 6. 5. 12:02프로젝트/카페 소음 알림 App

준비

우선 프로그램 설치가 필요합니다.

구글에 'XAMPP'라고 검색하고 다운로드

 

Download XAMPP

Includes: Apache 2.4.39, MariaDB 10.1.39, PHP 7.1.29 + SQLite 2.8.17/3.7.17 + multibyte (mbstring) support, Perl 5.16.3, ProFTPD 1.3.4c, phpMyAdmin 4.8.5, OpenSSL 1.0.2r, GD 2.0.35, Freetype2 2.4.8, libpng 1.5.26, gdbm 1.8.3, zlib 1.2.11, expat 2.0.1, Sabl

www.apachefriends.org

MySQL을 사용할 예정이기 때문에 XAMPP를 설치해줬습니다.


DB 생성

설치된 XAMPP폴더에 들어가면 'xampp-control.exe' 실행파일이 있습니다.

클릭해줍시다.

이런 창이 뜨면 Apache, MySQL의 Start 버튼을 눌러줍니다.

ID와 Port번호가 뜨면 MySQL의 Admin을 눌러줍니다.

 

데이터베이스를 만들어줘야 합니다.

저는 데이터베이스명에 'test'라고 적고 utf8mb4_unicode_ci 를 선택하고 만들기를 눌러줬습니다.

테이블 만들기 창이 뜨면 테이블 이름을 적고 컬럼수를 정해준 후 실행 버튼을 누릅니다.

저는 테이블 이름으로 'sensor'  그리고 'id', 'time', 'value' 3개의 컬럼을 사용하기 때문에 컬럼수 3으로 했습니다. 

 

이름

종류

데이터정렬방식

보기

Null

기본값

설명

추가

id

int(50)

   

아니오

없음

 

AUTO_INCREMENT

time

datatime

   

아니오

0000-00-00 00:00:00

   

value

int(50)

   

아니오

없음

   

테이블의 구조는 위와  같이 해줬습니다.

 


PHP문서작성

설치가 완료되었으면 PHP문을 작성해야 합니다.

저장 위치는 XAMPP > htdocs입니다. 

 

데이터 베이스의 'host', 'user', 'passwd'를 따로 정해주지 않았기 때문에 아래와 같이 데이터베이스와 연결해줍니다.

센서 값 하나만 받아오기 때문에 num변수 하나만 선언합니다.

날짜도 입력하기 때문에 sql문을 아래와 같이 입력했습니다.

 $sql = "INSERT INTO sensor(time,value) VALUES(now(),$num)";
<?php
 
$db_host = "localhost";
$db_user = "root";
$db_passwd = "";
$db_name = "test";
 
 
// MySQL - DB 접속.
 
$conn = mysqli_connect($db_host,$db_user,$db_passwd,$db_name);
 
if (mysqli_connect_errno()){
    
    echo "MySQL 연결 오류: " . mysqli_connect_error();
    
    exit;
    
} else {
    
    echo "DB : \"$db_name\"에 접속 성공.<br/>";
    
    $num=$_GET["num"];
    $sql = "INSERT INTO sensor(time,value) VALUES(now(),$num)";
    $result = mysqli_query($conn, $sql);
    
    mysqli_close($conn);
    
}

코드 작성

#include <SoftwareSerial.h>


int sensorValue;

SoftwareSerial ESP8266 (rxPin, txPin);

void setup() {
  Serial.begin(9600);   
  ESP8266.begin(9600);
  delay(2000);
  ESP8266.println("AT+RST\r\n"); //모듈 리셋
  delay(1000);
  ESP8266.println("AT+CWMODE=3\r\n"); //모드 3번 AP +Station Mode, 디바이이스 + AP 기능
  delay(1000);
  ESP8266.println("AT+CWJAP=\"공유기아이디\",\"공유기비밀번호\"\"\r\n"); //공유기 접속
  delay(3000);
  
  
}

void printResponse() {
  while (ESP8266.available()) {
    Serial.println(ESP8266.readStringUntil('\n')); 
  }
}

void loop() {
  sensorValue = 30; 
  Serial.println(sensorValue);
  //소리 센서의 값을 시리얼 모니터에 출력
  ESP8266.println("AT+CIPMUX=1"); //다중접속 설정을 1로한다.
  delay(1000);
  printResponse();
  ESP8266.println("AT+CIPSTART=4,\"TCP\",\"서버의아이피\",80"); //포트연결
  delay(1000);
  printResponse();
  String StsensorValue = String(sensorValue); //int형으로 가져온 센서값을 String으로 변환
  String cmd = "GET http://localhost/write_data.php?num="+StsensorValue+" HTTP/1.0"; 
  
  //GET할 주소 형식은 HTTP/1.0
  ESP8266.println("AT+CIPSEND=4," + String(cmd.length() + 4)); //데이터 전송
  delay(1000);

  ESP8266.println(cmd);
  delay(200);
  ESP8266.println();
  delay(200);
  printResponse();

//  delay(5000);
}