commit 69e33b86a26494ec72bdf26b5c856b8241628fd2 Author: iansun2 Date: Fri Apr 7 21:03:52 2023 +0800 init diff --git a/data/main.css b/data/main.css new file mode 100644 index 0000000..7842580 --- /dev/null +++ b/data/main.css @@ -0,0 +1,30 @@ +body{ + display: flex; + align-items: center; + justify-content: center; + margin: 0 auto; + height: 100vh; + background-color: #f1f1f1; +} + +table{ + width: 80%; +} + +.font{ + font-size: 2em; + font-family: 'Impact', 'fantasy'; + text-align: center; +} + +.td_title{ + width: 200px; +} + +.td_data{ + width: 100px; +} + +input{ + vertical-align: middle; +} \ No newline at end of file diff --git a/data/main.html b/data/main.html new file mode 100644 index 0000000..3166576 --- /dev/null +++ b/data/main.html @@ -0,0 +1,91 @@ + + + + + HEAT + + + + + + + + + + + + + + + + + + + + + + +
HEAT 0current0target0 + +
HEAT 1current0target0 + +
+
+ + \ No newline at end of file diff --git a/include/README b/include/README new file mode 100644 index 0000000..194dcd4 --- /dev/null +++ b/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/lib/README b/lib/README new file mode 100644 index 0000000..6debab1 --- /dev/null +++ b/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 +#include + +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/platformio.ini b/platformio.ini new file mode 100644 index 0000000..59f9dd4 --- /dev/null +++ b/platformio.ini @@ -0,0 +1,18 @@ +; 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:nodemcuv2] +platform = espressif8266 +board = nodemcuv2 +framework = arduino +lib_deps = ottowinter/ESPAsyncWebServer-esphome@^3.0.0 +board_build.filesystem = littlefs +upload_speed = 921600 +monitor_speed = 115200 \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..5c24324 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,139 @@ +#include +#include +#include +#include +#include + +/*===== Define =====*/ +/*[const]*/ +#define HEAT_OFF -300 + +/*[wifi]*/ +#define AP_SSID "test" +#define AP_PASSWD "sonofussr" +#define AP_CHANNEL 1 +#define AP_MAX_CLIENT 4 + +/*[heat]*/ +#define MAX_TEMP 350 + + +/*===== Object =====*/ + +AsyncWebServer server(80); +AsyncWebSocket ws("/ws"); + +Ticker temp_reporter; + + +/*===== Variable =====*/ + +//-300: off +double temp1_current = 0; +double temp1_target = HEAT_OFF; +double temp2_current = 0; +double temp2_target = HEAT_OFF; + + +/*===== Handler =====*/ + +void handleWebSocketMessage(void *arg, uint8_t *data, size_t len) { + AwsFrameInfo *info = (AwsFrameInfo*)arg; + if (info->final && info->index == 0 && info->len == len && info->opcode == WS_TEXT) { + data[len] = '\0'; + + Serial.println((char*)data); + String str_data = (String)(char*)data; + String head = str_data.substring(0,3); + String body = str_data.substring(3,str_data.length()); + + Serial.println("head: "+ head + " body: " + body); + + if(head == "h1t"){ + temp1_target = body.toDouble(); + }else if(head == "h2t"){ + temp2_target = body.toDouble(); + } + //Serial.println(power); + + //pinMode(LED_PIN, 0); + //LED_handler.attach_ms(300, led_off); + } +} + + +void onEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len) { + switch (type) { + case WS_EVT_CONNECT: + Serial.printf("WebSocket client #%u connected from %s\n", client->id(), client->remoteIP().toString().c_str()); + temp1_target = HEAT_OFF; + temp2_target = HEAT_OFF; + break; + case WS_EVT_DISCONNECT: + Serial.printf("WebSocket client #%u disconnected\n", client->id()); + temp1_target = HEAT_OFF; + temp2_target = HEAT_OFF; + break; + case WS_EVT_DATA: + handleWebSocketMessage(arg, data, len); + break; + case WS_EVT_PONG: + case WS_EVT_ERROR: + temp1_target = HEAT_OFF; + temp2_target = HEAT_OFF; + break; + } +} + + +void temp_report_handler(){ + ws.textAll("h1c" + String(temp1_current)); + ws.textAll("h2c" + String(temp2_current)); + ws.textAll("h1t" + String(temp1_target)); + ws.textAll("h2t" + String(temp2_target)); + Serial.println("report temp" + String(" h1c: ") + String(temp1_current) + " h2c: " + String(temp2_current) + " h1t: " + String(temp1_target) + " h2t: " + String(temp2_target)); +} + + +/*===== Main =====*/ + +void setup() { + Serial.begin(115200); + + //init LittleFS + if(!LittleFS.begin()){ + Serial.println("fail init fs"); + return; + } + + //show all files + Dir root = LittleFS.openDir("/"); + while (root.next()) { + File file = root.openFile("r"); + Serial.print(" FILE: "); + Serial.print(root.fileName()); + Serial.print(" SIZE: "); + Serial.println(file.size()); + file.close(); + } + + //init Wifi + WiFi.softAP(AP_SSID, AP_PASSWD, AP_CHANNEL, 0, AP_MAX_CLIENT); + + //web handler + ws.onEvent(onEvent); + server.addHandler(&ws); + server.onNotFound([](AsyncWebServerRequest *request){ request->redirect("/"); }); //captive portal redirect + server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ request->send(LittleFS, "/main.html", "text/html"); }); //main html + server.on("/main.css", HTTP_GET, [](AsyncWebServerRequest *request){ request->send(LittleFS, "/main.css", "text/css"); }); //main css + + server.begin(); + + temp_reporter.attach(0.5, temp_report_handler); +} + +void loop() { + temp1_current = rand()%100; + temp2_current = rand()%100; + delay(100); +} \ No newline at end of file diff --git a/test/README b/test/README new file mode 100644 index 0000000..9b1e87b --- /dev/null +++ b/test/README @@ -0,0 +1,11 @@ + +This directory is intended for PlatformIO Test Runner 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/en/latest/advanced/unit-testing/index.html