From 8525da4004f3797f5a575d021f8ce31e37613e83 Mon Sep 17 00:00:00 2001 From: YuruC3 <98943911+YuruC3@@users.noreply.github.com> Date: Sat, 10 May 2025 10:18:14 +0200 Subject: [PATCH] Have to read some more about UART on arduino. Propably MAX2323 is needed for TTL conversion. --- ARDUINO_NANO_CONTROLL/.gitignore | 6 + ARDUINO_NANO_CONTROLL/include/README | 37 ++++ ARDUINO_NANO_CONTROLL/lib/README | 46 +++++ ARDUINO_NANO_CONTROLL/platformio.ini | 18 ++ ARDUINO_NANO_CONTROLL/src/main.cpp | 285 +++++++++++++++++++++++++++ ARDUINO_NANO_CONTROLL/test/README | 11 ++ 6 files changed, 403 insertions(+) create mode 100644 ARDUINO_NANO_CONTROLL/.gitignore create mode 100644 ARDUINO_NANO_CONTROLL/include/README create mode 100644 ARDUINO_NANO_CONTROLL/lib/README create mode 100644 ARDUINO_NANO_CONTROLL/platformio.ini create mode 100644 ARDUINO_NANO_CONTROLL/src/main.cpp create mode 100644 ARDUINO_NANO_CONTROLL/test/README diff --git a/ARDUINO_NANO_CONTROLL/.gitignore b/ARDUINO_NANO_CONTROLL/.gitignore new file mode 100644 index 0000000..620fc39 --- /dev/null +++ b/ARDUINO_NANO_CONTROLL/.gitignore @@ -0,0 +1,6 @@ +.pio +.vscode/.browse.c_cpp.db* +.vscode/c_cpp_properties.json +.vscode/launch.json +.vscode/ipch +.vscode diff --git a/ARDUINO_NANO_CONTROLL/include/README b/ARDUINO_NANO_CONTROLL/include/README new file mode 100644 index 0000000..49819c0 --- /dev/null +++ b/ARDUINO_NANO_CONTROLL/include/README @@ -0,0 +1,37 @@ + +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 convention is to give header files names that end with `.h'. + +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/ARDUINO_NANO_CONTROLL/lib/README b/ARDUINO_NANO_CONTROLL/lib/README new file mode 100644 index 0000000..9379397 --- /dev/null +++ b/ARDUINO_NANO_CONTROLL/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 the executable file. + +The source code of each library should be placed in a separate directory +("lib/your_library_name/[Code]"). + +For example, see the structure of the following example libraries `Foo` and `Bar`: + +|--lib +| | +| |--Bar +| | |--docs +| | |--examples +| | |--src +| | |- Bar.c +| | |- Bar.h +| | |- library.json (optional. for 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 + +Example contents of `src/main.c` using Foo and Bar: +``` +#include +#include + +int main (void) +{ + ... +} + +``` + +The PlatformIO Library Dependency Finder will find automatically dependent +libraries by scanning project source files. + +More information about PlatformIO Library Dependency Finder +- https://docs.platformio.org/page/librarymanager/ldf.html diff --git a/ARDUINO_NANO_CONTROLL/platformio.ini b/ARDUINO_NANO_CONTROLL/platformio.ini new file mode 100644 index 0000000..d6d8bb7 --- /dev/null +++ b/ARDUINO_NANO_CONTROLL/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:nanoatmega328] +platform = atmelavr +board = nanoatmega328 +framework = arduino +lib_deps = + adafruit/DHT sensor library@^1.4.6 + featherfly/SoftwareSerial@^1.0 +board_build.mcu = atmega328p diff --git a/ARDUINO_NANO_CONTROLL/src/main.cpp b/ARDUINO_NANO_CONTROLL/src/main.cpp new file mode 100644 index 0000000..5befb84 --- /dev/null +++ b/ARDUINO_NANO_CONTROLL/src/main.cpp @@ -0,0 +1,285 @@ +#include +#include +#include +#include +#include + +// ------------------------------------------------------------- +// DHT PreConfiguration +#define DHTPIN 4 // Digital pin connected to the DHT sensor +//#define DHTPIN PB0 +// Pin 15 can work but DHT must be disconnected during program upload. +#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 +// ------------------------------------------------------------- +// Initialize DHT sensor. +// Note that older versions of this library took an optional third parameter to +// tweak the timings for faster processors. This parameter is no longer needed +// as the current DHT reading algorithm adjusts itself to work on faster procs. +DHT dht(DHTPIN, DHTTYPE); + + +// VARS +const int MD1200BAUDS = 38400; // From what I've read it is always 38400 +//const int EPYSLEEPY = 600000; / 10 minutes +const long EPYSLEEPY = 300000; // 5 minutes +//const int EPYSLEEPY = 150000; // 2,5 minutes + +#define RX_PIN 3 +#define TX_PIN 2 +SoftwareSerial MDSerial(RX_PIN, TX_PIN); // Goes up to 115200 bauds + +// declarations +int getTemp(); +int setFanTrsh(int); +float dhtRead(); + +void setup() { + // Setup connection to MD1200 + // Serial because we're using RX/TX pins + MDSerial.begin(MD1200BAUDS); + + // Just debug + Serial.begin(9600); + + dht.begin(); + + Serial.println("setup end"); +} + +void loop() { + + Serial.println("Loop start"); + + int fanPercnt = getTemp(); + + if (fanPercnt < 10) { + setFanTrsh(fanPercnt); + } + + /* + check temperature and + set fan speed every X minutes + */ + delay(EPYSLEEPY); + +} + +// Get current temperature +int getTemp() { + Serial.println("getTemp start"); + + int bp1 = 0; + int bp2 = 0; + // int exp0 = 0; + // int exp1 = 0; + // int simm0 = 0; + // int simm1 = 0; + String MD1200output; + + MDSerial.println("_temp_rd"); + + // wait for MD1200 to answer + delay(30); + Serial.println("start parsing temperature start"); + + while (MDSerial.available()) { + MD1200output = MDSerial.readStringUntil('\n'); + + // Check backplane 1 + if (MD1200output.startsWith("BP_1")) { + // check index number of = + int eq = MD1200output.indexOf('='); + // check index number of c + int c = MD1200output.indexOf('c'); + // check if both exists + if (eq != -1 && c != -1) { + /* + take value between "= " and "c". + NOTICE that eq + 1 is there because in + "BP_1[2] = 25c" there is a space between = and 25. + */ + bp1 = MD1200output.substring(eq + 1, c).toInt(); + Serial.println("Backplane 1 " + String(bp1)); + } + } + + // Check backplane 2 + if (MD1200output.startsWith("BP_2")) { + int eq = MD1200output.indexOf('='); + int c = MD1200output.indexOf('c'); + if (eq != -1 && c != -1) { + bp2 = MD1200output.substring(eq + 1, c).toInt(); + Serial.println("Backplane 2 " + String(bp2)); + } + } + + // Uncomment if you want to also get temperature for expanders + /* + + // Check expander 0 + if (MD1200output.startsWith("EXP0")) { + int eq = MD1200output.indexOf('='); + int c = MD1200output.indexOf('c'); + if (eq != -1 && c != -1) { + exp0 = MD1200output.substring(eq + 1, c).toInt(); + } + } + + // Check expander 1 + if (MD1200output.startsWith("EXP1")) { + int eq = MD1200output.indexOf('='); + int c = MD1200output.indexOf('c'); + if (eq != -1 && c != -1) { + exp1 = MD1200output.substring(eq + 1, c).toInt(); + } + } + + // Check controller 0 + if (MD1200output.startsWith("SIM0")) { + int eq = MD1200output.indexOf('='); + int c = MD1200output.indexOf('c'); + if (eq != -1 && c != -1) { + simm0 = MD1200output.substring(eq + 1, c).toInt(); + } + } + + // Check controller 1 + if (MD1200output.startsWith("SIM1")) { + int eq = MD1200output.indexOf('='); + int c = MD1200output.indexOf('c'); + if (eq != -1 && c != -1) { + simm1 = MD1200output.substring(eq + 1, c).toInt(); + } + } + + */ + + // Stop when prompt returns + if (MD1200output.endsWith(">")) { + Serial.println("stopping temp reading"); + break; + } + } + + // Do (BP_1 + BP_2) / 2 to get the average of backplane + if (bp1 != -1 && bp2 != -1) { + int bpAvg = (bp1 + bp2) / 2; + + Serial.println("Average temp is " + String(bpAvg)); + + // define default + int outPrcntg = 21; + + // check external sensor temp + int ownReadTemp = int(dhtRead()); + + + Serial.println("Checking DHT temp"); + if (ownReadTemp <= 35) { + return 40; + } + + // a + switch (bpAvg) { + case 23: + outPrcntg = 21; + break; + /* + Minimum is 21 (akhsually 20) + BUT + https://forums.servethehome.com/index.php?threads/fun-with-an-md1200-md1220-sc200-sc220.27487/ + */ + case 25: + outPrcntg = 23; + break; + case 27: + outPrcntg = 24; + break; + case 29: + outPrcntg = 26; + break; + case 31: + outPrcntg = 27; + break; + case 33: + outPrcntg = 30; + break; + case 35: + outPrcntg = 34; + break; + case 37: + outPrcntg = 38; + break; + /* + I don't wan't to become deaf so max is 40. + */ + + default: + return -1; + + } + + Serial.println("Returnning " + String(outPrcntg) + " %"); + return outPrcntg; + + } else { + return -1; // failed to read temp + } + + /* + BP_1[2] - Back plane, maybe left + BP_2[3] - Back plane, maybe right + SIM0[0] - Controller A + SIM1[1] - Controller B + EXP0[4] - Expander 0 + EXP1[5] - Expander 1 + + AVG - average of all sensors + */ +} + +// take percentage as int and set it. +int setFanTrsh(int fanTrshInp) { + + Serial.println("Setting fan speed"); + String outputStatement = "set_speed " + String(fanTrshInp); + + // MDSerial.println("Sending " + outputStatement + " to MD1200"); + + if (MDSerial.println(outputStatement)) { + Serial.println("Setting fan speed success"); + return 1; + } + else { + Serial.println("Setting fan speed unsuccess"); + return -1; + } + +} + +float dhtRead() { + // Reading temperature or humidity takes about 250 milliseconds! + // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor) + // float humidt = dht.readHumidity(); + // Read temperature as Celsius (the default) + float tempr = dht.readTemperature(); + // Read temperature as Fahrenheit (isFahrenheit = true) + // f = dht.readTemperature(true); + + // Check if any reads failed and exit early (to try again). + // if (isnan(humidt) || isnan(tempr)) + if (isnan(tempr)) + { + // MDSerial.println("Failed to read from DHT sensor!"); + return -1; + } + else { + return tempr; + } + + // Compute heat index in Fahrenheit (the default) + // hif = dht.computeHeatIndex(f, h); + // Compute heat index in Celsius (isFahreheit = false) + // hicc = dht.computeHeatIndex(tempr, humidt, false); + +} \ No newline at end of file diff --git a/ARDUINO_NANO_CONTROLL/test/README b/ARDUINO_NANO_CONTROLL/test/README new file mode 100644 index 0000000..9b1e87b --- /dev/null +++ b/ARDUINO_NANO_CONTROLL/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