Introduction: Date, Time & Temperature Display Using XinaBox

Cool OLED display showing the date, time and temperature in Celsius and Fahrenheit using Xinabox xChips based off ESP8266.

Step 1: Things Used in This Project

Hardware components

  • XinaBox IP01 x 1
    xChip USB Programmer based on FT232R From FTDI Limited
  • XinaBox CW01 x 1
    xChip Wi-Fi Core based on ESP8266 Wi-Fi Module
  • XinaBox SW01 x 1
    xChip Temperature, humidity and atmospheric pressure sensor based on the BME280 from Bosch.
  • XinaBox OD01 x 1
    xChip 128x64 Pixel OLED Display
  • XinaBox PU01 x 1
    xChip USB (Type A) Power Supply
  • XinaBox XC10 x 1
    xChip Bus Connectors
  • 5V USB Power Supply x 1

Software apps and online services

Step 2: Story

Introduction

I built this project to display the date, UCT time and temperature using XinaBox xChips that uses the I2C bus protocol. The time was retrieved from a google NTP server. The ambient temperature was measured using the SW01 xChip and was displayed on the OD01 xChip OLED display in Celsius and Fahrenheit. The image below shows the OLED display.

OLED displaying date, time and temperature

Step 3: Download Necessary Files

You will require the following libraries and software for this project.

  • Arduino IDE - Development Software in which you will code
  • xSW01 - Temperature sensor library
  • xCore - Core library for XinaBox xChips
  • xOD01 - OLED Display library.
  • Timezone - Library to choose your timezone
  • Time - To use time functions
  • NTPClient - Enables you to get time from a server
  • You will also need to download the ESP8266 board and follow the instructions that accompany it in order to have the board installed

Once downloaded you will install the IDE and the libraries. It is fairly straight forward if you follow the instructions.

Step 4: Assemble

Your main xChip that will execute and process the program is the CW01. It is based on the ESP8266 WiFi Module and uses the I2C bus protocol. In order to program to the CW01, you will need a programming xChip. The IP01 allows us to program the CW01 via the USB port on our computer simply by clicking together the two xChips using XC10 bus connectors and inserting it into the the USB port. No wiring and no soldering required. One thing to take note of is the orientation of the xChip identification names. They should all be orientated in the same direction. You should now have the following setup.

Click together CW01 and IP01 and insert it into the USB port on your computer

If you are familiar with xChips you may connect every xChip together using XC10 bus connectors that you want to use for your project and then insert it into the USB port. We will be using SW01 temperature sensor and the OD01 OLED display.

You may connect all your chips together and then insert it into your USB port

Step 5: Program

Download or copy and paste the code below into your Arduino IDE. If you aren't making any changes to the code simply enter your WiFi details in their respective fields as shown below. Also enter a reliable NTP time server. I've used a Google time server for this project.

WiFi details and NTP time server

Now compile and upload. Make sure you've selected the correct COM port and board under the tools menu in the Arduino IDE. Once uploaded, the time, date and temperature should show as below.

After uploading you should see the following

Step 6: Make It Portable

You may now remove the unit from your USB port and separate each xChip by simply pulling it apart. Since the programming is complete, IP01 is no longer required. You may now connect your project in any manner you wish as long as the identification names are all orientated in the same direction. To power our unit we will use the PU01. This allows us to power it from a normal power bank or any 5V USB power supply. I've connected mine as shown below.

Final assembly. xChips can be connected in any way you desire.

Step 7: Conclusion

This project will take 20min to complete. If you want the time in your location, consider looking at the example code in the Timezone library or do some arithmetic with the UTC time. No wires were used and no soldering was required.

Step 8: Code

Date_Time_Temp.ino Arduino
Simply enter your WiFi details in their respective fields and upload to your board.

#include <xCore.h>           // include core library for XinaBox xCHIPS
#include <xOD01.h>           // include OLED display library
#include <xSW01.h>           // include the temperature sensor library
#include <xESP8266WiFi.h>    // include ESP8266WiFi functionality
#include <String.h>
// include time libraries
#include <WifiUDP.h>
#include <NTPClient.h>
#include <Time.h>
#include <TimeLib.h>
#include <Timezone.h>

xSW01 SW01;
// define NTP properties
#define ntpOffset   60 * 60      // in seconds
#define ntpInterval 60 * 1000    // in miliseconds
// insert a reliable ntp time server between the double quotes
// here i've used a google ntp time server
#define ntpAddress "time1.google.com"

// set up the NTP UDP client
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, ntpAddress, ntpOffset, ntpInterval);

// temperature variable
float tempC;    // celsius
float tempF;    // fahrenheit

// your wifi details
const char* wifi_ssid = "XinaBox";             // your wifi ssid
const char* wifi_pass = "RapidIoT";           // your wifi password

// date and time variable
String date;
String clktime;

// variables containing days and months
const char * days[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"} ;
const char * months[] = {"Jan", "Feb", "Mar", "Apr", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec"} ;
const char * ampm[] = {"AM", "PM"} ;

void setup ()
{

  tempC = tempF = 0;    // initialize temperature to zero
  timeClient.begin();   // start the NTP UDP client
  // start serial communication
  Serial.begin(115200);
  // start i2c communication and set pins
  Wire.begin(2, 14);
  // start temperature sensor
  SW01.begin();
  // start OLED display
  OLED.begin();
  // clear OLED display
  OD01.clear();

  // establish wifi connection
  wifi_connect();
  delay(1000);
}

void loop()
{
  // run if wifi connection is established
  if (WiFi.status() == WL_CONNECTED) {
    SW01.poll();                  // read temperature
    tempC = SW01.getTempC();      // store temp in celcius
    tempF = SW01.getTempF();      // store temp in fahrenheit
    date = "";                    // clear date variable
    clktime = "";                 // clear time variable

    // update the ntp client and get the unix utc timestamp
    timeClient.update();
    unsigned long epochTime =  timeClient.getEpochTime();

    // convert received time stamp to time_t object
    time_t utc;
    utc = epochTime;

    // utc time
    TimeChangeRule utcRule = {"UTC", Last, Sun, Mar, 1, 0};
    Timezone UTC(utcRule, utcRule);

    // format time variables
    date += days[weekday(utc) - 1];
    date += ", ";
    date += months[month(utc) - 1];
    date += " ";
    date += day(utc);
    date += ", ";
    date += year(utc);

    // format the time to 12-hour format with AM/PM and no seconds
    clktime += hourFormat12(utc);
    clktime += ":";
    if (minute(utc) < 10) // add a zero if minute is under 10
      clktime += "0";
    clktime += minute(utc);
    clktime += " ";
    clktime += ampm[isPM(utc)];

    // display time, date and tempearure on OLED
    OD01.set2X();
    OD01.print("  ");
    OD01.println(clktime);
    OD01.set1X();
    OD01.println("");
    OD01.println("");
    OD01.print("   ");
    OD01.print(tempC);
    OD01.print(" C   ");
    OD01.print(tempF);
    OD01.println(" F");
    OD01.println("");
    OD01.println(date);
  } else {    // try to restablish wifi connection if disconnected
    wifi_connect();
  }
  delay(5000);  // updates display every 5seconds
}

// establishes a wifi connection
void wifi_connect() {
  Serial.print("Connecting to ");
  Serial.print(wifi_ssid);
  WiFi.begin(wifi_ssid, wifi_pass);    // connect to wifi
  while (WiFi.status() != WL_CONNECTED)
  {
    Serial.print(".");
    delay(300);
  }
  Serial.println("");
  Serial.print("Connected to WiFi at ");
  Serial.print(WiFi.localIP());
  Serial.println("");
}