Hortau / Mbed 2 deprecated Tensiometer_Simulator_waterbench

Dependencies:   mbed

Committer:
gmfortier
Date:
Mon May 06 20:26:33 2019 +0000
Revision:
8:e82e5b78dbbd
Parent:
7:8698d17a0168
Child:
9:d2b700d42dbe
Second sensor added, can be toggled with blue button on Nucleo. The LD2 LED indicates which sensor configuration is used.; The configurations are not changeable and are meant to be used on the waterbench.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Blanglois 0:265fff2cfb0a 1 #include "mbed.h"
Blanglois 0:265fff2cfb0a 2 #include "I2CSlaveComm.h"
gmfortier 8:e82e5b78dbbd 3
eboily1 2:d0308b3aaf69 4 I2CSlaveCustom slave(D4, D7);
eboily1 2:d0308b3aaf69 5 I2CSlaveCustom slave2(D14, D15); //use another I2C to emulate the adc
gmfortier 8:e82e5b78dbbd 6
Blanglois 3:29925a0f88da 7 Ticker command_ticker;
Blanglois 3:29925a0f88da 8 Ticker flow_ticker;
Blanglois 3:29925a0f88da 9
gmfortier 8:e82e5b78dbbd 10 DigitalIn mybutton(USER_BUTTON);
gmfortier 8:e82e5b78dbbd 11 DigitalOut myled(LED1);
gmfortier 8:e82e5b78dbbd 12
Blanglois 3:29925a0f88da 13 Serial PcUart(USBTX, USBRX);
Blanglois 3:29925a0f88da 14
gmfortier 8:e82e5b78dbbd 15 int current_tensiometer = 0; // Two possible sensors with different patterns
gmfortier 8:e82e5b78dbbd 16
gmfortier 8:e82e5b78dbbd 17 float tension;
Blanglois 3:29925a0f88da 18
gmfortier 8:e82e5b78dbbd 19 int modeSwitch = 1;
gmfortier 8:e82e5b78dbbd 20 int saveSwitch = 0;
gmfortier 8:e82e5b78dbbd 21 float counter = 0;
gmfortier 8:e82e5b78dbbd 22
Blanglois 0:265fff2cfb0a 23 unsigned char PointOnAddress = 0;
gmfortier 8:e82e5b78dbbd 24
Blanglois 3:29925a0f88da 25 char buffer[64];
Blanglois 3:29925a0f88da 26
eboily1 2:d0308b3aaf69 27 unsigned char ADCValue[2];
gmfortier 8:e82e5b78dbbd 28
gmfortier 8:e82e5b78dbbd 29 struct CycleValues {
gmfortier 8:e82e5b78dbbd 30 float riseTime;
gmfortier 8:e82e5b78dbbd 31 float fallTime;
gmfortier 8:e82e5b78dbbd 32 float plateauTime;
gmfortier 8:e82e5b78dbbd 33 float stepTime;
gmfortier 8:e82e5b78dbbd 34
gmfortier 8:e82e5b78dbbd 35 float highValue;
gmfortier 8:e82e5b78dbbd 36 float lowValue;
gmfortier 8:e82e5b78dbbd 37 float stepValueRise;
gmfortier 8:e82e5b78dbbd 38 float stepValueFall;
gmfortier 8:e82e5b78dbbd 39 int offset; //Number of steps
gmfortier 8:e82e5b78dbbd 40 };
gmfortier 8:e82e5b78dbbd 41
gmfortier 8:e82e5b78dbbd 42 struct CycleValues tensiometer0 =
gmfortier 8:e82e5b78dbbd 43 {
gmfortier 8:e82e5b78dbbd 44 .riseTime = 2700,
gmfortier 8:e82e5b78dbbd 45 .fallTime = 900,
gmfortier 8:e82e5b78dbbd 46 .plateauTime = 0,
gmfortier 8:e82e5b78dbbd 47 .stepTime = 30,
gmfortier 8:e82e5b78dbbd 48 .highValue = 42,
gmfortier 8:e82e5b78dbbd 49 .lowValue = -3,
gmfortier 8:e82e5b78dbbd 50 .stepValueRise = tensiometer0.stepTime * (tensiometer0.highValue - tensiometer0.lowValue) / tensiometer0.riseTime,
gmfortier 8:e82e5b78dbbd 51 .stepValueFall = tensiometer0.stepTime * (tensiometer0.lowValue - tensiometer0.highValue) / tensiometer0.fallTime,
gmfortier 8:e82e5b78dbbd 52 .offset = 0
gmfortier 8:e82e5b78dbbd 53 };
gmfortier 8:e82e5b78dbbd 54
gmfortier 8:e82e5b78dbbd 55 struct CycleValues tensiometer1 =
gmfortier 8:e82e5b78dbbd 56 {
gmfortier 8:e82e5b78dbbd 57 .riseTime = 1200,
gmfortier 8:e82e5b78dbbd 58 .fallTime = 480,
gmfortier 8:e82e5b78dbbd 59 .plateauTime = 60,
gmfortier 8:e82e5b78dbbd 60 .stepTime = 30,
gmfortier 8:e82e5b78dbbd 61 .highValue = 38,
gmfortier 8:e82e5b78dbbd 62 .lowValue = 0,
gmfortier 8:e82e5b78dbbd 63 .stepValueRise = tensiometer1.stepTime * (tensiometer1.highValue - tensiometer1.lowValue) / tensiometer1.riseTime,
gmfortier 8:e82e5b78dbbd 64 .stepValueFall = tensiometer1.stepTime * (tensiometer1.lowValue - tensiometer1.highValue) / tensiometer1.fallTime,
gmfortier 8:e82e5b78dbbd 65 .offset = 0
gmfortier 8:e82e5b78dbbd 66 };
gmfortier 8:e82e5b78dbbd 67
gmfortier 8:e82e5b78dbbd 68 struct CycleValues tensiometers[2] = {tensiometer0, tensiometer1};
gmfortier 8:e82e5b78dbbd 69 struct CycleValues tensiometer = tensiometers[current_tensiometer];
gmfortier 8:e82e5b78dbbd 70
Blanglois 0:265fff2cfb0a 71 #pragma pack(push,1)
Blanglois 0:265fff2cfb0a 72 struct SmartSensorStruct {
Blanglois 0:265fff2cfb0a 73 char crc; ///< Checksum CRC8
Blanglois 0:265fff2cfb0a 74 char serial[11]; ///< No Série du capteur. Doit demeurer à l'offset 1 dans la structure
Blanglois 0:265fff2cfb0a 75 char gain; ///< Gain à appliquer
Blanglois 0:265fff2cfb0a 76 char sampling_rate; ///< Vitesse de sampling
Blanglois 0:265fff2cfb0a 77 char model; ///< Model de capteur
Blanglois 0:265fff2cfb0a 78 short c1; ///< Consigne c1 de calcul
Blanglois 0:265fff2cfb0a 79 short c2; ///< Consigne c2 de calcul
Blanglois 0:265fff2cfb0a 80 short c3; ///< Consigne c3 de calcul
Blanglois 0:265fff2cfb0a 81 char depth; ///< Profondeur du capteur en mètres ou en pieds
Blanglois 0:265fff2cfb0a 82 short c4; ///< Consigne c4 de calcul
Blanglois 0:265fff2cfb0a 83 unsigned long code;///< Code de détection du type de smartSensor (Salinité ou Tension)
Blanglois 0:265fff2cfb0a 84 }SmartSensorStruct_packed;
Blanglois 0:265fff2cfb0a 85 #pragma pack(pop)
gmfortier 8:e82e5b78dbbd 86
Blanglois 0:265fff2cfb0a 87 struct SmartSensorStruct stSensor;
gmfortier 8:e82e5b78dbbd 88
Blanglois 0:265fff2cfb0a 89 char RAMBuffer[256]; //simulate EEPROM
gmfortier 8:e82e5b78dbbd 90
Blanglois 0:265fff2cfb0a 91 void DoCRC8(char* a_crc8, char b)
Blanglois 0:265fff2cfb0a 92 {
Blanglois 0:265fff2cfb0a 93 char i, j;
gmfortier 8:e82e5b78dbbd 94
Blanglois 0:265fff2cfb0a 95 for (i = 0; i < 8; b >>= 1, i++) {
gmfortier 8:e82e5b78dbbd 96
Blanglois 0:265fff2cfb0a 97 j = (b ^ (*a_crc8)) & 1;
Blanglois 0:265fff2cfb0a 98 (*a_crc8) >>= 1;
gmfortier 8:e82e5b78dbbd 99
Blanglois 0:265fff2cfb0a 100 if (j) (*a_crc8) ^= 0x8C;
Blanglois 0:265fff2cfb0a 101 }
Blanglois 0:265fff2cfb0a 102 }
gmfortier 8:e82e5b78dbbd 103
eboily1 2:d0308b3aaf69 104 void setTension(double value)
Blanglois 0:265fff2cfb0a 105 {
Blanglois 3:29925a0f88da 106 int tensionset = (int)(value*100);
eboily1 2:d0308b3aaf69 107
Blanglois 3:29925a0f88da 108 int adc = ((1000 * (tensionset - stSensor.c3)) / stSensor.c2) - stSensor.c1;
eboily1 2:d0308b3aaf69 109 adc = adc / 4; //into low read of the ST
eboily1 2:d0308b3aaf69 110 ADCValue[0] = (adc >> 8)&0xFF;
eboily1 2:d0308b3aaf69 111 ADCValue[1] = (adc)&0xFF;
Blanglois 0:265fff2cfb0a 112 }
gmfortier 8:e82e5b78dbbd 113
Blanglois 0:265fff2cfb0a 114 char ComputeCRC8(char *buff, char len, char start_data)
Blanglois 0:265fff2cfb0a 115 {
Blanglois 0:265fff2cfb0a 116 char crc8 = 0;
Blanglois 0:265fff2cfb0a 117 DoCRC8(&crc8, start_data);
Blanglois 0:265fff2cfb0a 118 while (len--) DoCRC8(&crc8, *buff++);
gmfortier 8:e82e5b78dbbd 119
Blanglois 0:265fff2cfb0a 120 return crc8;
Blanglois 0:265fff2cfb0a 121 }
gmfortier 8:e82e5b78dbbd 122
gmfortier 8:e82e5b78dbbd 123
Blanglois 0:265fff2cfb0a 124 void SaveRamBuffer(char address, char* value, unsigned char length)
Blanglois 0:265fff2cfb0a 125 {
gmfortier 8:e82e5b78dbbd 126
Blanglois 0:265fff2cfb0a 127 unsigned char i;
Blanglois 0:265fff2cfb0a 128 for(i = 0; i < length; i++)
Blanglois 0:265fff2cfb0a 129 RAMBuffer[address + i] = value[i];
Blanglois 0:265fff2cfb0a 130 }
gmfortier 8:e82e5b78dbbd 131
Blanglois 0:265fff2cfb0a 132 void SaveData(char add, long value)
Blanglois 0:265fff2cfb0a 133 {
Blanglois 0:265fff2cfb0a 134 SaveRamBuffer(add, (char*)&value, 4);
Blanglois 0:265fff2cfb0a 135 }
gmfortier 8:e82e5b78dbbd 136
Blanglois 0:265fff2cfb0a 137 void I2C_1Process()
Blanglois 0:265fff2cfb0a 138 {
Blanglois 0:265fff2cfb0a 139 char buf[MAX_WRITE_SIZE + 1];
Blanglois 0:265fff2cfb0a 140 int nbRx = 0;
gmfortier 8:e82e5b78dbbd 141
Blanglois 0:265fff2cfb0a 142 for(int i = 0; i < MAX_WRITE_SIZE; i++) buf[i] = 0; // Clear buffer
gmfortier 8:e82e5b78dbbd 143
Blanglois 0:265fff2cfb0a 144 int rx = slave.receive();
gmfortier 8:e82e5b78dbbd 145
Blanglois 0:265fff2cfb0a 146 switch (rx)
Blanglois 0:265fff2cfb0a 147 {
Blanglois 0:265fff2cfb0a 148 case I2CSlave::ReadAddressed:
eboily1 1:85afd4bd4651 149 slave.write(&RAMBuffer[PointOnAddress], 0xFF - PointOnAddress);
Blanglois 0:265fff2cfb0a 150 break;
gmfortier 8:e82e5b78dbbd 151
Blanglois 0:265fff2cfb0a 152 /*case I2CSlave::WriteGeneral:
Blanglois 0:265fff2cfb0a 153 break;*/
gmfortier 8:e82e5b78dbbd 154
Blanglois 0:265fff2cfb0a 155 case I2CSlave::WriteAddressed:
eboily1 1:85afd4bd4651 156 int ret = slave.read(buf, 1);
Blanglois 0:265fff2cfb0a 157 PointOnAddress = buf[0];
Blanglois 0:265fff2cfb0a 158 nbRx = slave.getCount();
eboily1 1:85afd4bd4651 159 if (nbRx > 0) //to simulate write on EEPROM need to test
eboily1 1:85afd4bd4651 160 {
eboily1 1:85afd4bd4651 161 ret = slave.read(buf, nbRx);
eboily1 1:85afd4bd4651 162 SaveRamBuffer(PointOnAddress, buf, nbRx);
eboily1 1:85afd4bd4651 163 }
Blanglois 0:265fff2cfb0a 164 break;
Blanglois 0:265fff2cfb0a 165 }
Blanglois 0:265fff2cfb0a 166 }
gmfortier 8:e82e5b78dbbd 167
Blanglois 0:265fff2cfb0a 168 void I2C_2Process()
Blanglois 0:265fff2cfb0a 169 {
eboily1 1:85afd4bd4651 170 char buf[MAX_WRITE_SIZE + 1];
Blanglois 0:265fff2cfb0a 171 int rx = slave2.receive();
eboily1 1:85afd4bd4651 172 int nbRx = 0;
Blanglois 0:265fff2cfb0a 173 switch (rx)
Blanglois 0:265fff2cfb0a 174 {
Blanglois 0:265fff2cfb0a 175 case I2CSlave::ReadAddressed:
eboily1 2:d0308b3aaf69 176 slave2.write((char*)&ADCValue, 2);
Blanglois 0:265fff2cfb0a 177 break;
Blanglois 0:265fff2cfb0a 178 /*case I2CSlave::WriteGeneral:
gmfortier 8:e82e5b78dbbd 179
gmfortier 8:e82e5b78dbbd 180
Blanglois 0:265fff2cfb0a 181 break;*/
eboily1 1:85afd4bd4651 182 case I2CSlave::WriteAddressed:
eboily1 1:85afd4bd4651 183 //to empty read buffer we do nothing with the data
eboily1 1:85afd4bd4651 184 int ret = slave2.read(buf, 1);
eboily1 2:d0308b3aaf69 185 nbRx = slave2.getCount();
eboily1 1:85afd4bd4651 186 if (nbRx > 0) //to simulate write on EEPROM need to test
eboily1 1:85afd4bd4651 187 {
eboily1 1:85afd4bd4651 188 ret = slave2.read(buf, nbRx);
eboily1 1:85afd4bd4651 189 }
eboily1 1:85afd4bd4651 190 break;
Blanglois 0:265fff2cfb0a 191 }
Blanglois 0:265fff2cfb0a 192 }
gmfortier 8:e82e5b78dbbd 193
Blanglois 0:265fff2cfb0a 194 void I2CSlaveProcess()
Blanglois 0:265fff2cfb0a 195 {
Blanglois 0:265fff2cfb0a 196 I2C_1Process();
Blanglois 0:265fff2cfb0a 197 I2C_2Process();
Blanglois 0:265fff2cfb0a 198 }
gmfortier 8:e82e5b78dbbd 199
Blanglois 0:265fff2cfb0a 200 void InitI2CSlaveComm()
Blanglois 0:265fff2cfb0a 201 {
Blanglois 0:265fff2cfb0a 202 slave.address(0xA0);
Blanglois 0:265fff2cfb0a 203 sprintf(stSensor.serial, "2059123456");
Blanglois 0:265fff2cfb0a 204 stSensor.gain = 0x01;
Blanglois 0:265fff2cfb0a 205 stSensor.sampling_rate = 0x03;
Blanglois 0:265fff2cfb0a 206 stSensor.c1 = -37;
Blanglois 0:265fff2cfb0a 207 stSensor.c2 = 634;
Blanglois 0:265fff2cfb0a 208 stSensor.c3 = -7;
Blanglois 0:265fff2cfb0a 209 stSensor.c4 = -1;
Blanglois 0:265fff2cfb0a 210 stSensor.depth = 0x00;
Blanglois 0:265fff2cfb0a 211 stSensor.model = 2; //Nombre de données à transmettre vers le ST
Blanglois 0:265fff2cfb0a 212 stSensor.code = 0xFFFF; //Type of sensor
Blanglois 0:265fff2cfb0a 213 stSensor.crc = ComputeCRC8(((char *)&stSensor)+1, sizeof(SmartSensorStruct_packed) - 7, 0);
Blanglois 0:265fff2cfb0a 214 SaveRamBuffer(0, (char*)&stSensor, sizeof(SmartSensorStruct_packed));
gmfortier 8:e82e5b78dbbd 215
Blanglois 0:265fff2cfb0a 216 slave2.address(0x90);
Blanglois 3:29925a0f88da 217 }
gmfortier 8:e82e5b78dbbd 218
gmfortier 8:e82e5b78dbbd 219 void cycle()
Blanglois 3:29925a0f88da 220 {
gmfortier 8:e82e5b78dbbd 221 if(modeSwitch == 3 )
Blanglois 3:29925a0f88da 222 {
gmfortier 8:e82e5b78dbbd 223 if(saveSwitch == 2)
gmfortier 8:e82e5b78dbbd 224 {
gmfortier 8:e82e5b78dbbd 225 printf("Tension fall begins\n");
gmfortier 8:e82e5b78dbbd 226 }
gmfortier 8:e82e5b78dbbd 227 else if (saveSwitch == 1)
gmfortier 8:e82e5b78dbbd 228 {
gmfortier 8:e82e5b78dbbd 229 printf("Tension rise begins\n");
gmfortier 8:e82e5b78dbbd 230 }
Blanglois 7:8698d17a0168 231
gmfortier 8:e82e5b78dbbd 232 counter = 0;
gmfortier 8:e82e5b78dbbd 233 modeSwitch = saveSwitch;
gmfortier 8:e82e5b78dbbd 234
gmfortier 8:e82e5b78dbbd 235 }
gmfortier 8:e82e5b78dbbd 236 else
Blanglois 3:29925a0f88da 237 {
gmfortier 8:e82e5b78dbbd 238 if(modeSwitch == 1)
gmfortier 8:e82e5b78dbbd 239 {
gmfortier 8:e82e5b78dbbd 240 printf("High plateau begins\n");
gmfortier 8:e82e5b78dbbd 241 saveSwitch = 2;
gmfortier 8:e82e5b78dbbd 242 modeSwitch = 3;
gmfortier 8:e82e5b78dbbd 243 }
gmfortier 8:e82e5b78dbbd 244 else if (modeSwitch == 2)
gmfortier 8:e82e5b78dbbd 245 {
gmfortier 8:e82e5b78dbbd 246 printf("Low plateau begins\n");
gmfortier 8:e82e5b78dbbd 247 saveSwitch = 1;
gmfortier 8:e82e5b78dbbd 248 modeSwitch = 3;
gmfortier 8:e82e5b78dbbd 249 }
gmfortier 8:e82e5b78dbbd 250 }
Blanglois 3:29925a0f88da 251 }
gmfortier 8:e82e5b78dbbd 252
Blanglois 3:29925a0f88da 253 void commandselect()
Blanglois 3:29925a0f88da 254 {
Blanglois 3:29925a0f88da 255 if(PcUart.readable())
Blanglois 3:29925a0f88da 256 {
Blanglois 3:29925a0f88da 257 char command = PcUart.getc();
Blanglois 3:29925a0f88da 258 switch(command)
Blanglois 7:8698d17a0168 259 {
Blanglois 7:8698d17a0168 260
Blanglois 3:29925a0f88da 261 case 'w':
Blanglois 3:29925a0f88da 262 {
Blanglois 7:8698d17a0168 263 flow_ticker.detach();
gmfortier 8:e82e5b78dbbd 264 printf("Setting parameters\n");
Blanglois 3:29925a0f88da 265
gmfortier 8:e82e5b78dbbd 266 printf("Enter tension high value in kPa\n");
gmfortier 8:e82e5b78dbbd 267 scanf("%s", buffer);
gmfortier 8:e82e5b78dbbd 268 tensiometer.highValue = atoi(buffer);
gmfortier 8:e82e5b78dbbd 269
gmfortier 8:e82e5b78dbbd 270 printf("Enter tension low value in kPa\n");
gmfortier 8:e82e5b78dbbd 271 scanf("%s", buffer);
gmfortier 8:e82e5b78dbbd 272 tensiometer.lowValue = atoi(buffer);
gmfortier 8:e82e5b78dbbd 273
gmfortier 8:e82e5b78dbbd 274 printf("Enter tension rise time in seconds\n");
gmfortier 8:e82e5b78dbbd 275 scanf("%s", buffer);
gmfortier 8:e82e5b78dbbd 276 tensiometer.riseTime = atoi(buffer);
Blanglois 3:29925a0f88da 277
gmfortier 8:e82e5b78dbbd 278 printf("Enter tension fall time in seconds\n");
gmfortier 8:e82e5b78dbbd 279 scanf("%s", buffer);
gmfortier 8:e82e5b78dbbd 280 tensiometer.fallTime = atoi(buffer);
gmfortier 8:e82e5b78dbbd 281
gmfortier 8:e82e5b78dbbd 282 printf("Enter plateau time in seconds\n");
gmfortier 8:e82e5b78dbbd 283 scanf("%s", buffer);
gmfortier 8:e82e5b78dbbd 284 tensiometer.plateauTime = atoi(buffer);
Blanglois 3:29925a0f88da 285
gmfortier 8:e82e5b78dbbd 286 printf("Enter step time in seconds\n");
gmfortier 8:e82e5b78dbbd 287 scanf("%s", buffer);
gmfortier 8:e82e5b78dbbd 288 tensiometer.stepTime = atoi(buffer);
Blanglois 3:29925a0f88da 289
gmfortier 8:e82e5b78dbbd 290 printf("Resetting cycle\n");
gmfortier 8:e82e5b78dbbd 291 counter = 0;
gmfortier 8:e82e5b78dbbd 292 tension = tensiometer.lowValue;
gmfortier 8:e82e5b78dbbd 293 modeSwitch = 1;
gmfortier 8:e82e5b78dbbd 294
gmfortier 8:e82e5b78dbbd 295 flow_ticker.attach(&flow, tensiometer.stepTime);
Blanglois 3:29925a0f88da 296 break;
Blanglois 3:29925a0f88da 297 }
Blanglois 3:29925a0f88da 298
Blanglois 3:29925a0f88da 299 case 'i':
Blanglois 3:29925a0f88da 300 {
Blanglois 3:29925a0f88da 301 printf("List of parameter values\n");
gmfortier 8:e82e5b78dbbd 302 printf("High tension: %d kPa\n", (int)tensiometer.highValue);
gmfortier 8:e82e5b78dbbd 303 printf("Low tension: %d kPa\n", (int)tensiometer.lowValue);
gmfortier 8:e82e5b78dbbd 304 printf("Cycle rise time: %d seconds\n", (int)tensiometer.riseTime);
gmfortier 8:e82e5b78dbbd 305 printf("Cycle fall time: %d seconds\n", (int)tensiometer.fallTime);
gmfortier 8:e82e5b78dbbd 306 printf("Cycle plateau time: %d seconds\n", (int)tensiometer.plateauTime);
gmfortier 8:e82e5b78dbbd 307 printf("Step time: %d seconds\n", (int)tensiometer.stepTime);
gmfortier 8:e82e5b78dbbd 308 if(modeSwitch == 1)
gmfortier 8:e82e5b78dbbd 309 printf("Cycle currently in rising phase\n");
gmfortier 8:e82e5b78dbbd 310 else if(modeSwitch == 2)
Blanglois 7:8698d17a0168 311 printf("Cycle currently in falling phase\n");
gmfortier 8:e82e5b78dbbd 312 else if(modeSwitch == 3)
gmfortier 8:e82e5b78dbbd 313 printf("Cycle currently in plateau phase\n");
Blanglois 3:29925a0f88da 314 break;
Blanglois 3:29925a0f88da 315 }
Blanglois 3:29925a0f88da 316 }
Blanglois 3:29925a0f88da 317 }
Blanglois 3:29925a0f88da 318 }
gmfortier 8:e82e5b78dbbd 319
Blanglois 3:29925a0f88da 320 void flow()
Blanglois 3:29925a0f88da 321 {
gmfortier 8:e82e5b78dbbd 322 if(modeSwitch == 3)
gmfortier 8:e82e5b78dbbd 323 {
gmfortier 8:e82e5b78dbbd 324 counter += tensiometer.stepTime;
gmfortier 8:e82e5b78dbbd 325
gmfortier 8:e82e5b78dbbd 326 if(counter >= tensiometer.plateauTime)
gmfortier 8:e82e5b78dbbd 327 cycle();
gmfortier 8:e82e5b78dbbd 328 }
Blanglois 3:29925a0f88da 329 else
Blanglois 3:29925a0f88da 330 {
gmfortier 8:e82e5b78dbbd 331 if(modeSwitch == 1)
gmfortier 8:e82e5b78dbbd 332 {
gmfortier 8:e82e5b78dbbd 333 tension += tensiometer.stepValueRise;
gmfortier 8:e82e5b78dbbd 334 printf("Rising, tension = %f\n", tension);
gmfortier 8:e82e5b78dbbd 335 }
gmfortier 8:e82e5b78dbbd 336 if(modeSwitch == 2)
Blanglois 3:29925a0f88da 337 {
gmfortier 8:e82e5b78dbbd 338 tension += tensiometer.stepValueFall;
gmfortier 8:e82e5b78dbbd 339 printf("Falling, tension = %f\n", tension);
gmfortier 8:e82e5b78dbbd 340 }
gmfortier 8:e82e5b78dbbd 341
gmfortier 8:e82e5b78dbbd 342 setTension(tension);
gmfortier 8:e82e5b78dbbd 343
gmfortier 8:e82e5b78dbbd 344 if(modeSwitch == 1 && tension >= tensiometer.highValue - 0.001f)
gmfortier 8:e82e5b78dbbd 345 {
gmfortier 8:e82e5b78dbbd 346 tension = tensiometer.highValue;
gmfortier 8:e82e5b78dbbd 347 cycle();
gmfortier 8:e82e5b78dbbd 348 }
gmfortier 8:e82e5b78dbbd 349 else if(modeSwitch == 2 && tension <= tensiometer.lowValue + 0.001f)
gmfortier 8:e82e5b78dbbd 350 {
gmfortier 8:e82e5b78dbbd 351 tension = tensiometer.lowValue;
gmfortier 8:e82e5b78dbbd 352 cycle();
Blanglois 3:29925a0f88da 353 }
gmfortier 8:e82e5b78dbbd 354 }
gmfortier 8:e82e5b78dbbd 355 }
gmfortier 8:e82e5b78dbbd 356
gmfortier 8:e82e5b78dbbd 357 void setStartingValue()
gmfortier 8:e82e5b78dbbd 358 {
gmfortier 8:e82e5b78dbbd 359 int numberOfSteps = (tensiometer.riseTime + tensiometer.fallTime + (2 * tensiometer.plateauTime)) / tensiometer.stepTime;
gmfortier 8:e82e5b78dbbd 360 printf("Total number of steps : %i\n", numberOfSteps);
gmfortier 8:e82e5b78dbbd 361 printf("Lenght of cycle (seconds) : %f\n", numberOfSteps * tensiometer.stepTime);
gmfortier 8:e82e5b78dbbd 362 int offset = tensiometer.offset % numberOfSteps;
gmfortier 8:e82e5b78dbbd 363 printf("Offset after modulo : %i\n", offset);
gmfortier 8:e82e5b78dbbd 364 if (offset * tensiometer.stepTime <= tensiometer.riseTime)
gmfortier 8:e82e5b78dbbd 365 {
gmfortier 8:e82e5b78dbbd 366 tension = tensiometer.lowValue + (tensiometer.offset * tensiometer.stepValueRise);
gmfortier 8:e82e5b78dbbd 367 }
gmfortier 8:e82e5b78dbbd 368 else if (offset * tensiometer.stepTime > tensiometer.riseTime && offset * tensiometer.stepTime <= (tensiometer.riseTime + tensiometer.plateauTime))
gmfortier 8:e82e5b78dbbd 369 {
gmfortier 8:e82e5b78dbbd 370 tension = tensiometer.highValue;
gmfortier 8:e82e5b78dbbd 371 modeSwitch = 3;
gmfortier 8:e82e5b78dbbd 372 }
gmfortier 8:e82e5b78dbbd 373 else if (offset * tensiometer.stepTime > (tensiometer.riseTime + tensiometer.plateauTime) && offset * tensiometer.stepTime <= (tensiometer.riseTime + tensiometer.plateauTime + tensiometer.fallTime))
gmfortier 8:e82e5b78dbbd 374 {
gmfortier 8:e82e5b78dbbd 375 tension = tensiometer.highValue + (tensiometer.offset * tensiometer.stepValueFall);
gmfortier 8:e82e5b78dbbd 376 modeSwitch = 2;
Blanglois 3:29925a0f88da 377 }
gmfortier 8:e82e5b78dbbd 378 else
gmfortier 8:e82e5b78dbbd 379 {
gmfortier 8:e82e5b78dbbd 380 tension = tensiometer.lowValue;
gmfortier 8:e82e5b78dbbd 381 modeSwitch = 3;
gmfortier 8:e82e5b78dbbd 382 }
gmfortier 8:e82e5b78dbbd 383 printf("Starting tension : %f\n", tension);
gmfortier 8:e82e5b78dbbd 384 switch (modeSwitch)
gmfortier 8:e82e5b78dbbd 385 {
gmfortier 8:e82e5b78dbbd 386 case 1:
gmfortier 8:e82e5b78dbbd 387 printf("Starting phase : rising\n");
gmfortier 8:e82e5b78dbbd 388 break;
gmfortier 8:e82e5b78dbbd 389 case 2:
gmfortier 8:e82e5b78dbbd 390 printf("Starting phase : falling\n");
gmfortier 8:e82e5b78dbbd 391 break;
gmfortier 8:e82e5b78dbbd 392 case 3:
gmfortier 8:e82e5b78dbbd 393 printf("Starting phase : plateau\n");
gmfortier 8:e82e5b78dbbd 394 }
gmfortier 8:e82e5b78dbbd 395 }
gmfortier 8:e82e5b78dbbd 396
gmfortier 8:e82e5b78dbbd 397 void resetCycle()
gmfortier 8:e82e5b78dbbd 398 {
gmfortier 8:e82e5b78dbbd 399 printf("Beginning simulation, tensiometer #%i\n", current_tensiometer);
gmfortier 8:e82e5b78dbbd 400 modeSwitch = 1;
gmfortier 8:e82e5b78dbbd 401 saveSwitch = 0;
gmfortier 8:e82e5b78dbbd 402 counter = 0;
gmfortier 8:e82e5b78dbbd 403 setStartingValue();
gmfortier 8:e82e5b78dbbd 404 flow_ticker.attach(&flow, tensiometer.stepTime);
gmfortier 8:e82e5b78dbbd 405 command_ticker.attach(&commandselect, 1);
Blanglois 3:29925a0f88da 406 }
Blanglois 3:29925a0f88da 407
Blanglois 3:29925a0f88da 408 int main()
Blanglois 3:29925a0f88da 409 {
gmfortier 8:e82e5b78dbbd 410 /*
gmfortier 8:e82e5b78dbbd 411 printf("Setting parameters\n");
gmfortier 8:e82e5b78dbbd 412
gmfortier 8:e82e5b78dbbd 413 printf("Enter tension high value in kPa\n");
gmfortier 8:e82e5b78dbbd 414 scanf("%s", buffer);
gmfortier 8:e82e5b78dbbd 415 highValue = atoi(buffer);
gmfortier 8:e82e5b78dbbd 416
gmfortier 8:e82e5b78dbbd 417 printf("Enter tension low value in kPa\n");
gmfortier 8:e82e5b78dbbd 418 scanf("%s", buffer);
gmfortier 8:e82e5b78dbbd 419 lowValue = atoi(buffer);
gmfortier 8:e82e5b78dbbd 420
gmfortier 8:e82e5b78dbbd 421 printf("Enter tension rise time in seconds\n");
gmfortier 8:e82e5b78dbbd 422 scanf("%s", buffer);
gmfortier 8:e82e5b78dbbd 423 riseTime = atoi(buffer);
Blanglois 7:8698d17a0168 424
gmfortier 8:e82e5b78dbbd 425 printf("Enter tension fall time in seconds\n");
gmfortier 8:e82e5b78dbbd 426 scanf("%s", buffer);
gmfortier 8:e82e5b78dbbd 427 fallTime = atoi(buffer);
gmfortier 8:e82e5b78dbbd 428
gmfortier 8:e82e5b78dbbd 429 printf("Enter plateau time in seconds\n");
gmfortier 8:e82e5b78dbbd 430 scanf("%s", buffer);
gmfortier 8:e82e5b78dbbd 431 plateauTime = atoi(buffer);
gmfortier 8:e82e5b78dbbd 432
gmfortier 8:e82e5b78dbbd 433 printf("Enter step time *in milliseconds*\n");
gmfortier 8:e82e5b78dbbd 434 scanf("%s", buffer);
gmfortier 8:e82e5b78dbbd 435 stepTime = (float)atoi(buffer)/1000;
gmfortier 8:e82e5b78dbbd 436
gmfortier 8:e82e5b78dbbd 437 tension = lowValue;
gmfortier 8:e82e5b78dbbd 438 stepValue = stepTime * (highValue - lowValue) / riseTime;
gmfortier 8:e82e5b78dbbd 439 */
Blanglois 7:8698d17a0168 440
Blanglois 3:29925a0f88da 441 InitI2CSlaveComm();
gmfortier 8:e82e5b78dbbd 442 resetCycle();
gmfortier 8:e82e5b78dbbd 443
Blanglois 3:29925a0f88da 444 while(1)
Blanglois 3:29925a0f88da 445 {
gmfortier 8:e82e5b78dbbd 446 if (mybutton == 0) // Button is pressed
gmfortier 8:e82e5b78dbbd 447 {
gmfortier 8:e82e5b78dbbd 448 myled = !myled; // Toggle the LED state
gmfortier 8:e82e5b78dbbd 449 wait(0.2); // 200 ms
gmfortier 8:e82e5b78dbbd 450 }
gmfortier 8:e82e5b78dbbd 451 if (!current_tensiometer == myled)
gmfortier 8:e82e5b78dbbd 452 {
gmfortier 8:e82e5b78dbbd 453 current_tensiometer = myled;
gmfortier 8:e82e5b78dbbd 454 tensiometer = tensiometers[current_tensiometer];
gmfortier 8:e82e5b78dbbd 455 resetCycle();
gmfortier 8:e82e5b78dbbd 456 }
gmfortier 8:e82e5b78dbbd 457 I2CSlaveProcess();
Blanglois 3:29925a0f88da 458 }
Blanglois 0:265fff2cfb0a 459 }