Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
main.cpp@0:99404616b1d5, 2019-02-07 (annotated)
- Committer:
- Danyal
- Date:
- Thu Feb 07 09:06:43 2019 +0000
- Revision:
- 0:99404616b1d5
- Child:
- 1:3c24e35d6d62
Unser Projekt
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| Danyal | 0:99404616b1d5 | 1 | /** |
| Danyal | 0:99404616b1d5 | 2 | read data temperature,time from DS3221 and write it to 25LC1024 |
| Danyal | 0:99404616b1d5 | 3 | author: Danyal Awan, Johannes Bienert, Max Östermann |
| Danyal | 0:99404616b1d5 | 4 | */ |
| Danyal | 0:99404616b1d5 | 5 | |
| Danyal | 0:99404616b1d5 | 6 | #include "mbed.h" |
| Danyal | 0:99404616b1d5 | 7 | #define ADDR 0x68 << 1 // DS3231 adress |
| Danyal | 0:99404616b1d5 | 8 | #define MESSPUNKTE 100 //Anzahl der Messungen, die durchgeführt werden sollen. |
| Danyal | 0:99404616b1d5 | 9 | #define ADDRESSINCREASE 5// Anzahl der Adressen (25LC1024), die erhöht werden müssen. |
| Danyal | 0:99404616b1d5 | 10 | //5 Werte pro Messung werden gespeichert. |
| Danyal | 0:99404616b1d5 | 11 | #define PRESSED 0 // wenn Userbutton gedrückt |
| Danyal | 0:99404616b1d5 | 12 | #define DELAY_IN_MS 100 // Millisekunden, die zwischen den Messungen gewartet werden soll. |
| Danyal | 0:99404616b1d5 | 13 | |
| Danyal | 0:99404616b1d5 | 14 | Serial pc(SERIAL_TX, SERIAL_RX); // Serielle Schnittstelle |
| Danyal | 0:99404616b1d5 | 15 | DigitalIn userButton(BUTTON1, PullUp); // Onboard Button |
| Danyal | 0:99404616b1d5 | 16 | I2C i2c(I2C_SDA , I2C_SCL); |
| Danyal | 0:99404616b1d5 | 17 | SPI spi(D11, D12, D13); // mosi, miso, sclk |
| Danyal | 0:99404616b1d5 | 18 | DigitalOut cs(D10); |
| Danyal | 0:99404616b1d5 | 19 | //DigitalOut out(D9); |
| Danyal | 0:99404616b1d5 | 20 | AnalogIn input(A0); // Input for temperature data |
| Danyal | 0:99404616b1d5 | 21 | int32_t counter; |
| Danyal | 0:99404616b1d5 | 22 | |
| Danyal | 0:99404616b1d5 | 23 | |
| Danyal | 0:99404616b1d5 | 24 | // DS3231 must bet set in 24h mode!!! |
| Danyal | 0:99404616b1d5 | 25 | // get time in hours from DS3231 via I2C |
| Danyal | 0:99404616b1d5 | 26 | // @return hours 8_bit integer |
| Danyal | 0:99404616b1d5 | 27 | int8_t getHours() { |
| Danyal | 0:99404616b1d5 | 28 | |
| Danyal | 0:99404616b1d5 | 29 | char reader[1]; |
| Danyal | 0:99404616b1d5 | 30 | char cmd[1]; |
| Danyal | 0:99404616b1d5 | 31 | cmd[0]=0x02; // register for hours |
| Danyal | 0:99404616b1d5 | 32 | wait_ms(1); |
| Danyal | 0:99404616b1d5 | 33 | i2c.write(ADDR, cmd, 1); |
| Danyal | 0:99404616b1d5 | 34 | i2c.read(ADDR, reader, 1); |
| Danyal | 0:99404616b1d5 | 35 | int8_t stunden = reader[0]; |
| Danyal | 0:99404616b1d5 | 36 | stunden = stunden & 0x3F; |
| Danyal | 0:99404616b1d5 | 37 | return stunden; |
| Danyal | 0:99404616b1d5 | 38 | |
| Danyal | 0:99404616b1d5 | 39 | } |
| Danyal | 0:99404616b1d5 | 40 | |
| Danyal | 0:99404616b1d5 | 41 | // get time in minutes from DS3231 via I2C |
| Danyal | 0:99404616b1d5 | 42 | // @return minutes 8_bit integer |
| Danyal | 0:99404616b1d5 | 43 | int8_t getMinutes(){ |
| Danyal | 0:99404616b1d5 | 44 | |
| Danyal | 0:99404616b1d5 | 45 | char reader[1]; |
| Danyal | 0:99404616b1d5 | 46 | char cmd[1]; |
| Danyal | 0:99404616b1d5 | 47 | cmd[0]=0x01; //register for minutes |
| Danyal | 0:99404616b1d5 | 48 | i2c.write(ADDR, cmd, 1); |
| Danyal | 0:99404616b1d5 | 49 | i2c.read(ADDR, reader, 1); |
| Danyal | 0:99404616b1d5 | 50 | wait_ms(1); |
| Danyal | 0:99404616b1d5 | 51 | int8_t minuten = reader[0]; |
| Danyal | 0:99404616b1d5 | 52 | return minuten; |
| Danyal | 0:99404616b1d5 | 53 | |
| Danyal | 0:99404616b1d5 | 54 | } |
| Danyal | 0:99404616b1d5 | 55 | |
| Danyal | 0:99404616b1d5 | 56 | // get temperature from DS3231 via I2C |
| Danyal | 0:99404616b1d5 | 57 | // @return temperature 8_bit integer |
| Danyal | 0:99404616b1d5 | 58 | int8_t getTemp(){ |
| Danyal | 0:99404616b1d5 | 59 | |
| Danyal | 0:99404616b1d5 | 60 | int8_t temp = 0; |
| Danyal | 0:99404616b1d5 | 61 | char reader[1]; |
| Danyal | 0:99404616b1d5 | 62 | char cmd[1]; |
| Danyal | 0:99404616b1d5 | 63 | cmd[0]=0x11; // register for temperature in front of comma |
| Danyal | 0:99404616b1d5 | 64 | i2c.write(ADDR, cmd, 1); |
| Danyal | 0:99404616b1d5 | 65 | i2c.read(ADDR, reader, 1); |
| Danyal | 0:99404616b1d5 | 66 | wait_ms(1); |
| Danyal | 0:99404616b1d5 | 67 | temp = reader[0]; |
| Danyal | 0:99404616b1d5 | 68 | return temp; |
| Danyal | 0:99404616b1d5 | 69 | } |
| Danyal | 0:99404616b1d5 | 70 | |
| Danyal | 0:99404616b1d5 | 71 | // get analog input from phototransistor |
| Danyal | 0:99404616b1d5 | 72 | // @return input voltage 16_bit integer |
| Danyal | 0:99404616b1d5 | 73 | int16_t getInput(){ |
| Danyal | 0:99404616b1d5 | 74 | |
| Danyal | 0:99404616b1d5 | 75 | uint16_t inputWert = 0; |
| Danyal | 0:99404616b1d5 | 76 | inputWert = input.read_u16(); |
| Danyal | 0:99404616b1d5 | 77 | return inputWert; |
| Danyal | 0:99404616b1d5 | 78 | } |
| Danyal | 0:99404616b1d5 | 79 | |
| Danyal | 0:99404616b1d5 | 80 | // write data to 25LC1024 via SPI |
| Danyal | 0:99404616b1d5 | 81 | // @param Stunden |
| Danyal | 0:99404616b1d5 | 82 | // @param Minuten |
| Danyal | 0:99404616b1d5 | 83 | // @param temperature |
| Danyal | 0:99404616b1d5 | 84 | // @param Voltage - 16_bit |
| Danyal | 0:99404616b1d5 | 85 | // @param 24_bit register adress |
| Danyal | 0:99404616b1d5 | 86 | void saveData(int8_t dataHour,int32_t adress,int8_t dataMinutes, |
| Danyal | 0:99404616b1d5 | 87 | int8_t dataTemp,int16_t light){ |
| Danyal | 0:99404616b1d5 | 88 | |
| Danyal | 0:99404616b1d5 | 89 | char addr1, addr2, addr3,msb2,lsb2; // 1 Byte adress holder |
| Danyal | 0:99404616b1d5 | 90 | |
| Danyal | 0:99404616b1d5 | 91 | // split 24_bit adress in 3 8_bit adresses |
| Danyal | 0:99404616b1d5 | 92 | addr1=(adress & 0xFF0000)>>16; |
| Danyal | 0:99404616b1d5 | 93 | addr2= (adress & 0x00FF00)>>8; |
| Danyal | 0:99404616b1d5 | 94 | addr3= (adress & 0x0000FF); |
| Danyal | 0:99404616b1d5 | 95 | |
| Danyal | 0:99404616b1d5 | 96 | //split 16_bit integer in two 8_bit values |
| Danyal | 0:99404616b1d5 | 97 | msb2=(light & 0xFF00)>>8; |
| Danyal | 0:99404616b1d5 | 98 | lsb2=(light & 0x00FF); |
| Danyal | 0:99404616b1d5 | 99 | |
| Danyal | 0:99404616b1d5 | 100 | cs = 0; |
| Danyal | 0:99404616b1d5 | 101 | spi.write(0x06); //WREN, Write on |
| Danyal | 0:99404616b1d5 | 102 | cs = 1; |
| Danyal | 0:99404616b1d5 | 103 | wait_ms(1); |
| Danyal | 0:99404616b1d5 | 104 | cs = 0; |
| Danyal | 0:99404616b1d5 | 105 | spi.write(0x02); //Write Instruction |
| Danyal | 0:99404616b1d5 | 106 | spi.write(addr1); // - |
| Danyal | 0:99404616b1d5 | 107 | spi.write(addr2); // send 24_bit adress devided up by 3 8_bit integers |
| Danyal | 0:99404616b1d5 | 108 | spi.write(addr3); // - |
| Danyal | 0:99404616b1d5 | 109 | spi.write(dataTemp); // send data |
| Danyal | 0:99404616b1d5 | 110 | spi.write(dataHour); |
| Danyal | 0:99404616b1d5 | 111 | spi.write(dataMinutes); |
| Danyal | 0:99404616b1d5 | 112 | spi.write(msb2); |
| Danyal | 0:99404616b1d5 | 113 | spi.write(lsb2); |
| Danyal | 0:99404616b1d5 | 114 | cs=1; |
| Danyal | 0:99404616b1d5 | 115 | wait_ms(6); |
| Danyal | 0:99404616b1d5 | 116 | cs = 0; |
| Danyal | 0:99404616b1d5 | 117 | spi.write(0x04); //WRDI, Write off |
| Danyal | 0:99404616b1d5 | 118 | cs = 1; |
| Danyal | 0:99404616b1d5 | 119 | |
| Danyal | 0:99404616b1d5 | 120 | } |
| Danyal | 0:99404616b1d5 | 121 | // read all data from 25LC1024 via SPI |
| Danyal | 0:99404616b1d5 | 122 | // send all data in own arrays |
| Danyal | 0:99404616b1d5 | 123 | // print all data on screen |
| Danyal | 0:99404616b1d5 | 124 | //@param number of all data |
| Danyal | 0:99404616b1d5 | 125 | void readOutData(int32_t leng) { |
| Danyal | 0:99404616b1d5 | 126 | char buffer[leng]; |
| Danyal | 0:99404616b1d5 | 127 | char minuten[MESSPUNKTE]; |
| Danyal | 0:99404616b1d5 | 128 | char stunden[MESSPUNKTE]; |
| Danyal | 0:99404616b1d5 | 129 | char temp[MESSPUNKTE]; |
| Danyal | 0:99404616b1d5 | 130 | char light1[MESSPUNKTE]; |
| Danyal | 0:99404616b1d5 | 131 | char light2[MESSPUNKTE]; |
| Danyal | 0:99404616b1d5 | 132 | // Chip must be deselected |
| Danyal | 0:99404616b1d5 | 133 | cs = 0; |
| Danyal | 0:99404616b1d5 | 134 | spi.write(0x03); // read instruction |
| Danyal | 0:99404616b1d5 | 135 | spi.write(0x00); // -- |
| Danyal | 0:99404616b1d5 | 136 | spi.write(0x00); // 24_bit adress |
| Danyal | 0:99404616b1d5 | 137 | spi.write(0x01); // -- |
| Danyal | 0:99404616b1d5 | 138 | for (int i = 0;i<leng;i++) { |
| Danyal | 0:99404616b1d5 | 139 | buffer[i]=spi.write(0x00); // send all data in buffer[] |
| Danyal | 0:99404616b1d5 | 140 | } |
| Danyal | 0:99404616b1d5 | 141 | cs = 1; |
| Danyal | 0:99404616b1d5 | 142 | wait_ms(1); |
| Danyal | 0:99404616b1d5 | 143 | int x = 0; |
| Danyal | 0:99404616b1d5 | 144 | // now send all data in seperated array´s |
| Danyal | 0:99404616b1d5 | 145 | for (int i = 0;i<leng;i=i+ADDRESSINCREASE) { |
| Danyal | 0:99404616b1d5 | 146 | //pc.printf("%d : %x\n",x,buffer[i]); |
| Danyal | 0:99404616b1d5 | 147 | temp[x] = buffer[i]; |
| Danyal | 0:99404616b1d5 | 148 | x++; |
| Danyal | 0:99404616b1d5 | 149 | } |
| Danyal | 0:99404616b1d5 | 150 | x=0; |
| Danyal | 0:99404616b1d5 | 151 | wait_ms(1); |
| Danyal | 0:99404616b1d5 | 152 | for (int i = 1;i<leng;i=i+ADDRESSINCREASE) { |
| Danyal | 0:99404616b1d5 | 153 | // pc.printf("%d : %x\n",x,buffer[i]); |
| Danyal | 0:99404616b1d5 | 154 | stunden[x] = buffer[i]; |
| Danyal | 0:99404616b1d5 | 155 | x++; |
| Danyal | 0:99404616b1d5 | 156 | } |
| Danyal | 0:99404616b1d5 | 157 | x=0; |
| Danyal | 0:99404616b1d5 | 158 | wait_ms(1); |
| Danyal | 0:99404616b1d5 | 159 | for (int i = 2;i<leng;i=i+ADDRESSINCREASE) { |
| Danyal | 0:99404616b1d5 | 160 | //pc.printf("%d : %x\n",x,buffer[i]); |
| Danyal | 0:99404616b1d5 | 161 | minuten[x] = buffer[i]; |
| Danyal | 0:99404616b1d5 | 162 | x++; |
| Danyal | 0:99404616b1d5 | 163 | } |
| Danyal | 0:99404616b1d5 | 164 | x=0; |
| Danyal | 0:99404616b1d5 | 165 | wait_ms(1); |
| Danyal | 0:99404616b1d5 | 166 | for (int i = 3;i<leng;i=i+ADDRESSINCREASE) { |
| Danyal | 0:99404616b1d5 | 167 | // pc.printf("%d : %x\n",x,buffer[i]); |
| Danyal | 0:99404616b1d5 | 168 | light1[x] = buffer[i]; |
| Danyal | 0:99404616b1d5 | 169 | x++; |
| Danyal | 0:99404616b1d5 | 170 | } |
| Danyal | 0:99404616b1d5 | 171 | wait_ms(1); |
| Danyal | 0:99404616b1d5 | 172 | x=0; |
| Danyal | 0:99404616b1d5 | 173 | for (int i = 4;i<leng;i=i+ADDRESSINCREASE) { |
| Danyal | 0:99404616b1d5 | 174 | // pc.printf("%d : %x\n",x,buffer[i]); |
| Danyal | 0:99404616b1d5 | 175 | light2[x] = buffer[i]; |
| Danyal | 0:99404616b1d5 | 176 | x++; |
| Danyal | 0:99404616b1d5 | 177 | } |
| Danyal | 0:99404616b1d5 | 178 | // print all messures. step by step |
| Danyal | 0:99404616b1d5 | 179 | for (int i = 0;i<counter;i++) { |
| Danyal | 0:99404616b1d5 | 180 | pc.printf("Messung: %d Temperatur: %d Uhrzeit: %x:%x Voltage:%x%x \n",i+1,temp[i],stunden[i], |
| Danyal | 0:99404616b1d5 | 181 | minuten[i],light1[i],light2[i]); |
| Danyal | 0:99404616b1d5 | 182 | } |
| Danyal | 0:99404616b1d5 | 183 | } |
| Danyal | 0:99404616b1d5 | 184 | |
| Danyal | 0:99404616b1d5 | 185 | // if userbutton pressed programm ends and print all messures |
| Danyal | 0:99404616b1d5 | 186 | // if userbutton is not pressed programm waits the delaytime till to the next messure. |
| Danyal | 0:99404616b1d5 | 187 | // every 10 ms button query |
| Danyal | 0:99404616b1d5 | 188 | //@param delay time in ms |
| Danyal | 0:99404616b1d5 | 189 | //@return 0 or 1. 0 ends the programm, 1 continues |
| Danyal | 0:99404616b1d5 | 190 | int8_t delayOrEnd(int32_t delay){ |
| Danyal | 0:99404616b1d5 | 191 | int32_t x=0; |
| Danyal | 0:99404616b1d5 | 192 | int8_t y = 1; |
| Danyal | 0:99404616b1d5 | 193 | while((x<delay/10) && y){ |
| Danyal | 0:99404616b1d5 | 194 | if(userButton == PRESSED){ |
| Danyal | 0:99404616b1d5 | 195 | y=0; |
| Danyal | 0:99404616b1d5 | 196 | } |
| Danyal | 0:99404616b1d5 | 197 | else{ |
| Danyal | 0:99404616b1d5 | 198 | wait_ms(10); |
| Danyal | 0:99404616b1d5 | 199 | } |
| Danyal | 0:99404616b1d5 | 200 | x++; |
| Danyal | 0:99404616b1d5 | 201 | } |
| Danyal | 0:99404616b1d5 | 202 | return y; |
| Danyal | 0:99404616b1d5 | 203 | } |
| Danyal | 0:99404616b1d5 | 204 | |
| Danyal | 0:99404616b1d5 | 205 | |
| Danyal | 0:99404616b1d5 | 206 | int main(){ |
| Danyal | 0:99404616b1d5 | 207 | |
| Danyal | 0:99404616b1d5 | 208 | pc.printf("Press any key on the keyboard to start the program\n\r"); |
| Danyal | 0:99404616b1d5 | 209 | pc.putc(pc.getc()); //echo keyboard input, blocking wait |
| Danyal | 0:99404616b1d5 | 210 | pc.printf(" was pressed\n\r"); |
| Danyal | 0:99404616b1d5 | 211 | for (int32_t i=0;i<=5;i++){ |
| Danyal | 0:99404616b1d5 | 212 | pc.printf("***\n\r"); //Generate some new lines |
| Danyal | 0:99404616b1d5 | 213 | } |
| Danyal | 0:99404616b1d5 | 214 | pc.printf("Messung wird gestartet.\n"); |
| Danyal | 0:99404616b1d5 | 215 | pc.printf("Anzahl der vorrausichtlichen Messungen: %d.\n",MESSPUNKTE); |
| Danyal | 0:99404616b1d5 | 216 | pc.printf("Messabstaende in Millisekunden: %d.\n",DELAY_IN_MS); |
| Danyal | 0:99404616b1d5 | 217 | pc.printf("Userbutton druecken, um Messung vorlaeufig zu beenden.\n"); |
| Danyal | 0:99404616b1d5 | 218 | |
| Danyal | 0:99404616b1d5 | 219 | cs = 1; |
| Danyal | 0:99404616b1d5 | 220 | // Setup the spi for 8 bit data, high steady state clock, |
| Danyal | 0:99404616b1d5 | 221 | // second edge capture, with a 1MHz clock rate |
| Danyal | 0:99404616b1d5 | 222 | spi.format(8,0); |
| Danyal | 0:99404616b1d5 | 223 | spi.frequency(100000); |
| Danyal | 0:99404616b1d5 | 224 | int32_t adress =0x01; // starting register adress |
| Danyal | 0:99404616b1d5 | 225 | |
| Danyal | 0:99404616b1d5 | 226 | //int x =0; |
| Danyal | 0:99404616b1d5 | 227 | int k = 1; |
| Danyal | 0:99404616b1d5 | 228 | counter = 0; |
| Danyal | 0:99404616b1d5 | 229 | while(counter<MESSPUNKTE && k){ |
| Danyal | 0:99404616b1d5 | 230 | |
| Danyal | 0:99404616b1d5 | 231 | saveData(getHours(),adress,getMinutes(),getTemp(),getInput()); |
| Danyal | 0:99404616b1d5 | 232 | wait_ms(1); |
| Danyal | 0:99404616b1d5 | 233 | |
| Danyal | 0:99404616b1d5 | 234 | adress = adress + ADDRESSINCREASE; // erhöhe Speicheradresse um 5 |
| Danyal | 0:99404616b1d5 | 235 | counter++; |
| Danyal | 0:99404616b1d5 | 236 | pc.printf("Messung ausgefuehrt: %d\n",counter); |
| Danyal | 0:99404616b1d5 | 237 | k = delayOrEnd(DELAY_IN_MS); |
| Danyal | 0:99404616b1d5 | 238 | } |
| Danyal | 0:99404616b1d5 | 239 | pc.printf("\n"); |
| Danyal | 0:99404616b1d5 | 240 | pc.printf("Messung beendet \n"); |
| Danyal | 0:99404616b1d5 | 241 | pc.printf("*************************************************\n"); |
| Danyal | 0:99404616b1d5 | 242 | readOutData(MESSPUNKTE*ADDRESSINCREASE); // MESSPUNKTE*ADDRESSINCREASE = Anzahl aller Daten. |
| Danyal | 0:99404616b1d5 | 243 | |
| Danyal | 0:99404616b1d5 | 244 | |
| Danyal | 0:99404616b1d5 | 245 | } |