Die Steine / Mbed 2 deprecated Projekt02

Dependencies:   mbed

Committer:
Danyal
Date:
Thu Feb 07 11:41:45 2019 +0000
Revision:
1:3c24e35d6d62
Parent:
0:99404616b1d5
new projekt

Who changed what in which revision?

UserRevisionLine numberNew 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 1:3c24e35d6d62 132 int16_t light[MESSPUNKTE];
Danyal 0:99404616b1d5 133 // Chip must be deselected
Danyal 0:99404616b1d5 134 cs = 0;
Danyal 0:99404616b1d5 135 spi.write(0x03); // read instruction
Danyal 0:99404616b1d5 136 spi.write(0x00); // --
Danyal 0:99404616b1d5 137 spi.write(0x00); // 24_bit adress
Danyal 0:99404616b1d5 138 spi.write(0x01); // --
Danyal 0:99404616b1d5 139 for (int i = 0;i<leng;i++) {
Danyal 0:99404616b1d5 140 buffer[i]=spi.write(0x00); // send all data in buffer[]
Danyal 0:99404616b1d5 141 }
Danyal 0:99404616b1d5 142 cs = 1;
Danyal 0:99404616b1d5 143 wait_ms(1);
Danyal 0:99404616b1d5 144 int x = 0;
Danyal 0:99404616b1d5 145 // now send all data in seperated array´s
Danyal 1:3c24e35d6d62 146 // send data to temp array
Danyal 0:99404616b1d5 147 for (int i = 0;i<leng;i=i+ADDRESSINCREASE) {
Danyal 0:99404616b1d5 148 //pc.printf("%d : %x\n",x,buffer[i]);
Danyal 0:99404616b1d5 149 temp[x] = buffer[i];
Danyal 0:99404616b1d5 150 x++;
Danyal 0:99404616b1d5 151 }
Danyal 0:99404616b1d5 152 x=0;
Danyal 0:99404616b1d5 153 wait_ms(1);
Danyal 1:3c24e35d6d62 154 // send data to stunden array
Danyal 0:99404616b1d5 155 for (int i = 1;i<leng;i=i+ADDRESSINCREASE) {
Danyal 0:99404616b1d5 156 // pc.printf("%d : %x\n",x,buffer[i]);
Danyal 0:99404616b1d5 157 stunden[x] = buffer[i];
Danyal 0:99404616b1d5 158 x++;
Danyal 0:99404616b1d5 159 }
Danyal 0:99404616b1d5 160 x=0;
Danyal 0:99404616b1d5 161 wait_ms(1);
Danyal 1:3c24e35d6d62 162 // send data minuten
Danyal 0:99404616b1d5 163 for (int i = 2;i<leng;i=i+ADDRESSINCREASE) {
Danyal 0:99404616b1d5 164 //pc.printf("%d : %x\n",x,buffer[i]);
Danyal 0:99404616b1d5 165 minuten[x] = buffer[i];
Danyal 0:99404616b1d5 166 x++;
Danyal 0:99404616b1d5 167 }
Danyal 0:99404616b1d5 168 x=0;
Danyal 0:99404616b1d5 169 wait_ms(1);
Danyal 0:99404616b1d5 170 for (int i = 3;i<leng;i=i+ADDRESSINCREASE) {
Danyal 0:99404616b1d5 171 // pc.printf("%d : %x\n",x,buffer[i]);
Danyal 0:99404616b1d5 172 light1[x] = buffer[i];
Danyal 0:99404616b1d5 173 x++;
Danyal 0:99404616b1d5 174 }
Danyal 0:99404616b1d5 175 wait_ms(1);
Danyal 0:99404616b1d5 176 x=0;
Danyal 0:99404616b1d5 177 for (int i = 4;i<leng;i=i+ADDRESSINCREASE) {
Danyal 0:99404616b1d5 178 // pc.printf("%d : %x\n",x,buffer[i]);
Danyal 0:99404616b1d5 179 light2[x] = buffer[i];
Danyal 0:99404616b1d5 180 x++;
Danyal 0:99404616b1d5 181 }
Danyal 1:3c24e35d6d62 182 // Volatge Ausgabe in Prozent.
Danyal 1:3c24e35d6d62 183 for (int i = 0;i<MESSPUNKTE;i++){
Danyal 1:3c24e35d6d62 184 uint16_t l1 = light1[i];
Danyal 1:3c24e35d6d62 185 uint16_t ltemp = 0;
Danyal 1:3c24e35d6d62 186 ltemp =l1<<8;
Danyal 1:3c24e35d6d62 187 uint16_t ltemp2 = light2[i];
Danyal 1:3c24e35d6d62 188 light[i] =(ltemp + ltemp2)/655;
Danyal 1:3c24e35d6d62 189
Danyal 1:3c24e35d6d62 190 //light[i] = light[i]/65535;
Danyal 1:3c24e35d6d62 191 }
Danyal 0:99404616b1d5 192 // print all messures. step by step
Danyal 0:99404616b1d5 193 for (int i = 0;i<counter;i++) {
Danyal 1:3c24e35d6d62 194 pc.printf("Messung: %d Temperatur: %d Uhrzeit: %x:%x Voltage: %d Prozent \n",i+1,temp[i],stunden[i],
Danyal 1:3c24e35d6d62 195 minuten[i],light[i]);
Danyal 0:99404616b1d5 196 }
Danyal 0:99404616b1d5 197 }
Danyal 0:99404616b1d5 198
Danyal 0:99404616b1d5 199 // if userbutton pressed programm ends and print all messures
Danyal 0:99404616b1d5 200 // if userbutton is not pressed programm waits the delaytime till to the next messure.
Danyal 0:99404616b1d5 201 // every 10 ms button query
Danyal 0:99404616b1d5 202 //@param delay time in ms
Danyal 0:99404616b1d5 203 //@return 0 or 1. 0 ends the programm, 1 continues
Danyal 0:99404616b1d5 204 int8_t delayOrEnd(int32_t delay){
Danyal 0:99404616b1d5 205 int32_t x=0;
Danyal 0:99404616b1d5 206 int8_t y = 1;
Danyal 0:99404616b1d5 207 while((x<delay/10) && y){
Danyal 0:99404616b1d5 208 if(userButton == PRESSED){
Danyal 0:99404616b1d5 209 y=0;
Danyal 0:99404616b1d5 210 }
Danyal 0:99404616b1d5 211 else{
Danyal 0:99404616b1d5 212 wait_ms(10);
Danyal 0:99404616b1d5 213 }
Danyal 0:99404616b1d5 214 x++;
Danyal 0:99404616b1d5 215 }
Danyal 0:99404616b1d5 216 return y;
Danyal 0:99404616b1d5 217 }
Danyal 0:99404616b1d5 218
Danyal 0:99404616b1d5 219
Danyal 0:99404616b1d5 220 int main(){
Danyal 0:99404616b1d5 221
Danyal 0:99404616b1d5 222 pc.printf("Press any key on the keyboard to start the program\n\r");
Danyal 0:99404616b1d5 223 pc.putc(pc.getc()); //echo keyboard input, blocking wait
Danyal 0:99404616b1d5 224 pc.printf(" was pressed\n\r");
Danyal 0:99404616b1d5 225 for (int32_t i=0;i<=5;i++){
Danyal 0:99404616b1d5 226 pc.printf("***\n\r"); //Generate some new lines
Danyal 0:99404616b1d5 227 }
Danyal 0:99404616b1d5 228 pc.printf("Messung wird gestartet.\n");
Danyal 0:99404616b1d5 229 pc.printf("Anzahl der vorrausichtlichen Messungen: %d.\n",MESSPUNKTE);
Danyal 0:99404616b1d5 230 pc.printf("Messabstaende in Millisekunden: %d.\n",DELAY_IN_MS);
Danyal 0:99404616b1d5 231 pc.printf("Userbutton druecken, um Messung vorlaeufig zu beenden.\n");
Danyal 0:99404616b1d5 232
Danyal 0:99404616b1d5 233 cs = 1;
Danyal 0:99404616b1d5 234 // Setup the spi for 8 bit data, high steady state clock,
Danyal 0:99404616b1d5 235 // second edge capture, with a 1MHz clock rate
Danyal 0:99404616b1d5 236 spi.format(8,0);
Danyal 0:99404616b1d5 237 spi.frequency(100000);
Danyal 0:99404616b1d5 238 int32_t adress =0x01; // starting register adress
Danyal 0:99404616b1d5 239
Danyal 0:99404616b1d5 240 //int x =0;
Danyal 0:99404616b1d5 241 int k = 1;
Danyal 0:99404616b1d5 242 counter = 0;
Danyal 0:99404616b1d5 243 while(counter<MESSPUNKTE && k){
Danyal 0:99404616b1d5 244
Danyal 0:99404616b1d5 245 saveData(getHours(),adress,getMinutes(),getTemp(),getInput());
Danyal 0:99404616b1d5 246 wait_ms(1);
Danyal 0:99404616b1d5 247
Danyal 0:99404616b1d5 248 adress = adress + ADDRESSINCREASE; // erhöhe Speicheradresse um 5
Danyal 0:99404616b1d5 249 counter++;
Danyal 0:99404616b1d5 250 pc.printf("Messung ausgefuehrt: %d\n",counter);
Danyal 0:99404616b1d5 251 k = delayOrEnd(DELAY_IN_MS);
Danyal 0:99404616b1d5 252 }
Danyal 0:99404616b1d5 253 pc.printf("\n");
Danyal 0:99404616b1d5 254 pc.printf("Messung beendet \n");
Danyal 0:99404616b1d5 255 pc.printf("*************************************************\n");
Danyal 0:99404616b1d5 256 readOutData(MESSPUNKTE*ADDRESSINCREASE); // MESSPUNKTE*ADDRESSINCREASE = Anzahl aller Daten.
Danyal 0:99404616b1d5 257
Danyal 0:99404616b1d5 258
Danyal 0:99404616b1d5 259 }