hillarybasile
Published © GPL3+

International Space Station tracker

Hit the reset/update button to get the current longitude and latitude coordinates of the International Space Station, parse data from JSON

IntermediateFull instructions provided1,786
International Space Station tracker

Things used in this project

Hardware components

ESP 8266
×1
Graphic OLED, 128 x 64 Pixels
Graphic OLED, 128 x 64 Pixels
×1
Female/Female Jumper Wires
Female/Female Jumper Wires
×1

Software apps and online services

Arduino IDE
Arduino IDE

Story

Read more

Schematics

node mcc esp 8266 with 128 x 64 OLED

Code

ISS tracker

C/C++
Use the reset button to update the coordinates. The JSON file updates very often, perhaps as fast as once per second.
#include <Adafruit_SSD1306.h>
#include <splash.h>
#include <Adafruit_GrayOLED.h>
#include <gfxfont.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SPITFT.h>
#include <Adafruit_SPITFT_Macros.h>
#include <SPI.h>
#include <Wire.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

#define OLED_RESET -1
#define SCREEN_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#include "USE_ESP8266.h"
#include <TimeLib.h>
char server [] = "api.open-notify.org";
void digitalClockDisplay();

void setup ()
{
display.begin(SSD1306_SWITCHCAPVCC, 0X3C);
display.clearDisplay ();

  Serial.begin(115200);
  if (!configureNetwork()) //start the network
  {
    Serial.println("Failed to configure the network");
    while(1)
    {
      delay(0); //halt; ESP8266 does not like infinity loop without a delay
    }
   }
int ret = client.connect(server, 80);
if (ret == 1)
{
  Serial.println("Connected");
  client.println("GET /iss-now.json HTTP/1.0"); //the http request
  client.print("Host: "); client.println(server);
  client.println("Connection: close");
  client.println();
}
else
{
  Serial.println("Connection failed, error was: ");
  Serial.print(ret, DEC);
  while(1)
  {
    delay(0); //halt; esp8266 does not like infinite loop without a delay
  }
 }
}

char timestampMarker[] = "\"timestamp\":";
char posMarker[] = "\"iss_position\":";

void loop ()
{
  if (client.available())
  {
    String id = client.readStringUntil('"');
    if (id.equals("timestamp")) //start of timestamp
    {
      if (client.find(':')) //a ":" follows each identifier
      {
      unsigned long timestamp = client.parseInt();
      setTime(timestamp);
      digitalClockDisplay();
      
      }
      else
      {
        Serial.println("failed to parse timestamp.");
      }
    }
    if (id.equals("iss_position")) //start of position data
    {
      if (client.find(':')) 
      {
       display.setTextSize(1);
  display.setTextColor(WHITE);
 
  while(client.peek () != '}' && client.find('"')) {
      String id = client.readStringUntil ('"');
      float val = client.parseFloat ();
      client.find ('"');
      Serial.print(id + ":"); Serial.println(val, 4);

      if(id == "longitude"){
         display.setCursor(0,20);
         display.print("longitude:");
         display.setCursor(0,30);
         display.print(val);
      }
      if(id == "latitude"){
         display.setCursor(0,40);
         display.print("latitude:");
         display.setCursor(0,50);
         display.print(val);
      }
  }//end while
  display.display();
      }
      else
      {
        Serial.print("Failed to parse position data.");
      }
    }
  }
if (!client.connected())
  {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
    while(1)
  {
    delay (0); //halt, esp8266 does not like loop w/o delay
  }
 }
}
String padDigits(int digit)
{
  String str = String("0") + digit; //put a zero in front of digit
  return str.substring(str.length() - 2);
}

void digitalClockDisplay ()
{
  String datestr = String(year()) + "-" + padDigits(month()) +
                   "-" + padDigits(day());
  String timestr = String(hour()) + ":" + padDigits(minute()) +
                   ":" + padDigits(second());
  Serial.println(datestr + " " + timestr);
 
}

Credits

hillarybasile
1 project • 0 followers
Contact

Comments

Please log in or sign up to comment.