loading

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 Sketch

// Maker Crown @TVMiller

#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 APP Code

// Maker Crown Peddle APP (Version 1.0) @TVMiller 

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');
});

About This Instructable

93views

4favorites

License:

Bio: Privateer
More by TVMiller:Arduino Splash Resistant Toilet Foamer Arduino Motion Mute 1992 Isuzu Trooper Windshield Wiper Single Button Hack 
Add instructable to: