was successfully added to your cart.
Category

Programming

Ubidots ISS

By | Electronics, Engineering, Programming | No Comments

I discovered the really cool ISS live stream recently. I thought it would be good to show my son on his raspberry PI and make an alert light/sound when it was over our home see if we could see it.

I looked at making a Google map with their API then discovered Ubidots. An Internet of Things innovation for maker. Not knowing a thing about CURL i followed some of their examples in the docs and thought id document my progress here.

Step 1. Open an account and follow these tutorials here http://ubidots.com/docs/get_started/quickstart/tutorial-collections.html NOTE* I tried and failed using the CURL Windows package install and use Cygwin to execute the commands. This allowed me to get a basic understanding of Ubidots.

Step 2. I then moved on to http://blog.ubidots.com/live-tracking-the-international-space-station where i plan to develop the code to trigger a light or sound when the ISS  is nearby our given location. The original code is below and i didn’t really know where to start with it,  i emailed Ubidots support who replied super quick that it was a python script that would need to be run locally with Python 2.7 which you can download here

Step 3. Once you have installed Python on your machine (mine was Windows) You have to install an additional ubidots API client package from here. I again used Cygwin as it just seems to work better using this command.  If you are copying and pasting the command remember to omit the dollar sign!

$ pi install ubidots==1.6.1

Step 4. Sign up for an account at Ubidots and get your API key found in your profile in the left hand menu. Make a note of this

API Key 364d3bd15af284a95a4cc0cd4fd907bf25301366
Token ftL4B1gzPmFzoch08ZaVs4elPYMDym

Step 5. Open up Cygwin and request a token by using this command. Make a note of it in Notepad* Ive noticed you can request an auth token when viewing your API key in your profile too

curl -XPOST -H "X-Ubidots-ApiKey: fee9a80a51d6523cd41bbec803b9f97850e7673a" http://things.ubidots.com/api/v1.6/auth/token

Step 6. Go to Ubidots and create a new source, call it something like ISS tracker. Then create a variable of that source named Local Distance. Hover over the ‘I’ circle on the top right of the box and make a note of the variable ID 54c9552b76254241a053980e

For control variable – http://translate.ubidots.com/api/postvalue/?token=sbyKW29lNkm1YlM2haxxvEl10EfCUxrF04gw9c1eBiLrq6CGYRAZgqAwRTBn&variable=54ca56747625421b373d7bd3&value=1

Step 7.You now have the crucial info to set up your alert. Replace the api = ApiClient value with your API key. Replace the = api.get_variable with your variable ID above

Change the my_lat = 42.3581 my_long = 71.0636 to your location heres an easy way to find them out http://www.latlong.net/

Swell Dials

By | Arduino, Electronics, Engineering, Programming, Surfing | No Comments

This is an arduino project to visualise ocean data wave height/swell period & local wind from any surfing location on magicseaweed

/*
Simple Client Parsing sketch
 Arduino 1.0 version
 */
#include <String.h>
#include <SPI.h>
#include <Ethernet.h>
#include <Servo.h>
Servo swell;
Servo period;
Servo wind;
byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
char serverName[] = "festivalnet.co.uk";
EthernetClient client;
int swellval,periodval;
String readString = String(3);
void setup()
{
  Serial.begin(9600);
  
  swell.attach(6);
  period.attach(7);
  wind.attach(8);
  
 
  if(Ethernet.begin(mac) == 0) { // start ethernet using mac & IP address
    while(true) // no point in carrying on, so stay in endless loop:
      ;
  }
  delay(2000); // give the Ethernet shield 2 second to initialize
}
void loop()
{
  client.println("Refresh: 86400");
  
  if (client.connect(serverName, 80)>0) {
    client.println("GET http://magicseaweed.com/syndicate/rss/index.php?id=1&unit=uk ");//If a connection is made get in the desired page
    //client.println("GET http://festivalnet.co.uk/surf.rss");
  }
  
  if (client.connected()) {
    if(client.find("Swell :: ")){//look for first rating and store the result to day1
      swellval = client.parseInt();
      swellval = map(swellval,0,12,0,180);
      swell.write(swellval);
    }
    if(client.find("@ "))
    {//look for second rating and store the result to day2
      periodval = client.parseInt();
      periodval = map(periodval,0,14,0,180);
      period.write(periodval);
    }
    if(client.find("mph"))
    {//look for third rating and store the result to day3
      char c = client.read();
        if(readString.length()<3)
        {
          readString.concat(c);
        }
          if (readString.indexOf("NNE")>=0)
          {
            wind.writeMicroseconds(1062);
          }
          if (readString.indexOf("NE")>=0)
          {
            wind.writeMicroseconds(1125);
          }
          if (readString.indexOf("ENE")>=0)
          {
            wind.writeMicroseconds(1187);
          }
          if (readString.indexOf("E")>=0)
          {
            wind.writeMicroseconds(1250);
          }
          if (readString.indexOf("ESE")>=0)
          {
            wind.writeMicroseconds(1312);
          }
          if (readString.indexOf("SE")>=0)
          {
            wind.writeMicroseconds(1375);
          }
          if (readString.indexOf("SSE")>=0)
          {
            wind.writeMicroseconds(1437);
          }
          if (readString.indexOf("S")>=0)
          {
            wind.writeMicroseconds(1500);
          }
          if (readString.indexOf("SSW")>=0)
          {
            wind.writeMicroseconds(1562);
          }
          if (readString.indexOf("SW")>=0)
          {
            wind.writeMicroseconds(1625);
          }
          if (readString.indexOf("WSW")>=0)
          {
            wind.writeMicroseconds(1687);
          }
          if (readString.indexOf("W")>=0)
          {
            wind.writeMicroseconds(1750);
          }
          if (readString.indexOf("WNW")>=0)
          {
            wind.writeMicroseconds(1812);
          }
          if (readString.indexOf("NW")>=0)
          {
            wind.writeMicroseconds(1875);
          }
          if (readString.indexOf("NNW")>=0)
          {
            wind.writeMicroseconds(1937);
          }
          if (readString.indexOf("N")>=0)
          {
            wind.writeMicroseconds(2000);
          }
    }
    else {
      client.stop();//else disconnect
      delay(1000);
    }
  }else{
    digitalWrite(13,HIGH);
  }
  

  client.stop();//Disconnect
}







Here is the illustrator file for the gauges that im planning to be laser engraved https://www.dropbox.com/s/kqlo390j8pi5dgo/guages.ai?dl=0

To test the design I printed the dials onto t-shirt transfer paper and ironed them on to some 18mm MDF that i had lying around.

surf-dial

I also added a LED to blink once optimum surfing conditions are happening

surf-dial-1

Rear view of the mdf showing cutouts for the 3 x Tower Pro micro 9g servos, the wind direction indicator is a FSR90 continuous servo to allow 360 rotation.

surf-dial-2

It is still in development and ill update progress here

https://github.com/Make-Magazine/DataDialDisplay