All Downloads are FREE. Search and download functionalities are using the official Maven repository.

one.microproject.rpi.hardware.gpio.sensors.MCP9808 Maven / Gradle / Ivy

package one.microproject.rpi.hardware.gpio.sensors;

import com.pi4j.io.i2c.I2CBus;
import com.pi4j.io.i2c.I2CDevice;
import com.pi4j.io.i2c.I2CFactory;

import com.pi4j.system.SystemInfo;

import java.io.IOException;

import java.text.DecimalFormat;
import java.text.NumberFormat;

/**
 * MCP 9808 I2C
 * 3.3V temperature sensor
 * not tested yet
 * @author gergej
 *
 */
public class MCP9808 {

	  // This next addresses is returned by "sudo i2cdetect -y 1".
	  private final static int MCP9808_I2CADDR_DEFAULT        = 0x18;  
	  // Registers
	  private final static int MCP9808_REG_CONFIG             = 0x01;
	  private final static int MCP9808_REG_UPPER_TEMP         = 0x02;
	  private final static int MCP9808_REG_LOWER_TEMP         = 0x03;
	  private final static int MCP9808_REG_CRIT_TEMP          = 0x04;
	  private final static int MCP9808_REG_AMBIENT_TEMP       = 0x05;
	  private final static int MCP9808_REG_MANUF_ID           = 0x06;
	  private final static int MCP9808_REG_DEVICE_ID          = 0x07;

	  // Configuration register values.
	  private final static int MCP9808_REG_CONFIG_SHUTDOWN    = 0x0100;
	  private final static int MCP9808_REG_CONFIG_CRITLOCKED  = 0x0080;
	  private final static int MCP9808_REG_CONFIG_WINLOCKED   = 0x0040;
	  private final static int MCP9808_REG_CONFIG_INTCLR      = 0x0020;
	  private final static int MCP9808_REG_CONFIG_ALERTSTAT   = 0x0010;
	  private final static int MCP9808_REG_CONFIG_ALERTCTRL   = 0x0008;
	  private final static int MCP9808_REG_CONFIG_ALERTSEL    = 0x0002;
	  private final static int MCP9808_REG_CONFIG_ALERTPOL    = 0x0002;
	  private final static int MCP9808_REG_CONFIG_ALERTMODE   = 0x0001;

	  private static boolean verbose = false;
	  
	  private I2CBus bus;
	  private I2CDevice mcp9808;
	  
	  public MCP9808()
	  {
	    this(MCP9808_I2CADDR_DEFAULT);
	  }
	  
	  public MCP9808(int address)
	  {
	    try
	    {
	      // Get i2c bus
	      bus = I2CFactory.getInstance(I2CBus.BUS_1); // Depends onthe RasPI version
	      if (verbose)
	        System.out.println("Connected to bus. OK.");

	      // Get device itself
	      mcp9808 = bus.getDevice(address);
	      if (verbose)
	        System.out.println("Connected to device. OK.");
	      try { Thread.sleep(500); } catch (Exception ex) {}
	    }
	    catch (IOException e)
	    {
	      System.err.println(e.getMessage());
	    }
	    catch (I2CFactory.UnsupportedBusNumberException e) 
	    {
	        System.err.println(e.getMessage());
	    }
	  }
	  
	  public int readU16BE(int register) throws Exception
	  {
	    int nb = 2;
	    byte[] bb = new byte[2];
	    int nbr = this.mcp9808.read(register, bb, 0, nb);
	    if (nbr != 2)
	      throw new Exception("Cannot read 2 bytes from " + lpad(Integer.toHexString(register), "0", 2));
	    if (verbose)
	      System.out.println("I2C: 0x" + lpad(Integer.toHexString(bb[0]), "0", 2) + lpad(Integer.toHexString(bb[1]), "0", 2));
	    return ((bb[0] & 0xFF) << 8) + (bb[1] & 0xFF);
	  }

	  private boolean init() throws Exception
	  {
	    int mid = 0, did = 0;
	    try
	    {
	      mid = readU16BE(MCP9808_REG_MANUF_ID);      
	      did = readU16BE(MCP9808_REG_DEVICE_ID);
	    }
	    catch (Exception e)
	    {
	      throw e;
	    }      
	    if (verbose)
	      System.out.println("I2C: MID 0x" + lpad(Integer.toHexString(mid), "0", 4) + " (expected 0x0054)" +
	                             " DID 0x" + lpad(Integer.toHexString(did), "0", 4) + " (expected 0x0400)");
	    return (mid == 0x0054 && did == 0x0400);
	  }
	  
	  public float readCelciusTemp() throws Exception
	  {
	    int raw = readU16BE(MCP9808_REG_AMBIENT_TEMP);
	    float temp = raw & 0x0FFF;
	    temp /= 16.0;
	    if ((raw & 0x1000) != 0x0)
	      temp -= 256;
	    if (verbose)
	      System.out.println("DBG: C Temp: " + lpad(Integer.toHexString(raw & 0xFFFF), "0", 4) + ", " + temp);
	    return temp;
	  }
	      
	  protected static void waitfor(long howMuch)
	  {
	    try { Thread.sleep(howMuch); } catch (InterruptedException ie) { ie.printStackTrace(); }
	  }
	  
	  private static String lpad(String s, String with, int len)
	  {
	    String str = s;
	    while (str.length() < len)
	      str = with + str;
	    return str;
	  }
	  
	  private final static NumberFormat NF = new DecimalFormat("##00.000");
	  public static void main(String[] args)
	  {
	    System.out.println("MCP9808 Demo");
	    MCP9808 sensor = new MCP9808(); 
	    try
	    {
	      boolean ok = sensor.init();
	      if (!ok)
	        System.out.println("Warning, init failed. Expect weird results...");
	    }
	    catch (Exception ex)
	    {
	      ex.printStackTrace();
	    }
	    
	    for (int i=0; i<10; i++)
	    {
	      float temp  = 0;
	      try { temp = sensor.readCelciusTemp(); } 
	      catch (Exception ex) 
	      { 
	        System.err.println(ex.getMessage()); 
	        ex.printStackTrace();
	        System.exit(1);
	      }
	      System.out.println("Temperature: " + NF.format(temp) + " C");
	      waitfor(1000);
	    }
	    // Bonus : CPU Temperature
	    try
	    {
	      System.out.println("CPU Temperature   :  " + SystemInfo.getCpuTemperature());
	      System.out.println("CPU Core Voltage  :  " + SystemInfo.getCpuVoltage());
	    }
	    catch (InterruptedException ie)
	    {
	      ie.printStackTrace();
	    }
	    catch (IOException e)
	    {
	      e.printStackTrace();
	    }
	  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy