Ambient Apparels - Tees Which Love Talking
by Ashtam55 in Circuits > LEDs
2203 Views, 19 Favorites, 0 Comments
Ambient Apparels - Tees Which Love Talking
Hello Everyone,
Ever wondered about sharing your thoughts with others who you cross path your path?
The idea came to our mind when we were roaming on busy streets of Delhi. The capital city of India. Millions of people cross paths of each other everyday yet no one exchanges their thoughts or ideas which take place in their minds, quite weird?
We thought how about making "Ideas" (Thought) a part of something we use in our daily life. And we weren't able to find anything better than a "T-shirt."
After iterating a lot and making random prototyping, we came up with "Ambient Apparels", T-shirts that can display your thoughts. All you have to do is a couple of clicks on your smartphone.
Prerequisites:
Things to remember before starting this instructable:
- You should know how to use Arduino IDE or you can refer from google.
- Basic knowledge of C/C++.
- A laptop or Personal Computer.
Collecting Things:
Things that you need to make this instructable are as follows:
- A white T-shirt (Plain).
You can buy it from any shopping website. - Neopixel LED strip; we are making a LED panel which consists of 64 LEDs, so buy accordingly.
You can buy it from www.aliexpress.com but check other websites, too. - Wemos D1 mini.
You can buy it from www.ebay.com - Some thin wires.
- Transparent tape.
- Soldering Iron.
And some patience and enthusiasm for doing things correctly.
I bought all these stuff from a nearby shop but if you're having a problem in buying, just let me know in comment section.
What Is "NEOPIXEL"?
Neopixel or addressable LEDs are those LEDs which can be individually set to a particular color via controller like Arduino, webmos, etc. These are different from standard RGB LEDs as Neopixel can generate much more color than RGB LEDs. Neopixel can be operated on 5V whereas RGB LEDs need a 12V power supply. Neopixel has only three pin GND, VCC, & DIN.
Some examples of addressable LEDs are WS2801, SK6812, LPD8806, HL1606, etc.
Making of Neomatrix Panel:
The first thing we need to do is to make a LED matrix or panel of size 8 pixels x 8 pixels.
- Cut the strip into 8 parts. Each part contains 8 LEDs and lay them on a piece of a clothing(like a handkerchief). I also put a black tape on the backside of the panel to make the wires disappears.
Do remember while laying the strips, see the arrows on them. Every strip's arrow should face the same direction as data coming from Din Pin moves forward according to the direction of the arrow. See the image to understand better.
Soldering:
In this step, we need to connect all LED strips.
Connect GND and VCC pin of every strip to a wire in series connection and connect DOUT pin of the last LED of the first strip to the DIN pin of first LED of the second strip and continue until all the strips are connected together.
If all goes well then, CONGRATULATIONS you just made your Neopixel panel as this is the most time taking part of this project (for you :P, as writing and checking code is also a tough task).
Last Part
Now we have to place the panel on the Tshirt.
- Stitch on side of "Velcro" on all four side of the led panel.
- Now stitch another side of "Velcro" on the t-shirt making a square box same size as that of the led panel.
- Ta-Da you can now simply stick the led panel on your t-shirt.
Let Start the Software Part:
Let first understand how this whole project works.
When the user wears the T-shirt, plug on the portable power bank and give the supply to the Wemos D1 mini.
Then a Wi-Fi Hotspot comes up on your mobile phones after connecting to which you need to open your browser and go to the IP address that is specified by you while coding in my case it is 192.168.4.1, a Webpage will load up and you just need to enter your text you want to display on the Neomatrix panel.
But the process inside the hardware occurs when you send the text. It gets stored in the EEPROM of the Wemos D1, and we need to extract that piece of text and save it as string type. Then, we have to print that string on Neomatrix (Panel).
Code:
<p>© Rahul Agarwal & Ashtam Singh 2017, All Rights ReservedThis work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/4.0
//Including libraries<br>#include <><esp8266wifi.h> #include <esp8266webserver.h> #include <esp8266httpclient.h> #include <spi.h> #include <eeprom.h> #include <wifiudp.h> #include <dnsserver.h> #include <esp8266mdns.h> #include <eeprom.h></eeprom.h></esp8266mdns.h></dnsserver.h></wifiudp.h></eeprom.h></spi.h></esp8266httpclient.h></esp8266webserver.h></esp8266wifi.h></p><p>//Initialization #define USE_SERIAL Serial #include <adafruit_gfx.h> #include <adafruit_neomatrix.h> #include <adafruit_neopixel.h> #ifndef PSTR #define PSTR </adafruit_neopixel.h></adafruit_neomatrix.h></adafruit_gfx.h></p><p>#define PIN 5 //Your matrix pin which is connected to board</p><p>Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(8, 8, PIN, // This is the initialization of matrix that what is the NEO_MATRIX_BOTTOM + NEO_MATRIX_LEFT + // height and width of the panel and from which end the NEO_MATRIX_ROWS + NEO_MATRIX_PROGRESSIVE, // data is coming. NEO_GRB + NEO_KHZ800);</p><p>const uint16_t colors[] = { matrix.Color(255, 0, 0), matrix.Color(0, 255, 0), matrix.Color(0, 0, 255) };</p><p>String wi_deviceId = "";</p><p>byte data[24]; int code_version = 1;</p><p>WiFiClient wifiClient;</p><p>ESP8266WebServer server(80);</p><p>int status = WL_IDLE_STATUS;</p><p>String ssid = ""; String txt = "";</p><p>boolean ap_flag = 0; boolean init_flag = 1; boolean retAp = 0; boolean extra = 0;</p><p>int inpin = 12;</p><p>char MACAddress[12];</p><p>// DNS server const byte DNS_PORT = 53; DNSServer serverDNS; /* Soft Access Point network parameters */ IPAddress apIP(192, 168, 4, 1); IPAddress gateway(192, 168, 1, 0); IPAddress netMsk(255, 255, 255, 0);</p><p>// hostname for mDNS. Try http://logger_one_wire.local const char *myHostname = "wificonfig";</p><p>// cycle time in loop() unsigned long cycleTime = 120000; // ms const unsigned long sec24h = 24 * 3600; // one day in seconds unsigned long convTime = millis(); // conversion time about 1000 ms boolean startSync = false;</p><p>unsigned long timeStart; unsigned long timeRel;</p><p>//Function declaration void initialize_sensors(); void init_wifi(); void initApMode(); void send_Data();</p><p>// from handleHttp.ino /** Handle root or redirect to captive portal */ void handleRoot();</p><p>/** Handle the Text save form and redirect to WLAN config page again */ void handleTextSave();</p><p>/** Redirect to captive portal if we got a request for another domain. Return true in that case so the page handler do not try to handle the request again. */ boolean captivePortal();</p><p>// from tools.ino /** Is this an IP? */ boolean isIp(String str);</p><p>/** IP to String? */ String toStringIp(IPAddress ip);</p><p>//Setup begin void setup() {</p><p> ESP.eraseConfig();</p><p> matrix.begin(); matrix.setTextWrap(false); matrix.setBrightness(50); matrix.setTextColor(colors[0]);</p><p> //USE_SERIAL.begin(115200); Serial.begin(9600); delay(10);</p><p> EEPROM.begin(512);</p><p> uint8_t MAC_array[6];</p><p> WiFi.macAddress(MAC_array); //Accuring MAC id for ESP module for (int i = 0; i < sizeof(MAC_array); ++i) { sprintf(MACAddress, "%s%02x", MACAddress, MAC_array[i]); }</p><p> String address = String(MACAddress); wi_deviceId = "WifiConfig_" + address.substring(7, 12); //Unique device ID</p><p> // Setup MDNS responder if (!MDNS.begin("wificonfig")) { Serial.println("Error setting up MDNS responder!"); } else { Serial.println("mDNS responder started"); // Add service to MDNS-SD MDNS.addService("http", "tcp", 80); }</p><p> // Setup the DNS server redirecting all the domains to the apIP serverDNS.setErrorReplyCode(DNSReplyCode::NoError); serverDNS.start(DNS_PORT, "*", apIP);</p><p>}</p><p>int x = matrix.width(); int pass = 0;</p><p>void loop() {</p><p> if (init_flag) { initialize_sensors(); //Initializing sensors</p><p> timeStart = millis(); timeRel = millis() + cycleTime; // avoid unsigned long rollover after 40 days</p><p> init_flag = 0; }</p><p> boolean val = digitalRead(inpin); //Manually getting into AP mode</p><p> if (val == 0) { extra = 1; init_flag = 1; for (int i = 0; i < 13; ++i) { //192 EEPROM.write(i, 0); } EEPROM.commit(); }</p><p> // DNS serverDNS.processNextRequest(); // HTTP server.handleClient(); txtEEP(); }</p><p>void init_wifi(void) { Serial.println("Init Wifi"); // We start by connecting to a WiFi network WiFi.setAutoConnect(1);</p><p> if (WiFi.status() != WL_CONNECTED) { WiFi.disconnect();</p><p> if (WiFi.getMode() != WIFI_STA) { WiFi.mode(WIFI_STA); }</p><p> unsigned long startTime = millis(); while (WiFi.status() != WL_CONNECTED && millis() - startTime < 10000) { delay(500); Serial.print("."); } Serial.println(""); }</p><p> if (WiFi.status() == WL_CONNECTED) { Serial.println("Wifi Connected"); for (int j = 0 ; j <= 8 ; j++) { // LED colour blinks 8 times --> BLUE ..Indicating successfull connection with wifi delay(300); //Led Color if needed delay(300); }</p><p> } else { ap_flag = 1; init_flag = 1; retAp = 0; //Led Color if needed }</p><p>}</p><p>/********************************/ /* Function EEPROM */ /********************************/ void txtEEP() { String stip; for (int i = 0; i < 13; ++i) { stip += char(EEPROM.read(i)); } Serial.print("EEPROM: "); Serial.println(stip); int len = stip.length(); int pixelPerChar = 6; int maxDisplacement = len * pixelPerChar + matrix.width(); matrix.fillScreen(0); matrix.setCursor(x, 0); matrix.print(stip); if (--x < -maxDisplacement) { x = matrix.width(); if (++pass >= 3) pass = 0; matrix.setTextColor(colors[pass]); } matrix.show(); delay(50); }</p><p>/********************************/ /* Initilize Wi-Fi to AP Mode */ /********************************/ void initApMode() { //Led Color if needed WiFi.disconnect(); server.on("/", handleRoot); server.on("/textsave", handleTextSave); Serial.println(""); Serial.println("WiFi connect failed, try Access Point mode for configuration"); Serial.print("Configuring as access point, SSID: "); Serial.println(wi_deviceId); /* You can remove the password parameter if you want the AP to be open. */ WiFi.mode(WIFI_AP); // Access Point & Station mode delay(10); WiFi.softAPConfig(apIP, gateway, netMsk); WiFi.softAP(wi_deviceId.c_str()); WiFi.begin(); // for test delay(500); // Without delay I've seen the IP address blank Serial.print("AP IP address: "); Serial.println(WiFi.softAPIP()); delay(1000);</p><p> server.begin(); // Web server start</p><p> retAp = 0; delay(1000); }</p><p>/********************************/ /* Initialize Sensors */ /********************************/ void initialize_sensors(void) { Serial.println("Initializing Sensor : "); delay(5000); // Check wifi status to start AP Mode if (!WiFi.isConnected() && retAp == 0) { ap_flag = 1; } else { ap_flag = 0; }</p><p> if (extra) { ap_flag = 1; extra = 0; }</p><p> if (ap_flag == 1) { initApMode(); } else { init_wifi(); }</p><p>}</p><p>/** Handle root or redirect to captive portal */ void handleRoot() { if (captivePortal()) { // If caprive portal redirect instead of displaying the page. return; }</p><p> server.sendContent( "" " " " " " </p><p>" " " "</p><p>"</p> " " "<div relative;="" width:auto\"="">" " <img src="\"data:image/png;base64,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\"" position:relative;="" margin-left:="" auto;"="" ="" "margin-right:="" auto;display:="" block;\"="" style="width: 26px;">" "<div id="\"header\"" -webkit-box-shadow:="" 0="" 3px="" 6px="" rgba(0,0,0,0.33);opacity:0.9;="" background-color:="" #16a085;="" height:="" 8%;="" padding-top:="" 0.1%="" \"="">" "<h1 ;text-align:center;="" background-color:="" #16a085;="" font-size:="" 200%="" ;="" \"=""><strong> Text Setup</strong></h1>" ); server.sendContent( "</div> " "<div id="\"content\"">" ); if (server.client().localIP() == apIP) { // server.sendContent(String("<p center;="" font-size:large\"=""> You are connected through soft AP :</p>" // "<div center\"=""><span x-small="">") + wi_deviceId + "</span></div> "); server.sendContent(String(" <p center;="" font-size:="" medium\"=""> You are connected through soft AP: </p><p center;="" font-size:="" large\"="">") + wi_deviceId + "</p><p>"); } else { server.sendContent(String(" </p><p center;="" font-size:large\"=""> You are connected through soft AP:</p>" "<div center\"="">") + ssid + "</div> "); } server.sendContent( "<div>" "<form method="POST" action="textsave">" "<div id="\"list\"" align="\"center\"">" "<h2>Ambient Apparel</h2>" "<div id="\"right\"" align="\"center\"">" "" "<div class="\"row\""><h2> Send Text to: </h2>" "<input name="txt" id="\"show\"" style="\"display:inline-block;vertical-align:top;" padding:4%="" 3%="" 4%="" 3%;\"="" type="\"text\"" placeholder="\"Text\"" required=""><br>" "</div> " "<br>" "<div>" "<input type="\"submit\"style=\"position:relative;" background-color:="" #16a085;="" color:="" white;"="" ="" "="" padding:="" 0.4em="" 1em;="" text-align:center;="" display:="" inline-block;="" cursor:="" pointer;font-size:="" 25px;\"="" value="\"Send\"">" "</div> " "<p>"</p><p> "</p></div><p>" "</p></div></form><p>"</p><p> "</p><p>" "</p><p>" );</p><p> server.client().stop(); // Stop is needed because we sent no content length }</p><p>/** Handle the WLAN save form and redirect to WLAN config page again */ void handleTextSave() { server.sendContent( "" " " " " " </p><p>" " " "</p><p>"</p> " " "<div relative;="" width:auto\"="">" " <img src="\"data:image/png;base64,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\"" position:relative;="" margin-left:="" auto;"="" ="" "margin-right:="" auto;display:="" block;\"="">" "<div id="\"header\"" -webkit-box-shadow:="" 0="" 3px="" 6px="" rgba(0,0,0,0.33);opacity:0.9;="" background-color:="" #16a085;="" height:="" 8%;="" padding-top:="" 0.1%="" \"="">" "<h1 ;text-align:center;="" background-color:="" #16a085;="" font-size:="" 200%="" ;="" \"=""><strong> WiFi Setup</strong></h1>" "<p color:#fff\"=""> Wait for text to get changed... </p>" "</div> " "<br>" "<div margin:0="" auto;="" text-align:="" center;\"="">" "<a href="/" align="\"center\"">" "<button type="\"submit\"" background-color:="" #16a085;="" color:="" white;"="" ="" "padding:="" 0.4em="" 1em;="" text-align:center;="" display:="" inline-block;="" cursor:="" pointer;font-size:="" 25px;\"="" value="">" "Send Text Again" "</button>" "</a>" "</div> " ); txt = server.arg("txt"); Serial.print("txt : "); Serial.println(txt); String stip = txt; if (stip.length() > 0 ) { for (int i = 0; i < 13; ++i) { EEPROM.write(i, 0); //clearing } EEPROM.commit();<p> for (int i = 0; i < 13 ; ++i) { EEPROM.write(i, stip[i]); } EEPROM.commit(); } server.sendHeader("Location", "wifi", true); server.sendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); server.sendHeader("Pragma", "no-cache"); server.sendHeader("Expires", "-1"); delay(5000); server.client().stop(); // Stop is needed because we sent no content length</p><p>}</p><p>/** Redirect to captive portal if we got a request for another domain. Return true in that case so the page handler do not try to handle the request again. */ boolean captivePortal() { if (!isIp(server.hostHeader()) && server.hostHeader() != (String(myHostname) + ".local")) { Serial.println("Request redirected to captive portal"); server.sendHeader("Location", String("http://") + toStringIp(server.client().localIP()), true); server.send ( 302, "text/plain", ""); // Empty content inhibits Content-length header so we have to close the socket ourselves. server.client().stop(); // Stop is needed because we sent no content length return true; } return false; }</p><p>/** Is this an IP? */ boolean isIp(String str) { for (int i = 0; i < str.length(); i++) { int c = str.charAt(i); if (c != '.' && (c < '0' || c > '9')) { return false; } } return true; }</p><p>/** IP to String? */ String toStringIp(IPAddress ip) { String res = ""; for (int i = 0; i < 3; i++) { res += String((ip >> (8 * i)) & 0xFF) + "."; } res += String(((ip >> 8 * 3)) & 0xFF); return res; }</p></div></div></div></div>
Conclusion:
Hope through this idea we can unmute these cosmo-metropolitan cities and also, it is well said: "Power is gained by sharing knowledge, not holding it".