summaryrefslogtreecommitdiffstats
path: root/fiz/naloga/merjenje
diff options
context:
space:
mode:
authorAnton Luka Šijanec <anton@sijanec.eu>2022-05-30 22:05:30 +0200
committerAnton Luka Šijanec <anton@sijanec.eu>2022-05-30 22:05:30 +0200
commitbe93772bd4ab8b9af5fa155565d732e5e7cff51e (patch)
tree506445114f1973f2caf44b37d80749197e37c4e4 /fiz/naloga/merjenje
parentMerge branch 'master' of https://git.šijanec.si/sijanec/sola-gimb-3 (diff)
downloadsola-gimb-3-be93772bd4ab8b9af5fa155565d732e5e7cff51e.tar
sola-gimb-3-be93772bd4ab8b9af5fa155565d732e5e7cff51e.tar.gz
sola-gimb-3-be93772bd4ab8b9af5fa155565d732e5e7cff51e.tar.bz2
sola-gimb-3-be93772bd4ab8b9af5fa155565d732e5e7cff51e.tar.lz
sola-gimb-3-be93772bd4ab8b9af5fa155565d732e5e7cff51e.tar.xz
sola-gimb-3-be93772bd4ab8b9af5fa155565d732e5e7cff51e.tar.zst
sola-gimb-3-be93772bd4ab8b9af5fa155565d732e5e7cff51e.zip
Diffstat (limited to 'fiz/naloga/merjenje')
-rw-r--r--fiz/naloga/merjenje/.gitignore1
-rw-r--r--fiz/naloga/merjenje/README4
-rw-r--r--fiz/naloga/merjenje/data/index.html19
-rw-r--r--fiz/naloga/merjenje/data/settings.json26
-rw-r--r--fiz/naloga/merjenje/include/README39
-rw-r--r--fiz/naloga/merjenje/lib/README46
-rw-r--r--fiz/naloga/merjenje/platformio.ini29
-rw-r--r--fiz/naloga/merjenje/src/main.cpp171
-rw-r--r--fiz/naloga/merjenje/test/README11
9 files changed, 346 insertions, 0 deletions
diff --git a/fiz/naloga/merjenje/.gitignore b/fiz/naloga/merjenje/.gitignore
new file mode 100644
index 0000000..03f4a3c
--- /dev/null
+++ b/fiz/naloga/merjenje/.gitignore
@@ -0,0 +1 @@
+.pio
diff --git a/fiz/naloga/merjenje/README b/fiz/naloga/merjenje/README
new file mode 100644
index 0000000..41145b3
--- /dev/null
+++ b/fiz/naloga/merjenje/README
@@ -0,0 +1,4 @@
+pio run
+pio run --target uploadfs
+pio run --target upload
+pio run --target clean
diff --git a/fiz/naloga/merjenje/data/index.html b/fiz/naloga/merjenje/data/index.html
new file mode 100644
index 0000000..83d10b8
--- /dev/null
+++ b/fiz/naloga/merjenje/data/index.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html lang=sl>
+ <head>
+ <meta charset=UTF-8 />
+ <title>
+ spletni vmesnik merilnika magnetnega polja
+ </title>
+ <link rel=stylesheet href=//sijanec.eu/assets/css/styles.css />
+ </head>
+ <body>
+ <h1>
+ spletni vmesnik računalnika projektne naloge pri fiziki v tretjem letniku
+ </h1>
+ <hr>
+ <p>
+ Anton Luka Šijanec 2022 --- <a href=//git.sijanec.eu/sijanec/sola-gimb-3/src/branch/master/fiz/naloga/merjenje>izvorna koda</a>
+ </p>
+ </body>
+</html>
diff --git a/fiz/naloga/merjenje/data/settings.json b/fiz/naloga/merjenje/data/settings.json
new file mode 100644
index 0000000..eb045ba
--- /dev/null
+++ b/fiz/naloga/merjenje/data/settings.json
@@ -0,0 +1,26 @@
+{
+ "ap_ssid": "b",
+ "ap_pass": "",
+ "ap_ch": 1,
+ "ap_hidden": 0,
+ "ap_ip": "10.82.66.1",
+ "ap_gw": "10.82.66.2",
+ "ap_nm": "255.255.255.0",
+ "ap_dns1": "",
+ "ap_dns2": "",
+ "ap_host": "b",
+ "sta_ssid": "OpenWrt",
+ "sta_pass": "",
+ "sta_ip": "",
+ "sta_dns1": "",
+ "sta_dns2": "",
+ "sta_gw": "",
+ "sta_host": "b",
+ "sta_static": 0,
+ "ftp_user": "b",
+ "ftp_pass": "",
+ "http_user": "",
+ "http_pass": "",
+ "host": "b",
+ "mpu_address": 104 // 104 oz. 0x68 ako je AD0 GND, 105 oz. 0x69 ako je AD0 +
+}
diff --git a/fiz/naloga/merjenje/include/README b/fiz/naloga/merjenje/include/README
new file mode 100644
index 0000000..194dcd4
--- /dev/null
+++ b/fiz/naloga/merjenje/include/README
@@ -0,0 +1,39 @@
+
+This directory is intended for project header files.
+
+A header file is a file containing C declarations and macro definitions
+to be shared between several project source files. You request the use of a
+header file in your project source file (C, C++, etc) located in `src` folder
+by including it, with the C preprocessing directive `#include'.
+
+```src/main.c
+
+#include "header.h"
+
+int main (void)
+{
+ ...
+}
+```
+
+Including a header file produces the same results as copying the header file
+into each source file that needs it. Such copying would be time-consuming
+and error-prone. With a header file, the related declarations appear
+in only one place. If they need to be changed, they can be changed in one
+place, and programs that include the header file will automatically use the
+new version when next recompiled. The header file eliminates the labor of
+finding and changing all the copies as well as the risk that a failure to
+find one copy will result in inconsistencies within a program.
+
+In C, the usual convention is to give header files names that end with `.h'.
+It is most portable to use only letters, digits, dashes, and underscores in
+header file names, and at most one dot.
+
+Read more about using header files in official GCC documentation:
+
+* Include Syntax
+* Include Operation
+* Once-Only Headers
+* Computed Includes
+
+https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html
diff --git a/fiz/naloga/merjenje/lib/README b/fiz/naloga/merjenje/lib/README
new file mode 100644
index 0000000..6debab1
--- /dev/null
+++ b/fiz/naloga/merjenje/lib/README
@@ -0,0 +1,46 @@
+
+This directory is intended for project specific (private) libraries.
+PlatformIO will compile them to static libraries and link into executable file.
+
+The source code of each library should be placed in a an own separate directory
+("lib/your_library_name/[here are source files]").
+
+For example, see a structure of the following two libraries `Foo` and `Bar`:
+
+|--lib
+| |
+| |--Bar
+| | |--docs
+| | |--examples
+| | |--src
+| | |- Bar.c
+| | |- Bar.h
+| | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html
+| |
+| |--Foo
+| | |- Foo.c
+| | |- Foo.h
+| |
+| |- README --> THIS FILE
+|
+|- platformio.ini
+|--src
+ |- main.c
+
+and a contents of `src/main.c`:
+```
+#include <Foo.h>
+#include <Bar.h>
+
+int main (void)
+{
+ ...
+}
+
+```
+
+PlatformIO Library Dependency Finder will find automatically dependent
+libraries scanning project source files.
+
+More information about PlatformIO Library Dependency Finder
+- https://docs.platformio.org/page/librarymanager/ldf.html
diff --git a/fiz/naloga/merjenje/platformio.ini b/fiz/naloga/merjenje/platformio.ini
new file mode 100644
index 0000000..16eaddd
--- /dev/null
+++ b/fiz/naloga/merjenje/platformio.ini
@@ -0,0 +1,29 @@
+; PlatformIO Project Configuration File
+;
+; Build options: build flags, source filter
+; Upload options: custom upload port, speed and extra flags
+; Library options: dependencies, extra library storages
+; Advanced options: extra scripting
+;
+; Please visit documentation for the other options and examples
+; https://docs.platformio.org/page/projectconf.html
+
+[env:myboard]
+platform = espressif8266
+board = nodemcuv2
+monitor_speed = 9600
+upload_speed = 460800
+build_flags = -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_PORT=Serial -DIP_FORWARD=1 -DMONITOR_SPEED=9600
+framework = arduino
+board_build.filesystem = littlefs
+board_build.ldscript = eagle.flash.4m2m.ld
+src_filter = -<*> +<main.cpp>
+# http://git/anonymous/FTPClientServer <= to je mirror sicer nedelujočega
+# http://github.com/dplasa/FTPClientServer <= ta ne dela, trenutni je fork njega
+lib_deps =
+ Time
+ https://github.com/AddioElectronicsForks/FTPClientServer
+ DNSServer
+ ESP Async WebServer
+ ArduinoJson
+ MPU9250
diff --git a/fiz/naloga/merjenje/src/main.cpp b/fiz/naloga/merjenje/src/main.cpp
new file mode 100644
index 0000000..a5209da
--- /dev/null
+++ b/fiz/naloga/merjenje/src/main.cpp
@@ -0,0 +1,171 @@
+#define ARDUINOJSON_ENABLE_COMMENTS 1
+#include <stdlib.h>
+#include <Arduino.h>
+#include <ArduinoJson.h>
+#include "LittleFS.h"
+#include <DNSServer.h>
+#include <ESP8266WiFi.h>
+#include <WiFiClient.h>
+#include <TimeLib.h>
+#include <WiFiUdp.h>
+#include <ESP8266httpUpdate.h>
+#include <ESPAsyncWebServer.h>
+#undef __POLLEDTIMING_H__ // http://github.com/dplasa/FTPClientServer/pull/19
+#include <FTPServer.h>
+#define TEXT_ENC "text/plain"
+#include "MPU9250.h"
+const int str2pin_map[] = { D0, D1, D2, D3, D4, D5, D6, D7, D8, D9, D10, 0, 0, 0, 0, 0, 0, 0, 0, 0, A0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+int str2pin (const char * s) {
+ if (s[0] >= '0' && s[0] <= '9')
+ return atoi(s);
+ return str2pin_map[atoi(s+1) + ((s[0] == 'A') ? 20 : 0)];
+}
+DynamicJsonDocument settings(1024);
+void load_settings () {
+ if (LittleFS.exists("settings.json")) {
+ File s = LittleFS.open("settings.json", "r");
+ if (s)
+ deserializeJson(settings, s);
+ s.close();
+ }
+}
+void store_settings () {
+ File s = LittleFS.open("settings.json", "w");
+ serializeJson(settings, s);
+ s.close();
+}
+void notFound (AsyncWebServerRequest * request) {
+ request->send(404, "text/plain", "404");
+}
+FTPServer ftpServer(LittleFS);
+DNSServer dnsServer;
+AsyncWebServer httpServer(80);
+MPU9250 mpu;
+int do_reload = 0;
+int measure = 0;
+void reload (bool w) {
+ Serial.println("reload");
+ if (!w) {
+ Serial.println("stopping services: ftp");
+ ftpServer.stop();
+ Serial.println("stopping services: http");
+ httpServer.reset();
+ httpServer.end();
+ Serial.println("stopping services: dns");
+ dnsServer.stop();
+ }
+ Serial.println("loading settings");
+ load_settings();
+ pinMode(LED_BUILTIN, OUTPUT);
+ digitalWrite(LED_BUILTIN, HIGH); // izklopi luč
+ Serial.println("access point");
+ const char * ap_pass = settings["ap_pass"].as<String>().c_str();
+ if (ap_pass && strlen(ap_pass) < 8)
+ ap_pass = NULL;
+ WiFi.mode(WIFI_AP);
+ WiFi.softAP(settings["ap_ssid"].as<String>().c_str(), ap_pass, settings["ap_ch"].as<int>(), settings["ap_hidden"].as<int>());
+ Serial.println("WiFi.softAPIP() = " + WiFi.softAPIP().toString());
+ Serial.println("station networking");
+ const char * sta_ssid = settings["sta_ssid"].as<String>().c_str();
+ if (sta_ssid && strlen(sta_ssid)) {
+ Serial.println("setting up wifi station mode");
+ IPAddress sta_ip(10, 69, 69, 82);
+ sta_ip.fromString(settings["sta_ip"].as<String>());
+ IPAddress sta_gw(10, 69, 69, 1);
+ sta_gw.fromString(settings["sta_gw"].as<String>());
+ IPAddress sta_nm(10, 69, 69, 255);
+ sta_nm.fromString(settings["sta_nm"].as<String>());
+ IPAddress sta_dns1(93, 103, 235, 126);
+ sta_dns1.fromString(settings["sta_dns1"].as<String>());
+ IPAddress sta_dns2(89, 212, 146, 168);
+ sta_dns2.fromString(settings["sta_dns2"].as<String>());
+ const char * sta_mac = settings["sta_mac"].as<String>().c_str();
+ if (sta_mac && strlen(sta_mac)) {
+ long long unsigned int mac;
+ uint8_t macar[6];
+ mac = strtoull(sta_mac, NULL, 16);
+ memcpy(macar, (char *) &mac, 6);
+ wifi_set_macaddr(STATION_IF, macar);
+ }
+ WiFi.disconnect(true);
+ WiFi.hostname(settings["sta_host"].as<String>());
+ const char * sta_pass = settings["sta_pass"].as<String>().c_str();
+ if (sta_pass && strlen(sta_pass) < 8)
+ sta_pass = NULL;
+ WiFi.begin(sta_ssid, sta_pass);
+ if (settings["sta_static"].as<int>())
+ if (!WiFi.config(sta_ip, sta_gw, sta_nm, sta_dns1, sta_dns2))
+ Serial.println("failed to wifi config");
+ Serial.println(String("wifi local ip: "+WiFi.localIP().toString()));
+ } else
+ WiFi.disconnect();
+ dnsServer.start(53, settings["host"], WiFi.softAPIP());
+ ftpServer.begin(settings["ftp_user"], settings["ftp_pass"]);
+#define ADD_AUTH(s) s.setAuthentication(settings["http_user"], settings["http_pass"])
+ auto f = httpServer.serveStatic("/", LittleFS, "/").setDefaultFile("index.html");
+ ADD_AUTH(f);
+ auto s = httpServer.on("/s", [](AsyncWebServerRequest * r) {
+ r->send(201, TEXT_ENC, "OK\n");
+ ESP.restart();
+ });
+ ADD_AUTH(s);
+ auto l = httpServer.on("/l", [](AsyncWebServerRequest * r) {
+ r->send(201, TEXT_ENC, "OK\n");
+ do_reload = 1;
+ });
+ ADD_AUTH(l);
+ auto m = httpServer.on("/m", [](AsyncWebServerRequest * r) {
+ if (measure) {
+ r->send(400, TEXT_ENC, "meritev že poteka\n");
+ return;
+ }
+ measure = 1;
+ r->send(201, TEXT_ENC, "OK\n");
+ });
+ ADD_AUTH(m);
+ auto k = httpServer.on("/k", [](AsyncWebServerRequest * r) {
+ if (!measure) {
+ r->send(400, TEXT_ENC, "trenutno ni meritve\n");
+ return;
+ }
+ measure = 0;
+ r->send(201, TEXT_ENC, "OK\n");
+ });
+ ADD_AUTH(k);
+ auto c = httpServer.on("/c", [](AsyncWebServerRequest * r) {
+ r->send(201, TEXT_ENC, "glej sporočila na UART za navodila\n");
+ mpu.calibrateMag();
+ });
+ ADD_AUTH(c);
+ httpServer.begin();
+ Wire.begin();
+ int naslov = settings["mpu_address"].as<int>();
+ if (!mpu.setup(naslov)) {
+ Serial.println("mpu ni dosegljiv na naslovu " + naslov);
+ }
+ mpu.verbose(true);
+ Serial.println("reload: done");
+}
+void handleMeasure () {
+ if (!mpu.update()) {
+ Serial.println("!mpu.update()");
+ }
+ Serial.printf("getMag: X: %f\tY: %f\tZ: %f\n", mpu.getMagX(), mpu.getMagY(), mpu.getMagZ());
+ return;
+}
+void setup () {
+ Serial.begin(MONITOR_SPEED);
+ Serial.println("živ sem");
+ LittleFS.begin();
+ reload(1);
+}
+void loop () {
+ if (measure)
+ handleMeasure();
+ ftpServer.handleFTP();
+ dnsServer.processNextRequest();
+ if (do_reload) {
+ reload(0);
+ do_reload = 0;
+ }
+}
diff --git a/fiz/naloga/merjenje/test/README b/fiz/naloga/merjenje/test/README
new file mode 100644
index 0000000..b94d089
--- /dev/null
+++ b/fiz/naloga/merjenje/test/README
@@ -0,0 +1,11 @@
+
+This directory is intended for PlatformIO Unit Testing and project tests.
+
+Unit Testing is a software testing method by which individual units of
+source code, sets of one or more MCU program modules together with associated
+control data, usage procedures, and operating procedures, are tested to
+determine whether they are fit for use. Unit testing finds problems early
+in the development cycle.
+
+More information about PlatformIO Unit Testing:
+- https://docs.platformio.org/page/plus/unit-testing.html