Tutorial Arduino Lebih dari Satu Sensor DS18B20

Tutorial Arduino Lebih dari Satu Sensor DS18B20

Deskripsi Video Lebih dari satu sensor suhu DS18B20

Sebelum mengikuti tutorial ini, disarankan untuk mengikuti:

PENJELASAN DETIL DS18B20

PENJELASAN DETIL LCD 16X2 I2c

Sensor suhu DS18B20 terkenal canggih karena sensor ini memiliki beberapa keunggulan dibandingkan sensor-sensor lainnya.

Keunggulan tersebut meliputi parasitic mode, penggunaan One Wire untuk lebih dari satu sensor, dan kedap air.

Namun sensor ini merupakan salah satu sensor dengan banyak permasalahan teknis, diantaranya adalah kode program yang rumit dan pemasangan pada sirkuit atau breadboard tidak mudah. 

Nah video ini menjelaskan bagaimana kita bisa menggunakan lebih dari satu sensor DS18B20. Ada 5 sensor yang digunakan.

Video dimulai dengan pengetesan sensor DS18B20. Lalu bagian berikutnya adalah penempatan pada papan breadboard dan penyambungan ke papan Arduino Uno. 

Ada 3 penjelasan mengenai kode program:

  1. Kode program yang menggunakan object getTempCByIndex namun kode ini dibuat apa adanya agar penonton bisa memahami langkah-langkah awal yang diperlukan untuk menyajikan hasil pengukuran suhu dari beberapa sensor DS18B20
  2. Kode program yang tetap object getTempCByIndex namun kode ini telah di-refactor agar menjadi efisien
  3. Kode program yang memanfaatkan object Device Address untuk menyajikan hasil pengukuran suhu dari sensor dengan alamat unit tertentu

Kode Program Satu DS18B20 dengan object getTempCByIndex

// www.progresstech.co.id
// www.karyaone.co.id
// Protus Tanuhandaru

#include <LiquidCrystal_I2C.h> // Memanggil library LCD
#include <OneWire.h> //Memanggil library OneWire yang diperlukan sebagai dependensi library Dallas Temperature
#include <DallasTemperature.h> // Memanggil library Dallas Temperature
#define ONE_WIRE_BUS 2  // Menempatkan PIN hasil pembacaan sensor DS18B20 pada PIN 2. 
   //Disebut One Wire karena kita bisa menempatkan sensor DS18B20 lain pada PIN yang sama  
LiquidCrystal_I2C lcd(0x27, 16, 2); // Mengatur alamat LCD dan dimensi LCD, yaitu 20 kolom dan 4 baris

OneWire oneWire(ONE_WIRE_BUS); //Membuat variabel oneWire berdasarkan PIN yang telah didefinisikan
DallasTemperature sensor(&oneWire); //Membuat variabel untuk menyimpan hasil pengukuran
float suhuDS18B20; //deklarasi variable suhu DS18B20 dengan jenis data float

void setup(void)
{
  lcd.begin();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("PROGRESSTECH");
  lcd.setCursor(0, 1);
  lcd.print("Protus");
  Serial.begin(9600); //Menginisiasikan setup kecepatan komunikasi
  sensor.begin();      //Menginisiasikan sensor One-Wire DS18B20
  delay(2000);
}

void loop(void)
{
  //sensor.setResolution(9);  // Sebelum melakukan pengukuran, atur resolusinya
  //sensor.setResolution(10);
  //sensor.setResolution(11);
  sensor.setResolution(12);
  sensor.requestTemperatures();  // Perintah konversi suhu
  suhuDS18B20 = sensor.getTempCByIndex(0);  //Membaca data suhu dari sensor #0 dan mengkonversikannya ke nilai Celsius
  // suhuDS18B20 = (suhuDS18B20*9/5) + 32;
  // suhuDS18B20 = suhuDS18B20 = 273.15;
  //Serial.println(suhuDS18B20, 1);  //Presisi 1 digit
  //Serial.println(suhuDS18B20, 2);  //Presisi 2 digit
  //Serial.println(suhuDS18B20, 3);  //Presisi 3 digit
  Serial.println(suhuDS18B20, 4);  //Presisi 4 digit
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Temp:");
  lcd.setCursor(6, 0);
  lcd.print(suhuDS18B20, 4);
  lcd.print((char)223);
  lcd.print("C"); 
  delay(1000);    //delay 1 detik (1000 miliseconds)
}

Kode Program Beberapa DS18B20 dengan object getTempCByIndex sebelum refactoring

// www.progresstech.co.id
// www.karyaone.co.id
// Protus Tanuhandaru

#include <LiquidCrystal_I2C.h> // Memanggil library LCD
#include <OneWire.h> //Memanggil library OneWire yang diperlukan sebagai dependensi library Dallas Temperature
#include <DallasTemperature.h> // Memanggil library Dallas Temperature
#define ONE_WIRE_BUS 2  // Menempatkan PIN hasil pembacaan sensor DS18B20 pada PIN 2. 
   //Disebut One Wire karena kita bisa menempatkan sensor DS18B20 lain pada PIN yang sama  
LiquidCrystal_I2C lcd(0x27, 16, 2); // Mengatur alamat LCD dan dimensi LCD, yaitu 20 kolom dan 4 baris

OneWire oneWire(ONE_WIRE_BUS); //Membuat variabel oneWire berdasarkan PIN yang telah didefinisikan
DallasTemperature sensor(&oneWire); //Membuat variabel untuk menyimpan hasil pengukuran

//deklarasi variable suhu DS18B20 dengan jenis data float
float suhuDS18B20_0;
float suhuDS18B20_1;
float suhuDS18B20_2;
float suhuDS18B20_3;
float suhuDS18B20_4;

void setup(void)
{
  lcd.begin();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("PROGRESSTECH");
  lcd.setCursor(0, 1);
  lcd.print("Protus");
  Serial.begin(9600); //Menginisiasikan setup kecepatan komunikasi
  sensor.begin();      //Menginisiasikan sensor One-Wire DS18B20

  // Sebelum melakukan pengukuran, atur resolusinya
  //sensor.setResolution(0, 9);  
  //sensor.setResolution(0, 10);
  //sensor.setResolution(0, 11);
  sensor.setResolution(0, 12);

  //sensor.setResolution(1, 9);  
  //sensor.setResolution(1, 10);
  //sensor.setResolution(1, 11);
  sensor.setResolution(1, 12);

  //sensor.setResolution(2, 9);  
  //sensor.setResolution(2, 10);
  //sensor.setResolution(2, 11);
  sensor.setResolution(2, 12);

  //sensor.setResolution(3, 9);  
  //sensor.setResolution(3, 10);
  //sensor.setResolution(3, 11);
  sensor.setResolution(3, 12);

  //sensor.setResolution(4, 9);  
  //sensor.setResolution(4, 10);
  //sensor.setResolution(4, 11);
  sensor.setResolution(4, 12);
  
  delay(2000);
}

void loop(void)
{
  
  sensor.requestTemperatures();  // Perintah konversi suhu
  //Membaca data suhu dari sensor #0 dan mengkonversikannya ke nilai Celsius
  suhuDS18B20_0 = sensor.getTempCByIndex(0);
  suhuDS18B20_1 = sensor.getTempCByIndex(1);
  suhuDS18B20_2 = sensor.getTempCByIndex(2);
  suhuDS18B20_3 = sensor.getTempCByIndex(3);
  suhuDS18B20_4 = sensor.getTempCByIndex(4);      
  // suhuDS18B20 = (suhuDS18B20*9/5) + 32;
  // suhuDS18B20 = suhuDS18B20 = 273.15;

  Serial.print("Sensor 0 : ");
  //Serial.println(suhuDS18B20, 1);  //Presisi 1 digit
  //Serial.println(suhuDS18B20, 2);  //Presisi 2 digit
  //Serial.println(suhuDS18B20, 3);  //Presisi 3 digit
  Serial.println(suhuDS18B20_0, 4);  //Presisi 4 digit
  Serial.println(" ┬░C");

  Serial.print("Sensor 1 : ");
  //Serial.println(suhuDS18B20, 1);  //Presisi 1 digit
  //Serial.println(suhuDS18B20, 2);  //Presisi 2 digit
  //Serial.println(suhuDS18B20, 3);  //Presisi 3 digit
  Serial.println(suhuDS18B20_1, 4);  //Presisi 4 digit
  Serial.println(" ┬░C");

  Serial.print("Sensor 2 : ");
  //Serial.println(suhuDS18B20, 1);  //Presisi 1 digit
  //Serial.println(suhuDS18B20, 2);  //Presisi 2 digit
  //Serial.println(suhuDS18B20, 3);  //Presisi 3 digit
  Serial.println(suhuDS18B20_2, 4);  //Presisi 4 digit
  Serial.println(" ┬░C");

  Serial.print("Sensor 3 : ");
  //Serial.println(suhuDS18B20, 1);  //Presisi 1 digit
  //Serial.println(suhuDS18B20, 2);  //Presisi 2 digit
  //Serial.println(suhuDS18B20, 3);  //Presisi 3 digit
  Serial.println(suhuDS18B20_3, 4);  //Presisi 4 digit
  Serial.println(" ┬░C");

  Serial.print("Sensor 4 : ");
  //Serial.println(suhuDS18B20, 1);  //Presisi 1 digit
  //Serial.println(suhuDS18B20, 2);  //Presisi 2 digit
  //Serial.println(suhuDS18B20, 3);  //Presisi 3 digit
  Serial.println(suhuDS18B20_4, 4);  //Presisi 4 digit
  Serial.println(" ┬░C");
  
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Suhu Sensor 0");
  lcd.setCursor(0, 1);
  lcd.print(suhuDS18B20_0, 4);
  lcd.print((char)223);
  lcd.print("C"); 
  delay(500);

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Suhu Sensor 1");
  lcd.setCursor(0, 1);
  lcd.print(suhuDS18B20_1, 4);
  lcd.print((char)223);
  lcd.print("C"); 
  delay(500);

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Suhu Sensor 2");
  lcd.setCursor(0, 1);
  lcd.print(suhuDS18B20_2, 4);
  lcd.print((char)223);
  lcd.print("C"); 
  delay(500);

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Suhu Sensor 3");
  lcd.setCursor(0, 1);
  lcd.print(suhuDS18B20_3, 4);
  lcd.print((char)223);
  lcd.print("C"); 
  delay(500);

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Suhu Sensor 4");
  lcd.setCursor(0, 1);
  lcd.print(suhuDS18B20_4, 4);
  lcd.print((char)223);
  lcd.print("C"); 
  delay(1000);    //delay 1 detik (1000 miliseconds)
}

Kode Program Beberapa DS18B20 dengan object getTempCByIndex setelah refactoring

// www.progresstech.co.id
// www.karyaone.co.id
// Protus Tanuhandaru

#include <LiquidCrystal_I2C.h> // Memanggil library LCD
#include <OneWire.h> //Memanggil library OneWire yang diperlukan sebagai dependensi library Dallas Temperature
#include <DallasTemperature.h> // Memanggil library Dallas Temperature
#define ONE_WIRE_BUS 2  // Menempatkan PIN hasil pembacaan sensor DS18B20 pada PIN 2. 
   //Disebut One Wire karena kita bisa menempatkan sensor DS18B20 lain pada PIN yang sama  
LiquidCrystal_I2C lcd(0x27, 16, 2); // Mengatur alamat LCD dan dimensi LCD, yaitu 16 kolom dan 2 baris

OneWire oneWire(ONE_WIRE_BUS); //Membuat variabel oneWire berdasarkan PIN yang telah didefinisikan
DallasTemperature sensor(&oneWire); //Membuat variabel untuk menyimpan hasil pengukuran

int jumlahSensor; // Membuat variabel jumlah Sensor yang disambungkan ke Arduino
int resolusiBit = 12; // Menentukan angka resolusi bit 9, 10, 11 atau 12
int jumlahDesimal = 4; // Menentukan jumlah angka desimal penyajian hasil

void setup(void)
{
  lcd.begin();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("PROGRESSTECH");
  lcd.setCursor(0, 1);
  lcd.print("Protus");
  Serial.begin(9600); //Menginisiasikan setup kecepatan komunikasi
  Serial.print("Sensor nomor : ");
  sensor.begin();      //Menginisiasikan sensor One-Wire DS18B20
  jumlahSensor = sensor.getDeviceCount(); // Menampung informasi jumlah sensor

  // Sebelum melakukan pengukuran, atur resolusinya
  for (int k=0; k < jumlahSensor; k++) {
    sensor.setResolution(k, resolusiBit);
  }
  delay(2000);
}

void loop(void)
{
  sensor.requestTemperatures();  // Perintah konversi suhu
  //Membaca data suhu dari sensor #0 dan mengkonversikannya ke nilai Celsius
  for (int i = 0; i < jumlahSensor; i++) {
    float hasilPengukuran = sensor.getTempCByIndex(i);
    
    Serial.print("Sensor nomor : ");
    Serial.println(i);
    Serial.print(hasilPengukuran, jumlahDesimal);
    Serial.println(" ┬░C");
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Suhu Sensor : ");
    lcd.print(i);
    lcd.setCursor(0, 1);
    lcd.print(hasilPengukuran, jumlahDesimal);
    lcd.print((char)223);
    lcd.print("C"); 
    delay(2000);
  }
}

Kode Program Beberapa DS18B20 dengan object Device Address

// www.progresstech.co.id
// www.karyaone.co.id
// Protus Tanuhandaru

#include <LiquidCrystal_I2C.h> // Memanggil library LCD
#include <OneWire.h> //Memanggil library OneWire yang diperlukan sebagai dependensi library Dallas Temperature
#include <DallasTemperature.h> // Memanggil library Dallas Temperature
#define ONE_WIRE_BUS 2  // Menempatkan PIN hasil pembacaan sensor DS18B20 pada PIN 2. 
   //Disebut One Wire karena kita bisa menempatkan sensor DS18B20 lain pada PIN yang sama  
LiquidCrystal_I2C lcd(0x27, 16, 2); // Mengatur alamat LCD dan dimensi LCD, yaitu 16 kolom dan 2 baris

OneWire oneWire(ONE_WIRE_BUS); //Membuat variabel oneWire berdasarkan PIN yang telah didefinisikan
DallasTemperature sensor(&oneWire); //Membuat variabel untuk menyimpan hasil pengukuran
DeviceAddress perangkat; //Membuat object array untuk menyimpan alamat Heksadesimal

int jumlahSensor; // Membuat variabel jumlah Sensor yang disambungkan ke Arduino
int resolusiBit = 12; // Menentukan angka resolusi bit 9, 10, 11 atau 12
int jumlahDesimal = 4; // Menentukan jumlah angka desimal penyajian hasil

void setup(void)
{
  lcd.begin();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("PROGRESSTECH");
  lcd.setCursor(0, 1);
  lcd.print("Protus");
  Serial.begin(9600); //Menginisiasikan setup kecepatan komunikasi
  Serial.print("Sensor nomor : ");
  sensor.begin();      //Menginisiasikan sensor One-Wire DS18B20
  jumlahSensor = sensor.getDeviceCount(); // Menampung informasi jumlah sensor

  delay(2000);
}

void loop(void)
{
  sensor.requestTemperatures();  // Perintah konversi suhu
  //Membaca data suhu dari sensor #0 dan mengkonversikannya ke nilai Celsius
  for (int i = 0; i < jumlahSensor; i++) {
    lcd.clear();
    lcd.setCursor(0, 0);

    // Mendapatkan alamat perangkat
    sensor.getAddress(perangkat, i);
    
    // Sebelum melakukan pengukuran, atur resolusinya
    sensor.setResolution(i, resolusiBit);

    // Menampilkan alamat dengan membaca konten dari array Device Address
    Serial.print("Alamat : ");
    for (uint8_t i = 0; i < 8; i++) {
      if(perangkat[i] < 0x10) Serial.print("0");
      Serial.print(perangkat[i], HEX);
      lcd.print(perangkat[i], HEX);
      
    }
    Serial.print(" | Suhu : ");

    //Menyajikan hasil pengukuran suhu
    float hasilPengukuran = sensor.getTempC(perangkat);
    Serial.print(hasilPengukuran, jumlahDesimal);
    Serial.println(" ┬░C");
    lcd.setCursor(0, 1);
    lcd.print(hasilPengukuran, jumlahDesimal);
    lcd.print((char)223);
    lcd.print("C"); 
    delay(2000);
  }
}

Skema Satu DS18B20

Skema Beberapa DS18B20

Skema Beberapa DS18B20

Leave a Reply

Your email address will not be published. Required fields are marked *