/* Sea-buoy-5A Dette kodeeksempelet kobler opp mot en webserver ved hjelp av et MKR NB 1500 kort. Koden henter data fra både ENV-kortet, GPS-kortet og DS18B20 som måler vanntemp. Koden legger dataene på URL-adressen "http://sensor.marin.ntnu.no" samtidig som den skriver måledatene til Seriemonitoren. Koden kjøres helt til den stoppes. Data skrivs inn kunn skilt med komma og med topptekst. Circuit: - MKR NB 1500 board - MKR ENV - MKR GPS - DS18B20 (vanntemp) - Antenne - SIM-kort Utviklet av Tom Igor 08.03.12 Modifisert av Håvard Holm 2021 Modifisert av Nils Kr. Rossing 08.09.22 */ // libraries #include #include #include #include #include // Lager objekt for måling av vanntemperatur DS18B20 ds(0); //Sensoren er koblet til pinne D0 uint8_t address[] = {40, 250, 31, 218, 4, 0, 0, 52}; uint8_t selected; // PIN Number const char PINNUMBER[] = ""; // initialize the library instance NBClient client; GPRS gprs; NB nbAccess; // URL, path og port char server[] = "sensor.marin.ntnu.no"; char path[] = "/cgi-bin/tof.cgi?"; int port = 80; // port 80 er default for HTTP // Deklarasjon av sensorvariabler fra ENV-kort float temperature = 0; float humidity = 0; float pressure = 0; float illuminance = 0; // Deklarer sesnsorvariable fra vannsensorer float w_temperature = 0; // Deklarasjon av sensorvariabler fra GPS-kort float latitude; float longitude; float altitude; float speed; unsigned long epochTime; int satellites; long no = 0; // Deklarasjon av buffer for dataoverføring char buffer[256]; boolean connected = false; // Status oppkobling void setup() { Serial.begin(9600); // Initialiser monitoren while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } Serial.println("Sea-buoy-5A"); // Initialiserer MKR ENV-kortet if (!ENV.begin()) { Serial.println("Failed to initialize MKR ENV shield!"); while (1); } // Initialiserer MKR GPS-kortet if (!GPS.begin()) { Serial.println("Failed to initialize GPS!"); while (1); } // Initialiserer DS18B20 - måling av vanntemperatur selected = ds.select(address); // Skriv ut topptekst connectToGPRS(); Serial.println("Kobler til og overfører topptekst"); connectToServerWriteHeaderText(); checkServerMessage(); delay(2000); } void loop() { no++; readGPSdata(); // Les GPS-posisjon mm readENVdata(); // Les ENV-målinger readWaterData(); // Les av sensorer i vann sprintf(buffer, "Gr-no, no=%d,time=%d,lon=%.6f,lat=%.6f,C_luft=%.1f,C_vann=%.1f,hum=%.1f,pres=%.1f,light=%.1f", no, epochTime, longitude, latitude, temperature, humidity, pressure, illuminance, w_temperature); // Legg måleverdier inn i bufferet Serial.println(buffer); connectToGPRS(); // Koble opp til GPRS nettverket med APN, login og passord Serial.print("Kobler til og overfører data: "); Serial.println(no); connectToServer(); // Om det oppnås forbindelse overføres data checkServerMessage(); delay(5000); } void connectToGPRS() { // Koble opp til GPRS nettverket med APN, login og passord Serial.println("Starter Arduino web-client."); while (!connected) { if ((nbAccess.begin("", true, true) == NB_READY) && (gprs.attachGPRS() == GPRS_READY)) { connected = true; Serial.println("Tilkoblet GPRS"); } else { Serial.println("Ikke tilkoblet GPRS"); delay(1000); } } } void connectToServer() { // Koble opp til server og send over data, varsler om oppkobling mislykkes if (client.connect(server, port)) { Serial.println("Tilkoblet server"); client.print("GET "); // Gjør et HTTP request: sprintf(buffer, "/cgi-bin/tof.cgi?Gr-no,%d,%d,%.6f,%.6f,%.1f,%.1f,%.1f,%.1f,%.1f", no, epochTime, longitude, latitude, temperature, humidity, pressure, illuminance, w_temperature); // Legg måleverdier inn i bufferet client.print(buffer); client.println(" HTTP/1.1"); client.print("Host: "); client.println(server); client.println("Connection: close"); client.println(); } else { Serial.println("Mislykket tilkobling til server"); // Dersom tilkobling mislyktes } } void checkServerMessage() { // Dersom det er innkommende data fra serveren, les dem og skriv dem ut if (client.available()) { Serial.print((char)client.read()); } // Dersom serveren er frakoblet stopp klienten: if (!client.available() && !client.connected()) { Serial.println(); Serial.println("Kobler fra klienten"); client.stop(); } } void readGPSdata() { while (!GPS.available()) {} // read GPS values latitude = GPS.latitude(); longitude = GPS.longitude(); altitude = GPS.altitude(); speed = GPS.speed(); epochTime = GPS.getTime(); satellites = GPS.satellites(); // print GPS values Serial.print("Location: "); Serial.print(latitude, 7); Serial.print(", "); Serial.println(longitude, 7); Serial.print("Altitude: "); Serial.print(altitude); Serial.println("m"); Serial.print("Ground speed: "); Serial.print(speed); Serial.println(" km/h"); Serial.print("Number of satellites: "); Serial.println(satellites); Serial.println(); } void readENVdata() { Serial.println("Leser miljo-data"); temperature = ENV.readTemperature(); humidity = ENV.readHumidity(); pressure = ENV.readPressure() * 10; // Fra kPa til mBar illuminance = ENV.readIlluminance(); // Skriv ut hver av sensor måleverdiene Serial.print("Temperature = "); Serial.print(temperature); Serial.println(" °C"); Serial.print("Humidity = "); Serial.print(humidity); Serial.println(" %"); Serial.print("Pressure = "); Serial.print(pressure); Serial.println(" mBar"); Serial.print("Illuminance = "); Serial.print(illuminance); Serial.println(" lx"); // print an empty line Serial.println(); } void readWaterData() { w_temperature = ds.getTempC(); Serial.print("Vanntemperature er: "); Serial.print(ds.getTempC()); Serial.println(" C"); } void connectToServerWriteHeaderText() { // Koble opp til server og sender over topptekst if (client.connect(server, port)) { Serial.println("Tilkoblet server"); client.print("GET "); // Gjør et HTTP request: sprintf(buffer, "/cgi-bin/tof.cgi?Gr-no,Nr.,Tid,Lengdegrad,Breddegrad,Lufttemp.,Luftfukt.,Lufttrykk,Vanntemp."); // Legg overskrift inn i bufferet client.print(buffer); client.println(" HTTP/1.1"); client.print("Host: "); client.println(server); client.println("Connection: close"); client.println(); } else { Serial.println("Mislykket tilkobling til server"); // Dersom tilkobling mislyktes } }