Ambient Apparels
Tees Which Love Talking
Story
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 hide and Insulate panel.
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).
Code
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).
| #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> //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> #define PIN 5 //Your matrix pin which is connected to board 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); const uint16_t colors[] = { | |
| matrix.Color(255, 0, 0), matrix.Color(0, 255, 0), matrix.Color(0, 0, 255) | |
| }; String wi_deviceId = ""; byte data[24]; | |
| int code_version = 1; WiFiClient wifiClient; ESP8266WebServer server(80); int status = WL_IDLE_STATUS; String ssid = ""; | |
| String txt = ""; boolean ap_flag = 0; | |
| boolean init_flag = 1; | |
| boolean retAp = 0; | |
| boolean extra = 0; int inpin = 12; char MACAddress[12]; // 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); // hostname for mDNS. Try http://logger_one_wire.local | |
| const char *myHostname = "wificonfig"; // 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; unsigned long timeStart; | |
| unsigned long timeRel; //Function declaration | |
| void initialize_sensors(); | |
| void init_wifi(); | |
| void initApMode(); | |
| void send_Data(); // from handleHttp.ino | |
| /** Handle root or redirect to captive portal */ | |
| void handleRoot(); /** Handle the Text save form and redirect to WLAN config page again */ | |
| void handleTextSave(); /** 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(); // from tools.ino | |
| /** Is this an IP? */ | |
| boolean isIp(String str); /** IP to String? */ | |
| String toStringIp(IPAddress ip); //Setup begin | |
| void setup() { ESP.eraseConfig(); matrix.begin(); | |
| matrix.setTextWrap(false); | |
| matrix.setBrightness(50); | |
| matrix.setTextColor(colors[0]); //USE_SERIAL.begin(115200); | |
| Serial.begin(9600); | |
| delay(10); EEPROM.begin(512); uint8_t MAC_array[6]; 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]); | |
| } String address = String(MACAddress); | |
| wi_deviceId = "WifiConfig_" + address.substring(7, 12); //Unique device ID // 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); | |
| } // Setup the DNS server redirecting all the domains to the apIP | |
| serverDNS.setErrorReplyCode(DNSReplyCode::NoError); | |
| serverDNS.start(DNS_PORT, "*", apIP); } int x = matrix.width(); | |
| int pass = 0; void loop() { if (init_flag) | |
| { | |
| initialize_sensors(); //Initializing sensors timeStart = millis(); | |
| timeRel = millis() + cycleTime; // avoid unsigned long rollover after 40 days init_flag = 0; | |
| } boolean val = digitalRead(inpin); //Manually getting into AP mode if (val == 0) { | |
| extra = 1; | |
| init_flag = 1; | |
| for (int i = 0; i < 13; ++i) { //192 | |
| EEPROM.write(i, 0); | |
| } | |
| EEPROM.commit(); | |
| } // DNS | |
| serverDNS.processNextRequest(); | |
| // HTTP | |
| server.handleClient(); | |
| txtEEP(); | |
| } void init_wifi(void) | |
| { | |
| Serial.println("Init Wifi"); | |
| // We start by connecting to a WiFi network | |
| WiFi.setAutoConnect(1); if (WiFi.status() != WL_CONNECTED) | |
| { | |
| WiFi.disconnect(); if (WiFi.getMode() != WIFI_STA) { | |
| WiFi.mode(WIFI_STA); | |
| } unsigned long startTime = millis(); | |
| while (WiFi.status() != WL_CONNECTED && millis() - startTime < 10000) { | |
| delay(500); | |
| Serial.print("."); | |
| } | |
| Serial.println(""); | |
| } 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); | |
| } } | |
| else | |
| { | |
| ap_flag = 1; | |
| init_flag = 1; | |
| retAp = 0; | |
| //Led Color if needed | |
| } } /********************************/ | |
| /* 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); | |
| } /********************************/ | |
| /* 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); server.begin(); // Web server start retAp = 0; | |
| delay(1000); | |
| } /********************************/ | |
| /* 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; | |
| } if (extra) | |
| { | |
| ap_flag = 1; | |
| extra = 0; | |
| } if (ap_flag == 1) | |
| { | |
| initApMode(); | |
| } | |
| else | |
| { | |
| init_wifi(); | |
| } } /** Handle root or redirect to captive portal */ | |
| void handleRoot() { | |
| if (captivePortal()) { // If caprive portal redirect instead of displaying the page. | |
| return; | |
| } server.sendContent( | |
| "" | |
| " | |
| " | |
| " | |
| " | |
| " | |
| " | |
| " | |
| " | |
| " "</p> | |
| " | |
| " | |
| "<div relative;="" width:auto\"="">" | |
| " <img src="\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEsAAABOCAYAAABog+tZAAAVVUlEQVR4Ae2YCVhV17n+92HQRmUeDgMIiKIZrBm0sWqa/mvyT5MYa7RN0mh7o1bBWZmRgcMMMg8qg4CAggwqoOIgahxwMKIoDuKs15g01d42Nx0C55zvvt969n7uec4DXsXb2+NTD8/vWXvvc1h7r3e/37e+taR/2c+zz7PPs8/QoZ795V9PHG/voZKv7zDBsGE+z9zTm0heXkOl937+ljTE2kpycHSUXF1dJQ8PD5Wnp4cZMGfwO2PMgKofLnu6wwxicGsG0Sx8vL0tRozwNZ84caxqwoTXpHHjxjysDxUwE8deTy6aqQtl7u3tZQYkZvBga2n06BekF18cLdnaOvzADR8PD7dRHh7ur0LQ1/F7Zix4AbhD3IFACM149stlpi+UGTN4sL00bdoESe3i8hzOx0GwxaAQtIJz4Bq4C0G+AQ+8vDwf4Hd/APfAVXARJIGBcr+Wbm6ukp/fCMWtzFMtlMhFfsOHIR95joUImUjsV4AWEMQhbnEdKOeMwTFQvkd/TAX65D/h1qc6jxkK5YUWgxyM41Vo/y4Lox86VAxcB7QyOgP0hsBhYKiOBYZwOm+Ihn5vQ7CpfiP90L+XOb8QY8GeOlc5uqi5XS+7ptvbx7uHByy7pD+w2D2AwPc4jxw2zA850FtlPFs+Ta4ylxPwr5QB+gzz0XspIYVWdld/0QJZNM8ClB7Pubq6S0+NYAZlAWMht5sQMuyqHiX3+Ph4i7a/7pJdKsIYeVArh2uA0X0VTD9XYUBmqMr5+Kg8OK1oIZQy4CcMRRad+2XB+FoLsJXvb9L5S67MvSS12kkiIgm1koW7uxtfbxzq6aGEDSmCCZcBXHsiuB8Utnr5fAdcPASt6Yejh6e7wMVFrWLBrK2GDEFYHoIonFd0iljc4voTC6X0Izu3R75WBoxLCtOcBeEm1avjxprhMlfrFSNHjSQkdq2nhwf5QLRhPgreojXGh/EWQIDHClM90IHvwQdK/sIzmGYYyotkc66qPT3cZ0MkGu7nx4ldzw6wc3QiW3tHsnVwIjtgj3MHJ2cZNTk6q8nJ2YWc1S7k4upK7h7uxDUVC2foyofQLbfreKIBirtMsrZS8ZuESA540JtI8DTUZ5hu0riXqTk/gtKDZ9OKzz6kub96l379wc9o+js/oQ8mT6Cfv/k6vT1pHP30x6/RpB+9TK+/8hL98MWRNNzXh5zUagEL5SG7U4Qdt8YCyqUE2OHs7DTwhRef59WDylTDUHmTi9hJEEtnD9f8Ztpb9MdD5XR3bxF92VpEd/cU0u1da+nmztV0fUcBXdueT1ea8+hyUy5d3JpN5xoy6YuaNDpYnkCb0oOEmI4QbJTfcHJxcxPC+OJFuLu7E5Y8BnnQU8si+vr6XHJxcXZzdLSD08XMaHrlgoFYrYBdoOXQSwv6TAh0pj6DxQA5dKkxly415QiBLjfnUhcDwa5sy6Or2/IhYAHdgJBfQmAWMiN4DpUlLKE3Xn+FHcdlA9w3ivxGDBPhyi7jnMXCYTPxJrZw8Ocheft4cQljsq4aDu4ApWiknWuj4aQ1dAFCsTiXmEaFnD65CC5syRYi3oET7+xeS8c3pFD1qkB6/2c/pp9AuNyIeXKYKlW9aLuwOvBAq+ybmZxYFnL7HuAFs85J7aJ/c/yrSoj1GxaXhYYj0Vc+/X7/OjpamSzy2/7SOPrZxNcwMajZyd1YI3I4NkyYMNoMyx8ujlWmGIaWcjsHIF9591jbOVDE/I84lBRXPTHstnObM+leazHVZQRj4lhJoXN/SVa2DhyePcNH+HLtFYh8Jp5pJHYlTFmsQJ7uUcF3c7u3OBaJXISgHF79Fgl9MNkiNDs3Z1FXUx7dQniujQ7gskSPF6QfMdz3rxDqHS5fhnoKt5u0WKFcXOLhu6e9PYluQajzW7IQQiL3sGA4z2Y4rP5HkRRxeMZkh369r0SE4TcH1on++EW0rIniskLkKyT082ontRU/GwphM1MXaxmLZWPv2L1o5gf073vWcpnAA+VZDueFGGgpn7MALAQL2KebbmFi+ObzUjpbn0kb01ZQdthcil30KcUtnkknqlPpHvo5VpVMLz3v1+Pi5kq4d7mP91Alh5pW9Y5lC6OIxXXNZyyWrYOjNmTODPrj4XIxe019ayKNf200kvFYCvxsOtWsCqKzqKe+3l/CtZaxYHzOdZhI4HNmvEPPjxxOL44aIf7/vf83XhSuPBu2VSZxmSGSPSYU7SujR/0ciV5U71a29hLKCglCm95s6IUWeepdPOzfbOwc9AlLZ+nP1GWQ/yfvU2boXCqI9KfA2dNp8qSxhD15emHkCPoFQvVgWTwEWw2BRK3FoSdKDRb55dHP08ypk6kieRl1oE7j8oFd+RXCsS4zhPJWzueyQjft7Yk0xNbuBN3bZ0Ety8SzfTzlp6blLDcPD4GLq5u55cDnJHsHR1/si99xwFSeuOw3ujsIOw69vxyvom+PVtJ3xyrpwcEyIcjWnHBKR7F5pCKJ3cRJm/Mbt+wqUcmzQH9qq6CvWoshaD6XEXLoZiN/FbNQ9G1bhW7BzKmEG5/87nil3+ypk81Ie1Lamhsu4XcS+jYNsVrXxQkwMDMikuh+q2eo/8ybrp4+qLpn67gyb8oLFy4pT1xKFUnLCIOgA+s0dHJjEl3F97daCuCUYgbJWyRw5Kh02rU2Svy2RLOAijWLqTBuKRWhLYlfIo5TguZQzMJPSYP89ePxP9KXJi3X39m15j7CezLyHYTKMYdQpiPW9ZYCAcLDnM7WSt8eKX8ezvhy0vhxNO6V0fqk4HlUnBJG1XlxVJ2roTWJYRTs/28Uucyf1qXHUE70Egqd/wny2IcI0wBaBafN+eW7NO+TqVSZGUV7N+RQ5/EDlJGaTB/P+JDKCgvo5O4G6theSp27KtFvPI17dQz99sP/T0254d3Xkb/g2mAIJQHLv16rMR2xEBISHk46U5dulhM9V6rPDnG4u7uoqyYtkF4dM1rXta+a/ny2hb46Vk9dR7ZT+6l2en/KVAoKCqb/vH+P7hxvopsHN9HiOb/GMsULs9wsGoYqPEcTSLor++jmoTr67u5lqihZQ9OnvkctzY10s6ONru2rogftzXRlfzXFL/sMQoXRhpTl3TdbEL51GYs7NqVLnXWZllETppuOWIrN4S7ViaoU8z8dWC9dbsw9eBF5JWDmL7RnW9bTl0cb6AYEuX6wli4c2Exbi9PocAN2Hto207UD1fRd507KjwuirNA5RBe3UDVKhCD/WXT/VDPd+LyGrrdW0K2DaA/U0JW9lXRj/wa6fbiO7oAzO8pFOJ7YmEz7SjTaq1gOnW/Img2kC5uzLWWHmY5Yp6vTpTM1eJMNWRbXmvOl85uzV3dhZsuJ8Nd27CiDqzbT9c830a1DtXQbg/7DF4301fEtdBNCsIj3cOw/60MskpPpKsKI66/QeR9R+7ZS4Z4bEJn/lwVibh2uF//3547tdGxLEYcuZshCPQpd3cUtOX/HbsYUTAQsksWlrRALmMznbG2m4FxdlsWZ2gzpVHX6XA4HVNa6ppJU+lNHC319fCvdg2h34TIe+J0jdeK4p6uVKrJiKOCTKaIkQHLGvlch1WIfa9ncX9OXx7bQH0410Tcnm+jrk430zRdNDATeKpwaDAc2ZIXwjKvrqE0nuOlu17Z8vyvb89nhppXg8SCctxi2vVkHRANjUDN9zzNhIWavutXxdLKxmC7sqUKOqaFrcBlyDRJ0BdWuTqTfzngXs2MsXRPFaS4vg0TVz9sv4QGzaEN2NLHoO8vTqRltPforTQ1Drpot9rhu4MXgf7TIUQQX7TlVlSZ11meZXd2epzIpsfiDDTtB17Y81e3WNdLvj5Q8B/FuXNqaiyVOnn7/Og1KgAiqy46ghtxIalwdQ1sLomlDWjCVogw4vWkVXUJ9hbAxXOqIwrS9JpVasRjfXRhNe4piuEVuiqW2ikS6jN/c3VOkVPw6bru25c7Ec0iXm03KVb0n+nP1mSq6UKvCwzfLi+cefvNA3j7OVcC1ArqF612i0Mzi3ypiidx1BWvJi7jO5QCvERHaKFaB3B9ekLL1I4QCt+FMW+QtCa0KblOeyzTF4jeKt8vtLMAVdw+HlqAJyFzmZQ0q9TOb0qgTVXpnQ6a8K8FC5QtHHS2Po466dOqoXUXnN2fif4SDDFHE1crtciABMxN1lZFgeKOdVVkSQnAgzlcZDEQvt0IUsScl78mzKAcKI8XxZdllrasj6FBJDOci/j0LZuw+wz4fgE+BBZAUTD4MZVTAUj6uM3r77AgMPk0cGwqo7G+xizgMkfDl79iNOexC5ffGjtor32sAUD0VrjJCESvMcGAsyrn6dBZEcQm3CoahZbizKv9fhvJ/xmKlGt0TPF2CKXljAugBpHAWeYiFQC3E51xxi5yFEKZrSNx8nV3G7TU5kSNfcRgai6WX+35duWc/hDIphw0ApwABHQYKYTLEwI8WJlBT7DKqC11AtSELaHPkYmrNDKeWpCCqD19I2xMDqa1QQx016fjfPAj139vTBq5q+AKlgsmFXz8EM5fbjwGBHuQfPQpHTPlZ1FGdRQezk6h1VQztTIqg7XEh1BQTSI1RK3AcSruSV9K+9Dg6tV7kKhbK0FE8q/6lszFn/Hms/S6gWm/fkiWd7XtpY/qJvgtgMBwemxTBRCtKBCT1+gI6XZ4P8hSovTyX2svy6Ex5AV1sQL21Q4SrId2ArjXnpO6uTpW2Vada0sn1UnyxRnLTLBU8VZ8LEIvB2ze72SiKRA8cn5VDSCcLhuMc6qzNodPrMdtVgMpcHAMcd27iZG+0Nw+w9uu5iFDOyA2rx60siC6r3MMDVD+Y/gvJuSBacl6f9Mj8Uz/iAUoTBKs2pkoZG1KkvJo0C9pVIN3dkvkmQpDzllHZwIgw43zG+1FyTWXoJoNZkZdGVfFa/7QgkoLmlUlvTJFGZYSZO5bEmTlXpqicyxNVeA7GdIUzvDEeWHIpS5BcyxLNX0pZYT4xZoE0JmphzK4yDV1tMhJMBoUqEEmckcsGmUZRnIrrbShiOys0FJgZrFUFzyen8AXhg0L9JduwAHP5/ipgBiyApdyai2sPF/GfIBRwKkuU1FUpFvzdS6c3WlvlRmrcVi782/aiSGqviNd3ogTgtR+7x1AUFqQ3IRF6xBuKJyri6eC6GDpfEUepuWE6yxB/sg0NeGCfuGK6a2OOq2OhxhH3H2QoSi/PZy4LaPZ/LlwfN7NQb0iVnMsSJqg3pJywTQ0mu+D52i3F0XSqPJYOl8bS6ZpUFkoRDaL0AoTj77FAp6NwZVtpDB0ui8UkoKHmoihyjligHwR32Scs/965MvkG7nsc7AX1IBcsBdPBBOALBhs9pwqYP8Rx/3ChLOVQ/Mi5IvnPTqXxZBOxsHswXFC5NpI61muEWEfWRYt14elNacoakAtQw1aE3amNKXQEIrWBoxCqDRwHfPxSzGIaEOqvtwnx1zmujibkLMK9jdGC/wB3wHnQAmLBy4pIStj2JdqTi9I7St741Lk8qdu5KkXvkB/VYxUyn4aEBdD6NSsVsehYOQ84Roh2BOcnKhPpVHWKEK8d7cmqRAij4e+FMAptMu3o5424pWQREkC2IfP1tgnLderKFC3u24P7M91yqwPUCz1gJ3gXDFCeX0bqjf6LY2xl2VFgIvgWD00QS+uwKpR+EDSPvKIW0T7kmxMQqc1g8CyaEKE0WgjDtAliSHwPjhpxBHQgFN9KWEbmeBFI7mQdHkBOxXEENxuLopfRyWhl9Abft4IZYODDwtPw8zjCKDON4QzErQ1oB8RvmB/cLn4ZsbNswhfQpsJI1FFwSy8CAAgHeheoV2dNYmcF+5Md+rbi3IXlkroqlZACWIRHQSujOO0QmAbMegvPRxFI/gfQu3iO4A2QCK4CUqzPD20dtZjs8OYlDGZFRjBdwEx2sFQWpB+w0MfhKhbshehFNDAUMyLEsmaHxS9XnPW49CiiyRwE7wFLw/Ds2z29x64VGAs+AstBMegwupEerhLJ1qlIQ9YQyhYgEdMYJGTFOW39FOsQhO5YH0dVmCy4bytgE44wRP/WKxeS07p4EoKVP7ZgenkcOoPz3WCKYhTj5GxpFKcDwBhZmAZwAdw3TpryeY+hozgcHHJWcniIwdhgUFwX5eSHo6iMw6D7JxZPDlxn/Y4rePRtx0KFyaB/x4JoQo3Xdyj2Lzx3gneUMDM3yjtvgmRwDnT30Vk3Y5QsBXJyJ7vkILLGgHgg9hiUGY7fRJ7hvNXWD3e1Gbjyh3CpRYiBWNwGzyP79FBy3iBKiCdFbxSePYbJ+UUQA04AbR9K64BehvpEDgMb5CsRHhwqwFZ2V15+BJ2T3XXsMfPVGQjNJcigUCES2ShiyUle5K3Kh+etfoannkV6HWwE9/sMq8eBQ5Dz1dpYWSh5ICxWuMhdNAplBIfTcS4jHjMEOYQDVvEiGrMfhLfie4TL98CxTeQiwsoBz/LkghnDYv1NOTEOq34hh6B9RhiJEJRnKpGM0dpjQCoM8uOUFWJmPPyYuesEnPVS1EIaCMGd8iLJJmYJWSH8hGCy2xyLNHDXP0Ys41ngyalIIts4rq/8AUIjYYUoGDnh2yI0bSGiCkRmh9KlSi4lYh4q0DHAv2Fx0/PCySLwd+SUu5LU1WnCyXapwUpuFEneIT+SX9g/RCz6XwX5yqkkjqwjEBao3G2TAkUZoQY8ACc4zzErnKwi4A58n4nBX+xDMF4GHQKf4zsuQneiqveAM4dAfBd2DoTi+/Hs55AdwWLxPeXilGdEUxYLD6fmEIQYQ5bPJTsWCi5jMDD54ZOFaC6lCWSdGEiDEEJZOWFwWDwdMqjQj4AvUE91gPMVGjoL3tEsIfPYpeTGQhnnSfTpuCaGHcb3NX2xFGw1S8k+LYRE3qjoXVR2hCuXF7mRNAhJWYPq/qIoKTRY9kAcJP9WbMOUoC7jyn987GIaHL2E1CxMb0UnX9+QSo6rY+SXlGz6YcgzESdY9SPkDIQkBMMAMdCBmBDmZoXSaYTcsZJo+ghFp092ONlh62UAGATXQKiHV+f8Pc/EcK38G9N3Fhz1yA/rhAG6wH0uKCQt1yXQ+8WxNKMgkiyL4sieBcfgXYEbjh/JLbJrcWz6YvUbdhkGaQUGwJ12JRpy4dAS35nA85mUWEAN7NYn0tvlmTR5bQpZr44ide+/fSaWC3iuIpGWluRR4Ooseq4klpzX9llgPnOWA/CtSCXfcpQCyGW8bHJCWCIPPROrN8HsEYoMlwhif6qUxXrmrD7DEciJ/1nOMn2eifVk/BfNgI//7QVs4AAAAABJRU5ErkJggg==\"" 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 + " "); | |
| } 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></div><p>" | |
| "</p></div></form><p>" " " | |
| " " | |
| ); server.client().stop(); // Stop is needed because we sent no content length | |
| } /** Handle the WLAN save form and redirect to WLAN config page again */ | |
| void handleTextSave() { | |
| server.sendContent( | |
| "" | |
| " | |
| " | |
| " | |
| " | |
| " | |
| " | |
| " | |
| " | |
| " "</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 } /** 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; | |
| } /** 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; | |
| } /** 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; | |
| } |
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”.
References
- https://github.com/adafruit/Adafruit_NeoPixel