Browse Source

Merge branch 'feature/web_interface' into develop

develop
dslak 2 years ago
parent
commit
f78d952761
  1. 36
      Arduino/GetData.ino
  2. 0
      Arduino/Sensors/GetSensor.ino
  3. 35
      Arduino/Sensors/GetWind.ino
  4. 30
      Arduino/Sensors/SendData.ino
  5. 82
      Arduino/Sensors/Sensors.ino
  6. 20
      Arduino/Sensors/Setup.ino
  7. 14
      Arduino/Transmission/GetSensor.ino
  8. 7
      Arduino/Transmission/GetWid.ino
  9. 0
      Arduino/Transmission/Request.ino
  10. 0
      Arduino/Transmission/Setup.ino
  11. 16
      Arduino/Transmission/Transmission.ino
  12. 0
      Arduino/libraries/Arduino-SIM800L-driver-master.zip
  13. 0
      Arduino/libraries/BME280-master.zip
  14. 26
      Circuits/GRB/SensorsPCB_contour.gm1
  15. 390
      Circuits/GRB/SensorsPCB_copperBottom.gbl
  16. 273
      Circuits/GRB/SensorsPCB_copperTop.gtl
  17. 102
      Circuits/GRB/SensorsPCB_drill.txt
  18. 117
      Circuits/GRB/SensorsPCB_maskBottom.gbs
  19. 117
      Circuits/GRB/SensorsPCB_maskTop.gts
  20. 43
      Circuits/GRB/SensorsPCB_pnp.txt
  21. 13477
      Circuits/GRB/SensorsPCB_silkBottom.gbo
  22. 32019
      Circuits/GRB/SensorsPCB_silkTop.gto
  23. BIN
      Circuits/PDF/PCB3_etch_copper_bottom.pdf
  24. BIN
      Circuits/PDF/PCB3_etch_copper_bottom_mirror.pdf
  25. BIN
      Circuits/PDF/PCB3_etch_copper_top.pdf
  26. BIN
      Circuits/PDF/PCB3_etch_copper_top_mirror.pdf
  27. BIN
      Circuits/PDF/PCB3_etch_mask_bottom.pdf
  28. BIN
      Circuits/PDF/PCB3_etch_mask_bottom_mirror.pdf
  29. BIN
      Circuits/PDF/PCB3_etch_mask_top.pdf
  30. BIN
      Circuits/PDF/PCB3_etch_mask_top_mirror.pdf
  31. BIN
      Circuits/PDF/PCB3_etch_paste_mask_bottom.pdf
  32. BIN
      Circuits/PDF/PCB3_etch_paste_mask_bottom_mirror.pdf
  33. BIN
      Circuits/PDF/PCB3_etch_paste_mask_top.pdf
  34. BIN
      Circuits/PDF/PCB3_etch_paste_mask_top_mirror.pdf
  35. BIN
      Circuits/PDF/PCB3_etch_silk_bottom.pdf
  36. BIN
      Circuits/PDF/PCB3_etch_silk_bottom_mirror.pdf
  37. BIN
      Circuits/PDF/PCB3_etch_silk_top.pdf
  38. BIN
      Circuits/PDF/PCB3_etch_silk_top_mirror.pdf
  39. BIN
      Circuits/PDF/SensorsPCB_etch_copper_bottom.pdf
  40. BIN
      Circuits/PDF/SensorsPCB_etch_copper_bottom_mirror.pdf
  41. BIN
      Circuits/PDF/SensorsPCB_etch_copper_top.pdf
  42. BIN
      Circuits/PDF/SensorsPCB_etch_copper_top_mirror.pdf
  43. BIN
      Circuits/PDF/SensorsPCB_etch_mask_bottom.pdf
  44. BIN
      Circuits/PDF/SensorsPCB_etch_mask_bottom_mirror.pdf
  45. BIN
      Circuits/PDF/SensorsPCB_etch_mask_top.pdf
  46. BIN
      Circuits/PDF/SensorsPCB_etch_mask_top_mirror.pdf
  47. BIN
      Circuits/PDF/SensorsPCB_etch_paste_mask_bottom.pdf
  48. BIN
      Circuits/PDF/SensorsPCB_etch_paste_mask_bottom_mirror.pdf
  49. BIN
      Circuits/PDF/SensorsPCB_etch_paste_mask_top.pdf
  50. BIN
      Circuits/PDF/SensorsPCB_etch_paste_mask_top_mirror.pdf
  51. BIN
      Circuits/PDF/SensorsPCB_etch_silk_bottom.pdf
  52. BIN
      Circuits/PDF/SensorsPCB_etch_silk_bottom_mirror.pdf
  53. BIN
      Circuits/PDF/SensorsPCB_etch_silk_top.pdf
  54. BIN
      Circuits/PDF/SensorsPCB_etch_silk_top_mirror.pdf
  55. BIN
      Circuits/Sensors.fzz
  56. BIN
      Circuits/SensorsPCB.fzz
  57. BIN
      Circuits/Sensors_schem.pdf
  58. BIN
      Circuits/arduino.pdf
  59. 10937
      Circuits/arduino.svg
  60. 42
      Circuits/logo.svg
  61. BIN
      Circuits/sensors.pdf
  62. 10748
      Circuits/sensors.svg
  63. 56
      TEST/windAll/windAll.ino
  64. 45
      TEST/windDir/windDir.ino
  65. 46
      TEST/windSpeed/windSpeed.ino
  66. 3
      Web/AUTH
  67. 1
      Web/deploy.sh
  68. 16
      Web/weather/.browserslistrc
  69. 16
      Web/weather/.editorconfig
  70. 42
      Web/weather/.gitignore
  71. 4
      Web/weather/.vscode/extensions.json
  72. 20
      Web/weather/.vscode/launch.json
  73. 42
      Web/weather/.vscode/tasks.json
  74. 27
      Web/weather/README.md
  75. 119
      Web/weather/angular.json
  76. 44
      Web/weather/karma.conf.js
  77. 41
      Web/weather/package.json
  78. 9
      Web/weather/proxy.conf.json
  79. 9
      Web/weather/proxy.conf.prod.json
  80. 3
      Web/weather/src/api/.htaccess
  81. 7
      Web/weather/src/api/config.php
  82. 33
      Web/weather/src/api/get_data.php
  83. 9
      Web/weather/src/api/headers.php
  84. 25
      Web/weather/src/api/station.php
  85. 1
      Web/weather/src/app/app-layout/app-layout.component.html
  86. 0
      Web/weather/src/app/app-layout/app-layout.component.scss
  87. 23
      Web/weather/src/app/app-layout/app-layout.component.spec.ts
  88. 15
      Web/weather/src/app/app-layout/app-layout.component.ts
  89. 18
      Web/weather/src/app/app.component.html
  90. 71
      Web/weather/src/app/app.component.scss
  91. 31
      Web/weather/src/app/app.component.spec.ts
  92. 33
      Web/weather/src/app/app.component.ts
  93. 33
      Web/weather/src/app/app.module.ts
  94. 3
      Web/weather/src/app/dashboard/dashboard.component.html
  95. 0
      Web/weather/src/app/dashboard/dashboard.component.scss
  96. 23
      Web/weather/src/app/dashboard/dashboard.component.spec.ts
  97. 37
      Web/weather/src/app/dashboard/dashboard.component.ts
  98. 6
      Web/weather/src/app/graph/graph.component.html
  99. 76
      Web/weather/src/app/graph/graph.component.scss
  100. 23
      Web/weather/src/app/graph/graph.component.spec.ts

36
Arduino/GetData.ino

@ -1,36 +0,0 @@
void getWind() {
windDirection = "";
anemometerVal = digitalRead(anemometerPin);
if ((anemometerState == 1) && (anemometerVal == 0)) {
anemometerDuration = millis() - startime;
startime = millis();
windSpeed = 2500.0/anemometerDuration;
}
anemometerState = anemometerVal;
if(millis() >= timer) {
Serial.println("--------------------------");
timer = millis() + timerLimit;
if(digitalRead(northPin)) {windDirection = windDirection + "N";}
if(digitalRead(southPin)) {windDirection = windDirection + "S";}
if(digitalRead(eastPin)) {windDirection = windDirection + "E";}
if(digitalRead(westPin)) {windDirection = windDirection + "W";}
if(printSensorsData) {
Serial.print("Wind speed:\t");
Serial.print(windSpeed);
Serial.println("Km/h");
Serial.print("Wind direction:\t");
Serial.println(windDirection);
}
//sendRequest();
}
}

0
Arduino/GetSensor.ino → Arduino/Sensors/GetSensor.ino

35
Arduino/Sensors/GetWind.ino

@ -0,0 +1,35 @@
void getWind() {
int index = 0;
digitalWrite(ENABLE_PIN1, HIGH);
digitalWrite(ENABLE_PIN2, LOW);
delay(10);
if(sensor.write(codes, sizeof(codes)) == 8) {
digitalWrite(ENABLE_PIN1, LOW);
for (byte i = 0; i < 11; i++) {
values[index][i] = sensor.read();
}
}
windSpeed = values[index][4];
delay(500);
index = 1;
digitalWrite(ENABLE_PIN1, LOW);
digitalWrite(ENABLE_PIN2, HIGH);
delay(10);
if(sensor.write(codes, sizeof(codes)) == 8) {
digitalWrite(ENABLE_PIN2, LOW);
for (byte i = 0; i < 11; i++) {
values[index][i] = sensor.read();
}
}
windDirection = values[index][4];
digitalWrite(ENABLE_PIN1, LOW);
digitalWrite(ENABLE_PIN2, LOW);
}

30
Arduino/Sensors/SendData.ino

@ -0,0 +1,30 @@
void sendData() {
if((WiFiMulti.run() == WL_CONNECTED)) {
WiFiClient client;
HTTPClient http;
char apiString[100] = "";
sprintf_P(apiString, server, windDirection, windSpeed, temperature, humidity, pressure);
Serial.print("[HTTP] begin...\n");
if (http.begin(client, apiString)) {
Serial.print("[HTTP] GET...\n");
int httpCode = http.GET();
if (httpCode > 0) {
Serial.printf("[HTTP] GET... code: %d\n", httpCode);
if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {
String payload = http.getString();
Serial.println(payload);
}
} else {
Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
}
http.end();
} else {
Serial.printf("[HTTP} Unable to connect\n");
}
}
}

82
Arduino/Sensors/Sensors.ino

@ -0,0 +1,82 @@
#include <SoftwareSerial.h>
#include <Wire.h>
#include <BME280I2C.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
#define ENABLE_PIN1 D5 // 8 // dir
#define ENABLE_PIN2 D6 // 9 // speed
#define SERIAL_RO D7 // 10
#define SERIAL_DI D8 // 11
#define WIFIUSR "NETGEAR41"
#define WIFIPWD "magicalbanana0"
ESP8266WiFiMulti WiFiMulti;
BME280I2C bme;
const byte codes[] = {0x01 ,0x03 ,0x00 ,0x00 ,0x00 ,0x02 ,0xC4 ,0x0B};
const char server[] PROGMEM = "http://2.233.91.82/weather/api/station?data=%d|%d|%f|%f|%f";
byte values[2][20];
SoftwareSerial sensor(SERIAL_RO, SERIAL_DI);
int windSpeed = 0;
int windDirection = 0;
float temperature = 0;
float humidity = 0;
float pressure = 0;
void setup() {
// Initialize Serial Monitor for debugging
Serial.begin(9600);
while(!Serial);
// Initialize a Wire
Wire.begin();
while(!bme.begin()){
Serial.println("Could not find BME280 sensor!");
delay(1000);
}
// Initialize a SoftwareSerial
sensor.begin(4800);
delay(500);
pinMode(ENABLE_PIN1, OUTPUT);
pinMode(ENABLE_PIN2, OUTPUT);
// Initialize WiFi
for (uint8_t t = 4; t > 0; t--) {
Serial.printf("[SETUP] WAIT %d...\n", t);
Serial.flush();
delay(1000);
}
WiFi.mode(WIFI_STA);
WiFiMulti.addAP(WIFIUSR, WIFIPWD);
}
void loop() {
getWind();
Serial.print("Direction: ");
Serial.println(windDirection);
Serial.print("Speed: ");
Serial.println(windSpeed);
getBME280Data();
Serial.print("Temp: ");
Serial.println(temperature);
Serial.print("Hum: ");
Serial.println(humidity);
Serial.print("Pres: ");
Serial.println(pressure);
sendData();
delay(10000);
}

20
Arduino/Sensors/Setup.ino

@ -0,0 +1,20 @@
void setupBME280() {
Wire.begin();
while(!bme.begin()) {
Serial.println("Could not find BME280 sensor!");
delay(1000);
}
switch(bme.chipModel()) {
case BME280::ChipModel_BME280:
Serial.println("Found BME280 sensor! Success.");
break;
case BME280::ChipModel_BMP280:
Serial.println("Found BMP280 sensor! No Humidity available.");
break;
default:
Serial.println("Found UNKNOWN sensor! Error!");
}
}

14
Arduino/Transmission/GetSensor.ino

@ -0,0 +1,14 @@
void getBME280Data() {
float temp(NAN), hum(NAN), pres(NAN);
BME280::TempUnit tempUnit(BME280::TempUnit_Celsius);
BME280::PresUnit presUnit(BME280::PresUnit_Pa);
bme.read(pres, temp, hum, tempUnit, presUnit);
temperature = temp;
humidity = hum;
pressure = pres;
}

7
Arduino/Transmission/GetWid.ino

@ -0,0 +1,7 @@
void getWind() {
windDirection = 0;
windSpeed = 0;
}

0
Arduino/Request.ino → Arduino/Transmission/Request.ino

0
Arduino/Setup.ino → Arduino/Transmission/Setup.ino

16
Arduino/Arduino.ino → Arduino/Transmission/Transmission.ino

@ -18,29 +18,15 @@ String BASE_URL = "http://2.238.194.8/index.php?";
String s = "";
char URL[100];
int anemometerPin = 6;
int anemometerVal = 0;
int anemometerState = 0;
unsigned long anemometerDuration = 0;
unsigned long startime = 0;
unsigned long timer = 0;
int windSpeed = 0;
int windDirection = 0;
float temperature = 0;
float humidity = 0;
float pressure = 0;
int northPin = 4;
int eastPin = 5;
int southPin = 2;
int westPin = 3;
int timerLimit = 10000;//300000; // 5 minutes
String windDirection = "";
bool printSensorsData = true;
void setup() {
// Initialize Serial Monitor for debugging
Serial.begin(9600);

0
libraries/Arduino-SIM800L-driver-master.zip → Arduino/libraries/Arduino-SIM800L-driver-master.zip

0
libraries/BME280-master.zip → Arduino/libraries/BME280-master.zip

26
Circuits/GRB/SensorsPCB_contour.gm1

@ -0,0 +1,26 @@
G04 MADE WITH FRITZING*
G04 WWW.FRITZING.ORG*
G04 DOUBLE SIDED*
G04 HOLES PLATED*
G04 CONTOUR ON CENTER OF CONTOUR VECTOR*
%ASAXBY*%
%FSLAX23Y23*%
%MOIN*%
%OFA0B0*%
%SFA1.0B1.0*%
%ADD10R,3.333330X2.222220*%
%ADD11C,0.008000*%
%ADD10C,0.008*%
%LNCONTOUR*%
G90*
G70*
G54D10*
G54D11*
X4Y2218D02*
X3329Y2218D01*
X3329Y4D01*
X4Y4D01*
X4Y2218D01*
D02*
G04 End of contour*
M02*

390
Circuits/GRB/SensorsPCB_copperBottom.gbl

@ -0,0 +1,390 @@
G04 MADE WITH FRITZING*
G04 WWW.FRITZING.ORG*
G04 DOUBLE SIDED*
G04 HOLES PLATED*
G04 CONTOUR ON CENTER OF CONTOUR VECTOR*
%ASAXBY*%
%FSLAX23Y23*%
%MOIN*%
%OFA0B0*%
%SFA1.0B1.0*%
%ADD10C,0.080000*%
%ADD11C,0.065278*%
%ADD12C,0.078000*%
%ADD13C,0.075000*%
%ADD14R,0.080000X0.080000*%
%ADD15R,0.075000X0.075000*%
%ADD16C,0.090000*%
%ADD17C,0.048000*%
%ADD18C,0.070000*%
%LNCOPPER0*%
G90*
G70*
G54D10*
X287Y2006D03*
X287Y1806D03*
X287Y1606D03*
X287Y1406D03*
X287Y1206D03*
X287Y1006D03*
X287Y806D03*
X287Y606D03*
X287Y406D03*
X287Y206D03*
X3043Y914D03*
X3043Y1114D03*
X3043Y1314D03*
X3043Y714D03*
G54D11*
X2628Y152D03*
X2728Y152D03*
X2828Y152D03*
X2928Y152D03*
X3028Y152D03*
X2168Y2052D03*
X2068Y2052D03*
X1968Y2052D03*
X1868Y2052D03*
X1768Y2052D03*
X1668Y2052D03*
X1568Y2052D03*
X1468Y2052D03*
X1368Y2052D03*
X1268Y2052D03*
X3028Y2052D03*
X2928Y2052D03*
X2828Y2052D03*
X2728Y2052D03*
X2628Y2052D03*
X2528Y2052D03*
X2428Y2052D03*
X2328Y2052D03*
X1728Y152D03*
X1628Y152D03*
X1828Y152D03*
X1928Y152D03*
X2028Y152D03*
X2128Y152D03*
X2228Y152D03*
X2328Y152D03*
X2528Y152D03*
G54D12*
X926Y1757D03*
X926Y1657D03*
X926Y1557D03*
X926Y1457D03*
X951Y772D03*
X951Y672D03*
X951Y572D03*
X951Y472D03*
X2550Y772D03*
X2550Y672D03*
X2550Y572D03*
X2550Y472D03*
X2525Y1757D03*
X2525Y1657D03*
X2525Y1557D03*
X2525Y1457D03*
X1271Y625D03*
X1271Y280D03*
X1566Y1707D03*
X1566Y1412D03*
X2403Y871D03*
X2304Y428D03*
X2403Y1363D03*
X730Y428D03*
X730Y821D03*
X730Y1412D03*
X730Y1806D03*
X1123Y625D03*
X1714Y1560D03*
X2206Y1363D03*
X2304Y1363D03*
G54D13*
X1566Y964D03*
X1566Y1264D03*
X1666Y964D03*
X1666Y1264D03*
X1766Y964D03*
X1766Y1264D03*
X1866Y964D03*
X1866Y1264D03*
X1966Y964D03*
X1966Y1264D03*
G54D14*
X287Y2006D03*
X3043Y714D03*
G54D15*
X1566Y964D03*
G54D10*
X2846Y329D02*
X2910Y190D01*
D02*
X2846Y1312D02*
X2846Y329D01*
D02*
X3000Y1313D02*
X2846Y1312D01*
D02*
X335Y674D02*
X910Y672D01*
D02*
X311Y640D02*
X335Y674D01*
G54D16*
D02*
X2206Y279D02*
X1862Y624D01*
D02*
X1322Y626D02*
X1320Y773D01*
D02*
X1862Y624D02*
X1322Y626D01*
D02*
X2206Y182D02*
X2206Y279D01*
D02*
X1322Y1462D02*
X1074Y1759D01*
D02*
X2203Y186D02*
X2206Y182D01*
D02*
X1320Y773D02*
X1322Y1462D01*
D02*
X1074Y1759D02*
X968Y1757D01*
D02*
X1320Y773D02*
X993Y772D01*
G54D17*
D02*
X1366Y535D02*
X1271Y478D01*
D02*
X1271Y478D02*
X1122Y478D01*
D02*
X1766Y527D02*
X1366Y535D01*
D02*
X2009Y182D02*
X2010Y279D01*
D02*
X1024Y478D02*
X993Y476D01*
D02*
X1122Y478D02*
X1024Y478D01*
D02*
X2010Y279D02*
X1766Y527D01*
D02*
X2005Y188D02*
X2009Y182D01*
D02*
X1122Y478D02*
X1123Y583D01*
G54D18*
D02*
X910Y573D02*
X729Y577D01*
D02*
X729Y577D02*
X729Y469D01*
G54D16*
D02*
X335Y823D02*
X326Y820D01*
D02*
X688Y822D02*
X335Y823D01*
G54D10*
D02*
X688Y1411D02*
X329Y1406D01*
G54D18*
D02*
X731Y1657D02*
X730Y1765D01*
D02*
X885Y1657D02*
X731Y1657D01*
G54D10*
D02*
X336Y1560D02*
X318Y1577D01*
D02*
X885Y1557D02*
X336Y1560D01*
G54D16*
D02*
X975Y1068D02*
X778Y1214D01*
D02*
X975Y822D02*
X975Y1068D01*
D02*
X969Y810D02*
X975Y822D01*
D02*
X778Y1214D02*
X329Y1206D01*
G54D17*
D02*
X2525Y1598D02*
X2525Y1615D01*
D02*
X2550Y614D02*
X2550Y631D01*
D02*
X1959Y722D02*
X2108Y577D01*
D02*
X1663Y723D02*
X1959Y722D01*
D02*
X2403Y577D02*
X2517Y496D01*
D02*
X2108Y577D02*
X2403Y577D01*
D02*
X1666Y925D02*
X1663Y723D01*
D02*
X2305Y1659D02*
X2305Y1904D01*
D02*
X2305Y1904D02*
X2197Y2021D01*
D02*
X2304Y1404D02*
X2305Y1659D01*
D02*
X1961Y1167D02*
X1664Y1165D01*
D02*
X1960Y1117D02*
X1961Y1167D01*
D02*
X1664Y1165D02*
X1665Y1225D01*
D02*
X2550Y1116D02*
X1960Y1117D01*
D02*
X2550Y814D02*
X2550Y1116D01*
D02*
X2206Y1904D02*
X2206Y1659D01*
D02*
X2206Y1659D02*
X2206Y1404D01*
D02*
X2097Y2021D02*
X2206Y1904D01*
D02*
X1862Y1067D02*
X1864Y1004D01*
D02*
X1469Y1560D02*
X1469Y1067D01*
D02*
X1469Y1067D02*
X1862Y1067D01*
D02*
X1673Y1560D02*
X1469Y1560D01*
D02*
X2402Y1019D02*
X1960Y1019D01*
D02*
X1960Y1019D02*
X1962Y1004D01*
D02*
X2403Y912D02*
X2402Y1019D01*
D02*
X2353Y2018D02*
X2402Y1953D01*
D02*
X2402Y1659D02*
X2403Y1404D01*
D02*
X2402Y1953D02*
X2402Y1659D01*
D02*
X2402Y1659D02*
X2484Y1657D01*
D02*
X2107Y1708D02*
X2107Y1904D01*
D02*
X2107Y1904D02*
X1997Y2021D01*
D02*
X1607Y1707D02*
X2107Y1708D01*
D02*
X1764Y1413D02*
X1607Y1412D01*
D02*
X1766Y1304D02*
X1764Y1413D01*
D02*
X1960Y1461D02*
X1862Y1461D01*
D02*
X2157Y1216D02*
X1960Y1461D01*
D02*
X1862Y1461D02*
X1865Y1304D01*
D02*
X2699Y1756D02*
X2699Y1213D01*
D02*
X2699Y1213D02*
X2157Y1216D01*
D02*
X2567Y1756D02*
X2699Y1756D01*
G54D16*
D02*
X928Y2002D02*
X336Y2003D01*
D02*
X927Y1798D02*
X928Y2002D01*
D02*
X1322Y626D02*
X1312Y625D01*
D02*
X532Y282D02*
X1207Y280D01*
D02*
X532Y428D02*
X532Y282D01*
D02*
X335Y428D02*
X532Y428D01*
D02*
X325Y424D02*
X335Y428D01*
G54D17*
D02*
X2304Y182D02*
X2304Y387D01*
D02*
X2302Y185D02*
X2304Y182D01*
G54D16*
D02*
X336Y2003D02*
X329Y2004D01*
G04 End of Copper0*
M02*

273
Circuits/GRB/SensorsPCB_copperTop.gtl

@ -0,0 +1,273 @@
G04 MADE WITH FRITZING*
G04 WWW.FRITZING.ORG*
G04 DOUBLE SIDED*
G04 HOLES PLATED*
G04 CONTOUR ON CENTER OF CONTOUR VECTOR*
%ASAXBY*%
%FSLAX23Y23*%
%MOIN*%
%OFA0B0*%
%SFA1.0B1.0*%
%ADD10C,0.080000*%
%ADD11C,0.065278*%
%ADD12C,0.078000*%
%ADD13C,0.075000*%
%ADD14R,0.080000X0.080000*%
%ADD15R,0.075000X0.075000*%
%ADD16C,0.070000*%
%ADD17C,0.090000*%
%ADD18C,0.048000*%
%LNCOPPER1*%
G90*
G70*
G54D10*
X287Y2006D03*
X287Y1806D03*
X287Y1606D03*
X287Y1406D03*
X287Y1206D03*
X287Y1006D03*
X287Y806D03*
X287Y606D03*
X287Y406D03*
X287Y206D03*
X3043Y914D03*
X3043Y1114D03*
X3043Y1314D03*
X3043Y714D03*
G54D11*
X2628Y152D03*
X2728Y152D03*
X2828Y152D03*
X2928Y152D03*
X3028Y152D03*
X2168Y2052D03*
X2068Y2052D03*
X1968Y2052D03*
X1868Y2052D03*
X1768Y2052D03*
X1668Y2052D03*
X1568Y2052D03*
X1468Y2052D03*
X1368Y2052D03*
X1268Y2052D03*
X3028Y2052D03*
X2928Y2052D03*
X2828Y2052D03*
X2728Y2052D03*
X2628Y2052D03*
X2528Y2052D03*
X2428Y2052D03*
X2328Y2052D03*
X1728Y152D03*
X1628Y152D03*
X1828Y152D03*
X1928Y152D03*
X2028Y152D03*
X2128Y152D03*
X2228Y152D03*
X2328Y152D03*
X2528Y152D03*
G54D12*
X926Y1757D03*
X926Y1657D03*
X926Y1557D03*
X926Y1457D03*
X951Y772D03*
X951Y672D03*
X951Y572D03*
X951Y472D03*
X2550Y772D03*
X2550Y672D03*
X2550Y572D03*
X2550Y472D03*
X2525Y1757D03*
X2525Y1657D03*
X2525Y1557D03*
X2525Y1457D03*
X1271Y625D03*
X1271Y280D03*
X1566Y1707D03*
X1566Y1412D03*
X2403Y871D03*
X2304Y428D03*
X2403Y1363D03*
X730Y428D03*
X730Y821D03*
X730Y1412D03*
X730Y1806D03*
X1123Y625D03*
X1714Y1560D03*
X2206Y1363D03*
X2304Y1363D03*
G54D13*
X1566Y964D03*
X1566Y1264D03*
X1666Y964D03*
X1666Y1264D03*
X1766Y964D03*
X1766Y1264D03*
X1866Y964D03*
X1866Y1264D03*
X1966Y964D03*
X1966Y1264D03*
G54D14*
X287Y2006D03*
X3043Y714D03*
G54D15*
X1566Y964D03*
G54D16*
X1911Y181D02*
X1907Y189D01*
G54D10*
D02*
X2796Y920D02*
X3000Y915D01*
D02*
X2796Y1902D02*
X2796Y920D01*
D02*
X1565Y1904D02*
X2796Y1902D01*
D02*
X1567Y2009D02*
X1565Y1904D01*
G54D16*
D02*
X2699Y722D02*
X2699Y327D01*
D02*
X2404Y279D02*
X1911Y279D01*
D02*
X1911Y279D02*
X1911Y181D01*
D02*
X2451Y327D02*
X2404Y279D01*
D02*
X2699Y327D02*
X2451Y327D01*
D02*
X3000Y715D02*
X2699Y722D01*
G54D10*
D02*
X3190Y1118D02*
X3085Y1115D01*
D02*
X3190Y327D02*
X3190Y1118D01*
D02*
X3057Y183D02*
X3190Y327D01*
G54D17*
D02*
X1416Y135D02*
X1418Y428D01*
D02*
X1418Y428D02*
X2241Y428D01*
D02*
X580Y135D02*
X1416Y135D01*
D02*
X485Y183D02*
X580Y135D01*
D02*
X335Y183D02*
X330Y185D01*
D02*
X485Y183D02*
X335Y183D01*
D02*
X485Y1020D02*
X485Y183D01*
D02*
X485Y1020D02*
X483Y1806D01*
D02*
X483Y1806D02*
X334Y1806D01*
D02*
X335Y1020D02*
X485Y1020D01*
D02*
X332Y1020D02*
X335Y1020D01*
G54D18*
D02*
X1762Y820D02*
X2206Y820D01*
D02*
X2206Y820D02*
X2206Y1322D01*
D02*
X1765Y925D02*
X1762Y820D01*
D02*
X2303Y674D02*
X2304Y1322D01*
D02*
X2303Y674D02*
X1518Y674D01*
D02*
X1518Y921D02*
X1537Y938D01*
D02*
X1518Y674D02*
X1518Y921D01*
D02*
X2509Y673D02*
X2303Y674D01*
G54D16*
D02*
X1123Y1216D02*
X1123Y666D01*
D02*
X952Y1425D02*
X1123Y1216D01*
G54D18*
D02*
X2352Y1559D02*
X1755Y1560D01*
D02*
X2490Y1478D02*
X2352Y1559D01*
G54D16*
D02*
X730Y469D02*
X730Y780D01*
D02*
X730Y1453D02*
X730Y1765D01*
G54D18*
D02*
X1271Y321D02*
X1271Y583D01*
D02*
X1566Y1453D02*
X1566Y1666D01*
D02*
X2403Y912D02*
X2403Y1322D01*
D02*
X1567Y1116D02*
X1960Y1116D01*
D02*
X1960Y1116D02*
X1965Y1004D01*
D02*
X1566Y1225D02*
X1567Y1116D01*
D02*
X2304Y1461D02*
X1960Y1461D01*
D02*
X1960Y1461D02*
X1965Y1293D01*
D02*
X2304Y1393D02*
X2304Y1461D01*
G04 End of Copper1*
M02*

102
Circuits/GRB/SensorsPCB_drill.txt

@ -0,0 +1,102 @@
; NON-PLATED HOLES START AT T1
; THROUGH (PLATED) HOLES START AT T100
M48
INCH
T100C0.040000
T101C0.038000
T102C0.035000
T103C0.040278
%
T100
X002866Y004057
X002866Y016057
X030425Y011136
X002866Y020057
X002866Y008057
X002866Y006057
X002866Y014057
X030425Y009136
X002866Y010057
X030425Y007136
X002866Y018057
X002866Y002057
X030425Y013136
X002866Y012057
T101
X007295Y014120
X025504Y004722
X025253Y015565
X025253Y016565
X025504Y006722
X025504Y005722
X023043Y004277
X009514Y007722
X022059Y013628
X012708Y002801
X023043Y013628
X025253Y017565
X025504Y007722
X009514Y006722
X011232Y006246
X025253Y014565
X009263Y017565
X009263Y016565
X009263Y014565
X009263Y015565
X012708Y006246
X017137Y015596
X007295Y018057
X007295Y008214
X015661Y014120
X024027Y013628
X009514Y005722
X007295Y004277
X024027Y008707
X009514Y004722
X015661Y017073
T102
X019661Y009644
X016661Y009644
X015661Y012644
X017661Y009644
X019661Y012644
X018661Y012644
X017661Y012644
X015661Y009644
X018661Y009644
X016661Y012644
T103
X016677Y020518
X023277Y001518
X016277Y001518
X024277Y020518
X013677Y020518
X021277Y001518
X030277Y001518
X029277Y001518
X029277Y020518
X023277Y020518
X015677Y020518
X025277Y020518
X014677Y020518
X020277Y001518
X012677Y020518
X017277Y001518
X030277Y020518
X018277Y001518
X028277Y001518
X022277Y001518
X026277Y001518
X019277Y001518
X026277Y020518
X021677Y020518
X017677Y020518
X027277Y020518
X028277Y020518
X019677Y020518
X027277Y001518
X025277Y001518
X020677Y020518
X018677Y020518
T00
M30

117
Circuits/GRB/SensorsPCB_maskBottom.gbs

@ -0,0 +1,117 @@
G04 MADE WITH FRITZING*
G04 WWW.FRITZING.ORG*
G04 DOUBLE SIDED*
G04 HOLES PLATED*
G04 CONTOUR ON CENTER OF CONTOUR VECTOR*
%ASAXBY*%
%FSLAX23Y23*%
%MOIN*%
%OFA0B0*%
%SFA1.0B1.0*%
%ADD10C,0.090000*%
%ADD11C,0.075278*%
%ADD12C,0.088000*%
%ADD13C,0.085000*%
%ADD14R,0.090000X0.090000*%
%ADD15R,0.085000X0.085000*%
%LNMASK0*%
G90*
G70*
G54D10*
X287Y2006D03*
X287Y1806D03*
X287Y1606D03*
X287Y1406D03*
X287Y1206D03*
X287Y1006D03*
X287Y806D03*
X287Y606D03*
X287Y406D03*
X287Y206D03*
X3043Y914D03*
X3043Y1114D03*
X3043Y1314D03*
X3043Y714D03*
G54D11*
X2628Y152D03*
X2728Y152D03*
X2828Y152D03*
X2928Y152D03*
X3028Y152D03*
X2168Y2052D03*
X2068Y2052D03*
X1968Y2052D03*
X1868Y2052D03*
X1768Y2052D03*
X1668Y2052D03*
X1568Y2052D03*
X1468Y2052D03*
X1368Y2052D03*
X1268Y2052D03*
X3028Y2052D03*
X2928Y2052D03*
X2828Y2052D03*
X2728Y2052D03*
X2628Y2052D03*
X2528Y2052D03*
X2428Y2052D03*
X2328Y2052D03*
X1728Y152D03*
X1628Y152D03*
X1828Y152D03*
X1928Y152D03*
X2028Y152D03*
X2128Y152D03*
X2228Y152D03*
X2328Y152D03*
X2528Y152D03*
G54D12*
X926Y1757D03*
X926Y1657D03*
X926Y1557D03*
X926Y1457D03*
X951Y772D03*
X951Y672D03*
X951Y572D03*
X951Y472D03*
X2550Y772D03*
X2550Y672D03*
X2550Y572D03*
X2550Y472D03*
X2525Y1757D03*
X2525Y1657D03*
X2525Y1557D03*
X2525Y1457D03*
X1271Y625D03*
X1271Y280D03*
X1566Y1707D03*
X1566Y1412D03*
X2403Y871D03*
X2304Y428D03*
X2403Y1363D03*
X730Y428D03*
X730Y821D03*
X730Y1412D03*
X730Y1806D03*
X1123Y625D03*
X1714Y1560D03*
X2206Y1363D03*
X2304Y1363D03*
G54D13*
X1566Y964D03*
X1566Y1264D03*
X1666Y964D03*
X1666Y1264D03*
X1766Y964D03*
X1766Y1264D03*
X1866Y964D03*
X1866Y1264D03*
X1966Y964D03*
X1966Y1264D03*
G54D14*
X287Y2006D03*
X3043Y714D03*
G54D15*
X1566Y964D03*
G04 End of Mask0*
M02*

117
Circuits/GRB/SensorsPCB_maskTop.gts

@ -0,0 +1,117 @@
G04 MADE WITH FRITZING*
G04 WWW.FRITZING.ORG*
G04 DOUBLE SIDED*
G04 HOLES PLATED*
G04 CONTOUR ON CENTER OF CONTOUR VECTOR*
%ASAXBY*%
%FSLAX23Y23*%
%MOIN*%
%OFA0B0*%
%SFA1.0B1.0*%
%ADD10C,0.090000*%
%ADD11C,0.075278*%
%ADD12C,0.088000*%
%ADD13C,0.085000*%
%ADD14R,0.090000X0.090000*%
%ADD15R,0.085000X0.085000*%
%LNMASK1*%
G90*
G70*
G54D10*
X287Y2006D03*
X287Y1806D03*
X287Y1606D03*
X287Y1406D03*
X287Y1206D03*
X287Y1006D03*
X287Y806D03*
X287Y606D03*
X287Y406D03*
X287Y206D03*
X3043Y914D03*
X3043Y1114D03*
X3043Y1314D03*
X3043Y714D03*
G54D11*
X2628Y152D03*
X2728Y152D03*
X2828Y152D03*
X2928Y152D03*
X3028Y152D03*
X2168Y2052D03*
X2068Y2052D03*
X1968Y2052D03*
X1868Y2052D03*
X1768Y2052D03*
X1668Y2052D03*
X1568Y2052D03*
X1468Y2052D03*
X1368Y2052D03*
X1268Y2052D03*
X3028Y2052D03*
X2928Y2052D03*
X2828Y2052D03*
X2728Y2052D03*
X2628Y2052D03*
X2528Y2052D03*
X2428Y2052D03*
X2328Y2052D03*
X1728Y152D03*
X1628Y152D03*
X1828Y152D03*
X1928Y152D03*
X2028Y152D03*
X2128Y152D03*
X2228Y152D03*
X2328Y152D03*
X2528Y152D03*
G54D12*
X926Y1757D03*
X926Y1657D03*
X926Y1557D03*
X926Y1457D03*
X951Y772D03*
X951Y672D03*
X951Y572D03*
X951Y472D03*
X2550Y772D03*
X2550Y672D03*
X2550Y572D03*
X2550Y472D03*
X2525Y1757D03*
X2525Y1657D03*
X2525Y1557D03*
X2525Y1457D03*
X1271Y625D03*
X1271Y280D03*
X1566Y1707D03*
X1566Y1412D03*
X2403Y871D03*
X2304Y428D03*
X2403Y1363D03*
X730Y428D03*
X730Y821D03*
X730Y1412D03*
X730Y1806D03*
X1123Y625D03*
X1714Y1560D03*
X2206Y1363D03*
X2304Y1363D03*
G54D13*
X1566Y964D03*
X1566Y1264D03*
X1666Y964D03*
X1666Y1264D03*
X1766Y964D03*
X1766Y1264D03*
X1866Y964D03*
X1866Y1264D03*
X1966Y964D03*
X1966Y1264D03*
G54D14*
X287Y2006D03*
X3043Y714D03*
G54D15*
X1566Y964D03*
G04 End of Mask1*
M02*

43
Circuits/GRB/SensorsPCB_pnp.txt

@ -0,0 +1,43 @@
*Pick And Place List
*Company=
*Author=
*eMail=
*
*Project=SensorsPCB
*Date=18:53:18
*CreatedBy=Fritzing 0.9.3b.04.19.5c895d327c44a3114e5fcc9d8260daf0cbb52806
*
*
*Coordinates in mm, always center of component
*Origin 0/0=Lower left corner of PCB
*Rotation in degree (0-360, math. pos.)
*
*No;Value;Package;X;Y;Rotation;Side;Name
1;;THT;61.0302;-22.1159;0;Bottom;J24
2;;THT;18.5301;-45.8659;0;Bottom;J9
3;;;70.3817;-25.6133;-90;Bottom;TXT1
4;;DIP (Dual Inline) [THT];44.8603;-28.3059;-90;Bottom;IC3
5;;THT;23.5302;-40.8059;0;Bottom;J2
6;;THT;18.5301;-35.8659;0;Bottom;J10
7;;;44.6644;-28.7548;90;Bottom;IMG1
8;;;47.6632;-27.9859;0;Bottom;Componente1
9;;;14.5511;-25.9789;90;Bottom;TXT1
10;;THT;61.0302;-34.6159;0;Bottom;J23
11;;THT;39.7803;-43.3659;0;Bottom;J26
12;;THT;32.2803;-15.8658;0;Bottom;J29
13;;THT;58.5303;-34.6159;0;Bottom;J17
14;;THT;58.5303;-10.866;0;Bottom;J30
15;;THT;64.1432;-40.8059;0;Bottom;J3
16;;THT;24.1672;-15.806;0;Bottom;J4
17;;THT;73.6503;-25.7459;180;Bottom;J39
18;;THT;10.9103;-28.0859;0;Bottom;J40
19;;THT;56.0301;-34.6159;0;Bottom;J20
20;;THT;18.5301;-20.8659;0;Bottom;J11
21;;THT;43.5302;-39.6159;0;Bottom;J21
22;;THT;32.2803;-7.1159;0;Bottom;J28
23;;THT;39.7803;-35.8659;0;Bottom;J25
24;;;11.3806;-27.8831;90;Bottom;TXT1
25;;THT;64.7801;-15.806;0;Bottom;J5
26;;THT;28.5304;-15.8658;0;Bottom;J8
27;;THT;18.5301;-10.866;0;Bottom;J12
28;;;74.4035;-26.2564;-90;Bottom;TXT1

13477
Circuits/GRB/SensorsPCB_silkBottom.gbo

File diff suppressed because it is too large

32019
Circuits/GRB/SensorsPCB_silkTop.gto

File diff suppressed because it is too large

BIN
Circuits/PDF/PCB3_etch_copper_bottom.pdf

Binary file not shown.

BIN
Circuits/PDF/PCB3_etch_copper_bottom_mirror.pdf

Binary file not shown.

BIN
Circuits/PDF/PCB3_etch_copper_top.pdf

Binary file not shown.

BIN
Circuits/PDF/PCB3_etch_copper_top_mirror.pdf

Binary file not shown.

BIN
Circuits/PDF/PCB3_etch_mask_bottom.pdf

Binary file not shown.

BIN
Circuits/PDF/PCB3_etch_mask_bottom_mirror.pdf

Binary file not shown.

BIN
Circuits/PDF/PCB3_etch_mask_top.pdf

Binary file not shown.

BIN
Circuits/PDF/PCB3_etch_mask_top_mirror.pdf

Binary file not shown.

BIN
Circuits/PDF/PCB3_etch_paste_mask_bottom.pdf

Binary file not shown.

BIN
Circuits/PDF/PCB3_etch_paste_mask_bottom_mirror.pdf

Binary file not shown.

BIN
Circuits/PDF/PCB3_etch_paste_mask_top.pdf

Binary file not shown.

BIN
Circuits/PDF/PCB3_etch_paste_mask_top_mirror.pdf

Binary file not shown.

BIN
Circuits/PDF/PCB3_etch_silk_bottom.pdf

Binary file not shown.

BIN
Circuits/PDF/PCB3_etch_silk_bottom_mirror.pdf

Binary file not shown.

BIN
Circuits/PDF/PCB3_etch_silk_top.pdf

Binary file not shown.

BIN
Circuits/PDF/PCB3_etch_silk_top_mirror.pdf

Binary file not shown.

BIN
Circuits/PDF/SensorsPCB_etch_copper_bottom.pdf

Binary file not shown.

BIN
Circuits/PDF/SensorsPCB_etch_copper_bottom_mirror.pdf

Binary file not shown.

BIN
Circuits/PDF/SensorsPCB_etch_copper_top.pdf

Binary file not shown.

BIN
Circuits/PDF/SensorsPCB_etch_copper_top_mirror.pdf

Binary file not shown.

BIN
Circuits/PDF/SensorsPCB_etch_mask_bottom.pdf

Binary file not shown.

BIN
Circuits/PDF/SensorsPCB_etch_mask_bottom_mirror.pdf

Binary file not shown.

BIN
Circuits/PDF/SensorsPCB_etch_mask_top.pdf

Binary file not shown.

BIN
Circuits/PDF/SensorsPCB_etch_mask_top_mirror.pdf

Binary file not shown.

BIN
Circuits/PDF/SensorsPCB_etch_paste_mask_bottom.pdf

Binary file not shown.

BIN
Circuits/PDF/SensorsPCB_etch_paste_mask_bottom_mirror.pdf

Binary file not shown.

BIN
Circuits/PDF/SensorsPCB_etch_paste_mask_top.pdf

Binary file not shown.

BIN
Circuits/PDF/SensorsPCB_etch_paste_mask_top_mirror.pdf

Binary file not shown.

BIN
Circuits/PDF/SensorsPCB_etch_silk_bottom.pdf

Binary file not shown.

BIN
Circuits/PDF/SensorsPCB_etch_silk_bottom_mirror.pdf

Binary file not shown.

BIN
Circuits/PDF/SensorsPCB_etch_silk_top.pdf

Binary file not shown.

BIN
Circuits/PDF/SensorsPCB_etch_silk_top_mirror.pdf

Binary file not shown.

BIN
Circuits/Sensors.fzz

Binary file not shown.

BIN
Circuits/SensorsPCB.fzz

Binary file not shown.

BIN
Circuits/Sensors_schem.pdf

Binary file not shown.

BIN
Circuits/arduino.pdf

Binary file not shown.

10937
Circuits/arduino.svg

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 550 KiB

42
Circuits/logo.svg

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 25 KiB

BIN
Circuits/sensors.pdf

Binary file not shown.

10748
Circuits/sensors.svg

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 528 KiB

56
TEST/windAll/windAll.ino

@ -0,0 +1,56 @@
#include <SoftwareSerial.h>
#include <Wire.h>
const int enable[] = {0,8,9};
const byte codes[] = {0x01 ,0x03 ,0x00 ,0x00 ,0x00 ,0x02 ,0xC4 ,0x0B};
byte values[3][20];
SoftwareSerial sensor(10, 11); // RO / DI
void setup() {
Serial.begin(4800);
while(!Serial){;}
sensor.begin(4800);
delay(500);
pinMode(enable[1], OUTPUT);
pinMode(enable[2], OUTPUT);
}
void loop() {
int val1 = 0 ; // SPEED
int val2 = 0 ; // DIR
readSensor(1);
//val1 = ((values[1][5]*256)+values[1][6]);
val1 = values[1][4];
Serial.print("dir: ");
Serial.println(val1);
delay(1000);
readSensor(2);
val2 = values[2][4];
Serial.print("speed: ");
Serial.println(val2);
delay(1000);
}
byte readSensor(int index) {
digitalWrite(enable[index], HIGH);
delay(10);
if(sensor.write(codes, sizeof(codes)) == 8) {
digitalWrite(enable[index], LOW);
for (byte i = 0; i < 11; i++) {
values[index][i] = sensor.read();
Serial.print(values[index][i]);
Serial.print(" ");
}
}
Serial.println(" ");
}

45
TEST/windDir/windDir.ino

@ -0,0 +1,45 @@
#include <SoftwareSerial.h>
#include <Wire.h>
#define RE 7
#define DE 8
const byte O2[] = {0x01 ,0x03 ,0x00 ,0x00 ,0x00 ,0x02 ,0xC4 ,0x0B};
byte values[20];
SoftwareSerial mod(10, 11); // RO / DI
void setup() {
Serial.begin(4800);
mod.begin(4800);
pinMode(RE, OUTPUT);
pinMode(DE, OUTPUT);
}
void loop() {
int val1 = 0 ;
Calculate();
val1 = ((values[5]*256)+values[8]);
Serial.print("v: ");
Serial.println(val1);
delay(1000);
}
byte Calculate() {
digitalWrite(DE, HIGH);
digitalWrite(RE, HIGH);
delay(10);
if (mod.write(O2, sizeof(O2)) == 8) {
digitalWrite(DE, LOW);
digitalWrite(RE, LOW);
for (byte i = 0; i < 11; i++) {
//Serial.print(mod.read(),HEX);
values[i] = mod.read();
//Serial.print(values[i], HEX);
//Serial.print(" ");
}
Serial.println();
}
return values[6];
}

46
TEST/windSpeed/windSpeed.ino

@ -0,0 +1,46 @@
#include <SoftwareSerial.h>
#include <Wire.h>
#define RE 7
#define DE 8
const byte O2[] = {0x01 ,0x03 ,0x00 ,0x00 ,0x00 ,0x02 ,0xC4 ,0x0B};
byte values[20];
SoftwareSerial mod(10, 11); // RO / DI
void setup() {
Serial.begin(4800);
mod.begin(4800);
pinMode(RE, OUTPUT);
pinMode(DE, OUTPUT);
}
void loop() {
int val1 = 0 ;
Calculate();
//val1 = ((values[5]*256)+values[8]);
val1 = (values[4]);
Serial.print("v: ");
Serial.println(val1);
delay(1000);
}
byte Calculate() {
digitalWrite(DE, HIGH);
digitalWrite(RE, HIGH);
delay(10);
if (mod.write(O2, sizeof(O2)) == 8) {
digitalWrite(DE, LOW);
digitalWrite(RE, LOW);
for (byte i = 0; i < 11; i++) {
//Serial.print(mod.read(),HEX);
values[i] = mod.read();
//Serial.print(values[i]);
//Serial.print(" ");
}
Serial.println();
}
//return values[6];
}

3
Web/AUTH

@ -0,0 +1,3 @@
MySQL
USR dslak
PWD D5l4kMyPwd!

1
Web/deploy.sh

@ -0,0 +1 @@
rsync -rlvz --delete --exclude "tmp" --exclude "config.php" -e "ssh -p2222" ./api/ dslak@2.233.91.82:/var/www/weather/api/

16
Web/weather/.browserslistrc

@ -0,0 +1,16 @@
# This file is used by the build system to adjust CSS and JS output to support the specified browsers below.
# For additional information regarding the format and rule options, please see:
# https://github.com/browserslist/browserslist#queries
# For the full list of supported browsers by the Angular framework, please see:
# https://angular.io/guide/browser-support
# You can see what browsers were selected by your queries by running:
# npx browserslist
last 1 Chrome version
last 1 Firefox version
last 2 Edge major versions
last 2 Safari major versions
last 2 iOS major versions
Firefox ESR

16
Web/weather/.editorconfig

@ -0,0 +1,16 @@
# Editor configuration, see https://editorconfig.org
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 2
insert_final_newline = true
trim_trailing_whitespace = true
[*.ts]
quote_type = single
[*.md]
max_line_length = off
trim_trailing_whitespace = false

42
Web/weather/.gitignore

@ -0,0 +1,42 @@
# See http://help.github.com/ignore-files/ for more about ignoring files.
# Compiled output
/dist
/tmp
/out-tsc
/bazel-out
# Node
/node_modules
npm-debug.log
yarn-error.log
# IDEs and editors
.idea/
.project
.classpath
.c9/
*.launch
.settings/
*.sublime-workspace
# Visual Studio Code
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
.history/*
# Miscellaneous
/.angular/cache
.sass-cache/
/connect.lock
/coverage
/libpeerconnection.log
testem.log
/typings
# System files
.DS_Store
Thumbs.db

4
Web/weather/.vscode/extensions.json

@ -0,0 +1,4 @@
{
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=827846
"recommendations": ["angular.ng-template"]
}

20
Web/weather/.vscode/launch.json

@ -0,0 +1,20 @@
{
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "ng serve",
"type": "pwa-chrome",
"request": "launch",
"preLaunchTask": "npm: start",
"url": "http://localhost:4200/"
},
{
"name": "ng test",
"type": "chrome",
"request": "launch",
"preLaunchTask": "npm: test",
"url": "http://localhost:9876/debug.html"
}
]
}

42
Web/weather/.vscode/tasks.json

@ -0,0 +1,42 @@
{
// For more information, visit: https://go.microsoft.com/fwlink/?LinkId=733558
"version": "2.0.0",
"tasks": [
{
"type": "npm",
"script": "start",
"isBackground": true,
"problemMatcher": {
"owner": "typescript",
"pattern": "$tsc",
"background": {
"activeOnStart": true,
"beginsPattern": {
"regexp": "(.*?)"
},
"endsPattern": {
"regexp": "bundle generation complete"
}
}
}
},
{
"type": "npm",
"script": "test",
"isBackground": true,
"problemMatcher": {
"owner": "typescript",
"pattern": "$tsc",
"background": {
"activeOnStart": true,
"beginsPattern": {
"regexp": "(.*?)"
},
"endsPattern": {
"regexp": "bundle generation complete"
}
}
}
}
]
}

27
Web/weather/README.md

@ -0,0 +1,27 @@
# Weather
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 14.2.1.
## Development server
Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The application will automatically reload if you change any of the source files.
## Code scaffolding
Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`.
## Build
Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory.
## Running unit tests
Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).
## Running end-to-end tests
Run `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities.
## Further help
To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.

119
Web/weather/angular.json

@ -0,0 +1,119 @@
{
"$schema": "./node_modules/@angular/cli/lib/config/schema.json",
"version": 1,
"newProjectRoot": "projects",
"projects": {
"weather": {
"projectType": "application",
"schematics": {
"@schematics/angular:component": {
"style": "scss"
}
},
"root": "",
"sourceRoot": "src",
"prefix": "app",
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:browser",
"options": {
"outputPath": "dist/weather",
"index": "src/index.html",
"main": "src/main.ts",
"polyfills": "src/polyfills.ts",
"tsConfig": "tsconfig.app.json",
"inlineStyleLanguage": "scss",
"assets": [
"src/favicon.ico",
"src/assets",
"src/.htaccess",
"src/api",
"src/uploads"
],
"styles": [
"src/assets/scss/main.scss"
],
"scripts": []
},
"configurations": {
"production": {
"budgets": [
{
"type": "initial",
"maximumWarning": "8mb",
"maximumError": "10mb"
},
{
"type": "anyComponentStyle",
"maximumWarning": "80kb",
"maximumError": "100kb"
}
],
"fileReplacements": [
{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.prod.ts"
}
],
"outputHashing": "all"
},
"development": {
"buildOptimizer": false,
"optimization": false,
"vendorChunk": true,
"extractLicenses": false,
"sourceMap": true,
"namedChunks": true
}
},
"defaultConfiguration": "production"
},
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"options": {
"browserTarget": "weather:build",
"proxyConfig": "proxy.conf.json"
},
"configurations": {
"production": {
"browserTarget": "weather:build:production",
"proxyConfig": "proxy.conf.prod.json"
},
"development": {
"browserTarget": "weather:build:development",
"proxyConfig": "proxy.conf.json"
}
},
"defaultConfiguration": "development"
},
"extract-i18n": {
"builder": "@angular-devkit/build-angular:extract-i18n",
"options": {
"browserTarget": "weather:build"
}
},
"test": {
"builder": "@angular-devkit/build-angular:karma",
"options": {
"main": "src/test.ts",
"polyfills": "src/polyfills.ts",
"tsConfig": "tsconfig.spec.json",
"karmaConfig": "karma.conf.js",
"inlineStyleLanguage": "scss",
"assets": [
"src/favicon.ico",
"src/assets",
"src/.htaccess",
"src/api",
"src/uploads"
],
"styles": [
"src/assets/scss/main.scss"
],
"scripts": []
}
}
}
}
}
}

44
Web/weather/karma.conf.js

@ -0,0 +1,44 @@
// Karma configuration file, see link for more information
// https://karma-runner.github.io/1.0/config/configuration-file.html
module.exports = function (config) {
config.set({
basePath: '',
frameworks: ['jasmine', '@angular-devkit/build-angular'],
plugins: [
require('karma-jasmine'),
require('karma-chrome-launcher'),
require('karma-jasmine-html-reporter'),
require('karma-coverage'),
require('@angular-devkit/build-angular/plugins/karma')
],
client: {
jasmine: {
// you can add configuration options for Jasmine here
// the possible options are listed at https://jasmine.github.io/api/edge/Configuration.html
// for example, you can disable the random execution with `random: false`
// or set a specific seed with `seed: 4321`
},
clearContext: false // leave Jasmine Spec Runner output visible in browser
},
jasmineHtmlReporter: {
suppressAll: true // removes the duplicated traces
},
coverageReporter: {
dir: require('path').join(__dirname, './coverage/weather'),
subdir: '.',
reporters: [
{ type: 'html' },
{ type: 'text-summary' }
]
},
reporters: ['progress', 'kjhtml'],
port: 9876,
colors: true,
logLevel: config.LOG_INFO,
autoWatch: true,
browsers: ['Chrome'],
singleRun: false,
restartOnFileChange: true
});
};

41
Web/weather/package.json

@ -0,0 +1,41 @@
{
"name": "weather",
"version": "0.0.0",
"scripts": {
"dev": "export NODE_OPTIONS=--openssl-legacy-provider && ng serve",
"prod": "export NODE_OPTIONS=--openssl-legacy-provider && ng build --configuration production --base-href /weather/",
"deploy": "yarn prod && sh deploy.sh"
},
"private": true,
"dependencies": {
"@angular/animations": "^14.0.0",
"@angular/common": "^14.0.0",
"@angular/compiler": "^14.0.0",
"@angular/core": "^14.0.0",
"@angular/forms": "^14.0.0",
"@angular/platform-browser": "^14.0.0",
"@angular/platform-browser-dynamic": "^14.0.0",
"@angular/router": "^14.0.0",
"@popperjs/core": "^2.11.6",
"bootstrap": "^5.2.3",
"echarts": "^5.4.1",
"hamburgers": "^1.2.1",
"ngx-echarts": "14",
"rxjs": "~7.5.0",
"tslib": "^2.3.0",
"zone.js": "~0.11.4"
},
"devDependencies": {
"@angular-devkit/build-angular": "^14.2.1",
"@angular/cli": "~14.2.1",
"@angular/compiler-cli": "^14.0.0",
"@types/jasmine": "~4.0.0",
"jasmine-core": "~4.3.0",
"karma": "~6.4.0",
"karma-chrome-launcher": "~3.1.0",
"karma-coverage": "~2.2.0",
"karma-jasmine": "~5.1.0",
"karma-jasmine-html-reporter": "~2.0.0",
"typescript": "~4.7.2"
}
}

9
Web/weather/proxy.conf.json

@ -0,0 +1,9 @@
{
"/api/*": {
"target": "http://weatherapi.local",
"secure": false,
"changeOrigin": true,
"logLevel": "debug"
}
}

9
Web/weather/proxy.conf.prod.json

@ -0,0 +1,9 @@
{
"/api/*": {
"target": "http://2.233.91.82/weather/api",
"secure": false,
"changeOrigin": true,
"logLevel": "debug"
}
}

3
Web/weather/src/api/.htaccess

@ -0,0 +1,3 @@
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

7
Web/weather/src/api/config.php

@ -0,0 +1,7 @@
<?php
$GLOBALS['CONF']['DB']['HOST'] = 'localhost';
$GLOBALS['CONF']['DB']['USER'] = 'root';
$GLOBALS['CONF']['DB']['PASS'] = 'root';
?>

33
Web/weather/src/api/get_data.php

@ -0,0 +1,33 @@
<?php
@include 'config.php';
@include 'headers.php';
$conn = @mysqli_connect($CONF['DB']['HOST'], $CONF['DB']['USER'], $CONF['DB']['PASS'], 'weather')or die("CONNECTION ERROR");
$day = $_GET['day'];
$q = mysqli_query($conn, "SELECT * FROM `data` WHERE `date` LIKE '$day%'");
if($q) {
$list = array();
while($row = mysqli_fetch_assoc($q)) {
$list[] = $row;
}
http_response_code(200);
echo json_encode(array(
"status" => 200,
"items" => $list
));
} else {
http_response_code(400);
echo json_encode(array(
"status" => 400,
"message" => "Error executing query"
));
}
?>

9
Web/weather/src/api/headers.php

@ -0,0 +1,9 @@
<?php
header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");
header("Access-Control-Allow-Methods: POST,GET");
header("Access-Control-Max-Age: 3600");
?>

25
Web/weather/src/api/station.php

@ -0,0 +1,25 @@
<?php
@include 'config.php';
@include 'headers.php';
$conn = @mysqli_connect($CONF['DB']['HOST'], $CONF['DB']['USER'], $CONF['DB']['PASS'], 'weather')or die("CONNECTION ERROR");
$data = explode('|',$_GET['data']);
$query = "INSERT INTO `data` VALUES(NULL, NOW(), ".$data[0].", ".$data[1].", ".$data[2].", ".$data[3].", ".$data[4].")";
if(mysqli_query($conn, $query)) {
http_response_code(200);
echo json_encode(array(
"status" => 200,
"message" => "Data succesfully added"
));
} else {
http_response_code(400);
echo json_encode(array(
"status" => 400,
"message" => "Error executing query".$query
));
}
?>

1
Web/weather/src/app/app-layout/app-layout.component.html

@ -0,0 +1 @@
<p>app-layout works!</p>

0
Web/weather/src/app/app-layout/app-layout.component.scss

23
Web/weather/src/app/app-layout/app-layout.component.spec.ts

@ -0,0 +1,23 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { AppLayoutComponent } from './app-layout.component';
describe('AppLayoutComponent', () => {
let component: AppLayoutComponent;
let fixture: ComponentFixture<AppLayoutComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ AppLayoutComponent ]
})
.compileComponents();
fixture = TestBed.createComponent(AppLayoutComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

15
Web/weather/src/app/app-layout/app-layout.component.ts

@ -0,0 +1,15 @@
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-app-layout',
templateUrl: './app-layout.component.html',
styleUrls: ['./app-layout.component.scss']
})
export class AppLayoutComponent implements OnInit {
constructor() { }
ngOnInit(): void {
}
}

18
Web/weather/src/app/app.component.html

@ -0,0 +1,18 @@
<header class="header">
<span class="title">{{title}}</span>
<div class="menu">
<div class="hamburger hamburger--spin" [ngClass]="{'is-active': menuOpen}" (click)="toggleMenu()">
<div class="hamburger-box">
<div class="hamburger-inner"></div>
</div>
</div>
</div>
<div class="menu-items" [@slideInOut]="menuOpen ? 'open' : 'close'">
<div class="item" (click)="toggleMenu()">Capaccio</div>
<div class="item" (click)="toggleMenu()">Pisciotta</div>
</div>
</header>
<main class="main-content">
<app-dashboard [day]="day"></app-dashboard>
</main>

71
Web/weather/src/app/app.component.scss

@ -0,0 +1,71 @@
@import "../assets/scss/variables";
.header {
position: fixed;
display: flex;
top: 0;
left: 0;
height: $header-height-mobile;
width: 100%;
background: $dark-gray;
background-color: rgb(32, 32, 32);
background-image: linear-gradient(45deg, $dark-gray 25%, transparent 25%, transparent 75%, $dark-gray 75%, $dark-gray),
linear-gradient(45deg, $dark-gray 25%, transparent 25%, transparent 75%, $dark-gray 75%, $dark-gray),
linear-gradient(to bottom, $black-alpha, $dark-gray);
background-size: 10px 10px, 10px 10px, 10px 5px;
background-position: 0px 0px, 5px 5px, 0px 0px;
z-index: 100;
@media (min-width: map-get($grid-breakpoints, 'md')) {
height: $header-height;
}
.title {
display: block;
padding: 0 50px;
font-family: $font-serif;
font-size: $font-30;
font-weight: bold;
color: $white-alpha;
margin: auto auto 15px auto;
text-shadow: 0 0 2px $black;
}
.menu {
position: absolute;
top: 20px;
right: 20px;
height: $hamburger-layer-width;
width: $hamburger-layer-width;
overflow: visible;
}
.menu-items {
position: absolute;
display: block;
top: $header-height-mobile;
left: 0;
width: 100%;
height: calc(100vh - $header-height-mobile);
background: $white;
overflow: hidden;
@media (min-width: map-get($grid-breakpoints, 'md')) {
top: $header-height;
height: calc(100vh - $header-height-mobile);
}
.item {
display: block;
background: $white;
padding: 20px;
font-size: $font-34;
font-family: $font-serif;
text-align: center;
text-transform: uppercase;
color: $dark-gray;
border-bottom: 1px dotted $black-alpha;
cursor: pointer;
}
}
}

31
Web/weather/src/app/app.component.spec.ts

@ -0,0 +1,31 @@
import { TestBed } from '@angular/core/testing';
import { AppComponent } from './app.component';
describe('AppComponent', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [
AppComponent
],
}).compileComponents();
});
it('should create the app', () => {
const fixture = TestBed.createComponent(AppComponent);
const app = fixture.componentInstance;
expect(app).toBeTruthy();
});
it(`should have as title 'weather'`, () => {
const fixture = TestBed.createComponent(AppComponent);
const app = fixture.componentInstance;
expect(app.title).toEqual('weather');
});
it('should render title', () => {
const fixture = TestBed.createComponent(AppComponent);
fixture.detectChanges();
const compiled = fixture.nativeElement as HTMLElement;
expect(compiled.querySelector('.content span')?.textContent).toContain('weather app is running!');
});
});

33
Web/weather/src/app/app.component.ts

@ -0,0 +1,33 @@
import { Component } from '@angular/core'
import { trigger, state, style, animate, transition } from '@angular/animations'
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'],
animations: [
trigger('slideInOut', [
state('close', style({
opacity: '0',
height: '0px'
})),
state('open', style({
opacity: '1',
height: '*'
})),
transition('close => open', animate('300ms ease-in-out')),
transition('open => close', animate('300ms ease-in-out'))
])
]
})
export class AppComponent {
public title: string = 'Dslak weather station'
public day: string = new Date().toISOString().substring(0,10)
public menuOpen: boolean = false
toggleMenu(): void {
this.menuOpen = !this.menuOpen
}
}

33
Web/weather/src/app/app.module.ts

@ -0,0 +1,33 @@
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { BrowserModule } from '@angular/platform-browser';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { HttpClientModule } from '@angular/common/http';
import { NgxEchartsModule } from 'ngx-echarts';
import { environment } from '../environments/environment'
import { AppComponent } from './app.component';
import { AppLayoutComponent } from './app-layout/app-layout.component';
import { GraphComponent } from './graph/graph.component';
import { DashboardComponent } from './dashboard/dashboard.component';
@NgModule({
declarations: [
AppComponent,
AppLayoutComponent,
GraphComponent,
DashboardComponent
],
imports: [
BrowserModule,
FormsModule,
BrowserAnimationsModule,
HttpClientModule,
NgxEchartsModule.forRoot({
echarts: () => import('echarts')
})
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }

3
Web/weather/src/app/dashboard/dashboard.component.html

@ -0,0 +1,3 @@
<div class="dashboard-container">
<app-graph [data]="data"></app-graph>
</div>

0
Web/weather/src/app/dashboard/dashboard.component.scss

23
Web/weather/src/app/dashboard/dashboard.component.spec.ts

@ -0,0 +1,23 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { DashboardComponent } from './dashboard.component';
describe('DashboardComponent', () => {
let component: DashboardComponent;
let fixture: ComponentFixture<DashboardComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ DashboardComponent ]
})
.compileComponents();
fixture = TestBed.createComponent(DashboardComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

37
Web/weather/src/app/dashboard/dashboard.component.ts

@ -0,0 +1,37 @@
import { Component, OnInit, Input, ViewEncapsulation } from '@angular/core'
import { StationService } from '../station.service'
import { environment } from '../../environments/environment'
@Component({
selector: 'app-dashboard',
templateUrl: './dashboard.component.html',
styleUrls: ['./dashboard.component.scss'],
encapsulation: ViewEncapsulation.None
})
export class DashboardComponent implements OnInit {
@Input() day: string = ''
public data: any = []
constructor(
private stationService: StationService
) { }
ngOnInit(): void {
if(this.day) this.getData()
}
getData(): void {
this.stationService.getData(this.day).toPromise().then( (data) => {
console.log(data)
this.data = data.items
},(error) => {
console.error(error)
}).catch((e) => {
console.error(e)
})
}
}

6
Web/weather/src/app/graph/graph.component.html

@ -0,0 +1,6 @@
<div class="graph">
<div class="canvas-container">
<div echarts class="canvas" [options]="graph.options" (chartInit)="onChartInit($event, graph)"></div>
<div class="canvas-loader" *ngIf="graph.loading"><div class="spinner"></div></div>
</div>
</div>

76
Web/weather/src/app/graph/graph.component.scss

@ -0,0 +1,76 @@
@import "../../assets/scss/variables";
.graph {
position: relative;
display: block;
background: $white;
border-radius: 3px;
padding: 0px;
width: 100%;
height: calc(100vh - $header-height-mobile);
@media (min-width: map-get($grid-breakpoints, 'md')) {
height: calc(100vh - $header-height-mobile);
}
.canvas-container {
position: relative;
display: block;
border-radius: 3px;
padding: 0px;
height: calc(100vh - $header-height-mobile);
@media (min-width: map-get($grid-breakpoints, 'md')) {
height: calc(100vh - $header-height-mobile);
}
.canvas-loader {
position: absolute;
top: 0;
left: 0;
border-radius: 3px;
background: $white;
margin-top: 0;
width: 100%;
height: 630px;
z-index: 1;
>.spinner {
position: absolute;
top: calc(50% - 30px);
left: calc(50% - 30px);
border-radius: 50%;
width: 100px;
height: 100px;
border-top: 15px solid $black-alpha;
border-right: 15px solid $black-alpha;
border-bottom: 15px solid $black-alpha;
border-left: 15px solid $white;
animation: graphLoader 1s infinite linear;
&:after {
border-radius: 50%;
width: 100px;
height: 100px;
}
}
}
.canvas {
position: relative;
display: block;
border-radius: 3px;
padding: 0px;
height: calc(100vh - $header-height-mobile);
@media (min-width: map-get($grid-breakpoints, 'md')) {
height: calc(100vh - $header-height-mobile);
}
}
}
}
@keyframes graphLoader {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}

23
Web/weather/src/app/graph/graph.component.spec.ts

@ -0,0 +1,23 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { GraphComponent } from './graph.component';
describe('GraphComponent', () => {
let component: GraphComponent;
let fixture: ComponentFixture<GraphComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ GraphComponent ]
})
.compileComponents();
fixture = TestBed.createComponent(GraphComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save