Reading Requirement:

Pada tutorial ini akan dijelaskan tentang cara membuat Temperature Monitoring menggunakan sensor OneWire (DS18B20), dan Geeknesia sebagai interface.


Alat dan bahan yang dibutuhkan:

  • Arduino+Ethernet Shield
  • Sensor Suhu OneWire (DS18B20) 
  • Kabel LAN
  • Kabel Jumper
  • Proto Board
  • Resistor 4k7/2k2/3k3

Arduino UNO

Ethernet Shield

OneWire (DS18B20)

Kabel Lan

Kabel Jumper

Proto Board

OneWire (DS18B20) Pinout



Tahap 1

Pastikan anda sudah membuat Project,Gateway dan Device pada akun Geeknesia anda.


Tahap 2

Buatlah rangkaian seperti gambar berikut:

Sambungkan pin Vcc 5v sensor DS18B20 ke pin 5v Arduino, kemudian pin Signal ke pin D2 Arduino, sambungkan resistor 4k7 antara pin Vcc dan pin Signal sensor, dan terakhir pin Gnd sensor ke pin Gnd Arduino.


Tahap 3

Buatlah script pada arduino seperti contoh di bawah ini:

 

#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>
#include <OneWire.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

char pubschar1 [20]; 
char message_buff[200];

OneWire  ds(2);  // on pin 2 (a 4.7K resis tor is necessary)

int flag = 0;
char pubschar2 [20]; //Data String temperature

char *deviceId = "device-f1e55c0ed7965e22d719365dfe9xxxxx";
char *deviceUsername = "fdf89828a494ee126543dbca876xxxxx";
char *devicePassword = "2f2a1499d7334a66abd2e07b36axxxxx";
String deviceCredential = String(deviceUsername) + ":" + String(devicePassword);

unsigned long time;

void callback(char* topic, byte* payload, unsigned int length) {
}

EthernetClient ethClient;
PubSubClient client("geeknesia.com", 1883, callback, ethClient);

//Senddata
void senddata(char* topic,String credential, char *var1, unsigned int nilai1){
  String pubString  ="{\"code\":\"";
  pubString += credential;
  pubString +="\",";
  pubString +="\"attributes\":{\"";
  pubString +=String(var1)+"\":\""+nilai1+"\"";
  pubString +="}}";
  pubString.toCharArray(message_buff,pubString.length()+1);
  Serial.println(message_buff);
  client.publish("iot/data",message_buff);  
}

void setup(){

  Serial.begin(9600);    
  while (Ethernet.begin(mac) != 1)
  {
    Serial.println("Error getting IP address via DHCP, trying again...");
    delay(5000);
  }
  Serial.print("IP address: ");
  for (byte thisByte = 0; thisByte < 4; thisByte++)
  {
    // print the value of each byte of the IP address:
    Serial.print(Ethernet.localIP()[thisByte], DEC);
    Serial.print(".");
  }
  Serial.println();
  delay(500);
}

void loop(){
  client.publish("iot/live",deviceId);
  if (!client.connected()){
     client.connect(deviceId,NULL,NULL,"iot/will",2,64,deviceId);
  }
  
    byte i;
    byte present = 0;
    byte type_s;
    byte data[12];
    byte addrs[8];
    float celsius, fahrenheit;

    if ( !ds.search(addrs)) {
    Serial.println("No more addresses.");
    Serial.println();
    delay(250);
    ds.reset_search();
    return;
  }

  if (OneWire::crc8(addrs, 7) != addrs[7]) {
      Serial.println("CRC is not valid!");
      return;
  }
  Serial.println();
 
  // the first ROM byte indicates which chip
  switch (addrs[0]) {
    case 0x10:
      Serial.println("  Chip = DS18S20");  // or old DS1820
      type_s = 1;
      break;
    case 0x28:
      Serial.println("  Chip = DS18B20");
      type_s = 0;
      break;
    case 0x22:
      Serial.println("  Chip = DS1822");
      type_s = 0;
      break;
    default:
      Serial.println("Device is not a DS18x20 family device.");
      return;
  } 

  ds.reset();
  ds.select(addrs);
  ds.write(0x44, 1);        // start conversion, with parasite power on at the end
  
  delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.
  
  present = ds.reset();
  ds.select(addrs);    
  ds.write(0xBE);         // Read Scratchpad

  Serial.print("  Data = ");
  Serial.print(present, HEX);
  Serial.print(" ");
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }
  Serial.print(" CRC=");
  Serial.print(OneWire::crc8(data, 8), HEX);
  Serial.println();

  // Convert the data to actual temperature
  // because the result is a 16 bit signed integer, it should
  // be stored to an "int16_t" type, which is always 16 bits
  // even when compiled on a 32 bit processor.
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // "count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
    //// default is 12 bit resolution, 750 ms conversion time
  }
  celsius = (float)raw / 16.0;
  fahrenheit = celsius * 1.8 + 32.0;
//  Serial.print("  Temperature = ");
//  Serial.print(celsius);
//  Serial.print(" Celsius, ");
//  Serial.print(fahrenheit);
//  Serial.println(" Fahrenheit");
  senddata(deviceId,deviceCredential,"Temperature",celsius);
  
  //delay(3000);
}

 

Upload script yang telah anda buat ke Arduino Board.


Tahap 4

Buka kembali project yang telah anda buat di geeknesia.com, lihat indikator pada gateway, jika berwarna hijau menandakan bahwa device atau arduino anda sudah berhasil terhubung ke Geeknesia, kemudian lihat perubahan nilai sensor pada screen yang tertampil di project Geeknesia.


Apabila sensor telah diberi suhu tinggi dan nilai Current Output tidak ada perubahan, cek attributes pada settingan device dan code pada Arduino.