Hamster Rad
Projekt Hamster Counter
Hamsterrad
Reed Sensor
Installation
Ziel
Ein kleiner Hamster Rad Zähler, um etwas über das (nächtliche) Laufverhalten des Nagers zu erfahren.
Website
Das Projekt hat nen kleinen Webserver bekommen mit Live Statistiken Webserver nur IPv6 erreichbar
Hardware
- Hamster
- Käfig
- Laufrad
- APU2/3/4 von PC Engines, kann natürlich auch ein Raspi / Arduino oder sonstwas sein …
- DSUB 9 Pol (Conrad, Art: 2108931 - 62), oder einfach ein altes Kabel verschneiden
- Rolle Draht / Litze 2 Ader (Conrad, Art: 1567051 - 62)
- Positionssensor (Conrad, Art. 155227)
- Supermagnet
- ein paar Zeilen Python
Aufbau
das Supermaget klebst Du auf das Hamsterrad auf die Rückseite. Das Rad so gut wie es geht am Gehäuse befestigen. Der Magnetsensor steckst/klebst Du ans Gehäuse und kuckst, dass ca. 1 cm Abstand hast zum Magneten am Rad. Die zwei Kabel am Magneten schraubst/lötest du an die 10m Litze und gehst damit auf den Serial Stecker. Dort schliesst Du die Drähte am Pin 4 und Pin 6 an. Das Script gibt logisch “1” auf den DTR Pin und wenn das Magnet schliesst, dann hast Du Logisch “1” auf DSR. DSR wird dann im Script ausgelesen und gezählt
APU
PC Engines hab ich mit OpenBSD aufgesetzt, Bash, Git, Python3 und CSVkit installiert. Sonst ist eingentlich nix besonderes notwendig.
Software
Python Script
cat << 'EOF' > hamster-serial.py
import datetime
import os
import serial
import sys
# Round Counter
round = 0
# Check for commandline argument. The first argument is the the name of the program.
if len(sys.argv) < 2:
print ("Usage: python %s [Out File]" % sys.argv[0])
exit()
# Open the serial port we'll use the pins on and the file we'll write to.
ser = serial.Serial("/dev/tty00")
# Read last Round from file
with open(sys.argv[1], 'r') as f:
lastline = (list(f)[-1])
round = int(lastline.split(';',4)[2])
# Open the file we're going to write the results to.
f = open(sys.argv[1], 'a')
# Bring DTR to 1. This will be shorted to DSR when the switch is activated as the wheel turns.
ser.setDTR(1)
# Waits for the DSR pin on the serial port to turn off. This indicates that the
# switch has turned off and the magnet is no longer over the switch.
def waitForPinOff():
while ser.getDSR() == 1:
1 # Don't do anything while we wait.
# Waits for the DSR pin on the serial port to turn on. This indicates that the
# switch has turned on and the magnet is current over the switch.
def waitForPinOn():
while ser.getDSR() == 0:
1 # Don't do anything while we wait.
print ( "%s;%d;%1.2fm\n" % ( datetime.datetime.now().strftime("%Y-%m-%d;%H:%M:%S.%f"), round, 0 ) )
# The main loop of the program.
while 1:
waitForPinOn()
print ("pin closed")
waitForPinOff()
print ("pin open")
round = round + 1
dist = round * 0.6
print ("Runde: %d" % round)
print ("Strecke: %1.2f meter" % dist)
a = datetime.datetime.now()
# Log it to and flush the file so it actually gets written.
f.write ( "%s;%d;%1.2f meter\n" % ( datetime.datetime.now().strftime("%Y-%m-%d;%H:%M:%S.%f"), round, dist ) )
f.flush()
EOF
chmod 755 hamster-serial.py
Wrapper
kritzelt alle Runden ins runden.dat
cat << 'EOF' > run.sh
doas python3 hamster-serial.py runden.dat
EOF
chmod 755 run.sh
Statistiken
macht ne Statistik jeden Tag und schickt sie per Mail
cat << 'EOF' > dailystats.sh
#!/usr/bin/env bash
src=runden.dat
today=$(date "+%Y%m%d")
log=stats/$today
mkdir -p stats
head -1 $src > $log.dat
tail -1 $src >> $log.dat
cat $log.dat |/usr/local/bin/csvlook > $log.log
cat $log.log |mail -s "Hamster: $today" -r [email protected] [email protected]
exit 0
EOF
chmod 755 dailystats.sh
Cronjob
zuletzt noch alles in nen Crontab werfen und warten, bis der Hamster rennt :)
0 6 * * * cd /home/hamster/hamstercount; ./dailystats.sh
Any Comments ?
sha256: 4d8851d89a28879b0707476063fd5cd205af4990c43a081fd6c1fb55bf26b6ad