Skip to content

Tag: tracker

Building a time tracker using arduino and blockchain tangletime part 2



Hello, This is part 2 of my project tangletime aka “Building a time tracker using arduino and blockchain”. Where I take you along my project to build an IOT time tracker using arduino and the IOTA blockchain. If you haven’t, please consider reading the first part .

Now that the plan is laid out. It’s time to plan for the hardware. We need those components :

An arduino board, a bluetooth module, a gyroscope and lots of cables and resistors to combine all of that together.

For the arduino board, cables and resistors I bought the Freenove RFID Starter Kit V2.0 with UNO R3. It’s an awesome starter kit with basically everything you need. Then for the Bluetooth module I bought the HC 05 and the gyroscope is the MPU 6050. ultimately with a more mature product, I think I’ll go for a beetle BLE, as it’s super small, cheap and handles Bluetooth out of the box. But that’s for a later stage.

I want to make as little calculations on the board as possible to lower the power usage and to make it easier to code. The idea is simple : connect the board to the gyroscope and whenever we detect a new stable orientation. Send that orientation to via the Bluetooth module to a connected phone.

The Bluetooth module with arduino

My HC-05 was not easy to tame, I found lots of tutorials online, most of them contradicting themselves on how to wire it. The main takeaway was that if you wire it to the 0/1 port, you need to unplug those before uploading your schematics to the board.

To test things out without using the gyroscope, I quickly plugged the infrared sensor included with the freenove kit, the part name is 1838B. I like it because it’s super easy to plug (it’s like 4 jumper cables). I could go with reading serial from my computer but I figured it would be nicer this way.

Arduino schematic for the bluetooth and IR module.
The Bluetooth module and IR module connection


I’m sorry for the clarity of the image, but everything is there I promise.

As for the code it was pretty straightforward :

/*
    IR remote keypad
   0 : FF6897
   1 : FF18E7
   2 : FF6897
   3 : FF7A85
   4 : FF10EF
   5 : FF38C7
   6 : FF5AA5

*/

#include <IRremote.h>
#include <SoftwareSerial.h>
SoftwareSerial EEBlue(10, 11); // RX | TX


int RECV_PIN = 12;        // Infrared receiving pin
IRrecv irrecv(RECV_PIN); // Create a class object used to receive class
decode_results results; // Create a decoding results class object

void setup()
{
  Serial.begin(9600); // Initialize the serial port and set the baud rate to 9600
  Serial.println("UNO is ready!");  // Print the string "UNO is ready!"
  irrecv.enableIRIn(); // Start the receiver
  EEBlue.begin(9600);
}


char value_to_char(unsigned long val)
{
  if (val == 16738455)
    return '0';
  else if (val == 16724175)
    return '1';
  else if (val == 16718055)
    return '2';
  else if (val == 16743045)
    return '3';
  else if (val == 16716015)
    return '4';
  else if (val == 16726215)
    return '5';
  else if (val == 16734885)
    return '6';
  else if (val == 4294967295)
    return 'X';
  else 
    return '?';
  

}

void loop() {

// if we recieve an IR message, send it via the bluetooth module.
  if (irrecv.decode(&results)) {
    // Waiting for decoding
    Serial.println(results.value); // Print out the decoded results 
    Serial.println(value_to_char(results.value)); // Print out the corresponding character

    EEBlue.write(value_to_char(results.value));

    irrecv.resume(); // Receive the next value
  }

  // Feed any data from bluetooth to Terminal.
  if (EEBlue.available())
  {
    Serial.println(EEBlue.read());
  }

  // Feed all data from termial to bluetooth
  if (Serial.available())
    EEBlue.write(Serial.read());

  delay(100);

}

To test everything, I used an app called “Bluetooth terminal HC-05” which basically allows you to send and receive data from the HC-05. It’s a lifesaver when you are working on the hardware side and don’t want to spend time making a quick and dirty app just to receive Bluetooth data.

Screenshot of the mobile app recieving bluetooth data
It works !

The final arduino setup

I wrote a whole article on the subject that you can find here ! So I’ll skip the details on how to set it up. And go straight to how I use it.

So here’s the “final” setup in terms of hardware. As for the code now all that’s left to do is to find all the x/y/z values for each side of the cube. But I don’t have a cube yet, and the arduino UNO board is way too big. So for now I’m going to make a first proof of concept where the time tracker only has two sides : register if the board is pointing left or right.

So after a few tests I realize that getting consistent reading is not as easy as I thought it would, there is a non negligible drift on the z value. There is probably some fine tuning necessary in the future in terms of which value = which side. but for now I only care about the x value since I want to know if the board is pointing left (x ~= -80) or right (x ~= 80)

Which translates to this code :

#include <SoftwareSerial.h>
#include <MPU6050_tockn.h>
#include <Wire.h>
MPU6050 mpu6050(Wire);
SoftwareSerial EEBlue(10, 11); // RX | TX
int pos = 0; // unset = 0, left = 1, right = 2 

void setup()
{
  Serial.begin(9600); // Initialize the serial port and set the baud rate to 9600
  Serial.println("UNO is ready!");  // Print the string "UNO is ready!"
  Wire.begin();
  mpu6050.begin();
  // offsets that I previously calculated using mpu6050.calcGyroOffsets(true);
  mpu6050.setGyroOffsets(-1.58, 0.69, -1.71);
  EEBlue.begin(9600);
}



void loop() {

  mpu6050.update();
  float x = mpu6050.getAngleX();
  float y = mpu6050.getAngleY();
  
  if (x < -50)
  {
    if (pos <= 1)
    {
      EEBlue.write("right\n");
      pos = 2;
    }
  }
  else if (x > 50)
  {
    if (pos == 0 || pos == 2)
    {
      EEBlue.write("left\n");
      pos = 1;
    }

  }

  Serial.println(x);
  
  Serial.println(pos);
}

Pretty easy right ? Here’s a little demo of the whole system :

Data is sent to the phone via Bluetooth
if that video didn’t work try this link

So now we have a system that can send data to a paired phone and detect orientation ! success ! Now all that’s left to do is to port that code to a production board, 3d print a cube, fit all of that inside, get the position data for each side (side 1 is x/y, side 2 is x1,y1 etc…) And we are good to go on the hardware side !

If you have experienced drift issues with the MPU6050 and know a good fix. I would be interested. Please consider subscribing to the mailing list to avoid missing any future episode of this serie 🙂

Building a time tracker using arduino and blockchain tangletime part 1

This is my first try at IOT, in this series I’ll be using the IOTA blockchain and arduino to build a time tracker and take you along for the ride 🙂

Blog banner, with "tangletime part 1" as header and "Building a time tracker using arduino and blockchain" as subheading

For a whole year I’ve been working full time on my own projects, namely SteemPress and more recently my blog ! And I really like to optimize my time. But without reporting, it’s pretty hard to really know what to work on. I tried to just use my phone timer to try to see how long I was doing various things (reddit/code/email/etc). But when I’m focused on various things, I often forget to start/stop it. And it also ment that I had to do a lot of reporting by hand. Which was a pain. So I figured that I would be building a time tracker using arduino and blockchain.

Here’s the project idea : I want to build a small cube/hexagon or a polygon (I’m not sure on the number of sides I want on it yet). So that if I put it on a sides for an activity. Let’s say coding. It’ll start a timer that will only stop when I put it on another side. Technically I am always doing something so there shouldn’t be a need for a “doing nothing” side.
Here’s a few ideas for sides that I had :

  • Programming
  • Gaming
  • Sleeping
  • Grocery shopping
  • Reading/replying on slack/emails/discord
  • Reddit-ing
  • Going out

Arduino for the time tracker hardware

Arduino is one of, if not the most accessible platform to build hardware on. It’s basically lego mindstorms on steroids. There are tons of tutorials in every possible form imaginable and tons of compatible parts that you can buy everywhere. I advise you to find a local shop and go to them to talk about your project. They will be able to give you advice and prevent you from buying tons of hardware that is ultimately useless for your project.

This was also a prime opportunity for me to start working on it since I’ve been wanting forever to work on some hardware things. And create more internet of shit (great twitter account, highly recommend that you check him out).

Why blockchain ?

If you know me (or read my github) you’ll quickly notice that I work a lot with various blockchains. So I like to see how blockchains can improve things. One big issue that I have with IOT products is the fact that it only works until the people behind it continue to run their server. So you pay 50 euros for hardware that might at any moment turn off. And I don’t want this kind of stuff. Another thing is that I want to have control over my data and not have a random company be aware of pretty much all of my activities.

The IOTA blockchain

Disclaimer : I have a small stake in IOTA

The IOTA blockchain is one of a few blockchain that’s designed for IOT usage, some would argue that it’s not a blockchain and they would be kind of right : It’s a tangle. I’ll pass the details but long story short it has super fast transaction times, transactions are free (as long as you validate other people’s transactions). Since it’s one of the biggest cryptocurrencies, there’s a lot of support online on how to do IOT with it.

I’ve been wanting to do a small projects to test out that blockchain in real conditions so this sounds like a perfect use case. And this means that :

  • It’s decentralized : No need to run a server to host the data
  • Anyone can run a web app to display the data. If Alice doesn’t like the default setup she can go online and make her own or try the one that Bob put online.

I believe that for an use case like this, the hardware is not the limiting factor : it’s the software, what graphs you do, how you extrapolate on the data that’s important. And If this can be made open for anyone to hack, and anyone can have their own custom dashboard with exactly what they need. This would be really cool.

“Yeah you don’t give your data to a single company, you give it to everyone instead”

Not really because if I control what I send and how I send it, I can easily put encrypted data or just send like “activity 1” instead of “programming” (Sleep would be relatively easy to spot though, so encryption might be in order). But this is far down the line.

The plan

So there are four big parts to this project. First I need to make a proof of concept using hardware, just a very basic thing using gyroscopes that displays the orientation, send that using bluetooth to my computer or phone.

Then the second phase will be saving all of that on a local database and building a basic dashboard, most likely in the form of a phone app.

Then for the third phase I’ll add blockchain support. And if everything still holds together I will buy a pcb board, the smallest Arduino that I can find. Solder everything together, 3d print my cube/polygon and actually have my finalized product.

So hang on for the ride, consider subscribing if you haven’t already to get notified when I’ll publish the next part of this series.

And before we finish I got a question for you all. If I made this, would you be interested in downloading files to create your own ? Or if you are not really the tech type, to buy a pre-assembled one ?