Langsung ke konten utama

ESP32 Data Visualisasi pada Web Server

Halo balik lagi sama saya SUlis, pada kesempatan kali ini saya akan membagikan sebuah pengalaman mengguanakan ESP32 dengan BME280 untuk menampilkan data visualisasi pada Web Server. Mungkin dari temen-temen bisa memberikan saran dan masukkannya:)

Yang Dibutuhkan:

  1. ESP32 Development Board
  2. BME280
  3. Jumper
  4. Breadboard
  5. Arduino IDE
Nah, langkah yang dilakukan setelah kelima bahan di atas sudah tersedia yaitu

Installing the ESP32 Filesystem Uploader pada Arduino IDE

Untuk penginstallan ESP32 Filesystem Uploader ini dapat dilakukan seperti pada link https://randomnerdtutorials.com/install-esp32-filesystem-uploader-arduino-ide/

Installing libraries: Async Web Server for ESP8266 and ESP32

File ini dapat diunduh pada link https://github.com/me-no-dev/ESPAsyncWebServer

Installing libraries: Async TCP Library for ESP32

File ini dapat diunduh di https://github.com/me-no-dev/AsyncTCP


Berikut rangkaian ESP32 dengan BME280

Sumber gambar: randomnerdtutorials.com
Kemudian, saya membuat file bernama index.html pada folder seperti berikut ini
Sumber gambar: randomnerdtutorials.com

File index.html

<!DOCTYPE HTML><html>
<!-- Rui Santos - Complete project details at https://RandomNerdTutorials.com

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. -->
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <script src="https://code.highcharts.com/highcharts.js"></script>
  <style>
    body {
      min-width: 310px;
     max-width: 800px;
     height: 400px;
      margin: 0 auto;
    }
    h2 {
      font-family: Arial;
      font-size: 2.5rem;
      text-align: center;
    }
  </style>
</head>
<body>
  <h2>ESP Weather Station</h2>
  <div id="chart-temperature" class="container"></div>
  <div id="chart-humidity" class="container"></div>
  <div id="chart-pressure" class="container"></div>
</body>
<script>
var chartT = new Highcharts.Chart({
  chart:{ renderTo : 'chart-temperature' },
  title: { text: 'BME280 Temperature' },
  series: [{
    showInLegend: false,
    data: []
  }],
  plotOptions: {
    line: { animation: false,
      dataLabels: { enabled: true }
    },
    series: { color: '#059e8a' }
  },
  xAxis: { type: 'datetime',
    dateTimeLabelFormats: { second: '%H:%M:%S' }
  },
  yAxis: {
    title: { text: 'Temperature (Celsius)' }
    //title: { text: 'Temperature (Fahrenheit)' }
  },
  credits: { enabled: false }
});
setInterval(function ( ) {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      var x = (new Date()).getTime(),
          y = parseFloat(this.responseText);
      //console.log(this.responseText);
      if(chartT.series[0].data.length > 40) {
        chartT.series[0].addPoint([x, y], true, true, true);
      } else {
        chartT.series[0].addPoint([x, y], true, false, true);
      }
    }
  };
  xhttp.open("GET", "/temperature", true);
  xhttp.send();
}, 30000 ) ;

var chartH = new Highcharts.Chart({
  chart:{ renderTo:'chart-humidity' },
  title: { text: 'BME280 Humidity' },
  series: [{
    showInLegend: false,
    data: []
  }],
  plotOptions: {
    line: { animation: false,
      dataLabels: { enabled: true }
    }
  },
  xAxis: {
    type: 'datetime',
    dateTimeLabelFormats: { second: '%H:%M:%S' }
  },
  yAxis: {
    title: { text: 'Humidity (%)' }
  },
  credits: { enabled: false }
});
setInterval(function ( ) {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      var x = (new Date()).getTime(),
          y = parseFloat(this.responseText);
      //console.log(this.responseText);
      if(chartH.series[0].data.length > 40) {
        chartH.series[0].addPoint([x, y], true, true, true);
      } else {
        chartH.series[0].addPoint([x, y], true, false, true);
      }
    }
  };
  xhttp.open("GET", "/humidity", true);
  xhttp.send();
}, 30000 ) ;

var chartP = new Highcharts.Chart({
  chart:{ renderTo:'chart-pressure' },
  title: { text: 'BME280 Pressure' },
  series: [{
    showInLegend: false,
    data: []
  }],
  plotOptions: {
    line: { animation: false,
      dataLabels: { enabled: true }
    },
    series: { color: '#18009c' }
  },
  xAxis: {
    type: 'datetime',
    dateTimeLabelFormats: { second: '%H:%M:%S' }
  },
  yAxis: {
    title: { text: 'Pressure (hPa)' }
  },
  credits: { enabled: false }
});
setInterval(function ( ) {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      var x = (new Date()).getTime(),
          y = parseFloat(this.responseText);
      //console.log(this.responseText);
      if(chartP.series[0].data.length > 40) {
        chartP.series[0].addPoint([x, y], true, true, true);
      } else {
        chartP.series[0].addPoint([x, y], true, false, true);
      }
    }
  };
  xhttp.open("GET", "/pressure", true);
  xhttp.send();
}, 30000 ) ;
</script>
</html>

Arduino Sketch

/*********
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com
  
  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.
*********/

// Import required libraries
#ifdef ESP32
  #include <WiFi.h>
  #include <ESPAsyncWebServer.h>
  #include <SPIFFS.h>
#else
  #include <Arduino.h>
  #include <ESP8266WiFi.h>
  #include <Hash.h>
  #include <ESPAsyncTCP.h>
  #include <ESPAsyncWebServer.h>
  #include <FS.h>
#endif
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

/*#include <SPI.h>
#define BME_SCK 18
#define BME_MISO 19
#define BME_MOSI 23
#define BME_CS 5*/

Adafruit_BME280 bme; // I2C
//Adafruit_BME280 bme(BME_CS); // hardware SPI
//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI

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

// Create AsyncWebServer object on port 80
AsyncWebServer server(80);

String readBME280Temperature() {
  // Read temperature as Celsius (the default)
  float t = bme.readTemperature();
  // Convert temperature to Fahrenheit
  //t = 1.8 * t + 32;
  if (isnan(t)) {    
    Serial.println("Failed to read from BME280 sensor!");
    return "";
  }
  else {
    Serial.println(t);
    return String(t);
  }
}

String readBME280Humidity() {
  float h = bme.readHumidity();
  if (isnan(h)) {
    Serial.println("Failed to read from BME280 sensor!");
    return "";
  }
  else {
    Serial.println(h);
    return String(h);
  }
}

String readBME280Pressure() {
  float p = bme.readPressure() / 100.0F;
  if (isnan(p)) {
    Serial.println("Failed to read from BME280 sensor!");
    return "";
  }
  else {
    Serial.println(p);
    return String(p);
  }
}

void setup(){
  // Serial port for debugging purposes
  Serial.begin(115200);
  
  bool status; 
  // default settings
  // (you can also pass in a Wire library object like &Wire2)
  status = bme.begin(0x76);  
  if (!status) {
    Serial.println("Could not find a valid BME280 sensor, check wiring!");
    while (1);
  }

  // Initialize SPIFFS
  if(!SPIFFS.begin()){
    Serial.println("An Error has occurred while mounting SPIFFS");
    return;
  }

  // Connect to Wi-Fi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi..");
  }

  // Print ESP32 Local IP Address
  Serial.println(WiFi.localIP());

  // Route for root / web page
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(SPIFFS, "/index.html");
  });
  server.on("/temperature", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", readBME280Temperature().c_str());
  });
  server.on("/humidity", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", readBME280Humidity().c_str());
  });
  server.on("/pressure", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", readBME280Pressure().c_str());
  });

  // Start server
  server.begin();
}
 
void loop(){
  
}

Kemudian di menu tools>ESP32 Sketch Data Upload.

Berikut Hasil Percobaannya:










Komentar

Postingan populer dari blog ini

Database: Penyimpanan Data Pembacaan Sensor dari ESP32 ke Database MySQL

Halo balik lagi dengan percobaan ESP32. Nah kali ini merupakan percobaan saya mengenai database yaitu penyimpanan data pembacaan sensor dari ESP32 ke database MySQL. Percobaan kali ini bersumber dari : -   https://randomnerdtutorials.com/esp32-esp8266-mysql-database-php/ -  https://randomnerdtutorials.com/control-esp32-esp8266-gpios-from-anywhere/ -  https://randomnerdtutorials.com/cloud-weather-station-esp32-esp8266/ Naah, yang beda dari sebelum-sebelumnya nih, disini kita bakal main sama hosting, jadi harus punya doaminnya yak. Dari sumber referensi sebenernya sudah sangat lengkap disertai dengan bagaimana kita mendapatkan hosting, namun karena yang disediakan adalah berbayar jadi saya memilih untuk mencari  alternatif lainnya, yang tidak berbayar. Kali ini saya mengguanakan hosting free dari  infinityfree.net  dan domain free dari freenom.com . Saya menggunakan domain yang di sediakan dari infinityfree.net  sebab tidak perlu setting server lagi, kalo mau pakai domain dari fr

Pengalaman Pertama dengan ESP32: Blink Program

ESP32 merupakan mikrokontroler canggih yang dilengkapi dengan kemampuan WiFi dan Bluetooth. Penjelasan kali ini mengenai Project Blinking an ESP32,  menggunakan ESP32 Development Board akan digunakan untuk mengedipkan LED pada interval waktu tertentu. Program Blink merupakan program dasar untuk serial mikrokontroler atau bisa dikatakan menjadi "Hello world"-nya mikrokontroler. Sebenarnya ini bukan pertama kali saya menggunakan Arduino IDE, sebelumnya pada Tahap Persiapan Bersama ITB di Sekolah Teknik Elektro dan Informatika, saya mendapatkan mata kuliah Pengantar Rekayasa dan Desan dengan menggunakan Arduino IDE. Nah berikut ini percobaan saya dengan ESP32 yang sebelumnya adalah Arduino. Alat dan Bahan ESP32 Development Board LED 5mm Resistor 330Ω Kabel Micro-USB  Breadboard Rangkaian sumber: randomnerdtutorials.com Hubungkan katoda(kutub negatif) dari LED ke pin 23 Hubungkan anoda(kutub positif) dari LED ke resistor Hubungkan ujung bebas resistor ke GND

Web Server pada BME280 dan ESP32

Disaat maraknya kasus virus corona, saya tetap melanjutkan eksperimen ESP32 untuk membangun web server, tapi kali ini saya menambahkan sensor BME280. Sebelumnya kami berkesperimen secara berkelompok dengan menggunakan sensor DHT11, karena kebijakan sosial distancing dan kami tidak berada di kota yang sama untuk saat ini, akhirnya saya memutuskan untuk membeli sensor BME280 secara online hehe. Karena rasa penasaran saya terhadap percobaan web server pada ESP32 dan BME280 ini. Sumber pembelajaran kali ini dapat di akses di  https://randomnerdtutorials.com/esp32-web-server-with-bme280-mini-weather-station/ Sebelumnya saya sudah membangun web server dengan ESP32, langkah kali ini sama seperti pada percobaan sebelumnya kok:) Alat dan Bahan: ESP32 development board BME280 Breadboard Jumper USB cable Lets Code… /*********   Rui Santos   Complete project details at http://randomnerdtutorials.com   *********/ // Load Wi-Fi library #include <WiFi.h>

ESP32: Bluetooth dengan DHT11 dan LCD

Kali ini percobaan yang dilakukan adalah menampilkan temperature dengan DHT11 yang dikirim/ditampilkan ke handphone melalui serial Bluetooth Terminal, dan dari handphone dapat mengirim pesan yang dapat ditampilkan ke LCD. Alat dan Bahan yang digunakan - ESP32 DevKit - LCD yang terpasang I2C - DHT11 - Jumper - Handphone yang terpasang Serial Bluetooth Terminal - Resistor 10k ohm - Breadboard Kasus yang sama dengan percobaan sebelumnya, kami hanya memiliki jumper female to female berjumlah 3, sedangkan dibutuhkan 4 jumper yang menghubungkan dari LCD ke ESP32. Kami akhirnya membuat rangkaian dengan LCD terpasang di beardboard. Sehingga rangkaiannya seperti ini. Sebelumnya kami mencoba merangkainya menggunakan ESP32 36 pin. Karena terdapat kesalahan pemasangan jumper yang seharusnya menghubungkan VCC ke VIN, namun tertukar dengan GND, karena warna jumper yang sama, akhirnya mengakibatkan ESP32 menjadi sangat panas, dan lampu LCD tidak menyala. Kami menyadari ke

Mendeteksi Sampah

Seperti yang kita ketahui, saat ini sampah menjadi hal yang perlu kita perhatikan. Seringkali di ruang kelas 7601, Labtek V ITB,  ditemukan  tempat sampah yang penuh namun tidak segera diangkat/dibersihkan sehingga menimbulkan kotor dan bau di dalam kelas.  Sampai ngilang beberapa hari itu tempat sampah, hehe . Kapasitas sampah yang melebihi tempat sampah ini juga sering terjadi, karena tempat sampah ini tidak bisa mengendalikan kapsitas sampah yang harus masuk kedalam tempat sampah tersebut. Dari permasalahan ini dapat diidentifikasi masalahnya yaitu bagaimana membuat tempat sampah yang dapat mendeteksi volume tempat sampah, sehingga dapat diketahui dan segera untuk dapat diangkat/dibersihkan. Deskripsi Singkat Sistem Berdasarkan permasalahan tersebut ,  terpikirkan untuk   mem buat sebuah tempat sampah tertutup yang dilengkapi dengan sensor pendeteksi volume sampah. Sebelumnya, beberapa hari yang lalu saya sudah pernah mencoba bereksperimen membuat project ESP32 dengan s

Web Server dengan ESP32

Di saat maraknya kasus virus corona, kami tetap melakukan eksperimen yang berkaitan dengan ESP32, melanjutkan eksperimen baru yaitu membangun web server dengan ESP32. Walaupun dengan keterbatasan yang ada, dengan adanya kebijakan social distancing ,kami yang biasanya melakukan eksperimen bersama kelompok, kali ini kami tetap mengerjakan bersama namun dari jarak jauh. Kami tetap saling berkoordinasi dengan adanya keterbatasan saat ini. Ok lanjut, eksperimen kali ini adalah membuat web server, yang nantinya hasil output dari ESP32 akan ditampilkan melalui web. Seblumnya kami menampilkan output ESP32 pada layar monitor, LCD display, atau serial terminal bluetooth. Sumber pembelajaran kali ini dari  https://randomnerdtutorials.com/esp32-web-server-arduino-ide/ Sebenarnya dari modul pada sumber pembelajaran, digunakan dua LED dan dua resistor 330ohm, namun percobaan saya ini tidak menggunakan LED dan resistor karena keterbatasan alat. Akhirnya saya memutuskan untuk menggunakan L

ESP32 dengan HR-SC04

Setelah menyelesaikan percobaan ESP32 dengan DHT11 yang terhubung dengan dispay LCD dan juga Serial Bluetooth. Kali ini kami menggunakan sensor ultrasonic loooh.. 1. ESP32: Sensor ultrasonic dan LCD Dispay a. Alat dan Bahan - Jumper - ESP32 jenis NodeMCU-32s - Sensor ultrasonic (HC-SR04) - LCD dilengkapi dengan I2C - Kabel USB - Breadboard b. Rangkaian -- Ultrasonic (HC-SR04) dengan ESP32 Hubungkan VCC dengan 5V Hubungkan Trig dengan P12 ESP Hubungkan Echo dengan P13 ESP Hubungkan GND dengan GND -- I2C LCD dengan ESP32 Hubungkan GND dengan GND HubungkanVCC dengan 5V Hubungkan SDA dengan P21 Hubungkan SCL dengan P22 c. Let's Code.... #include <Adafruit_Sensor.h> #include <Ultrasonic.h> Ultrasonic ultrasonic(12, 13); int jarak; #include <LiquidCrystal_I2C.h> #include <Wire.h> int lcdColumns = 16; int lcdRows = 2; LiquidCrystal_I2C lcd(0x27, lcdColumns, lcdRows); void setup(){   Serial.begin(

Percobaan ESP32 dengan sensor DHT11

Sebelumnya kita sudah melakukan percobaan ESP32 dengan menggunakan sensor pins yang dimiliki oleh ESP32, serta efek dari pemberian magnet pada ESP32 ( sensor pins & hall effect ) . Percobaan kali ini menggunakan sensor DHT11 yang digunakan untuk mendeteksi suhu ruang. Resistor yang diperlukan adalah resistor 10k ohm. Namun karena yang kami miliki resistor ukuran 1k ohm, akhirnya kami memutuskan untuk merakitnya menggunakan 10 buah resistor yang terpasang secara seri. Sumber pembelajaran ini dapat diakses  di: Random Nerd Tutorials Awalnya kami tidak berhasil menjalankan program tersebut. Kemudian kami merubah posisi rangkaian berada di satu blocks pada breadboard seperti pada gambar berikut. Dan ternyata program kami masih belum bisa berjalan. Kami mengamati kembali rangkaian pada sumber pembelajaran, ternyata yang digunakan pada rangkaian tersebut adalah ESP32 dengan 36 pin, sedangkan yang kami gunakan adalah ESP32 dengan 30 pin. Kemudian kami merubah posisi

ESP32 Touch Pins and Hall Effect Sensor

ESP32 merupakan mikrokontroler canggih yang dilengkapi dengan kemampuan WiFi dan Bluetooth. Di dalam board ESP32 sendiri memiliki 9 touch sensor. Terlihat pada gambar berikut! Sumber: randomnerdtutorials.com Percobaan kali ini adalah Touch Pins dan Hall Effect Sensor. Sensor internal yang bisa digunakan pada percobaan kali ini yaitu GPIO2, GPIO4, GPIO12, GPIO13, GPIO14, GPIO15, GPIO27, GPIO32, dan GPIO33. Di sini saya menggunakan sensor sentuh internal GPIO4.  Kali ini kita mencoba dua eksperimen yaitu yang pertama touch pins sensor dan yang kedua hall effect sensor. A. Touch Pins Sensor  Alat dan Bahan ESP32 Development Board LED 5mm Jumper Resistor 330Ω Kabel Micro-USB  Breadboard Rangkaian Sumber: randomnerdtutotials.com Pasang jumper di GPIO4 atau GPIO lainnya yang terhubung dengan touch sensor. Pasang resistor di breadboard secara vertikal. Hubungkan jumper dari GPIO16 ke breadboard yang terhubung dengan salah satu ujung resistor. Pasang LED, hubungkan