This example code is written for the MAX32625PICO board to program the MAX31875 silicon temperature sensor to output 12-bit temperature readings every 125ms. The MAX32625PICO will appear as a virtual COM port to print readings to a terminal, and the on-board LEDs will alternate between red, green, and blue during normal operation.
Dependencies: USBDevice max32625pico maxim-dev
main.cpp
- Committer:
- MI
- Date:
- 2017-11-01
- Revision:
- 0:bc0f96339b73
File content as of revision 0:bc0f96339b73:
#include "mbed.h" #include "USBSerial.h" #include "max32625pico.h" USBSerial pc; int readTemp(I2C &i2cbus); void configTemp(I2C &i2cbus); #define WRITE_ADDRESS 0x90 #define READ_ADDRESS 0x91 #define TEMP_REG 0x00 #define CONFIG_REG 0x01 int main() { //initialize the MAX32625PICO board for +3.3V logic levels MAX32625PICO pico(MAX32625PICO::IOH_3V3, MAX32625PICO::VIO_IOH, MAX32625PICO::VIO_IOH); //initialize RGB LED channels and turn them off DigitalOut rLED(LED1, LED_OFF); DigitalOut gLED(LED2, LED_OFF); DigitalOut bLED(LED3, LED_OFF); //initialize the I2C master interface I2C i2c(P1_6, P1_7); //SDA, SCL //delcare variables to store the raw temperature readings and the converted Celsius temperature int temperature_raw; float temperature_C; //write the configuration register configTemp(i2c); //the while loop will read the temperature reading, convert to Celsius, and then //print the result to a serial terminal. It will then toggle each on-board LED //for 11ms for a total of 33ms. A new temperature value is available every 12.5ms. while (true) { //the readTemp() function returns a raw 16-bit temperature reading //if successful and a zero if unsuccessful temperature_raw = readTemp(i2c); //print temperature only if valid data is received. Readings of exactly 0.00 degrees //will be thrown out but really what are the chances? if(temperature_raw != 0) { temperature_C = temperature_raw/256.0; //print a floating point value with 4 decimal places pc.printf("\r\n%.4f C",temperature_C); } else { pc.printf("\r\nTemp Read Error"); } //toggle LEDs one at a time for a total of 33ms bLED = LED_OFF; rLED = LED_ON; wait(0.11); rLED = LED_OFF; gLED = LED_ON; wait(0.11); gLED = LED_OFF; bLED = LED_ON; wait(0.11); } } void configTemp(I2C &i2cbus) { //creates an array to store the values to be written to the configuration register //values chosen will program the MAX31875 for 8 conversions/second and 12-bit resolution char data[3] = {CONFIG_REG, 0x00, 0x66}; //this built-in I2C write function from mbed sends the configuration data to the MAX31875 i2cbus.write(WRITE_ADDRESS, data, 3, false); } int readTemp(I2C &i2cbus) { int temp_raw = 0; char data[2] = {TEMP_REG, 0}; //the first I2C command sets the MAX31875 to point to the temperature register //it returns a zero on success or non-zero if unsuccessful int rtn_val = i2cbus.write(WRITE_ADDRESS, data, 1, true); //proceeds to read temperature only if previous command was successful if(rtn_val == 0) { //this I2C command reads the temperature and stores it in the 'data' array. //it returns a zero on success or non-zero if unsuccessful rtn_val = i2cbus.read(READ_ADDRESS, data, 2, false); //proceeds to format raw temperature data only if previous command was successful if(rtn_val == 0) { //combine both 8-bit register readings into one 16-bit variable temp_raw = ((data[0] << 8) | data[1]); } } //returns the 16-bit raw temperature reading return temp_raw; }