Introduction: Emotion Shirt Using a Linkit One

About: I am a former English teacher turned Interactive Media Instructor turned STEM teacher turned computer science teacher. I like to make, fix, and take apart. Few things are more fun than taking something apart t…

My family loves the movie Inside Out. So I thought it would be great if I made a shirt that would show emotions. I decided the Linkit One would be perfect for this as it would give you wireless access to the controls

Step 1: Tools/Materials

Tools

  • Computer
  • USB cable
  • Soldering Iron
  • Wire Cutters
  • Needle
  • Scissors
  • Wire Strippers
  • Helping Hands

Materials

  • Linkit One
  • Battery for Linkit One
  • Wifi Cable for Linkit One
  • 3 - RGB LED (common anode)
  • 1 - Circular Circuit Board
  • 1- Breadboard
  • 1- Wires (Most of my wires were scavenged from old computers)
  • Solder
  • 1- Shirt
  • Thread
  • Extra Fabric
  • Super Glue
  • 1 - Half a small plastic sphere about the size of the circular circuit board (I got mine from a quarter machine)
  • Poly-fil
  • Two Part Putty Epoxy (Water Weld)

Step 2: Code

This code is designed to light up certain colors of the RGB LED. It is set up in such a way that you can activate the color that corresponds with the colors of the emotions in Inside Out.

<p>//#include <b64.h><br>#include <httpclient.h>
#include <ltask.h>
#include <lwifi.h>
#include <lwificlient.h>
#include <ldatetime.h>
#define WIFI_AP ""
#define WIFI_PASSWORD ""
#define WIFI_AUTH LWIFI_WPA  // choose from LWIFI_OPEN, LWIFI_WPA, or LWIFI_WEP.
#define per 50
#define per1 3
#define DEVICEID "" // Input your deviceId
#define DEVICEKEY "" // Input your deviceKey
#define SITE_URL "api.mediatek.com"</ldatetime.h></lwificlient.h></lwifi.h></ltask.h></httpclient.h></b64.h></p><p>LWiFiClient c;
unsigned int rtc;
unsigned int lrtc;
unsigned int rtc1;
unsigned int lrtc1;
char port[4]={0};
char connection_info[21]={0};
char ip[21]={0};             
int portnum;
int val = 0;
String tcpdata = String(DEVICEID) + "," + String(DEVICEKEY) + ",0";
String upload_led;
String tcpcmd_ledJoy_on = "LED_ControlJoy,1";
String tcpcmd_ledJoy_off = "LED_ControlJoy,0";</p><p>String tcpcmd_ledAnger_on = "LED_ControlAnger,1";
String tcpcmd_ledAnger_off = "LED_ControlAnger,0";</p><p>String tcpcmd_ledDisgust_on = "LED_ControlDisgust,1";
String tcpcmd_ledDisgust_off = "LED_ControlDisgust,0";</p><p>String tcpcmd_ledFear_on = "LED_ControlFear,1";
String tcpcmd_ledFear_off = "LED_ControlFear,0";</p><p>String tcpcmd_ledSad_on = "LED_ControlSad,1";
String tcpcmd_ledSad_off = "LED_ControlSad,0";</p><p>LWiFiClient c2;
HttpClient http(c2);</p><p>void setup()
{
  
  LTask.begin();
  LWiFi.begin();
  Serial.begin(115200);
  /*while(!Serial) delay(1000); /* comment out this line when Serial is not present, ie. run this demo without connect to PC */</p><p>  Serial.println("Connecting to AP");
  while (0 == LWiFi.connect(WIFI_AP, LWiFiLoginInfo(WIFI_AUTH, WIFI_PASSWORD)))
  {
    delay(1000);
  }
  
  Serial.println("calling connection");</p><p>  while (!c2.connect(SITE_URL, 80))
  {
    Serial.println("Re-Connecting to WebSite");
    delay(1000);
  }
  delay(100);</p><p>  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(2, OUTPUT);
  getconnectInfo();
  connectTCP();
}</p><p>void getconnectInfo(){
  //calling RESTful API to get TCP socket connection
  c2.print("GET /mcs/v2/devices/");
  c2.print(DEVICEID);
  c2.println("/connections.csv HTTP/1.1");
  c2.print("Host: ");
  c2.println(SITE_URL);
  c2.print("deviceKey: ");
  c2.println(DEVICEKEY);
  c2.println("Connection: close");
  c2.println();
  
  delay(500);</p><p>  int errorcount = 0;
  while (!c2.available())
  {
    Serial.println("waiting HTTP response: ");
    Serial.println(errorcount);
    errorcount += 1;
    if (errorcount > 10) {
      c2.stop();
      return;
    }
    delay(100);
  }
  int err = http.skipResponseHeaders();</p><p>  int bodyLen = http.contentLength();
  Serial.print("Content length is: ");
  Serial.println(bodyLen);
  Serial.println();
  char c;
  int ipcount = 0;
  int count = 0;
  int separater = 0;
  while (c2)
  {
    int v = c2.read();
    if (v != -1)
    {
      c = v;
      Serial.print(c);
      connection_info[ipcount]=c;
      if(c==',')
      separater=ipcount;
      ipcount++;    
    }
    else
    {
      Serial.println("no more content, disconnect");
      c2.stop();</p><p>    }
    
  }
  Serial.print("The connection info: ");
  Serial.println(connection_info);
  int i;
  for(i=0;i<separater;i++)  ="" {=""  ip[i]="connection_info[i];" }="" int="" j="0;" separater++;="" for(i="separater;i<21" &&="" j<5;i++)=""  port[j]="connection_info[i];"  j++;="" serial.println("the="" tcp="" socket="" connection="" instructions:");="" serial.print("ip:="" ");="" serial.println(ip);="" serial.print("port:="" serial.println(port);="" portnum="atoi" (port);="" serial.println(portnum);<="" p=""></separater;i++)></p><p>} //getconnectInfo</p><p>void uploadstatus(){
  //calling RESTful API to upload datapoint to MCS to report LED status
  Serial.println("calling connection");
  LWiFiClient c2;  </p><p>  while (!c2.connect(SITE_URL, 80))
  {
    Serial.println("Re-Connecting to WebSite");
    delay(1000);
  }
  delay(100);
  if(digitalRead(13)==1)
  upload_led = "LED_Display,,1";
  else
  upload_led = "LED_Display,,0";
  int thislength = upload_led.length();
  HttpClient http(c2);
  c2.print("POST /mcs/v2/devices/");
  c2.print(DEVICEID);
  c2.println("/datapoints.csv HTTP/1.1");
  c2.print("Host: ");
  c2.println(SITE_URL);
  c2.print("deviceKey: ");
  c2.println(DEVICEKEY);
  c2.print("Content-Length: ");
  c2.println(thislength);
  c2.println("Content-Type: text/csv");
  c2.println("Connection: close");
  c2.println();
  c2.println(upload_led);
  
  delay(500);</p><p>  int errorcount = 0;
  while (!c2.available())
  {
    Serial.print("waiting HTTP response: ");
    Serial.println(errorcount);
    errorcount += 1;
    if (errorcount > 10) {
      c2.stop();
      return;
    }
    delay(100);
  }
  int err = http.skipResponseHeaders();</p><p>  int bodyLen = http.contentLength();
  Serial.print("Content length is: ");
  Serial.println(bodyLen);
  Serial.println();
  while (c2)
  {
    int v = c2.read();
    if (v != -1)
    {
      Serial.print(char(v));
    }
    else
    {
      Serial.println("no more content, disconnect");
      c2.stop();</p><p>    }
    
  }
}</p><p>void connectTCP(){
  //establish TCP connection with TCP Server with designate IP and Port
  c.stop();
  Serial.println("Connecting to TCP");
  Serial.println(ip);
  Serial.println(portnum);
  while (0 == c.connect(ip, portnum))
  {
    Serial.println("Re-Connecting to TCP");    
    delay(1000);
  }  
  Serial.println("send TCP connect");
  c.println(tcpdata);
  c.println();
  Serial.println("waiting TCP response:");
} //connectTCP</p><p>void heartBeat(){
  Serial.println("send TCP heartBeat");
  c.println(tcpdata);
  c.println();
    
} //heartBeat</p><p>void loop()
//Red led 
{
  //Check for TCP socket command from MCS Server 
  String tcpcmd="";
  while (c.available())
   {
      int v = c.read();
      if (v != -1)
      {
        Serial.print((char)v);
        tcpcmd += (char)v;
        if (tcpcmd.substring(40).equals(tcpcmd_ledAnger_on)){
          digitalWrite(4, HIGH);
          digitalWrite(3, HIGH);
          digitalWrite(2, HIGH);
          Serial.print("Switch LED ON ");
          tcpcmd="";
        }
        else if(tcpcmd.substring(40).equals(tcpcmd_ledAnger_off)){  
          digitalWrite(4, LOW);
          digitalWrite(3, LOW);
          digitalWrite(2, LOW);
          Serial.print("Switch LED OFF");
          tcpcmd="";
        }
        else if(tcpcmd.substring(40).equals(tcpcmd_ledJoy_on)){
          digitalWrite(4, HIGH);
          digitalWrite(3, HIGH);
          digitalWrite(2, HIGH);
          digitalWrite(10, HIGH);
          digitalWrite(9, HIGH);
          digitalWrite(8, HIGH);
          digitalWrite(7, HIGH);
          digitalWrite(6, HIGH);
          digitalWrite(5, HIGH);
          Serial.print("Switch LED ON ");
          tcpcmd="";
        }
        else if(tcpcmd.substring(40).equals(tcpcmd_ledJoy_off)){  
          digitalWrite(4, LOW);
          digitalWrite(3, LOW);
          digitalWrite(2, LOW);
          digitalWrite(10, LOW);
          digitalWrite(9, LOW);
          digitalWrite(8, LOW);
          digitalWrite(7, LOW);
          digitalWrite(6, LOW);
          digitalWrite(5, LOW);
          Serial.print("Switch LED OFF");
          tcpcmd="";
        }
        else if(tcpcmd.substring(40).equals(tcpcmd_ledDisgust_on)){
          digitalWrite(10, HIGH);
          digitalWrite(9, HIGH);
          digitalWrite(8, HIGH);
          Serial.print("Switch LED ON ");
          tcpcmd="";
        }
        else if(tcpcmd.substring(40).equals(tcpcmd_ledDisgust_off)){  
          digitalWrite(10, LOW);
          digitalWrite(9, LOW);
          digitalWrite(8, LOW);
          Serial.print("Switch LED OFF");
          tcpcmd="";
        }
        
        else if(tcpcmd.substring(40).equals(tcpcmd_ledFear_on)){  
          digitalWrite(4, HIGH);
          digitalWrite(3, HIGH);
          digitalWrite(2, HIGH);
          digitalWrite(7, HIGH);
          digitalWrite(6, HIGH);
          digitalWrite(5, HIGH);
          Serial.print("Switch LED ON");
          tcpcmd="";
        }
        
        else if(tcpcmd.substring(40).equals(tcpcmd_ledFear_off)){  
          digitalWrite(4, LOW);
          digitalWrite(3, LOW);
          digitalWrite(2, LOW);
          digitalWrite(7, LOW);
          digitalWrite(6, LOW);
          digitalWrite(5, LOW);
          Serial.print("Switch LED OFF");
          tcpcmd="";
        }</p><p>        
        else if(tcpcmd.substring(40).equals(tcpcmd_ledSad_on)){  
          digitalWrite(7, HIGH);
          digitalWrite(6, HIGH);
          digitalWrite(5, HIGH);
          Serial.print("Switch LED ON");
          tcpcmd="";
        }
        
        else if(tcpcmd.substring(40).equals(tcpcmd_ledSad_off)){  
          digitalWrite(7, LOW);
          digitalWrite(6, LOW);
          digitalWrite(5, LOW);
          Serial.print("Switch LED OFF");
          tcpcmd="";
        }
      }
   }</p><p>  LDateTime.getRtc(&rtc);
  if ((rtc - lrtc) >= per) {
    heartBeat();
    lrtc = rtc;
  }
  //Check for report datapoint status interval
  LDateTime.getRtc(&rtc1);
  if ((rtc1 - lrtc1) >= per1) {
    uploadstatus();
    lrtc1 = rtc1;
  }
  
}</p>

Step 3: Testing

After working out my code I needed to test it. I set up three LEDs on my breadboard and wired them to the Linkit One. I wired the red leads of the three LEDs into digital pins 2, 3, and 4. I wired the blue leads of the three LEDs into digital pins 5, 6, and 7. I wired the green leads of the three LEDs into digital pins 8, 9, and 10. Then I wired in the ground from the LEDs to the ground of the board.

Step 4: Making the Light

I bent the ground lead on the RGB LEDs out. I placed the three LEDs in the circle so that the ground leads are near each other. I soldered these three together with the wire for the ground. I trimmed the leads of the LEDs as I soldered wires to them. I soldered the wires to the other leads of the LEDs. I used the left over leads that I cut and soldered them to the other end of the wire to help them fit into the ports of the Linkit One. I used heat shrink tubing to keep the wires together and to protect from shorts. Then I put the wires in the Linkit One in the same pins as I did for the testing step. I used water weld to hold the wires in place. Then I put a small amount of Poly-fil around the LEDs. This helps diffuse the light. Then I put half a small plastic sphere from a cheap plastic toy over the Poly-fil and lights. This gives it a nice rounded look and helps it resemble the memories from the movie Inside Out. I used super glue to hold the plastic onto the lights.

Step 5: Making the Shirt

I selected a shirt with a pocket to hide the cut I made for the wiring of the light. I cut a small hole behind the fabric of the pocket where the light would fit through. Then I cut a square of fabric that would act as a pocket inside the shirt for the Linkit One. I folded the edges of the fabric over and used a simple stitch to attach it to the bottom of the shirt on the same side as the light.

Step 6: Putting It All Together

I put the light in the pocket and then connected it to Linkit One. I made sure the battery and wifi antenna were connected. I switched the Linkit One to battery.

Epilog Contest VII

Participated in the
Epilog Contest VII

Wearable Tech Contest

Participated in the
Wearable Tech Contest

Make It Glow! Contest

Participated in the
Make It Glow! Contest