Slow SD Logger

Dependencies:   Adafruit_RTCLib BNO055 SDFileSystem_SlowLogger analoghalls mbed

Fork of analoghalls by Bayley Wang

Committer:
bwang
Date:
Sun Apr 22 21:40:44 2018 +0000
Revision:
8:ff3aa422dbf0
Parent:
7:1a5039c49f5d
Publishing

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nki 0:9753f3c2e5ca 1 #include "mbed.h"
bwang 5:6da98f3faf33 2 #include "SDFileSystem.h"
bwang 5:6da98f3faf33 3 #include "DS1307.h"
bwang 5:6da98f3faf33 4 #include "BNO055.h"
bwang 5:6da98f3faf33 5 #include "string.h"
bwang 2:b5c19d4eddcc 6
bwang 5:6da98f3faf33 7 #define M_PI 3.1415927f
bwang 5:6da98f3faf33 8
bwang 5:6da98f3faf33 9 #define DI D11
bwang 5:6da98f3faf33 10 #define DO D12
bwang 5:6da98f3faf33 11 #define SCK D13
bwang 5:6da98f3faf33 12 #define CS D10
bwang 5:6da98f3faf33 13
bwang 5:6da98f3faf33 14 #define I2C1_SDA PB_9
bwang 5:6da98f3faf33 15 #define I2C1_SCL PB_8
bwang 2:b5c19d4eddcc 16
bwang 5:6da98f3faf33 17 #define I2C2_SDA D5
bwang 5:6da98f3faf33 18 #define I2C2_SCL D7
bwang 5:6da98f3faf33 19
bwang 7:1a5039c49f5d 20 #define PAGE_SIZE 4096
bwang 5:6da98f3faf33 21 #define clip(a) if ((a > 254)) a = 254
nki 0:9753f3c2e5ca 22
bwang 5:6da98f3faf33 23 PwmOut pwm_r(D4);
bwang 5:6da98f3faf33 24 PwmOut pwm_g(D6);
bwang 5:6da98f3faf33 25 PwmOut pwm_b(D3);
nki 0:9753f3c2e5ca 26
bwang 5:6da98f3faf33 27 char fname[255];
bwang 5:6da98f3faf33 28 char current_time[64];
nki 0:9753f3c2e5ca 29
bwang 5:6da98f3faf33 30 unsigned char buf[PAGE_SIZE];
bwang 5:6da98f3faf33 31 int buf_idx = 0;
nki 0:9753f3c2e5ca 32
bwang 5:6da98f3faf33 33 void printDT(char *pre, DateTime &dt)
bwang 5:6da98f3faf33 34 {
bwang 5:6da98f3faf33 35 printf("%s %u/%u/%02u %2u:%02u:%02u\r\n"
bwang 5:6da98f3faf33 36 ,pre
bwang 5:6da98f3faf33 37 ,dt.month(),dt.day(),dt.year()
bwang 5:6da98f3faf33 38 ,dt.hour(),dt.minute(),dt.second()
bwang 5:6da98f3faf33 39 );
bwang 5:6da98f3faf33 40 }
nki 0:9753f3c2e5ca 41
bwang 5:6da98f3faf33 42 bool rtcUpdate(RtcDs1307 &rtc, int32_t bias) // this must be signed
bwang 5:6da98f3faf33 43 { bool bUpdated = false;
bwang 5:6da98f3faf33 44
bwang 5:6da98f3faf33 45 // Use the compiled date/time as a basis for setting the clock.
bwang 5:6da98f3faf33 46 // We assign it to a signed integer so that negative biases work correctly
bwang 5:6da98f3faf33 47 int64_t compiledTime = DateTime(__DATE__,__TIME__).unixtime();
bwang 5:6da98f3faf33 48
bwang 5:6da98f3faf33 49 // This assumes that the program is run VERY soon after the initial compile.
bwang 5:6da98f3faf33 50 time_t localt = DateTime(compiledTime + bias).unixtime(); // offset by bias
bwang 5:6da98f3faf33 51
bwang 5:6da98f3faf33 52 // If the stored static time stamp does not equal the compiled time stamp,
bwang 5:6da98f3faf33 53 // then we need to update the RTC clock and the stored time stamp
bwang 5:6da98f3faf33 54 if(*((time_t *)&rtc[0]) != localt)
bwang 5:6da98f3faf33 55 {
bwang 5:6da98f3faf33 56 // Update the RTC time as local time, not GMT/UTC
bwang 5:6da98f3faf33 57 rtc.adjust(localt);
bwang 5:6da98f3faf33 58 // Store the new compiled time statically in the object ram image
bwang 5:6da98f3faf33 59 *((time_t *)&rtc[0]) = localt;
bwang 5:6da98f3faf33 60 // Push the object ram image to the RTC ram image
bwang 5:6da98f3faf33 61 bUpdated = rtc.commit();
bwang 5:6da98f3faf33 62 }
bwang 5:6da98f3faf33 63
bwang 5:6da98f3faf33 64 return bUpdated;
bwang 5:6da98f3faf33 65 }
nki 0:9753f3c2e5ca 66
bwang 4:f18f6bc5e1fd 67 int main() {
bwang 5:6da98f3faf33 68 printf("%s\n", "Manworm's High-Speed Logger");
bwang 5:6da98f3faf33 69
bwang 5:6da98f3faf33 70 /*init RGB lights*/
bwang 5:6da98f3faf33 71 pwm_r.period(0.01);
bwang 5:6da98f3faf33 72 pwm_g.period(0.01);
bwang 5:6da98f3faf33 73 pwm_b.period(0.01);
bwang 5:6da98f3faf33 74
bwang 5:6da98f3faf33 75 pwm_r = 0.0f;
bwang 5:6da98f3faf33 76 pwm_g = 0.0f;
bwang 5:6da98f3faf33 77 pwm_b = 0.0f;
bwang 5:6da98f3faf33 78
bwang 5:6da98f3faf33 79 /*wait for SD card to be inserted*/
bwang 5:6da98f3faf33 80 SDFileSystem sd(DI, DO, SCK, CS, "sd");
bwang 5:6da98f3faf33 81 while (sd.disk_status()) {
bwang 5:6da98f3faf33 82 sd.disk_initialize();
bwang 5:6da98f3faf33 83 wait(0.5);
bwang 5:6da98f3faf33 84 }
bwang 5:6da98f3faf33 85
bwang 5:6da98f3faf33 86 /*init RTC, get time and date for filename*/
bwang 5:6da98f3faf33 87 I2C i2c1(I2C1_SDA, I2C1_SCL);
bwang 5:6da98f3faf33 88 i2c1.frequency(100000);
bwang 5:6da98f3faf33 89 RtcDs1307 rtc(i2c1);
bwang 5:6da98f3faf33 90
bwang 5:6da98f3faf33 91 rtcUpdate(rtc, -(5*60*60));
bwang 5:6da98f3faf33 92 DateTime dt = rtc.now();
bwang 5:6da98f3faf33 93 printDT("It is now", dt);
bwang 5:6da98f3faf33 94
bwang 5:6da98f3faf33 95 strcpy(fname, "/sd/log_");
bwang 5:6da98f3faf33 96 sprintf(current_time, "%u.%u.%02u_%02u.%02u.%02u"
bwang 5:6da98f3faf33 97 ,dt.month(),dt.day(),dt.year()
bwang 5:6da98f3faf33 98 ,dt.hour(),dt.minute(),dt.second()
bwang 5:6da98f3faf33 99 );
bwang 5:6da98f3faf33 100 strcat(fname, current_time);
bwang 5:6da98f3faf33 101 strcat(fname, ".csv");
bwang 5:6da98f3faf33 102 printf("Logging to %s\n", fname);
bwang 5:6da98f3faf33 103
bwang 5:6da98f3faf33 104 FILE *fp = fopen(fname, "w");
nki 0:9753f3c2e5ca 105
bwang 5:6da98f3faf33 106 /*init IMU*/
bwang 5:6da98f3faf33 107 BNO055 imu(I2C2_SDA, I2C2_SCL);
bwang 5:6da98f3faf33 108 imu.reset();
bwang 5:6da98f3faf33 109 if (!imu.check()) {
bwang 5:6da98f3faf33 110 printf("%s\n", "IMU not ready");
bwang 5:6da98f3faf33 111 } else {
bwang 5:6da98f3faf33 112 printf("BNO055 found\r\n\r\n");
bwang 5:6da98f3faf33 113 printf("Chip ID: %03d\r\n",imu.ID.id);
bwang 5:6da98f3faf33 114 printf("Accelerometer ID: %03d\r\n",imu.ID.accel);
bwang 5:6da98f3faf33 115 printf("Gyroscope ID: %03d\r\n",imu.ID.gyro);
bwang 5:6da98f3faf33 116 printf("Magnetometer ID: %03d\r\n\r\n",imu.ID.mag);
bwang 5:6da98f3faf33 117 printf("Firmware version v%d.%0d\r\n",imu.ID.sw[0],imu.ID.sw[1]);
bwang 5:6da98f3faf33 118 printf("Bootloader version v%d\r\n\r\n",imu.ID.bootload);
nki 0:9753f3c2e5ca 119 }
bwang 5:6da98f3faf33 120 imu.setmode(OPERATION_MODE_NDOF);
bwang 5:6da98f3faf33 121 imu.set_accel_units(MPERSPERS);
bwang 5:6da98f3faf33 122
bwang 7:1a5039c49f5d 123 float theta = 0.0f;
bwang 7:1a5039c49f5d 124 int tics = 0;
bwang 5:6da98f3faf33 125 for (;;) {
bwang 5:6da98f3faf33 126 float r, g, b;
bwang 5:6da98f3faf33 127 r = sinf(theta);
bwang 5:6da98f3faf33 128 g = sinf(theta + 2 * M_PI / 3);
bwang 5:6da98f3faf33 129 b = sinf(theta - 2 * M_PI / 3);
bwang 5:6da98f3faf33 130
bwang 5:6da98f3faf33 131 pwm_r = 0.5f + 0.5f * r;
bwang 5:6da98f3faf33 132 pwm_g = 0.5f + 0.5f * g;
bwang 5:6da98f3faf33 133 pwm_b = 0.5f + 0.5f * b;
bwang 5:6da98f3faf33 134
bwang 5:6da98f3faf33 135 theta += 0.001f;
bwang 5:6da98f3faf33 136 if (theta > 2 * M_PI) theta -= 2 * M_PI;
bwang 5:6da98f3faf33 137
bwang 5:6da98f3faf33 138 tics++;
bwang 5:6da98f3faf33 139 if (tics % 100 == 0) {
bwang 5:6da98f3faf33 140 tics = 0;
bwang 5:6da98f3faf33 141
bwang 5:6da98f3faf33 142 imu.get_accel();
bwang 5:6da98f3faf33 143 fprintf(fp, "%d,%d,%d\n",(int) (100*imu.accel.x),(int)(100*imu.accel.y),(int)(100*imu.accel.z));
bwang 5:6da98f3faf33 144 fflush(fp);
bwang 5:6da98f3faf33 145 }
bwang 5:6da98f3faf33 146 wait(0.001);
bwang 3:86ccde39f61b 147 }
bwang 5:6da98f3faf33 148 }