Let's Make a Difference
The DIY, open-source thermostat for the visually impaired.
back-
story.
Our project that came out of the MIT 2.00 Introduction to Design Class in the fall semester of 2018. Our team of five set our sights on helping our user, Candi, who is legally blind. When we interviewed her, she told us about the struggles she had using appliances around her home, especially with her thermostat who's numbers were way too small for her to be able to read. She never knew what temperature she was setting it to. While we set out to create a product for Candi herself to use, constraints saw us finishing a very rough prototype and without the resources to implement one in Candi's home or go to market, we sought another route. We created an idea that we wanted to share with family and friends of the visually impaired. A DIY, inexpensive way, to make their loved one's lives just a little bit easier. A modification you can make to certain thermostats so they may be able to use them. This is Candi.
Candi Is
A way that you, a loved one, can modify certain existing thermostats to allow someone in your life with visual disabilities to be able to use their thermostat. Below, in our documentation, we have provided a list of parts, instructions, and example source code required to make your thermostat at home speak the temperature it is being set to at the push of a button. We have also listed problem we have encountered, and how to solve them.
Scroll to Begin
We're Sorry :(
If your thermostat has buttons or a touchscreen, Candi isn't the system for you. We tried to make Candi as compatible as possible but its really hard to fit all the different thermostats! Maybe someday soon!
Step 1:
Is your thermostat compatible?
A good fit...
If you set the temperature of your thermostat with a slider of some sort, Candi will work for you with some modifications! Please read the details under each set of instructions to see how you can modify Candi to your needs!
Perfection!
If you set the temperature of your thermostat with a circular knob, Candi will work for you right out of the box (with some mild finessing). We designed Candi to work on a circular thermostat!
Documentation:
Step-by-Step, How to Make Candi
one.
Collect the parts...
Parts List for the Candi:
(1x) Arduino Uno Rev3
(1x) Emic2 Text-to-Speech Converter
(1x) Bread Board + Male/Female Jumper Wires
(1x) USB-Powered Speaker (unpowered speakers will not work with the Emic2)
(1x) Arduino Color Sensor****
(1x) Arduino Power Adapter
(1x) USB Power Brick
(1x) Pack of Colored Stickers
****We recommend a different color sensor, however this one is part of the list as this is what is used in the documentation.
$150
Rough Total Cost (depends on parts)
This cost represents the amount of money it would take to build Candi from scratch, however many people may have a majority of its parts at home already.
two.
wiring & electronics
Wiring the Emic2.
Wire the Emic2 to the Arduino next. Note, the wiring diagram on the right is not completely correct, it provides a general idea of how to wire the Emic2 but our code did not use this diagram. Again, hold off on wiring the 5V and GND until we insert the bread board. Wire the SOUT > RX pin and the SIN > TX pin on the Arduino for the Emic. Then connect the 3.5mm jack of the speaker to the 3.5mm jack for the Emic2.
You may use, theoretically, any two digital input pins on the Arduino however we have not tested this.
Wiring the Color Sensor.
Take the GY-31 (TCS3200) or similar color sensor and follow its documentation to hook it up to your Arduino. This is a diagram for an Arduino Mega, however the wiring is essentially the same for an Arduino UNO. For more advanced users, interrupt pins are not needed for this design. Wiring: OUT > pin8. S2 > pin7. S3 > pin6. S1 > pin5. S0 > pin4. Hold off on wiring the VCC and the GND pins until we add in the breadboard in a later step.
Note: the image was taken from a tutorial we use ourselves from https://howtomechatronics.com/tutorials/arduino/arduino-color-sensing-tutorial-tcs230-tcs3200-color-sensor/
Full code and image credit goes to them...
Speaker
Finishing Up The Wiring:
Reset Bttn.
9v Power
+ - + - 0 1 2 3 OUT
Color
Emic2
+ - SOUT SIN
Speaker
3.5mm to Emic2
USB To Brick
To Wall Outlet
Wall Outlet
three.
mechanical assembly
There are multiple components to the mechanical assembly. First there's the base board that isn't required however made it easier to mount and test everything for our prototyping purposing. There's a clear acrylic housing cylinder that fits over the thermostat (in the case of a circular thermostat) that spins the thermostat dial and also has color strips on the side so the color sensor may detect the differing colors to sense the position of the dial to then determine the temperature.
If you were to modify this for a sliding thermostat, you would need to create a color slider for the thermostat to read the temperature instead of a cylinder covering the thermostat. Essentially the idea is we design something to fit over the thermostat that moves with the interface of the thermostat and moves a strip of color depending on the temperature setting. The color sensor reads this strip to determine the color.
coloring the wheel
For the color sensor system to work, we need colors with differing R, G, and B values as all colors (from a computer point of view) are made of these three values. Our code will use one or two of these color values to differentiate between colors.
Our thermostat's range is between 40-100 degrees. Realistically, most users use the 50-80 range on their thermostat. So we need one color for every 5 degrees between 50 and 80. One for 50-55, one for 55-60, so on until 80 degrees. In total we should have 6 colors.
The colors we chose:
Red
Orange
Green
Blue
Grey
White
(The thermostat pictured has more than 6 colors but 6 will be enough for most purposes). Stick these colors next to each other on the wheel in the range of the temperatures. (see the above diagram for more)
building the "color wheel"
Our team had access to a laser cutter, so to build the outer wheel, we measured out the diameter of our thermostat, laser-cut disks, and glued them together. We realize this isn't practical for many users so we have a better way.
(1) Take a piece of Elmer's foam board (12x24 inch minimum)
(2) Cut a circle from the foam board to cover the top of the thermostat
(3) Cut a strip with the width equal to the height of the thermostat and the length equal to the circumference of the first circle you cut
(4) Bend this strip around the circle you cut and hot glue the assembly together
We know our instructions are primitive :) > check out this youtube video on how to build a foam cylinder, just make sure it has no bottom, and the dimensions match those of your thermostat!
https://www.youtube.com/watch?v=kQwLKVCQiA4
mounting the color sensor
Most color sensors work best between a ~1-2cm range from the colors themselves. Tape the color sensor down within this range from the color wheel itself.
It is advisable, but not necessary to create a cover for this color sensor so it may use its own light source to reduce interference from different lighting conditions. There are a few simple ways to do this. First, you could use cardboard or paper and tape it over the color sensor in a box form that covers the sensor from light from the top and sides but still allows it to read colors in front of it. Se the above diagrams for more detailed pictures. This can also be done with foam board and other materials.
Mechanically Simple
The only thing left is to mount Candi to the wall!
Candi needs to be finished with a few hours of testing and coding.
four.
the lines of code
Candi's coding and debugging took some work and will depend on your choice of color sensor. In our testing, we realized that the GY-31 doesn't always give consistent color readings. Therefor, your code would be different than ours. We took the example code from the Emic2 and sample code from the color sensor and combined the two. The color sensor reads the R, G, B values of the color and a series of if-else statements determines based on the value what the Emic2 should say the color range is (what temperature the thermostat is set to).
NOTE: if you are building your own Candi, you will need to set the range of R, G, and B values in the code for each temperature for your own sensor and colors you used. Do not use the actual RGB values, make sure you use the values read from the sensor as most sensor values differ due to environmental factors.
Arduino Code
Please Read and Modify for Your Use
//BEGIN CODE
//EMIC SETUP
// include the SoftwareSerial library so we can use it to talk to the Emic 2 module
#include <SoftwareSerial.h>
#define rxPin 1 // Serial input (connects to Emic 2's SOUT pin)
#define txPin 0 // Serial output (connects to Emic 2's SIN pin)
#define ledPin 13 // Most Arduino boards have an on-board LED on this pin
// set up a new serial port
SoftwareSerial emicSerial = SoftwareSerial(rxPin, txPin);
//COLOR SENSOR SETUP
#define S0 4
#define S1 5
#define S2 6
#define S3 7
#define sensorOut 8
int frequency = 0;
int R = 0;
int G = 0;
int B = 0;
//TEMPRATURE VARIABLES
String temp = "";
void setup() {
//COLOR SENSOR
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
pinMode(sensorOut, INPUT);
// Setting frequency-scaling to 20%
digitalWrite(S0,HIGH);
digitalWrite(S1,LOW);
//Serial.begin(9600);
//EMIC SETUP
// define pin modes
pinMode(ledPin, OUTPUT);
pinMode(rxPin, INPUT);
pinMode(txPin, OUTPUT);
// set the data rate for the SoftwareSerial port
emicSerial.begin(9600);
digitalWrite(ledPin, LOW); // turn LED off
/*
When the Emic 2 powers on, it takes about 3 seconds for it to successfully
initialize. It then sends a ":" character to indicate it's ready to accept
commands. If the Emic 2 is already initialized, a CR will also cause it
to send a ":"
*/
emicSerial.print('\n'); // Send a CR in case the system is already up
while (emicSerial.read() != ':'); // When the Emic 2 has initialized and is ready, it will send a single ':' character, so wait here until we receive it
delay(10); // Short delay
emicSerial.flush(); // Flush the receive buffer
}
void loop() {
// Setting red filtered photodiodes to be read
digitalWrite(S2,LOW);
digitalWrite(S3,LOW);
// Reading the output frequency
frequency = pulseIn(sensorOut, LOW);
//Remaping the value of the frequency to the RGB Model of 0 to 255
frequency = map(frequency, 25,72,255,0);
R = frequency;
// Setting Green filtered photodiodes to be read
digitalWrite(S2,HIGH);
digitalWrite(S3,HIGH);
// Reading the output frequency
frequency = pulseIn(sensorOut, LOW);
//Remaping the value of the frequency to the RGB Model of 0 to 255
frequency = map(frequency, 30,90,255,0);
G = frequency;
// Setting Blue filtered photodiodes to be read
digitalWrite(S2,LOW);
digitalWrite(S3,HIGH);
// Reading the output frequency
frequency = pulseIn(sensorOut, LOW);
//Remaping the value of the frequency to the RGB Model of 0 to 255
frequency = map(frequency, 25,70,255,0);
B = frequency;
/*
* THE MATH CODE TO CREATE THE RGB VALUES TO THE ACTUAL TEMPERATURE
* YOU WILL NEED TO TEST AND MODIFY THIS SECTION OF THE CODE
*/
//Sets the temprature
if(B < 278 && B > 276){
temp = "75 to 80,";
}
else if(B < 260 && B > 235){
temp = "70 to 75,";
}
else if(B < 290 && B > 281){
temp = "65 to 70,";
}
else if(B > 305){
temp = "60 to 65,";
if(G > 215){
temp = "50 to 55,";
}
}
else{
temp = "55 to 60,";
}
/*_____________________________________________________________________________________________________________*/
//EMIC SPEAKING CODE...
// Speak some text
emicSerial.print('S');
//emicSerial.print("The Temprature is set to,");
//emicSerial.print(R);
//emicSerial.print(G);
//emicSerial.print(B);
emicSerial.print(temp);
//emicSerial.print("Degrees");
emicSerial.print('\n');
digitalWrite(ledPin, HIGH); // Turn on LED while Emic is outputting audio
while (emicSerial.read() != ':'); // Wait here until the Emic 2 responds with a ":" indicating it's ready to accept the next command
digitalWrite(ledPin, LOW);
delay(500); // 1/2 second delay
while(1) // Demonstration complete!
{
delay(500);
digitalWrite(ledPin, HIGH);
delay(500);
digitalWrite(ledPin, LOW);
}
}