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 #include "DS3231.h"
wardm 15:2e0d977dbb31 2
wardm 15:2e0d977dbb31 3 DS3231::DS3231(PinName sda, PinName scl) : i2c(sda, scl)
wardm 15:2e0d977dbb31 4 {
wardm 15:2e0d977dbb31 5 }
wardm 15:2e0d977dbb31 6
wardm 15:2e0d977dbb31 7
wardm 15:2e0d977dbb31 8 // BCD to decimal conversion
wardm 15:2e0d977dbb31 9 int DS3231::bcd2dec(int k)
wardm 15:2e0d977dbb31 10 {return(((k&0xF0)>>4)*10+(k&0x0F));}
wardm 15:2e0d977dbb31 11
wardm 15:2e0d977dbb31 12
wardm 15:2e0d977dbb31 13 // decimal to BCD conversion
wardm 15:2e0d977dbb31 14 int DS3231::dec2bcd(int k)
wardm 15:2e0d977dbb31 15 {return((k/10)*16+(k%10));}
wardm 15:2e0d977dbb31 16
wardm 15:2e0d977dbb31 17 void DS3231::setI2Cfrequency(int frequency)
wardm 15:2e0d977dbb31 18 {i2c.frequency(frequency);
wardm 15:2e0d977dbb31 19 }
wardm 15:2e0d977dbb31 20
wardm 15:2e0d977dbb31 21 // read temperature from DS3231
wardm 15:2e0d977dbb31 22 float DS3231::readTemp()
wardm 15:2e0d977dbb31 23 {char buf[2];
wardm 15:2e0d977dbb31 24 buf[0]=DS3231_MSB_Temp;
wardm 15:2e0d977dbb31 25 int w=i2c.write(DS3231_Address,buf,1);
wardm 15:2e0d977dbb31 26 int r=i2c.read(DS3231_Address,buf,2);
wardm 15:2e0d977dbb31 27 error=((w!=0)||(r!=0));
wardm 15:2e0d977dbb31 28 return(buf[0]+buf[1]/256.0);}
wardm 15:2e0d977dbb31 29
wardm 15:2e0d977dbb31 30 // force temperatue conversion
wardm 15:2e0d977dbb31 31 void DS3231::convertTemperature()
wardm 15:2e0d977dbb31 32 {int Control=readRegister(DS3231_Control)|DS3231_bit_CONV;
wardm 15:2e0d977dbb31 33 writeRegister(DS3231_Control,Control);
wardm 15:2e0d977dbb31 34 }
wardm 15:2e0d977dbb31 35
wardm 15:2e0d977dbb31 36 // decode time registers
wardm 15:2e0d977dbb31 37 void DS3231::decodeTime(int regHours, int regMinutes, int regSeconds,int *Hours, int *Minutes, int *Seconds)
wardm 15:2e0d977dbb31 38 {*Hours=bcd2dec(regHours);
wardm 15:2e0d977dbb31 39 *Minutes=bcd2dec(regMinutes);
wardm 15:2e0d977dbb31 40 *Seconds=bcd2dec(regSeconds);
wardm 15:2e0d977dbb31 41 }
wardm 15:2e0d977dbb31 42
wardm 15:2e0d977dbb31 43
wardm 15:2e0d977dbb31 44 // read time registers dand decode them to decimal
wardm 15:2e0d977dbb31 45 void DS3231::readTime(int *hours, int *minutes, int *seconds)
wardm 15:2e0d977dbb31 46 {char buf[3];
wardm 15:2e0d977dbb31 47 buf[0]=DS3231_Seconds;
wardm 15:2e0d977dbb31 48 int w=i2c.write(DS3231_Address,buf,1);
wardm 15:2e0d977dbb31 49 int r=i2c.read(DS3231_Address,buf,3);
wardm 15:2e0d977dbb31 50 decodeTime(buf[2],buf[1],buf[0],hours,minutes,seconds);
wardm 15:2e0d977dbb31 51 error=((w!=0)||(r!=0));
wardm 15:2e0d977dbb31 52 }
wardm 15:2e0d977dbb31 53
wardm 15:2e0d977dbb31 54 // set time register
wardm 15:2e0d977dbb31 55 void DS3231::setTime(int hours, int minutes, int seconds)
wardm 15:2e0d977dbb31 56 {writeRegister(DS3231_Seconds,dec2bcd(seconds));
wardm 15:2e0d977dbb31 57 writeRegister(DS3231_Minutes,dec2bcd(minutes));
wardm 15:2e0d977dbb31 58 writeRegister(DS3231_Hours,dec2bcd(hours));
wardm 15:2e0d977dbb31 59 }
wardm 15:2e0d977dbb31 60
wardm 15:2e0d977dbb31 61 // decode date registers
wardm 15:2e0d977dbb31 62 void DS3231::decodeDate(int regDate,int regMonth, int regYear, int *date, int *month, int *year)
wardm 15:2e0d977dbb31 63 {*date=bcd2dec(regDate);
wardm 15:2e0d977dbb31 64 int century=regMonth&128;
wardm 15:2e0d977dbb31 65 *month=bcd2dec(regMonth&127);
wardm 15:2e0d977dbb31 66 *year=bcd2dec(regYear);
wardm 15:2e0d977dbb31 67 if (century==0) // only XXth and XXIst centuries allowed
wardm 15:2e0d977dbb31 68 {*year=*year+1900;}
wardm 15:2e0d977dbb31 69 else
wardm 15:2e0d977dbb31 70 {*year=*year+2000;}
wardm 15:2e0d977dbb31 71 }
wardm 15:2e0d977dbb31 72
wardm 15:2e0d977dbb31 73 // read date registers
wardm 15:2e0d977dbb31 74 void DS3231::readDate(int *date, int *month, int *year)
wardm 15:2e0d977dbb31 75 {char buf[3];
wardm 15:2e0d977dbb31 76 buf[0]=DS3231_Date;
wardm 15:2e0d977dbb31 77 int w=i2c.write(DS3231_Address,buf,1);
wardm 15:2e0d977dbb31 78 int r=i2c.read(DS3231_Address,buf,3);
wardm 15:2e0d977dbb31 79 decodeDate(buf[0],buf[1],buf[2],date,month,year);
wardm 15:2e0d977dbb31 80 error=((w!=0)||(r!=0));
wardm 15:2e0d977dbb31 81 }
wardm 15:2e0d977dbb31 82
wardm 15:2e0d977dbb31 83 // set the date registers
wardm 15:2e0d977dbb31 84 void DS3231::setDate(int dayOfWeek, int date, int month, int year)
wardm 15:2e0d977dbb31 85 {writeRegister(DS3231_Date,dec2bcd(date));
wardm 15:2e0d977dbb31 86 writeRegister(DS3231_Day,dayOfWeek);
wardm 15:2e0d977dbb31 87 int century=0; // only XXth and XXIst centuries allowed
wardm 15:2e0d977dbb31 88 if (year<1900){year=1900;}
wardm 15:2e0d977dbb31 89 if (year>2099){year=2099;}
wardm 15:2e0d977dbb31 90 if (year<2000)
wardm 15:2e0d977dbb31 91 {year=year-1900;}
wardm 15:2e0d977dbb31 92 else
wardm 15:2e0d977dbb31 93 {year=year-2000;century=1;}
wardm 15:2e0d977dbb31 94 writeRegister(DS3231_Month_Century,dec2bcd(month)+128*century);
wardm 15:2e0d977dbb31 95 writeRegister(DS3231_Year,dec2bcd(year));
wardm 15:2e0d977dbb31 96 }
wardm 15:2e0d977dbb31 97
wardm 15:2e0d977dbb31 98 // read date and time registers
wardm 15:2e0d977dbb31 99 void DS3231::readDateTime(int *dayOfWeek, int *date, int *month, int *year, int *hours, int *minutes, int *seconds)
wardm 15:2e0d977dbb31 100 {char buf[7];
wardm 15:2e0d977dbb31 101 buf[0]=DS3231_Seconds;
wardm 15:2e0d977dbb31 102 int w=i2c.write(DS3231_Address,buf,1);
wardm 15:2e0d977dbb31 103 int r=i2c.read(DS3231_Address,buf,7);
wardm 15:2e0d977dbb31 104 decodeTime(buf[2],buf[1],buf[0],hours,minutes,seconds);
wardm 15:2e0d977dbb31 105 *dayOfWeek=buf[3];
wardm 15:2e0d977dbb31 106 decodeDate(buf[4],buf[5],buf[6],date,month,year);
wardm 15:2e0d977dbb31 107 error=((w!=0)||(r!=0));
wardm 15:2e0d977dbb31 108 }
wardm 15:2e0d977dbb31 109
wardm 15:2e0d977dbb31 110 // read a register
wardm 15:2e0d977dbb31 111 int DS3231::readRegister(char reg)
wardm 15:2e0d977dbb31 112 {char buf[1];
wardm 15:2e0d977dbb31 113 buf[0]=reg;
wardm 15:2e0d977dbb31 114 int w=i2c.write(DS3231_Address,buf,1);
wardm 15:2e0d977dbb31 115 int r=i2c.read(DS3231_Address,buf,1);
wardm 15:2e0d977dbb31 116 error=((w!=0)||(r!=0));
wardm 15:2e0d977dbb31 117 return(buf[0]);
wardm 15:2e0d977dbb31 118 }
wardm 15:2e0d977dbb31 119
wardm 15:2e0d977dbb31 120 // write a register
wardm 15:2e0d977dbb31 121 void DS3231::writeRegister(int reg,char byte)
wardm 15:2e0d977dbb31 122 {char buf[2];
wardm 15:2e0d977dbb31 123 buf[0]=reg;
wardm 15:2e0d977dbb31 124 buf[1]=byte;
wardm 15:2e0d977dbb31 125 int w=i2c.write(DS3231_Address,buf,2);
wardm 15:2e0d977dbb31 126 error=(w!=0);
wardm 15:2e0d977dbb31 127 }
wardm 15:2e0d977dbb31 128
wardm 15:2e0d977dbb31 129 void DS3231::eraseOSF()
wardm 15:2e0d977dbb31 130 {int reg=readRegister(DS3231_Control_Status);
wardm 15:2e0d977dbb31 131 reg=reg&0x7F;
wardm 15:2e0d977dbb31 132 writeRegister(DS3231_Control_Status,reg);
wardm 15:2e0d977dbb31 133 }
wardm 15:2e0d977dbb31 134
wardm 15:2e0d977dbb31 135 bool DS3231::OSF()
wardm 15:2e0d977dbb31 136 {int reg=readRegister(DS3231_Control_Status);
wardm 15:2e0d977dbb31 137 return(reg&DS3231_bit_OSF);
wardm 15:2e0d977dbb31 138 }