Introduction: Hydro-SMS

About: MFA student at The School of Visual Arts

This is a Speculative Future project I built to broadcast text messages through a body of water using Arduino, a solenoid, a modified version of morse code, and an umbrella. The Hydro-SMS is like a portable and personal sonar system– a transceiver that allows members of a group to pass correspondence without electronic transmission or revealing their identity.

The Arduino script will translate letters to a series of 'dots' and display the letters/words in the serial monitor. There are no 'dashes' nor distinct breaks between letters in this code. The percussive sound made by the solenoid sounds like a rapid fire 'tap'. As my first deep venture into using Arduino and my first post on Instructable.

ELECTRONIC Parts list;

• Arduino UNO R3-Experimentation Kit v1.3 (from Adafruit)

• 27mm Piezo Element- vibration / knock sensor (from Tinkersphere)

• Push-Pull Solenoid- large, 12V (from Adafruit)

• TIP120 Transistor- dc voltage amplifier (from RadioShack)

• 1N4004 Diode / Rectifier- 30 amp surge, allows the current to flow only in one direction (from RadioShack)

• 2.2k Ω Resistor- red, red, red, gold (included in Arduino Kit)

• 10K Ω Resistor- brown, black, orange, gold (from SparkFun)

• LED- any color just for reference (included in Arduino Kit)

• 9Volt Battery and Connector- Qty.2 (from RadioShack)

• 7 to 10 jumper wires- (included in Arduino Kit)

HARDWARE Parts list;

• Umbrella- metal tip, fixed center post (not telescoping)

• 3/16" round steel / aluminum rod- 36" long (to extend the solenoid rod)

• M3 tap & 2.4mm pre-drill bit (tapping the extension rod)

• M4 drill bit (clearance holes for M3 screws)

• M3 screw, washer, lock washer- Qty. 2-4 to mount the solenoid

• 9/16" x .014" wall Brass Tube- (Hobby Store or Art Supply Store)

• Dial Caliper (used to measure the exact outer and inner diameter of the umbrella post and brass tube for a compression fit).

• Epoxy Putty

• 1/4" drill bit (clearance holes in the epoxy putty)

• Hacksaw & hand file- metal cutting

• Drill

• Pliers and/or ViseGrips

* Hammer

* Bench Vise

Step 1: Circuit Diagram : Code

I generated the circuit diagram by using the software tool Fritzing which was vital in helping me test the routed connections and creating the wiring diagram. The images included here are visual references to guide you in building this device. Having built some of the example sketches included in the Arduino software, I wanted to up the ante and simultaneously control a solenoid, LED, and a piezo buzzer to exhibit mechanical, visual and audible outputs.

The code is a hybrid a few scripts I discovered in my research– the majority is from the Instructable post 'Arduino Morse Code' by Chris Weatherford (bigUPS Chris!). I modified the code to include output to the serial monitor and converted the 'dash' to 'dots' because the solenoid can not mimic this type of action. The resulting "Morse Code" sounds more like a jackhammer to our ears but retains enough of a pause or break for the serial monitor to translate the string into letters.

<p>/*<br>  HydroAcoustic / HyrdoSMS Text Message (by c:rand) MAHS-UP with the Morse Code Project (by Chris Weatherford)
  
  This code will loop through a string of characters and convert these to morse code.  
  It will actuate a solenoid, convert to letters/words in the Serial Monitor, blink 
  an LED lights and play a tone through a piezo sensor.  
 */
 
 
//**************************************************//
//   Type the String to Convert to Morse Code Here  //
//**************************************************//
char stringToMorseCode[] = "type your text here";</p><p>// Create variable to define the output pins
int solenoidPin = 6; //Solenoid pin
int led12 = 12;      // blink an led on output 12
int led8 = 8;        // blink an led on output 6
int audio13 = 13;      // output audio on pin 8
int note = 900;      // music note/pitch</p><p>

/*
  Set the speed of your morse code
  Adjust the 'dotlen' length to speed up or slow down your morse code
    (all of the other lengths are based on the dotlen)</p><p>  Here are the ratios code elements:
    Dash length = Dot length x 3
    Pause between elements = Dot length
      (pause between dots and dashes within the character)
    Pause between characters = Dot length x 3
    Pause between words = Dot length x 7
  
*/
int dotLen = 50;     // length of the morse code 'dot' set fast like a jackhammer
int dashLen = dotLen * 3;    // length of the morse code 'dash'
int elemPause = dotLen;  // length of the pause between elements of a character
int Spaces = dotLen * 3;     // length of the spaces between characters
int wordPause = dotLen * 7;  // length of the pause between words</p><p>int knockSensor = A0; // underwater piezo sensor 
int val = 0; // ? i don't know what this does
int THRESHOLD = 10; // ? i don't know what this does</p><p>// the setup routine runs once when you press reset:
void setup() { 
  Serial.begin(9600);               
  // initialize the digital pin as an output for LED lights.
  pinMode(solenoidPin, OUTPUT);
  pinMode(led12, OUTPUT); 
  pinMode(led8, OUTPUT); 
  pinMode(knockSensor, INPUT);
  
}</p><p>// Create a loop of the letters/words you want to output in morse code (defined in string at top of code)
void loop()
{ 
  
  // Loop through the string and get each character one at a time until the end is reached
  for (int i = 0; i < sizeof(stringToMorseCode) - 1; i++)
  {
    // Get the character in the current position
  char tmpChar = stringToMorseCode[i];
  // Set the case to lower case
  tmpChar = toLowerCase(tmpChar);
  // Call the subroutine to get the morse code equivalent for this character
  GetChar(tmpChar);
  
  }
  
  // At the end of the string long pause before looping and starting again
  LightsOff(5000);   //wait 10 seconds  </p><p>}</p><p>// DOT
void MorseDot()
{
  digitalWrite(led12, HIGH);    // turn the LED on 
  digitalWrite(led8, HIGH);
  digitalWrite(solenoidPin, HIGH);      //Switch Solenoid ON
  tone(audio13, note, dotLen); // start playing a tone
  delay(dotLen);              // hold in this position
}</p><p>// DASH
void MorseDash()
{
  digitalWrite(led12, HIGH);    // turn the LED on 
  digitalWrite(led8, HIGH);
  digitalWrite(solenoidPin, HIGH);      //Switch Solenoid ON
  tone(audio13, note, dashLen);  // start playing a tone
  delay(dashLen);               // hold in this position
}</p><p>// Turn Off
void LightsOff(int delayTime)
{
  digitalWrite(led12, LOW);     // turn the LED off   
  digitalWrite(led8, LOW);
  digitalWrite(solenoidPin, LOW);       //Switch Solenoid OFF
  noTone(audio13);             // stop playing a tone
  delay(delayTime);             // hold in this position
}</p><p>// *** Characters to Morse Code Conversion *** //
void GetChar(char tmpChar)
{
  // Take the passed character and use a switch case to find the morse code for that character
  switch (tmpChar) {
    case 'a': 
    MorseDot();
    LightsOff(elemPause);
    Serial.print('a');
    break;
    case 'b':
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    Serial.print('b');
    break;
    case 'c':
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    Serial.print('c');
    break;
    case 'd':
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    Serial.print('d');
    break;
    case 'e':
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    Serial.print('e');
    break;
    case 'f':
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    Serial.print('f');
    break;
    case 'g':
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    Serial.print('g');
    break;
    case 'h':
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    Serial.print('h');
    break;
    case 'i':
      MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    Serial.print('i');
    break;
    case 'j':
        MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    Serial.print('j');
    break;
      case 'k':
      MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    Serial.print('k');
    break;
    case 'l':
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    Serial.print('l');
    break;
      case 'm':
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    Serial.print('m');
    break;
    case 'n':
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    Serial.print('n');
    break;
    case 'o':
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    Serial.print('o');
    break;
    case 'p':
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    Serial.print('p');
    break;
    case 'q':
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    Serial.print('q');
    break;
    case 'r':
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    Serial.print('r');
    break;
    case 's':
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    Serial.print('s');
    break;
    case 't':
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    Serial.print('t');
    break;
    case 'u':
      MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    Serial.print('u');
    break;
    case 'v':
     MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    Serial.print('v');
    break;
    case 'w':
     MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    Serial.print('w');
    break;
    case 'x':
      MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    Serial.print('x');
    break;
    case 'y':
      MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    Serial.print('y');
    break;
    case 'z':
       MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    MorseDot();
    LightsOff(elemPause);
    Serial.print('z');
    break;
    default: 
    // If a matching character was not found it will default to a blank space
    LightsOff(Spaces);      
  }
}</p><p>/* 
  Unlicensed Software:
  
  This is free and unencumbered software released into the public domain.</p><p>  Anyone is free to copy, modify, publish, use, compile, sell, or
  distribute this software, either in source code form or as a compiled
  binary, for any purpose, commercial or non-commercial, and by any
  means.</p><p>  In jurisdictions that recognize copyright laws, the author or authors
  of this software dedicate any and all copyright interest in the
  software to the public domain. We make this dedication for the benefit
  of the public at large and to the detriment of our heirs and
  successors. We intend this dedication to be an overt act of
  relinquishment in perpetuity of all present and future rights to this
  software under copyright law.</p><p>  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
  OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  OTHER DEALINGS IN THE SOFTWARE.</p><p>
*/</p>




<br>

Step 2: Prototype & Percussion Tests

Before connecting the solenoid, the LED was the primary output while I worked out the code and circuitry. Afterwards, I tested the solenoid and the sound of metal striking metal above and under water. When the system was functioning properly, I began retrofitting an umbrella to disguise and contain the solenoid. Rather than containing the solenoid in the tip of the umbrella, I mounted it to the handle to keep it far away from water and avoid electric shock (user discretion is advised when electricity is used near or around water).

Step 3: Umbrella Modification

This particular giant umbrella was chosen based on 3 criteria; non-telescoping center post, the locking mechanism and slide does not obstruct passage through the post, and it has a metal tip. Remove the foam handle grip and hacksaw cut the umbrella post about 2" from the interior top-end (photo #1).

Fill both ends of the post with epoxy putty and drill a 1/4" hole (photo #2 left). This will guide the solenoid extension rod so it doesn't rattle around, doesn't touch the umbrellas locking mechanism, and strikes the center of the umbrella tip. This step is important to the transmission of sound/vibration.

Drill a 2.4mm hole in the center of the extension rod and tap it to M3 (photo #2 right). I added two small rubber o-rings to the solenoid shaft so to dampen the sound it made against the housing when extended and retracted. Connect the rod to the solenoid by unscrewing the end piece (be careful NOT to scar the solenoid's rod with the pliers). A 36" long rod worked perfectly however it may need to be shortened based on the umbrella you use.

I used a dial caliper to measure the outer diameter of the umbrella post (photo #3) and to then select the proper sized metal tube that is used to mend the severed tube after the epoxy putty was added. The ID of the brass tube is 10/1000" smaller than the umbrella posts OD and provides a perfect compression fit so that no adhesive or soldering is required. A rubber mallet was nearly needed to hammer the two tubes together). Cut a 3" long piece of the brass tube and use it to mend the post back together near the tip end (photo #4).

Step 4: Solenoid Bracket

This photo illustrates the 6 steps required to form the brass tube into the mounting bracket. The solenoid was mounted to the end of the handle without adhesive or soldier. While held in a vise, the brass was cut, bent and folded using a pliers or a hammer. M3 screws, washers and lock-washers were used to secure the solenoid to the bracket. I connected the extension rod to the solenoid first, before compressing the bracket onto the butt-end of the umbrella post. For longevity of use, I wish the wall of the brass tube was twice as thick with the same inner diameter.

Step 5: Testing the System

Everything is functioning perfectly now. Time to take it to Central Park in Manhattan and shoot a video which will sensationalize this system being used as a transceiver– to broadcast and receive text messages with piezoelectric sensors integrated into the circuitry and code.

Step 6: Final Video & Next Steps

Next Steps

Rather than entering the message into the code, I would make it interface with a smartphone and restrict use only when the phone is in airplane mode.

With the broadcast side of the device complete, the next development is to actualize the receiver part of the system. A few piezo sensors would be mounted to the inside of the umbrella membrane would 'listen' and translate the sounds back into text making this a real transceiver. Back in 2010, raron's blahg describes a morse de & encode he built using Arduino and piezo buzzers that he tests up to 400 words per minute. This would be the basis from which I continue.

It would be great if other people took my post as inspiration to create more hydro-acoustic AND personal sonar systems! There is a lot of room for growth, development and refinement of what is posted here.

Hope you enjoyed this Speculative Future project, I surely did!

-Chris -•-• •••• •-• •• •••

Further info is posted on my class blog. Check it out

First Time Authors Contest 2016

Participated in the
First Time Authors Contest 2016