Comments added
Dependencies: Peripherals Buffer_lib_v2 SD_Lib_EffedUP_ERP Time_Lib_v2 Year3_Version5 BMP280 Network_Lib TextLCD BME280
main.cpp@4:da63962bc0f1, 2018-11-14 (annotated)
- Committer:
- emilytrembeth
- Date:
- Wed Nov 14 15:36:13 2018 +0000
- Revision:
- 4:da63962bc0f1
- Parent:
- 3:ef46c1ddefed
- Child:
- 5:60e116a1e913
Threads for sensor data and the date and time.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
noutram | 0:90e393878517 | 1 | #include "mbed.h" |
emilytrembeth | 4:da63962bc0f1 | 2 | #include "TextLCD.h" |
emilytrembeth | 4:da63962bc0f1 | 3 | #include "SDBlockDevice.h" |
emilytrembeth | 4:da63962bc0f1 | 4 | #include "FATFileSystem.h" |
emilytrembeth | 4:da63962bc0f1 | 5 | #include "sample_hardware.hpp" |
noutram | 0:90e393878517 | 6 | |
noutram | 0:90e393878517 | 7 | //Function declarations |
emilytrembeth | 4:da63962bc0f1 | 8 | void displayOnLcd(); |
emilytrembeth | 4:da63962bc0f1 | 9 | void updateRealTimeClock(char *buffer); |
emilytrembeth | 4:da63962bc0f1 | 10 | void getLineFromSerial(char *keyBuffer, int bufferLength); |
emilytrembeth | 4:da63962bc0f1 | 11 | void displayMessageOnConsole(); |
noutram | 1:948bd552a2a2 | 12 | void Function1(); |
noutram | 1:948bd552a2a2 | 13 | void Function2(); |
noutram | 0:90e393878517 | 14 | |
emilytrembeth | 4:da63962bc0f1 | 15 | TextLCD lcd(D9, D8, D7, D6, D4, D2); // rs, e, d4-d7 |
emilytrembeth | 4:da63962bc0f1 | 16 | SDBlockDevice sd(PB_5, D12, D13, D10); // mosi, miso, sclk, cs |
emilytrembeth | 4:da63962bc0f1 | 17 | Serial pc(SERIAL_TX, SERIAL_RX); |
emilytrembeth | 4:da63962bc0f1 | 18 | time_t currentTime; |
emilytrembeth | 4:da63962bc0f1 | 19 | char lcdBuffer[32]; |
emilytrembeth | 4:da63962bc0f1 | 20 | DigitalOut myled(LED1); |
emilytrembeth | 4:da63962bc0f1 | 21 | Ticker ticker; |
emilytrembeth | 4:da63962bc0f1 | 22 | DigitalIn SWUser(USER_BUTTON); |
emilytrembeth | 4:da63962bc0f1 | 23 | Mutex date_mutex; |
noutram | 0:90e393878517 | 24 | |
noutram | 1:948bd552a2a2 | 25 | Thread t1; |
noutram | 1:948bd552a2a2 | 26 | Thread t2; |
emilytrembeth | 4:da63962bc0f1 | 27 | |
emilytrembeth | 4:da63962bc0f1 | 28 | |
emilytrembeth | 4:da63962bc0f1 | 29 | void displayOnLcd() { |
emilytrembeth | 4:da63962bc0f1 | 30 | date_mutex.lock(); |
emilytrembeth | 4:da63962bc0f1 | 31 | |
emilytrembeth | 4:da63962bc0f1 | 32 | myled = !myled; |
emilytrembeth | 4:da63962bc0f1 | 33 | |
emilytrembeth | 4:da63962bc0f1 | 34 | currentTime = time(NULL); |
emilytrembeth | 4:da63962bc0f1 | 35 | strftime(lcdBuffer, 32, "%Y/%m/%d %H:%M:%S", localtime(¤tTime)); |
emilytrembeth | 4:da63962bc0f1 | 36 | |
emilytrembeth | 4:da63962bc0f1 | 37 | //lcd.cls(); |
emilytrembeth | 4:da63962bc0f1 | 38 | //lcd.locate(0,0); |
emilytrembeth | 4:da63962bc0f1 | 39 | pc.printf("%s\n\r", lcdBuffer); |
emilytrembeth | 4:da63962bc0f1 | 40 | |
emilytrembeth | 4:da63962bc0f1 | 41 | myled = !myled; |
emilytrembeth | 4:da63962bc0f1 | 42 | date_mutex.unlock(); |
emilytrembeth | 4:da63962bc0f1 | 43 | }; |
noutram | 0:90e393878517 | 44 | |
emilytrembeth | 4:da63962bc0f1 | 45 | void updateRealTimeClock(char *buffer) { |
emilytrembeth | 4:da63962bc0f1 | 46 | date_mutex.lock(); |
emilytrembeth | 4:da63962bc0f1 | 47 | |
emilytrembeth | 4:da63962bc0f1 | 48 | char *tp; |
emilytrembeth | 4:da63962bc0f1 | 49 | char *timeArray[6]; |
emilytrembeth | 4:da63962bc0f1 | 50 | int arrayIndex; |
emilytrembeth | 4:da63962bc0f1 | 51 | struct tm struct_time; |
emilytrembeth | 4:da63962bc0f1 | 52 | |
emilytrembeth | 4:da63962bc0f1 | 53 | // extract number from string |
emilytrembeth | 4:da63962bc0f1 | 54 | arrayIndex = 0; |
emilytrembeth | 4:da63962bc0f1 | 55 | tp = strtok( buffer, " /:-" ); |
emilytrembeth | 4:da63962bc0f1 | 56 | timeArray[arrayIndex++] = tp; |
emilytrembeth | 4:da63962bc0f1 | 57 | printf("%d ", atoi(tp)); |
emilytrembeth | 4:da63962bc0f1 | 58 | while ( tp != NULL && arrayIndex < 6 ) { |
emilytrembeth | 4:da63962bc0f1 | 59 | tp = strtok( NULL," /:-" ); |
emilytrembeth | 4:da63962bc0f1 | 60 | timeArray[arrayIndex++] = tp; |
emilytrembeth | 4:da63962bc0f1 | 61 | if ( tp != NULL ) { |
emilytrembeth | 4:da63962bc0f1 | 62 | printf("%d ", atoi(tp)); |
emilytrembeth | 4:da63962bc0f1 | 63 | } |
emilytrembeth | 4:da63962bc0f1 | 64 | } |
emilytrembeth | 4:da63962bc0f1 | 65 | printf("\r\n"); |
emilytrembeth | 4:da63962bc0f1 | 66 | |
emilytrembeth | 4:da63962bc0f1 | 67 | // store number into time struct |
emilytrembeth | 4:da63962bc0f1 | 68 | struct_time.tm_year = atoi(timeArray[0]) - 1900; |
emilytrembeth | 4:da63962bc0f1 | 69 | struct_time.tm_mon = atoi(timeArray[1]) - 1; |
emilytrembeth | 4:da63962bc0f1 | 70 | struct_time.tm_mday = atoi(timeArray[2]); |
emilytrembeth | 4:da63962bc0f1 | 71 | struct_time.tm_hour = atoi(timeArray[3]); |
emilytrembeth | 4:da63962bc0f1 | 72 | struct_time.tm_min = atoi(timeArray[4]); |
emilytrembeth | 4:da63962bc0f1 | 73 | struct_time.tm_sec = atoi(timeArray[5]); |
emilytrembeth | 4:da63962bc0f1 | 74 | |
emilytrembeth | 4:da63962bc0f1 | 75 | currentTime = mktime(&struct_time); |
emilytrembeth | 4:da63962bc0f1 | 76 | set_time(currentTime); |
emilytrembeth | 4:da63962bc0f1 | 77 | |
emilytrembeth | 4:da63962bc0f1 | 78 | date_mutex.unlock(); |
emilytrembeth | 4:da63962bc0f1 | 79 | } |
emilytrembeth | 4:da63962bc0f1 | 80 | |
emilytrembeth | 4:da63962bc0f1 | 81 | void getLineFromSerial(char *keyBuffer, int bufferLength) |
emilytrembeth | 4:da63962bc0f1 | 82 | { |
emilytrembeth | 4:da63962bc0f1 | 83 | date_mutex.lock(); |
emilytrembeth | 4:da63962bc0f1 | 84 | |
emilytrembeth | 4:da63962bc0f1 | 85 | char c; |
emilytrembeth | 4:da63962bc0f1 | 86 | int index = 0; |
emilytrembeth | 4:da63962bc0f1 | 87 | |
emilytrembeth | 4:da63962bc0f1 | 88 | for (;;) { |
emilytrembeth | 4:da63962bc0f1 | 89 | // break if keyBuffer is full |
emilytrembeth | 4:da63962bc0f1 | 90 | if (index >= bufferLength) { |
emilytrembeth | 4:da63962bc0f1 | 91 | break; |
emilytrembeth | 4:da63962bc0f1 | 92 | } |
emilytrembeth | 4:da63962bc0f1 | 93 | |
emilytrembeth | 4:da63962bc0f1 | 94 | // read input |
emilytrembeth | 4:da63962bc0f1 | 95 | c = pc.getc(); |
emilytrembeth | 4:da63962bc0f1 | 96 | //printf(" %d ", c); |
emilytrembeth | 4:da63962bc0f1 | 97 | pc.putc(c); |
emilytrembeth | 4:da63962bc0f1 | 98 | |
emilytrembeth | 4:da63962bc0f1 | 99 | // break if end |
emilytrembeth | 4:da63962bc0f1 | 100 | if (c == '\r') { |
emilytrembeth | 4:da63962bc0f1 | 101 | keyBuffer[index++] = c; |
emilytrembeth | 4:da63962bc0f1 | 102 | printf("\n"); |
emilytrembeth | 4:da63962bc0f1 | 103 | break; |
emilytrembeth | 4:da63962bc0f1 | 104 | } |
emilytrembeth | 4:da63962bc0f1 | 105 | |
emilytrembeth | 4:da63962bc0f1 | 106 | // store in keyBuffer |
emilytrembeth | 4:da63962bc0f1 | 107 | keyBuffer[index++] = c; |
emilytrembeth | 4:da63962bc0f1 | 108 | |
emilytrembeth | 4:da63962bc0f1 | 109 | date_mutex.unlock(); |
emilytrembeth | 4:da63962bc0f1 | 110 | } |
emilytrembeth | 4:da63962bc0f1 | 111 | } |
emilytrembeth | 4:da63962bc0f1 | 112 | |
emilytrembeth | 4:da63962bc0f1 | 113 | void displayMessageOnConsole() { |
emilytrembeth | 4:da63962bc0f1 | 114 | date_mutex.lock(); |
emilytrembeth | 4:da63962bc0f1 | 115 | |
emilytrembeth | 4:da63962bc0f1 | 116 | currentTime = time(NULL); |
emilytrembeth | 4:da63962bc0f1 | 117 | strftime(lcdBuffer, 32, "%Y/%m/%d %H:%M:%S", localtime(¤tTime)); |
emilytrembeth | 4:da63962bc0f1 | 118 | |
emilytrembeth | 4:da63962bc0f1 | 119 | printf("Current Time:%s\r\n", lcdBuffer); |
emilytrembeth | 4:da63962bc0f1 | 120 | printf("Enter new Time (YYYY/mm/dd HH:MM:SS)\r\n"); |
emilytrembeth | 4:da63962bc0f1 | 121 | |
emilytrembeth | 4:da63962bc0f1 | 122 | date_mutex.unlock(); |
emilytrembeth | 4:da63962bc0f1 | 123 | } |
emilytrembeth | 4:da63962bc0f1 | 124 | |
noutram | 0:90e393878517 | 125 | |
noutram | 1:948bd552a2a2 | 126 | void Function1() |
noutram | 0:90e393878517 | 127 | { |
emilytrembeth | 4:da63962bc0f1 | 128 | while (true) { |
emilytrembeth | 4:da63962bc0f1 | 129 | double temp = sensor.getTemperature(); |
emilytrembeth | 4:da63962bc0f1 | 130 | double pressure = sensor.getPressure(); |
emilytrembeth | 4:da63962bc0f1 | 131 | lcd.cls(); |
emilytrembeth | 4:da63962bc0f1 | 132 | lcd.printf("Temp Pressure\n"); |
emilytrembeth | 4:da63962bc0f1 | 133 | lcd.printf("%6.1f ",temp); |
emilytrembeth | 4:da63962bc0f1 | 134 | lcd.printf("%.2f\n",pressure); |
emilytrembeth | 4:da63962bc0f1 | 135 | |
emilytrembeth | 4:da63962bc0f1 | 136 | //Write to SD |
emilytrembeth | 4:da63962bc0f1 | 137 | //fprintf(fp, "%6.1f,%.2f\n\r", temp, pressure); |
emilytrembeth | 4:da63962bc0f1 | 138 | |
emilytrembeth | 4:da63962bc0f1 | 139 | Thread::wait(15000); //Updates the state every 15 seconds |
emilytrembeth | 4:da63962bc0f1 | 140 | } |
noutram | 0:90e393878517 | 141 | } |
noutram | 0:90e393878517 | 142 | |
noutram | 1:948bd552a2a2 | 143 | void Function2() |
noutram | 0:90e393878517 | 144 | { |
emilytrembeth | 4:da63962bc0f1 | 145 | while (true) { |
emilytrembeth | 4:da63962bc0f1 | 146 | char lineBuffer[32]; |
emilytrembeth | 4:da63962bc0f1 | 147 | char *pointer; |
emilytrembeth | 4:da63962bc0f1 | 148 | pointer = lineBuffer; |
emilytrembeth | 4:da63962bc0f1 | 149 | // show initial message on console |
emilytrembeth | 4:da63962bc0f1 | 150 | displayMessageOnConsole(); |
emilytrembeth | 4:da63962bc0f1 | 151 | |
emilytrembeth | 4:da63962bc0f1 | 152 | // get input from console |
emilytrembeth | 4:da63962bc0f1 | 153 | getLineFromSerial(pointer, sizeof(lineBuffer)); |
emilytrembeth | 4:da63962bc0f1 | 154 | |
emilytrembeth | 4:da63962bc0f1 | 155 | myled = !myled; |
emilytrembeth | 4:da63962bc0f1 | 156 | // update RTC based on input value |
emilytrembeth | 4:da63962bc0f1 | 157 | updateRealTimeClock(pointer); |
emilytrembeth | 4:da63962bc0f1 | 158 | while(true) { |
emilytrembeth | 4:da63962bc0f1 | 159 | displayOnLcd(); |
emilytrembeth | 4:da63962bc0f1 | 160 | myled = !myled; |
emilytrembeth | 4:da63962bc0f1 | 161 | Thread::wait(1000); |
emilytrembeth | 4:da63962bc0f1 | 162 | } |
noutram | 0:90e393878517 | 163 | } |
emilytrembeth | 4:da63962bc0f1 | 164 | |
emilytrembeth | 4:da63962bc0f1 | 165 | } |
noutram | 0:90e393878517 | 166 | |
noutram | 0:90e393878517 | 167 | //Main thread |
noutram | 0:90e393878517 | 168 | int main() { |
emilytrembeth | 4:da63962bc0f1 | 169 | |
emilytrembeth | 4:da63962bc0f1 | 170 | lcd.printf("Press a Switch\n\n"); |
emilytrembeth | 4:da63962bc0f1 | 171 | |
emilytrembeth | 4:da63962bc0f1 | 172 | post(); |
noutram | 0:90e393878517 | 173 | |
emilytrembeth | 4:da63962bc0f1 | 174 | //Initialise the SD card |
emilytrembeth | 4:da63962bc0f1 | 175 | if ( sd.init() != 0) { |
emilytrembeth | 4:da63962bc0f1 | 176 | printf("Init failed \n"); |
emilytrembeth | 4:da63962bc0f1 | 177 | errorCode(FATAL); |
emilytrembeth | 4:da63962bc0f1 | 178 | } |
emilytrembeth | 4:da63962bc0f1 | 179 | |
emilytrembeth | 4:da63962bc0f1 | 180 | //Create a filing system for SD Card |
emilytrembeth | 4:da63962bc0f1 | 181 | FATFileSystem fs("sd", &sd); |
emilytrembeth | 4:da63962bc0f1 | 182 | |
emilytrembeth | 4:da63962bc0f1 | 183 | //Open to WRITE |
emilytrembeth | 4:da63962bc0f1 | 184 | FILE* fp = fopen("/sd/test.csv","a"); |
emilytrembeth | 4:da63962bc0f1 | 185 | if (fp == NULL) { |
emilytrembeth | 4:da63962bc0f1 | 186 | error("Could not open file for write\n"); |
emilytrembeth | 4:da63962bc0f1 | 187 | errorCode(FATAL); |
emilytrembeth | 4:da63962bc0f1 | 188 | } |
noutram | 0:90e393878517 | 189 | |
noutram | 1:948bd552a2a2 | 190 | // run threads |
noutram | 1:948bd552a2a2 | 191 | t1.start(Function1); |
noutram | 1:948bd552a2a2 | 192 | t2.start(Function2); |
emilytrembeth | 4:da63962bc0f1 | 193 | |
emilytrembeth | 4:da63962bc0f1 | 194 | } |
noutram | 0:90e393878517 | 195 | |
emilytrembeth | 4:da63962bc0f1 | 196 |