Compare commits
2 Commits
6741f77615
...
964236b6b5
Author | SHA1 | Date | |
---|---|---|---|
![]() |
964236b6b5 | ||
![]() |
5dc92e9ca4 |
@ -1,29 +0,0 @@
|
|||||||
import time
|
|
||||||
import board
|
|
||||||
import adafruit_dht
|
|
||||||
|
|
||||||
# https://randomnerdtutorials.com/raspberry-pi-dht11-dht22-python/
|
|
||||||
|
|
||||||
# Sensor data pin is connected to GPIO 4
|
|
||||||
sensor = adafruit_dht.DHT22(board.D4)
|
|
||||||
# Uncomment for DHT11
|
|
||||||
#sensor = adafruit_dht.DHT11(board.D4)
|
|
||||||
|
|
||||||
while True:
|
|
||||||
try:
|
|
||||||
# Print the values to the serial port
|
|
||||||
temperature_c = sensor.temperature
|
|
||||||
temperature_f = temperature_c * (9 / 5) + 32
|
|
||||||
humidity = sensor.humidity
|
|
||||||
print("Temp={0:0.1f}ºC, Temp={1:0.1f}ºF, Humidity={2:0.1f}%".format(temperature_c, temperature_f, humidity))
|
|
||||||
|
|
||||||
except RuntimeError as error:
|
|
||||||
# Errors happen fairly often, DHT's are hard to read, just keep going
|
|
||||||
print(error.args[0])
|
|
||||||
time.sleep(2.0)
|
|
||||||
continue
|
|
||||||
except Exception as error:
|
|
||||||
sensor.exit()
|
|
||||||
raise error
|
|
||||||
|
|
||||||
time.sleep(3.0)
|
|
@ -2,7 +2,11 @@ import serial, time
|
|||||||
|
|
||||||
# CONST
|
# CONST
|
||||||
MD1200BAUD = 38400
|
MD1200BAUD = 38400
|
||||||
SERIALADAPTER = "/dev/ttyUSB0" # In Windows it would be something like COM3
|
SERIALADAPTER = "/dev/ttyUSB0"
|
||||||
|
GETTEMP = "_temp_rd"
|
||||||
|
SETFANPRCNT = "set_speed"
|
||||||
|
EPYSLEEPY = 300 # 5 minutes
|
||||||
|
#EPYSLEEPY = 150 # 2,5 minutes
|
||||||
|
|
||||||
# init
|
# init
|
||||||
MDserial = serial.Serial(
|
MDserial = serial.Serial(
|
||||||
@ -14,8 +18,81 @@ MDserial = serial.Serial(
|
|||||||
timeout=1)
|
timeout=1)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def getTemp(inpMDreturning):
|
||||||
|
MDict = {}
|
||||||
|
|
||||||
|
# Sanitise output
|
||||||
|
MDsanit = inpMDreturning.splitlines()
|
||||||
|
|
||||||
|
#if there is smth do smth
|
||||||
|
if inpMDreturning:
|
||||||
|
|
||||||
|
for line in MDsanit:
|
||||||
|
|
||||||
|
if ">" in line or "b'" in line:
|
||||||
|
continue
|
||||||
|
|
||||||
|
matchstm = line[2:6]
|
||||||
|
|
||||||
|
match matchstm:
|
||||||
|
case "BP_1":
|
||||||
|
MDict["bp1"] = int(line[12:14])
|
||||||
|
case "BP_2":
|
||||||
|
MDict["bp2"] = int(line[12:14])
|
||||||
|
case "SIM0":
|
||||||
|
MDict["sim0"] = int(line[12:14])
|
||||||
|
case "SIM1":
|
||||||
|
MDict["sim1"] = int(line[12:14])
|
||||||
|
case "EXP0":
|
||||||
|
MDict["exp0"] = int(line[12:14])
|
||||||
|
case "EXP1":
|
||||||
|
MDict["exp1"] = int(line[12:14])
|
||||||
|
case "AVG":
|
||||||
|
MDict["avg"] = int(line[12:14])
|
||||||
|
case _:
|
||||||
|
continue
|
||||||
|
|
||||||
|
return MDict
|
||||||
|
|
||||||
|
|
||||||
|
def setSpeed(inSpeeDict: dict):
|
||||||
|
|
||||||
|
bpavrg = 0
|
||||||
|
# Some safe fan speedvalue
|
||||||
|
defoutprntg = 27
|
||||||
|
# default
|
||||||
|
outfanprcntg = 0
|
||||||
|
|
||||||
|
# Decide on fan speeds
|
||||||
|
LOW_FAN_TRSHD = 21
|
||||||
|
HIGH_FAN_TRSHD = 40
|
||||||
|
TEMP_FACTOR = 21
|
||||||
|
|
||||||
|
# get backplanbe average
|
||||||
|
if inSpeeDict["bp1"] and inSpeeDict["bp2"]:
|
||||||
|
bpavrg = (inSpeeDict["bp1"] + inSpeeDict["bp2"]) /2
|
||||||
|
|
||||||
|
outfanprcntg = int((bpavrg / (HIGH_FAN_TRSHD - LOW_FAN_TRSHD)) * TEMP_FACTOR)
|
||||||
|
|
||||||
|
# Set fan speed
|
||||||
|
if outfanprcntg >= 20:
|
||||||
|
MDserial.write(("set_speed " + str(outfanprcntg) + " \n\r").encode())
|
||||||
|
print(f"setting {outfanprcntg}%")
|
||||||
|
return 0
|
||||||
|
else:
|
||||||
|
# Set default value
|
||||||
|
MDserial.write(("set_speed " + str(defoutprntg) + " \n\r").encode())
|
||||||
|
return 1
|
||||||
|
|
||||||
|
# If something goes super wrong
|
||||||
|
return -1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Check if UART is used
|
# Check if UART is used
|
||||||
# Not neede because when defining MDserial it gets automatically opened
|
# Not neede because when defining MDserial it gets automatically opened
|
||||||
|
# Will leave it here anyway
|
||||||
# try:
|
# try:
|
||||||
# MDserial.open()
|
# MDserial.open()
|
||||||
# except serial.serialutil.SerialException:
|
# except serial.serialutil.SerialException:
|
||||||
@ -23,45 +100,32 @@ MDserial = serial.Serial(
|
|||||||
# # MDserial.open()
|
# # MDserial.open()
|
||||||
# print("Port allready opened.\nTry closing it first")
|
# print("Port allready opened.\nTry closing it first")
|
||||||
|
|
||||||
|
|
||||||
def getTemp():
|
|
||||||
print()
|
|
||||||
|
|
||||||
def setSpeed():
|
|
||||||
print()
|
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
|
# https://stackoverflow.com/questions/52578122/not-able-to-send-the-enter-command-on-pyserial
|
||||||
|
MDserial.write("_temp_rd\n\r".encode())
|
||||||
|
time.sleep(1)
|
||||||
MDreturning = MDserial.read_until(" >").decode()
|
MDreturning = MDserial.read_until(" >").decode()
|
||||||
|
|
||||||
# sleep(50)
|
MDtempDict = getTemp(MDreturning)
|
||||||
MDfanspeed = getTemp(MDreturning)
|
setSpeedrcode = setSpeed(MDtempDict)
|
||||||
|
|
||||||
setSpeedrcode = setSpeed()
|
|
||||||
|
|
||||||
|
# good
|
||||||
if setSpeedrcode == 0:
|
if setSpeedrcode == 0:
|
||||||
continue
|
# print("Were mint")
|
||||||
|
time.sleep(EPYSLEEPY)
|
||||||
|
# not good
|
||||||
|
elif setSpeedrcode == 1:
|
||||||
|
print("Ambigous temperature readings.\nFalling back to safe values.")
|
||||||
|
time.sleep(EPYSLEEPY)
|
||||||
|
# very not good
|
||||||
elif setSpeedrcode == -1:
|
elif setSpeedrcode == -1:
|
||||||
continue
|
|
||||||
else:
|
|
||||||
print("o nyo")
|
print("o nyo")
|
||||||
exit()
|
exit()
|
||||||
|
# very very very not good
|
||||||
|
else:
|
||||||
|
print("idk")
|
||||||
|
exit()
|
||||||
|
|
||||||
|
|
||||||
|
print("closing port")
|
||||||
|
MDserial.close()
|
||||||
|
|
||||||
# https://stackoverflow.com/questions/52578122/not-able-to-send-the-enter-command-on-pyserial
|
|
||||||
# MDserial.write("_temp_rd\n\r".encode())
|
|
||||||
|
|
||||||
# getTemp()
|
|
||||||
# print(MDserial.read_until(" >"))
|
|
||||||
|
|
||||||
# fanprct = 23
|
|
||||||
|
|
||||||
# MDserial.write(f"set_speed {fanprct}\n\r".encode())
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# print("closing port")
|
|
||||||
# MDserial.close()
|
|
||||||
|
226
PC_CONTROL_CODE/test.py
Normal file
226
PC_CONTROL_CODE/test.py
Normal file
@ -0,0 +1,226 @@
|
|||||||
|
import serial, time
|
||||||
|
|
||||||
|
# CONST
|
||||||
|
MD1200BAUD = 38400
|
||||||
|
SERIALADAPTER = "/dev/ttyUSB0"
|
||||||
|
GETTEMP = "_temp_rd"
|
||||||
|
SETFANPRCNT = "set_speed"
|
||||||
|
EPYSLEEPY = 300 # 5 minutes
|
||||||
|
#EPYSLEEPY = 150 # 2,5 minutes
|
||||||
|
|
||||||
|
# init
|
||||||
|
# MDserial = serial.Serial(
|
||||||
|
# port=SERIALADAPTER,\
|
||||||
|
# baudrate=MD1200BAUD,\
|
||||||
|
# parity=serial.PARITY_NONE,\
|
||||||
|
# stopbits=serial.STOPBITS_ONE,\
|
||||||
|
# bytesize=serial.EIGHTBITS,\
|
||||||
|
# timeout=1)
|
||||||
|
|
||||||
|
# After running .encode() on output
|
||||||
|
MDreturn = "b'\r\nBlueDress.105.001 >_temp_rd\r\n\r\n BP_1[2] = 24c\r\n BP_2[3] = 24c\r\n SIM0[0] = 26c\r\n SIM1[1] = 29c\r\n EXP0[4] = 43c\r\n EXP1[5] = 47c\r\n\r\n AVG = 32c\r\n\r\nBlueDress.105.001 >'"
|
||||||
|
# before running .encode() on output
|
||||||
|
TrueMDeturn = MDreturn.encode()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def getTemp(inpMDreturning):
|
||||||
|
# bp1 = 0
|
||||||
|
# bp2 = 0
|
||||||
|
# exp0 = 0
|
||||||
|
# exp1 = 0
|
||||||
|
# simm0 = 0
|
||||||
|
# simm1 = 0
|
||||||
|
# averr = 0
|
||||||
|
MDict = {}
|
||||||
|
|
||||||
|
# print("1")
|
||||||
|
|
||||||
|
# Sanitise output
|
||||||
|
MDsanit = inpMDreturning.splitlines()
|
||||||
|
|
||||||
|
#if there is smth do smth
|
||||||
|
if inpMDreturning:
|
||||||
|
# print("2")
|
||||||
|
|
||||||
|
# print(MDsanit)
|
||||||
|
for line in MDsanit:
|
||||||
|
# print(line)
|
||||||
|
|
||||||
|
if ">" in line or "b'" in line:
|
||||||
|
continue
|
||||||
|
|
||||||
|
# print(line[2:])
|
||||||
|
# if "BP_1" in line[2:]:
|
||||||
|
# print("yeeee")
|
||||||
|
|
||||||
|
matchstm = line[2:6]
|
||||||
|
|
||||||
|
# print(matchstm)
|
||||||
|
|
||||||
|
match matchstm:
|
||||||
|
case "BP_1":
|
||||||
|
# print("BP_1 " + line[12:14])
|
||||||
|
# bp1 = line[12:14]
|
||||||
|
MDict["bp1"] = int(line[12:14])
|
||||||
|
case "BP_2":
|
||||||
|
# print("BP_2 " + line[12:14])
|
||||||
|
# bp2 = line[12:14]
|
||||||
|
MDict["bp2"] = int(line[12:14])
|
||||||
|
case "SIM0":
|
||||||
|
# print("SIM0 " + line[12:14])
|
||||||
|
# simm0 = line[12:14]
|
||||||
|
MDict["sim0"] = int(line[12:14])
|
||||||
|
case "SIM1":
|
||||||
|
# print("SIM1 " + line[12:14])
|
||||||
|
# simm1 = line[12:14]
|
||||||
|
MDict["sim1"] = int(line[12:14])
|
||||||
|
case "EXP0":
|
||||||
|
# print("EXP0 " + line[12:14])
|
||||||
|
# exp0 = line[12:14]
|
||||||
|
MDict["exp0"] = int(line[12:14])
|
||||||
|
case "EXP1":
|
||||||
|
# print("EXP1 " + line[12:14])
|
||||||
|
# exp1 = line[12:14]
|
||||||
|
MDict["exp1"] = int(line[12:14])
|
||||||
|
case "AVG":
|
||||||
|
# print("AVG " + line[12:14])
|
||||||
|
# averr = line[12:14]
|
||||||
|
MDict["avg"] = int(line[12:14])
|
||||||
|
case _:
|
||||||
|
print("ay men")
|
||||||
|
# continue
|
||||||
|
|
||||||
|
# for thing in line.split(" ")[2:]:
|
||||||
|
# print(thing)
|
||||||
|
# print(line[12:14])
|
||||||
|
# print(MDsanit.split("\n"))
|
||||||
|
|
||||||
|
return MDict
|
||||||
|
# print(MDict)
|
||||||
|
|
||||||
|
|
||||||
|
# for key, thing in getTemp(MDreturn).items():
|
||||||
|
# print(key, thing)
|
||||||
|
|
||||||
|
def setSpeed(inSpeeDict: dict):
|
||||||
|
print("skibidi")
|
||||||
|
|
||||||
|
bpavrg = 0
|
||||||
|
# Some safe fan speedvalue
|
||||||
|
defoutprntg = 27
|
||||||
|
# default
|
||||||
|
outfanprcntg = 0
|
||||||
|
|
||||||
|
# Decide on fan speeds
|
||||||
|
LOW_FAN_TRSHD = 21
|
||||||
|
HIGH_FAN_TRSHD = 40
|
||||||
|
TEMP_FACTOR = 21
|
||||||
|
|
||||||
|
# DEBUG
|
||||||
|
# for key, thing in inSpeeDict.items():
|
||||||
|
# print(key, thing)
|
||||||
|
|
||||||
|
# get backplanbe average
|
||||||
|
if inSpeeDict["bp1"] and inSpeeDict["bp2"]:
|
||||||
|
bpavrg = (inSpeeDict["bp1"] + inSpeeDict["bp2"]) /2
|
||||||
|
|
||||||
|
|
||||||
|
outfanprcntg = int((bpavrg / (HIGH_FAN_TRSHD - LOW_FAN_TRSHD)) * TEMP_FACTOR)
|
||||||
|
print(f"outfanprcntg is {outfanprcntg}")
|
||||||
|
|
||||||
|
# Set fan speed
|
||||||
|
if outfanprcntg >= 20:
|
||||||
|
# MDserial.write(("set_speed " + str(outfanprcntg) + " \n\r").encode())
|
||||||
|
return 0
|
||||||
|
else:
|
||||||
|
# Set default value
|
||||||
|
# MDserial.write(("set_speed " + str(defoutprntg) + " \n\r").encode())
|
||||||
|
return 1
|
||||||
|
|
||||||
|
# If something goes super wrong
|
||||||
|
return -1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
while True:
|
||||||
|
# if True:
|
||||||
|
# MDserial.write("_temp_rd\n\r".encode())
|
||||||
|
|
||||||
|
# CHANGE AFTER TESTING
|
||||||
|
# MDreturning = MDserial.read_until(" >").decode()
|
||||||
|
MDreturning = MDreturn
|
||||||
|
|
||||||
|
# sleep(50)
|
||||||
|
|
||||||
|
MDtempDict = getTemp(MDreturning)
|
||||||
|
|
||||||
|
# setSpeed(MDtempDict)
|
||||||
|
|
||||||
|
setSpeedrcode = setSpeed(MDtempDict)
|
||||||
|
|
||||||
|
# good
|
||||||
|
if setSpeedrcode == 0:
|
||||||
|
print("Were mint")
|
||||||
|
time.sleep(EPYSLEEPY)
|
||||||
|
# not good
|
||||||
|
elif setSpeedrcode == 1:
|
||||||
|
print("Ambigous temperature readings.\nFalling back to safe values.")
|
||||||
|
time.sleep(EPYSLEEPY)
|
||||||
|
# very not good
|
||||||
|
elif setSpeedrcode == -1:
|
||||||
|
print("o nyo")
|
||||||
|
exit()
|
||||||
|
# very very very not good
|
||||||
|
else:
|
||||||
|
print("idk")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# def getTemp():
|
||||||
|
# bp1 = 0
|
||||||
|
# bp2 = 0
|
||||||
|
# #exp0 = 0
|
||||||
|
# #exp1 = 0
|
||||||
|
# #simm0 = 0
|
||||||
|
# #simm1 = 0
|
||||||
|
# getMD1200tempReturn = ""
|
||||||
|
|
||||||
|
# MDserial.write(GETTEMP.encode())
|
||||||
|
|
||||||
|
# print(MDserial.readlines())
|
||||||
|
|
||||||
|
# MDreturning = MDserial.readlines().decode()
|
||||||
|
# #if there is smth do smth
|
||||||
|
# if len(MDreturning) >= 1:
|
||||||
|
# print("skibidi")
|
||||||
|
# return MDreturning
|
||||||
|
|
||||||
|
# try:
|
||||||
|
# MDserial.open()
|
||||||
|
# except serial.serialutil.SerialException:
|
||||||
|
# print("Port allready opened.\nTry closing it first")
|
||||||
|
|
||||||
|
|
||||||
|
# # https://stackoverflow.com/questions/52578122/not-able-to-send-the-enter-command-on-pyserial
|
||||||
|
# MDserial.write("_temp_rd\n\r".encode())
|
||||||
|
|
||||||
|
|
||||||
|
# print(MDserial.read_until(" >"))
|
||||||
|
|
||||||
|
# fanprct = 23
|
||||||
|
|
||||||
|
# MDserial.write(f"set_speed {fanprct}\n\r".encode())
|
||||||
|
|
||||||
|
# MDserial.close()
|
22
README.md
22
README.md
@ -1,8 +1,24 @@
|
|||||||
# Python scripts for changing fan speed on MD1200
|
# MD1200 fan noise reduction
|
||||||
|
|
||||||
This adjusts fan speed "dynamically" based on average backplane temperature reading.
|
A set of scripts that automagically set fan speed on a MD1200 (probably MD1220 as well) based on internal temperature readings.
|
||||||
|
|
||||||
## PC
|
## PC
|
||||||
|
|
||||||
|
Working working working.
|
||||||
|
|
||||||
## STM32F103C6T6
|
So far seems to work.
|
||||||
|
|
||||||
|
## STM32F103C6T6
|
||||||
|
|
||||||
|
I think it needs a MAX2323 between MD1200.
|
||||||
|
|
||||||
|
Will look into that.
|
||||||
|
|
||||||
|
## Arduino Nano
|
||||||
|
|
||||||
|
Same here
|
||||||
|
|
||||||
|
|
||||||
|
### FAQ
|
||||||
|
|
||||||
|
dc: yuruc3
|
BIN
STM32_CONTROL/LiterallyMe.gif
Normal file
BIN
STM32_CONTROL/LiterallyMe.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 12 MiB |
Loading…
x
Reference in New Issue
Block a user