Code for Technion Formula car sensors reader

Dependencies:   mbed Buffer FATFileSystem

Fork of SX1272PingPong by Semtech

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:
  1. Click button at top-left
  2. Add Board
  3. 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
Committer:
wardm
Date:
Thu May 17 20:37:41 2018 +0000
Revision:
15:2e0d977dbb31
V1.0.0

Who changed what in which revision?

UserRevisionLine numberNew 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