아두이노 - MySQL | Arduino - MySQL

아두이노는 센서 데이터를 수집하여 MySQL 데이터베이스에 저장할 수 있습니다. 또한, 아두이노는 MySQL 데이터베이스에서 데이터(명령)를 받아 LED, 모터, 액추에이터, 장치 등을 제어할 수 있습니다.

이 튜토리얼에서는 다음을 배우게 됩니다:

arduino MySQL

이 튜토리얼은 두 가지 경우에 대한 아두이노 코드를 제공합니다:

준비물

1×Arduino UNO R4 WiFi Amazon
1×USB Cable Type-C 쿠팡 | Amazon
1×(Recommended) Screw Terminal Block Shield for Arduino Uno 쿠팡 | Amazon
1×(Optional) Transparent Acrylic Enclosure For Arduino Uno Amazon

Alternatively if using Ethernet:

1×Arduino Uno Amazon
1×USB 2.0 cable type A/B 쿠팡 | Amazon
1×Arduino Ethernet Shield 2 Amazon
1×Ethernet Cable Amazon
1×(Optional) 9V Power Adapter for Arduino Amazon
1×(Recommended) Screw Terminal Block Shield for Arduino Uno 쿠팡 | Amazon
1×(Optional) Transparent Acrylic Enclosure For Arduino Uno Amazon
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.

아두이노 - MySQL

시스템 아키텍처에 대한 지식이 많지 않다면, MySQL 데이터베이스MySQL 서버 두 용어를 같은 것으로 이해할 수 있습니다. 시스템 아키텍처에 대해 많이 알게 되면 나중에 차이점을 알게 될 것입니다.

아두이노가 MySQL 데이터베이스와 상호작용하는 방법은 두 가지가 있습니다:

  • 아두이노는 MySQL 연결(직접 방식이라고 함)을 통해 MySQL 서버와 직접 상호작용합니다.
  • 아두이노는 HTTP 연결을 통해 MySQL 서버와 간접적으로 상호작용합니다(간접 방식이라고 함).

최고를 찾아보자.

아두이노는 MySQL 서버와 직접 상호작용합니다.

arduino directly to MySQL

이것은 더 간단해 보이지만 많은 단점이 있습니다:

이것은 MySQL 사용자 계정이 원격으로 MySQL 데이터베이스에 접근할 수 있게 해줍니다 ⇒ 이것은 사용자 계정에 제한된 권한이 부여되었다 하더라도 보안 측면에서 위험합니다.

데이터는 Arduino와/또는 MySQL 서버에서 처리되어야 합니다 ⇒ 이것은 Arduino 코드와 MySQL 스크립트의 복잡성을 증가시킵니다. 특히, Arduino 자원(메모리와 CPU 사용량)을 많이 소모합니다.

MySQL 서버는 경우에 따라 Arduino에 매우 큰 양의 데이터를 반환할 수 있습니다 ⇒ 이것은 Arduino가 메모리 부족으로 동작하지 못하게 할 수 있습니다.

사용 가능한 대부분의 MySQL 라이브러리는 SSL/TLS를 지원하지 않습니다. 사용자 이름/비밀번호를 포함한 데이터가 평문으로 전송됩니다 ⇒ 또 다른 보안 문제입니다.

아두이노는 HTTP/HTTPS를 통해 간접적으로 MySQL 서버와 상호작용합니다.

이 간접적인 방식은 직접적인 방식이 가지는 모든 문제를 해결합니다. 간접적인 방식이 직접적인 방식의 단점을 어떻게 극복하는지 보기 전에, 먼저 그것이 어떻게 작동하는지 보겠습니다.

작동 원리

  • 1단계: 아두이노가 웹 서버에 HTTP 요청을 합니다.
  • 2단계: 웹 서버가 PHP 스크립트를 실행합니다.
  • 3단계: PHP 스크립트는 HTTP 요청에서 데이터를 가져와 데이터를 처리한 다음 MySQL 데이터베이스와 상호작용합니다.
  • 4단계: PHP 스크립트가 결과를 처리하고 HTTP 응답을 통해 결과를 아두이노에 반환합니다.
Arduino MySQL HTTP

이 튜토리얼에서는 웹 서버와 MySQL 서버가 PC에 설치될 것입니다.

복잡해 보이지만 그렇지 않습니다. 이제 간접적인 방식이 직접적인 방식의 단점을 어떻게 극복하는지 살펴보겠습니다.

  • MySQL 서버와 HTTP 서버를 동일한 물리 서버에 설치함으로써, MySQL 사용자 계정이 로컬호스트에만 접근하도록 제한할 수 있습니다. 더욱이, MySQL 계정의 사용자 이름/비밀번호는 서버에 저장됩니다(3단계), 이는 시스템을 더 안전하게 만듭니다.
  • 데이터는 PHP 스크립트에 의해 처리됩니다(3단계 및 4단계). 이는 아두이노와 MySQL 서버의 작업 및 복잡성을 줄입니다. 데이터를 PHP 코드로 처리하는 것은 아두이노 코드와 MySQL 스크립트로 처리하는 것보다 훨씬 쉽습니다.
  • PHP 스크립트는 데이터를 처리하고 필요한 데이터만 아두이노(4단계)로 보냄으로써, 아두이노가 메모리 부족으로 인해 작동을 멈추는 것을 방지할 수 있습니다.
  • 대부분의 Ethernet/WiFi 라이브러리는 TLS/SSL을 지원하여 HTTPS 요청을 할 수 있게 합니다. HTTPS를 사용함으로써, 데이터는 암호화되어 인터넷을 통해 안전하게 교환됩니다.

1단계에서 Arduino와 웹 서버 간 인증을 위해 다른 사용자 이름/비밀번호를 사용할 수 있습니다. 보안상의 이유로 HTTP 사용자 이름/비밀번호는 MySQL 사용자 이름/비밀번호와 달라야 한다는 점을 유의하십시오.

이러한 이점들을 바탕으로, 본 튜토리얼의 나머지 부분에서는 간접적인 방식을 통해 Arduino를 MySQL과 사용하는 방법을 소개할 것입니다.

아두이노 - HTTP/HTTPS를 통한 MySQL

다음 단계를 수행해야 합니다:

  • PC에 MySQL 서버, 웹 서버, PHP 설치하기
  • MySQL 및 웹 서버 활성화하기
  • MySQL 사용자 계정 생성하기
  • MySQL 데이터베이스 생성하기
  • MySQL 테이블 생성하기
  • 하나 이상의 PHP 스크립트 파일 작성하기
  • 아두이노 코드 작성하기

이제 단계별로 해보자.

PC에 MySQL 서버, 웹 서버, PHP를 설치하세요.

다행히도 XAMPP 패키지에 이 모든 것이 포함되어 있습니다. 우리는 한 번만 설치하면 됩니다.

  • 이 링크에서 XAMPP를 다운로드하십시오.
  • 설치하십시오.

설치 후 PC에서 C:\xampp\htdocs 폴더를 볼 수 있습니다. 여기에는 PHP 코드를 넣는 곳입니다(나중에 참조).

2. MySQL 및 웹 서버 활성화

  • XAMPP 제어판 열기
  • MySQL 및 웹 서버를 활성화하려면 시작 버튼을 클릭하세요 (아래 이미지 참조)
Arduino XAMPP

3. MySQL 사용자 계정 생성

로컬호스트에서만 MySQL 데이터베이스에 연결할 수 있는 MySQL 계정을 생성하겠습니다.

  • 사용자 이름/비밀번호가 공개되더라도, 공격자가 귀하의 PC를 제어하지 않는 한 귀하의 MySQL 데이터베이스에 접근할 수 없습니다.
  • PHP와 MySQL이 동일한 PC에 설치되어 있기 때문에, PHP는 이 사용자 이름/비밀번호를 사용하여 MySQL 데이터베이스에 연결할 수 있습니다.

다음과 같이 MySQL 사용자 계정을 만듭시다: 사용자 이름은 Arduino이고 비밀번호는 ArduinoGetStarted.com입니다.

  • PC에서 명령 프롬프트를 열십시오. 튜토리얼이 끝날 때까지 닫지 마십시오.
  • 명령 프롬프트에서 다음 명령을 입력하십시오:
cd C:\xampp\mysql\bin
Command Prompt
C:\Users\youruser>cd C:\xampp\mysql\bin C:\xampp\mysql\bin>

기본적으로 MySQL은 비밀번호 없이 루트 계정을 가지고 있습니다. 비밀번호를 추가해야 합니다.

다음 명령어를 명령 프롬프트에 입력하여 루트 계정의 (예: your-root-password)를 설정합니다:

mysqladmin -u root password your-root-password
Command Prompt
C:\xampp\mysql\bin>mysqladmin -u root password your-root-password C:\xampp\mysql\bin>

명령 프롬프트에서 다음 명령을 입력하십시오:

mysql.exe -u root -p
  • 루트 비밀번호를 입력하고 Enter를 누르세요.
Command Prompt
C:\xampp\mysql\bin>mysql.exe -u root -p Enter password: ****************** Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 9 Server version: 10.4.6-MariaDB mariadb.org binary distribution Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]>

아래 명령어를 복사하여 커맨드 프롬프트에 붙여넣어 사용자 이름이 Arduino이고 비밀번호가 ArduinoGetStarted.com인 MySQL 사용자 계정을 생성하십시오:

CREATE USER 'Arduino'@'localhost' IDENTIFIED BY 'ArduinoGetStarted.com'; GRANT ALL PRIVILEGES ON *.* TO 'Arduino'@'localhost' WITH GRANT OPTION; FLUSH PRIVILEGES;
Command Prompt
MariaDB [(none)]> CREATE USER 'Arduino'@'localhost' IDENTIFIED BY 'ArduinoGetStarted.com'; Query OK, 0 rows affected (0.005 sec) MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'Arduino'@'localhost' WITH GRANT OPTION; Query OK, 0 rows affected (0.005 sec) MariaDB [(none)]> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.001 sec) MariaDB [(none)]>

이제 MySQL 사용자 계정을 성공적으로 생성하였습니다. 사용자 이름과 비밀번호를 기억하세요. PHP 스크립트에서 사용될 것입니다.

4. MySQL 데이터베이스 생성하기

다음 명령어를 커맨드 프롬프트에 입력하여 db_arduino라는 데이터베이스를 만듭시다:

CREATE DATABASE db_arduino CHARACTER SET = 'utf8' COLLATE = 'utf8_general_ci';
Command Prompt
MariaDB [(none)]> CREATE DATABASE db_arduino CHARACTER SET = 'utf8' COLLATE = 'utf8_general_ci'; Query OK, 1 row affected (0.003 sec) MariaDB [(none)]>

5. MySQL 테이블 생성

아래의 커맨드를 복사하여 커맨드 프롬프트에 붙여 넣어 tbl_temp라는 이름의 테이블을 생성합시다:

USE db_arduino; CREATE TABLE tbl_temp ( temp_id INT UNSIGNED NOT NULL AUTO_INCREMENT, temp_value FLOAT DEFAULT 0.00, PRIMARY KEY (temp_id) );
Command Prompt
MariaDB [(none)]> USE db_arduino; Database changed MariaDB [db_arduino]> MariaDB [db_arduino]> CREATE TABLE tbl_temp ( -> temp_id INT UNSIGNED NOT NULL AUTO_INCREMENT, -> temp_value FLOAT DEFAULT 0.00, -> PRIMARY KEY (temp_id) -> ); Query OK, 0 rows affected (0.044 sec) MariaDB [db_arduino]>

6. 하나 이상의 PHP 파일을 작성하십시오.

HTTP 요청에서 온도를 가져와 데이터베이스에 삽입하는 insert_temp.php라는 PHP 파일을 생성하십시오.

<?php if(isset($_GET["temperature"])) { $temperature = $_GET["temperature"]; // get temperature value from HTTP GET $servername = "localhost"; $username = "Arduino"; $password = "ArduinoGetStarted.com"; $dbname = "db_arduino"; // Create connection $conn = new mysqli($servername, $username, $password, $dbname); // Check connection if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $sql = "INSERT INTO tbl_temp (temp_value) VALUES ($temperature)"; if ($conn->query($sql) === TRUE) { echo "New record created successfully"; } else { echo "Error: " . $sql . " => " . $conn->error; } $conn->close(); } else { echo "temperature is not set"; } ?>

이 파일을 C:\xampp\htdocs 폴더 안에 넣으세요.

PC의 IP 주소를 얻으세요. 모르는 경우에는 구글에서 검색하세요.

웹 브라우저(예: Chrome)를 열고 다음 링크에 접속해서 PHP 코드를 테스트하세요: http://192.168.0.26/insert_temp.php?temperature=27.5 . 위의 IP 주소를 귀하의 PC 주소로 바꿔야 한다는 점을 주의하세요.

웹 브라우저에서의 출력

MySQL Test

명령 프롬프트에서 다음 명령어를 입력하여 데이터베이스에 데이터가 저장되어 있는지 확인하세요:

SELECT * from tbl_temp;
Command Prompt
MariaDB [db_arduino]> SELECT * from tbl_temp; +---------+------------+ | temp_id | temp_value | +---------+------------+ | 1 | 27.5 | +---------+------------+ 1 row in set (0.001 sec) MariaDB [db_arduino]>

보시다시피, 데이터베이스에는 27.5의 온도가 저장되어 있습니다. 다음 단계는 유사한 HTTP 요청을 여러분의 PC로 만드는 아두이노를 작성하는 것입니다.

7. 아두이노 코드 작성하기

테스트를 위해 Arduino Uno와 Ethernet Shield 또는 Arduino Uno R4 WiFi를 사용할 것입니다.

아래의 아두이노 코드는 온도 29.1°C를 데이터베이스에 삽입하기 위해 PC로 HTTP를 만듭니다.

아두이노 우노 R4 WiFi를 위한 아두이노 코드

/* * 이 Arduino 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-mysql */ #include <WiFiS3.h> const char ssid[] = "YOUR_WIFI_SSID"; // 네트워크 SSID(이름) 변경 const char pass[] = "YOUR_WIFI_PASSWORD"; // 네트워크 비밀번호 변경 (WPA용이거나 WEP 키로 사용) WiFiClient client; int status = WL_IDLE_STATUS; int HTTP_PORT = 80; String HTTP_METHOD = "GET"; char HOST_NAME[] = "192.168.0.26"; // PC의 IP 주소로 변경 String PATH_NAME = "/insert_temp.php"; String queryString = "?temperature=29.1"; void setup() { Serial.begin(9600); // WiFi 모듈 확인: if (WiFi.status() == WL_NO_MODULE) { Serial.println("WiFi 모듈과의 통신 실패!"); // 계속하지 않음 while (true) ; } String fv = WiFi.firmwareVersion(); if (fv < WIFI_FIRMWARE_LATEST_VERSION) { Serial.println("펌웨어를 업그레이드 해주세요"); } // WiFi 네트워크에 연결 시도: while (status != WL_CONNECTED) { Serial.print("SSID에 연결 시도 중: "); Serial.println(ssid); // WPA/WPA2 네트워크에 연결. OPEN 또는 WEP 네트워크를 사용하는 경우 이 라인 변경: status = WiFi.begin(ssid, pass); // 연결을 위해 10초 대기: delay(10000); } // 보드의 IP 주소 출력: Serial.print("IP 주소: "); Serial.println(WiFi.localIP()); // 80번 포트의 웹 서버에 연결: if (client.connect(HOST_NAME, HTTP_PORT)) { // 연결되면: Serial.println("서버에 연결됨"); // HTTP 요청 만들기: // HTTP 헤더 보내기 client.println(HTTP_METHOD + " " + PATH_NAME + queryString + " HTTP/1.1"); client.println("Host: " + String(HOST_NAME)); client.println("Connection: close"); client.println(); // HTTP 헤더 종료 while (client.connected()) { if (client.available()) { // 서버에서 받은 바이트를 읽고 시리얼 모니터에 출력: char c = client.read(); Serial.print(c); } } // 서버의 연결이 끊어지면, 클라이언트를 중지: client.stop(); Serial.println(); Serial.println("연결 끊김"); } else { // 연결되지 않으면: Serial.println("연결 실패"); } } void loop() { }

아두이노 우노/메가 및 이더넷 쉴드를 위한 아두이노 코드

/* * 이 Arduino 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-mysql */ #include <SPI.h> #include <Ethernet.h> // 아래 MAC 주소를 Arduino Shield 2에 붙어 있는 스티커에 인쇄된 MAC 주소로 교체하세요 byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; EthernetClient client; int HTTP_PORT = 80; String HTTP_METHOD = "GET"; char HOST_NAME[] = "192.168.0.26"; // 귀하의 PC의 IP 주소로 변경하십시오 String PATH_NAME = "/insert_temp.php"; String queryString = "?temperature=29.1"; void setup() { Serial.begin(9600); // DHCP를 사용하여 이더넷 실드를 초기화합니다: if (Ethernet.begin(mac) == 0) { Serial.println("DHCP를 사용하여 IP 주소를 얻는 데 실패했습니다"); while(true); } // 포트 80에 있는 웹 서버에 연결합니다: if(client.connect(HOST_NAME, HTTP_PORT)) { // 연결되었으면: Serial.println("서버에 연결됨"); // HTTP 요청을 수행합니다: // HTTP 헤더 보내기 client.println(HTTP_METHOD + " " + PATH_NAME + queryString + " HTTP/1.1"); client.println("Host: " + String(HOST_NAME)); client.println("Connection: close"); client.println(); // HTTP 헤더 끝 while(client.connected()) { if(client.available()){ // 서버에서 오는 바이트를 읽고 시리얼 모니터에 출력합니다: char c = client.read(); Serial.print(c); } } // 서버 연결이 끊겼으니 클라이언트를 중지합니다: client.stop(); Serial.println(); Serial.println("연결 끊김"); } else {// 연결되지 않았다면: Serial.println("연결 실패"); } } void loop() { }

사용 방법

  • 이더넷 쉴드를 사용하는 경우, 아두이노 우노에 이더넷 쉴드를 쌓으세요.
  • 이더넷 케이블을 이더넷 쉴드에 연결하세요.
  • USB 케이블을 통해 아두이노 우노를 PC에 연결하세요.
  • 코드 내의 IP 주소를 귀하의 PC의 IP 주소로 변경하세요.
  • 코드를 컴파일하고 아두이노에 업로드하세요.
  • 시리얼 모니터를 열세요.
  • 시리얼 모니터의 결과 확인하세요.
COM6
Send
Connected to server HTTP/1.1 200 OK Date: Tue, 12 Jan 2021 07:52:22 GMT Server: Apache/2.4.39 (Win64) OpenSSL/1.1.1c PHP/7.3.8 X-Powered-By: PHP/7.3.8 Content-Length: 31 Connection: close Content-Type: text/html; charset=UTF-8 New record created successfully disconnected
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

명령 프롬프트에서 다음 명령을 입력하여 데이터베이스에 데이터가 저장되어 있는지 확인하십시오:

SELECT * from tbl_temp;
Command Prompt
MariaDB [db_arduino]> SELECT * from tbl_temp; +---------+------------+ | temp_id | temp_value | +---------+------------+ | 1 | 27.5 | | 2 | 29.1 | +---------+------------+ 2 rows in set (0.000 sec) MariaDB [db_arduino]>

보시다시피, 온도 29.1이 데이터베이스에 저장되어 있습니다.

아두이노가 MySQL 데이터베이스에 데이터를 삽입, 업데이트 또는 가져오는 방법

위의 예에서 우리는 MySQL 데이터베이스에 데이터를 삽입하는 방법을 배웠습니다. 데이터베이스에서 데이터를 업데이트하고 가져오는 것은 비슷합니다. PHP 스크립트에서 MySQL 쿼리를 변경하기만 하면 됩니다. W3Schools에서 더 배울 수 있습니다.

고급 사용법

보안을 강화하기 위해

  • Arduino 코드를 변경하여 HTTP 대신 HTTPS를 사용할 수 있습니다. Arduino - HTTPS 참고하세요.
  • 사용자 이름/비밀번호를 사용하여 Arduino와 웹 서버 간의 인증을 수행할 수 있습니다. 기본 액세스 인증을 참고하세요.

※ NOTE THAT:

최고 수준의 보안을 갖춘 완벽한 시스템을 만들기 위해서는 더 많은 작업을 해야 합니다 (예: MySQL 인젝션 방지, HTTPS를 REST API로 만들기, 데이터에 Json 형식 사용하기 등). 하지만, 이 튜토리얼은 초보자들이 아두이노를 배우기 위해 만들어졌습니다. 가능한 한 단순하게 만들었습니다. 이 튜토리얼을 학습한 후 사용자는 이를 확장할 수 있습니다.

동영상

비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.

※ OUR MESSAGES

  • Please feel free to share the link of this tutorial. However, Please do not use our content on any other websites. We invested a lot of effort and time to create the content, please respect our work!