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.

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
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);

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.

Du må være logget inn for å legge inn en kommentar.