Duet 3 SBC : SBC Temperature Sensor
-
@bearer Hoo sorry I'am very new to Linux and all this.
Can you explain me that like if I was totally stupid ? -
I can try to explain it like I'm not stupid enough to assume everyone is a linux wizard instead..?
The temperature is available on the pi, in a "file" called
/sys/class/thermal/thermal_zone0/temp
the value is in thousands degrees celcius, i.e. 40000 is 40°C.So reading from this file we can access the current temperature,
cat /sys/class/thermal/thermal_zone0/temp
will print the temp if you run it in a (ssh) shell.Lets say you use fan 3, so
M106 P3 S1
will turn on the fan, andM106 P3 S0
will turn it off, from the shell we can send this to the duet by using the program/opt/dsf/bin/CodeConsole
. This requires (or required at the time of writing) root access so lauch it bysudo /opt/dsf/bin/CodeConsole
then you can type inM106 P3 S1
to turn on a fan.To simplify you can run the command
echo M106 P3 S1 | sudo /opt/dsf/bin/CodeConsole
that sends the text to the program all in one go.Putting it all together we can test the temperature value and send the command to turn on or off the fan as we please.
if [ $(cat /sys/class/thermal/thermal_zone0/temp) -lt 45000 ]; then echo M106 P3 S0 | sudo /opt/dsf/bin/CodeConsole; else echo M106 P3 S1 | sudo /opt/dsf/bin/CodeConsole; fi;
Is the same as I posted, but broken up in several lines to make it easier to read. We can then put it inside a loop and make this test over and over and over and over and over.
#!/bin/bash while (true) do if [ $(cat /sys/class/thermal/thermal_zone0/temp) -lt 45000 ]; then echo M106 P3 S0 | sudo /opt/dsf/bin/CodeConsole; else echo M106 P3 S1 | sudo /opt/dsf/bin/CodeConsole; fi; sleep 5 done
Put that in a file called duetfan.sh, make it executable
chmod +x duetfan.sh
and run it with./duetfan.sh
I'll see if I can't find the time to make a systemd unit to make it run in the background and start/stop with DSF over the weekend, but hopefully that was a little clearer.
edit changed the logic to test if the temperature is less than 45°C to turn the fan off - as this would turn the fan on if there is a unknown problem.
-
@bearer Haha thank you verry mutch
Everything is clear -
I assumed you wanted to control a fan on the Duet?
(You could in theory control a fan attached to the Pi but it would either require something like the fan shim or custom wiring and a transistor. Fan shim seems pretty neat in any case, but I don't have first hand experience with it)
-
@bearer Yes you are right my intent is to control the fan from the Duet.
My problem is that the PI has many difficulties to catch the wifi. And I noticed that moving it a little ( 3 or 4 cm ) does a great difflerence.
In my printer the Pi si in a case that make the wifi even harder to catch.
So I was in search of a solution outside of th pi to let it as free as possible.But the Fan shim looks good ans small enougth.
Maybe I'll try it. -
figured the fan shim would have a systemd script handy, and boy did they. modified to suit and made the fan script parametric as well.
#!/bin/bash DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" TEMP=45000 DELAY=5 FAN=-1 POSITIONAL_ARGS=() USAGE="$0 --fan <n> --temp [n] --delay [n]" while [[ $# -gt 0 ]]; do K="$1" case $K in -t|--temp) TEMP="$2" shift shift ;; -d|--delay) DELAY="$2" shift shift ;; -f|--fan) FAN="$2" shift shift ;; *) if [[ $1 == -* ]]; then printf "Unrecognised option: $1\n"; printf "Usage: $USAGE\n"; exit 1 fi POSITIONAL_ARGS+=("$1") shift esac done set -- "${POSITIONAL_ARGS[@]}" if [ ! -z $FAN ] && [ $FAN -ge 0 ] && [ $FAN -le 8 ]; then while (true); do if [ $(cat /sys/class/thermal/thermal_zone0/temp) -lt $TEMP ]; then echo M106 P${FAN} S0 | sudo /opt/dsf/bin/CodeConsole; else echo M106 P${FAN} S1 | sudo /opt/dsf/bin/CodeConsole; fi; sleep $DELAY done else echo $USAGE fi
#!/bin/bash DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" TEMP=45000 DELAY=5 FAN=-1 POSITIONAL_ARGS=() SERVICE_PATH=/etc/systemd/system/duetfan.service USAGE="sudo ./$0 --fan <n> --temp [n] --delay [n]" while [[ $# -gt 0 ]]; do K="$1" case $K in -t|--temp) TEMP="$2" shift shift ;; -d|--delay) DELAY="$2" shift shift ;; -f|--fan) FAN="$2" shift shift ;; *) if [[ $1 == -* ]]; then printf "Unrecognised option: $1\n"; printf "Usage: $USAGE\n"; exit 1 fi POSITIONAL_ARGS+=("$1") shift esac done set -- "${POSITIONAL_ARGS[@]}" if [ ! -z $FAN ] && [ $FAN -ge 0 ] && [ $FAN -le 8 ]; then cat << EOF Setting up with: Fan: $FAN Temp: $TEMP mC Delay: $DELAY seconds To change these options, run: $USAGE Or edit: $SERVICE_PATH EOF read -r -d '' UNIT_FILE << EOF [Unit] Description=Duet Fan Service After=multi-user.target [Service] Type=simple WorkingDirectory=$(pwd) ExecStart=$(pwd)/duetfan.sh $TEMP $DELAY Restart=on-failure [Install] WantedBy=multi-user.target EOF printf "\nInstalling service to: $SERVICE_PATH\n" echo "$UNIT_FILE" > $SERVICE_PATH systemctl daemon-reload systemctl enable --no-pager duetfan.service systemctl restart --no-pager duetfan.service systemctl status --no-pager duetfan.service else echo $USAGE fi
save content to files, chmod +x and sudo ./duetfansystemd.sh to install and start service.
-
45C seems a little low.
The Pi is OK to 85C in teh SoC. It doesn't do any throttling at all until 60C, and only starts throttling seriously at 80C. I would expect 55C is still plenty margin for fans to come on, and avoids running fans unecesarily - even 60C might be adequate (since the first soft throttling still leaves the Pi running at about 85% of 'flat out').
-
@achrn said in Duet 3 SBC : SBC Temperature Sensor:
45C seems a little low.
i suppose my "substandard" ambient temp is to blame for that as I have plenty margin to 45C, anyways, easy enough to change, and the cooler the better in any case.
-
@bearer Thank you very mutch.
Your script work perfectely. -
credit goes the fan shim crowd for the rather elegant systemd setup and happy to help with "interesting" ways to achieve things.