The Shooting ArteFact

So far, there have been more than 14,344. deaths caused by gun violence in USA in 2017.
The Shooting ArteFact is a speculative design project that seeks to raise awareness around this problem. Every time a person is declared dead on http://www.gunviolencearchive.org/, Shooting ArteFact will play a sound and flash the screen. The number of deaths are also displayed on the artefact. The Shooting Artefact can be placed in public spaces in order to increase its impact, or in busy private spaces such as a lobby or an elevator.

 

Doing this was very emotional and interesting, since my small successes in making it alert when someone died also meant that a person in america had died from a gunshot. I was therefore shocked and covered in goosebumps through out a big part of my process. I know that it is a very sensitive topic and that the shape, form, output, ethics etc. easily can offend people. Therefore, I chose a rather neutral but dark and intersting form: the black box.

When it comes to code, I have also learned a lot from doing this project. It was very frustrating and stressing at times, but then Becky was very kind helping me.
Unfortunately, I am having issues triggering the speaker. Hopefully, the Instructables community will help me on that. Another future action would be to bring it out to a public location. This could be taking it to Washington DC or to a parlament building here in NYC.

Becky, thank you for your help and support. Also, thank you to all you awesome classmates for being supportive and tolerating all the white noise at the studio.
Please find my tutorial here.
My video here.

The Shootings ArtiFact

Hi all,

My final project is a speculative project.
Its purpose is to raise awareness around how many and how often people die from shootings in this country.
You can find my document here.

This is my code, which needs a lot more work, since it is the hardest part of the project:

 
		
/* -------------------------------------------------------------------------
ShootingsArtefact -- an artefact that reacts to the number of deaths by shooting in the US
using the the Adafruit HUZZAH ESP8266 WiFi microcontroller (can also work on other ESP8266 boards)
with numbers provided by http://www.gunviolencearchive.org/. LED on pin 15 shows status:

Steady on = One-time initialization
Fast flicker = Connecting to network, polling data
Slow blink = Symptoms predicted in forecast (24-48 hrs)
Blip ea. 4 sec = Symptoms not in forecast (sleeping)

----------------------------------------------------------------------------
Configure the code below with your WiFi credentials. Then visit
http://www.gunviolencearchive.org/ and look up the number you wish to display.
Copy the URL into the appropriate spot in the code below.
When changing the number to be displayed, you will need to dig through the page's HTML
source to find a string that uniquely identifies the condition sought, while
avoiding false positives. See additional notes later in the code.
----------------------------------------------------------------------------*/

#include 

#define LED_PIN 13 // LED+ is connected here
#define POLL_INTERVAL (15 * 60) // Time between server queries (seconds)
#define FAIL_INTERVAL 30 // If error, time before reconnect (seconds)
#define READ_TIMEOUT 10000L // Client read timeout, milliseconds

char ssid[] = "AGH",
pass[] = "???",
host[] = "www.gunviolencearchive.org",
page[] = "/";

// This structure is used during string-matching operations. Only the
// 'string' element is initialized here; other elements are initialized
// or modified as needed in multiFind(). This code is NOT AVR-friendly;
// PROGMEM strings are not used, it's assumed this will be running on
// an ESP8266 (or ported to other non-AVR board that just normally puts
// const strings in program memory instead of RAM).
struct stringMatch {
const char * const string;
uint8_t stringLength;
uint8_t matchedLength;
} matchList0[] = {
{ "Number of Deaths1" },
{ NULL } // END OF LIST, don't remove this
}; // Can create add'l string match lists here if needed

WiFiClient client;

String readString;
int deathsThisYear;

void setup(void) {
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, HIGH); // Steady on = startup
Serial.begin(57600);
Serial.println("Hello!");
}

// STRING-MATCH FUNCTION -----------------------------------------------------

// multiFind() scans a connected Client object for one or more strings
// (NULL-terminated stringMatch array 'list'), returns index of the first
// string matched (0 to n-1) or -1 if timeout or no match.
static int8_t multiFind(struct stringMatch *list) {
uint32_t t;
char c;
uint8_t i;

// Reset all stringMatch items prior to search...
for(i=0; list[i].string; i++) {
list[i].stringLength = strlen(list[i].string);
list[i].matchedLength = 0;
}

for(t=millis();;) {
if(client.available()) { // Data pending from Client?
c = client.read(); // Read it
if(c == 0) break; // End of data reached, no match
for(i=0; list[i].string; i++) { // Compare against each stringMatch item...
if(c == list[i].string[list[i].matchedLength]) { // Matched another byte?
if(++list[i].matchedLength == // Matched whole string?
list[i].stringLength) return i; // WINNER, return index
} else { // Character mismatch, reset counter to start
list[i].matchedLength = 0;
}
}
t = millis(); // Reset timeout
} else if((millis() - t) > READ_TIMEOUT) {
Serial.println("Timeout");
break;
}
}
return -1; // No string match, or timeout
}

void loop() {

uint32_t t, hi, lo, pauseTime = FAIL_INTERVAL;

// Fast blink during WiFi connection...
analogWriteFreq(4); // 4 Hz
analogWrite(LED_PIN, 100); // ~10% duty cycle

Serial.print("WiFi connecting..");
WiFi.begin(ssid, pass);
while(WiFi.status() != WL_CONNECTED) {
Serial.write('.');
delay(500);
}
Serial.println("OK!");

// Slightly slower (but still quick) blink while searching
analogWriteFreq(1); // 1 Hz
analogWrite(LED_PIN, 100); // ~10% duty cycle

Serial.print("Contacting server...");
if(client.connect(host, 80)) {
Serial.print(F("OK\r\nRequesting data..."));
client.print("GET ");
client.print(page);
client.print(" HTTP/1.1\r\nHost: ");
client.print(host);
client.print("\r\nConnection: Close\r\n\r\n");

// multiFind() searches the incoming stream for a list of possible
// string matches, returning the index of the found item (or -1 if
// no match). Stream position will be immediately after the found
// item (allowing further searches to be performed from that point
// forward), or end of stream in -1 case.
// client.find() is the normal Arduino Stream search function, which
// looks for a single item. In this code, we're using multiFind()
// to skip past some of AccuWeather's false positives, to pick a
// starting point for a simple string search that more reliably
// indicates migraine weather in the forecast...
if((multiFind(matchList0) >= 0) &&
client.find("")) { // get past the last HTML before the number we want to capture)
// Found it -- number of kills this year.
Serial.println(F("FOUND"));
for (int i=0; i<6; i++){ // 5 digits and a comma, this will change in January when the count resets char c = client.read(); //gets one byte from serial buffer readString += c; //makes the String readString delay(2); //slow looping to allow buffer to fill with next character } if (readString.length() >0) {
Serial.print("Number of gun deaths in 2017 (as a string): ");
Serial.println(readString); //so you can see the captured String
readString.remove(2, 1); // remove comma (one character at index 2)
deathsThisYear = readString.toInt(); //convert readString into a number
readString="";
Serial.print("now as an integer: ");
Serial.println(deathsThisYear);
}
hi = lo = 500; // 1 Hz, 50% duty cycle
} else { // No match
Serial.println(F("not found"));
hi = 10; // Tiny blip
lo = 3990; // at about 1/4 Hz
}
// This is just one example...more complex code might need multiple
// find() and/or multiSearch() calls with different lists as a sort
// of decision tree.

Serial.println("Closing server connection.");
client.stop();
pauseTime = POLL_INTERVAL;
} else {
Serial.println("failed.");
}
// WiFi is turned off between server queries, to save a little power if
// you decide to make this battery-operated.
Serial.println("Stopping WiFi.");
WiFi.disconnect();
analogWrite(LED_PIN, 0);

// Delay until next server query time. The values of 'hi' and 'lo'
// determine the LED blink speed. This code doesn't use any low-power
// sleep techniques, as the ESP8266 doesn't appear to support PWM while
// sleeping...it has to be blinked in software.
Serial.print("Pausing for ");
Serial.print(pauseTime);
Serial.println(" seconds.");
t = millis();
while((millis() - t) < (pauseTime * 1000)) {
digitalWrite(LED_PIN, HIGH);
delay(hi);
digitalWrite(LED_PIN, LOW);
delay(lo);
}
}

Pretty fly for a WiFi

Arduino time:

For my final project I have the following in mind:

The popcorn timer – This is a device that records the time intervals in-between the pops when making popcorn. When there is more than 3/4 seconds between the pops, then the popcorn are ready and the device informs you.

The shooting spammer – For every person that dies in the USA from a shooting a sound and blinking will go off. The source will be this and the output will differ depending on the incident.

The daily hunger-meter – A display showing the number of people who have died from hunger today. Source.

Final Flame

My initial sketch for the flame looked like this:

IMG_4027

Thereafter, I made my first prototype from which I learned a lot.

IMG_4035

For my final flame I started out exploring the shape of the flame, again.

IMG_4068.1920

I picked a shape and cut it out. However, I thought it was too small so I drew it larger.

IMG_4069.1920

I cut it out.

IMG_4072.1920

I used the sam procedure for the orange and yellow layers.

 

I then sew the orange and yellow layer together.

Then I added the red.

IMG_4082.1920

I joined the three sides using the sewing machine.

Then I started making the logs.

I then started soldering. This is my circuit. I used 8 flickering LEDs, 3xAAA batteries, a battery supply with a switch, 8 75 w. resistors, solder, wires and isolation.

I stuffed the flame and logs. I also closed up the logs and added them to the flame.

I then sewed the LEDs into the insides of the flame.

IMG_4101.1920

AND this is the final flame:

_X7A0936.1920

I see it being used in a calm and cosy context. The ambient of the LEDs is calming and it is therefore a plush light for a calm setting. I imagine it being sold in kids toy stores as a night light, which will keep kids calm at night. It will also be a way to introduce children to fire before introducing them to real fire. I also see it being sold in outdoor stores as a bonfire that you can use inside, when you are not in the field.
The bonfire solves the problem of not wanting to have a fireplace or bonfire in a setting where it would normally not be permitted or possible. This could be in a kids castle or in an apartment in the city.
I made the bonfire because i personally have been craving a fireplace in my apartment in Denmark. It gets very cold and dark in Denmark during winter. However, fireplaces are not legal in many parts of the city due to its polluting downside. I therefore imagine using the bonfire as a replacement.

Here are the context photos:

_X7A0886.1920

_X7A0924.1920

Plush Proto

I have decided to do the flame.

Brace yourselves!
This post might have the ugliest sewing you have ever seen!

Here is the circuit for my eight “flame” LEDs:

IMG_4013

IMG_4015
Then, I started prototyping. I used some scrap material from the VFL since I wanted to experiment with LEDs and lights in general.
For my actual plush light I have bought brown, beige, red, orange and yellow felt for the logs and fire.
However, my prototype took another ugly but very teaching turn:

This was the sketch that I used as guideline.

IMG_4027

IMG_4028I decided to do two layers:

IMG_4029

This is where the ugly sewing comes into the picture.
First, I sewed the grey outer part on to the red part. I used the machiene.
Then, it was time to turn the material around. This is where the shapes of the flames should match each other and make a beautiful flame.
However, I had sown the grey pieces onto the same sides of the red pieces.
This meant, that the two flame shapes did not match.
However, I tried to make them match anyway, which turned out dreadfully:

IMG_4030

Now it was time to play with light.
I sodded up two LEDs to a 9V battery.

I inserted them into my flame.IMG_4035

However, I was not satisfied with the light so I decided to stuff my flame and this gave a much better light:

IMG_4058

I am so glad that we did this prototyping exercise as I now know what NOT to do and what to do.
I am very excited to see how my final fire will turn out.

 

Three of the four

For my Plush Night Light I am making one of the four elements.

I have bought eight ambient LED that change brightness constantly. You know, the kind of LEDs in fake candles.
I will incorporate these into my Plush element and I am not planning on using Arduino.

I have sketched three:

Fire Plush

In this one the Fire Plush should light up like the fire in a Candle.

img_3991.jpg

Water Plush

This should have the effect of glimting water in the sun.

IMG_3992

Moss Plush

The Moss Plush represents Earth and should have the effect glimting moist moss in the sun.IMG_3993

Pushing my buttons

Here is how it went down:

Code for the last one:

 
// set pin numbers:
const int LightOn = 2; // the number of the pushbutton pin
const int LightOff = 9;
const int ledPin = 13; // the number of the LED pin

// variables will change:
int buttonState = 0; // variable for reading the pushbutton status

void setup() {
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
// initialize the pushbutton pins as an input:
pinMode(LightOn, INPUT);
pinMode(LightOff, INPUT);
}
void loop(){
if (digitalRead(LightOff) == LOW) {
digitalWrite(ledPin, LOW); //this turns the LED off
} else if (digitalRead(LightOn) == LOW) {
digitalWrite(ledPin, HIGH); // this turns the LED on
}
}