IoT Μετεωρολογικός Σταθμός & Σεισμογράφος ΕΠΑΛ Ναυπάκτου 1ο ΕΠΑΛ Ναυπάκτου Έργο για τον 3ο ΠΑΝΕΛΛΗΝΙΟ ΔΙΑΓΩΝΙΣΜΟ ΑΝΟΙΧΤΩΝ ΤΕΧΝΟΛΟΓΙΩΝ
Τα τελευταία χρόνια όλο και πιο συχνά όλο και πιο έντονα οι επιστήμονες και οι πολιτικοί αναφέρονται στην υπερθέρμανση του πλανήτη λόγω του φαινομένου του θερμοκηπίου. Οι Συνέπειες του φαινομένου του θερμοκηπίου είναι αισθητές σε παγκόσμια κλίμακα! Οι σημαντικότερες συνέπειες της θέρμανσης του πλανήτη (global warming) είναι:
- Λιώσιμο των πάγων των πόλων
- Θέρμανση ωκεανών
- Ανύψωση της στάθμης των ωκεανών που θα φανούν περισσότερο κατά τη διάρκεια του 21 αιώνα.
- Εκδήλωση βίαιων ατμοσφαιρικών φαινομένων (καταιγίδες, έντονες βροχοπτώσεις, έντονες ξηρασίες κ.λ.π.)
- Περισσότερη εξάτμιση Ξηρασία, διάβρωση του εδάφους, καταστρεπτικές πυρκαγιές… Η πρώτη προσπάθεια αντιμετώπισης του φαινομένου σε παγκόσμιο επίπεδο ήταν το Πρωτόκολλο του Κιότο
- Yπογράφηκε το 1997 από 84 χώρες
- Tέθηκε σε ισχύ το 2005 και μέχρι σήμερα έχει κυρωθεί από 152 κράτη
- Είναι το πρώτο βήμα μιας σχεδόν διεθνούς συνεργασίας για την προστασία του περιβάλλοντος.
- Ρυθμίζει τις εκπομπές έξι αερίων που θεωρούνται σήμερα υπεύθυνα για το φαινόμενο του θερμοκηπίου: CO2, CH4 N2O, HFCs –hydrofluorocarbons, PFCsperfluorocarbons, SF6.
- Πιθανολογείται ότι, λόγω της αύξησης της συγκέντρωσης του CO2 θα αυξηθεί η θερμοκρασία της Γης κατά 3-6 0 C στη διάρκεια του 21ου αιώνα.
- Ήδη, η μέση θερμοκρασία της ατμόσφαιρας στην επιφάνεια της Γης αυξήθηκε κατά 0,75±0,18 0C στο διάστημα 1905-2005.
Το επόμενο Βήμα είναι η Συμφωνία για το κλίμα στο Παρίσι (13/12/2015)
- Αντικαθιστά το Πρωτόκολλο του Κιότο και είχε την ομόφωνη έγκριση 195 χωρών.
- Τα μέτρα που υιοθετήθηκαν αποβλέπουν στον περιορισμό της αύξησης της παγκόσμιας θερμοκρασίας και στην αποσύνδεση των εθνικών οικονομιών από τα ορυκτά καύσιμα.
- Προβλέπει: Α) Συγκράτηση της ανόδου της θερμοκρασίας μέχρι το 2100 «αρκετά κάτω» από τους 2 oC και «προσπάθεια περιορισμού της» ακόμα περισσότερο, στον 1,5 oC έναντι της προβιομηχανικής εποχής (πρωτεύων στόχος αυτής της διάσκεψης). Β) Μηδενικές εκπομπές αερίων του θερμοκηπίου το 2ο μισό του αιώνα. Γ) Ένα αυστηρότερο σύστημα για να παρακολουθεί αν τα έθνη κρατούν τις υποσχέσεις τους
Αναμενόμενα αποτελέσματα – στόχοι
Με τα μέτρα αυτά:
- Θα μειωθεί κάπως η πιθανότητα κατάρρευσης ενός από τα στρώματα πάγου, το οποίο θα μπορούσε να προκαλέσει μια άνοδο της θάλασσας κατά ∼6 m.
- Ήδη, ο πλανήτης είναι περίπου 1 οC θερμότερος σε σχέση με τη μέση επιφανειακή θερμοκρασία πριν από τη Βιομηχανική Εποχή.
- Το 2016 ήταν το θερμότερο έτος στην καταγεγραμμένη ιστορία, σπάζοντας το ρεκόρ της προηγούμενης χρονιάς
- Τα 10 θερμότερα χρόνια σε μια παγκόσμια καταγραφή από το 1880 έχουν συμβεί μετά από το 1998.
Στο πλαίσιο αυτό, και θέλοντας σαν σχολείο να προσθέσουμε την δική μας πινελιά στην προστασία του περιβάλλοντος αποφασίσαμε να δημιουργήσουμε τον δικό μας μετεωρολογικό σταθμό με τεχνολογία internet of the things.
Ξεκινήσαμε τον μετεωρολογικό σταθμό μας με το Arduino IoT Cloud και το MKR IoT Carrier.
Οι ενσωματωμένοι αισθητήρες παρέχουν χρήσιμες πληροφορίες για τις τοπικές καιρικές συνθήκες, οι οποίες μπορούν να παρακολουθούνται σε πραγματικό χρόνο.
Διαμόρφωση του Arduino IoT Cloud
Το πρώτο βήμα σε αυτό το έργο είναι η δημιουργία ενός Αντικειμένου και Μεταβλητών, ακολουθώντας τις παρακάτω οδηγίες:
1. Προχωράμε στο Arduino IoT Cloud.
2. Δημιουργούμε ένα νέο Αντικείμενο και προσθέστε τις ακόλουθες μεταβλητές:
https://create.arduino.cc/iot/things
Έτσι δημιουργήσαμε και το παρακάτω πρόγραμμα.
#include “thingProperties.h”
#include <Arduino_MKRIoTCarrier.h>
MKRIoTCarrier carrier;
void setup() {
// Initialize serial and wait for port to open:
Serial.begin(9600);
// This delay gives the chance to wait for a Serial Monitor without blocking if none is found
delay(1500);
// Defined in thingProperties.h
initProperties();
// Connect to Arduino IoT Cloud
ArduinoCloud.begin(ArduinoIoTPreferredConnection);
//Get Cloud Info/errors , 0 (only errors) up to 4
setDebugMessageLevel(2);
ArduinoCloud.printDebugInfo();
//Wait to get cloud connection to init the carrier
while (ArduinoCloud.connected() != 1) {
ArduinoCloud.update();
delay(500);
}
delay(500);
CARRIER_CASE = false;
carrier.begin();
carrier.display.setRotation(0);
delay(1500);
}
void loop() {
ArduinoCloud.update();
carrier.Buttons.update();
while(!carrier.Light.colorAvailable()) {
delay(5);
}
int none;
carrier.Light.readColor(none, none, none, light);
temperature = carrier.Env.readTemperature();
humidity = carrier.Env.readHumidity();
pressure = carrier.Pressure.readPressure();
if (carrier.Buttons.onTouchDown(TOUCH0)) {
carrier.display.fillScreen(ST77XX_WHITE);
carrier.display.setTextColor(ST77XX_RED);
carrier.display.setTextSize(2);
carrier.display.setCursor(30, 110);
carrier.display.print(“Temp: “);
carrier.display.print(temperature);
carrier.display.print(” C”);
}
if (carrier.Buttons.onTouchDown(TOUCH1)) {
carrier.display.fillScreen(ST77XX_WHITE);
carrier.display.setTextColor(ST77XX_RED);
carrier.display.setTextSize(2);
carrier.display.setCursor(30, 110);
carrier.display.print(“Humi: “);
carrier.display.print(humidity);
carrier.display.print(” %”);
}
if (carrier.Buttons.onTouchDown(TOUCH2)) {
carrier.display.fillScreen(ST77XX_WHITE);
carrier.display.setTextColor(ST77XX_RED);
carrier.display.setTextSize(2);
carrier.display.setCursor(30, 110);
carrier.display.print(“Light: “);
carrier.display.print(light);
}
if (carrier.Buttons.onTouchDown(TOUCH3)) {
carrier.display.fillScreen(ST77XX_WHITE);
carrier.display.setTextColor(ST77XX_RED);
carrier.display.setTextSize(2);
carrier.display.setCursor(30, 110);
carrier.display.print(“Pressure: “);
carrier.display.print(pressure);
}
if (humidity >= 60 && temperature >= 15) {
weather_report = “It is very humid outside”;
}else if (temperature >= 15 && light >= 700) {
weather_report = “Warm and sunny outside”;
}else if (temperature <= 16 && light >= 700) {
weather_report = “A little cold, but sunny outside”;
}
else{
weather_report = “Weather is normal”;
}
}
Επίσης δημιουργήσαμε το πρόγραμμα.
// Brosta – May/25/2021
#include <WiFiNINA.h>
#include <Arduino_LPS22HB.h>
#include <Arduino_MKRIoTCarrier.h>
#define SECRET_SSID “Spiti”
#define SECRET_PASS “kodikos888”
#define BRO_WITH_WIFI “1”
#define BRO_WITH_CARRIER “1”
#define BRO_WITH_SERIAL_MONITOR “1”
#define BRO_WITH_CARRIER_MONITOR “1”
#define BRO_WITH_HTTP “1”
char ssid[] = SECRET_SSID;
char pass[] = SECRET_PASS;
int _http_port = 80;
int loaded = 0;
int serial_monitor_opened = 0;
int carrier_monitor_opened = 0;
int wifi_connected = 0;
float humidity = 0;
float pressure = 0;
float temperature = 0;
char _server_name[] = “www.brosta.org”;
String _action_name = “www.brosta.org”;
String _http_scheme = “http”;
String _http_host = “www.brosta.org”;
String _http_path = “/school/weather”;
String _http_url = _http_scheme + _http_host + _http_path;
String username = “Brosta”;
String location_country = “GR”;
String location_state = “Fokida”;
String location_city = “Efpalio”;
String location_region = “Loggos”;
WiFiClient _http;
MKRIoTCarrier Brosta;
void setup() {
Serial.begin(9600);
CARRIER_CASE = true;
Brosta.begin();
// End Arduino
// Start Brosta
if(BRO_WITH_CARRIER_MONITOR) {
openTheCarierMonitor();
}
if(BRO_WITH_CARRIER_MONITOR) {
openTheCarierMonitor();
}
if(BRO_WITH_WIFI) {
loadWiFi(1);
}
}
void loop() {
Brosta.Buttons.update();
if(Brosta.Button4.onTouchDown()) {
if(wifi_connected) {
wifi_connected = 0;
} else {
wifi_connected = 1;
}
loadWiFi(wifi_connected);
}
if(loaded) {
pressure = Brosta.Pressure.readPressure(PSI);
pressure = pressure * 68.94757293;
humidity = Brosta.Env.readHumidity();
temperature = Brosta.Env.readTemperature();
if (BRO_WITH_HTTP) {
String query = “username=” + username
+ “&location=” + location_country + “%2C ” +location_state + “%2C ” + location_city + “%2C ” + location_region
+ “&sconnected=” + 1
+ “&temperature=” + String(temperature)
+ “&humidity=” + String(humidity)
+ “&pressure=” + String(pressure);
// All fields need to set here
httpPost(“/school/weather”, query);
}
}
delay(10000);
}
void httpPost(String url, String data) {
if (_http.connect(_server_name, _http_port)) {
_http.println(“POST ” + _http_path + ” HTTP/1.1″);
_http.println(“Host: ” + _http_host);
_http.println(“Content-Type: application/x-www-form-urlencoded”);
_http.print(“Content-Length: “);
_http.println(data.length());
_http.println();
_http.print(data);
}
if(_http.connected()) {
_http.stop();
}
}
void openTheCarierMonitor() {
carrier_monitor_opened = 1;
Brosta.display.setRotation(0);
Brosta.display.fillScreen(ST77XX_BLACK);
Brosta.display.setTextColor(ST77XX_WHITE);
Brosta.display.setTextSize(2);
}
void present(String text, int way = 0) {
if (BRO_WITH_CARRIER_MONITOR) {
if(way == 1) {
Brosta.display.println(text);
} else {
Brosta.display.print(text);
}
}
if(BRO_WITH_SERIAL_MONITOR) {
if(way == 1) {
Serial.println(text);
} else {
Serial.print(text);
}
}
}
void loadWiFi(int positive) {
if (!positive) {
WiFi.disconnect();
Brosta.display.print(“WiFi Disconnected”);
} else {
WiFi.begin(ssid, pass);
delay(10000);
loaded = 1;
IPAddress ip = WiFi.localIP();
Brosta.display.setTextSize(2);
Brosta.display.setCursor(35, 60);
Brosta.display.println(“WiFi Connected”);
Brosta.display.setCursor(100, 90);
Brosta.display.println(“SSID”);
Brosta.display.setCursor(102, 120);
Brosta.display.println(WiFi.SSID());
Brosta.display.setCursor(112, 150);
Brosta.display.println(“IP”);
Brosta.display.setCursor(55, 180);
Brosta.display.println(ip);
}
}