Seth Ruiter / Mbed 2 deprecated bouke

Dependencies:   MODSERIAL SDFileSystemSeth mbed

Fork of Opstellingbachelor_opdracht by Claudia Haarman

Committer:
sdruiter
Date:
Tue May 22 10:33:05 2018 +0000
Revision:
9:d9ba61ce7a29
Parent:
8:1326141017ea
Child:
10:96c194005985
temperature not writing to file 22/05;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
c_haarm 0:f7cd934498e4 1 #include "mbed.h"
c_haarm 0:f7cd934498e4 2 #include "MODSERIAL.h"
c_haarm 0:f7cd934498e4 3 #include "SDFileSystem.h"
c_haarm 0:f7cd934498e4 4
c_haarm 0:f7cd934498e4 5
c_haarm 0:f7cd934498e4 6 ////////////////////Declarations////////////////////////////////////////////////
c_haarm 0:f7cd934498e4 7 ////////////////////////////////////////////////////////////////////////////////
c_haarm 0:f7cd934498e4 8 ////////////////////////////////////////////////////////////////////////////////
c_haarm 0:f7cd934498e4 9
c_haarm 1:8b45b3ad350a 10 // Thermocouple pin declarations
c_haarm 8:1326141017ea 11 DigitalOut SCK_1(PTD1); // sck pin of thermocouples
c_haarm 8:1326141017ea 12 DigitalOut CS_1(PTE25); // chip select pin of thermocouples
c_haarm 1:8b45b3ad350a 13
c_haarm 7:9f9ea047975d 14
c_haarm 6:5951403edfd2 15 //DigitalIn pins[12]={D2, D3, D4, D5, D6, D7, D8, D9, D10, D11, D12, D13}; //thermocouples 1 - 12 select corresponding pin numbers mbed
sdruiter 9:d9ba61ce7a29 16 DigitalIn pins[7]={D2, D3, D4, D5, D6, D7, D10}; //thermocouple select corresponding pin numbers mbed
c_haarm 1:8b45b3ad350a 17
c_haarm 1:8b45b3ad350a 18
c_haarm 1:8b45b3ad350a 19 // Torque sensor
c_haarm 0:f7cd934498e4 20 AnalogIn fcs(PTB2); // force sensor output connected to analog 0
c_haarm 0:f7cd934498e4 21
c_haarm 1:8b45b3ad350a 22
c_haarm 1:8b45b3ad350a 23 // LED
c_haarm 0:f7cd934498e4 24 DigitalOut r_led(LED_RED);
c_haarm 0:f7cd934498e4 25 DigitalOut g_led(LED_GREEN);
c_haarm 0:f7cd934498e4 26 DigitalOut b_led(LED_BLUE);
c_haarm 0:f7cd934498e4 27
c_haarm 1:8b45b3ad350a 28 // Serial connection and SD
c_haarm 0:f7cd934498e4 29 MODSERIAL pc(USBTX,USBRX, 1024, 512);
c_haarm 0:f7cd934498e4 30 SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd"); // MOSI, MISO, SCK, CS
c_haarm 0:f7cd934498e4 31 FILE *fp;
c_haarm 0:f7cd934498e4 32
c_haarm 1:8b45b3ad350a 33 // Other declarations
c_haarm 0:f7cd934498e4 34 Ticker tick;
c_haarm 0:f7cd934498e4 35
c_haarm 0:f7cd934498e4 36 const int baudrate = 115200; // baud rate
c_haarm 8:1326141017ea 37 const float Ts = 0.25; // sample time (sec)
c_haarm 0:f7cd934498e4 38
c_haarm 0:f7cd934498e4 39 const int led_on = 0;
c_haarm 0:f7cd934498e4 40 const int led_off = 1;
c_haarm 0:f7cd934498e4 41
c_haarm 0:f7cd934498e4 42 volatile bool fn1_go = 0; // go-flag starts in disabled state
c_haarm 0:f7cd934498e4 43 volatile bool start = 0;
c_haarm 4:afab0fda2cf4 44 volatile bool meas = 0;
c_haarm 0:f7cd934498e4 45
c_haarm 0:f7cd934498e4 46 float fcs_read;
sdruiter 9:d9ba61ce7a29 47 float read_TC;
c_haarm 0:f7cd934498e4 48
c_haarm 0:f7cd934498e4 49 int trial_numb = 0;
c_haarm 0:f7cd934498e4 50 int cal_numb = 1;
c_haarm 0:f7cd934498e4 51
c_haarm 1:8b45b3ad350a 52 char filename_torque[64];
c_haarm 1:8b45b3ad350a 53 char filename_temp[64];
c_haarm 1:8b45b3ad350a 54 char filename_cal[64];
c_haarm 1:8b45b3ad350a 55
c_haarm 0:f7cd934498e4 56
c_haarm 0:f7cd934498e4 57
c_haarm 0:f7cd934498e4 58
c_haarm 0:f7cd934498e4 59 ////////////////////Functions///////////////////////////////////////////////////
c_haarm 0:f7cd934498e4 60 ////////////////////////////////////////////////////////////////////////////////
c_haarm 0:f7cd934498e4 61 ////////////////////////////////////////////////////////////////////////////////
c_haarm 0:f7cd934498e4 62
c_haarm 0:f7cd934498e4 63 void led_control(bool r, bool g, bool b) // control rgb LEDs
c_haarm 0:f7cd934498e4 64 {
c_haarm 0:f7cd934498e4 65 r_led.write(r);
c_haarm 0:f7cd934498e4 66 g_led.write(g);
c_haarm 0:f7cd934498e4 67 b_led.write(b);
c_haarm 0:f7cd934498e4 68 return;
c_haarm 0:f7cd934498e4 69 }
c_haarm 0:f7cd934498e4 70
c_haarm 0:f7cd934498e4 71 void fn1_activate() // function called by ticker every Ts seconds
c_haarm 0:f7cd934498e4 72 {
c_haarm 0:f7cd934498e4 73 fn1_go = 1; // go-flag active
c_haarm 0:f7cd934498e4 74 }
c_haarm 0:f7cd934498e4 75
c_haarm 4:afab0fda2cf4 76
c_haarm 1:8b45b3ad350a 77 void readTC()
c_haarm 1:8b45b3ad350a 78 {
c_haarm 5:f92906aaf1c2 79 //uses MAX31855 chip
c_haarm 5:f92906aaf1c2 80 //see https://datasheets.maximintegrated.com/en/ds/MAX31855.pdf for documentation
c_haarm 5:f92906aaf1c2 81
c_haarm 8:1326141017ea 82
c_haarm 8:1326141017ea 83 float d = 0;
c_haarm 8:1326141017ea 84 int16_t b[3] = {0,0,0};
c_haarm 8:1326141017ea 85
c_haarm 5:f92906aaf1c2 86 CS_1 = 0; //Active-Low Chip Select. Set CS low to enable the serial interface.
c_haarm 8:1326141017ea 87 wait_us(0.2);
c_haarm 8:1326141017ea 88
c_haarm 1:8b45b3ad350a 89 for (int i = 15; i >= 0; i--) {
c_haarm 5:f92906aaf1c2 90 SCK_1 = 0; //set clock value to 0
c_haarm 8:1326141017ea 91 wait_us(0.1); //wait for 100ns
c_haarm 5:f92906aaf1c2 92 SCK_1 = 1; //then set clock high again
c_haarm 8:1326141017ea 93 wait_us(0.1); //wait for 100ns
c_haarm 8:1326141017ea 94 for (int j = 0; j < 3; j++) { //read out bits for each thermocouple (0 to 11)
c_haarm 3:b525b7a56553 95 if (pins[j]) {
c_haarm 5:f92906aaf1c2 96 b[j] |= (1 << i); //bitshift
c_haarm 1:8b45b3ad350a 97 }
c_haarm 1:8b45b3ad350a 98 }
c_haarm 1:8b45b3ad350a 99 }
c_haarm 1:8b45b3ad350a 100
c_haarm 1:8b45b3ad350a 101 CS_1 = 1;
c_haarm 1:8b45b3ad350a 102
c_haarm 8:1326141017ea 103 for (int j = 0; j < 3; j++) { //for every thermocouple (starting from 0 to 11, so 12 in total)
c_haarm 5:f92906aaf1c2 104 if (b[j] & 0x1) { //b[j] contains the bits that are received from every chip. if least significant bit is 1, then open circuit.
c_haarm 1:8b45b3ad350a 105 b[j] = 20000;
c_haarm 1:8b45b3ad350a 106 } else {
c_haarm 5:f92906aaf1c2 107 b[j] &= 0xfffc; //if no fault then select 14 bit thermocouple data from bitstring
c_haarm 7:9f9ea047975d 108 d = b[j] / 16.0;
c_haarm 1:8b45b3ad350a 109 }
sdruiter 9:d9ba61ce7a29 110 fprintf(fp, "%.3f \n\r", d);
c_haarm 8:1326141017ea 111 pc.printf("%.3f\t", d);
c_haarm 1:8b45b3ad350a 112 }
sdruiter 9:d9ba61ce7a29 113 // pc.printf("\n\r");
sdruiter 9:d9ba61ce7a29 114 fprintf(fp, "\n\r");
c_haarm 4:afab0fda2cf4 115 return;
c_haarm 1:8b45b3ad350a 116
c_haarm 1:8b45b3ad350a 117 }
c_haarm 0:f7cd934498e4 118
c_haarm 4:afab0fda2cf4 119 void getsample(bool meas)
c_haarm 4:afab0fda2cf4 120 {
c_haarm 4:afab0fda2cf4 121 if(meas){ // alleen data uitlezen en opslaan als meas = 1
c_haarm 4:afab0fda2cf4 122 fcs_read = fcs.read(); // capture torque sensor data
sdruiter 9:d9ba61ce7a29 123 fprintf(fp, "%.3f\t", fcs_read); // output data to file
sdruiter 9:d9ba61ce7a29 124 // pc.printf("%.3f\t", fcs_read); // output data to screen
sdruiter 9:d9ba61ce7a29 125 read_TC = readTC(); // call function to read thermocouple data
sdruiter 9:d9ba61ce7a29 126 fprintf(fp,"%.3f\t", read_TC);
c_haarm 4:afab0fda2cf4 127 }
c_haarm 4:afab0fda2cf4 128 return;
c_haarm 4:afab0fda2cf4 129 }
c_haarm 4:afab0fda2cf4 130
c_haarm 4:afab0fda2cf4 131
c_haarm 0:f7cd934498e4 132 ////////////////////Main////////////////////////////////////////////////////////
c_haarm 0:f7cd934498e4 133 ////////////////////////////////////////////////////////////////////////////////
c_haarm 0:f7cd934498e4 134 ////////////////////////////////////////////////////////////////////////////////
c_haarm 0:f7cd934498e4 135
c_haarm 0:f7cd934498e4 136 int main()
c_haarm 0:f7cd934498e4 137 {
c_haarm 0:f7cd934498e4 138 pc.baud(baudrate);
c_haarm 0:f7cd934498e4 139 tick.attach(&fn1_activate,Ts);
c_haarm 0:f7cd934498e4 140 led_control(led_off,led_off,led_off); // start with LEDs off
c_haarm 8:1326141017ea 141
c_haarm 0:f7cd934498e4 142 while (1) {
c_haarm 0:f7cd934498e4 143 if(fn1_go) { // statements to execute when go-flag is active
c_haarm 0:f7cd934498e4 144 fn1_go = 0;
c_haarm 4:afab0fda2cf4 145 getsample(meas); // deze functie wordt elke ts seconde aangeroepen. afhankelijk van waarde meas (0 of 1) wordt de data opgeslagen in textfile
c_haarm 0:f7cd934498e4 146 }
c_haarm 0:f7cd934498e4 147
c_haarm 0:f7cd934498e4 148 if(pc.readable()) { // if character available
c_haarm 0:f7cd934498e4 149 switch(pc.getc()) { // read a character from keyboard
c_haarm 0:f7cd934498e4 150 case 'c':
c_haarm 1:8b45b3ad350a 151 led_control(led_on,led_on,led_off); //orange LED during calibration
c_haarm 1:8b45b3ad350a 152 sprintf(filename_cal, "/sd/cal_torque_%d.txt", cal_numb); //construct new textfile
sdruiter 9:d9ba61ce7a29 153 sprintf(filename_cal, "/sd/cal_temp_%d.txt", cal_numb);
c_haarm 1:8b45b3ad350a 154 fp = fopen(filename_cal, "w");
c_haarm 0:f7cd934498e4 155 if(fp == NULL) {
c_haarm 0:f7cd934498e4 156 error("Could not open file for write\n");
c_haarm 0:f7cd934498e4 157 } else {
c_haarm 0:f7cd934498e4 158 while(1) {
c_haarm 0:f7cd934498e4 159 for (int i = 0; i<50; i++) { //get 50 samples from torque sensor
c_haarm 0:f7cd934498e4 160 fcs_read = fcs.read();
c_haarm 0:f7cd934498e4 161 fprintf(fp, "%.3f\t \n\r", fcs_read); //output values to the screen
c_haarm 0:f7cd934498e4 162 }
c_haarm 0:f7cd934498e4 163 break;
c_haarm 0:f7cd934498e4 164 }
c_haarm 0:f7cd934498e4 165 }
c_haarm 0:f7cd934498e4 166 fclose(fp); //close file
sdruiter 9:d9ba61ce7a29 167
c_haarm 0:f7cd934498e4 168 cal_numb++; //increment calibration number
c_haarm 1:8b45b3ad350a 169 pc.printf("File saved as %s\n\r", filename_cal); //print name of calibration file to screen
c_haarm 0:f7cd934498e4 170 pc.printf("Press 'c' to record new calibration or 't' to start new trial\n\r"); // print message to screen
c_haarm 0:f7cd934498e4 171 break;
c_haarm 0:f7cd934498e4 172 case 't':
c_haarm 0:f7cd934498e4 173 trial_numb++;
c_haarm 0:f7cd934498e4 174 pc.printf("Trial number: %d\n\r", trial_numb);
c_haarm 0:f7cd934498e4 175 pc.printf("Press 's' to start measurement\n\r");
c_haarm 0:f7cd934498e4 176 break;
c_haarm 0:f7cd934498e4 177 case 's':
c_haarm 0:f7cd934498e4 178 start = !start;
c_haarm 0:f7cd934498e4 179 if (start) {
c_haarm 2:5c856ceaea2e 180 led_control(led_off,led_on,led_off); //green LED during measurement
c_haarm 0:f7cd934498e4 181 sprintf(filename_torque, "/sd/trial%d.txt", trial_numb); //construct new textfile to store data from torque sensor
sdruiter 9:d9ba61ce7a29 182 sprintf(filename_temp, "/sd/temp%d.txt", trial_numb);
c_haarm 0:f7cd934498e4 183 fp = fopen(filename_torque, "w");
sdruiter 9:d9ba61ce7a29 184 fp = fopen(filename_temp, "w");
sdruiter 9:d9ba61ce7a29 185
c_haarm 0:f7cd934498e4 186 if(fp == NULL) {
c_haarm 0:f7cd934498e4 187 error("Could not open file for write\n\r");
c_haarm 0:f7cd934498e4 188 } else {
c_haarm 0:f7cd934498e4 189 pc.printf("Measurement started... \n\r");
c_haarm 0:f7cd934498e4 190 pc.printf("Press 's' to stop measurement\n\r");
c_haarm 4:afab0fda2cf4 191 meas = 1; // hiermee zorg je dat de functie getsample de data wegschrijft naar het .txt file
c_haarm 0:f7cd934498e4 192 }
c_haarm 0:f7cd934498e4 193 break;
c_haarm 0:f7cd934498e4 194 } else {
c_haarm 0:f7cd934498e4 195 led_control(led_on,led_off,led_off); // RED LED when ready to stopped measuring
c_haarm 4:afab0fda2cf4 196 meas = 0; // hiermee stop je de output naar het .txt file
c_haarm 0:f7cd934498e4 197 fclose(fp);
sdruiter 9:d9ba61ce7a29 198
c_haarm 0:f7cd934498e4 199 pc.printf("File saved as %s\n\r", filename_torque); // print filename to screen
c_haarm 1:8b45b3ad350a 200 pc.printf("Press 'c' to perform new calibration or 't' to start new trial\n\r"); // print message to screen
c_haarm 0:f7cd934498e4 201
c_haarm 0:f7cd934498e4 202 }
c_haarm 0:f7cd934498e4 203 break;
c_haarm 0:f7cd934498e4 204 }
c_haarm 0:f7cd934498e4 205 }
c_haarm 0:f7cd934498e4 206 }
c_haarm 0:f7cd934498e4 207 }