ocul
3
#include <Wire.h>
#include <SPI.h>
#define Addr (0xF6>>1)
#define TASTER 3
#define LED 13
#define I2C_DEVICEID 0x00
#define I2C_POWERMODE 0x01
#define I2C_FREQUENCY 0x02
#define I2C_SHAPE 0x03
#define I2C_BOOST 0x04
#define I2C_PVOLTAGE 0x06
#define I2C_P1VOLTAGE 0x06
#define I2C_P2VOLTAGE 0x07
#define I2C_P3VOLTAGE 0x08
#define I2C_P4VOLTAGE 0x09
#define I2C_UPDATEVOLTAGE 0x0A
#define I2C_AUDIO 0x05
// pressure_sensor
int SlaveSel = 10; //Define slave select as 10
//Transfer Variables
float Output_max = 15099494;//for psi___counts(90% of 2^24 counts or 0xE6666)
float Output_min = 1677722;//for psicounts (10% of 224 counts or 0x19999A)
int P_max = 300;//for mmHg;
int P_min = 0;
int Byte1,Byte2,Byte3,Byte4;
float Pressure;
float Result;
unsigned long Output;
long x2;
long x1;
long x0;
int debounce = 0 ;
int mode = 0;
#define MODE_OFF 0
#define MODE_50 1
#define MODE_100 2
#define MODE_200 3
#define MODE_400 4
#define MODE_800 5
#define MODE_MAX 6
// the setup routine runs once when you press reset:
void setup() {
// initialize the digital pin as an output.
Wire.begin();
Serial.begin(9600);
//Serial.println();
SPI.begin(); //Begin SPI protocol
pinMode(SlaveSel, OUTPUT); //Define pin 10 as an output
pinMode(LED, OUTPUT);
pinMode (TASTER,INPUT_PULLUP);
digitalWrite(SlaveSel, HIGH); //Pull Slave select line high
Wire.beginTransmission(Addr);
Wire.write(I2C_POWERMODE); // write address = 0x01
Wire.write(0x00); //Adress 0x01 = 0x01 (enable)
Wire.write(0x40); // Adress 0x02 = 0x40 (100Hz)
Wire.write(0x00); //Adress 0x03 = 0x00 (sine wave)
Wire.write(0x00); //Adress 0x04 = 0x00 (800KHz)
Wire.write(0x00); //Adress 0x05 = 0x00 (audio off)
Wire.write(0x1F); // Adress 0x06 = 0x00 (EL1)
Wire.write(0x1F); // Adress 0x07 = 0x00 (EL2)
Wire.write(0x1F); // Adress 0x08 = 0x00 (EL3)
Wire.write(0x1F); // Adress 0x09 = 0x00 (EL4)
Wire.write(0x01); // Adress 0x0A = 0x00 (update)
Wire.endTransmission();
}
// the loop routine runs over and over again forever:
void loop()
{
if (digitalRead(TASTER)==LOW) {
if (!(debounce&0x01)) {
mode=(mode+1)%MODE_MAX;
switch (mode) {
case MODE_OFF:
Wire.beginTransmission(Addr);
Wire.write(I2C_POWERMODE); // start adress
Wire.write(0x00); // disable pumps
Wire.endTransmission();
digitalWrite(LED,LOW);
break;
case MODE_50:
Wire.beginTransmission(Addr);
Wire.write(I2C_POWERMODE); // start adress
Wire.write(0x01); // enable pumps
Wire.write(0x00); // frequency 50 Hz
Wire.endTransmission();
digitalWrite(LED,HIGH);
break;
case MODE_100:
Wire.beginTransmission(Addr);
Wire.write(I2C_FREQUENCY); // start adress
Wire.write(0x40); // 100 Hz
Wire.endTransmission();
break;
case MODE_200:
Wire.beginTransmission(Addr);
Wire.write(I2C_FREQUENCY); // start adress
Wire.write(0x80); // 200 Hz
Wire.endTransmission();
break;
case MODE_400:
Wire.beginTransmission(Addr);
Wire.write(I2C_FREQUENCY); // start adress
Wire.write(0xC0); // 400 Hz
Wire.endTransmission();
break;
case MODE_800:
Wire.beginTransmission(Addr);
Wire.write(I2C_FREQUENCY); // start adress
Wire.write(0xFF); // 800 Hz
Wire.endTransmission();
break;
}
debounce|=0x01;
}
} else {
if (debounce&0x01) {
debounce&=~0x01;
}
}
SPI.beginTransaction(SPISettings(500000, MSBFIRST, SPI_MODE0)); //Begin comm with sensor while using the SPI settings: 800kHz, MSB first, SPI mode 0
digitalWrite(SlaveSel, LOW); //Pull slave select pin low to start data transfer
Byte1 = SPI.transfer(0xAA);
delay(25);
Byte2 = SPI.transfer(0x00);
delay(25);
Byte3 = SPI.transfer(0x00);
delay(25);
Byte4 = SPI.transfer(0x00);
delay(25);
digitalWrite(SlaveSel, HIGH); //Pull slave select pin high to stop data transfer
SPI.endTransaction(); //End comms with sensor
x2 = (long)Byte2<<16;
x1 = (long)Byte3<<8;
x0 = (long)Byte4;
Output = x2 | x1 | x0;
// Transfer function
Result = Output*5.8/15099494;
Serial.print("mmHg");
Serial.println(Result);
delay(100);
}