Things used in this project

Hardware components:
Hexiwear docking bd
NXP Hexiwear
×1
SparkFun HX711 module
×1
Load Cell
×4
350mm x 350mm wooden platform
×1
Power bank (2000mAh, 5VDC, 1A)
×1
Software apps and online services:
Wolksense IoT
D94d qxu
Autodesk Fusion 360
Android Studio
ARM mbed OS 5
Inkscape
Hand tools and fabrication machines:
09507 01
Soldering iron (generic)
Scissors

Custom parts and enclosures

Hexiscale CAD
Designed with Autodesk Fusion 360
Hexiscale 2016 oct 08 06 14 04pm 000 customizedview4151226595

Schematics

Hexiscale Circuit diagram
Hexiscale%20schematics

Code

Hexiwear code (ARM mbedOs5)C/C++
This is hexiwear firmware that runs Hexiscale
#include "mbed.h"
#include "Hexi_KW40Z.h"
#include "Hexi_OLED_SSD1351.h"
#include "OLED_types.h"
#include "OpenSans_Font.h"
#include "string.h"

#define LED_ON      0
#define LED_OFF     1

   
void StartHaptic(void);
void StopHaptic(void const *n);
void txTask(void);
long ReadWeight(void);
uint16_t getGram();
long offset = 0;
long getAverageValue(int times);

// Pin connections for Hexiwear
//MPL3115A2 MPL3115A2( PTC11, PTC10, MPL3115A2_I2C_ADDRESS);
/* pos [0] = altimeter or pressure value */
/* pos [1] = temperature value */
float sensor_data[2];

DigitalOut redLed(LED1,1);
DigitalOut greenLed(LED2,1);
DigitalOut blueLed(LED3,1);
DigitalOut haptic(PTB9);

DigitalIn HX_DOUT(PTC3);
DigitalOut HX_PD_SCK(PTC5);

/* Define timer for haptic feedback */
RtosTimer hapticTimer(StopHaptic, osTimerOnce);

/* Instantiate the Hexi KW40Z Driver (UART TX, UART RX) */ 
KW40Z kw40z_device(PTE24, PTE25);

/* Instantiate the SSD1351 OLED Driver */ 
SSD1351 oled(PTB22,PTB21,PTC13,PTB20,PTE6, PTD15); /* (MOSI,SCLK,POWER,CS,RST,DC) */

/*Create a Thread to handle sending BLE Sensor Data */ 
Thread txThread;

 /* Text Buffer */ 
char text[20]; 

/****************************Call Back Functions*******************************/
void ButtonRight(void)
{
    StartHaptic();
    kw40z_device.ToggleAdvertisementMode();
}

void ButtonLeft(void)
{
    StartHaptic();
    kw40z_device.ToggleAdvertisementMode();
}

void PassKey(void)
{
    StartHaptic();
    strcpy((char *) text,"PAIR CODE");
    oled.TextBox((uint8_t *)text,0,25,95,18);
  
    /* Display Bond Pass Key in a 95px by 18px textbox at x=0,y=40 */
    sprintf(text,"%d", kw40z_device.GetPassKey());
    oled.TextBox((uint8_t *)text,0,40,95,18);
}

/***********************End of Call Back Functions*****************************/

/********************************Main******************************************/

int main()
{    
    Thread::wait(10000);
    offset = getAverageValue(20);
    /* Get OLED Class Default Text Properties */
    oled_text_properties_t textProperties = {0};
    oled.GetTextProperties(&textProperties);    

    /* Turn on the backlight of the OLED Display */
    oled.DimScreenON();
    
    /* Fills the screen with solid black */         
    oled.FillScreen(COLOR_BLACK);
        
    /* Register callbacks to application functions */
    kw40z_device.attach_buttonLeft(&ButtonLeft);
    kw40z_device.attach_buttonRight(&ButtonRight);
    kw40z_device.attach_passkey(&PassKey);

    /* Change font color to white */ 
    textProperties.fontColor   = COLOR_WHITE;
    oled.SetTextProperties(&textProperties);
    
    /* Display Bluetooth Label at x=17,y=30 */ 
    strcpy((char *) text,"89.9kg");
    oled.Label((uint8_t *)text,17,30);
    
    
    /* Change font color to Blue */ 
    textProperties.fontColor   = COLOR_BLUE;
    oled.SetTextProperties(&textProperties);
    
    /* Display Bluetooth Label at x=17,y=65 */ 
    strcpy((char *) text,"BLUETOOTH");
    oled.Label((uint8_t *)text,17,65);
    
    /* Change font color to white */ 
    textProperties.fontColor   = COLOR_WHITE;
    textProperties.alignParam = OLED_TEXT_ALIGN_CENTER;
    oled.SetTextProperties(&textProperties);
    
    /* Display Label at x=22,y=80 */ 
    strcpy((char *) text,"Tap Below");
    oled.Label((uint8_t *)text,22,80);
         
    uint8_t prevLinkState = 0; 
    uint8_t currLinkState = 0; 
    txThread.start(txTask); /*Start transmitting Sensor Tag Data */
    
    while (true) 
    {
        blueLed = !kw40z_device.GetAdvertisementMode(); /*Indicate BLE Advertisment Mode*/   
        Thread::wait(50);
    }
}

/******************************End of Main*************************************/


/* txTask() transmits the sensor data */
void txTask(void){
   
   while (true) 
   {
        /* sets the gain of hx711 to 128*/
        ReadWeight();
        
        /*Notify Hexiwear App that it is running Sensor Tag mode*/
        kw40z_device.SendSetApplicationMode(GUI_CURRENT_APP_SENSOR_TAG);

        /*Send weight using pressure service*/ 
        kw40z_device.SendPressure(getGram());      
        Thread::wait(1000);                 
    }
}

void StartHaptic(void)  {
    hapticTimer.start(50);
    haptic = 1;
}

void StopHaptic(void const *n) {
    haptic = 0;
    hapticTimer.stop();
}

long ReadWeight(void)
{
        long Count;
        unsigned char i;
        HX_PD_SCK.write(0);
        Count = 0;
        while(HX_DOUT.read() == 1);
        for (i=0;i<24;i++)
        {
                HX_PD_SCK.write(1);
                Count=Count<<1;
                HX_PD_SCK.write(0);
                if(HX_DOUT.read() == 1) Count++;
        }
        HX_PD_SCK.write(1);
        Count=Count^0x800000;
        HX_PD_SCK.write(0);
        return(Count);
}

uint16_t getGram(){
    return ((getAverageValue(20) - offset))/1000;
}

long getAverageValue(int times){
    long sum = 0;
    for (int i = 1; i <= times; i++)
    {
        sum += ReadWeight();
    }
    return sum / times;
}
Hexiscale android application
android app for hexiscale weight scale

Credits

20160816 140817
Emmanuel Edwards

A Java based application developer. I do more of android application development and embedded system designs with C/C++,

Replications

Did you replicate this project? Share it!

Love this project? Think it could be improved? Tell us what you think!

Give feedback

Comments

Similar projects you might like

FM radio
Intermediate
  • 6,712
  • 31

Full instructions

Build a great sounding FM radio with a cool display using an Arduino Nano and the Sparkfun Si4703 FM tuner breakout

JuicyBoard: Modular Robotics Platform
Intermediate
  • 570
  • 4

Open source hardware that makes it flexible to build 3D printers, CNC, routers and more.

Alexa Trigger ESP8266
Intermediate
  • 1,418
  • 13

Work in progress

Use Alexa to voice control a relay connected to the Internet via ESP8266-01.

HiSens Lake Monitoring System
Intermediate
  • 259
  • 5

Full instructions

We are proposing a multi-function system to monitor algal blooms in Lake Erie and other affected bodies of water.

HiSens Lake Monitoring System

Team Calvary Engineering LLC

Personal Weather Station
Intermediate
  • 410
  • 7

Full instructions

Personal weather station using Arduino Pro Mini and Nokia 5110 display.

3D printed Air Gate for Drones
Intermediate
  • 2,711
  • 13

Full instructions

Move your drone racing skills to the next level with these interactive air gates!

ProjectsCommunitiesContestsLiveAppsBetaFree StoreBlogAdd projectSign up / Login
Respect project
Feedback