X-Git-Url: https://git.smho.de/gw/?p=owSlave2.git;a=blobdiff_plain;f=DS18B20_VOC_DS2438_SHT%2FDS18B20_DS2438.c;h=03d0e68610561bccc638ca10e35bf1b1433f6e77;hp=8e042998dd7debd441379a4f88aa9940a76bece1;hb=refs%2Fheads%2Fmaster;hpb=1624c8ce9acb762d2cdc0b2f6b064448561ff752 diff --git a/DS18B20_VOC_DS2438_SHT/DS18B20_DS2438.c b/DS18B20_VOC_DS2438_SHT/DS18B20_DS2438.c index 8e04299..03d0e68 100644 --- a/DS18B20_VOC_DS2438_SHT/DS18B20_DS2438.c +++ b/DS18B20_VOC_DS2438_SHT/DS18B20_DS2438.c @@ -1,5 +1,4 @@ - -// Copyright (c) 2015, Tobias Mueller tm(at)tm3d.de +// Copyright (c) 2017, Tobias Mueller tm(at)tm3d.de // All rights reserved. // // Redistribution and use in source and binary forms, with or without @@ -42,7 +41,7 @@ #include #include "../common/I2C/USI_TWI_Master.h" #include "../common/I2C/MAX1164x.h" -#include "../common/I2C/SHT2x.h" +#include "../common/I2C/SHT2xV2.h" #include "../common/calibr.h" extern void OWINIT(void); @@ -52,8 +51,8 @@ extern void EXTERN_SLEEP(void); volatile uint8_t owid1[8]={0x28, 0xA3, 0xD9, 0x84, 0x00, 0x16, 0x05, 0x18};/**/ volatile uint8_t owid2[8]={0x26, 0xA3, 0xD9, 0x84, 0x00, 0x16, 0x05, 0x67};/**/ -volatile uint8_t config_info1[16]={0x08,0x01, 0x00,0x00, 0x00,0x00, 0x00,0x00, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; -volatile uint8_t config_info2[16]={0x01,0x06, 0x05,0x08, 0x04,0x07, 0x07,0x08, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; +volatile uint8_t config_info1[26]={0x08,18, 0x00,0x00, 0x00,0x00, 0x00,0x00, 0x02,17,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; +volatile uint8_t config_info2[26]={0x01,0x06, 0x05,0x08, 0x04,0x07, 11,0x08, 0x02,0x07,0x00,0x07,17,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; #if (owid>128) #error "Variable not correct" @@ -63,6 +62,7 @@ extern uint8_t mode; extern uint8_t gcontrol; extern uint8_t reset_indicator; extern uint8_t alarmflag; +extern uint8_t cpsp; volatile uint8_t wdcounter=1; @@ -109,8 +109,7 @@ typedef union { uint8_t threshold; //8 uint8_t page1[8]; //9 - #if defined(__AVR_ATtiny25__) - #else + uint8_t page2[8]; //17 union{ uint8_t page3[8]; //25 @@ -131,11 +130,22 @@ typedef union { uint16_t r_week_max; }; }; - uint8_t page5[8]; //41 - uint8_t page6[8]; //49 + union{ + uint8_t page5[8]; //41 + struct { + uint8_t codeVOC; // immer 0x37 nach Neustart + uint8_t days_of_r0; //Anzahl der Tage fuer die r0 ermittelt wird + int8_t corr_VOC_mult; //r0 corr + int8_t corr_VOC_div; + uint16_t vv3; + uint8_t time_corr; //Wiregate; + uint8_t reset_code; + }; + uint16_t page5d[4]; + }; + uint8_t page6[8]; //49 uint8_t page7[8]; //57 - #endif }; } pack2_t; volatile pack2_t pack2; @@ -158,7 +168,7 @@ uint8_t max_adr=0; #define CH0_CH1 MAX1164x_C_SCAN0 //|MAX1164x_C_CS0 -uint16_t weekmaxarr[8]; +uint16_t weekmaxarr[33]; //Kompensieren der Abhänigkeit von RS/RO von Temperatur und Luftfeuchte inline double interp(double t, double h) { @@ -200,6 +210,12 @@ int testSW(void) { #define EEPROM_R0w 4 #define EEPROM_dol 6 +#define EEPROM_CODE_DAYOFR0 8 +#define EEPROM_CORR 10 +#define EEPROM_FREE 12 +#define EEPROM_TCORR_RESET 14 + + uint16_t readEEPROM(uint8_t addr,uint16_t def) { uint16_t hr; @@ -265,21 +281,25 @@ int main(void){ pack2.r_week_max=readEEPROM(EEPROM_R0w,1); pack2.tol_d=readEEPROM(EEPROM_dol,0); pack2.tol_s8=0; //Tag faengt mit Einschalten an - for(uint8_t i=0;i<7;i++) { + for(uint8_t i=0;i<32;i++) { weekmaxarr[i]=pack2.r_week_max; } + pack2.page5d[0]=readEEPROM(EEPROM_CODE_DAYOFR0,0x0437); + pack2.page5d[1]=readEEPROM(EEPROM_CORR,0x0101); + pack2.page5d[2]=readEEPROM(EEPROM_FREE,0x0); + pack2.page5d[3]=readEEPROM( EEPROM_TCORR_RESET,0x0005); if (testSW()) { - config_info2[5]=8; + config_info2[5]=12; }else{ config_info2[5]=7; } + USI_TWI_Master_Initialise(); - SHT2x_SoftReset(); - SHT2x_ReadUserRegister(userRegister); - SHT2x_WriteUserRegister(userRegister); //write changed user reg + initSHT2x(); + _delay_ms(100); MAX1164x_config(MAX1164x_S_SEL2|MAX1164x_S_SEL0,CH0_M);//#define MAX1164x_C_CS0 _delay_ms(30); //Internal Referenz start //2970 -> 1,5V @@ -287,46 +307,64 @@ int main(void){ sei(); //DDRB|=(1<0) { + if (pack1.config==0x05) { //Reset all Data + } */ + if (wdcounter>0) { //8s pack2.tol_s8++; if (pack2.tol_s8>(10000)) {//10800 ist theortisch der Tag aber meistens zu lang pack2.tol_s8=0; pack2.tol_d++; //rund 180 Jahre :-) pack2.r_week_max=0; - weekmaxarr[7]=pack2.r_day_max; - for(uint8_t i=0;i<7;i++) { + weekmaxarr[pack2.days_of_r0]=pack2.r_day_max; + for(uint8_t i=0;ipack2.r_week_max) pack2.r_week_max=weekmaxarr[i]; } - if (pack2.tol_d>7) { + if (pack2.tol_d>pack2.days_of_r0) { pack2.R0=pack2.r_week_max; } else { pack2.R0=pack2.r_day_max; } //R0=//R0-0.5*(pack2.R0/100-R0); - R0=R0-(R0-pack2.R0/100.0)*0.5 ; + R0=pack2.R0/100.0; pack2.R0=R0*100; writeEEPROM(EEPROM_R0,pack2.R0); writeEEPROM(EEPROM_R0d,pack2.r_day_max); //Maximum des Tages @@ -335,32 +373,24 @@ int main(void){ pack2.r_day_max=0; } if (startup!=0) startup--; - SHT2x_MeasurePoll(HUMIDITY, &sRH); - // --- measure temperature with "Polling Mode" (no hold master) --- - SHT2x_MeasurePoll(TEMP, &sT); - //-- calculate humidity and temperature -- - temperatureC = SHT2x_CalcTemperatureC(sT); - humidityRH = SHT2x_CalcRH(sRH); + getSHT2xHumTemp(&temperatureC,&humidityRH); ip=interp(temperatureC,humidityRH); pack2.ip=ip*1000; - humidityRH=calibr_hum(temperatureC,-0.2,humidityRH)*10.0; - //humidityRH=humidityRH*10.0; - temperatureC =temperatureC *10.0-2; + double RH=calibr_hum(temperatureC,-0.2,humidityRH)*10.0; + double TC =temperatureC *10.0-2; if (testSW()) { - am2302_hum= humidityRH*10.0; - am2302_temp=temperatureC*25.6; - //am2302_temp=am2302_temp-45; - config_info2[5]=8; + am2302_hum=RH; + am2302_temp=TC*25.6; + config_info2[5]=12; //10V = 100% }else{ - hhum=(1.0546-0.000216*temperatureC)*(humidityRH); + hhum=(1.0546-0.000216*TC)*(RH); //am2302_hum=0.318*hhum +76.0; am2302_hum=0.31*hhum +80; - am2302_temp=temperatureC*25.6; + am2302_temp=TC*25.6; config_info2[5]=7; } - //PORTB&=~(1<>4; uint8_t af=0;