ESP32

ESP32/ESP8266 Insert Data into MySQL Database using PHP and Arduino IDE

기하 2021. 8. 16. 06:13

이 프로젝트에서는 MySQL 데이터베이스에 데이터(센서 판독값)를 삽입하기 위해 PHP 스크립트에 HTTP POST 요청을 하는 ESP32 또는 ESP8266 클라이언트를 빌드합니다.

 

 

또한 센서 판독값, 타임스탬프 및 데이터베이스의 기타 정보를 표시하는 웹 페이지가 있습니다. 자신의 서버에 액세스하여 전 세계 어디에서나 데이터를 시각화할 수 있습니다.

예를 들어 ESP 보드에 연결된 BME280 센서를 사용할 것입니다. 제공된 코드를 수정하여 다른 센서에서 판독값을 보내거나 여러 보드를 사용할 수 있습니다.

이 프로젝트를 빌드하려면 다음 기술을 사용합니다.

  • Arduino IDE로 프로그래밍된 ESP32 또는 ESP8266
  • 호스팅 서버 및 도메인 이름
  • MySQL에 데이터를 삽입하고 웹 페이지에 표시하는 PHP 스크립트
  • 판독값을 저장할 MySQL 데이터베이스

1. PHP 애플리케이션 및 MySQL 데이터베이스 호스팅

이 프로젝트의 목표는 ESP32 또는 ESP8266의 센서 판독값을 저장할 수 있는 고유한 도메인 이름과 호스팅 계정을 갖는 것입니다. 자신의 서버 도메인에 액세스하여 전 세계 어디에서나 판독값을 시각화할 수 있습니다. 다음은 높은 수준의 개요입니다.

 

 

모든 프로젝트 요구 사항을 처리할 수 있는 다음 호스팅 서비스 중 하나를 사용하는 것이 좋습니다.

  • Bluehost(cPanel로 사용자 친화적) : 3년 플랜 가입 시 무료 도메인 이름. 무제한 웹 사이트 옵션을 선택하는 것이 좋습니다.
  • Digital Ocean : 명령줄을 통해 관리하는 Linux 서버입니다. 고급 사용자에게만 이 옵션을 권장했습니다.

이 두 서비스는 제가 사용하고 개인적으로 추천하는 서비스이지만 다른 호스팅 서비스를 사용해도 됩니다. PHP와 MySQL을 제공하는 모든 호스팅 서비스는 이 튜토리얼에서 작동합니다. 호스팅 계정이 없다면 Bluehost에 가입하는 것이 좋습니다 .

Bluehost로 호스팅 및 도메인 이름 얻기 »

호스팅 계정을 구입할 때 도메인 이름도 구입해야 합니다. 이것이 이 프로젝트를 흥미롭게 만드는 것입니다. 도메인 이름(http://example-domain.com)으로 이동하여 ESP 판독값을 볼 수 있습니다.

우리 프로젝트가 마음에 들면 권장 호스팅 서비스 중 하나에 가입하는 것을 고려할 수 있습니다. 우리 작업을 지원할 것이기 때문입니다.

참고 : 당신은 또한 실행할 수있는 램프 (리눅스, 아파치, MySQL은, PHP) 서버 에 라즈베리 파이에 로컬 네트워크에서 데이터에 액세스 . 그러나 이 자습서의 목적은 전 세계 어디에서나 액세스할 수 있는 자체 도메인 이름으로 판독값을 게시하는 것입니다. 이를 통해 타사 IoT 플랫폼에 의존하지 않고도 ESP 판독값에 쉽게 액세스할 수 있습니다.

 

 

 

 

 

 

 

2. MySQL 데이터베이스 준비

호스팅 계정에 가입하고 도메인 이름을 설정 한 후 cPanel 또는 유사한 대시보드에 로그인할 수 있습니다. 그런 다음 다음 단계에 따라 데이터베이스, 사용자 이름, 암호 및 SQL 테이블을 만듭니다.

데이터베이스 및 사용자 생성

1. 검색창에 "database"를 입력하고 "MySQL Database Wizard"를 선택합니다.

 

 

2. 원하는 데이터베이스 이름을 입력합니다. 제 경우 데이터베이스 이름은esp_data. 그런 다음 "다음 단계" 버튼을 누릅니다.

 

 

 

 

 

 

 

 

 

참고: 나중에 호스트가 제공하는 접두사와 함께 데이터베이스 이름을 사용해야 합니다(위 스크린샷에서 내 데이터베이스 접두사는 흐릿함). 나는 그것을 다음과 같이 언급 할 것이다.example_esp_data 지금부터.

3. 데이터베이스 사용자 이름을 입력하고 암호를 설정합니다. 나중에 PHP 코드와 데이터베이스 연결을 설정하는 데 필요하기 때문에 이러한 세부 정보를 모두 저장해야 합니다.

 

 

그게 다야! 새 데이터베이스와 사용자가 성공적으로 생성되었습니다. 나중에 필요하므로 이제 모든 세부 정보를 저장하십시오.

  • 데이터베이스 이름 : example_esp_data
  • 사용자 이름 : example_esp_board
  • 비밀번호 : 귀하의 비밀번호

SQL 테이블 생성

데이터베이스와 사용자를 생성한 후 cPanel 대시보드로 돌아가 "phpMyAdmin"을 검색합니다.

 

 

 

 

 

 

 

 

 

왼쪽 사이드바에서 데이터베이스 이름을 선택합니다. example_esp_data "SQL" 탭을 엽니다.

 

 

중요: 열었는지 확인하십시오.example_esp_data데이터 베이스. 그런 다음 SQL 탭을 클릭합니다. 이 정확한 단계를 따르지 않고 SQL 쿼리를 실행하지 않으면 잘못된 데이터베이스에 테이블을 생성할 수 있습니다.

다음 스니펫에서 SQL 쿼리를 복사합니다.

 

 

 

 

 

 

 

CREATE TABLE SensorData ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, sensor VARCHAR(30) NOT NULL, location VARCHAR(30) NOT NULL, value1 VARCHAR(10), value2 VARCHAR(10), value3 VARCHAR(10), reading_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP )

원시 코드 보기

SQL 쿼리 필드(빨간색 사각형으로 강조 표시됨)에 붙여넣고 "이동" 버튼을 눌러 테이블을 만듭니다.

 

 

그런 다음 새로 생성된 테이블이 표시되어야 합니다. 센서데이터 에서 example_esp_data 아래 그림과 같이 데이터베이스

 

 

 

 

 

 

 

 

 

3. PHP 스크립트 HTTP POST – MySQL 데이터베이스에 데이터 삽입

이 섹션에서는 ESP32 또는 ESP8266에서 들어오는 요청을 수신하고 데이터를 MySQL 데이터베이스에 삽입하는 역할을 하는 PHP 스크립트를 만들 것입니다.

cPanel과 함께 호스팅 제공업체를 사용하는 경우 "파일 관리자"를 검색할 수 있습니다.

 

 

그런 다음 public_html 옵션을 선택하고 "+ 파일" 버튼을 눌러 새 .php 파일 을 만듭니다 .

 

 

참고: 이 자습서를 따르고 있고 PHP 또는 MySQL에 익숙하지 않은 경우 이러한 정확한 파일을 만드는 것이 좋습니다. 그렇지 않으면 다른 URL 경로와 함께 제공된 ESP 스케치를 수정해야 합니다.

 

 

 

 

 

 

 

다음 과 같은 정확한 이름과 확장자를 사용 하여 /public_html에 새 파일을 만듭니다 . post-esp-data.php

 

 

새로 생성된 파일( post-esp-data.php )을 편집하고 다음 스니펫을 복사합니다.

<?php /* Rui Santos Complete project details at https://RandomNerdTutorials.com/esp32-esp8266-mysql-database-php/ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. */ $servername = "localhost"; // REPLACE with your Database name $dbname = "REPLACE_WITH_YOUR_DATABASE_NAME"; // REPLACE with Database user $username = "REPLACE_WITH_YOUR_USERNAME"; // REPLACE with Database user password $password = "REPLACE_WITH_YOUR_PASSWORD"; // Keep this API Key value to be compatible with the ESP32 code provided in the project page. // If you change this value, the ESP32 sketch needs to match $api_key_value = "tPmAT5Ab3j7F9"; $api_key= $sensor = $location = $value1 = $value2 = $value3 = ""; if ($_SERVER["REQUEST_METHOD"] == "POST") { $api_key = test_input($_POST["api_key"]); if($api_key == $api_key_value) { $sensor = test_input($_POST["sensor"]); $location = test_input($_POST["location"]); $value1 = test_input($_POST["value1"]); $value2 = test_input($_POST["value2"]); $value3 = test_input($_POST["value3"]); // Create connection $conn = new mysqli($servername, $username, $password, $dbname); // Check connection if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $sql = "INSERT INTO SensorData (sensor, location, value1, value2, value3) VALUES ('" . $sensor . "', '" . $location . "', '" . $value1 . "', '" . $value2 . "', '" . $value3 . "')"; if ($conn->query($sql) === TRUE) { echo "New record created successfully"; } else { echo "Error: " . $sql . "<br>" . $conn->error; } $conn->close(); } else { echo "Wrong API Key provided."; } } else { echo "No data posted with HTTP POST."; } function test_input($data) { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return $data; }

 

 

 

 

 

 

 

원시 코드 보기

파일을 저장하기 전에 수정해야 합니다. $dbname, $사용자 이름 그리고 $비밀번호 고유한 세부정보가 포함된 변수:

// Your Database name $dbname = "example_esp_data"; // Your Database user $username = "example_esp_board"; // Your Database user password $password = "YOUR_USER_PASSWORD";

데이터베이스 이름, 사용자 이름 및 암호를 추가한 후 파일을 저장하고 이 자습서를 계속합니다. 다음 URL 경로에서 도메인 이름에 액세스하려고 하면 다음이 표시됩니다.

http://example-domain.com/post-esp-data.php

 

 

4. PHP 스크립트 – 데이터베이스 콘텐츠 표시

웹 페이지의 모든 데이터베이스 콘텐츠를 표시할 다른 PHP 파일을 /public_html 디렉토리 에 만듭니다 . 새 파일 이름: esp-data.php

 

 

새로 생성된 파일( esp-data.php )을 편집하고 다음 코드를 복사합니다.

<!DOCTYPE html> <html><body> <?php /* Rui Santos Complete project details at https://RandomNerdTutorials.com/esp32-esp8266-mysql-database-php/ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. */ $servername = "localhost"; // REPLACE with your Database name $dbname = "REPLACE_WITH_YOUR_DATABASE_NAME"; // REPLACE with Database user $username = "REPLACE_WITH_YOUR_USERNAME"; // REPLACE with Database user password $password = "REPLACE_WITH_YOUR_PASSWORD"; // Create connection $conn = new mysqli($servername, $username, $password, $dbname); // Check connection if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $sql = "SELECT id, sensor, location, value1, value2, value3, reading_time FROM SensorData ORDER BY id DESC"; echo '<table cellspacing="5" cellpadding="5"> <tr> <td>ID</td> <td>Sensor</td> <td>Location</td> <td>Value 1</td> <td>Value 2</td> <td>Value 3</td> <td>Timestamp</td> </tr>'; if ($result = $conn->query($sql)) { while ($row = $result->fetch_assoc()) { $row_id = $row["id"]; $row_sensor = $row["sensor"]; $row_location = $row["location"]; $row_value1 = $row["value1"]; $row_value2 = $row["value2"]; $row_value3 = $row["value3"]; $row_reading_time = $row["reading_time"]; // Uncomment to set timezone to - 1 hour (you can change 1 to any number) //$row_reading_time = date("Y-m-d H:i:s", strtotime("$row_reading_time - 1 hours")); // Uncomment to set timezone to + 4 hours (you can change 4 to any number) //$row_reading_time = date("Y-m-d H:i:s", strtotime("$row_reading_time + 4 hours")); echo '<tr> <td>' . $row_id . '</td> <td>' . $row_sensor . '</td> <td>' . $row_location . '</td> <td>' . $row_value1 . '</td> <td>' . $row_value2 . '</td> <td>' . $row_value3 . '</td> <td>' . $row_reading_time . '</td> </tr>'; } $result->free(); } $conn->close(); ?> </table> </body> </html>

원시 코드 보기

를 추가한 후 $dbname, $사용자 이름 그리고 $비밀번호 파일을 저장하고 이 프로젝트를 계속하십시오.

// Your Database name $dbname = "example_esp_data"; // Your Database user $username = "example_esp_board"; // Your Database user password $password = "YOUR_USER_PASSWORD";

 

 

 

 

 

 

 

다음 URL 경로에서 도메인 이름에 액세스하려고 하면 다음이 표시됩니다.

http://example-domain.com/esp-data.php

 

 

그게 다야! 브라우저에 빈 테이블이 인쇄된 것을 보면 모든 것이 준비되었음을 의미합니다. 다음 섹션에서는 ESP32 또는 ESP8266의 데이터를 데이터베이스에 삽입하는 방법을 배웁니다.

5. ESP32 또는 ESP8266 준비

이 프로젝트는 ESP32 및 ESP8266 보드와 모두 호환됩니다. 간단한 회로를 조립하고 30초마다 데이터베이스에 온도, 습도, 압력 등을 삽입하기 위해 제공된 스케치를 업로드하기만 하면 됩니다.

필요한 부품

이 예에서는 BME280 센서에서 센서 판독값을 얻습니다. 다음은 이 프로젝트의 회로를 구축하는 데 필요한 부품 목록입니다.

위의 링크를 사용하거나 MakerAdvisor.com/tools 로 직접 이동 하여 프로젝트에 필요한 모든 부품을 최적의 가격으로 찾을 수 있습니다!

 

 

회로도

우리가 사용하는 BME280 센서 모듈은 I2C 통신 프로토콜을 통해 통신하므로 ESP32 또는 ESP8266 I2C 핀에 연결해야 합니다.

 

 

 

 

 

 

 

 

 

 

 

ESP32에 BME280 배선

ESP32 I2C 핀은 다음과 같습니다.

  • GPIO 22:  SCL(SCK)
  • GPIO 21:  SDA(SDI)

따라서 다음 회로도에 표시된 대로 회로를 조립하십시오( BME280이 있는 ESP32에 대한 전체 안내서 읽기 ).

 

 

권장 자료: ESP32 핀아웃 참조 가이드

ESP8266에 BME280 배선

ESP8266 I2C 핀은 다음과 같습니다.

  • GPIO 5  (D1): SCL(SCK)
  • GPIO 4  (D2): SDA(SDI)

 

 

 

 

 

 

 

 

 

 

 

ESP8266 보드를 사용하는 경우 다음 회로도와 같이 회로를 조립합니다( BME280이 포함된 ESP8266에 대한 전체 가이드 읽기 ).

 

 

권장 자료: ESP8266 핀아웃 참조 가이드

ESP32/ESP8266 코드

Arduino IDE를 사용하여 ESP32/ESP8266을 프로그래밍하므로 Arduino IDE에 ESP32/ESP8266 애드온이 설치되어 있어야 합니다. 사용 중인 보드에 따라 다음 자습서 중 하나를 따르세요.

필요한 보드 애드온을 설치한 후 다음 코드를 Arduino IDE에 복사하되 아직 업로드하지 마십시오. 작동하려면 몇 가지를 변경해야 합니다.

/* Rui Santos Complete project details at https://RandomNerdTutorials.com/esp32-esp8266-mysql-database-php/ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. */ #ifdef ESP32 #include <WiFi.h> #include <HTTPClient.h> #else #include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> #include <WiFiClient.h> #endif #include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_BME280.h> // Replace with your network credentials const char* ssid = "REPLACE_WITH_YOUR_SSID"; const char* password = "REPLACE_WITH_YOUR_PASSWORD"; // REPLACE with your Domain name and URL path or IP address with path const char* serverName = "http://example.com/post-esp-data.php"; // Keep this API Key value to be compatible with the PHP code provided in the project page. // If you change the apiKeyValue value, the PHP file /post-esp-data.php also needs to have the same key String apiKeyValue = "tPmAT5Ab3j7F9"; String sensorName = "BME280"; String sensorLocation = "Office"; /*#include <SPI.h> #define BME_SCK 18 #define BME_MISO 19 #define BME_MOSI 23 #define BME_CS 5*/ #define SEALEVELPRESSURE_HPA (1013.25) Adafruit_BME280 bme; // I2C //Adafruit_BME280 bme(BME_CS); // hardware SPI //Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI void setup() { Serial.begin(115200); WiFi.begin(ssid, password); Serial.println("Connecting"); while(WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("Connected to WiFi network with IP Address: "); Serial.println(WiFi.localIP()); // (you can also pass in a Wire library object like &Wire2) bool status = bme.begin(0x76); if (!status) { Serial.println("Could not find a valid BME280 sensor, check wiring or change I2C address!"); while (1); } } void loop() { //Check WiFi connection status if(WiFi.status()== WL_CONNECTED){ WiFiClient client; HTTPClient http; // Your Domain name with URL path or IP address with path http.begin(client, serverName); // Specify content-type header http.addHeader("Content-Type", "application/x-www-form-urlencoded"); // Prepare your HTTP POST request data String httpRequestData = "api_key=" + apiKeyValue + "&sensor=" + sensorName + "&location=" + sensorLocation + "&value1=" + String(bme.readTemperature()) + "&value2=" + String(bme.readHumidity()) + "&value3=" + String(bme.readPressure()/100.0F) + ""; Serial.print("httpRequestData: "); Serial.println(httpRequestData); // You can comment the httpRequestData variable above // then, use the httpRequestData variable below (for testing purposes without the BME280 sensor) //String httpRequestData = "api_key=tPmAT5Ab3j7F9&sensor=BME280&location=Office&value1=24.75&value2=49.54&value3=1005.14"; // Send HTTP POST request int httpResponseCode = http.POST(httpRequestData); // If you need an HTTP request with a content type: text/plain //http.addHeader("Content-Type", "text/plain"); //int httpResponseCode = http.POST("Hello, World!"); // If you need an HTTP request with a content type: application/json, use the following: //http.addHeader("Content-Type", "application/json"); //int httpResponseCode = http.POST("{\"value1\":\"19\",\"value2\":\"67\",\"value3\":\"78\"}"); if (httpResponseCode>0) { Serial.print("HTTP Response code: "); Serial.println(httpResponseCode); } else { Serial.print("Error code: "); Serial.println(httpResponseCode); } // Free resources http.end(); } else { Serial.println("WiFi Disconnected"); } //Send an HTTP POST request every 30 seconds delay(30000); }

 

 

 

 

 

 

 

 

 

 

 

원시 코드 보기

네트워크 자격 증명 설정

네트워크 자격 증명으로 다음 줄을 수정해야 합니다. SSID 및 암호. 코드는 어디를 변경해야 하는지 잘 설명되어 있습니다.

// Replace with your network credentials const char* ssid = "REPLACE_WITH_YOUR_SSID"; const char* password = "REPLACE_WITH_YOUR_PASSWORD";serverName 설정

ESP가 판독값을 자체 서버에 게시할 수 있도록 도메인 이름도 입력해야 합니다.

const char* serverName = "http://example-domain.com/post-esp-data.php";

 

 

 

 

 

 

 

 

 

 

 

이제 보드에 코드를 업로드할 수 있습니다. ESP32 또는 ESP8266 보드 모두에서 바로 작동해야 합니다. 코드가 어떻게 작동하는지 알고 싶다면 다음 섹션을 읽어보세요.

코드 작동 방식

이 프로젝트는 이미 꽤 길기 때문에 코드가 어떻게 작동하는지 자세히 다루지는 않겠지만 다음은 간단한 요약입니다.

  • 작동하도록 모든 라이브러리 가져오기(Arduino IDE에서 선택한 보드를 기반으로 ESP32 또는 ESP8266 라이브러리를 가져옴)
  • 변경하려는 변수를 설정합니다(API 키 값, 센서 이름, 센서 위치)
  • NS API 키 값수정할 수 있는 임의의 문자열일 뿐입니다. 보안상의 이유로 사용되므로 API 키를 아는 사람만 데이터베이스에 데이터를 게시할 수 있습니다.
  • 디버깅 목적으로 직렬 통신 초기화
  • 라우터와 Wi-Fi 연결 설정
  • 판독값을 얻으려면 BME280을 초기화하십시오.

그런 다음, 고리() 실제로 최신 BME280 판독값으로 30초마다 HTTP POST 요청을 하는 곳입니다.

// Your Domain name with URL path or IP address with path http.begin(serverName); // Specify content-type header http.addHeader("Content-Type", "application/x-www-form-urlencoded"); // Prepare your HTTP POST request data String httpRequestData = "api_key=" + apiKeyValue + "&sensor=" + sensorName + "&location=" + sensorLocation + "&value1=" + String(bme.readTemperature()) + "&value2=" + String(bme.readHumidity()) + "&value3=" + String(bme.readPressure()/100.0F) + ""; int httpResponseCode = http.POST(httpRequestData);

댓글을 달 수 있습니다. http요청데이터 모든 BME280 판독값을 연결하고 사용하는 위의 변수 http요청데이터 테스트 목적으로 아래 변수:

String httpRequestData = "api_key=tPmAT5Ab3j7F9&sensor=BME280&location=Office&value1=24.75&value2=49.54&value3=1005.14";

데모

모든 단계를 완료한 후 ESP 보드가 일부 판독값을 수집하여 서버에 게시하도록 합니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

모든 것이 정확하면 Arduino IDE 직렬 모니터에 다음과 같이 표시됩니다.

 

 

이 URL 경로에서 도메인 이름을 여는 경우:

http://example-domain.com/esp-data.php

데이터베이스에 저장된 모든 판독값이 표시되어야 합니다. 웹 페이지를 새로고침하여 최신 판독값을 확인하십시오.

 

phpMyAdmin으로 이동하여 컴퓨터에 저장된 데이터를 관리할 수도 있습니다. 센서데이터테이블. 삭제, 수정 등을 할 수 있습니다.

마무리

이 자습서에서는 전 세계 어디에서나 액세스할 수 있는 자체 서버 도메인의 데이터베이스에 센서 데이터를 게시하는 방법을 배웠습니다. 이를 위해서는 자체 서버와 도메인 이름 이 필요합니다 ( 로컬 액세스에 Raspberry Pi를 사용할 수 있음 ).

 

제공된 예제는 모든 것이 어떻게 작동하는지 이해할 수 있도록 가능한 한 간단합니다. 이 예를 이해한 후에는 테이블의 모양을 변경하고, 다양한 센서 판독값을 게시하고, 여러 ESP 보드에서 게시하는 등의 작업을 수행할 수 있습니다.

다음을 읽을 수도 있습니다.

이 프로젝트가 마음에 드셨으면 합니다. 질문이 있는 경우 아래에 의견을 게시해 주시면 답변을 드리겠습니다.

ESP32가 마음에 들면 " Arduino IDE로 ESP32 배우기 " 과정에 등록하는 것을 고려할 수 있습니다 . 여기에서 무료 ESP32 리소스에 액세스할 수도 있습니다 .

읽어 주셔서 감사합니다.