CoMoDoS

arduino lab6

Nov 7th, 2017
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.28 KB | None | 0 0
  1. #include <LiquidCrystal.h>
  2. #include <Wire.h>
  3. #define BME280_ADDRESS (0x77) // Adresa I2C a senzorului
  4. #define BME280_REGISTER_CHIPID (0xD0) // Adresa registrului ChipID
  5. #define BME280_REGISTER_CONTROLHUMID (0xF2) // Adresa registrului de configurare, umiditate
  6. #define BME280_REGISTER_CONTROL (0xF4) // Adresa registrului de configurare, masuratori
  7. #define BME280_REGISTER_TEMPDATA (0xFA) // Adresa registrului de date, temperatura
  8. int plus,minus;
  9. typedef struct
  10. {
  11. uint16_t dig_T1; int16_t dig_T2; int16_t dig_T3;
  12. uint16_t dig_P1; int16_t dig_P2; int16_t dig_P3; int16_t dig_P4; int16_t dig_P5;
  13. int16_t dig_P6; int16_t dig_P7; int16_t dig_P8; int16_t dig_P9;
  14. uint8_t dig_H1; int16_t dig_H2; uint8_t dig_H3; int16_t dig_H4; int16_t dig_H5; int8_t dig_H6;
  15. } bme280_calib_data;
  16. // Factori de calibrare. In mod normal acestia se citesc din memoria ROM a senzorului
  17. bme280_calib_data _bme280_calib = {28398, 26500, 50, 36953, -10772, 3024, 7550, 6, -7, 9900, -10230,
  18. 4285, 75, 368, 0, 302, 0, 30};
  19. int32_t t_fine;
  20. // Functia de compensare din Datasheet, de la pag. 23
  21. // https://ae-bst.resource.bosch.com/media/_tech/media/datasheets/BST-BME280_DS001-11.pdf
  22. float compensateTemperature(int32_t adc_T)
  23. {
  24. int32_t var1, var2;
  25. adc_T >>= 4;
  26. var1 = ((((adc_T>>3) - ((int32_t)_bme280_calib.dig_T1 <<1))) *
  27. ((int32_t)_bme280_calib.dig_T2)) >> 11;
  28. var2 = (((((adc_T>>4) - ((int32_t)_bme280_calib.dig_T1)) *
  29. ((adc_T>>4) - ((int32_t)_bme280_calib.dig_T1))) >> 12) *
  30. ((int32_t)_bme280_calib.dig_T3)) >> 14;
  31. t_fine = var1 + var2;
  32. float T = (t_fine * 5 + 128) >> 8;
  33. return T/100;
  34. }
  35. LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
  36. //se creaza o valoare intermediara in asa fel incat
  37. //sa stergem ecranul LCD ului doar cand valoarea se modifica
  38. int valIntermediar;
  39. void setup()
  40. {
  41. Serial.begin(9600);
  42. Wire.begin();
  43. Serial.println("BME280 test");
  44. delay(500);
  45.  
  46. // Exemplu citire registru
  47. // Citim CHIPID
  48. Wire.beginTransmission((uint8_t)BME280_ADDRESS);
  49. Wire.write((uint8_t)BME280_REGISTER_CHIPID);
  50. Wire.endTransmission();
  51. Wire.requestFrom((uint8_t)BME280_ADDRESS, (byte)1);
  52. uint8_t value = Wire.read();
  53. Serial.print("Registru Chip_Id (0xD0): ");
  54. Serial.println(value);
  55.  
  56. // Exemplu scriere registru
  57. // Setam umiditatea la 16x oversampling
  58. Wire.beginTransmission((uint8_t)BME280_ADDRESS);
  59. Wire.write((uint8_t)BME280_REGISTER_CONTROLHUMID);
  60. Wire.write((uint8_t)0x05);
  61. Wire.endTransmission();
  62. // Setam Temperatura si Presiunea la 16x oversampling + Normal mode (Not sleep)
  63. Wire.beginTransmission((uint8_t)BME280_ADDRESS);
  64. Wire.write((uint8_t)BME280_REGISTER_CONTROL);
  65. Wire.write((uint8_t)0xB7);
  66. Wire.endTransmission();
  67.  
  68. //parte 1 end
  69.  
  70. //setam tensiunea de referinta la 5V
  71. analogReference(DEFAULT); //setarea tensiunii de referinta la tensiunea default
  72. lcd.begin(16, 2); //initializarea LCD ului
  73. lcd.setCursor(0,0);
  74. lcd.print("Cititi senzor");
  75. pinMode(A1, INPUT); // setarea pinului analogic A1 ca si pin de input
  76. digitalWrite(A1, HIGH); //activarea rezistorului pull up pentru pinul A1
  77. //initializam valoarea intermediara la o valoare foarte mare
  78. valIntermediar = 1000;
  79. }
  80. void loop()
  81. {
  82. Wire.beginTransmission((uint8_t)BME280_ADDRESS);
  83. Wire.write((uint8_t)BME280_REGISTER_TEMPDATA);
  84. Wire.endTransmission();
  85.  
  86. // Temperatura raw este in registrii 0xFA, 0xFB, 0xFC.
  87. // Putem citii registrii consecutiv, si adresa se auto incrementeaza
  88. Wire.requestFrom((uint8_t)BME280_ADDRESS, (byte)3);
  89. uint32_t raw_temperature;
  90. raw_temperature = Wire.read();
  91. raw_temperature <<= 8;
  92. raw_temperature |= Wire.read();
  93. raw_temperature <<= 8;
  94. raw_temperature |= Wire.read();
  95.  
  96. // Temperatura raw e pe 20 de biti
  97. Serial.print("Temperatura raw: ");
  98. Serial.println(raw_temperature >> 4);
  99.  
  100.  
  101.  
  102. int val = analogRead(A1); //citirea valorii analogice
  103. //luam tasta aferenta tensiunii analogice
  104. val = getTasta(val);
  105. valIntermediar = compensateTemperature(raw_temperature);
  106. if(val == 1) plus ++;
  107. if(val == 2) minus ++;
  108. if(valIntermediar != val)
  109. {
  110. //setam ca noua valoare intermediara sa fie egala cu val
  111.  
  112. lcd.clear();//curatam ecranul
  113. lcd.setCursor(0,0);
  114. lcd.print("Cititi senzor");
  115. lcd.setCursor(0,1);//si afisam noua valoare
  116. lcd.print(valIntermediar + plus - minus);
  117. }
  118.  
  119. }
  120. /*
  121. in aceasta functie se paseaza ca si parametru o valoare analogica
  122. si se returneaza o tasta corespunzatoare acelei valori
  123. Din cauza faptului ca semnalul analogic nu este filtrat si stabilizat acesta
  124. fluctueaza in continuu.
  125. Pentru a prinde doar acele valori care ne intereseaza se face o histereza
  126. Intervalele au fost alese experimental, bineinteles bazandu-ne si pe tensiunile din
  127. data
  128. sheet.
  129. */
  130. int getTasta(int val)
  131. {
  132. if(val > 50 && val < 80)return 12;//e apasata tasta 12
  133. else if(val > 90 && val < 120) return 11; //e apasata tasta 11
  134. else if(val > 120 && val < 160) return 10; // si asa mai departe…
  135. else if(val > 160 && val < 200) return 9;
  136. else if(val > 200 && val < 240)return 8;
  137. else if(val > 240 && val < 290) return 7;
  138. else if(val > 290 && val < 320) return 6;
  139. else if(val > 320 && val < 370) return 5;
  140. else if(val > 370 && val < 410) return 4;
  141. else if(val > 410 && val < 450) return 3;
  142. else if(val > 450 && val < 490) return 2;
  143. else if(val > 490 && val < 530) return 1;
  144. else return 0; //pentru orice alta valoare returnam 0 – tasta neapasata
  145. }
Advertisement
Add Comment
Please, Sign In to add comment