From 9f4b99064ce4d4658520c028c4f4e5358754e57c Mon Sep 17 00:00:00 2001 From: Ondrej-Trochta Date: Fri, 19 Apr 2024 00:02:29 +0200 Subject: [PATCH] modified: ../.gitignore new file: ../.vscode/extensions.json deleted: ../LICENSE deleted: ../README.md new file: ../include/README new file: ../lib/README new file: ../platformio.ini new file: .theia/launch.json new file: Zabezpecovacka-GSM.cpp --- .gitignore | 37 +--- .vscode/extensions.json | 10 ++ LICENSE | 201 ---------------------- README.md | 2 - SECURITY.md | 16 -- include/README | 39 +++++ lib/README | 46 +++++ platformio.ini | 15 ++ src/.theia/launch.json | 8 + src/Zabezpecovacka-GSM.cpp | 337 +++++++++++++++++++++++++++++++++++++ test/README | 11 ++ 11 files changed, 471 insertions(+), 251 deletions(-) create mode 100644 .vscode/extensions.json delete mode 100644 LICENSE delete mode 100644 README.md delete mode 100644 SECURITY.md create mode 100644 include/README create mode 100644 lib/README create mode 100644 platformio.ini create mode 100644 src/.theia/launch.json create mode 100644 src/Zabezpecovacka-GSM.cpp create mode 100644 test/README diff --git a/.gitignore b/.gitignore index 259148f..89cc49c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,32 +1,5 @@ -# Prerequisites -*.d - -# Compiled Object files -*.slo -*.lo -*.o -*.obj - -# Precompiled Headers -*.gch -*.pch - -# Compiled Dynamic libraries -*.so -*.dylib -*.dll - -# Fortran module files -*.mod -*.smod - -# Compiled Static libraries -*.lai -*.la -*.a -*.lib - -# Executables -*.exe -*.out -*.app +.pio +.vscode/.browse.c_cpp.db* +.vscode/c_cpp_properties.json +.vscode/launch.json +.vscode/ipch diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..080e70d --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,10 @@ +{ + // See http://go.microsoft.com/fwlink/?LinkId=827846 + // for the documentation about the extensions.json format + "recommendations": [ + "platformio.platformio-ide" + ], + "unwantedRecommendations": [ + "ms-vscode.cpptools-extension-pack" + ] +} diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 261eeb9..0000000 --- a/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/README.md b/README.md deleted file mode 100644 index e044999..0000000 --- a/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# Arduino-GSM-Chata -Arduino, s modulem Lan a s GSM modulem pro odesilani sms pri sepnuti vstupu diff --git a/SECURITY.md b/SECURITY.md deleted file mode 100644 index 4236ff3..0000000 --- a/SECURITY.md +++ /dev/null @@ -1,16 +0,0 @@ -# Security Policy - -## Supported Versions - -Use this section to tell people about which versions of your project are -currently being supported with security updates. - - - -## Reporting a Vulnerability - -Use this section to tell people how to report a vulnerability. - -Tell them where to go, how often they can expect to get an update on a -reported vulnerability, what to expect if the vulnerability is accepted or -declined, etc. 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..2593a33 --- /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 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..1ee07a7 --- /dev/null +++ b/platformio.ini @@ -0,0 +1,15 @@ +; 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:uno] +platform = atmelavr +board = uno +framework = arduino +lib_deps = arduino-libraries/Ethernet@^2.0.2 diff --git a/src/.theia/launch.json b/src/.theia/launch.json new file mode 100644 index 0000000..7e4253b --- /dev/null +++ b/src/.theia/launch.json @@ -0,0 +1,8 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + "version": "0.2.0", + "configurations": [ + + ] +} diff --git a/src/Zabezpecovacka-GSM.cpp b/src/Zabezpecovacka-GSM.cpp new file mode 100644 index 0000000..7c3d3b8 --- /dev/null +++ b/src/Zabezpecovacka-GSM.cpp @@ -0,0 +1,337 @@ +#include +#include +#include +#include + +#define DEBUG + +// MAC address and IP address for the Ethernet module +byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; +IPAddress ip(192, 168, 1, 177); + +// Initialize the Ethernet server (port 80 is default for HTTP) +EthernetServer server(80); + +// Initialize software serial for RS232 communication (RX, TX) +SoftwareSerial gsmSerial(5, 6); // RX, TX (this is using for communicate with GSM module as AT commands) + +uint8_t PIN_OUT_2 = 2; +uint8_t PIN_OUT_3 = 3; + +String ElmP = "p"; +String ElmH2 = "H2"; +EthernetClient client; + +struct BaseTypeScript { + String id; +}; + +// Definice struktury pro ukládání parametrů GET požadavku +struct GsmPostParams : public BaseTypeScript { + String mobileNumber; + String sms; +}; + +//Pin (Vstupni piny) +struct pinState { + uint8_t pinNumber; + volatile bool lastState; + unsigned long debounceTime; + unsigned long lastStateChangeTime; + const char *description; +}; + +const uint8_t numInputPins = 2; // Replace with the actual number of input pins + +// definice ignorace vstupnich pinu +pinState inputStates[numInputPins] = { + // { 4, LOW, 60000, 0, "Enter Door" }, // Pin 4, debounce time 1 minute + { 7, LOW, 30000, 0, "Alarm Alert" }, // Pin 8, debounce time 30 seconds + { 8, LOW, 10000, 0, "Electric Alarm" } // Pin 9, debounce time 10 seconds +}; +GsmPostParams gsmPostParams; + +String readStringFromEEPROM(int addr, int length) { + String data; + for (int i = 0; i < length; i++) { + char onedata = char(EEPROM.read(addr + i)); // read one byte at a time + if (onedata == '\n') return data; + data += onedata; + } + return data; +} + +void logDebug(const String &log) { + // Serial.println(log); +} + +void setup() { + + // if (Serial.available() > 0) { + // Serial.begin(115200); + // } + + gsmSerial.begin(115200); + + // Start the Ethernet connection and the server + Ethernet.begin(mac, ip); + server.begin(); + + gsmPostParams.mobileNumber = readStringFromEEPROM(1, 20); + gsmPostParams.sms = readStringFromEEPROM(21, 200); + gsmPostParams.id = "GSM"; + + logDebug("Init .."); + // Set all input pins as inputs + for (int i = 0; i < numInputPins; i++) { + pinMode(inputStates[i].pinNumber, INPUT); + } + + // Set pin 2 and 3 as OUTPUT + pinMode(PIN_OUT_2, OUTPUT); + pinMode(PIN_OUT_3, OUTPUT); + + logDebug("Init I/O is OK"); + // Open serial communications +} + + +String removeAllCharactesrAfterEmpty(String& data) { + int keyIndex = data.indexOf(' '); + if (keyIndex == -1) { + return data; // return empty string if key is not found + } + data.remove(keyIndex); + data.replace("+", " "); + return data; +} + +// Metoda pro parsování parametrů + +String getValue(String &data, const String &key) { + int keyIndex = data.indexOf(key); + if (keyIndex == -1) { + return ""; // return empty string if key is not found + } + int separatorIndex = data.indexOf('&', keyIndex); + + String value = data.substring(keyIndex + key.length(), separatorIndex != -1 ? separatorIndex : data.length()); + logDebug("Only value:" + value); + return removeAllCharactesrAfterEmpty(value); +} + +void writeToLogAndIntoWebAsP(const String &msg, const String &element) { + String lineElement = "<" + element + ">" + msg + ""; + // logDebug(msg); + //gsmlogDebug("GSM:" + msg); + client.println(lineElement); +} + +// pin = definice pinu Arduino, string je post hodnota, ktera se porovnava +void checkValue(String &request, uint8_t pin, const String &postValue) { + if (request.indexOf("/PIN") == -1) return; + + if (request.indexOf("/" + postValue + "=ON") != -1) { + digitalWrite(pin, HIGH); + String msgOn = "PIN ON: " + String(pin) + " PostVale: " + postValue; + writeToLogAndIntoWebAsP(msgOn, ElmH2); // Send state to debug console + } + if (request.indexOf("/" + postValue + "=OFF") != -1) { + digitalWrite(pin, LOW); + String msgOff = "PIN OFF: " + String(pin) + " PostVale: " + postValue; + writeToLogAndIntoWebAsP(msgOff, ElmH2); // Send state to debug console + } +} + + + +String ConvertStatusToString(uint8_t &pin, bool showLink) { + String pinAsStr = String(pin); + String elm = ""; + if (digitalRead(pin) == HIGH) { + elm = "PIN" + pinAsStr + " is ON "; + if (showLink) elm += "OFF"; + return elm; + } + + elm = "PIN" + pinAsStr + " is OFF "; + if (showLink) elm += "ON"; + return elm; +} + +void changeDataIfNotNull(String &variable, String &data) { + if (data == "") return; + variable = data; +} + +void SednAtCommandWithLog(String msg) { + logDebug(msg); + gsmSerial.print(msg + "\r"); + delay(400); + logDebug(gsmSerial.readString()); +} + +void SendSMS(String pin) { + // Set the SIM900A to text mode + SednAtCommandWithLog("AT+CMGF=1"); + delay(400); + + SednAtCommandWithLog("AT + CMGS =\"" + gsmPostParams.mobileNumber + "\""); + delay(400); + + // Specify the SMS message + SednAtCommandWithLog(pin + " " + gsmPostParams.sms); + delay(1000); + + // Send a Ctrl+Z / ASCII SUB + gsmSerial.print((char)26); + delay(1000); + // Close the connection + gsmSerial.print((char)27); + delay(1000); + logDebug("Close communication GSM"); + // String msg = gsmSerial.readStringUntil("/n"); + // gsmlogDebug("Msg:"+msg); +} + +void writeStringToEEPROM(int addr, const String &data, int limit) { + uint8_t endIndex =0; + int numBytes = data.length(); // get length of the string + for (uint8_t i = 0; i < numBytes && i < limit; i++) { + EEPROM.write(addr + i, data[i]); // write one byte at a time + endIndex = i; + } + if (endIndex < limit) { + EEPROM.write(addr + endIndex + 1, '\n'); + } +} + +void SetPin(uint8_t pin, const char *description) { + SendSMS("PIN:" + String(pin) + "|" + description); +} + + +void checkInputPins() { + unsigned long currentTime = millis(); + + for (int i = 0; i < numInputPins; i++) { + pinState *currentState = &inputStates[i]; // Pointer to current pin state + + bool currentInputState = digitalRead(currentState->pinNumber); + if (currentInputState != currentState->lastState && currentTime - currentState->lastStateChangeTime >= currentState->debounceTime) { + // Input state change confirmed after debounce time + currentState->lastState = currentInputState; + + if (currentInputState) { + + // Call SetPin function (modify for specific pin control) + SetPin(currentState->pinNumber, currentState->description); // Example usage with pin number passed + } + currentState->lastStateChangeTime = currentTime; + } + } +} + +int iterationCounter = 0; // Counter for loop iterations + + + +void loop() { + // Listen for incoming clients + String msg = ""; + client = server.available(); + + if (client) { + String request = client.readStringUntil('\r'); + + logDebug("request:" + request); + + if (request.indexOf("GET /?id=GSM") != -1) { + logDebug("it is GSM"); + //int start = request.indexOf("/?id=") + 2; + String data = request.substring(6); + logDebug("data:" + data); + + String id = getValue(data, "id="); + logDebug("id data:" + id); + + String value = getValue(data, "mobileNumber="); + changeDataIfNotNull(gsmPostParams.mobileNumber, value); + + value = getValue(data, "sms="); + changeDataIfNotNull(gsmPostParams.sms, value); + msg += "PARSING GMS DATA SUCESSFULLY"; + } + + logDebug("struc GSM:" + gsmPostParams.mobileNumber + " sms:" + gsmPostParams.sms); + + if (request.indexOf("GET /SEND-SMS") != -1) { + msg += "SEND SMS TROUGHT GSM. "; + } + + if (request.indexOf("GET /SAVE-EEPROM") != -1) { + writeStringToEEPROM(1, gsmPostParams.mobileNumber, 20); + writeStringToEEPROM(21, gsmPostParams.sms, 200); + msg += "Update to EEPROM is sucessfully. "; + } + + logDebug("Request:" + request); + client.println("HTTP/1.1 200 OK"); + client.println("Content-Type: text/html"); + client.println("Connection: close"); + client.println(); + client.println(""); + client.println("
"); + + client.println("

Trochta.net:

"); + + writeToLogAndIntoWebAsP(msg, "H3"); + //nastav jestli je post + checkValue(request, PIN_OUT_2, "PIN2"); + checkValue(request, PIN_OUT_3, "PIN3"); + + // Vypis aktualni hodnoty + writeToLogAndIntoWebAsP("Input:", ElmP); + + for (int i = 0; i < numInputPins; i++) { + pinState *currentState = &inputStates[i]; + writeToLogAndIntoWebAsP(ConvertStatusToString(currentState->pinNumber, false), ElmP); + } + + writeToLogAndIntoWebAsP("Output:", ElmP); + writeToLogAndIntoWebAsP(ConvertStatusToString(PIN_OUT_2, true), ElmP); + writeToLogAndIntoWebAsP(ConvertStatusToString(PIN_OUT_3, true), ElmP); + + writeToLogAndIntoWebAsP("GSM Number:" + gsmPostParams.mobileNumber, ElmP); + writeToLogAndIntoWebAsP("SMS:" + gsmPostParams.sms, ElmP); + + writeToLogAndIntoWebAsP("Send SMS", "H4"); + writeToLogAndIntoWebAsP("Save to EEPROM", ElmP); + writeToLogAndIntoWebAsP("Refresh", ElmP); + // Send the time and the message that the page is loaded + client.println("
"); + // Give the web browser time to receive the data + client.stop(); + + logDebug("Time: " + String(millis() / 1000)); + + if (request.indexOf("GET /SEND-SMS") != -1) { + SendSMS("Web Link (Test)"); + } + // Zjkontroluje vstupni piny + + delay(5); + } + + iterationCounter++; + if (iterationCounter == INT_FAST16_MAX) iterationCounter = 0; + if (iterationCounter % 5 == 0) { // Check if 10 iterations have passed + checkInputPins(); // Call checkInputPins() every 10 iterations + } + + delay(100); +} 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