added .gitignore in root. Moved stuff

This commit is contained in:
YuruC3
2025-05-08 09:41:23 +02:00
parent 8bede8e74e
commit 8714ef4ec6
16 changed files with 2 additions and 10 deletions

5
STM32_CONTROL/.gitignore vendored Normal file
View File

@@ -0,0 +1,5 @@
.pio
.vscode/.browse.c_cpp.db*
.vscode/c_cpp_properties.json
.vscode/launch.json
.vscode/ipch

Binary file not shown.

After

Width:  |  Height:  |  Size: 249 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

View File

@@ -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

46
STM32_CONTROL/lib/README Normal file
View File

@@ -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 <Foo.h>
#include <Bar.h>
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

View File

@@ -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:genericSTM32F103C6]
platform = ststm32
board = genericSTM32F103C6
framework = arduino
lib_deps = adafruit/DHT sensor library@^1.4.6
upload_protocol = stlink
; Enable RX and TX 3
; build_flags = -D SERIAL_USB -D ENABLE_HWSERIAL3

207
STM32_CONTROL/src/main.cpp Normal file
View File

@@ -0,0 +1,207 @@
#include <Arduino.h>
#include <HardwareSerial.h>
// VARS
const int MD1200BAUDS = 38400; // From what I've read it is always 38400
//const int EPYSLEEPY = 600000; / 10 minutes
const int EPYSLEEPY = 300000; // 5 minutes
//const int EPYSLEEPY = 150000; // 2,5 minutes
HardwareSerial Serial1(31, 30);
// declarations
int getTemp();
int setFanTrsh(int);
void setup() {
// Setup connection to MD1200
// Serial1 because we're using RX/TX pins
Serial1.begin(MD1200BAUDS);
// Just debug
Serial.begin(9600);
Serial.print("skibidi");
}
void loop() {
int fanPercnt = getTemp();
if (fanPercnt < 10) {
setFanTrsh(fanPercnt);
}
/*
check temperature and
set fan speed every X minutes
*/
delay(EPYSLEEPY);
}
// Get current temperature
int getTemp() {
int bp1 = 0;
int bp2 = 0;
int exp0 = 0;
int exp1 = 0;
int simm0 = 0;
int simm1 = 0;
String MD1200output;
Serial1.println("_temp_rd");
// wait for MD1200 to answer
delay(30);
while (Serial1.available()) {
MD1200output = Serial1.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();
}
}
// 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();
}
}
// 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(">")) {
break;
}
}
// Do (BP_1 + BP_2) / 2 to get the average of backplane
if (bp1 != -1 && bp2 != -1) {
int bpAvg = (bp1 + bp2) / 2;
// define default
int outPrcntg = 21;
// a
switch (bpAvg) {
case 23:
outPrcntg = 21;
break;
// Minimum is 21 (akhsually 20)
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;
}
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) {
String outputStatement = "set_speed " + String(fanTrshInp);
Serial.println("Sending " + outputStatement + " to MD1200");
if (Serial1.println(outputStatement)) {
return 1;
}
else {
return -1;
}
}

11
STM32_CONTROL/test/README Normal file
View File

@@ -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

View File

@@ -0,0 +1,205 @@
#include <Arduino.h>
// VARS
const int MD1200BAUDS = 38400; // From what I've read it is always 38400
//const int EPYSLEEPY = 600000; / 10 minutes
const int EPYSLEEPY = 300000; // 5 minutes
//const int EPYSLEEPY = 150000; // 2,5 minutes
// declarations
int getTemp();
int setFanTrsh(int);
void setup() {
// Setup connection to MD1200
// Serial1 because we're using RX/TX pins
Serial1.begin(MD1200BAUDS);
// Just debug
Serial.begin(9600);
}
void loop() {
int fanPercnt = getTemp();
if (fanPercnt < 10) {
setFanTrsh(fanPercnt);
}
/*
check temperature and
set fan speed every X minutes
*/
delay(EPYSLEEPY);
}
// Get current temperature
int getTemp() {
int bp1 = 0;
int bp2 = 0;
int exp0 = 0;
int exp1 = 0;
int simm0 = 0;
int simm1 = 0;
String MD1200output;
Serial1.println("_temp_rd");
// wait for MD1200 to answer
delay(30);
while (Serial1.available()) {
MD1200output = Serial1.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();
}
}
// 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();
}
}
// 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(">")) {
break;
}
}
// Do (BP_1 + BP_2) / 2 to get the average of backplane
if (bp1 != -1 && bp2 != -1) {
int bpAvg = (bp1 + bp2) / 2;
// define default
int outPrcntg = 21;
// a
switch (bpAvg) {
case 23:
outPrcntg = 21;
break;
// Minimum is 21 (akhsually 20)
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;
}
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) {
String outputStatement = "set_speed " + String(fanTrshInp);
Serial.println("Sending " + outputStatement + " to MD1200");
if (Serial1.println(outputStatement)) {
return 1;
}
else {
return -1;
}
}

View File

@@ -0,0 +1,258 @@
#include <Arduino.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
// -------------------------------------------------------------
// DHT PreConfiguration
#define DHTPIN 18 // 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 int EPYSLEEPY = 300000; // 5 minutes
//const int EPYSLEEPY = 150000; // 2,5 minutes
// declarations
int getTemp();
int setFanTrsh(int);
float dhtRead();
void setup() {
// Setup connection to MD1200
// Serial1 because we're using RX/TX pins
Serial1.begin(MD1200BAUDS);
// Just debug
Serial.begin(9600);
dht.begin();
}
void loop() {
int fanPercnt = getTemp();
if (fanPercnt < 10) {
setFanTrsh(fanPercnt);
}
/*
check temperature and
set fan speed every X minutes
*/
delay(EPYSLEEPY);
}
// Get current temperature
int getTemp() {
int bp1 = 0;
int bp2 = 0;
int exp0 = 0;
int exp1 = 0;
int simm0 = 0;
int simm1 = 0;
String MD1200output;
Serial1.println("_temp_rd");
// wait for MD1200 to answer
delay(30);
while (Serial1.available()) {
MD1200output = Serial1.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();
}
}
// 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();
}
}
// 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(">")) {
break;
}
}
// Do (BP_1 + BP_2) / 2 to get the average of backplane
if (bp1 != -1 && bp2 != -1) {
int bpAvg = (bp1 + bp2) / 2;
// define default
int outPrcntg = 21;
// check external sensor temp
int ownReadTemp = int(dhtRead());
// 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;
}
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) {
String outputStatement = "set_speed " + String(fanTrshInp);
Serial.println("Sending " + outputStatement + " to MD1200");
if (Serial1.println(outputStatement)) {
return 1;
}
else {
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))
{
Serial.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);
}