//void processTempData(ADC_Typedef* ADC_RES) void ADC_ProcessData(void) { uint32_t index, dataSum; /* sort received data in */ // insertionSort(ADC_ConvertedValueBuff + 8, 8); // ADC_RES.Chanel04AVG = interquartileMean(ADC_ConvertedValueBuff + 8, 8); insertionSort(ADC_ConvertedValueBuff + 8, 16); ADC_RES.Chanel13AVG = interquartileMean(ADC_ConvertedValueBuff + 8, 16); //Core temperature math average dataSum = 0; /* Sum up all mesured data for reference temperature average calculation */ for (index = 0; index < 4; index++){ dataSum += ADC_ConvertedValueBuff[index]; } /* Devide sum up result by 4 for the temperature average calculation*/ ADC_RES.tempAVG = dataSum / 4 ; dataSum = 0; /* Sum up all mesured data for reference temperature average calculation */ for (index = 4; index < 8; index++){ dataSum += ADC_ConvertedValueBuff[index]; } /* Devide sum up result by 4 for the temperature average calculation*/ ADC_RES.refAVG = dataSum / 4 ; /* Calculate temperature in °C from Interquartile mean */ ADC_RES.temperature_C = CalcTemperature(ADC_RES.tempAVG); /* Calculate voltage in V from average */ ADC_RES.voltage_V = (VREF/ADC_RES.refAVG) * ADC_CONV; /* Calculate preasure in mmHg */ //preasure_V = (preasure_ref * preasureAVG) / preasure_conv; //altTemp_V = (altTempAVG * voltage_V * 100)/ ADC_CONV; }
uint16_t adc_coretemp_simple(void) { ADC_InitTypeDef ADC_InitStructure; uint16_t AD_value; uint16_t TemperatureC; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //enable ADC1 clock //ADC1 configuration ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; ADC_InitStructure.ADC_ScanConvMode = DISABLE; //convert single channel only ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //convert one time ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConvEdge_None; //select no external triggering ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //right 12-bit data alignment in ADC data register ADC_InitStructure.ADC_NbrOfConversion = 1; //single channel conversion ADC_Init(ADC1, &ADC_InitStructure); //load structure values to control and status registers ADC_TempSensorVrefintCmd(ENABLE); //wake up temperature sensor //ADC1 channel16 configuration ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_384Cycles); ADC_Cmd(ADC1, ENABLE); //Enable ADC1 calibdata = *FACTORY_CALIB_DATA; ADC_SoftwareStartConv(ADC1); while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)){} //wait for conversion complete AD_value = ADC_GetConversionValue(ADC1); //read ADC value ADC_ClearFlag(ADC1, ADC_FLAG_EOC); //clear EOC flag TemperatureC = CalcTemperature(AD_value); return TemperatureC; }
eError DHT::readData() { uint8_t i = 0, j = 0, b = 0, data_valid = 0; uint32_t bit_value[DHT_DATA_BIT_COUNT] = {0}; eError err = ERROR_NONE; //time_t currentTime = time(NULL); DigitalInOut DHT_io(_pin); // IO must be in hi state to start if (ERROR_NONE != stall(DHT_io, 0, 250)) { return BUS_BUSY; } // start the transfer DHT_io.output(); DHT_io = 0; // only 500uS for DHT22 but 18ms for DHT11 (_DHTtype == 22) ? wait_ms(18) : wait(1); DHT_io = 1; wait_us(30); DHT_io.input(); // wait till the sensor grabs the bus if (ERROR_NONE != stall(DHT_io, 1, 40)) { return ERROR_NOT_PRESENT; } // sensor should signal low 80us and then hi 80us if (ERROR_NONE != stall(DHT_io, 0, 100)) { return ERROR_SYNC_TIMEOUT; } if (ERROR_NONE != stall(DHT_io, 1, 100)) { return ERROR_NO_PATIENCE; } // capture the data for (i = 0; i < 5; i++) { for (j = 0; j < 8; j++) { if (ERROR_NONE != stall(DHT_io, 0, 75)) { return ERROR_DATA_TIMEOUT; } // logic 0 is 28us max, 1 is 70us wait_us(40); bit_value[i * 8 + j] = DHT_io; if (ERROR_NONE != stall(DHT_io, 1, 50)) { return ERROR_DATA_TIMEOUT; } } } // store the data for (i = 0; i < 5; i++) { b = 0; for (j = 0; j < 8; j++) { if (bit_value[i * 8 + j] == 1) { b |= (1 << (7 - j)); } } DHT_data[i] = b; } // uncomment to see the checksum error if it exists //printf(" 0x%02x + 0x%02x + 0x%02x + 0x%02x = 0x%02x \n", DHT_data[0], DHT_data[1], DHT_data[2], DHT_data[3], DHT_data[4]); data_valid = DHT_data[0] + DHT_data[1] + DHT_data[2] + DHT_data[3]; if (DHT_data[4] == data_valid) { //_lastReadTime = currentTime; _lastTemperature = CalcTemperature(); _lastHumidity = CalcHumidity(); } else { err = ERROR_CHECKSUM; } return err; }
int DHT::readData() { int err = ERROR_NONE; Timer tmr; DigitalInOut data_pin(_pin); // We make sure we are the only ones // reading data right now. _mutex.lock(); // BUFFER TO RECEIVE uint8_t cnt = 7; uint8_t idx = 0; tmr.stop(); tmr.reset(); // EMPTY BUFFER for(int i=0; i< 5; i++) DHT_data[i] = 0; // REQUEST SAMPLE data_pin.output(); data_pin.write(0); wait_ms(18); data_pin.write(1); wait_us(40); data_pin.input(); // ACKNOWLEDGE or TIMEOUT unsigned int loopCnt = 10000; while(!data_pin.read())if(!loopCnt--) { _mutex.unlock(); return ERROR_DATA_TIMEOUT; } loopCnt = 10000; while(data_pin.read())if(!loopCnt--) { _mutex.unlock(); return ERROR_DATA_TIMEOUT; } // READ OUTPUT - 40 BITS => 5 BYTES or TIMEOUT for(int i=0; i<40; i++){ loopCnt = 10000; while(!data_pin.read())if(loopCnt-- == 0) { _mutex.unlock(); return ERROR_DATA_TIMEOUT; } //unsigned long t = micros(); tmr.start(); loopCnt = 10000; while(data_pin.read())if(!loopCnt--) { _mutex.unlock(); return ERROR_DATA_TIMEOUT; } if(tmr.read_us() > 40) DHT_data[idx] |= (1 << cnt); tmr.stop(); tmr.reset(); if(cnt == 0){ // next byte? cnt = 7; // restart at MSB idx++; // next byte! }else cnt--; } // WRITE TO RIGHT VARS uint8_t sum = (DHT_data[0] + DHT_data[1] + DHT_data[2] + DHT_data[3]) & 0xFF; if(DHT_data[4] != sum) { _mutex.unlock(); return ERROR_CHECKSUM; } _lastTemperature= CalcTemperature(); _lastHumidity= CalcHumidity(); _mutex.unlock(); return err; }
void SimulatedAnnealingOptimizer::SimAnnealDoOpt() { opMessage = "SimAnneal - optimizing ..."; while (true) { SimAnnealCalcHiLo(); CalcTemperature(); optIterCount++; // we have a best fit by this point okForOutput = true; if (ToleranceCheck(simplexFits[hiIndex], simplexFits[loIndex], simplexParEst[hiIndex], simplexParEst[loIndex])) return; double ystar = SimAnnealReflect(); double ystarFlu = ystar - ThermalFluct(); // between current lo and next hi? if ((ystarFlu > ylo) && (ystarFlu < ynhi)) { yhi = ystarFlu; // replace Ph with P* simplexParEst[hiIndex] = simplexParStar; simplexFits[hiIndex] = ystar; opMessage = "SimAnneal - reflection in range ..."; continue; } // better than old best ? if (ystarFlu <= ylo) { double ystarstar = SimAnnealExpand(); double ystarstarFlu = ystarstar - ThermalFluct(); if (ystarstarFlu < ylo) { simplexParEst[hiIndex] = simplexParStarStar; simplexFits[hiIndex] = ystarstar; yhi = ystarstarFlu; opMessage = "SimAnneal - expansion passed ..."; } else { simplexParEst[hiIndex] = simplexParStar; simplexFits[hiIndex] = ystar; yhi = ystarFlu; opMessage = "SimAnneal - reflection passed ..."; } continue; } // original reflection was a failure if (ystarFlu < yhi) { // better than old worst simplexParEst[hiIndex] = simplexParStar; simplexFits[hiIndex] = ystar; yhi = ystarFlu; } // and contract double ystarstar = SimAnnealContract(); double ystarstarFlu = ystarstar - ThermalFluct(); if (ystarstarFlu < yhi) { // contraction was an improvement simplexParEst[hiIndex] = simplexParStarStar; simplexFits[hiIndex] = ystarstar; yhi = ystarstarFlu; opMessage = "SimAnneal - contraction passed ..."; } else { opMessage = "SimAnneal - reset all ..."; SimAnnealReset(); } } }