NS.One dan Wire Library

Wire library yang disertakan dalam software NS.One dan Arduino, memungkinkan kita untuk berkomunikasi dengan divais I2C / TWI. Pada board NS.One, SDA (jalur data) dan SCL (jalur clock) terletak pada pin 17 (PC1) dan 16 (PC0).

Terdapat dua versi pengalaman I2C, 7-bit dan 8-bit. 7 bit pertama meng-identifikasi divais, dan bit ke delapan menentukan proses tulis atau baca. Pustaka Wire menggunakan pengalamatan 7-bit. Bila pada datasheet atau contoh, menggunakan alamat 8-bit, alamat terakhir dibuang dgn menggeser satu bit ke kanan, menyisakan sebuah alamat antara 0 dan 127.

Sebagai contoh, chip DS1307 memiliki alamat 8-bit 0xD0. Setelah digeser satu bit ke kanan, alamat menjadi 0x68, dan alamat ini yang digunakan dalam program berbasis pustaka Wire.

#include <Wire.h>
#define rtc 0x68 // The pre-defined address for DS1307

int ss,mm,hh,dd,DD,MM,YY;
int prev;

void setup()
{
  Serial.begin(9600);
  Wire.begin();
}

void loop()
{
  static char buff[20];
  get_time();
  if(ss!=prev)                // lcd Print when the seconds change
  {
    sprintf(buff,"%02d-%02d-%02d",DD,MM,2000+YY);
    Serial.println(buff);
    sprintf(buff,"%02d:%02d:%02d",hh,mm,ss);
    Serial.println(buff);
    prev=ss;
  }
}

void get_time()
{
  Wire.beginTransmission(rtc); // start communication over i2c with DS1307
  Wire.write((byte)0); // Write the value of the register to point to
  Wire.endTransmission(); // End communication over i2c with DS1307

  Wire.requestFrom(rtc,7); // This will request 7 bytes of data                           
  ss = bcdToDec(Wire.read()); //starting from the '0' the register
  mm = bcdToDec(Wire.read());
  hh = bcdToDec(Wire.read());
  dd = bcdToDec(Wire.read());
  DD = bcdToDec(Wire.read());
  MM = bcdToDec(Wire.read());
  YY = bcdToDec(Wire.read());
  Wire.endTransmission();
}

void set_time()
{
  Wire.beginTransmission(rtc);
  Wire.write((byte)0);
  Wire.write(decToBCD(50));    // seconds
  Wire.write(decToBCD(59));    // minutes
  Wire.write(decToBCD(11));    // hours
  Wire.write(decToBCD(3));     // day of the week, startin monday
  Wire.write(decToBCD(21));    // date
  Wire.write(decToBCD(12));    // month
  Wire.write(decToBCD(11));    // year
  Wire.endTransmission();
}

int decToBCD(int dec)
{
  return dec/10*16 + (dec%10);
}

int bcdToDec(int bcd)
{
  return bcd/16*10 + (bcd%16);
}