![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
De sensorcontroller van het TLS2 project.
Diff: main.cpp
- Revision:
- 3:8e50fc7b82b7
- Parent:
- 2:4c5952cf26d0
- Child:
- 4:512492f73e90
--- a/main.cpp Mon Nov 14 18:39:42 2016 +0000 +++ b/main.cpp Wed Nov 16 18:44:24 2016 +0000 @@ -1,24 +1,12 @@ #include "mbed.h" +//I2C settings + #define SDA D10 + #define SCL D11 + #define sensor_addr 0x93 + #define I2C_BUFFER_SIZE 10 + I2CSlave slave(SDA,SCL); -/* De sensor controller heeft de volgende taken - 1. Sensoren uitlezen - 1. De frequentie moet per sensor aanpasbaar zijn. - 2. Reageren op I2C data requests - 3. Indien mogelijk meerdere samples nemen van de hoogste prioriteit sensor - - De volgende 'dingen' moeten kunnen worden ingesteld - 1. 'Hoofd'sensor - 2. Sample rate _per_ sensor - 3. Moving Average van 'Hoofd'sensor -*/ - - -void i2c_request(){ - //To be written -} - - float sensorVal[3] = {0}; //Index 0: druksensor waarde //Index 1: flowsensor waarde @@ -30,14 +18,6 @@ bool pressure_is_main = true; //Determine the most important sensor as in, on which value is the motor controller regulating bool smoothing = true; //Determine to activate the moving average - -//In: nieuwe waarde en hoeveel samples er worden gebruikt -//Out: moving average van x elementen -//Explanation: deze functie 'smooth' de waardes die binnenkomen van -// bijvoorbeeld de druksensor. Zoals een condensator, -// de smoothing factor kan worden ingesteld door de hoeveelheid -// samples in de moving average aan te passen. -// Met maximaal 100 samples. float calc_moving_average(float val, int samples = 10){ static float sample_arr[100] = {0}; //[0] is the newest float moving_average = 0; @@ -57,7 +37,15 @@ return 3.1415926; //Improv error code } } - +//Split an integer into two char +void int_to_2_char(char* arr, int val, int first_element = 0){ + arr[first_element] = val>>8; + arr[first_element+1] = val&255; +} +//Join two char to make an integer. +int char2_to_int(char* arr, int first_element = 0){ + return ((arr[first_element]<<8)+arr[first_element+1]); +} int main() { //Pins AnalogIn drukSensor(A0); @@ -77,7 +65,61 @@ t_druk.start(); t_flow.start(); t_temp.start(); + int respondSensor = 0; + char buffer[I2C_BUFFER_SIZE] = {0}; //Create the buffer for I2C + bool buffer_changed = false; + char data[2]; + slave.address(sensor_addr); while(1) { + //I2C time + int i = slave.receive(); + switch (i) { + case I2CSlave::ReadAddressed: + //Received a request to be read + //Irrelevant for now + switch(respondSensor){ + case 1: //Druksensor + int_to_2_char(data,((int)(sensorVal[0]*65535))); + break; + case 2: //Flowsensor + int_to_2_char(data,((int)(sensorVal[1]*65535))); + break; + case 3://Temperatuursensor + int_to_2_char(data,((int)(sensorVal[2]*65535))); + break; + } + slave.write(data,2); + break; + case I2CSlave::WriteGeneral: + //Received a request to be written to + slave.read(buffer,I2C_BUFFER_SIZE); + buffer_changed = true; + break; + case I2CSlave::WriteAddressed: + //Received a request to be written to a specific location + slave.read(buffer,I2C_BUFFER_SIZE); + buffer_changed = true; + break; + } + if(buffer_changed == true){ + for(int i=0;i<I2C_BUFFER_SIZE;i++){ + buffer[i] = 0; + } + int command = buffer[0]; + switch(command){ + case 0: + //Command is recognized + //Write what the command is going to do + break; + case 1: + //Command is recognized + //Write what the command is going to do + break; + default: + //Command is not recognied + break; + } + } if(t_druk.read_ms() >= tick_ms_druksensor){ //Lees de druksensor uit if(pressure_is_main == true && smoothing == true){