Re: DS1822 auslesen Kategorie: Sensoren (von Jörg Hansen - 2.03.2009 9:14) | ||
Als Antwort auf Re: DS1822 auslesen von Hartwig - 24.02.2009 6:39 | ||
| ||
Hallo Hartwig, du musst die ROM-Codes aller DS1822 einmalig einlesen und als Konstanten (oder Variablen) in deinen Routinen verwenden. Ich lege die ROM-Codes meiner Sensoren (DS18B20) in einem EEPROM ab. Anbei die Quellcodes meiner Routinen (Interaktiv über hwcom ): Einlesen der Sensorcodes (immer nur 1 Sensor angeschlossen): // Konstanten const maxSensor = 15; //Anzahl der Tempartursensoren const Sensorname[] ="Aussentemp. hinten", "Erdwaermetauscher", "Frischluft vor WRG", "Fortluft hinter WGR", "Zuluft hinter WRG", "Abluft vor WRG", "Raumtemperatur EG", "Raumtemperatur OG", "Raumtemperatur DG", "Heizung Vorlauf", "Heizung Ruecklauf", "Heizung Kesselwasser", "Aussentemp. vorne","Brauchwasserspeicher","Zirkulationsleitung"; //---------------------------------------------------------------------------------------------- function newDS18B20 () // Romcode einlesen, Sensor zuordnen und entsprechend im EEProm ablegen //---------------------------------------------------------------------------------------------- { byte getrom[16]; string s; byte i,x,y; for i = 0...15 getrom[i] = 0xff; // Werte initialiseren i=ds2482.getROM(0,getrom); s= "Romcode gelesen: "; hwcom.send(s,17); wait hwcom.ready(); s= ""; for i= 0...6 { str.putint(s,getrom[i]); str.putchar(s,44); }; str.putint(s,getrom[7]); hwcom.send(s,30); hwcom.ret(); wait hwcom.ready(); for i = 0...(maxSensor-1) // Ausgabe der Sensorenliste { s=" "; str.putint(s,i); s=s+" "; s=s+Sensorname[i]; hwcom.send(s,str.length(s)); hwcom.ret(); } hwcom.ret(); s= "Welchem Sensor zuordnen?00-32:"; hwcom.send(s,30); y=hwcom.input (1); hwcom.ret(); s="(S)peichern, (A)bbruch "; hwcom.send(s,str.length(s)); wait hwcom.rxd(); x=hwcom.get(); if x=='S' or x=='s' { if eeprom.writebytearray(0,(16*y),getrom,16) { s= "Ins EEProm geschrieben"; hwcom.send(s,22); hwcom.ret(); } else { s= "Fehler beim EEProm schreiben"; hwcom.send(s,29); hwcom.ret(); return; }; }; if x=='A' or x=='a' { s= "Nicht gespeichert"; hwcom.send(s,17); hwcom.ret(); return; }; }; Auslesen der Sensoren: //-------------------------------------------------- function tempmessung() // Temperaturmessung manuell //-------------------------------------------------- { string s; //für Textausgaben int i; // für Schleifen byte getrom[16]; // Speicherstellen für ROM-Codes int scratchpad; // Zwischenspeicher für gelesenen Temperaturwert float temp [16]; // Zwischenspeicher für Temperaturwerte (wie maxSensor) for i = 0...(maxSensor-1) { eeprom.readbytearray(0,(i*16),getrom,16); // ROMcode aus EEprom lesen if debug { s=Sensorname[i]; hwcom.send(s,str.length(s)); hwcom.ret(); wait hwcom.ready(); }; if getrom[1]== 0xff continue; // wenn erste Speicherstelle FF weiter mit nächstem Sensor ds2482.resetDevices(0); ds2482.matchROM(0,getrom); ds2482.writeByte(0,0x44); //Convert Temperatur sleep 800; // diese Zeit braucht ein DS18B20 bis der Wert ausgelesen werden kann ds2482.matchROM(0,getrom); ds2482.writeByte(0,0xbe); //read scratchpad scratchpad=ds2482.readByte(0) or ds2482.readByte(0) shl 8; if scratchpad and 0xF000 temp[i]= (scratchpad) or 0xf000; else temp[i]= (scratchpad) ; s=""; str.putint(s,i); if i<10 s=s+" "; else s=s+" "; s=s+Sensorname[i]; s=s+" "; str.putfloatf(s,(temp[i]*0.0625),1); log(s); }; }; Gru� Jörg | ||
Antwort schreiben Antworten: |