Weasley Clock Code

Posted: 4th December 2016 by LegoDoug in Doug, Electronics, Geekdom, Home Life, Work Life

Back at Veracode’s last Hackathon, I published the video below. People have started discovering this and asking questions about it, so here is the code for it:

/*
  Weasley Clock
  -------------

  Created by Doug "LegoDoug" Wilcox for Veracode Hackathon IX.

  Video of the completed project is at https://www.youtube.com/embed/oRUViFnxKsg.

  "Share and enjoy."

 */

// Arduino SPI (Serial Peripheral Interface) library - https://www.arduino.cc/en/Reference/SPI
#include <SPI.h>             
// Arduino Ethernet library - https://www.arduino.cc/en/Reference/Ethernet
#include <Ethernet.h>        
// Arduino Stepper library - https://www.arduino.cc/en/Reference/Stepper
#include <Stepper.h>         
// Adafruit REST IO library - https://learn.adafruit.com/adafruit-io/arduino
// See also https://www.arduino.cc/en/Tutorial/WebClientRepeating
#include "Adafruit_IO_Client.h"    
                                   

// assign a MAC address for the ethernet controller.
byte mac[] = {
  0x8C, 0xDC, 0xD4, 0x4A, 0xC9, 0xC2
};

// initialize the library instance:
EthernetClient client;

// last time the Arduino connected to the server, in milliseconds
unsigned long lastConnectionTime = 0;        
// delay between retrieving updates, in milliseconds
const unsigned long requestInterval = 5000L; 

// Configure Adafruit IO access. You will need to create your own 
// Adafruit IO account (free), and set up a feed, and provide your
// feed and AIO key in the code below.
#define AIO_FEED   "weasleyclockstatus"
#define AIO_KEY    "XXXXXXXXXXXXXXXXXXXXXXXXXXX"

// Create an Adafruit IO Client instance.  Notice that this needs to take a
// WiFiClient object as the first parameter, and as the second parameter a
// default Adafruit IO key to use when accessing feeds (however each feed can
// override this default key value if required, see further below).
Adafruit_IO_Client aio = Adafruit_IO_Client(client, AIO_KEY);

// Alternatively to access a feed with a specific key:
Adafruit_IO_Feed clockFeed = aio.getFeed(AIO_FEED, AIO_KEY);

// States - These are the codes that correspond to specific clock positions.
const String LD_HOME         = "ld_na";
const String LD_TRAVELING    = "ld_tr";
const String LD_VERACODE     = "ld_of";
const String LD_CHURCH       = "ld_ch";
const String LD_MORTAL_PERIL = "ld_mp";
const String LD_GLOUCESTER   = "ld_gl";

// Steps - How many steps the motor needs to move to point to a specific position 
// on the clock.
const int STEPS_HOME         = 0;
const int STEPS_TRAVELING    = 750;
const int STEPS_VERACODE     = 1600;
const int STEPS_CHURCH       = 2450;
const int STEPS_MORTAL_PERIL = 3350;
const int STEPS_GLOUCESTER   = 4350;

// Someday, I will determine what this actually does. (I don't think, functionally, 
// it has any affect.)
const int stepsPerRevolution = 200;  

long motorPosition = 0L;         // Number of steps the motor has taken.
String fValue = "";              // Feed value.

Stepper clockStepper(stepsPerRevolution, 7, 6, 5, 4, 8);

void setup() {
  // start serial port:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native 
      // USB port only, on certain Arduino models.
  }

  // give the ethernet module time to boot up:
  delay(1000);
  // start the Ethernet connection using a fixed IP address and DNS server:
  //Ethernet.begin(mac, ip, myDns);
  // Or, just start it with dynamic DNS by giving it a MAC address.
  Ethernet.begin(mac);
  // print the Ethernet board/shield's IP address:
  Serial.print("My IP address: ");
  Serial.println(Ethernet.localIP());

  clockStepper.setSpeed(20);
}

void loop() {

  // Wait for a bit and read the current feed value.
  Serial.println(F("Waiting ..."));
  delay(requestInterval);
  
  // To read the latest feed value call the receive function on the feed.
  // The returned object will be a FeedData instance and you can check if it's
  // valid (i.e. was successfully read) by calling isValid(), and then get the
  // value either as a text value, or converted to an int, float, etc.
  FeedData latest = clockFeed.receive();
  if (latest.isValid()) {
    Serial.print(F("Received value from feed: ")); Serial.println(latest);
    // By default the received feed data item has a string value, however you
    // can use the following functions to attempt to convert it to a numeric
    // value like an int or float.  Each function returns a boolean that indicates
    // if the conversion succeeded, and takes as a parameter by reference the
    // output value.

    // Want some fun? Learning about "conversion from 'FeedData' to non-scalar 
    // type 'String' requested" the hard way.
    //
    // If I remember correctly, it was a casting error caused by trying to use 
    // the 'latest' variable as a String, directly.
    // The following line casts 'latest' to a string and lets us use it as 'fValue'.
    fValue = latest;
    
    if(fValue == LD_HOME) {
      Serial.println("Nashua");
      stepBySteps(STEPS_HOME);
    }
    
    if(fValue == LD_TRAVELING) {
      Serial.println("Traveling");
      stepBySteps(STEPS_TRAVELING);
    }

    if(fValue == LD_VERACODE) {
      Serial.println("Veracode");
      stepBySteps(STEPS_VERACODE);
    }
    if(fValue == LD_CHURCH) {
      Serial.println("Church");
      stepBySteps(STEPS_CHURCH);
    }
    if(fValue == LD_MORTAL_PERIL) {
      Serial.println("Mortal Peril!");
      stepBySteps(STEPS_MORTAL_PERIL);
    }
    if(fValue == LD_GLOUCESTER) {
      Serial.println("Glostah");
      stepBySteps(STEPS_GLOUCESTER);
    }
    
  } else {
    Serial.print(F("Failed to receive the latest feed value!"));
  }

}

void stepBySteps(int newPosition) {
  if(motorPosition == newPosition) {
    Serial.println("No movement required.");
    return;
  }

  long steps = newPosition - motorPosition;
  
  clockStepper.step(steps);
  motorPosition = newPosition;
  Serial.print("position should now be:" );
  Serial.println(motorPosition);
}

Morally Hazardous Technology

Posted: 3rd September 2016 by LegoDoug in Books, Home Life, Humor

1897 Van Cleve Ad

Voices were raised in protest. Bicycles were proclaimed morally hazardous. Until now, children and youth were unable to stray very far from home on foot. Now, one magazine warned, fifteen minutes could put them miles away. Because of bicycles, it was said, young people were not spending the time they should with books, and—more seriously—that suburban and country tours on bicycles were “not infrequently accompanied by seductions.”

The Wright Brothers, David McCullough

xkcd_1601_isolation

Humans don’t change, do they?

When You Marry a Lawyer’s Daughter …

Posted: 17th July 2016 by LegoDoug in Doug, Family Members, Humor, Sarah

THE REAL WORLD:

“Darling, you look radiant, today!”

(Woman beams appreciatively.)

WHEN YOU MARRY A LAWYER’S DAUGHTER:

“Darling, you look radiant, today!

(Woman waits. The Speaker continues.)

“The use of the word ‘today,’ should not by any means be interpreted as meaning that I (‘The Speaker’) do not believe you (‘The Addressee’) do not look radiant at every moment. Nor should you feel that subjective beauty is an expectation or requirement of gaining or maintaining the affection of The Speaker. The Speaker acknowledges the numerous beneficial and desirous qualities The Addressee possesses, which include, but are in no way limited to: supreme intelligence, unquestionable moral character, delightful humor, unparalleled business acumen, unassailable logic, perfect sexuality, and infallible parenting. The Addressee is the Speaker’s constant delight, his dearest companion, his partner in all ways. The Addressee is due The Speaker’s complete emotional involvement, financial remuneration, and temporal dedication. In the unlikely event of a disagreement, The Speaker preemptively cedes all possibility of correctness to The Addressee. The Speaker further acknowledges The Addressee is the solitary possessor of his undying affection and his eternal soul, world without end. Amen.”

(Woman nods in nonbinding acceptance.)

Remember Scotty’s remark about his nephew in Star Trek II: The Wrath of Khan? (No, of course you don’t.) Scotty explains to Kirk, after an inappropriately emotional response by Midshipman Preston: “My sister’s youngest, Admiral. Crazy to get to space.”

going-to-space
“Come on, R2, we’re going.”

Although I never pursued a career as an astronaut, I certainly remain, “Crazy to get to space,” and the description from Khan still resonates with me. I may yet get there, in my lifetime, especially with companies like SpaceX competing to make the cost of getting to orbit as low as possible.

For now, I’m going to have to settle for a proxy. Eliszabeth* MacDougal, one of the human family members I inherited when I married Sarah Latimer, has a friend, Cian Branco, who offered her the chance to send something small up on the Terrior Improved Orion rocket as part of the RockSat-C program. Eliszabeth realized this would be thrilling to me, and passed along her opportunity.

I ordered a new Lego R2-D2 minifigure, and a few parts to complete another mini-me as an astronaut, and shipped them off to Eliszabeth. They will be going up on Thursday, June 23, 2016, somewhere between 6:00 and 10:00 am, from the NASA facility at Wallops Island, Virginia. (My son, David, and I stood on our roof in the cold in October, 2014, to watch a night launch from Wallops.)

Geeking out!

Thank you, Eliszabeth!

New: I have just learned that my minifigs will have company on this voyage: Benny, from The Lego Movie will also be on this flight.

———————–

*Yes, this is the correct spelling.

————————

Update: (June 23, 2016)

:: sigh :: Postponed until tomorrow.

postponed

————————

Update: (June 24, 2016) I got up early to watch the launch today! In my mind, I was thinking, Saturn V. Long, slow acceleration. This is, uh, quite a bit smaller, and it zoomed upward so quickly I missed the rocket itself in the launch video screen capture. (The video will be posted soon by NASA/Wallops, anyway.) The crew was worried about missing the launch window due to weather, and debated skipping the camera alignment step. In addition to the pad camera, there was a UAV (drone) flying around, as some of the pictures below show.

The rocket got to its apogee of 119.08 km (74.0 miles) almost immediately. The payload detached successfully, and hit splashdown in the Atlantic, where it would be recovered, only 8 or 9 minutes later.

Very exciting! I reiterate my gratitude.

Here’s the official NASA post: NASA Successfully Launches Suborbital Rocket from Wallops.

kdiff3 6242016 60716 AMs

kdiff3 6242016 60327 AMs

kdiff3 6242016 60614 AMs

kdiff3 6242016 60617 AMs

————————

Update: (June 24, 2016, 16:05) Just got the official word from Cian: “Hey Doug, will send pics a bit later, currently wrecked. Your minis all went up and returned fine. I have pics of reintegration. Cheers!”

————————

Here's the recovered payload module, showing where my guys were attached in their Crew Module.

Here’s the recovered payload module, showing where my guys were attached in their “Crew Module.”

The Crew Module was carefully sealed with electrical tape.

The Crew Module was carefully sealed with electrical tape.

 Another view of the Crew Module.

Another view of the Crew Module.

Here's how the minifigures actually traveled.

Here’s how the minifigures actually traveled.

 And here they are, reassembled, along with Benny, who was glued into another part of the payload module

And here they are, reassembled, along with Benny, who was glued into another part of the payload module.

Video of the Launch:

Video from an observer to whom I am grateful.

Here is the launch from the NASA/Wallops feed!

A Republican No More

Posted: 6th May 2016 by LegoDoug in Doug, Family Members, Politics, Rants

My voter registration is now undeclared. (Sadly, no exotic options, like “Rational Anarchist” are available in New Hampshire—not even Communist.)

Man with a 1950s style fedora waves goodbye .

Goodbye, sewage-ridden idiocracy.

In a time when a voice of reason is desperately needed, your leadership has proven itself unable to take a stand against an obvious megalomaniac. You continue to propose revoking the victory of universal health care. You have protected and praised racists and worse. You have gone to war without cause, and destroyed our great nation’s international reputation. You have chosen a Presidential candidate who makes Vermin Supreme a rational choice by comparison. You have defended environmental destruction, and embraced ignorance over science.

I am saying goodbye to the sewage-ridden idiocracy the Republican Party has become. You are now, indeed, “Not my circus—not my monkeys.”

Adios.

“Sewage-ridden idiocracy,” is a phrase coined, as far as I know, by Connor Houghton.

Dear QuickBooks:

Posted: 29th February 2016 by LegoDoug in Doug, Family Members, Geekdom, Technology

Dear Intuit/QuickBooks:

When importing an IIF (Intuit Interchange Format) file, you might report “The NAME field in this file is too long” as something other than “Error on line X – You can’t change the type of a name or a add a duplicate name.” (You may recall, this is the same problem that remains unfixed from QuickBooks ’99.)

—A Customer

P.S.: Thank you for removing my online banking support, unless I choose to upgrade for several hundred dollars.

ux_fail

R2 Really Gets Around

Posted: 16th October 2015 by LegoDoug in Geekdom, Star Wars, Television

That’s right! Look who seems to be part of Lost’s Dharma Initiative.

r2-dharma

What Have We Learned, Charlie Brown?

Posted: 24th May 2015 by LegoDoug in Movies, Politics

What Have We Learned, Charlie Brown?

Quite often I think about a Charlie Brown special I saw when I was in my mid-teens, in 1983. It’s designed to continue the story of the film, Bon Voyage, Charlie Brown (and Don’t Come Back!!), and commemorates some of the events of World War I and World War II.

Linus quotes John McCrae’s In Flanders Fields. I find it nearly as moving as the recitation of Luke 2 in “A Charlie Brown Christmas.”

In Flanders fields the poppies blow
Between the crosses, row on row,
That mark our place; and in the sky
The larks, still bravely singing, fly
Scarce heard amid the guns below.

We are the Dead. Short days ago
We lived, felt dawn, saw sunset glow,
Loved and were loved, and now we lie
In Flanders fields.

Take up our quarrel with the foe:
To you from failing hands we throw
The torch; be yours to hold it high.
If ye break faith with us who die
We shall not sleep, though poppies grow
In Flanders fields.

Periodically, I’ve searched Amazon, hoping that this had been released on DVD or better (the only consumer release was on VHS video). It’s finally coming this fall, as part of Peanuts: The EMMY Honored Collection (DVD)!

Sadly, the as-I-recall-excellent Bon Voyage, Charlie Brown (and Don’t Come Back!! is still, apparently, only available on used VHS.

Android v. iPhone

Posted: 5th May 2015 by LegoDoug in Cool Sites/BLOGs, Geekdom, Humor, Star Trek

Spock, from Star Trek, looking incedulous, with a caption that reads, 'When an iPhone user sees you drop a fresh battery into your ’droid.'