Ultra High / High Accuracy I2C Temperature Sensor Module

I got fed up with low quality modules from China, so started selling my own on Ebay.

These are my first two products:

TS001UH - Ultra High Accuracy & Precision Temperature Sensor using NXP SE95
TS001H - High Accuracy & Precision Temperature Sensor using NXP LM75b.

They share this same datasheet.

Where do I start...


TS001UH has worst-case ±1ºC from -25~100ºC at 0.03125ºC resolution.
TS001H has worst-case ±2ºC from -25~100ºC 0.125ºC resolution.

The accuracy above is the absolute worst-case according to NXP's SE95 datasheet and LM75B datasheet - much better than knowing what the typical accuracy is in my opinion.

I decided to go with these because they are already calibrated by NXP!
I hate using thermistor and other cheaper temperature sensors that require calibration. 
Honestly, how would a hobbyist or even for a small company to calibrate the resistors accurately.


One area lacked by other temperature sensor modules was the PCB design.

I had just one thing in my mind when designing mine - optimizing the thermal paths.

These temperature sensor chips have their sensing dies usually connected to the ground pins.

That's is why I flooded... literally flooded the entire board top and bottom with ground planes.

I was satisfied with the result. The temperature difference between the readings from the module, front, and back of the module was roughly the same. It did take some time (less than 1 min) however for the temperature to gradually transfer from the back to front of the board.

With my design, I could measure ambient and on another PCB by installing my module right on the board near the heatsource.


I don't want too many pins I have to connect.

That's why I installed onboard customizable address jumpers, and used 2-wire I2C bus interface.

You really just need 4 wires to communicate with the module!

There is one more pin however - it's an open-drain output from the chip that you can use to drive heater, alarm, and etc.

Also, four #4 installation holes are on the PCB if you want to use standoffs or screws.


There are so many cheap knockoffs on Ebay...
Chips with weird logos, part number, and etc.

They should not allowed to sell these honestly.

I am only using genuine parts from NXP, Panasonic, and Murata all purchased from Mouser.
Also I used oshpark for my PCB. Gold plated, and high quality. Made in US as well :]


Lastly, I don't understand why no modules in the market right now has absolutely no protections.
I know they are cheap, but I hated it when the main chip gets fried when I accidentally connected the power in reverse.

That's why I added over-current, voltage, and reverse polarity protections.

Basically I have a small 1Ohm resistor in series with my power pin that is acting like a fuse.
You could actually use this for debug the board as well - how much current is the module using.

Then I have a zener to clamp the voltage when over-voltage is applied.

Also the same zener shorts the power pins when reverse voltage is applied.

Cheap, but effective protections.


Pictures of my product:

All modules will be shipped in anti-static bags and bubble wrap envelops using air shipping from here in Vancouver BC.

Sample Arduino Code HERE

They are fully made in Canada.

Click HERE to buy these :]

By Friendly Joe :]


Arcade Stick

The arcade stick is done!!!!!

Basic Operations
1. Controller reads the inputs from the joystick and the push buttons
2. Controller sends this information to the PC via serial communication
(well... using ftdi so virtual serial communication...)
3. The PC-side receiver translates this information into other useful instructions for the PC

I am using PIC 16F876a microcontroller as the controller
and a software written in MATLAB as the receiver.

For More Information

Check out the following posts:


Using the stick as a mouse:
Using the stick as an arcade stick:

By Joe Kwuen


Arcade Stick: Receiver

This post contains extra details on the receiver of my arcade stick.
PC receives and translates serial data from the controller using MATLAB and JAVA robot class.
I have programmed to operate my stick normally as an arcade stick, and also as a mouse.
In this post I will provide enough hints for anyone to use MATLAB for such purpose.

MATLAB Serial Communication Problem

I noticed many people including me were having problem with MATLAB's serial communication module.


The following code most likely will fix whatever problem you are having.
priorPorts = instrfind

MATLAB's serial communication apparently does not work well when there are any... 
(even the closed ports) 
previously declared ports.
The above code just finds and deletes the memory previously allocated for them.

Some useful MATLAB functions are:

JAVA Robot

first import the class for simplifications later on
import java.awt.Robot;
import java.awt.event.*;
import java.awt.event.KeyEvent;

make a robot class
robot = Robot;

have fun :D

key simulation:
if (sw1 ~= sw10)
if(sw1 == 1)
sw10 = sw1;

The delay of 20 ms simulates how actual keyboard works. 
A keypress function must be released else it will be like a stuck key.

mouse simulation:
pos = get(0, 'PointerLocation');
x_pos = pos(1)+speed;
y_pos = 768-pos(2)+speed;
mouse.mouseMove(x_pos, y_pos);

Read pointer location and move the mouse. 
You can set sensitivity by changing the speed variable.
The first line is included such that you may use your real mouse as well as the joystick to simultaneously move the mouse cursor.

By Joe Kwuen

Arcade Stick - Controller

This post contains extra details on the controller of my arcade stick.
The controller side of the Arcade Stick is fairly simple.
It is just a microcontroller - PIC 16F876a programmed using MPLAB with CCS C compiler.

During the main loop the controller
1. Reads the status of input ports
2. Organizes the info
3. Decides whether to send the info to the PC or not

Checking for Updates
pretty straight forward - just digital reads...

Just two bytes of information sending to the PC:
1 byte of joystick info
1 byte of push button info

The first byte consists of
0 - 0 - 0 - 0 - LEFT? - RIGHT? - DOWN? - UP?
there are four bits of zeroes as fillers because I am using 8N1 serial communication.
The other four bits are assigned to each direction.
For example, 0x08 = left and 0x0A = Left-Down

The second byte consists of
SW7 - SW6 - SW5 - ...
I guess it's self-explanatary that I am using each bit to indicate each switch.

The following code is being used to decide whether to send the info or not:

if(old_dir != new_dir || old_sw != sw)
old_dir = new_dir;
old_sw = sw;

The controller sends info only when the inputs have changed.

This greatly simplifies the PC software and improves the operation of the arcade stick.

By Joe Kwuen


Arcade Stick #1

This is the first posting on the arcade stick I am working on.
I play a lot of fighting games; yet I still don't have a descent fighting stick.
That is why I decided to make my own.

The components of this project are:
8 Push-Buttons
1 Joystick
Indicator Lights to Help Improve my Gaming Skills
Digital Controls to Provide Accurate and Fast Responses from the Inputs
USB Connection
C# User Interface

I finished the top side of my arcade stick.
It is made out of heavy cardboard, and plexiglass.
I used my school mechanic shop for drilling and etc.

I began testing just the direction controls on breadboard.
When I finish them
then I will start adding more circuitry and coding for the other inputs.

I am posting a video of my arcade stick so far:

By Joe Kwuen