Kamis, 14 Desember 2023

Buy Now (Warna 1) Buy Now (Warna 2) Buy Now (Warna 3) Buy Now (Warna 4)

Kamis, 03 Agustus 2023

Ini adalah panduan mendalam untuk sensor suhu DS18B20 dengan ESP32 menggunakan Arduino IDE. Kami akan menunjukkan cara menghubungkan sensor, menginstal perpustakaan yang diperlukan, dan menulis kode untuk mendapatkan pembacaan sensor dari satu dan beberapa sensor. Akhirnya, kami akan membangun sebuah server web sederhana untuk menampilkan pembacaan sensor.


Pengenalan Sensor Suhu DS18B20

Sensor suhu DS18B20 adalah sensor suhu digital satu kabel. Ini berarti hanya memerlukan satu jalur data (dan GND) untuk berkomunikasi dengan ESP32 Anda.


Sensor ini dapat diberi daya oleh sumber daya eksternal atau dapat memperoleh daya dari jalur data (disebut "mode parasit"), yang menghilangkan kebutuhan untuk sumber daya eksternal.



Setiap sensor suhu DS18B20 memiliki kode serial unik berukuran 64-bit. Hal ini memungkinkan Anda untuk menghubungkan beberapa sensor ke kabel data yang sama. Dengan demikian, Anda dapat mendapatkan data suhu dari beberapa sensor hanya menggunakan satu pin GPIO.


Selain itu, sensor suhu DS18B20 juga tersedia dalam versi tahan air (waterproof).



Berikut adalah ringkasan dari spesifikasi paling relevan dari sensor suhu DS18B20:


- Berkomunikasi melalui bus komunikasi satu kabel (one-wire bus).

- Rentang sumber daya: 3,0V hingga 5,5V.

- Rentang suhu operasi: -55ºC hingga +125ºC.

- Akurasi +/-0,5 ºC (antara rentang -10ºC hingga 85ºC).


Untuk informasi lebih lanjut, silakan lihat lembar data (datasheet) dari sensor DS18B20.


Bagian-bagian yang diperlukan

Untuk mengikuti panduan ini, Anda memerlukan bagian-bagian berikut:


1. ESP32 (baca: Papan pengembangan ESP32 terbaik)

2. Sensor suhu DS18B20 (satu atau beberapa sensor) - versi tahan air (waterproof)

3. Resistor 4.7k Ohm

4. Kabel jumper

5. Breadboard (papan percobaan)


Anda dapat menggunakan tautan sebelumnya atau langsung mengunjungi tokopedia.com/cncstorebandung untuk menemukan semua bagian yang Anda butuhkan untuk proyek Anda dengan harga terbaik!


Skema (Schematic) - ESP32

Seperti yang disebutkan sebelumnya, sensor suhu DS18B20 dapat diberi daya melalui pin VDD (mode normal), atau dapat memperoleh daya dari jalur data (mode parasit). Anda dapat memilih salah satu dari kedua mode tersebut.


Jika Anda menggunakan ESP32, ikuti salah satu dari dua diagram skema berikut.

Mode Parasit 



Mode Normal 



Menyiapkan Arduino IDE Anda

Kami akan memprogram ESP32 menggunakan Arduino IDE, pastikan Anda telah menginstal add-on ESP32 sebelum melanjutkan:


Instal Board ESP32 di Arduino IDE (ikuti instruksi untuk Windows, Mac OS X, dan Linux)

Instalasi Perpustakaan (Libraries)


Menginstal Perpustakaan (Libraries)

Untuk berinteraksi dengan sensor suhu DS18B20, Anda perlu menginstal perpustakaan One Wire karya Paul Stoffregen dan perpustakaan Dallas Temperature. Ikuti langkah-langkah berikut untuk menginstal kedua perpustakaan tersebut.


1. Buka Arduino IDE Anda dan pergi ke Sketch > Include Library > Manage Libraries. Library Manager akan terbuka.


2. Ketikkan "onewire" pada kotak pencarian dan instal perpustakaan OneWire karya Paul Stoffregen.



3. Selanjutnya, cari "Dallas" dan instal perpustakaan DallasTemperature karya Miles Burton.



Setelah menginstal perpustakaan, restart Arduino IDE Anda.



Kode (Single DS18B20)

Setelah menginstal perpustakaan yang diperlukan, Anda dapat mengunggah kode ke ESP32. Berikut adalah contoh kode untuk membaca suhu dari sensor suhu DS18B20 dan menampilkan pembacaan tersebut di Serial Monitor Arduino IDE.


/*********
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com  
*********/

#include <OneWire.h>
#include <DallasTemperature.h>

// GPIO where the DS18B20 is connected to
const int oneWireBus = 4;     

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(oneWireBus);

// Pass our oneWire reference to Dallas Temperature sensor 
DallasTemperature sensors(&oneWire);

void setup() {
  // Start the Serial Monitor
  Serial.begin(115200);
  // Start the DS18B20 sensor
  sensors.begin();
}

void loop() {
  sensors.requestTemperatures(); 
  float temperatureC = sensors.getTempCByIndex(0);
  float temperatureF = sensors.getTempFByIndex(0);
  Serial.print(temperatureC);
  Serial.println("ºC");
  Serial.print(temperatureF);
  Serial.println("ºF");
  delay(5000);
}


"Terdapat banyak cara berbeda untuk mendapatkan suhu dari sensor suhu DS18B20. Namun, jika Anda hanya menggunakan satu sensor tunggal, cara ini merupakan salah satu cara yang paling mudah dan sederhana."



Bagaimana Kode Bekerja


#include <OneWire.h>
#include <DallasTemperature.h>

Mulailah dengan menyertakan perpustakaan OneWire dan DallasTemperature.



Buatlah instance yang dibutuhkan untuk sensor suhu. Sensor suhu ini terhubung ke pin GPIO 4 (D4) pada ESP32.


// GPIO where the DS18B20 is connected to
const int oneWireBus = 4;

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(oneWireBus);

// Pass our oneWire reference to Dallas Temperature sensor 
DallasTemperature sensors(&oneWire);


Pada fungsi setup(), inisialisasikan Serial Monitor dengan kecepatan baud rate 115200.


Serial.begin(115200);



Inisialisasikan sensor suhu DS18B20:


sensors.begin();



Sebelum benar-benar mendapatkan suhu, Anda perlu memanggil metode requestTemperatures().


sensors.requestTemperatures();


Kemudian, dapatkan suhu dalam derajat Celsius dengan menggunakan metode getTempCByIndex() seperti yang ditunjukkan di bawah ini:


float temperatureC = sensors.getTempCByIndex(0);



Atau gunakan getTempFByIndex() untuk mendapatkan suhu dalam Fahrenheit.


float temperatureF = sensors.getTempFByIndex(0);


Metode getTempCByIndex() dan getTempFByIndex() menerima indeks dari sensor suhu. Karena kita hanya menggunakan satu sensor, indeksnya adalah 0. Jika Anda ingin membaca lebih dari satu sensor, Anda dapat menggunakan indeks 0 untuk satu sensor, indeks 1 untuk sensor lainnya, dan seterusnya.


Terakhir, cetak hasilnya di Serial Monitor.


Serial.print(temperatureC);
Serial.println("ºC");
Serial.print(temperatureF);
Serial.println("ºF");


Pembacaan suhu baru diminta setiap 5 detik.


delay(5000);



Demonstrasi 

Setelah mengunggah kode, Anda akan melihat pembacaan suhu dari sensor ditampilkan di Serial Monitor:



Mendapatkan Suhu dari Beberapa Sensor Suhu DS18B20



Sensor suhu DS18B20 berkomunikasi menggunakan protokol satu kabel (one-wire) dan setiap sensor memiliki kode serial unik berukuran 64-bit, sehingga Anda dapat membaca suhu dari beberapa sensor hanya menggunakan satu pin GPIO. Anda hanya perlu menghubungkan semua jalur data bersama-sama seperti yang ditunjukkan dalam diagram skema berikut:



Kode (Multiple DS18B20s)


Kemudian, unggah kode berikut. Kode ini akan memindai semua perangkat yang terhubung pada GPIO 4 dan mencetak suhu dari setiap perangkat. (Sketch ini berdasarkan contoh yang disediakan oleh perpustakaan DallasTemperature).


/*********
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com  
*********/

#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged TO GPIO 4
#define ONE_WIRE_BUS 4

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

// Number of temperature devices found
int numberOfDevices;

// We'll use this variable to store a found device address
DeviceAddress tempDeviceAddress; 

void setup(){
  // start serial port
  Serial.begin(115200);
  
  // Start up the library
  sensors.begin();
  
  // Grab a count of devices on the wire
  numberOfDevices = sensors.getDeviceCount();
  
  // locate devices on the bus
  Serial.print("Locating devices...");
  Serial.print("Found ");
  Serial.print(numberOfDevices, DEC);
  Serial.println(" devices.");

  // Loop through each device, print out address
  for(int i=0;i



Demonstrasi


Pada contoh ini, kami menggunakan tiga sensor suhu DS18B20. Ini adalah hasil yang akan Anda lihat di Serial Monitor Arduino IDE:



Kami memiliki artikel khusus tentang cara menghubungkan beberapa sensor suhu DS18B20 dengan ESP32. Ikuti tutorial berikut:


"ESP32 dengan Beberapa Sensor Suhu DS18B20"



Menampilkan (Display) Pembacaan Suhu DS18B20 pada Web Server


Untuk membangun web server, kita akan menggunakan perpustakaan ESPAsyncWebServer yang menyediakan cara mudah untuk membuat web server yang asinkron. Membangun web server asinkron memiliki beberapa keuntungan. Kami sarankan untuk melihat dokumentasi perpustakaan tersebut di halaman GitHub-nya.


Menginstal Perpustakaan ESPAsyncWebServer dan AsyncTCP


Anda perlu menginstal dua perpustakaan berikut di Arduino IDE Anda untuk membangun web server untuk proyek ini.


"ESPAsyncWebServer (.zip folder)"

"AsyncTCP (.zip folder)"


Perpustakaan ESPAsyncWebServer, AsyncTCP, dan ESPAsyncTCP tidak tersedia untuk diinstal melalui Arduino Library Manager, jadi Anda perlu menyalin file perpustakaan ke folder Libraries di instalasi Arduino. Sebagai alternatif, di Arduino IDE Anda, Anda dapat pergi ke Sketch > Include Library > Add .zip Library dan pilih perpustakaan yang baru saja Anda unduh.


Kode (DS18B20 Async Web Server)

Buka Arduino IDE Anda dan salin kode berikut."


/*********
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com  
*********/

// Import required libraries
#ifdef ESP32
  #include <WiFi.h>
  #include <ESPAsyncWebServer.h>
#else
  #include <Arduino.h>
  #include <ESP8266WiFi.h>
  #include <Hash.h>
  #include <ESPAsyncTCP.h>
  #include <ESPAsyncWebServer.h>
#endif
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is connected to GPIO 4
#define ONE_WIRE_BUS 4

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature sensor 
DallasTemperature sensors(&oneWire);

// Variables to store temperature values
String temperatureF = "";
String temperatureC = "";

// Timer variables
unsigned long lastTime = 0;  
unsigned long timerDelay = 30000;

// 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 readDSTemperatureC() {
  // Call sensors.requestTemperatures() to issue a global temperature and Requests to all devices on the bus
  sensors.requestTemperatures(); 
  float tempC = sensors.getTempCByIndex(0);

  if(tempC == -127.00) {
    Serial.println("Failed to read from DS18B20 sensor");
    return "--";
  } else {
    Serial.print("Temperature Celsius: ");
    Serial.println(tempC); 
  }
  return String(tempC);
}

String readDSTemperatureF() {
  // Call sensors.requestTemperatures() to issue a global temperature and Requests to all devices on the bus
  sensors.requestTemperatures(); 
  float tempF = sensors.getTempFByIndex(0);

  if(int(tempF) == -196){
    Serial.println("Failed to read from DS18B20 sensor");
    return "--";
  } else {
    Serial.print("Temperature Fahrenheit: ");
    Serial.println(tempF);
  }
  return String(tempF);
}

const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML><html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
  <style>
    html {
     font-family: Arial;
     display: inline-block;
     margin: 0px auto;
     text-align: center;
    }
    h2 { font-size: 3.0rem; }
    p { font-size: 3.0rem; }
    .units { font-size: 1.2rem; }
    .ds-labels{
      font-size: 1.5rem;
      vertical-align:middle;
      padding-bottom: 15px;
    }
  </style>
</head>
<body>
  <h2>ESP DS18B20 Server</h2>
  <p>
    <i class="fas fa-thermometer-half" style="color:#059e8a;"></i> 
    <span class="ds-labels">Temperature Celsius</span> 
    <span id="temperaturec">%TEMPERATUREC%</span>
    <sup class="units">°C</sup>
  </p>
  <p>
    <i class="fas fa-thermometer-half" style="color:#059e8a;"></i> 
    <span class="ds-labels">Temperature Fahrenheit</span>
    <span id="temperaturef">%TEMPERATUREF%</span>
    <sup class="units">°F</sup>
  </p>
</body>
<script>
setInterval(function ( ) {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      document.getElementById("temperaturec").innerHTML = this.responseText;
    }
  };
  xhttp.open("GET", "/temperaturec", true);
  xhttp.send();
}, 10000) ;
setInterval(function ( ) {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      document.getElementById("temperaturef").innerHTML = this.responseText;
    }
  };
  xhttp.open("GET", "/temperaturef", true);
  xhttp.send();
}, 10000) ;
</script>
</html>)rawliteral";

// Replaces placeholder with DS18B20 values
String processor(const String& var){
  //Serial.println(var);
  if(var == "TEMPERATUREC"){
    return temperatureC;
  }
  else if(var == "TEMPERATUREF"){
    return temperatureF;
  }
  return String();
}

void setup(){
  // Serial port for debugging purposes
  Serial.begin(115200);
  Serial.println();
  
  // Start up the DS18B20 library
  sensors.begin();

  temperatureC = readDSTemperatureC();
  temperatureF = readDSTemperatureF();

  // Connect to Wi-Fi
  WiFi.begin(ssid, password);
  Serial.println("Connecting to WiFi");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  
  // Print ESP Local IP Address
  Serial.println(WiFi.localIP());

  // Route for root / web page
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/html", index_html, processor);
  });
  server.on("/temperaturec", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", temperatureC.c_str());
  });
  server.on("/temperaturef", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/plain", temperatureF.c_str());
  });
  // Start server
  server.begin();
}
 
void loop(){
  if ((millis() - lastTime) > timerDelay) {
    temperatureC = readDSTemperatureC();
    temperatureF = readDSTemperatureF();
    lastTime = millis();
  }  
}



Masukkan kredensial jaringan Anda pada variabel berikut, dan kode akan langsung berfungsi.


Bagaimana Kode Berfungsi


const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";


Pada paragraf berikut, kami akan menjelaskan bagaimana kode berfungsi. Lanjutkan membaca jika Anda ingin belajar lebih lanjut atau langsung ke bagian "Demonstrasi" untuk melihat hasil akhir.


Impor Perpustakaan

Pertama, impor perpustakaan yang diperlukan untuk papan ESP32:


Membuat Instance untuk Sensor DS18B20


Tentukan pin GPIO tempat data sensor DS18B20 dihubungkan. Dalam kasus ini, pin tersebut dihubungkan ke GPIO 4.


#define ONE_WIRE_BUS 4


Membuat Instance yang Diperlukan untuk Menginisialisasi Sensor:


// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature sensor 
DallasTemperature sensors(&oneWire);


Mengatur Kredensial Jaringan Anda

const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";


Masukkan kredensial jaringan Anda pada variabel berikut, agar ESP8266 dapat terhubung ke jaringan lokal Anda.


Membuat objek AsyncWebServer pada port 80.


AsyncWebServer server(80);


Fungsi Membaca Suhu


Selanjutnya, kami membuat dua fungsi untuk membaca suhu.


Fungsi `readDSTemperatureC()` mengembalikan pembacaan suhu dalam derajat Celsius.


String readDSTemperatureC() {
  // Call sensors.requestTemperatures() to issue a global temperature and Requests to all devices on the bus
  sensors.requestTemperatures(); 
  float tempC = sensors.getTempCByIndex(0);

  if(tempC == -127.00){
    Serial.println("Failed to read from DS18B20 sensor");
    return "--";
  } else {
    Serial.print("Temperature Celsius: ");
    Serial.println(tempC); 
  }
  return String(tempC);
}


"Jika sensor tidak dapat mendapatkan pembacaan yang valid, maka fungsi ini mengembalikan nilai -127. Karena itu, kami menggunakan pernyataan if untuk mengganti nilai -127 dengan dua tanda hubung (–-) jika sensor gagal mendapatkan pembacaan yang valid."


if(tempC == -127.00){
  Serial.println("Failed to read from DS18B20 sensor");
  return "--";
}


Fungsi `readDSTemperatureF()` bekerja dengan cara yang serupa tetapi mengembalikan pembacaan suhu dalam derajat Fahrenheit.


Hasil pembacaan dikembalikan dalam tipe data string. Untuk mengonversi tipe data float menjadi string, gunakan fungsi String().


return String(tempC);


Membangun Halaman Web


Langkah berikutnya adalah membangun halaman web. Kode HTML dan CSS yang diperlukan untuk membangun halaman web disimpan dalam variabel index_html.


Dalam teks HTML, kami memiliki TEMPERATUREC dan TEMPERATUREF di antara tanda persen (%). Ini adalah tempat penampung untuk nilai suhu.


Ini berarti bahwa teks %TEMPERATUREC% berfungsi seperti variabel yang akan digantikan dengan nilai suhu aktual dari sensor. Penampung pada teks HTML harus berada di antara tanda persen (%).


Kami telah menjelaskan secara detail bagaimana HTML dan CSS yang digunakan dalam web server ini berfungsi dalam tutorial sebelumnya. Jika Anda ingin belajar lebih lanjut, silakan lihat proyek berikutnya:


"DHT11/DHT22 Temperature and Humidity Web Server with Arduino IDE"



Processor


Sekarang, kita perlu membuat fungsi processor() yang akan menggantikan penampung dalam teks HTML dengan nilai suhu aktual.


String processor(const String& var){
  //Serial.println(var);
  if(var == "TEMPERATUREC"){
    return readDSTemperatureC();
  }
  else if(var == "TEMPERATUREF"){
    return readDSTemperatureF();
  }
  return String();
}


Ketika halaman web diminta, kita memeriksa apakah ada penampung dalam HTML. Jika kita menemukan penampung %TEMPERATUREC%, kita akan mengembalikan nilai suhu dalam derajat Celsius dengan memanggil fungsi readDSTemperatureC() yang telah dibuat sebelumnya.


if(var == "TEMPERATUREC"){
  return readDSTemperatureC();
}


Jika penampungnya adalah %TEMPERATUREF%, kita akan mengembalikan nilai suhu dalam derajat Fahrenheit.


else if(var == "TEMPERATUREF"){
  return readDSTemperatureF();
}


Setup () 

Dalam fungsi setup(), kita inisialisasi Serial Monitor untuk tujuan debugging.


Serial.begin(115200);


Inisialisasi sensor suhu DS18B20.


sensors.begin();


Sambungkan ke jaringan lokal Anda dan cetak alamat IP ESP32.


WiFi.begin(ssid, password);
Serial.println("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
  delay(500);
  Serial.print(".");
}
Serial.println();

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


Terakhir, tambahkan baris kode berikut untuk menangani web server.


server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
  request->send_P(200, "text/html", index_html, processor);
});
server.on("/temperaturec", HTTP_GET, [](AsyncWebServerRequest *request){
  request->send_P(200, "text/plain", readDSTemperatureC().c_str());
});
server.on("/temperaturef", HTTP_GET, [](AsyncWebServerRequest *request){
  request->send_P(200, "text/plain", readDSTemperatureF().c_str());
});


Ketika kita membuat permintaan pada URL root, kita mengirimkan teks HTML yang disimpan dalam variabel index_html. Kami juga perlu melewati fungsi processor, yang akan menggantikan semua penampung dengan nilai yang tepat.


server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
  request->send_P(200, "text/html", index_html, processor);
});


Kita perlu menambahkan dua penangan tambahan untuk memperbarui pembacaan suhu. Ketika kita menerima permintaan pada URL/temperaturec, kita hanya perlu mengirimkan nilai suhu yang diperbarui. Ini berupa teks biasa, dan harus dikirimkan sebagai char, sehingga kita menggunakan metode c_str().


server.on("/temperaturec", HTTP_GET, [](AsyncWebServerRequest *request){
  request->send_P(200, "text/plain", readDSTemperatureC().c_str());
});


Proses yang sama diulangi untuk suhu dalam Fahrenheit.


server.on("/temperaturef", HTTP_GET, [](AsyncWebServerRequest *request){
  request->send_P(200, "text/plain", readDSTemperatureF().c_str());
});


Terakhir, kita bisa memulai server.


server.begin();


Karena ini adalah web server yang bersifat asinkron, kita tidak perlu menulis apapun di dalam loop().


void loop(){

}


Itulah kurang lebih cara kerja kode ini.


Demonstrasi

Setelah mengunggah kode, buka Serial Monitor Arduino IDE dengan baud rate 115200. Tekan tombol reset pada ESP32 dan setelah beberapa detik, alamat IP ESP32 akan muncul.

Di jaringan lokal Anda, buka browser dan ketik alamat IP ESP32.

Sekarang Anda dapat melihat suhu dalam derajat Celsius dan Fahrenheit pada web server Anda. Pembacaan sensor akan diperbarui secara otomatis tanpa perlu me-refresh halaman web.





Penutup 

Kami berharap Anda telah menemukan tutorial ini bermanfaat.

Terima kasih telah membaca.



@cncstorebandung Bener gak nih ? Alasan Lulusan Teknik elektro menjadi orang paling dibutuhkan 🤩🔧 #robots #robot #electrician #project #projects #innovation #circuit #technology #techno #arduinoproject #arduinoprojects #engineer #arduinouno #arduino #programmer #arduinolove #automation #arduinomega #robotic #robotics #electronics #diyelectronics #arduinoindonesia #instructables #IOT #internetofthings #arduinofun #automationengineering #esp32 #esp8266 ♬ suara asli - CNC STORE BANDUNG
andung (Sunda: aksara Sunda: ᮊᮧᮒ ᮘᮔ᮪ᮓᮥᮀ) Tentang suara ini dengarkan (bantuan·info) adalah ibu kota Provinsi Jawa Barat yang sekaligus menjadi pusat pemerintahan dan perekonomian dari Provinsi Jawa Barat, Indonesia. Kota Bandung juga merupakan kota terbesar ketiga di Indonesia setelah Jakarta dan Surabaya. Bandung merupakan kota terpadat kedua di Indonesia setelah Jakarta dengan kepadatan mencapai 15.051 jiwa/km2. Terletak 140 km di sebelah tenggara Jakarta, Bandung merupakan kota terbesar di bagian selatan pulau Jawa. Bandung merupakan bagian dari Cekungan Bandung (Bandung Raya), kawasan metropolitan terbesar ketiga di Indonesia setelah Jabodetabek dan Surabaya Metropolitan Area. Kota Bandung berbatasan langsung dengan Cimahi dan Kabupaten Bandung Barat di sisi barat dan utara;Kabupaten Bandung di sisi timur dan selatan. Kota ini tercatat dalam berbagai sejarah penting yang pernah terjadi di Indonesia, salah satunya sebagai tempat berdirinya sebuah perguruan tinggi teknik pertama di Indonesia (Technische Hoogeschool te Bandoeng–TH Bandung, sekarang Institut Teknologi Bandung–ITB),[5] lokasi ajang pertempuran pada masa kemerdekaan,[6] serta pernah menjadi tempat berlangsungnya Konferensi Asia-Afrika 1955,[7] suatu pertemuan yang menyuarakan semangat anti kolonialisme, bahkan Perdana Menteri India Jawaharlal Nehru dalam pidatonya mengatakan bahwa Bandung adalah ibu kotanya Asia-Afrika.[8] Pada tahun 1990 kota Bandung terpilih sebagai salah satu kota paling aman di dunia berdasarkan survei majalah Time.[9] Kota kembang merupakan sebutan lain untuk kota ini, karena pada