├── .github └── workflows │ └── githubci.yml ├── .gitignore ├── Adafruit_Sensor.cpp ├── Adafruit_Sensor.h ├── LICENSE.txt ├── README.md ├── examples └── sensortest │ └── sensortest.ino └── library.properties /.github/workflows/githubci.yml: -------------------------------------------------------------------------------- 1 | name: Arduino Library CI 2 | 3 | on: [pull_request, push, repository_dispatch] 4 | 5 | jobs: 6 | build: 7 | runs-on: ubuntu-latest 8 | 9 | steps: 10 | - uses: actions/setup-python@v4 11 | with: 12 | python-version: '3.x' 13 | - uses: actions/checkout@v3 14 | - uses: actions/checkout@v3 15 | with: 16 | repository: adafruit/ci-arduino 17 | path: ci 18 | 19 | - name: pre-install 20 | run: bash ci/actions_install.sh 21 | 22 | # manually install ADXL343 23 | - name: extra libraries 24 | run: | 25 | export PATH=$PATH:$GITHUB_WORKSPACE/bin 26 | arduino-cli lib install "Adafruit ADXL343" 27 | 28 | - name: test platforms 29 | run: python3 ci/build_platform.py main_platforms 30 | 31 | - name: clang 32 | run: python3 ci/run-clang-format.py -e "ci/*" -e "bin/*" -r . 33 | 34 | - name: doxygen 35 | env: 36 | GH_REPO_TOKEN: ${{ secrets.GH_REPO_TOKEN }} 37 | PRETTYNAME : "Adafruit Unified Sensor Library" 38 | run: bash ci/doxy_gen_and_deploy.sh 39 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # 2 | # NOTE! Don't add files that are generated in specific 3 | # subdirectories here. Add them in the ".gitignore" file 4 | # in that subdirectory instead. 5 | # 6 | # NOTE! Please use 'git ls-files -i --exclude-standard' 7 | # command after changing this file, to see if there are 8 | # any tracked files which get ignored after the change. 9 | # 10 | # Normal rules 11 | # 12 | .* 13 | *.o 14 | *.o.* 15 | *.a 16 | *.s 17 | *.ko 18 | *.so 19 | *.so.dbg 20 | *.mod.c 21 | *.i 22 | *.lst 23 | *.symtypes 24 | *.order 25 | modules.builtin 26 | *.elf 27 | *.bin 28 | *.gz 29 | *.bz2 30 | *.lzma 31 | *.patch 32 | *.gcno 33 | 34 | # 35 | # Top-level generic files 36 | # 37 | /tags 38 | /TAGS 39 | /linux 40 | /vmlinux 41 | /vmlinuz 42 | /System.map 43 | /Module.markers 44 | /Module.symvers 45 | 46 | # 47 | # git files that we don't want to ignore even it they are dot-files 48 | # 49 | !.gitignore 50 | !.mailmap 51 | 52 | # 53 | # Generated include files 54 | # 55 | include/config 56 | include/linux/version.h 57 | include/generated 58 | 59 | # stgit generated dirs 60 | patches-* 61 | 62 | # quilt's files 63 | patches 64 | series 65 | 66 | # cscope files 67 | cscope.* 68 | ncscope.* 69 | 70 | # gnu global files 71 | GPATH 72 | GRTAGS 73 | GSYMS 74 | GTAGS 75 | 76 | # QT-Creator files 77 | Makefile.am.user 78 | *.config 79 | *.creator 80 | *.creator.user 81 | *.files 82 | *.includes 83 | 84 | *.orig 85 | *~ 86 | \#*# 87 | *.lo 88 | *.la 89 | Makefile 90 | Makefile.in 91 | aclocal.m4 92 | autoconfig.h 93 | autoconfig.h.in 94 | autom4te.cache/ 95 | build-aux/ 96 | config.log 97 | config.status 98 | configure 99 | libtool 100 | libupnp.pc 101 | m4/libtool.m4 102 | m4/ltoptions.m4 103 | m4/ltsugar.m4 104 | m4/ltversion.m4 105 | m4/lt~obsolete.m4 106 | stamp-h1 107 | docs/doxygen 108 | 109 | -------------------------------------------------------------------------------- /Adafruit_Sensor.cpp: -------------------------------------------------------------------------------- 1 | #include "Adafruit_Sensor.h" 2 | 3 | /**************************************************************************/ 4 | /*! 5 | @brief Prints sensor information to serial console 6 | */ 7 | /**************************************************************************/ 8 | void Adafruit_Sensor::printSensorDetails(void) { 9 | sensor_t sensor; 10 | getSensor(&sensor); 11 | Serial.println(F("------------------------------------")); 12 | Serial.print(F("Sensor: ")); 13 | Serial.println(sensor.name); 14 | Serial.print(F("Type: ")); 15 | switch ((sensors_type_t)sensor.type) { 16 | case SENSOR_TYPE_ACCELEROMETER: 17 | Serial.print(F("Acceleration (m/s2)")); 18 | break; 19 | case SENSOR_TYPE_MAGNETIC_FIELD: 20 | Serial.print(F("Magnetic (uT)")); 21 | break; 22 | case SENSOR_TYPE_ORIENTATION: 23 | Serial.print(F("Orientation (degrees)")); 24 | break; 25 | case SENSOR_TYPE_GYROSCOPE: 26 | Serial.print(F("Gyroscopic (rad/s)")); 27 | break; 28 | case SENSOR_TYPE_LIGHT: 29 | Serial.print(F("Light (lux)")); 30 | break; 31 | case SENSOR_TYPE_PRESSURE: 32 | Serial.print(F("Pressure (hPa)")); 33 | break; 34 | case SENSOR_TYPE_PROXIMITY: 35 | Serial.print(F("Distance (cm)")); 36 | break; 37 | case SENSOR_TYPE_GRAVITY: 38 | Serial.print(F("Gravity (m/s2)")); 39 | break; 40 | case SENSOR_TYPE_LINEAR_ACCELERATION: 41 | Serial.print(F("Linear Acceleration (m/s2)")); 42 | break; 43 | case SENSOR_TYPE_ROTATION_VECTOR: 44 | Serial.print(F("Rotation vector")); 45 | break; 46 | case SENSOR_TYPE_RELATIVE_HUMIDITY: 47 | Serial.print(F("Relative Humidity (%)")); 48 | break; 49 | case SENSOR_TYPE_AMBIENT_TEMPERATURE: 50 | Serial.print(F("Ambient Temp (C)")); 51 | break; 52 | case SENSOR_TYPE_OBJECT_TEMPERATURE: 53 | Serial.print(F("Object Temp (C)")); 54 | break; 55 | case SENSOR_TYPE_VOLTAGE: 56 | Serial.print(F("Voltage (V)")); 57 | break; 58 | case SENSOR_TYPE_CURRENT: 59 | Serial.print(F("Current (mA)")); 60 | break; 61 | case SENSOR_TYPE_COLOR: 62 | Serial.print(F("Color (RGBA)")); 63 | break; 64 | case SENSOR_TYPE_TVOC: 65 | Serial.print(F("Total Volatile Organic Compounds (ppb)")); 66 | break; 67 | case SENSOR_TYPE_VOC_INDEX: 68 | Serial.print(F("Volatile Organic Compounds (Index)")); 69 | break; 70 | case SENSOR_TYPE_NOX_INDEX: 71 | Serial.print(F("Nitrogen Oxides (Index)")); 72 | break; 73 | case SENSOR_TYPE_CO2: 74 | Serial.print(F("Carbon Dioxide (ppm)")); 75 | break; 76 | case SENSOR_TYPE_ECO2: 77 | Serial.print(F("Equivalent/estimated CO2 (ppm)")); 78 | break; 79 | case SENSOR_TYPE_PM10_STD: 80 | Serial.print(F("Standard Particulate Matter 1.0 (ppm)")); 81 | break; 82 | case SENSOR_TYPE_PM25_STD: 83 | Serial.print(F("Standard Particulate Matter 2.5 (ppm)")); 84 | break; 85 | case SENSOR_TYPE_PM100_STD: 86 | Serial.print(F("Standard Particulate Matter 10.0 (ppm)")); 87 | break; 88 | case SENSOR_TYPE_PM10_ENV: 89 | Serial.print(F("Environmental Particulate Matter 1.0 (ppm)")); 90 | break; 91 | case SENSOR_TYPE_PM25_ENV: 92 | Serial.print(F("Environmental Particulate Matter 2.5 (ppm)")); 93 | break; 94 | case SENSOR_TYPE_PM100_ENV: 95 | Serial.print(F("Environmental Particulate Matter 10.0 (ppm)")); 96 | break; 97 | case SENSOR_TYPE_GAS_RESISTANCE: 98 | Serial.print(F("Gas Resistance (ohms)")); 99 | break; 100 | case SENSOR_TYPE_UNITLESS_PERCENT: 101 | Serial.print(F("Unitless Percent (%)")); 102 | break; 103 | case SENSOR_TYPE_ALTITUDE: 104 | Serial.print(F("Altitude (m)")); 105 | break; 106 | } 107 | 108 | Serial.println(); 109 | Serial.print(F("Driver Ver: ")); 110 | Serial.println(sensor.version); 111 | Serial.print(F("Unique ID: ")); 112 | Serial.println(sensor.sensor_id); 113 | Serial.print(F("Min Value: ")); 114 | Serial.println(sensor.min_value); 115 | Serial.print(F("Max Value: ")); 116 | Serial.println(sensor.max_value); 117 | Serial.print(F("Resolution: ")); 118 | Serial.println(sensor.resolution); 119 | Serial.println(F("------------------------------------\n")); 120 | } 121 | -------------------------------------------------------------------------------- /Adafruit_Sensor.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2008 The Android Open Source Project 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software< /span> 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | /* Update by K. Townsend (Adafruit Industries) for lighter typedefs, and 18 | * extended sensor support to include color, voltage and current */ 19 | 20 | #ifndef _ADAFRUIT_SENSOR_H 21 | #define _ADAFRUIT_SENSOR_H 22 | 23 | #ifndef ARDUINO 24 | #include 25 | #elif ARDUINO >= 100 26 | #include "Arduino.h" 27 | #include "Print.h" 28 | #else 29 | #include "WProgram.h" 30 | #endif 31 | 32 | /* Constants */ 33 | #define SENSORS_GRAVITY_EARTH (9.80665F) /**< Earth's gravity in m/s^2 */ 34 | #define SENSORS_GRAVITY_MOON (1.6F) /**< The moon's gravity in m/s^2 */ 35 | #define SENSORS_GRAVITY_SUN (275.0F) /**< The sun's gravity in m/s^2 */ 36 | #define SENSORS_GRAVITY_STANDARD (SENSORS_GRAVITY_EARTH) 37 | #define SENSORS_MAGFIELD_EARTH_MAX \ 38 | (60.0F) /**< Maximum magnetic field on Earth's surface */ 39 | #define SENSORS_MAGFIELD_EARTH_MIN \ 40 | (30.0F) /**< Minimum magnetic field on Earth's surface */ 41 | #define SENSORS_PRESSURE_SEALEVELHPA \ 42 | (1013.25F) /**< Average sea level pressure is 1013.25 hPa */ 43 | #define SENSORS_DPS_TO_RADS \ 44 | (0.017453293F) /**< Degrees/s to rad/s multiplier \ 45 | */ 46 | #define SENSORS_RADS_TO_DPS \ 47 | (57.29577793F) /**< Rad/s to degrees/s multiplier */ 48 | #define SENSORS_GAUSS_TO_MICROTESLA \ 49 | (100) /**< Gauss to micro-Tesla multiplier */ 50 | 51 | /** Sensor types */ 52 | typedef enum { 53 | SENSOR_TYPE_ACCELEROMETER = (1), /**< Gravity + linear acceleration */ 54 | SENSOR_TYPE_MAGNETIC_FIELD = (2), 55 | SENSOR_TYPE_ORIENTATION = (3), 56 | SENSOR_TYPE_GYROSCOPE = (4), 57 | SENSOR_TYPE_LIGHT = (5), 58 | SENSOR_TYPE_PRESSURE = (6), 59 | SENSOR_TYPE_PROXIMITY = (8), 60 | SENSOR_TYPE_GRAVITY = (9), 61 | SENSOR_TYPE_LINEAR_ACCELERATION = 62 | (10), /**< Acceleration not including gravity */ 63 | SENSOR_TYPE_ROTATION_VECTOR = (11), 64 | SENSOR_TYPE_RELATIVE_HUMIDITY = (12), 65 | SENSOR_TYPE_AMBIENT_TEMPERATURE = (13), 66 | SENSOR_TYPE_OBJECT_TEMPERATURE = (14), 67 | SENSOR_TYPE_VOLTAGE = (15), 68 | SENSOR_TYPE_CURRENT = (16), 69 | SENSOR_TYPE_COLOR = (17), 70 | SENSOR_TYPE_TVOC = (18), 71 | SENSOR_TYPE_VOC_INDEX = (19), 72 | SENSOR_TYPE_NOX_INDEX = (20), 73 | SENSOR_TYPE_CO2 = (21), 74 | SENSOR_TYPE_ECO2 = (22), 75 | SENSOR_TYPE_PM10_STD = (23), 76 | SENSOR_TYPE_PM25_STD = (24), 77 | SENSOR_TYPE_PM100_STD = (25), 78 | SENSOR_TYPE_PM10_ENV = (26), 79 | SENSOR_TYPE_PM25_ENV = (27), 80 | SENSOR_TYPE_PM100_ENV = (28), 81 | SENSOR_TYPE_GAS_RESISTANCE = (29), 82 | SENSOR_TYPE_UNITLESS_PERCENT = (30), 83 | SENSOR_TYPE_ALTITUDE = (31) 84 | } sensors_type_t; 85 | 86 | /** struct sensors_vec_s is used to return a vector in a common format. */ 87 | typedef struct { 88 | union { 89 | float v[3]; ///< 3D vector elements 90 | struct { 91 | float x; ///< X component of vector 92 | float y; ///< Y component of vector 93 | float z; ///< Z component of vector 94 | }; ///< Struct for holding XYZ component 95 | /* Orientation sensors */ 96 | struct { 97 | float roll; /**< Rotation around the longitudinal axis (the plane body, 'X 98 | axis'). Roll is positive and increasing when moving 99 | downward. -90 degrees <= roll <= 90 degrees */ 100 | float pitch; /**< Rotation around the lateral axis (the wing span, 'Y 101 | axis'). Pitch is positive and increasing when moving 102 | upwards. -180 degrees <= pitch <= 180 degrees) */ 103 | float heading; /**< Angle between the longitudinal axis (the plane body) 104 | and magnetic north, measured clockwise when viewing from 105 | the top of the device. 0-359 degrees */ 106 | }; ///< Struct for holding roll/pitch/heading 107 | }; ///< Union that can hold 3D vector array, XYZ components or 108 | ///< roll/pitch/heading 109 | int8_t status; ///< Status byte 110 | uint8_t reserved[3]; ///< Reserved 111 | } sensors_vec_t; 112 | 113 | /** struct sensors_color_s is used to return color data in a common format. */ 114 | typedef struct { 115 | union { 116 | float c[3]; ///< Raw 3-element data 117 | /* RGB color space */ 118 | struct { 119 | float r; /**< Red component */ 120 | float g; /**< Green component */ 121 | float b; /**< Blue component */ 122 | }; ///< RGB data in floating point notation 123 | }; ///< Union of various ways to describe RGB colorspace 124 | uint32_t rgba; /**< 24-bit RGBA value */ 125 | } sensors_color_t; 126 | 127 | /* Sensor event (36 bytes) */ 128 | /** struct sensor_event_s is used to provide a single sensor event in a common 129 | * format. */ 130 | typedef struct { 131 | int32_t version; /**< must be sizeof(struct sensors_event_t) */ 132 | int32_t sensor_id; /**< unique sensor identifier */ 133 | int32_t type; /**< sensor type */ 134 | int32_t reserved0; /**< reserved */ 135 | int32_t timestamp; /**< time is in milliseconds */ 136 | union { 137 | float data[4]; ///< Raw data */ 138 | sensors_vec_t acceleration; /**< acceleration values are in meter per second 139 | per second (m/s^2) */ 140 | sensors_vec_t 141 | magnetic; /**< magnetic vector values are in micro-Tesla (uT) */ 142 | sensors_vec_t orientation; /**< orientation values are in degrees */ 143 | sensors_vec_t gyro; /**< gyroscope values are in rad/s */ 144 | float temperature; /**< temperature is in degrees centigrade (Celsius) */ 145 | float distance; /**< distance in centimeters */ 146 | float light; /**< light in SI lux units */ 147 | float pressure; /**< pressure in hectopascal (hPa) */ 148 | float relative_humidity; /**< relative humidity in percent */ 149 | float current; /**< current in milliamps (mA) */ 150 | float voltage; /**< voltage in volts (V) */ 151 | float tvoc; /**< Total Volatile Organic Compounds, in ppb */ 152 | float voc_index; /**< VOC (Volatile Organic Compound) index where 100 is 153 | normal (unitless) */ 154 | float nox_index; /**< NOx (Nitrogen Oxides) index where 1 is normal 155 | (unitless) */ 156 | float CO2; /**< Measured CO2 in parts per million (ppm) */ 157 | float eCO2; /**< equivalent/estimated CO2 in parts per million (ppm 158 | estimated from some other measurement) */ 159 | float pm10_std; /**< Standard Particulate Matter <=1.0 in parts per million 160 | (ppm) */ 161 | float pm25_std; /**< Standard Particulate Matter <=2.5 in parts per million 162 | (ppm) */ 163 | float pm100_std; /**< Standard Particulate Matter <=10.0 in parts per 164 | million (ppm) */ 165 | float pm10_env; /**< Environmental Particulate Matter <=1.0 in parts per 166 | million (ppm) */ 167 | float pm25_env; /**< Environmental Particulate Matter <=2.5 in parts per 168 | million (ppm) */ 169 | float pm100_env; /**< Environmental Particulate Matter <=10.0 in parts per 170 | million (ppm) */ 171 | float gas_resistance; /**< Proportional to the amount of VOC particles in 172 | the air (Ohms) */ 173 | float unitless_percent; /** 2 | #include 3 | #include 4 | 5 | /* Assign a unique ID to this sensor at the same time */ 6 | /* Uncomment following line for default Wire bus */ 7 | Adafruit_ADXL343 accel = Adafruit_ADXL343(12345); 8 | 9 | /* NeoTrellis M4, etc. */ 10 | /* Uncomment following line for Wire1 bus */ 11 | //Adafruit_ADXL343 accel = Adafruit_ADXL343(12345, &Wire1); 12 | 13 | void displaySensorDetails(void) 14 | { 15 | sensor_t sensor; 16 | accel.getSensor(&sensor); 17 | Serial.println("------------------------------------"); 18 | Serial.print ("Sensor: "); Serial.println(sensor.name); 19 | Serial.print ("Driver Ver: "); Serial.println(sensor.version); 20 | Serial.print ("Unique ID: "); Serial.println(sensor.sensor_id); 21 | Serial.print ("Max Value: "); Serial.print(sensor.max_value); Serial.println(" m/s^2"); 22 | Serial.print ("Min Value: "); Serial.print(sensor.min_value); Serial.println(" m/s^2"); 23 | Serial.print ("Resolution: "); Serial.print(sensor.resolution); Serial.println(" m/s^2"); 24 | Serial.println("------------------------------------"); 25 | Serial.println(""); 26 | delay(500); 27 | } 28 | 29 | void displayDataRate(void) 30 | { 31 | Serial.print ("Data Rate: "); 32 | 33 | switch(accel.getDataRate()) 34 | { 35 | case ADXL343_DATARATE_3200_HZ: 36 | Serial.print ("3200 "); 37 | break; 38 | case ADXL343_DATARATE_1600_HZ: 39 | Serial.print ("1600 "); 40 | break; 41 | case ADXL343_DATARATE_800_HZ: 42 | Serial.print ("800 "); 43 | break; 44 | case ADXL343_DATARATE_400_HZ: 45 | Serial.print ("400 "); 46 | break; 47 | case ADXL343_DATARATE_200_HZ: 48 | Serial.print ("200 "); 49 | break; 50 | case ADXL343_DATARATE_100_HZ: 51 | Serial.print ("100 "); 52 | break; 53 | case ADXL343_DATARATE_50_HZ: 54 | Serial.print ("50 "); 55 | break; 56 | case ADXL343_DATARATE_25_HZ: 57 | Serial.print ("25 "); 58 | break; 59 | case ADXL343_DATARATE_12_5_HZ: 60 | Serial.print ("12.5 "); 61 | break; 62 | case ADXL343_DATARATE_6_25HZ: 63 | Serial.print ("6.25 "); 64 | break; 65 | case ADXL343_DATARATE_3_13_HZ: 66 | Serial.print ("3.13 "); 67 | break; 68 | case ADXL343_DATARATE_1_56_HZ: 69 | Serial.print ("1.56 "); 70 | break; 71 | case ADXL343_DATARATE_0_78_HZ: 72 | Serial.print ("0.78 "); 73 | break; 74 | case ADXL343_DATARATE_0_39_HZ: 75 | Serial.print ("0.39 "); 76 | break; 77 | case ADXL343_DATARATE_0_20_HZ: 78 | Serial.print ("0.20 "); 79 | break; 80 | case ADXL343_DATARATE_0_10_HZ: 81 | Serial.print ("0.10 "); 82 | break; 83 | default: 84 | Serial.print ("???? "); 85 | break; 86 | } 87 | Serial.println(" Hz"); 88 | } 89 | 90 | void displayRange(void) 91 | { 92 | Serial.print ("Range: +/- "); 93 | 94 | switch(accel.getRange()) 95 | { 96 | case ADXL343_RANGE_16_G: 97 | Serial.print ("16 "); 98 | break; 99 | case ADXL343_RANGE_8_G: 100 | Serial.print ("8 "); 101 | break; 102 | case ADXL343_RANGE_4_G: 103 | Serial.print ("4 "); 104 | break; 105 | case ADXL343_RANGE_2_G: 106 | Serial.print ("2 "); 107 | break; 108 | default: 109 | Serial.print ("?? "); 110 | break; 111 | } 112 | Serial.println(" g"); 113 | } 114 | 115 | void setup(void) 116 | { 117 | Serial.begin(9600); 118 | while (!Serial); 119 | Serial.println("Accelerometer Test"); Serial.println(""); 120 | 121 | /* Initialise the sensor */ 122 | if(!accel.begin()) 123 | { 124 | /* There was a problem detecting the ADXL343 ... check your connections */ 125 | Serial.println("Ooops, no ADXL343 detected ... Check your wiring!"); 126 | while(1); 127 | } 128 | 129 | /* Set the range to whatever is appropriate for your project */ 130 | accel.setRange(ADXL343_RANGE_16_G); 131 | // accel.setRange(ADXL343_RANGE_8_G); 132 | // accel.setRange(ADXL343_RANGE_4_G); 133 | // accel.setRange(ADXL343_RANGE_2_G); 134 | 135 | /* Display some basic information on this sensor */ 136 | displaySensorDetails(); 137 | displayDataRate(); 138 | displayRange(); 139 | Serial.println(""); 140 | } 141 | 142 | void loop(void) 143 | { 144 | /* Get a new sensor event */ 145 | sensors_event_t event; 146 | accel.getEvent(&event); 147 | 148 | /* Display the results (acceleration is measured in m/s^2) */ 149 | Serial.print("X: "); Serial.print(event.acceleration.x); Serial.print(" "); 150 | Serial.print("Y: "); Serial.print(event.acceleration.y); Serial.print(" "); 151 | Serial.print("Z: "); Serial.print(event.acceleration.z); Serial.print(" ");Serial.println("m/s^2 "); 152 | delay(500); 153 | } 154 | -------------------------------------------------------------------------------- /library.properties: -------------------------------------------------------------------------------- 1 | name=Adafruit Unified Sensor 2 | version=1.1.15 3 | author=Adafruit 4 | maintainer=Adafruit 5 | sentence=Required for all Adafruit Unified Sensor based libraries. 6 | paragraph=A unified sensor abstraction layer used by many Adafruit sensor libraries. 7 | category=Sensors 8 | url=https://github.com/adafruit/Adafruit_Sensor 9 | architectures=* 10 | includes=Adafruit_Sensor.h 11 | 12 | --------------------------------------------------------------------------------