HackADay Maker Crown

Nine servos parade the acrylic molded crown, affixed in an arrayed scheme plotted by the Arduino MKR1000. A seated position is the first form, a calm but present light shone. When your Grace rises and depresses a button on his Pebble Classic, a second nobler form takes shape and a tweet is consigned notifying the peasants and Lords to bow their heads in reverence. Conflict arises, the crown must amend to suit an embattled King, the third form protective and fierce; another tweet is dispatched, protect your King!



Arduino Nude Sketch
// Maker Crown
// Vije Miller

#include "Servo.h"
#include "SPI.h"
#include "WiFi101.h"

// Servos
Servo serone;
Servo sertwo;
Servo serthree;
Servo serfour;
Servo serfive;
Servo sersix;
Servo serseven;
Servo sereight;
Servo sernine;

// Seat Positions
int seatposone = 180; // Long
int seatposoneA = 150;
int seatpostwo = 10; // Short
int seatpostwoA = 70;
int seatposthree = 130; // Long
int seatposthreeA = 85;
int seatposfour = 0; // Short
int seatposfourA = 45;
int seatposfive = 1; // Long
int seatposfiveA = 40;
int seatpossix = 170; // Long
int seatpossixA = 130;
int seatposseven = 7; // Short
int seatpossevenA = 35;
int seatposeight = 170; // Long
int seatposeightA = 125;
int seatposnine = 7; // Short
int seatposnineA = 45;

// Seat Place Holders
int posone = seatposone;
int postwo = seatpostwo;
int posthree = seatposthree;
int posfour = seatposfour;
int posfive = seatposfive;
int possix = seatpossix;
int posseven = seatposseven;
int poseight = seatposeight;
int posnine = seatposnine;

// Delays
int sitdelay = 20;
int risedelay = 15;
int battledelay = 5;

// LED
int red = 11;
int green = 12;
int blue = 10;

// State
int state = 0;

// WiFi
char ssid[] = "NETWORK";
char pass[] = "PASSWORD";
int keyIndex = 0;
int status = WL_IDLE_STATUS;
WiFiServer server(80);

// ThingSpeak
char thingSpeakAddress[] = "api.thingspeak.com";
String APIKey = "APIKEY"; // API
const int updateThingSpeakInterval = 100 * 1000; // Interval
long lastConnectionTime = 0;
boolean lastConnected = false;
WiFiClient client;

void setup() {

Serial.begin(9600);

// Servos Short
sertwo.attach(2);
serfour.attach(4);
serseven.attach(7);
sernine.attach(9);

// Servos Long
serone.attach(1);
serthree.attach(3);
serfive.attach(5);
sersix.attach(6);
sereight.attach(8);

// Lights
pinMode(red, OUTPUT);
pinMode(green, OUTPUT);
pinMode(blue, OUTPUT);

serone.write(seatposone);
sertwo.write(seatpostwoA);
serthree.write(seatposthree);
serfour.write(seatposfourA);
serfive.write(seatposfive);
sersix.write(seatpossix);
serseven.write(seatpossevenA);
sereight.write(seatposeight);
sernine.write(seatposnineA);

digitalWrite(red, HIGH);
delay(500);
digitalWrite(red, LOW);
digitalWrite(green, HIGH);
delay(500);
digitalWrite(green, LOW);
digitalWrite(blue, HIGH);
delay(500);
digitalWrite(blue, LOW);

// WIFI Connection
while ( status != WL_CONNECTED) {
Serial.print("Connecting Network: ");
Serial.println(ssid);
status = WiFi.begin(ssid, pass);
delay(5000);
}
server.begin();
printWifiStatus();
}

void loop() {

// Pebble WIFI Coms
WiFiClient client = server.available();
if (client) {
String currentLine = "";
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
if (c == '\n') {
if (currentLine.length() == 0) {
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
break;
}
else {
currentLine = "";
}
}
else if (c != '\r') {
currentLine += c;
}

if (currentLine.endsWith("GET /R")) {
state = 1;
}
if (currentLine.endsWith("GET /B")) {
state = 3;
}
if (currentLine.endsWith("GET /S")) {
state = 0;
}
}
}
client.stop();
}

// Serial Input (Testing)
if (Serial.available()) {
char ser = Serial.read();
switch (ser) {
case '0':
state = 0;
break;
case '1':
state = 1;
break;
case '2':
state = 3;
break;
}
}

// State Change
if (state == 1) {
rise();
String kingpos = String(state, DEC);
updateThingSpeak("field1=" + kingpos);
}
else if (state == 2) {

}
else if (state == 3) {
battle();
String kingpos = String(state, DEC);
updateThingSpeak("field1=" + kingpos);
}
else if (state == 4) {

}
else {
seated();
String kingpos = String(state, DEC);
if (millis() - lastConnectionTime > updateThingSpeakInterval) {
updateThingSpeak("field1=" + kingpos);
}
}

}

void printWifiStatus() {
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
IPAddress ip = WiFi.localIP();
Serial.print("http://");
Serial.println(ip);
long rssi = WiFi.RSSI();
Serial.print("RSSI: ");
Serial.print(rssi);
Serial.println(" dBm");
}

void updateThingSpeak(String tsData) {
if (client.connect(thingSpeakAddress, 80)) {
client.print("POST /update HTTP/1.1\n");
client.print("Host: api.thingspeak.com\n");
client.print("Connection: close\n");
client.print("X-THINGSPEAKAPIKEY: " + APIKey + "\n");
client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("Content-Length: ");
client.print(tsData.length());
client.print("\n\n");
client.print(tsData);
lastConnectionTime = millis();
}
}

void seated() {

digitalWrite(red, LOW);
digitalWrite(green, LOW);
digitalWrite(blue, HIGH);

serone.write(seatposone);
serthree.write(seatposthree);
serfive.write(seatposfive);
sersix.write(seatpossix);
sereight.write(seatposeight);

for (postwo = seatpostwoA; postwo >= seatpostwo; postwo -= 1) {
sertwo.write(postwo);
delay(sitdelay);
}
for (posfour = seatposfourA; posfour >= seatposfour; posfour -= 1) {
serfour.write(posfour);
delay(sitdelay);
}
delay(500);
for (posseven = seatpossevenA; posseven >= seatposseven; posseven -= 1) {
serseven.write(posseven);
delay(sitdelay);
}
for (posnine = seatposnineA; posnine >= seatposnine; posnine -= 1) {
sernine.write(posnine);
delay(sitdelay);
}

for (postwo = seatpostwo; postwo <= seatpostwoA; postwo += 1) {
sertwo.write(postwo);
delay(sitdelay);
}
for (posfour = seatposfour; posfour <= seatposfourA; posfour += 1) {
serfour.write(posfour);
delay(sitdelay);
}
delay(500);
for (posseven = seatposseven; posseven <= seatpossevenA; posseven += 1) {
serseven.write(posseven);
delay(sitdelay);
}
for (posnine = seatposnine; posnine <= seatposnineA; posnine += 1) {
sernine.write(posnine);
delay(sitdelay);
}
}

void rise() {

digitalWrite(red, LOW);
digitalWrite(green, HIGH);
digitalWrite(blue, HIGH);

sertwo.write(seatpostwoA);
serfour.write(seatposfourA);
serseven.write(seatpossevenA);
sernine.write(seatposnineA);

for (posone = seatposone; posone >= seatposoneA; posone -= 1) {
serone.write(posone);
delay(risedelay);
}
for (posthree = seatposthree; posthree >= seatposthreeA; posthree -= 1) {
serthree.write(posthree);
delay(risedelay);
}
for (posfive = seatposfive; posfive <= seatposfiveA; posfive += 1) {
serfive.write(posfive);
delay(risedelay);
}
for (possix = seatpossix; possix >= seatpossixA; possix -= 1) {
sersix.write(possix);
delay(risedelay);
}
for (poseight = seatposeight; poseight >= seatposeightA; poseight -= 1) {
sereight.write(poseight);
delay(risedelay);
}
state = 2;
}

void battle() {

digitalWrite(red, HIGH);
digitalWrite(green, LOW);
digitalWrite(blue, LOW);

for (posone = seatposoneA; posone <= seatposone; posone += 1) {
serone.write(posone);
delay(battledelay);
}
for (postwo = seatpostwoA; postwo >= seatpostwo; postwo -= 1) {
sertwo.write(postwo);
delay(battledelay);
}
for (posthree = seatposthreeA; posthree <= seatposthree; posthree += 1) {
serthree.write(posthree);
delay(battledelay);
}
for (posfour = seatposfourA; posfour >= seatposfour; posfour -= 1) {
serfour.write(posfour);
delay(battledelay);
}
for (posfive = seatposfiveA; posfive >= seatposfive; posfive -= 1) {
serfive.write(posfive);
delay(battledelay);
}
for (possix = seatpossixA; possix <= seatpossix; possix += 1) {
sersix.write(possix);
delay(battledelay);
}
for (posseven = seatpossevenA; posseven >= seatposseven; posseven -= 1) {
serseven.write(posseven);
delay(battledelay);
}
for (poseight = seatposeightA; poseight <= seatposeight; poseight += 1) {
sereight.write(poseight);
delay(battledelay);
}
for (posnine = seatposnineA; posnine >= seatposnine; posnine -= 1) {
sernine.write(posnine);
delay(battledelay);
}
state = 4;
}



Pebble JS App
// Maker Crown Peddle APP
// Vije Miller

var UI = require('ui');
var ajax = require('ajax');
var Vector2 = require('vector2');

// Create Window
var main_window = new UI.Window();

// Open Button and Display
var txtOnLabel = new UI.Text({
position: new Vector2(0, 15),
size: new Vector2(144, 30),
font: 'Gothic 28 Bold',
text: 'RISE',
textAlign: 'center',
color: 'white'
});

//this is going to be our off button
var txtOffLabel = new UI.Text({
position: new Vector2(0, 95),
size: new Vector2(144, 30),
font: 'Gothic 28 Bold',
text: 'BATTLE',
textAlign: 'center',
color: 'white'
});

main_window.backgroundColor('black');
main_window.add(txtOnLabel);
main_window.add(txtOffLabel);
main_window.show();

// URL To MKR1000 (Change)
function Toggle(function_name){
var URL = 'http://192.168.1.9/' + function_name;

ajax(
{
url: URL,
method: 'post',
type: 'json',
data: { "args": function_name}
}
);
}

// Rise
main_window.on('click', 'up', function() {
Toggle('R');
});
// Battle
main_window.on('click', 'down', function() {
Toggle('B');
});
// Seated
main_window.on('click', 'select', function() {
Toggle('S');
});

Archive
https://hackaday.io/project/10081-maker-crown

01:38:48 8-016

@pkvi
"...may not meet professional standards."
12,168 miters
0 miters today
203 tenons
Subscribe