/**************************************************************************//** * @brief Convert ADC sample values to fahrenheit * @param adcSample Raw value from ADC to be converted to fahrenheit * @return The temperature in degrees Fahrenheit *****************************************************************************/ float convertToFahrenheit(uint32_t adcSample) { float celsius; float fahrenheit; celsius = convertToCelsius(adcSample); fahrenheit = (celsius * (9.0/5.0)) + 32.0; return fahrenheit; }
void read_temperature() { delay_ms(500); //a small delay is required after setting the channel pre_t = t; t = read_adc(); if(pre_t != t) { temp_changed = 1; temperature = convertToCelsius(); } }
void loop() { loopcounter++; adc_key_in = analogRead(0); // read the value from the sensor key = get_key(adc_key_in); // convert into key press if (key >=0){ if(key == 1) {// UP! ++targetF; targetreached = false; storePersistent(targetF); printTarget(); } else if(key == 2) {// DOWN! --targetF; targetreached = false; storePersistent(targetF); printTarget(); } else if(key == 4) {//SELECT targetreached = false; printTarget(); } } if(loopcounter % 5 == 0) { int value = analogRead(thermometerPin); float celsius = convertToCelsius(value); float fahrenheit = convertFromCelsiusToFahrenheit(celsius); if(oldvalue != value) { lcd.cursorTo(1, 0); //line=2, x=0 lcd.printFloat(celsius,1); lcd.printIn("C "); lcd.printFloat(fahrenheit,1); lcd.printIn("F "); value = oldvalue; } if( (fahrenheit+0.01>=targetF) and (!targetreached) ){ targetreached = true; printTarget(); playSong(); loopcounter = 0; } else if( (targetreached) and (loopcounter % 100 == 0)) { // every ten seconds, check the status if(fahrenheit<targetF) { targetreached = false; printTarget(); } else playSong(); } } delay(100); }
/**************************************************************************//** * @brief Main function *****************************************************************************/ int main(void) { SYSTEM_ChipRevision_TypeDef revision; char string[8]; int i; uint32_t temp; /* Chip revision alignment and errata fixes */ CHIP_Init(); /* Initialize DVK board register access */ BSP_Init(BSP_INIT_DEFAULT); /* If first word of user data page is non-zero, enable eA Profiler trace */ BSP_TraceProfilerSetup(); CMU_ClockEnable(cmuClock_HFPER, true); CMU_ClockEnable(cmuClock_ADC0, true); CMU_ClockEnable(cmuClock_GPIO, true); /* Initialize LCD controller without boost */ SegmentLCD_Init(false); SegmentLCD_AllOff(); /* Check for revision after revision B. Chips with revision earlier than */ /* Revision C has known problems with the internal temperature sensor. */ /* Display a warning in this case */ SYSTEM_ChipRevisionGet(&revision); if (revision.minor < 2) { SegmentLCD_Write("WARNING"); RTCDRV_Trigger(2000, NULL); EMU_EnterEM2(true); SegmentLCD_Write("REV C+"); RTCDRV_Trigger(2000, NULL); EMU_EnterEM2(true); SegmentLCD_Write("REQUIRD"); RTCDRV_Trigger(2000, NULL); EMU_EnterEM2(true); } /* Enable board control interrupts */ BSP_InterruptDisable(0xffff); BSP_InterruptFlagsClear(0xffff); BSP_InterruptEnable(BC_INTEN_JOYSTICK); temperatureIRQInit(); /* Setup ADC for sampling internal temperature sensor. */ setupSensor(); /* Main loop - just read temperature and update LCD */ while (1) { /* Start one ADC sample */ ADC_Start(ADC0, adcStartSingle); /* Wait in EM1 for ADC to complete */ EMU_EnterEM1(); /* Read sensor value */ temp = ADC_DataSingleGet(ADC0); /* Convert ADC sample to Fahrenheit / Celsius and print string to display */ if (showFahrenheit) { /* Show Fahrenheit on alphanumeric part of display */ i = (int)(convertToFahrenheit(temp) * 10); snprintf(string, 8, "%2d,%1d%%F", (i/10), i%10); /* Show Celsius on numeric part of display */ i = (int)(convertToCelsius(temp) * 10); SegmentLCD_Number(i*10); SegmentLCD_Symbol(LCD_SYMBOL_DP10, 1); } else { /* Show Celsius on alphanumeric part of display */ i = (int)(convertToCelsius(temp) * 10); snprintf(string, 8, "%2d,%1d%%C", (i/10), i%10); /* Show Fahrenheit on numeric part of display */ i = (int)(convertToFahrenheit(temp) * 10); SegmentLCD_Number(i*10); SegmentLCD_Symbol(LCD_SYMBOL_DP10, 1); } SegmentLCD_Write(string); /* Sleep for 2 seconds in EM 2 */ RTCDRV_Trigger(2000, NULL); EMU_EnterEM2(true); } }
/* *Function name: DMA_CallBack() *Description : Call back function of the DMA */ void DMA_CallBack(unsigned int channel, bool primary, void *user) { unblockSleepMode(EM1); blockSleepMode(EM2); if(!trfComplete) { ADC_Reset(ADC0); // Reset the ADC; Turn it off //ADC0->CMD = ADC_CMD_SINGLESTOP; int temp = 0, i = 0; char tempChar[7]; //To store the temperature in char, for transmitting char temp_string[TX_bufferSize]; (void) channel; (void) primary; (void) user; for (i = 0; i < ADC_SAMPLES; i++) { temp += (ADC_Buffer[i]); } temperature = temp / ADC_SAMPLES; temperature = convertToCelsius(temperature); //Get value of Temperature in deg C if (temperature > HIGHTEMP) { //GPIO_PinOutClear(gpioPortE,2); //GPIO_PinOutSet(gpioPortE,3); /* To extract the digits of the temperature variable and put in tempChar. A basic digit extraction algorithm is used and then each digit is passed one by one. */ temp = temperature*10; tempChar[0] = (temp/100)+48; temp = temp%100; tempChar[1] = (temp/10)+48; temp = temp%10; tempChar[2] = '.'; tempChar[3] = (temp)+48; tempChar[4] = 'C'; // Pad the 4th position of charTemp as C tempChar[5] = '\r'; // Pad carriage return tempChar[6] = '\n'; // Pad line feed strcpy(temp_string,HighTemp); // Copy the HighTemp message in the temporary string strcat(temp_string,tempChar); // Concatenate with the tempChar to get the final message LEUART0->CTRL |= LEUART_CTRL_TXDMAWU; // Enable DMA wake up for LEUART TX in EM2 // Activate DMA transfers for LEUART TX DMA_ActivateBasic(DMA_CHANNEL_TX, true, false, (void *)&(LEUART0->TXDATA), (void *)temp_string, strlen(temp_string) - 1); } else if (temperature < LOWTEMP) { //GPIO_PinOutSet(gpioPortE,2); //GPIO_PinOutClear(gpioPortE,3); temp = temperature*10; tempChar[0] = (temp/100)+48; temp = temp%100; tempChar[1] = (temp/10)+48; temp = temp%10; tempChar[2] = '.'; tempChar[3] = (temp)+48; tempChar[4] = 'C'; tempChar[5] = '\r'; tempChar[6] = '\n'; strcpy(temp_string,LowTemp); // Copy the LowTemp message in the temporary string strcat(temp_string,tempChar); // Concatenate with the tempChar to get the final message LEUART0->CTRL |= LEUART_CTRL_TXDMAWU; // Enable DMA wake up for LEUART TX in EM2 // Activate DMA transfers for LEUART TX DMA_ActivateBasic(DMA_CHANNEL_TX, true, false, (void *)&(LEUART0->TXDATA), (void *)temp_string, strlen(temp_string) -1); } trfComplete=true; } else { (void) channel; (void) primary; (void) user; // Disable DMA wake-up from LEUART1 TX LEUART0->CTRL &= ~LEUART_CTRL_TXDMAWU; } }
/**************************************************************************//** * @brief Main function *****************************************************************************/ int main(void) { uint8_t prod_rev; uint32_t temp; uint32_t temp_offset; float temperature; /* Initialize DK board register access */ BSP_Init(BSP_INIT_DEFAULT); /* If first word of user data page is non-zero, enable eA Profiler trace */ BSP_TraceProfilerSetup(); /* Initialize the TFT stdio retarget module. */ RETARGET_TftInit(); printf("\nEFM32 onchip temperature sensor example\n\n"); CMU_ClockEnable(cmuClock_HFPER, true); CMU_ClockEnable(cmuClock_ADC0, true); CMU_ClockEnable(cmuClock_GPIO, true); /* Enable board control interrupts */ BSP_InterruptDisable(0xffff); BSP_InterruptFlagsClear(0xffff); BSP_InterruptEnable(BC_INTEN_JOYSTICK); temperatureIRQInit(); /* This is a work around for Chip Rev.D Errata, Revision 0.6. */ /* Check for product revision 16 and 17 and set the offset */ /* for ADC0_TEMP_0_READ_1V25. */ prod_rev = (DEVINFO->PART & _DEVINFO_PART_PROD_REV_MASK) >> _DEVINFO_PART_PROD_REV_SHIFT; if( (prod_rev == 16) || (prod_rev == 17) ) { temp_offset = 112; } else { temp_offset = 0; } /* Setup ADC for sampling internal temperature sensor. */ setupSensor(); /* Main loop - just read temperature and update LCD */ while (1) { /* Start one ADC sample */ ADC_Start(ADC0, adcStartSingle); /* Wait in EM1 for ADC to complete */ EMU_EnterEM1(); /* Read sensor value */ /* According to rev. D errata ADC0_TEMP_0_READ_1V25 should be decreased */ /* by the offset but it is the same if ADC reading is increased - */ /* reference manual 28.3.4.2. */ temp = ADC_DataSingleGet(ADC0) + temp_offset; /* Convert ADC sample to Fahrenheit / Celsius and print string to display */ if (showFahrenheit) { temperature = convertToFahrenheit(temp); } else { temperature = convertToCelsius(temp); } printf("%d.%d %c\n", (int) temperature, (int)(10*(temperature-(int)temperature)), showFahrenheit? 'F' : 'C'); /* Sleep for 2 seconds in EM 2 */ RTCDRV_Trigger(2000, NULL); EMU_EnterEM2(true); } }
int16 read_temperature() { delay_us(12); //a small delay is required after setting the channel t = read_adc(); return convertToCelsius(); }
/**************************************************************************//** * @brief Main function *****************************************************************************/ int main(void) { uint8_t prod_rev; char string[8]; int i; uint32_t temp; uint32_t temp_offset; /* Chip errata */ CHIP_Init(); /* If first word of user data page is non-zero, enable eA Profiler trace */ BSP_TraceProfilerSetup(); /* Enable peripheral clocks */ CMU_ClockEnable(cmuClock_HFPER, true); CMU_ClockEnable(cmuClock_ADC0, true); /* Initialize RTC timer. */ RTCDRV_Init(); RTCDRV_AllocateTimer( &xTimerForWakeUp); /* Initialize LCD controller without boost */ SegmentLCD_Init(false); SegmentLCD_AllOff(); /* This is a work around for Chip Rev.D Errata, Revision 0.6. */ /* Check for product revision 16 and 17 and set the offset */ /* for ADC0_TEMP_0_READ_1V25. */ prod_rev = (DEVINFO->PART & _DEVINFO_PART_PROD_REV_MASK) >> _DEVINFO_PART_PROD_REV_SHIFT; if( (prod_rev == 16) || (prod_rev == 17) ) { temp_offset = 112; } else { temp_offset = 0; } /* Enable board control interrupts */ gpioSetup(); /* Setup ADC for sampling internal temperature sensor. */ setupSensor(); /* Main loop - just read temperature and update LCD */ while (1) { /* Start one ADC sample */ ADC_Start(ADC0, adcStartSingle); /* Wait in EM1 for ADC to complete */ EMU_EnterEM1(); /* Read sensor value */ /* According to rev. D errata ADC0_TEMP_0_READ_1V25 should be decreased */ /* by the offset but it is the same if ADC reading is increased - */ /* reference manual 28.3.4.2. */ temp = ADC_DataSingleGet(ADC0) + temp_offset; /* Convert ADC sample to Fahrenheit / Celsius and print string to display */ if (showFahrenheit) { /* Show Fahrenheit on alphanumeric part of display */ i = (int)(convertToFahrenheit(temp) * 10); snprintf(string, 8, "%2d,%1d%%F", (i/10), abs(i%10)); /* Show Celsius on numeric part of display */ i = (int)(convertToCelsius(temp) * 10); SegmentLCD_Number(i*10); SegmentLCD_Symbol(LCD_SYMBOL_DP10, 1); SegmentLCD_Symbol(LCD_SYMBOL_DEGC, 1); SegmentLCD_Symbol(LCD_SYMBOL_DEGF, 0); } else { /* Show Celsius on alphanumeric part of display */ i = (int)(convertToCelsius(temp) * 10); snprintf(string, 8, "%2d,%1d%%C", (i/10), abs(i%10)); /* Show Fahrenheit on numeric part of display */ i = (int)(convertToFahrenheit(temp) * 10); SegmentLCD_Number(i*10); SegmentLCD_Symbol(LCD_SYMBOL_DP10, 1); SegmentLCD_Symbol(LCD_SYMBOL_DEGC, 0); SegmentLCD_Symbol(LCD_SYMBOL_DEGF, 1); } SegmentLCD_Write(string); /* Sleep for 2 seconds in EM 2 */ RTCDRV_StartTimer( xTimerForWakeUp, rtcdrvTimerTypeOneshot, 2000, NULL, NULL); EMU_EnterEM2(true); } }
/**************************************************************************//** * @brief Main function *****************************************************************************/ int main(void) { unsigned char pucMACArray[8]; uint32_t temp; /* Chip revision alignment and errata fixes */ CHIP_Init(); /* Ensure core frequency has been updated */ SystemCoreClockUpdate(); CMU_ClockEnable(cmuClock_ADC0, true); /* Setup SysTick Timer for 1 msec interrupts */ if (SysTick_Config(SystemCoreClock / 1000)) while (1) ; /* Setup ADC for sampling internal temperature sensor. */ setupSensor(); /* Spi init*/ spiInit(); #if LWIP_DHCP /* Initialze the lwIP library, using DHCP.*/ lwIPInit(pucMACArray, 0, 0, 0, IPADDR_USE_DHCP); #else /* Initialze the lwIP library, using Static IP.*/ lwIPInit(pucMACArray, IPADDR(192, 168, 79, 160), IPADDR(255, 255, 255, 0), \ IPADDR(192, 168, 79, 1), IPADDR_USE_STATIC); #endif /* Initialize a sample httpd server.*/ httpd_init(); /* Start one ADC sample */ ADC_Start(ADC0, adcStartSingle); /* Enable board control interrupts */ gpioSetup(); axspi_write_reg(~IMR_RXPKT, P0_IMR); /* Start LCD without boost */ SegmentLCD_Init(false); CMU_ClockEnable(cmuClock_RTC, true); /* RTC configuration structure */ RTC_Init_TypeDef rtcInit = { .enable = false, .debugRun = false, .comp0Top = true }; /* Initialize RTC */ RTC_Init(&rtcInit); /* Set COMP0 value which will be the top value as well */ RTC_CompareSet(RTC_COMP, RTC_COMP_VALUE); /* Clear all pending interrupts */ RTC_IntClear(0x7); /* Enable COMP0 interrupts */ RTC_IntEnable(0x2); /* Enable interrupts */ NVIC_ClearPendingIRQ(RTC_IRQn); NVIC_EnableIRQ(RTC_IRQn); RTC_Enable(true); while (1) { /* check temperature flag*/ if (read_temperature) { temp = ADC_DataSingleGet(ADC0); /* Show Celsius on numeric part of display */ temperature = (int)(convertToCelsius(temp)); /* Start a new conversion */ ADC_Start(ADC0, adcStartSingle); /* Reset temperature flag */ read_temperature = 0; } if (updateIpFlag) { switch (ip_field) { case 1: { SegmentLCD_Write(IP_ADDR_FIRST_TEXT); SegmentLCD_Number(IP_ADDR_FIRST_NUM(lwip_netif.ip_addr.addr)); ip_field++; } break; case 2: { SegmentLCD_Write(IP_ADDR_SECOND_TEXT); SegmentLCD_Number(IP_ADDR_SECOND_NUM(lwip_netif.ip_addr.addr)); ip_field++; } break; case 3: { SegmentLCD_Write(IP_ADDR_THIRD_TEXT); SegmentLCD_Number(IP_ADDR_THIRD_NUM(lwip_netif.ip_addr.addr)); ip_field++; } break; case 4: { SegmentLCD_Write(IP_ADDR_FOURTH_TEXT); SegmentLCD_Number(IP_ADDR_FOURTH_NUM(lwip_netif.ip_addr.addr)); ip_field = 1; } break; default: break; } updateIpFlag = false; } } }