Real Project Example

Last updated: January 30 th, 2017

Geeknesia Microcontroller & IOT Starter Kit

Geeknesia Kit

Sebuah Starter Kit Lengkap dari Geeknesia untuk mempelajari IOT dan Micro Controller dengan mudah melalui praktek secara langsung.
Starter Kit ini menyediakan development board ESP 8266 tipe WeMos D1 yang compatible dengan board arduino sehingga mudah dipahami, muda diperlajari, dan mudah dimengerti. Dalam kit ini tersedia komponen elektronik lengkap untuk berbagai keperluan tutorial dan project real.

Read More or Buy Now !

Temperature Monitoring Menggunakan OneWire (DS18B20)

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 
#include 
#include 
#include 


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.