import processing.io.*; /************************* common **************************/ SPI spiInit(int index) { return spiInit(index, 100000); } SPI spiInit(int index, int clk) { if (!(index == 0 || index == 1)) exit(); SPI ret; ret = new SPI(SPI.list()[index]); ret.settings(clk, SPI.MSBFIRST, SPI.MODE0); return ret; } /************************* utility **************************/ int[] readRegisterUnsigned(SPI spi, byte addr) { byte[] in = {(byte)(addr | 0x80), 0x00}; byte[] out= spi.transfer(in); int[] ret = { (out[0] < 0 ? out[0] & 0xff : out[0]), (out[1] < 0 ? out[1] & 0xff : out[1])}; return ret; } int[] readRegister(SPI spi, byte addr) { byte[] in = {(byte)(addr | 0x80), 0x00}; byte[] out= spi.transfer(in); int[] ret = { out[0], out[1]}; return ret; } long readRegistersUnsigned(SPI spi, byte msb_, byte lsb_) { int[] msb = readRegisterUnsigned(spi, msb_); int[] lsb = readRegisterUnsigned(spi, lsb_); return (msb[1] << 8) + lsb[1]; } long readRegisters(SPI spi, byte msb_, byte lsb_) { int[] msb = readRegister(spi, msb_); int[] lsb = readRegister(spi, lsb_); return (msb[1] << 8) + lsb[1]; } byte[] writeRegister(SPI spi, byte addr) { byte[] in = {(byte)(addr & 0x7f), 0x00}; byte[] out= spi.transfer(in); return out; } byte[] writeRegister(SPI spi, byte addr, byte data) { byte[] in = {(byte)(addr & 0x7f), data}; byte[] out= spi.transfer(in); return out; } /************************* MC3008 **************************/ int getAdcValue(SPI adc, int channel) { byte[] out = {0x01, (byte)((0x08 + channel) << 4), 0x00}; byte[] in = adc.transfer(out); return ((in[1] & 0x03) << 8 ) + (in[2] & 0xff); } /************************* MPL115A1 **************************/ //ret [0] : pressure [hPa] //ret [1] : temperature [degC] float[] getPressureAndTemperature(SPI spi) { return getPressureAndTemperature(spi, 100); } float[] getPressureAndTemperature(SPI spi, int iterNum) { float pressure = 0; float temperature = 0; for (int loop = 0; loop < iterNum; loop++) { //set read mode (pressure and temperature) writeRegister(spi, (byte)0x24); delay(3); //pressure long press = readRegistersUnsigned(spi, (byte)0x00, (byte)0x02); press = press >> 6; //temperature long temp = readRegistersUnsigned(spi, (byte)0x04, (byte)0x06); temp = temp >> 6; //a0 long a0 = readRegisters(spi, (byte)0x08, (byte)0x0a); //b1 long b1 = readRegisters(spi, (byte)0x0c, (byte)0x0e); //b2 long b2 =readRegisters(spi, (byte)0x10, (byte)0x12); //c12 long c12 = readRegisters(spi, (byte)0x14, (byte)0x16); //c11 long c11 = readRegisters(spi, (byte)0x18, (byte)0x1a); //c22 long c22 = readRegisters(spi, (byte)0x1c, (byte)0x1e); long c11x1 = c11 * press; long a11 = ((b1 << 14) + c11x1) >> 14; long c12x2 = c12 * temp; long a1 = ((a11 << 11) + c12x2) >> 11; long c22x2 = c22 * temp; long a2 = ((b2 << 15) + (c22x2 >> 1)) >> 16; long a1x1 = a1 * press; long y1 = ((a0 << 10) + a1x1) >> 10; long a2x2 = a2*temp; long pComp = (y1 << 10) + a2x2; long siPcomp = pComp / 8192; pressure += ((65.0/1023.0)*siPcomp) + 50; temperature += (605.75-temp)*0.186916; } float[] ret = {pressure/(float)iterNum*10.0, temperature/(float)iterNum}; return ret; } /************************* BME280 **************************/ //ret[0]: temperature [degC] //ret[1]: pressure [hPa] //ret[2]: humidity [%RH] float[] getTemperatureHumidityAndPressure(SPI spi) { int[] chipId = readRegisterUnsigned(spi, (byte)0xd0); if (chipId[1] != 0x60) { println("read erro"); } //calib data long t1 = readRegistersUnsigned(spi, (byte)0x89, (byte)0x88); long t2 = readRegisters(spi, (byte)0x8b, (byte)0x8a); long t3 = readRegisters(spi, (byte)0x8d, (byte)0x8c); long p1 = readRegistersUnsigned(spi, (byte)0x8f, (byte)0x8e); long p2 = readRegisters(spi, (byte)0x91, (byte)0x90); long p3 = readRegisters(spi, (byte)0x93, (byte)0x92); long p4 = readRegisters(spi, (byte)0x95, (byte)0x94); long p5 = readRegisters(spi, (byte)0x97, (byte)0x96); long p6 = readRegisters(spi, (byte)0x99, (byte)0x98); long p7 = readRegisters(spi, (byte)0x9b, (byte)0x9a); long p8 = readRegisters(spi, (byte)0x9d, (byte)0x9c); long p9 = readRegisters(spi, (byte)0x9f, (byte)0x9e); long h1 = readRegisterUnsigned(spi, (byte)0xa1)[1]; long h2 = readRegisters(spi, (byte)0xe2, (byte)0xe1); long h3 = readRegisterUnsigned(spi, (byte)0xe3)[1]; long h4 = (readRegister(spi, (byte)0xe4)[1] << 4) + (readRegister(spi, (byte)0xe5)[1] & 0x0f); long h5 = (readRegister(spi, (byte)0xe6)[1] << 4) + ((readRegister(spi, (byte)0xe5)[1] >> 4) & 0x0f); long h6 = readRegisterUnsigned(spi, (byte)0xe7)[1]; //write config writeRegister(spi, (byte)0xf4, (byte)0x00); writeRegister(spi, (byte)0xf5, (byte)0x00); writeRegister(spi, (byte)0xf2, (byte)0x07); writeRegister(spi, (byte)0xf4, (byte)0xff); //temperature int[] tmsb =readRegisterUnsigned(spi, (byte)0xfa); int[] tlsb =readRegisterUnsigned(spi, (byte)0xfb); int[] txlsb =readRegisterUnsigned(spi, (byte)0xfc); long adc_T = (tmsb[1] << 12) | (tlsb[1] << 4) | ((txlsb[1] >> 4) & 0x0f); long var1 = ((adc_T >> 3) - (t1 << 1)) * t2 >> 11; long var2 = ((adc_T >> 4) - t1) * (((adc_T >> 4) - t1) >> 12) * t3 >> 14; long t_fine = var1+var2; float temperature = ((t_fine*5+128) >> 8)/100.0; //pressure int[] pmsb =readRegisterUnsigned(spi, (byte)0xf7); int[] plsb =readRegisterUnsigned(spi, (byte)0xf8); int[] pxlsb =readRegisterUnsigned(spi, (byte)0xf9); long adc_P = (pmsb[1] << 12) | (plsb[1] << 4) | ((pxlsb[1] >> 4) & 0x0f); var1 = t_fine - 128000; var2 = var1 * var1 * p6; var2 = var2 + ((var1*p5) << 17); var2 = var2 + (p4 << 35); var1 = ((var1 * var1 * p3) >> 8) + ((var1 * p2) << 12); var1 = (((long)1 << 47) + var1) *p1 >> 33; float pressure = 0; if (var1 != 0) { long p_acc = 1048576 - adc_P; p_acc = (((p_acc << 31) - var2)*3125)/var1; var1 = (p9 * (p_acc >> 13) * (p_acc >> 13)) >> 25; var2 = (p8 * p_acc) >> 19; pressure = (((p_acc + var1 + var2) >> 8) + (p7 << 4))/256.0/100.0; } //humidity int[] hmsb =readRegisterUnsigned(spi, (byte)0xfd); int[] hlsb =readRegisterUnsigned(spi, (byte)0xfe); long adc_H = (hmsb[1] << 8) | hlsb[1]; var1 = t_fine - (long)76800; var1 = (((((adc_H << 14) - (h4 << 20) - (h5 * var1)) + ((long)16384)) >> 15) * (((((((var1 * h6) >> 10) * (((var1 * h3) >> 11) + ((long)32768))) >> 10) + ((long)2097152)) * h2 + 8192) >> 14)); var1 = (var1 - (((((var1 >> 15) * (var1 >> 15)) >> 7) * (h1)) >> 4)); var1 = var1 < 0 ? 0 : var1; var1 = var1 > (long)419430400 ? (long)419430400 : var1; float humidity = (var1 >> 12)/1024.0; float[] ret = {temperature, humidity, pressure}; return ret; }