summaryrefslogtreecommitdiffstats
path: root/fiz/naloga/vodnaraketa/src
diff options
context:
space:
mode:
Diffstat (limited to 'fiz/naloga/vodnaraketa/src')
-rw-r--r--fiz/naloga/vodnaraketa/src/func.c31
-rw-r--r--fiz/naloga/vodnaraketa/src/main.cpp171
2 files changed, 202 insertions, 0 deletions
diff --git a/fiz/naloga/vodnaraketa/src/func.c b/fiz/naloga/vodnaraketa/src/func.c
new file mode 100644
index 0000000..07bfd6e
--- /dev/null
+++ b/fiz/naloga/vodnaraketa/src/func.c
@@ -0,0 +1,31 @@
+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)];
+}
+
+/* reads settings into json object */
+void load_settings () {
+ if (LittleFS.exists("settings.json")) {
+ File s = LittleFS.open("settings.json", "r");
+ if (s)
+ deserializeJson(settings, s);
+ s.close();
+ }
+}
+
+/* stores settings from json object to file */
+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");
+}
diff --git a/fiz/naloga/vodnaraketa/src/main.cpp b/fiz/naloga/vodnaraketa/src/main.cpp
new file mode 100644
index 0000000..91280dd
--- /dev/null
+++ b/fiz/naloga/vodnaraketa/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>
+#include <HX711.h>
+#include <FTPServer.h>
+
+DynamicJsonDocument settings(2048);
+
+#include <func.c>
+
+FTPServer ftpServer(LittleFS);
+DNSServer dnsServer;
+AsyncWebServer httpServer(80);
+HX711 scale;
+
+time_t measure = 0;
+File measureFile;
+
+void reload (bool w = 0) {
+ /* stop services unless they were never started, indicate this by w in for example setup() */
+ if (!w) {
+ ftpServer.stop();
+ httpServer.reset();
+ dnsServer.stop();
+ }
+
+ /* reload settings */
+ load_settings();
+
+ /* bring up AP networking */
+ IPAddress ap_ip(10, 82, 66, 1);
+ ap_ip.fromString(settings["ap_ip"].as<String>());
+ IPAddress ap_gateway(10, 82, 66, 1);
+ ap_gateway.fromString(settings["ap_gw"].as<String>());
+ IPAddress ap_subnet(255, 255, 255, 0);
+ ap_subnet.fromString(settings["ap_nm"].as<String>());
+ WiFi.mode(WIFI_AP);
+ WiFi.softAPConfig(ap_ip, ap_gateway, ap_subnet);
+ const char * ap_pass = settings["ap_pass"].as<String>().c_str();
+ if (ap_pass && strlen(ap_pass) < 8)
+ ap_pass = NULL;
+ WiFi.softAP(settings["ap_ssid"].as<String>().c_str(), ap_pass, settings["cp_ch"].as<int>(), settings["ap_hidden"].as<int>());
+ Serial.println("WiFi.softAPIP() = " + WiFi.softAPIP().toString());
+
+
+ /* bring up STA networking - if that's desired */
+ const char * sta_ssid = settings["sta_ssid"].as<String>().c_str();
+ if (sta_ssid && strlen(sta_ssid) > 0) {
+ IPAddress sta_ip(10, 69, 69, 82);
+ sta_ip.fromString(settings["sta_ip"].as<String>());
+ IPAddress sta_gw(10, 69, 69, 1);
+ sta_ip.fromString(settings["sta_gw"].as<String>());
+ IPAddress sta_nm(255, 255, 255, 0);
+ sta_ip.fromString(settings["sta_nm"].as<String>());
+ IPAddress sta_dns1(93, 103, 235, 126);
+ sta_dns1.fromString(settings["sta_dns1"].as<String>());
+ IPAddress sta_dns2(193, 2, 1, 66);
+ sta_dns2.fromString(settings["sta_dns2"].as<String>());
+ WiFi.disconnect(true);
+ WiFi.hostname(settings["sta_host"].as<String>());
+ const char * sta_pass = settings["sta_pass"].as<String>().c_str();
+ if (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");
+ }
+
+ /* start services */
+ dnsServer.start(53, settings["host"], WiFi.softAPIP());
+ ftpServer.begin(settings["ftp_user"], settings["ftp_pass"]);
+ /* web server */
+#define ADD_AUTH(h) if (strlen(settings["http_user"].as<String>().c_str()) || strlen(settings["http_pass"].as<String>().c_str())) h.setAuthentication(settings["http_user"], settings["http_pass"])
+ auto h = httpServer.serveStatic("/", LittleFS, "/")
+ .setDefaultFile("index.html")
+ .setAuthentication(settings["http_user"], settings["http_pass"]);
+ ADD_AUTH(h);
+ h = httpServer.on("/rst", [](AsyncWebServerRequest * r) {
+ r->send(201, "text/plain", "OK");
+ ESP.restart();
+ });
+ ADD_AUTH(h);
+ h = httpServer.on("/rld", [](AsyncWebServerRequest * r) {
+ r->send(201, "text/plain", "OK");
+ reload();
+ });
+ h = httpServer.on("/m", [](AsyncWebServerRequest * r) {
+ if (!r->hasParam("n"))
+ r->send(400, "text/plain", "Manjka parameter n - število sekund meritve");
+ else
+ if (!measure) {
+ measure = time(NULL)+atoi(r->getParam("n")->value().c_str());
+ r->send(201, "text/plain", "OK");
+ } else {
+ r->send(400, "text/plain", "Meritev že poteka!");
+ }
+ });
+ ADD_AUTH(h);
+
+ /* specifični ukazi za meritve: začetek loadcella, kalibracija, tara */
+ scale.begin(str2pin(settings["scale_dout"].as<String>().c_str()), str2pin(settings["scale_sck"].as<String>().c_str()));
+ h = httpServer.on("/c", [](AsyncWebServerRequest * r) {
+ if (!r->hasParam("t")) {
+ r->send(400, "text/plain", "Manjka parameter t - teža na tehtnici");
+ }
+ if (scale.wait_ready_timeout(1000)) {
+ scale.set_scale();
+ scale.tare();
+ scale.set_scale(scale.get_units(10)/atof(r->getParam("t")->value().c_str()));
+ r->send(200, "text/plain", "OK");
+ } else {
+ r->send(500, "text/plain", "Tehtnica ni najdena");
+ }
+ });
+ ADD_AUTH(h);
+ h = httpServer.on("/t", [](AsyncWebServerRequest * r) {
+ if (scale.wait_ready_timeout(1000)) {
+ scale.tare();
+ r->send(400, "text/plain", "OK");
+ } else {
+ r->send(500, "text/plain", "Tehtnica ni najdena.");
+ }
+ });
+ ADD_AUTH(h);
+}
+
+void handleMeasure() {
+ if (measure != 0) {
+ if (measure < time(NULL)) {
+ if (measureFile.isFile()) {
+ char filename[32];
+ snprintf(filename, 32, "meritev%ldl.csv", time(NULL));
+ measureFile = LittleFS.open(filename, "w");
+ scale.power_up();
+ }
+ if (scale.wait_ready_timeout(1000)) {
+ long reading = scale.get_units(10);
+ measureFile.print(millis()+""+"\n");
+ } else {
+ Serial.println("HX711 ni najden.");
+ }
+ } else {
+ measure = 0;
+ measureFile.close();
+ scale.power_down();
+ }
+ }
+}
+
+void setup () {
+ Serial.begin(9600);
+ Serial.println("Živ sem!");
+ LittleFS.begin();
+ reload(1);
+}
+
+void loop () {
+ handleMeasure();
+ ftpServer.handleFTP();
+ dnsServer.processNextRequest();
+}