Introduction: Team Awesome Job: the Interactive Notification Case (I.N.C.)
Team Name: Awesome Job
Link to Project Documentation:
Project Description:Interactive phone case with LED indicators for notifications. Designed to be of assistance to those with hearing disabilities, or anyone who does not want noise notifications.
Existing Parts Used:3D printer, 1206 SMD LEDs, ChipKit DP32, PmodBT2, MPIDE, resistors, Analog Discovery, Digilent Waveforms, USB adapters, battery pack, batteries
What did you do in the 24 hours? Designed circuit to allow for 15 LEDs to be illuminated independently using only 8 configurable pins. Removed unnecessary components from board to reduce size and power consumption. 3D designed and printed phone case and clear cover to house all components. Programmed ChipKit to receive data over Bluetooth and process it into recognizable LED display configurations. Analyzed data sheets for proper wiring pinout, power, and communication protocol
How did you address the theme?Project utilized the communication between Pmod, phone, chipkit, and internet to relay relevant information to users.
What would you do if allotted more time and resources? Design android application to support customized notifications and behavior. Add an LCD display (PmodCLP or PmodCLS for example) to add description of notifications that are flashed. Make next prototype more secure while also being smaller (Perhaps exporting the code to a board similar to the Arduino Nano as it would create a smaller footprint and lower power consumption while still providing the needed capabilities).
Step 1: Our Project
Our team has built a true Internet of Things device that can be put in anything. For our prototype we built it into a cell phone case. It is designed to light up different colored LED lights based on notifications that the phone or Bluetooth compatible device gets. When your phone, tablet, laptop and so on get texts, emails, updates, weather updates, news updates or any other notification, our project, the Interactive Notification Case (I.N.C.) will light up and flash to notify the user of the incoming message. The I.N.C. can be further developed easily to add sound and vibration to the notification system, and the device can even be placed into other things beside a phone case, like a wallet, on a watch, a small cube pod that can be placed anywhere, or even in the places that your phone or Bluetooth cable devices like a tablet can not go (like a shower).
Step 2: 3D Modeling
We decided on building a simple but important IoT device that we would build it into a phone case. We started by designing the case (fitted to the LG G4 cell phone) to allow for a glass bottom, the power connector at the bottom, and the power switch for the Interactive Notification Case (I.N.C.) device itself. The case is 151 mm x 80 mm x 26 mm, 3d printed, designed by solid-works, and the glass bottom of the case is acrylic and cut by a laser cuter. We made the case a little thick to accommodate the battery case we had available. Leaving wholes for the phone charger port and a side whole for our power switch for our board. We also decided to save time with the printing by only having the outer case and a skinny ledge to hod the phone and a second larger ledge to hold the glass case bottom that allows for light from the LEDs to shine through.
Step 3: Model Building
Once we finished the design in Solidworks, we put it in the Frank Innovation Zone (FIZ) 3D printer to produce a basic prototype for the case and used the laser cuter on the piece of acrylic we had.
Step 4: Research
Our team did some in depth research on all of the parts and devices provide to us as we decided on what we would actually use. We decided on using the Chipkit DP32 due to the ease of programming inputs and outputs as well as the many soldering points available on the board. We chose some very small LED lights that we brought ourselves (as we found the provided LEDs would make our final prototype too large for a phone case and consume too much more power). We also did research on what programs would be best for designing our circuit. We concluded on MPIDE for the programming language of the DP32 Chipkit due to the similarity to C++ and being somewhat familiar.
Step 5: Part Testing
We then began to test everything, testing if it worked, its voltage, amperage, and testing the functionality of the LED lights and Bluetooth peripheral module (PmodBT2).
Step 6: Soldering
Once the we determined everything was working, how it would connected, and what would power it we began on preparing the ChipKit. Soldering the resistors, the LED lights, and a few other components on the ChipKit we tested and verified the working status of the device.
Step 7: Coding Libraries and Editing
6. We then began to start looking for coding libraries, examples, and figuring out to build the program that will run the ChipKit, lights up the LEDs, and works with the our bluetooth modular.
Here you can see the serial data coming from the PmodBT2 being measured on an Analog Discover using the WaveForms software by Digilent.
Step 8: Code
// PmodBT2 references: https://www.digilentinc.com/Data/Products/PMOD-BT...
// Bluetooth microchip reference: http://ww1.microchip.com/downloads/en/DeviceDoc/r... // ChipKit DP32 references: http://ww1.microchip.com/downloads/en/DeviceDoc/r...
#include // import the serial library for communication with Bluetooth
// Pins on ChipKit were chosen due to reference sheet for the ChipKit on page 8. The "ChipKIT Pin #" column points to the // number used in the code here, while the "Connector Pin #" is the coresponding pin label directly on the board.
// NOTE: Page 9 also has pin layout but they move the columns around. Make sure you use "ChipKIT Pin #" for code and not // "Socket Pin #" by mistake.
SoftwareSerial stream(18, 10); // stream(RX, TX) // Under the "Notes" column we saw that pins 18 and 10 were marked for "serial in" and "serial out" respectively // which was how the Bluetooth module sends and receives data. This took forever to figure out.
// Note RX on board goes to TX on Bluetooth module, and TX on board goes to RX on Bluetooth module // RX -> TX, TX -> RX in the same way that speaking from your mouth goes to the ears of another person
// NOTE: Naming scheme was made to have "Connector Pin #" on the left and the number on the right was the "ChipKIT Pin #" // This made it easier to remember what wires were being powered for future reference. int RB5 = 0; // Red LED line int RB7 = 1; // Yellow LED line int RB8 = 2; // Green LED line
int RB4 = 17; // #1 int RB3 = 14; // #2 int RB2 = 13; // #3 int RB0 = 11; // #4 int RB9 = 3; // #5
int val; // variable to receive data from the serial port
void setup() { // put your setup code here, to run once: stream.begin(115200); // This is what the bluetooth device communicates on (115.2kbps default) according to the PmodBT2 documentation Serial.begin(115200); // This is used to debug via PC. If using MPIDE click "Tools"->"Serial Monitor" to access any data sent from the // board to the PC via a command such as 'Serial.println(val);' where val is an integer, string, etc. pinMode(RB5, OUTPUT); // Red LED pinMode(RB7, OUTPUT); // Yellow LED pinMode(RB8, OUTPUT); // Green LED digitalWrite(RB5, LOW); digitalWrite(RB7, LOW); pinMode(RB4, OUTPUT); // #1 pinMode(RB3, OUTPUT); // #2 pinMode(RB2, OUTPUT); // #3 pinMode(RB0, OUTPUT); // #4 pinMode(RB9, OUTPUT); // #5 }
void loop() { // put your main code here, to run repeatedly:
digitalWrite(RB2, LOW); // sets the #3 LED digitalWrite(RB9, LOW); // sets the #5 LED digitalWrite(RB0, LOW); // sets the #4 LED digitalWrite(RB3, LOW); // sets the #2 LED digitalWrite(RB4, LOW); // sets the #1 LED delay(10); val = stream.read(); Serial.println(val); if(val == 148) { // '3' digitalWrite(RB9, LOW); // sets the #5 LED digitalWrite(RB0, LOW); // sets the #4 LED digitalWrite(RB2, LOW); // sets the #3 LED digitalWrite(RB3, LOW); // sets the #2 LED digitalWrite(RB4, HIGH); // sets the #1 LED delay(100); //################################################################################################### //GREEN digitalWrite(RB8, HIGH); // sets the Green LED row on digitalWrite(RB4, HIGH); // sets the #1 LED on delay(100); // WAIT .1 seconds digitalWrite(RB3, HIGH); // sets the #2 LED on digitalWrite(RB4, LOW); // sets the #1 LED off delay(100); digitalWrite(RB2, HIGH); // sets the #3 LED on digitalWrite(RB3, LOW); // sets the #2 LED off delay(100); digitalWrite(RB0, HIGH); // sets the #4 LED on digitalWrite(RB2, LOW); // sets the #3 LED off delay(100); digitalWrite(RB9, HIGH); // sets the #5 LED on digitalWrite(RB0, LOW); // sets the #4 LED off delay(100); digitalWrite(RB8, LOW); // sets the Green LED row off digitalWrite(RB9, LOW); // sets the #5 LED off digitalWrite(RB8, LOW); // sets the Green LED row off //YELLOW digitalWrite(RB7, HIGH); // sets the Yellow LED row on digitalWrite(RB4, HIGH); // sets the #1 LED on delay(100); // WAIT .1 seconds digitalWrite(RB4, LOW); // sets the #1 LED off digitalWrite(RB3, HIGH); // sets the #2 LED on delay(100); digitalWrite(RB3, LOW); // sets the #2 LED off digitalWrite(RB2, HIGH); // sets the #3 LED on delay(100); digitalWrite(RB2, LOW); // sets the #3 LED off digitalWrite(RB0, HIGH); // sets the #4 LED on delay(100); digitalWrite(RB0, LOW); // sets the #4 LED off digitalWrite(RB9, HIGH); // sets the #5 LED on delay(100); digitalWrite(RB7, LOW); // sets the Yellow LED row off digitalWrite(RB9, LOW); // sets the #5 LED off digitalWrite(RB8, LOW); // sets the Green LED row off //RED digitalWrite(RB5, HIGH); // sets the Red LED row on digitalWrite(RB4, HIGH); // sets the #1 LED on delay(100); // WAIT .1 seconds digitalWrite(RB3, HIGH); // sets the #2 LED on digitalWrite(RB4, LOW); // sets the #1 LED off delay(100); digitalWrite(RB2, HIGH); // sets the #3 LED on digitalWrite(RB3, LOW); // sets the #2 LED off delay(100); digitalWrite(RB0, HIGH); // sets the #4 LED on digitalWrite(RB2, LOW); // sets the #3 LED off delay(100); digitalWrite(RB9, HIGH); // sets the #5 LED on digitalWrite(RB0, LOW); // sets the #4 LED off delay(100); digitalWrite(RB5, LOW); // sets the Red LED row off digitalWrite(RB9, LOW); // sets the #5 LED off
//################################################################################################### }
else if(val == 148){// '4' //GREEN digitalWrite(RB8, HIGH); // sets the Green LED row on digitalWrite(RB4, HIGH); // sets the #1 LED on delay(100); // WAIT .1 seconds digitalWrite(RB3, HIGH); // sets the #2 LED on digitalWrite(RB4, LOW); // sets the #1 LED off delay(100); digitalWrite(RB2, HIGH); // sets the #3 LED on digitalWrite(RB3, LOW); // sets the #2 LED off delay(100); digitalWrite(RB0, HIGH); // sets the #4 LED on digitalWrite(RB2, LOW); // sets the #3 LED off delay(100); digitalWrite(RB9, HIGH); // sets the #5 LED on digitalWrite(RB0, LOW); // sets the #4 LED off delay(100); digitalWrite(RB8, LOW); // sets the Green LED row off digitalWrite(RB9, LOW); // sets the #5 LED off } else if(val == 149){// '5' digitalWrite(RB8, LOW); // sets the Green LED row off //YELLOW digitalWrite(RB7, HIGH); // sets the Yellow LED row on digitalWrite(RB4, HIGH); // sets the #1 LED on delay(100); // WAIT .1 seconds digitalWrite(RB4, LOW); // sets the #1 LED off digitalWrite(RB3, HIGH); // sets the #2 LED on delay(100); digitalWrite(RB3, LOW); // sets the #2 LED off digitalWrite(RB2, HIGH); // sets the #3 LED on delay(100); digitalWrite(RB2, LOW); // sets the #3 LED off digitalWrite(RB0, HIGH); // sets the #4 LED on delay(100); digitalWrite(RB0, LOW); // sets the #4 LED off digitalWrite(RB9, HIGH); // sets the #5 LED on delay(100); digitalWrite(RB7, LOW); // sets the Yellow LED row off digitalWrite(RB9, LOW); // sets the #5 LED off } else if(val == 150){// '6' digitalWrite(RB8, LOW); // sets the Green LED row off //RED digitalWrite(RB5, HIGH); // sets the Red LED row on digitalWrite(RB4, HIGH); // sets the #1 LED on delay(100); // WAIT .1 seconds digitalWrite(RB3, HIGH); // sets the #2 LED on digitalWrite(RB4, LOW); // sets the #1 LED off delay(100); digitalWrite(RB2, HIGH); // sets the #3 LED on digitalWrite(RB3, LOW); // sets the #2 LED off delay(100); digitalWrite(RB0, HIGH); // sets the #4 LED on digitalWrite(RB2, LOW); // sets the #3 LED off delay(100); digitalWrite(RB9, HIGH); // sets the #5 LED on digitalWrite(RB0, LOW); // sets the #4 LED off delay(100); digitalWrite(RB5, LOW); // sets the Red LED row off digitalWrite(RB9, LOW); // sets the #5 LED off } else if(val == 151){// '7' //GREEN Notification digitalWrite(RB8, HIGH); // sets the Green LED row on digitalWrite(RB4, HIGH); // sets the #1 LED on delay(100); // WAIT .1 seconds digitalWrite(RB3, HIGH); // sets the #2 LED on delay(200); digitalWrite(RB8, LOW); // sets the Green LED row off delay(200); digitalWrite(RB8, HIGH); // sets the Green LED row on delay(200); digitalWrite(RB8, LOW); // sets the Green LED row off delay(200); digitalWrite(RB8, HIGH); // sets the Green LED row on delay(200); digitalWrite(RB8, LOW); // sets the Green LED row off digitalWrite(RB4, LOW); // sets the #1 LED off digitalWrite(RB3, LOW); // sets the #2 LED off delay(300); } else if(val == 152){ // '8' digitalWrite(RB8, LOW); // sets the Green LED row off //YELLOW Notification digitalWrite(RB7, HIGH); // sets the Yellow LED row on digitalWrite(RB4, HIGH); // sets the #1 LED on delay(100); // WAIT .1 seconds digitalWrite(RB3, HIGH); // sets the #2 LED on delay(100); digitalWrite(RB2, HIGH); // sets the #3 LED on delay(200); digitalWrite(RB7, LOW); // sets the Yellow LED row off delay(200); digitalWrite(RB7, HIGH); // sets the Yellow LED row on delay(200); digitalWrite(RB7, LOW); // sets the Yellow LED row off delay(200); digitalWrite(RB7, HIGH); // sets the Yellow LED row on delay(200); digitalWrite(RB7, LOW); // sets the Yellow LED row off digitalWrite(RB9, LOW); // sets the #5 LED off digitalWrite(RB4, LOW); // sets the #1 LED off digitalWrite(RB0, LOW); // sets the #4 LED off digitalWrite(RB3, LOW); // sets the #2 LED off digitalWrite(RB2, LOW); // sets the #3 LED off delay(300); } else if(val == 153){// '9' digitalWrite(RB8, LOW); // sets the Green LED row off //RED Notification digitalWrite(RB5, HIGH); // sets the Red LED row on digitalWrite(RB4, HIGH); // sets the #1 LED on delay(100); // WAIT .1 seconds digitalWrite(RB3, HIGH); // sets the #2 LED on delay(100); digitalWrite(RB2, HIGH); // sets the #3 LED on delay(100); digitalWrite(RB0, HIGH); // sets the #4 LED on delay(100); digitalWrite(RB9, HIGH); // sets the #5 LED on delay(100); digitalWrite(RB5, LOW); // sets the Red LED row off delay(200); digitalWrite(RB5, HIGH); // sets the Red LED row on delay(200); digitalWrite(RB5, LOW); // sets the Red LED row off delay(200); digitalWrite(RB5, HIGH); // sets the Red LED row on delay(200); digitalWrite(RB5, LOW); // sets the Red LED row off digitalWrite(RB4, LOW); // sets the #1 LED off digitalWrite(RB3, LOW); // sets the #2 LED off digitalWrite(RB2, LOW); // sets the #3 LED off digitalWrite(RB0, LOW); // sets the #4 LED off digitalWrite(RB9, LOW); // sets the #5 LED off delay(300); // stream.println(val); } else{ digitalWrite(RB8, HIGH); // sets the Green LED row on digitalWrite(RB5, HIGH); // sets the Red LED row on digitalWrite(RB7, HIGH); // sets the Yellow LED row on digitalWrite(RB4, HIGH); // sets the #1 LED on delay(300); // WAIT .1 seconds digitalWrite(RB3, HIGH); // sets the #2 LED on delay(300); digitalWrite(RB2, HIGH); // sets the #3 LED on delay(300); digitalWrite(RB0, HIGH); // sets the #4 LED on delay(300); digitalWrite(RB9, HIGH); // sets the #5 LED on delay(300); digitalWrite(RB8, LOW); // sets the Green LED row off digitalWrite(RB5, LOW); // sets the Red LED row off digitalWrite(RB7, LOW); // sets the Yellow LED row off delay(200); digitalWrite(RB8, HIGH); // sets the Green LED row on digitalWrite(RB5, HIGH); // sets the Red LED row on digitalWrite(RB7, HIGH); // sets the Yellow LED row on delay(200); digitalWrite(RB8, LOW); // sets the Green LED row off digitalWrite(RB5, LOW); // sets the Red LED row off digitalWrite(RB7, LOW); // sets the Yellow LED row off delay(200); digitalWrite(RB8, HIGH); // sets the Green LED row on digitalWrite(RB5, HIGH); // sets the Red LED row on digitalWrite(RB7, HIGH); // sets the Yellow LED row on delay(200); digitalWrite(RB8, LOW); // sets the Green LED row off digitalWrite(RB5, LOW); // sets the Red LED row off digitalWrite(RB7, LOW); // sets the Yellow LED row off digitalWrite(RB4, LOW); // sets the #1 LED off digitalWrite(RB3, LOW); // sets the #2 LED off digitalWrite(RB2, LOW); // sets the #3 LED off digitalWrite(RB0, LOW); // sets the #4 LED off digitalWrite(RB9, LOW); // sets the #5 LED off delay(300); } }
Step 9: Troubleshooting
We had some major issues getting the PmodBT2 to work. Primarily understanding the serial communication and reading data sent from another device.
Eventually we figured out the communication terminology used in the code and the necessary speeds for it to work. See notes in code for details about wiring and serial bluetooth communication.
Another problem we came across while configuring bluetooth was we were receiving a signal from the phone, but every time we tried to identify it the board would illuminate the same LED. Turned out that in our if statements we accidentally had a statement for if the value was above 100 or equal to zero it would illuminate the same LED. Most commands via serial are in the 100-180 range and that was what was causing the same LED to light up.
Step 10: Judge Info Sheet for Our Competition
Team Name: Awesome Job
Link to Project Documentation:https://www.instructables.com/id/Team-Awesome-Job-INC/https://docs.google.com/document/d/1MYoDiL161My6wJ2ro5Mr-rY_7qCqyeNpVu9t5jU2b78/edit?usp=sharing Project Description:Interactive phone case with LED indicators for notifications. Designed to be of assistance to those with hearing disabilities, or anyone who does not want noise notifications.
Existing Parts Used:3D printer, 1206 SMD LEDs, ChipKit DP32, PmodBT2, MPIDE, resistors, Analog Discovery, Digilent Waveforms, USB adapters, battery pack, batteries
What did you do in the 24 hours? Designed circuit to allow for 15 LEDs to be illuminated independently using only 8 configurable pins. Removed unnecessary components from board to reduce size and power consumption. 3D designed and printed phone case and clear cover to house all components. Programmed ChipKit to receive data over Bluetooth and process it into recognizable LED display configurations. Analyzed data sheets for proper wiring pinout, power, and communication protocol
How did you address the theme?Project utilized the communication between Pmod, phone, chipkit, and internet to relay relevant information to users.
What would you do if allotted more time and resources? Design android application to support customized notifications and behavior. Add an LCD display (PmodCLP or PmodCLS for example) to add description of notifications that are flashed. Make next prototype more secure while also being smaller (Perhaps exporting the code to a board similar to the Arduino Nano as it would create a smaller footprint and lower power consumption while still providing the needed capabilities).