Sabtu, 18 April 2020

Weather Database with ESP32 using MySQL and PHP

Halo..
Ini blog terakhir aku untuk semester ini ya karena awalnya blog ini ditujukan untuk tugas Sistem Embedded sih.
Kalau untuk selanjutnya belum tau bakal dilanjutin atau enggak, mungkin kalau lanjutpun bakal beda topik hehe
Oh iya di blog terakhir ini aku mau berterimakasih dengan teman-teman sekelompokku yang selama pengerjaan poject Sistem Embedded (sebelum keadaan COVID 19 sih) saling bantu dari segi dokumentasi, kode, rangkaian, dan alat-alat. Setelahnya aku kerja sendiri huhu.. Tak apa seru juga sih.







Udah tau belum aku bakal membuat apa? Kalau jawaban kalian buat data cuaca dengan sensor suhu ya gak sepenuhnya salah sih tapi kita bakal buat Weather Database. Gimana sih itu?
Oke untuk blog terakhir ini aku bakal jelasin tentang Weather Database dengan menggunakan MySQL dan PHP.
Nah, kali ini kita akan menggunakan beberapa teknologi yaitu :
  • ESP32 programmed with Arduino IDE
  • Hosting server and domain name
  • PHP script to insert data into MySQL untuk menampilkannya di web page
  • MySQL database untuk store readings

Untuk membuat hosting sever, domain name, dan user database baru bisa dilihat di link ini ya
https://randomnerdtutorials.com/esp32-esp8266-mysql-database-php/

Oh iya aku mau cerita sedikit.
Untuk pekerjaan kali ini, ya karena pakai hosting server dan domain yang umumnya itu berbayar jadi ada teman aku yang memberikan domain lamanya ke teman sekelas (yeay!!). Dan sekarang karena dipakai sekelas, jadinya kita buat database sekelas yang isinya report cuaca dari daerah masing-masing (karena kondisi COVID-19 dan masa Work From Home).

Nah sekarang kita akan membuat file PHP nya.

1. Cari File Manager, lalu klik.

ESP32 ESP8266 CPanel Open Edit PHP Files

2. Pilih public_html lalu pilih " +File ". Kemudian isi New File Name lalu klik Create New File.
ESP32 ESP8266 CPanel Create New PHP File

PHP Create New file post esp data

3. Setelah itu, pilih file yang baru saja dibuat dan klik kanan. Pilih edit dan ketik script ini.

<?php

$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 . "
" . $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;
}
Jangan lupa untuk mengganti ketiga hal di bawah ini sesuai dengan user database yang sudah kamu buat sebelumnya.

// Your Database name
$dbname = "example_esp_data";
// Your Database user
$username = "example_esp_board";
// Your Database user password
$password = "YOUR_USER_PASSWORD";
4. Buat file .php untuk display database content. Lakukan sama seperti step 2 dan 3, namun edit filenya dengan script di bawah ini.

PHP Create New file esp data

<!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>
Note : jangan lupa perhatikan dbname, username, password

5. Sekarang tinggal kita set deh ESP32 nya. Nah yang diperlukan hanya :
  • ESP32
  • Arduino IDE
  • Kabel jumper female to female (4 buah)
  • BME280 untuk sensor suhu
Berikut ini skema pemasangannya.

BME280 wiring to ESP32

#ifdef ESP32
  #include 
  #include 
#else
  #include 
  #include 
  #include 
#endif

#include 
#include 
#include 

// 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 = "Grace(Medan)";

/*#include 
#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){
    HTTPClient http;
    
    // 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.readPressure()/100000.0F) + "&value3=" + String(bme.readHumidity()) + "";
    Serial.print("httpRequestData: ");
    Serial.println(httpRequestData);
    
    // Send HTTP POST request
    int httpResponseCode = http.POST(httpRequestData);
    
    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);  
}
Note : Tekanan aku set ke dalam satuan atm (dibagi 100000 Pa).

Jangan lupa untuk set komponen di bawah ini sesuai dengan koneksi yang kamu pakai dan serverName.

// 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://hardyvalen.my.id/006-post-esp-data.php";

Sesuaikan juga sensorName sesuai dengan sensor yang  kalian gunakan dan sensorLocation sesuai dengan tempat kalian masing-masing.
Aku sih set dengan BME280 dan Grace(Medan) karena alasan di awal tadi (pakai share hosting, jadi ini database sekelas).
Okee, selesai.
Let's Try!!

 [[ Tampilan di browser ]]


buka di domain yang sudah kalian buat lalu masuk ke file .php yang juga telah dibuat sebelumnya

 [[ Tampilan di serial monitor ]]

Atau kalian bisa buka sendiri di https://hardyvalen.my.id/006-esp-data.php untuk melihat data dari satu kelas hehee..

Selesai.
Sekian blog terakhir ini.
Aku selalu berharap kalian semua diberikan kesehatan.
See you next topic (?) hehe

Salam hangat,

Rehuel Grace Marbun
18218006
Sistem dan Teknologi Informasi
Institut Teknologi Bandung

Weather Database with ESP32 using MySQL and PHP

Halo.. Ini blog terakhir aku untuk semester ini ya karena awalnya blog ini ditujukan untuk tugas Sistem Embedded sih. Kalau untuk selanjut...