STM32 KTY 81/222 temperatur måling

Målet med dette prosjektet er å bruke en STM32 Nucleo 446RE for å hente temperatur fra en KTY 81/222 og vise den på en SSD1306 OLED skjerm.

20190131_233419
Fullt oppsett.

Utstyr

  • STM32 Nucleo 446RE
  • OLED skjerm med SSD1306 skjerm driver
  • KTY 81/222 analog temperatur måler
  • 2 x 5.6K motstander
  • 1.5K motstand

 

Krets

stm32_temp_oled_circuit

 

Analog måling

/** Hent 12 bit digital verdi */
 uint32_t tempADCValue = HAL_ADC_GetValue(&hadc1);
/** Konverter digital verdi om til temperatur som flyttall */
float temperature = -50.0 + ((((float) tempADCValue) - 1755.0) * 100.0 / 841.0);
/** Konverterer flyttallet over til streng med en desimal. Denne
måten er problematisk i større prosjekter på grunn av at det krever at større biliotek 
i minnet. */
sprintf(bufferResult, "%.1f", temperature);
20190131_233450
KTY 81/222 er den svarte komponenten. Den er her satt opp i paralell med en kondensator på 100nF.

 

Skjerm initialisering

/** Slå av skjermen hvis den er på. Dette må gjøres før konfigurering. */
 SSD1306_I2C_Write(i2cHandle, addr, 0x00, 0xAE);
/** Sett frekvens */
SSD1306_I2C_Write(i2cHandle, addr, 0x00, 0xD5);
/** Frekvens blir satt i registeret. */
SSD1306_I2C_Write(i2cHandle, addr, 0x00, 0x80);
/** Sett multiplekser. */
SSD1306_I2C_Write(i2cHandle, addr, 0x00, 0xA8);
/** Multiplekser verdi blir satt. */
SSD1306_I2C_Write(i2cHandle, addr, 0x00, 0x3F);
/** Skjerm offset. */
SSD1306_I2C_Write(i2cHandle, addr, 0x00, 0xD3);
/** Skjerm offsett verdi blir satt i registeret. */
SSD1306_I2C_Write(i2cHandle, addr, 0x00, 0x00);
/** Start adresse i skjermminnet */
SSD1306_I2C_Write(i2cHandle, addr, 0x00, 0x40);
/** Start ladepumpen som øker spenningen fra 3.3V til den 
nødvendige spenningen for skjermen. */
SSD1306_I2C_Write(i2cHandle, addr, 0x00, 0x8D);
/** Ladepumpe verdien blir satt i registeret. */
SSD1306_I2C_Write(i2cHandle, addr, 0x00, 0x14);
/** Sett remapping */
SSD1306_I2C_Write(i2cHandle, addr, 0x00, 0xA1);
/** Sett remapping verdi i registeret. */
SSD1306_I2C_Write(i2cHandle, addr, 0x00, 0xC8);
/** Sett COM konfigurasjon. */
SSD1306_I2C_Write(i2cHandle, addr, 0x00, 0xDA);
/** Sett COM konfigurasjon verdi registeret. */
SSD1306_I2C_Write(i2cHandle, addr, 0x00, 0x12);
/** Sett kontrast */
SSD1306_I2C_Write(i2cHandle, addr, 0x00, 0x81);
/** Sett kontrast verdi i registeret */
SSD1306_I2C_Write(i2cHandle, addr, 0x00, 0xFF);
/** Ladeperiode */
SSD1306_I2C_Write(i2cHandle, addr, 0x00, 0xD9);
/** Sett ladeperiode i registeret */
SSD1306_I2C_Write(i2cHandle, addr, 0x00, 0xF1);
/** Sett Vcomh */
SSD1306_I2C_Write(i2cHandle, addr, 0x00, 0xDB);
/** Hvor i skjermminnet bufferet starter. */
SSD1306_I2C_Write(i2cHandle, addr, 0x00, 0x40);
/** Slå på skjerm */
SSD1306_I2C_Write(i2cHandle, addr, 0x00, 0xA4);
/** Inverter informasjonen på skjermen */
SSD1306_I2C_Write(i2cHandle, addr, 0x00, 0xA6);
/** Slå på SSD1306 driveren. */
SSD1306_I2C_Write(i2cHandle, addr, 0x00, 0xAF);

Skrive til skjermbuffer

/** Dette er objektet vi skal skrive til skjermbufferet. */
uint8_t SSD1306_Buffer[SSD1306_WIDTH * SSD1306_HEIGHT / 8];

/** Vi skriver til minnet 128*8 pikseler om gangen totalt åtte ganger.
for (i = 0; i < 8; i++) {
    /** Setter hvilken side i minnet vi skal oppdatere. */
    SSD1306_I2C_Write(i2cHandle, addr, 0x00, 0xb0 + i);
    SSD1306_I2C_Write(i2cHandle, addr, 0x00, 0x02);
    SSD1306_I2C_Write(i2cHandle, addr, 0x00, 0x10);
    /** Sender objektet til SSD1306 driveren */
    HAL_I2C_Mem_Write(&i2cHandle, addr, 0x40, 1, &SSD1306_Buffer[SSD1306_WIDTH * i], SSD1306_WIDTH, 100);
}

 

Kode

Hele koden kan lastes ned her.

20190131_233431
OLED viser temperaturen.