Advertisement
Guest User

Untitled

a guest
Feb 19th, 2019
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.75 KB | None | 0 0
  1. #include <Wire.h>
  2. #include "Adafruit_SGP30.h"
  3.  
  4. #define TCAADDR 0x70
  5. Adafruit_SGP30 sgp;
  6.  
  7.  
  8.  
  9. extern "C" {
  10. #include "utility/twi.h" // from Wire library, so we can do bus scanning
  11. }
  12.  
  13. void tcaselect(uint8_t i) {
  14. if (i > 7) return;
  15.  
  16. Wire.beginTransmission(TCAADDR);
  17. Wire.write(1 << i);
  18. Wire.endTransmission();
  19. }
  20.  
  21.  
  22. /* return absolute humidity [mg/m^3] with approximation formula
  23. * @param temperature [°C]
  24. * @param humidity [%RH]
  25. */
  26. uint32_t getAbsoluteHumidity(float temperature, float humidity) {
  27. // approximation formula from Sensirion SGP30 Driver Integration chapter 3.15
  28. const float absoluteHumidity = 216.7f * ((humidity / 100.0f) * 6.112f * exp((17.62f * temperature) / (243.12f + temperature)) / (273.15f + temperature)); // [g/m^3]
  29. const uint32_t absoluteHumidityScaled = static_cast<uint32_t>(1000.0f * absoluteHumidity); // [mg/m^3]
  30. return absoluteHumidityScaled;
  31. }
  32.  
  33. void setup() {
  34. while (!Serial);
  35. delay(1000);
  36. Wire.begin();
  37.  
  38. Serial.begin(115200);
  39. Serial.println("SGP30 test");
  40.  
  41. tcaselect(0); //Select sensor... using 0 and 1 at the moment
  42.  
  43. if (! sgp.begin()){
  44. Serial.println("Sensor not found :(");
  45. while (1);
  46. }
  47. }
  48.  
  49. int counter = 0;
  50.  
  51.  
  52. void loop() {
  53.  
  54. // If you have a temperature / humidity sensor, you can set the absolute humidity to enable the humditiy compensation for the air quality signals
  55. //float temperature = 22.1; // [°C]
  56. //float humidity = 45.2; // [%RH]
  57. //sgp.setHumidity(getAbsoluteHumidity(temperature, humidity));
  58.  
  59. if (! sgp.IAQmeasure()) {
  60. Serial.println("Measurement failed");
  61. return;
  62. }
  63. tcaselect(0); //seems to be ignoring this and reading second one no matter what
  64.  
  65. uint16_t TVOC_base, eCO2_base;
  66. if (! sgp.getIAQBaseline(&eCO2_base, &TVOC_base)) {
  67. Serial.println("Failed to get baseline readings");
  68. return;
  69. }
  70.  
  71. Serial.print("Sens 0 TVOC "); Serial.print(sgp.TVOC); Serial.print(" ppb \t");
  72. Serial.print("eCO2 "); Serial.print(sgp.eCO2); Serial.println(" ppm");
  73. delay(500);
  74.  
  75. tcaselect(1);
  76.  
  77. if (! sgp.getIAQBaseline(&eCO2_base, &TVOC_base)) {
  78. Serial.println("Failed to get baseline readings");
  79. return;
  80. }
  81.  
  82. Serial.print("Sens 1 TVOC "); Serial.print(sgp.TVOC); Serial.print(" ppb \t");
  83. Serial.print("eCO2 "); Serial.print(sgp.eCO2); Serial.println(" ppm");
  84. delay(500);
  85.  
  86. counter++;
  87. if (counter == 30) {
  88. counter = 0;
  89.  
  90. // uint16_t TVOC_base, eCO2_base;
  91. if (! sgp.getIAQBaseline(&eCO2_base, &TVOC_base)) {
  92. Serial.println("Failed to get baseline readings");
  93. return;
  94. }
  95. Serial.print("****Baseline values: eCO2: 0x"); Serial.print(eCO2_base, HEX);
  96. Serial.print(" & TVOC: 0x"); Serial.println(TVOC_base, HEX);
  97. }
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement