Code for Technion Formula car sensors reader
Dependencies: mbed Buffer FATFileSystem
Fork of SX1272PingPong by
This is code is part of a Technion course project in advanced IoT, implementing a device to read and transmit sensors data from a Formula racing car built by students at Technion - Israel Institute of Technology.
How to install
- Create an account on Mbed: https://os.mbed.com/account/signup/
- Import project into Compiler
- In the Program Workspace select "Formula_Nucleo_Reader"
- Select a Platform like so:
- Click button at top-left
- Add Board
- Search "NUCLEO F103RB" and then "Add to your Mbed Compiler"
- Finally click "Compile", if the build was successful, the binary would download automatically
- To install it on device simply plug it in to a PC, open device drive and drag then drop binary file in it
DS3231/DS3231.h@15:2e0d977dbb31, 2018-05-17 (annotated)
- Committer:
- wardm
- Date:
- Thu May 17 20:37:41 2018 +0000
- Revision:
- 15:2e0d977dbb31
V1.0.0
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
wardm | 15:2e0d977dbb31 | 1 | /** mbded library for driving the PMAXIM DS3231 Real Time Clock |
wardm | 15:2e0d977dbb31 | 2 | * datasheet link : http://datasheets.maximintegrated.com/en/ds/DS3231.pdf |
wardm | 15:2e0d977dbb31 | 3 | * breakout : MACETECH ChronoDot V2.1 High Precision RTC |
wardm | 15:2e0d977dbb31 | 4 | * remi cormier 2012 |
wardm | 15:2e0d977dbb31 | 5 | * WARNING : sda and sdl should be pulled up with 2.2k resistor |
wardm | 15:2e0d977dbb31 | 6 | */ |
wardm | 15:2e0d977dbb31 | 7 | |
wardm | 15:2e0d977dbb31 | 8 | /** Example code |
wardm | 15:2e0d977dbb31 | 9 | * @code |
wardm | 15:2e0d977dbb31 | 10 | // DS3231 Library test program |
wardm | 15:2e0d977dbb31 | 11 | // remi cormier 2012 |
wardm | 15:2e0d977dbb31 | 12 | |
wardm | 15:2e0d977dbb31 | 13 | #include "mbed.h" |
wardm | 15:2e0d977dbb31 | 14 | #include "DS3231.h" |
wardm | 15:2e0d977dbb31 | 15 | |
wardm | 15:2e0d977dbb31 | 16 | Serial pc(USBTX, USBRX); |
wardm | 15:2e0d977dbb31 | 17 | |
wardm | 15:2e0d977dbb31 | 18 | int hour; |
wardm | 15:2e0d977dbb31 | 19 | int minute; |
wardm | 15:2e0d977dbb31 | 20 | int second; |
wardm | 15:2e0d977dbb31 | 21 | |
wardm | 15:2e0d977dbb31 | 22 | int dayOfWeek; |
wardm | 15:2e0d977dbb31 | 23 | int date; |
wardm | 15:2e0d977dbb31 | 24 | int month; |
wardm | 15:2e0d977dbb31 | 25 | int year; |
wardm | 15:2e0d977dbb31 | 26 | |
wardm | 15:2e0d977dbb31 | 27 | DS3231 RTC(p28,p27); |
wardm | 15:2e0d977dbb31 | 28 | |
wardm | 15:2e0d977dbb31 | 29 | |
wardm | 15:2e0d977dbb31 | 30 | int main() |
wardm | 15:2e0d977dbb31 | 31 | {printf("\r\n\nDS3231 Library test program\r\nremi cormier 2012\r\n\n"); |
wardm | 15:2e0d977dbb31 | 32 | |
wardm | 15:2e0d977dbb31 | 33 | RTC.setI2Cfrequency(400000); |
wardm | 15:2e0d977dbb31 | 34 | |
wardm | 15:2e0d977dbb31 | 35 | //RTC.writeRegister(DS3231_Aging_Offset,0); // uncomment to set Aging Offset 1LSB = approx. 0.1 ppm according from datasheet = 0.05 ppm @ 21 °C from my measurments |
wardm | 15:2e0d977dbb31 | 36 | |
wardm | 15:2e0d977dbb31 | 37 | RTC.convertTemperature(); |
wardm | 15:2e0d977dbb31 | 38 | |
wardm | 15:2e0d977dbb31 | 39 | int reg=RTC.readRegister(DS3231_Aging_Offset); |
wardm | 15:2e0d977dbb31 | 40 | if (reg>127) |
wardm | 15:2e0d977dbb31 | 41 | {reg=reg-256;} |
wardm | 15:2e0d977dbb31 | 42 | pc.printf("Aging offset : %i\r\n",reg); |
wardm | 15:2e0d977dbb31 | 43 | |
wardm | 15:2e0d977dbb31 | 44 | pc.printf("OSF flag : %i",RTC.OSF()); |
wardm | 15:2e0d977dbb31 | 45 | pc.printf("\r\n"); |
wardm | 15:2e0d977dbb31 | 46 | |
wardm | 15:2e0d977dbb31 | 47 | RTC.readDate(&date,&month,&year); |
wardm | 15:2e0d977dbb31 | 48 | pc.printf("date : %02i-%02i-%02i",date,month,year); |
wardm | 15:2e0d977dbb31 | 49 | pc.printf("\r\n"); |
wardm | 15:2e0d977dbb31 | 50 | |
wardm | 15:2e0d977dbb31 | 51 | //RTC.setTime(19,48,45); // uncomment to set time |
wardm | 15:2e0d977dbb31 | 52 | |
wardm | 15:2e0d977dbb31 | 53 | RTC.readTime(&hour,&minute,&second); |
wardm | 15:2e0d977dbb31 | 54 | pc.printf("time : %02i:%02i:%02i",hour,minute,second); |
wardm | 15:2e0d977dbb31 | 55 | pc.printf("\r\n"); |
wardm | 15:2e0d977dbb31 | 56 | |
wardm | 15:2e0d977dbb31 | 57 | //RTC.setDate(6,22,12,2012); // uncomment to set date |
wardm | 15:2e0d977dbb31 | 58 | |
wardm | 15:2e0d977dbb31 | 59 | RTC.readDateTime(&dayOfWeek,&date,&month,&year,&hour,&minute,&second); |
wardm | 15:2e0d977dbb31 | 60 | pc.printf("date time : %i / %02i-%02i-%02i %02i:%02i:%02i",dayOfWeek,date,month,year,hour,minute,second); |
wardm | 15:2e0d977dbb31 | 61 | pc.printf("\r\n"); |
wardm | 15:2e0d977dbb31 | 62 | |
wardm | 15:2e0d977dbb31 | 63 | pc.printf("temperature :%6.2f",RTC.readTemp()); |
wardm | 15:2e0d977dbb31 | 64 | pc.printf("\r\n"); |
wardm | 15:2e0d977dbb31 | 65 | } |
wardm | 15:2e0d977dbb31 | 66 | * @endcode |
wardm | 15:2e0d977dbb31 | 67 | */ |
wardm | 15:2e0d977dbb31 | 68 | |
wardm | 15:2e0d977dbb31 | 69 | |
wardm | 15:2e0d977dbb31 | 70 | #include "mbed.h" |
wardm | 15:2e0d977dbb31 | 71 | |
wardm | 15:2e0d977dbb31 | 72 | #ifndef MBED_DS3231_H |
wardm | 15:2e0d977dbb31 | 73 | #define MBED_DS3231_H |
wardm | 15:2e0d977dbb31 | 74 | |
wardm | 15:2e0d977dbb31 | 75 | //DS3231 8 bit adress |
wardm | 15:2e0d977dbb31 | 76 | #define DS3231_Address 0xD0 |
wardm | 15:2e0d977dbb31 | 77 | |
wardm | 15:2e0d977dbb31 | 78 | //DS3231 registers |
wardm | 15:2e0d977dbb31 | 79 | #define DS3231_Seconds 0x00 |
wardm | 15:2e0d977dbb31 | 80 | #define DS3231_Minutes 0x01 |
wardm | 15:2e0d977dbb31 | 81 | #define DS3231_Hours 0x02 |
wardm | 15:2e0d977dbb31 | 82 | // DS3231 Hours bits |
wardm | 15:2e0d977dbb31 | 83 | #define DS3231_bit_AM_PM 0x20 |
wardm | 15:2e0d977dbb31 | 84 | #define DS3231_bit_12_24 0x40 |
wardm | 15:2e0d977dbb31 | 85 | |
wardm | 15:2e0d977dbb31 | 86 | #define DS3231_Day 0x03 |
wardm | 15:2e0d977dbb31 | 87 | #define DS3231_Date 0x04 |
wardm | 15:2e0d977dbb31 | 88 | #define DS3231_Month_Century 0x05 |
wardm | 15:2e0d977dbb31 | 89 | #define DS3231_Year 0x06 |
wardm | 15:2e0d977dbb31 | 90 | #define DS3231_Alarm1_Seconds 0x07 |
wardm | 15:2e0d977dbb31 | 91 | #define DS3231_Alarm1_Minutes 0x08 |
wardm | 15:2e0d977dbb31 | 92 | #define DS3231_Alarm1_Hours 0x09 |
wardm | 15:2e0d977dbb31 | 93 | #define DS3231_Alarm1_Day_Date 0x0A |
wardm | 15:2e0d977dbb31 | 94 | #define DS3231_Alarm2_Minutes 0x0B |
wardm | 15:2e0d977dbb31 | 95 | #define DS3231_Alarm2_Hours 0x0C |
wardm | 15:2e0d977dbb31 | 96 | #define DS3231_Alarm_2_Day_Date 0x0D |
wardm | 15:2e0d977dbb31 | 97 | |
wardm | 15:2e0d977dbb31 | 98 | #define DS3231_Control 0x0E |
wardm | 15:2e0d977dbb31 | 99 | // DS3231 Control bits |
wardm | 15:2e0d977dbb31 | 100 | #define DS3231_bit_A1IE 1 |
wardm | 15:2e0d977dbb31 | 101 | #define DS3231_bit_A2IE 2 |
wardm | 15:2e0d977dbb31 | 102 | #define DS3231_bit_INTCN 4 |
wardm | 15:2e0d977dbb31 | 103 | #define DS3231_bit_SQW_1Hz 0 |
wardm | 15:2e0d977dbb31 | 104 | #define DS3231_bit_SQW_1024Hz 8 |
wardm | 15:2e0d977dbb31 | 105 | #define DS3231_bit_SQW_4096Hz 16 |
wardm | 15:2e0d977dbb31 | 106 | #define DS3231_bit_SQW_8192Hz 24 |
wardm | 15:2e0d977dbb31 | 107 | #define DS3231_bit_CONV 32 |
wardm | 15:2e0d977dbb31 | 108 | #define DS3231_bit_BBSQW 64 |
wardm | 15:2e0d977dbb31 | 109 | #define DS3231_bit_EOSCb 128 |
wardm | 15:2e0d977dbb31 | 110 | |
wardm | 15:2e0d977dbb31 | 111 | |
wardm | 15:2e0d977dbb31 | 112 | #define DS3231_Control_Status 0x0F |
wardm | 15:2e0d977dbb31 | 113 | // DS3231 Control/Status bits |
wardm | 15:2e0d977dbb31 | 114 | #define DS3231_bit_BSY 0x04 |
wardm | 15:2e0d977dbb31 | 115 | #define DS3231_bit_EN32kHz 0x08 |
wardm | 15:2e0d977dbb31 | 116 | #define DS3231_bit_OSF 0x80 |
wardm | 15:2e0d977dbb31 | 117 | |
wardm | 15:2e0d977dbb31 | 118 | #define DS3231_Aging_Offset 0x10 |
wardm | 15:2e0d977dbb31 | 119 | #define DS3231_MSB_Temp 0x11 |
wardm | 15:2e0d977dbb31 | 120 | #define DS3231_LSB_Temp 0x12 |
wardm | 15:2e0d977dbb31 | 121 | |
wardm | 15:2e0d977dbb31 | 122 | /* Interface to MAXIM DS3231 RTC */ |
wardm | 15:2e0d977dbb31 | 123 | class DS3231 |
wardm | 15:2e0d977dbb31 | 124 | {public : |
wardm | 15:2e0d977dbb31 | 125 | /** Create an instance of the DS3231 connected to specfied I2C pins |
wardm | 15:2e0d977dbb31 | 126 | * |
wardm | 15:2e0d977dbb31 | 127 | * @param sda The I2C data pin |
wardm | 15:2e0d977dbb31 | 128 | * @param scl The I2C clock pin |
wardm | 15:2e0d977dbb31 | 129 | */ |
wardm | 15:2e0d977dbb31 | 130 | DS3231(PinName sda, PinName scl); |
wardm | 15:2e0d977dbb31 | 131 | |
wardm | 15:2e0d977dbb31 | 132 | /** set I2C bus speed |
wardm | 15:2e0d977dbb31 | 133 | * @param frequency : I2C clocl frequenct (Hz) |
wardm | 15:2e0d977dbb31 | 134 | */ |
wardm | 15:2e0d977dbb31 | 135 | void setI2Cfrequency(int frequency); |
wardm | 15:2e0d977dbb31 | 136 | |
wardm | 15:2e0d977dbb31 | 137 | /** Read the temperature |
wardm | 15:2e0d977dbb31 | 138 | * |
wardm | 15:2e0d977dbb31 | 139 | * @return The temperature |
wardm | 15:2e0d977dbb31 | 140 | */ |
wardm | 15:2e0d977dbb31 | 141 | float readTemp(); |
wardm | 15:2e0d977dbb31 | 142 | |
wardm | 15:2e0d977dbb31 | 143 | /** Read the time registers |
wardm | 15:2e0d977dbb31 | 144 | * @param hours |
wardm | 15:2e0d977dbb31 | 145 | * @param minutes |
wardm | 15:2e0d977dbb31 | 146 | * @param seconds |
wardm | 15:2e0d977dbb31 | 147 | */ |
wardm | 15:2e0d977dbb31 | 148 | void readTime(int *hours, int *minutes, int *seconds); |
wardm | 15:2e0d977dbb31 | 149 | |
wardm | 15:2e0d977dbb31 | 150 | /** force temperature conversion |
wardm | 15:2e0d977dbb31 | 151 | * |
wardm | 15:2e0d977dbb31 | 152 | */ |
wardm | 15:2e0d977dbb31 | 153 | void convertTemperature(); |
wardm | 15:2e0d977dbb31 | 154 | |
wardm | 15:2e0d977dbb31 | 155 | /** Set the time registers |
wardm | 15:2e0d977dbb31 | 156 | * @param hours |
wardm | 15:2e0d977dbb31 | 157 | * @param minutes |
wardm | 15:2e0d977dbb31 | 158 | * @param seconds |
wardm | 15:2e0d977dbb31 | 159 | */ |
wardm | 15:2e0d977dbb31 | 160 | void setTime(int hours, int minutes, int seconds); |
wardm | 15:2e0d977dbb31 | 161 | |
wardm | 15:2e0d977dbb31 | 162 | /** Read the date registers |
wardm | 15:2e0d977dbb31 | 163 | * @param date |
wardm | 15:2e0d977dbb31 | 164 | * @param month |
wardm | 15:2e0d977dbb31 | 165 | * @param year |
wardm | 15:2e0d977dbb31 | 166 | */ |
wardm | 15:2e0d977dbb31 | 167 | void readDate(int *date, int *month, int *year); |
wardm | 15:2e0d977dbb31 | 168 | |
wardm | 15:2e0d977dbb31 | 169 | /** Set the date registers |
wardm | 15:2e0d977dbb31 | 170 | * @param dayOfWeek : day of week |
wardm | 15:2e0d977dbb31 | 171 | * @param date |
wardm | 15:2e0d977dbb31 | 172 | * @param month |
wardm | 15:2e0d977dbb31 | 173 | * @param year |
wardm | 15:2e0d977dbb31 | 174 | */ |
wardm | 15:2e0d977dbb31 | 175 | void setDate(int dayOfWeek, int date, int month, int year); |
wardm | 15:2e0d977dbb31 | 176 | |
wardm | 15:2e0d977dbb31 | 177 | /** Read the date and time registers |
wardm | 15:2e0d977dbb31 | 178 | * @param dayOfWeek : day of week |
wardm | 15:2e0d977dbb31 | 179 | * @param date |
wardm | 15:2e0d977dbb31 | 180 | * @param month |
wardm | 15:2e0d977dbb31 | 181 | * @param year |
wardm | 15:2e0d977dbb31 | 182 | * @param hours |
wardm | 15:2e0d977dbb31 | 183 | * @param minutes |
wardm | 15:2e0d977dbb31 | 184 | * @param seconds |
wardm | 15:2e0d977dbb31 | 185 | */ |
wardm | 15:2e0d977dbb31 | 186 | void readDateTime(int *dayOfWeek, int *date, int *month, int *year, int *hours, int *minutes, int *seconds); |
wardm | 15:2e0d977dbb31 | 187 | |
wardm | 15:2e0d977dbb31 | 188 | /** Read a register |
wardm | 15:2e0d977dbb31 | 189 | * @param reg : register address |
wardm | 15:2e0d977dbb31 | 190 | * @return The register content |
wardm | 15:2e0d977dbb31 | 191 | */ |
wardm | 15:2e0d977dbb31 | 192 | int readRegister(char reg); |
wardm | 15:2e0d977dbb31 | 193 | |
wardm | 15:2e0d977dbb31 | 194 | /** Write to a register |
wardm | 15:2e0d977dbb31 | 195 | * @param reg : register address |
wardm | 15:2e0d977dbb31 | 196 | * @param The register content |
wardm | 15:2e0d977dbb31 | 197 | */ |
wardm | 15:2e0d977dbb31 | 198 | void writeRegister(int reg,char byte); |
wardm | 15:2e0d977dbb31 | 199 | |
wardm | 15:2e0d977dbb31 | 200 | /** set OSF (Oscillator Stop Flag) bit to 0 in Control Status register |
wardm | 15:2e0d977dbb31 | 201 | * should be done just after power up DS3231 |
wardm | 15:2e0d977dbb31 | 202 | * OSF bit is automaticaly set to 1 when on power up or when the DS3231 oscillator stops |
wardm | 15:2e0d977dbb31 | 203 | */ |
wardm | 15:2e0d977dbb31 | 204 | void eraseOSF(); |
wardm | 15:2e0d977dbb31 | 205 | |
wardm | 15:2e0d977dbb31 | 206 | /** Return OSF bit. If true the oscillator stopped or the DS3231 just powered up |
wardm | 15:2e0d977dbb31 | 207 | * @return The OSF bit |
wardm | 15:2e0d977dbb31 | 208 | */ |
wardm | 15:2e0d977dbb31 | 209 | bool OSF(); |
wardm | 15:2e0d977dbb31 | 210 | |
wardm | 15:2e0d977dbb31 | 211 | bool error; |
wardm | 15:2e0d977dbb31 | 212 | |
wardm | 15:2e0d977dbb31 | 213 | private : |
wardm | 15:2e0d977dbb31 | 214 | I2C i2c; |
wardm | 15:2e0d977dbb31 | 215 | int bcd2dec(int k); // bcd to decimal conversion |
wardm | 15:2e0d977dbb31 | 216 | int dec2bcd(int k); // decimal to bcd conversion |
wardm | 15:2e0d977dbb31 | 217 | void decodeTime(int regHours, int regMinutes, int regSeconds,int *Hours, int *Minutes, int *Seconds); |
wardm | 15:2e0d977dbb31 | 218 | void decodeDate(int regDate,int regMonth, int regYear, int *date, int *month, int *year); |
wardm | 15:2e0d977dbb31 | 219 | }; |
wardm | 15:2e0d977dbb31 | 220 | |
wardm | 15:2e0d977dbb31 | 221 | |
wardm | 15:2e0d977dbb31 | 222 | #endif |