I have an assignment and the details are below

Module learning outcomes assessed by this task:
1.Implement and evaluate Ontology Web Language (OWL) based ontologies using industry standard tools and create Resource Description Framework (RDF) models conforming to these.
2.Contrast and critique the uses of linked, open data in industry and be fully conversant with best practices in enabling Linked Open Data.
3.Create semantic models in an appropriate language and using appropriate tools.
4.Create optimised semantic web queries to extract data from the semantic web and subsequently visualise results in novel situations.
5.Synthesise evidence on technical challenges, developments and enabling technologies surrounding the development of the Internet of Things (IoT).
Completing your assessment 
What am I required to do on this assessment?
This is an individual assignment requiring you to design and build a smart thing, a sensor node, using an Arduino and sensor(s) of your choosing. Data recorded over a representative period of time will be uploaded to ThingSpeak where it can be visualised. You will also add suitable “thing description” metadata to augment the data. This will be accompanied by a 2000 word write-up, explaining your approach and your reflections upon it.

Your report will cover the following points:
Include a cover page with your name and student ID.
Describe the hardware design of a smart thing that you have constructed, using the Arduino and a specific sensor (or sensors).
Include your code in an appendix to your report. 
Upload a representative set of data to the cloud, using ThingSpeak (MathWorks, Inc, 2021), and share a link to your channel.
You will use the W3C Web of Things (WoT) JSON-LD Thing Description (W3C, 2020) to create channel metadata.
Your report should include data visualisations of your ThingSpeak channel.
Use reflective writing.
Use UWE Harvard referencing throughout.

Sharing your ThingSpeak channel
1.Create your channel at thingspeak.com
2.In Channels > MyChannel > select your channel
3.On the ‘Sharing’ tab select “Share channel view with everyone.”
4.Open the ‘public view’ tab 
5.Copy the URL in the browser address bar into your report.

Where should I start?
You will create your own IoT smart sensor node, upload your data to the cloud, then make it available as Linked Open Data using suitable metadata.
What do I need to do to pass? 
The pass mark is 50%.
How do I achieve high marks in this assessment? 
Students will be assessed on their ability to express their design in a report of approximately 2,000 words excluding references. References should be provided and presented in UWE Harvard style. Students will be assessed on their ability to explain their design choices clearly and succinctly. 


Your assessment will be marked according to the following marking criteria.
Hardware design of a smart thing that you have constructed, using Arduino and sensor(s) (20%) - Must have a Great introduction and background. Excellent description of your hardware design.
Clear, commented Arduino software (20%). -  Software design evidencing thinking outside the box.
Your data will be available in the cloud, in a ThingSpeak channel (20%). - Representative data from multiple related sensors. Great explanatory text.
Your thing description metadata, added as ThingSpeak metadata (20%). - Excellent thing description describing your smart thing and its sensors, published on ThingSpeak.
Clarity of your write-up and reflections (20%). - Excellent explanatory text and Harvard referencing.




Now, the smart thing i have created is a  geofence, which uploads the longitude and latitude of the device it is inside  to the thinkspeak channel at specific intervals.

The arduino Code is below

#include <Arduino.h>
#include <SoftwareSerial.h>
#include <ESP8266WiFi.h>
#include <TinyGPS++.h>
#include <ThingSpeak.h>


//Setup Wifi
const char* ssid = "Ayoola";
const char* pass = "olamide12121";
int channelNumber = 1;
const char* apiKey = "F2S7QI26BH7KJ4J5";
WiFiClient client;


SoftwareSerial neogps(D4,D3);
TinyGPSPlus gps;

//#define BUZZER 4
#define green 5
#define yellow 16

// Size of the geo fence (in meters)
const float maxDistance = 30;
float initialLatitude = 0;
float initialLongitude = 0;
float latitude, longitude;
bool gpsTest = false;
bool gsmTest;
float distance;




void sendData(){
  int x = ThingSpeak.writeField(1, 1, distance, apiKey);
  if(x == 200){
      Serial.println("Channel update successful.");
    }
    else{
      Serial.println("Problem updating channel. HTTP error code " + String(x));
    }
}



void setupWifi(){
  if (WiFi.status() != WL_CONNECTED){
    while (WiFi.status() != WL_CONNECTED){
      WiFi.begin(ssid, pass);
      Serial.print(".");
      digitalWrite(green, 1);
      delay(1000);
      digitalWrite(green, 0);
      delay(5000);

    }
  
  }
}



float getDistance(float flat1, float flon1, float flat2, float flon2) {

  // Variables
  float dist_calc=0;
  float dist_calc2=0;
  float diflat=0;
  float diflon=0;

  // Calculations
  diflat  = radians(flat2-flat1);
  flat1 = radians(flat1);
  flat2 = radians(flat2);
  diflon = radians((flon2)-(flon1));

  dist_calc = (sin(diflat/2.0)*sin(diflat/2.0));
  dist_calc2 = cos(flat1);
  dist_calc2*=cos(flat2);
  dist_calc2*=sin(diflon/2.0);
  dist_calc2*=sin(diflon/2.0);
  dist_calc +=dist_calc2;

  dist_calc=(2*atan2(sqrt(dist_calc),sqrt(1.0-dist_calc)));
  
  dist_calc*=6371000.0; //Converting to meters

  return dist_calc;
}


void getGps(float& latitude, float& longitude)
{
  // Can take up to 60 seconds
  boolean newData = false;
  for (unsigned long start = millis(); millis() - start < 2000;){
    while (neogps.available()){
      if (gps.encode(neogps.read())){
        newData = true;
        break;
      }
    }
  }
  
  if (newData) //If newData is true
  {
    latitude = gps.location.lat();
    longitude = gps.location.lng();
    Serial.println(latitude);
    Serial.println(longitude);
    newData = false;
  }
  else {
    Serial.println("No GPS data is available");
    latitude = 0;
    longitude = 0;
  }
}


void gpsSetup(float& latitude, float& longitude)
{
  // Can take up to 60 seconds
  boolean newData = false;
  for (unsigned long start = millis(); millis() - start < 2000;){
    while (neogps.available()){
      if (gps.encode(neogps.read())){
        newData = true;
        break;
      }
    }
  }
  
  if (newData) //If newData is true
  {
    
    float initialLatitude1 = gps.location.lat();
    float initialLongitude1 = gps.location.lng();
    Serial.println(initialLatitude1);
    Serial.println(initialLongitude1);
    newData = false;
    if (initialLatitude1 == 0){
      gpsTest = false;
    }
    else{
      gpsTest = true;
    }
  }
  else {
    Serial.println("No GPS data is available");
    latitude = 0;
    longitude = 0;
    gpsTest = false;
  }
}


void setup()
{
  Serial.begin(9600);
  neogps.begin(9600);
  
  //pinMode(BUZZER, OUTPUT);
  pinMode(green, OUTPUT);
  pinMode(yellow, OUTPUT);

  digitalWrite(green, 1);
  digitalWrite(yellow, 0);
  
  while (gpsTest != true){
    gpsSetup(latitude, longitude);
    Serial.println("Connecting gps to satellite...");
    digitalWrite(green, 1);
    delay(500);
    digitalWrite(green, 0);
    delay(500);
  }
  WiFi.mode(WIFI_STA);
  setupWifi();
  delay(2000);
    initialLatitude = gps.location.lat();
    initialLongitude = gps.location.lng();
    Serial.println(initialLatitude);
    Serial.println(initialLongitude);
  Serial.println("GPS locked to the satellite");
  Serial.println("Done with gps test");
  
  ThingSpeak.begin(client);
  digitalWrite(green, 1);
  
  
}


void loop()
{
  //--------------------------------------------------------------
  getGps(latitude, longitude);
  //--------------------------------------------------------------
  distance = getDistance(latitude, longitude, initialLatitude, initialLongitude);
  //--------------------------------------------------------------
  Serial.print("Latitude= "); Serial.println(latitude, 6);
  Serial.print("Lngitude= "); Serial.println(longitude, 6);
  Serial.print("initialLatitude= "); Serial.println(initialLatitude, 6);
  Serial.print("initialLngitude= "); Serial.println(initialLongitude, 6);
  Serial.print("current Distance= "); Serial.println(distance);
  if(distance > maxDistance) {
    digitalWrite(yellow, 1);
  }
  else{
    digitalWrite(yellow, 0);
  }
  sendData();
  Serial.print(".");
 
}



Now, as comprehensively detailed as possible, generate a structure to write the report to the highest level of academic literacy.