24 296 läst · 74 svar
24k läst
74 svar
Tempövervakning med 1-wire
Gjorde en liten analys av dina funktioner. Jag säger inte att de är fel, de fungerar bara inte för mig... ;-)
Dumpar lite variabler i din avläsnings/omräkningsfunktion:
Cold Junction register: 23.00
cj_volt: 0.94
tcv_float: 8182.00
tcv_float: 127.84
tc_volt: 128.78
tC: 0.00
tC[1]: 3230.28
tC[2]: 4533.83
tC[3]: -530073.81
tC[4]: 22340574.00
tC[5]: -412633152.00
tC[6]: 4059431424.00
tC[7]: ovf
tC[8]: ovf
tC[9]: ovf
Temperature: ovf
tC[1] osv är "//Convert from voltage to Celsius"-partiet där du itererar igenom din c[..]-array. Jag förstår inte riktigt matematiken bakom dina beräkningar, så jag kan inte säga vad som är fel.
Min gissning är att min avläsning ger ett värde som din rutin inte hanterar.
Dumpar lite variabler i din avläsnings/omräkningsfunktion:
Cold Junction register: 23.00
cj_volt: 0.94
tcv_float: 8182.00
tcv_float: 127.84
tc_volt: 128.78
tC: 0.00
tC[1]: 3230.28
tC[2]: 4533.83
tC[3]: -530073.81
tC[4]: 22340574.00
tC[5]: -412633152.00
tC[6]: 4059431424.00
tC[7]: ovf
tC[8]: ovf
tC[9]: ovf
Temperature: ovf
tC[1] osv är "//Convert from voltage to Celsius"-partiet där du itererar igenom din c[..]-array. Jag förstår inte riktigt matematiken bakom dina beräkningar, så jag kan inte säga vad som är fel.
Min gissning är att min avläsning ger ett värde som din rutin inte hanterar.
Kom att tänka på att jag, när jag körde testprogrammet OWtest, inte fick något temperaturvärde från termoelementet förrän temperaturen översteg en viss nivå. Jag har nu kollat upp detta och ser då att värdet blir -0.00 (vilket nog motsvarar "ovf" med din programversion) så länge temperaturen ligger under +28 ºC. Eftersom jag använder givaren för att mäta rökgastemperaturen brydde jag mig inte om detta, utan ignorerar helt enkelt värden <0. Kanske är det så att tabellen för temperaturkonverteringen inte går längre ned än motsvarande +28º.
/M-E
PS. Jag använder spetsgivaren TCPS samt termoelementinterfacet TC2 från m.nu.
/M-E
PS. Jag använder spetsgivaren TCPS samt termoelementinterfacet TC2 från m.nu.
PPS. Kopierade rutinen för konvertering till ºC direkt från det refererade exemplet i Arduino-forumet och grubblade inte närmare på denna, eftersom jag fick korrekta temperaturvärden i det område som var intressant för mig.
Yes! Det fungerar ju precis som du säger. Tänkte aldrig på att värma min sensor när jag testade. Men så fort jag värmde den med handen så fick jag temperaturer. Kaffet var 52,4 grader varmt i koppen!
Tack för hjälpen! Nu har jag något att bygga från!
Mvh Jens
Ps Har exakt samma sensorer som du har från m.nu. DS![Glad :) :)](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
Tack för hjälpen! Nu har jag något att bygga från!
Mvh Jens
Ps Har exakt samma sensorer som du har från m.nu. DS
hejfastmoving? skrev:
fick du igång detta?
hittar ingen info om vad e-logger kostar, men har saker för PI liggande.. men letar efter något enkelt system för att logga eller i alla fall se temperaturer som är kopplade till PI, jag är inte så haj på att koda, men någon borde väl gjort något som funkar?
EDIT: hittade info om priserna, men tror ändå jag ska försöka hitta en enkel lösning med PI, någon som har nåt väldigt enkelt? kommer nog kunna få igång OWFS men att ta det från det till tex en text-fil som går importera i excel... eller nåt. eller om någon har tips på nån enkel webserver som kan visa värden? helst köra på bara PI...
Redigerat:
Jag följde wiki'n från m.nu http://wiki.m.nu/index.php/OWFS_på_Rasperry_Pi när jag gjorde min konfiguration. De har även ett forum som har lite mer fokus på temperaturloggning etc.Boan skrev:hej
fick du igång detta?
hittar ingen info om vad e-logger kostar, men har saker för PI liggande.. men letar efter något enkelt system för att logga eller i alla fall se temperaturer som är kopplade till PI, jag är inte så haj på att koda, men någon borde väl gjort något som funkar?
EDIT: hittade info om priserna, men tror ändå jag ska försöka hitta en enkel lösning med PI, någon som har nåt väldigt enkelt? kommer nog kunna få igång OWFS men att ta det från det till tex en text-fil som går importera i excel... eller nåt. eller om någon har tips på nån enkel webserver som kan visa värden? helst köra på bara PI...
Jag loggar/skickar temperaturen utomhus till temperatur.nu med hjälp av ett bash script så får de sköta databasen och lagringen etc. Jag har inte gjord någon egen databas men det finns wiki för det också (RRDTool) om man vill prova.
Som jag skrev tidigare använder jag ett bash script för att läsa ut temperaturen. Skriptet sparar ner allt till en textfil som jag sedan använder ett annat script till att skicka upp till en webserver. Det är även möjligt att ha en egen webserver på pi'en men jag har skippade den biten. Sedan använder jag cron för att köra scriptetn var 3'e minut.
Jag bifogar mitt script och resultatet i textfilen så har du något att börja med, det finns lite kommentarer (efter #) men allt är nog inte självklart (när man håller på är allt enkelt och sedan något år senare är det en annan femma).
#!/bin/bash
# Script for att skapa aktuell temperatur-fil
# filnamn och sokvag
file="/home/pi/temperatur/temperatur.txt"
sensor1="/mnt/1wire/28.C63AA4050000/temperature"
sensor2="/mnt/1wire/28.2C41A5050000/temperature"
sensor3="/mnt/1wire/28.F64695040000/temperature"
# Tar temperaturen datum klocka och lägger i variabler.
temp1=`cat "$sensor1"|sed -e s/" "//g|awk '{$1=$1 + 0.00001;printf "%.4f", $1}'`
temp2=`cat "$sensor2"|sed -e s/" "//g|awk '{$1=$1 + 0.00001;printf "%.4f", $1}'`
temp3=`cat "$sensor3"|sed -e s/" "//g|awk '{$1=$1 + 0.00001;printf "%.4f", $1}'`
datum=$(date +%F)
klocka=$(date +%T)
# Tar tempen och omvandlar den till heltal som är 10000 ggr större än aktuell temp avrundat till heltal
g1=`cat "$sensor1"|sed -e s/" "//g|awk '{$1=$1 * 10000+1;printf "%.0f", $1}'`
g2=`cat "$sensor2"|sed -e s/" "//g|awk '{$1=$1 * 10000+2;printf "%.0f", $1}'`
g3=`cat "$sensor3"|sed -e s/" "//g|awk '{$1=$1 * 10000+3;printf "%.0f", $1}'`
# Jämför värdet på givaren för att få fram den som har lägst temperatur
if [ $g2 -gt $g1 ] && [ $g3 -gt $g1 ]
then lagtemp=$temp1
elif [ $g1 -gt $g2 ] && [ $g3 -gt $g2 ]
then lagtemp=$temp2
else lagtemp=$temp3
fi
# värdet som den hämtar ovan läggs i filen ovan och den skrivs över varje gång skriptet körs
echo "$datum $klocka <br>" > "$file"
echo "Sensor 1: $temp1 <br>" >> "$file"
echo "Sensor 2: $temp2 <br>" >> "$file"
echo "Sensor 3: $temp3 <br>" >> "$file"
echo "Low temp: $lagtemp" >> "$file"
Textfilens innehåll just nu.
2016-01-14 21:18:03 <br>
Sensor 1: -11.3750 <br>
Sensor 2: -11.8750 <br>
Sensor 3: -12.0000 <br>
Low temp: -12.0000
Jag bifogar mitt script och resultatet i textfilen så har du något att börja med, det finns lite kommentarer (efter #) men allt är nog inte självklart (när man håller på är allt enkelt och sedan något år senare är det en annan femma).
#!/bin/bash
# Script for att skapa aktuell temperatur-fil
# filnamn och sokvag
file="/home/pi/temperatur/temperatur.txt"
sensor1="/mnt/1wire/28.C63AA4050000/temperature"
sensor2="/mnt/1wire/28.2C41A5050000/temperature"
sensor3="/mnt/1wire/28.F64695040000/temperature"
# Tar temperaturen datum klocka och lägger i variabler.
temp1=`cat "$sensor1"|sed -e s/" "//g|awk '{$1=$1 + 0.00001;printf "%.4f", $1}'`
temp2=`cat "$sensor2"|sed -e s/" "//g|awk '{$1=$1 + 0.00001;printf "%.4f", $1}'`
temp3=`cat "$sensor3"|sed -e s/" "//g|awk '{$1=$1 + 0.00001;printf "%.4f", $1}'`
datum=$(date +%F)
klocka=$(date +%T)
# Tar tempen och omvandlar den till heltal som är 10000 ggr större än aktuell temp avrundat till heltal
g1=`cat "$sensor1"|sed -e s/" "//g|awk '{$1=$1 * 10000+1;printf "%.0f", $1}'`
g2=`cat "$sensor2"|sed -e s/" "//g|awk '{$1=$1 * 10000+2;printf "%.0f", $1}'`
g3=`cat "$sensor3"|sed -e s/" "//g|awk '{$1=$1 * 10000+3;printf "%.0f", $1}'`
# Jämför värdet på givaren för att få fram den som har lägst temperatur
if [ $g2 -gt $g1 ] && [ $g3 -gt $g1 ]
then lagtemp=$temp1
elif [ $g1 -gt $g2 ] && [ $g3 -gt $g2 ]
then lagtemp=$temp2
else lagtemp=$temp3
fi
# värdet som den hämtar ovan läggs i filen ovan och den skrivs över varje gång skriptet körs
echo "$datum $klocka <br>" > "$file"
echo "Sensor 1: $temp1 <br>" >> "$file"
echo "Sensor 2: $temp2 <br>" >> "$file"
echo "Sensor 3: $temp3 <br>" >> "$file"
echo "Low temp: $lagtemp" >> "$file"
Textfilens innehåll just nu.
2016-01-14 21:18:03 <br>
Sensor 1: -11.3750 <br>
Sensor 2: -11.8750 <br>
Sensor 3: -12.0000 <br>
Low temp: -12.0000
M
Marcussjogren
Medlem
· Västra Götaland
· 3 079 inlägg
Marcussjogren
Medlem
- Västra Götaland
- 3 079 inlägg
För sakens skull så dumpar jag mitt script som jag använder för tillfället ![Glad :) :)](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
Har inte hunnit lägga till funktionalitet för att kunna mata programmet med fler än en sensor som argument än.
Startas så här: python mittscript.py SensorID
Kräver dock att man har installerat paketet python-mysqldb, men det är det värt.
import re, MySQLdb, sys
sensorID = sys.argv[1] if len(sys.argv) >= 2 else exit("ERROR: You must specify sensor id!")
textfile = open("/sys/bus/w1/devices/%s/w1_slave" % sensorID, 'r')
filetext = textfile.read()
textfile.close()
match = re.findall("t=(\d+)", filetext)
sensorValue = float(match[0])/1000
print "Inserting: %.3f " % sensorValue
db = MySQLdb.connect(host="10.10.0:XXX", user="user", passwd="password", db="Monitoring")
cur = db.cursor()
try:
cur.execute("INSERT INTO sensorValues (ID, value) VALUES (%s, %s)", (str(sensorID), str(sensorValue)))
db.commit()
except MySQLdb.Error, e:
cur.rollback()
print "ERROR"
print "MySQL Error [%d]: %s" % (e.args[0], e.args[1])
cur.close()
db.close()
Har inte hunnit lägga till funktionalitet för att kunna mata programmet med fler än en sensor som argument än.
Startas så här: python mittscript.py SensorID
Kräver dock att man har installerat paketet python-mysqldb, men det är det värt.
import re, MySQLdb, sys
sensorID = sys.argv[1] if len(sys.argv) >= 2 else exit("ERROR: You must specify sensor id!")
textfile = open("/sys/bus/w1/devices/%s/w1_slave" % sensorID, 'r')
filetext = textfile.read()
textfile.close()
match = re.findall("t=(\d+)", filetext)
sensorValue = float(match[0])/1000
print "Inserting: %.3f " % sensorValue
db = MySQLdb.connect(host="10.10.0:XXX", user="user", passwd="password", db="Monitoring")
cur = db.cursor()
try:
cur.execute("INSERT INTO sensorValues (ID, value) VALUES (%s, %s)", (str(sensorID), str(sensorValue)))
db.commit()
except MySQLdb.Error, e:
cur.rollback()
print "ERROR"
print "MySQL Error [%d]: %s" % (e.args[0], e.args[1])
cur.close()
db.close()
Redigerat:
kul! tackar för bra inpu, har fått mitt i2c kort idag från m.nu som ska in på Pi:en, ska få tag på några givare och börja testköra innan det är dags att bygga stora nätet...
såg även en del på denna:
https://sites.google.com/site/raspberry1wire/
som använde Digitemp och sen laddade upp till Thingspeak.com
såg även en som körde upp till Devicehive,
lite skumt att inte någon plitat ihop ett program för 1-wire, som identifierar samtliga givare, låter en sätta alias på dem samt loggningstäthet. Sen ett gränssnitt där man väljer vilka givare man vill titta på och hur länge.
eller är det svårare än jag tror? nu har jag ju inte programmerat på väldigt länge... så jag kanske helt missuppfattar hur svårt det är.
tänker ju att tex VLC osv görs ju som open source..
såg även en del på denna:
https://sites.google.com/site/raspberry1wire/
som använde Digitemp och sen laddade upp till Thingspeak.com
såg även en som körde upp till Devicehive,
lite skumt att inte någon plitat ihop ett program för 1-wire, som identifierar samtliga givare, låter en sätta alias på dem samt loggningstäthet. Sen ett gränssnitt där man väljer vilka givare man vill titta på och hur länge.
eller är det svårare än jag tror? nu har jag ju inte programmerat på väldigt länge... så jag kanske helt missuppfattar hur svårt det är.
tänker ju att tex VLC osv görs ju som open source..
Söker lite tips om väg framåt..
Har en gammal datalogger monterad på min panna, den var med serieportsanslutning på den tiden, som inte används.
Min idé är att använda dessa sensorer kopplade till en Raspberry och sedan helst läsa värdena från denna till Home Assistant. Vad tror ni om detta, enkelt, några tips på vägen?
Har en gammal datalogger monterad på min panna, den var med serieportsanslutning på den tiden, som inte används.
Min idé är att använda dessa sensorer kopplade till en Raspberry och sedan helst läsa värdena från denna till Home Assistant. Vad tror ni om detta, enkelt, några tips på vägen?
Koppla sensorerna till en ESP32 eller ESP8266 om du har wifi täckning där du skall mäta. Sedan är det bara att läsa värdena i Home Assistant. ESP kostar 2 till 6 euro per styck beroende på modell, tycker ESP8266 har bättre wifi signal. Du kan koppla många sensorer till en ESP kortD djac skrev:Söker lite tips om väg framåt..
Har en gammal datalogger monterad på min panna, den var med serieportsanslutning på den tiden, som inte används.
Min idé är att använda dessa sensorer kopplade till en Raspberry och sedan helst läsa värdena från denna till Home Assistant. Vad tror ni om detta, enkelt, några tips på vägen?
Tack, det var mycket intressant, kände jag inte till. Jag får kolla runt om jag hittar någon/några bra guider på detta, du råkar inte ha snubblat över någon sådan?R rasse123 skrev:
Installera ESPHome Add-ons i HA därefter kan du programmera ESP32 eller ESP8266 via HA, första gången då du "aktiverar" den ( berätta wifi ssd och lösenord...)så måste du använda kabel, efter det kan du göra det över wifi nätverketD djac skrev:
https://esphome.io/components/sensor/dallas.html
https://esphome.io/
Det är mycket enkelt att göra det, det mesta av koden kan du kopiera och klistra in...