Refactor sensor interface with extra files and function pointer
That makes it easier to enable/disable sensors. Also added support for APDS9930
This commit is contained in:
parent
abcfcd276c
commit
be334245ff
24 changed files with 2832 additions and 138 deletions
|
@ -10,6 +10,11 @@
|
|||
// Enable/Disable features
|
||||
//#define WEBUPDATER_FEATURE
|
||||
#define BATTERY_POWERED
|
||||
#define SENSOR_WIND
|
||||
#define SENSOR_APDS9960
|
||||
//#define SENSOR_APDS9930
|
||||
#define SENSOR_BME280
|
||||
#define SENSOR_BATTERY
|
||||
|
||||
const float HUMIDITY_FACTOR = 1.0;
|
||||
const float LIGHT_FACTOR = 1.0;
|
||||
|
@ -27,4 +32,3 @@ const char *INFLUXDB_PASS = "password";
|
|||
String DEVICE_NAME = "devicename";
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
@ -18,8 +18,6 @@
|
|||
#include <WiFiClient.h> // WiFiClient
|
||||
#include <WiFiManager.h> // WiFiManager
|
||||
#include <ESP8266Influxdb.h> // https://github.com/hwwong/ESP8266Influxdb auchecken und den ordner in das arduino\library verzeichnis kopieren
|
||||
#include <Adafruit_APDS9960.h> // Adafruit APDS9960 - https://www.makerfabs.com/index.php?route=product/product&product_id=281
|
||||
#include <Adafruit_BME280.h> // BME280 - https://www.roboter-bausatz.de/1704/bmp280-barometer-luftdrucksensor?gclid=EAIaIQobChMIlpumj8Hp2wIVFWYbCh01PgmFEAQYAyABEgIwBvD_BwE
|
||||
|
||||
// Project includes
|
||||
#include "config.h"
|
||||
|
@ -49,18 +47,15 @@
|
|||
|
||||
//*************************************************************************//
|
||||
|
||||
float currentSensorData[8] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
|
||||
const uint8_t VALUES = 8;
|
||||
float currentSensorData[VALUES] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
|
||||
float (*sensors[VALUES])() = {};
|
||||
|
||||
uint16_t update_sensor_cnt = 0;
|
||||
uint16_t update_webserver_cnt = 0;
|
||||
uint16_t energySavingIterations = 0;
|
||||
|
||||
WiFiManager wifiManager;
|
||||
Influxdb influxdb(INFLUXDB_HOST, INFLUXDB_PORT);
|
||||
Adafruit_APDS9960 apds;
|
||||
Adafruit_BME280 bme;
|
||||
|
||||
bool apds_connected = false;
|
||||
|
||||
#ifdef WEBUPDATER_FEATURE
|
||||
String localIP = "127.0.0.1";
|
||||
|
@ -117,21 +112,36 @@ void setup() {
|
|||
influxdb.opendb(INFLUXDB_DB, INFLUXDB_USER, INFLUXDB_PASS);
|
||||
|
||||
// Initialize and configure the sensors
|
||||
//Light Sensor
|
||||
if (apds.begin()) {
|
||||
apds_connected = true;
|
||||
apds.enableColor(true);
|
||||
#ifdef SENSOR_APDS9930
|
||||
if (sensor_apds9930_begin()) {
|
||||
sensors[SENSOR_LIGHT] = &apds9930_light;
|
||||
}
|
||||
#endif
|
||||
|
||||
debug("APDS Connected!");
|
||||
#ifdef SENSOR_APDS9960
|
||||
if (sensor_apds9960_begin()) {
|
||||
sensors[SENSOR_LIGHT] = &apds9930_light;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef SENSOR_BME280
|
||||
//Temperature + pressure
|
||||
bool status = bme.begin(BME_ADDRESS);
|
||||
if (!status) {
|
||||
debug("Could not find a valid BME280 sensor, check wiring!");
|
||||
//#warning TODO: FIXME while (1);
|
||||
if (sensor_bme280_begin(BME_ADDRESS)) {
|
||||
sensors[SENSOR_TEMPERATURE] = &bme280_temperature;
|
||||
sensors[SENSOR_HUMIDITY] = &bme280_humidity;
|
||||
sensors[SENSOR_PRESSURE] = &bme280_pressure;
|
||||
}
|
||||
debug("BME Connected!");
|
||||
#endif
|
||||
|
||||
#ifdef SENSOR_WIND
|
||||
sensors[SENSOR_WINDSPEED] = &wind_speed;
|
||||
#endif
|
||||
|
||||
#ifdef SENSOR_BATTERY
|
||||
sensors[SENSOR_BAT_VOLTAGE] = &battery_voltage;
|
||||
sensors[SENSOR_BATCHARGESTATE] = &battery_charging;
|
||||
sensors[SENSOR_ESAVEMODE] = &isEnergySavingMode;
|
||||
#endif
|
||||
|
||||
#ifdef WEBUPDATER_FEATURE
|
||||
#ifndef BATTERY_POWERED
|
||||
|
@ -166,7 +176,7 @@ void setup() {
|
|||
|
||||
#ifdef BATTERY_POWERED
|
||||
void criticalBatCheck() {
|
||||
float volt = getBatteryVoltage();
|
||||
float volt = battery_voltage();
|
||||
if (volt <= BAT_EMERGENCY_DEEPSLEEP_VOLTAGE) {
|
||||
debug("Bat Voltage: " + String(volt) + " V");
|
||||
debug("Low battery, going into deep sleep.");
|
||||
|
@ -177,26 +187,6 @@ void criticalBatCheck() {
|
|||
}
|
||||
#endif
|
||||
|
||||
#ifdef BATTERY_POWERED
|
||||
int energySavingMode() {
|
||||
// Give the solar panel some time to load the cell to prevent
|
||||
// flapping.
|
||||
if (energySavingIterations > 0) {
|
||||
energySavingIterations--;
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Is the battery low?
|
||||
if (currentSensorData[SENSOR_BAT_VOLTAGE] <= BAT_LOW_VOLTAGE) {
|
||||
// Entering energy saving
|
||||
energySavingIterations = ENERGY_SAVING_ITERATIONS;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
void loop() {
|
||||
#ifdef BATTERY_POWERED
|
||||
|
@ -232,32 +222,25 @@ void _loop() {
|
|||
}
|
||||
#endif
|
||||
|
||||
update_sensor_cnt = 0;
|
||||
currentSensorData[SENSOR_TEMPERATURE] = fetchTemperature();
|
||||
currentSensorData[SENSOR_HUMIDITY] = fetchHumidity();
|
||||
if (apds_connected) {
|
||||
currentSensorData[SENSOR_LIGHT] = fetchLight();
|
||||
}
|
||||
currentSensorData[SENSOR_PRESSURE] = fetchPressure();
|
||||
#ifdef BATTERY_POWERED
|
||||
currentSensorData[SENSOR_BAT_VOLTAGE] = getBatteryVoltage();
|
||||
currentSensorData[SENSOR_BATCHARGESTATE] = isBatCharging();
|
||||
#else
|
||||
currentSensorData[SENSOR_BAT_VOLTAGE] = 0xFFFFFFFF;
|
||||
currentSensorData[SENSOR_BATCHARGESTATE] = 0xFFFFFFFF;
|
||||
#endif
|
||||
#ifdef BATTERY_POWERED
|
||||
|
||||
#ifdef defined(BATTERY_POWERED) && defined(SENSOR_WIND)
|
||||
if (energySavingMode() == 1) {
|
||||
// Disable expensive tasks
|
||||
if (energySavingMode() == 0) {
|
||||
sensors[SENSOR_WINDSPEED] = 0;
|
||||
} else {
|
||||
sensors[SENSOR_WINDSPEED] = &wind_speed;
|
||||
}
|
||||
#endif
|
||||
currentSensorData[SENSOR_WINDSPEED] = fetchWindspeed();
|
||||
currentSensorData[SENSOR_ESAVEMODE] = ENERGY_SAVE_MODE_DISABLED;
|
||||
#ifdef BATTERY_POWERED
|
||||
|
||||
update_sensor_cnt = 0;
|
||||
|
||||
for (uint8_t i = 0; i < VALUES; i++) {
|
||||
if (sensors[i]) {
|
||||
currentSensorData[i] = sensors[i]();
|
||||
} else {
|
||||
currentSensorData[SENSOR_WINDSPEED] = 0xFFFFFFFF;
|
||||
currentSensorData[SENSOR_ESAVEMODE] = ENERGY_SAVE_MODE_ENABLED;
|
||||
currentSensorData[i] = 0xFFFFFFFF;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
debug("");
|
||||
debug("Current readings:");
|
||||
|
|
22
firmware/libraries/APDS9930-master/.gitattributes
vendored
Normal file
22
firmware/libraries/APDS9930-master/.gitattributes
vendored
Normal file
|
@ -0,0 +1,22 @@
|
|||
# Auto detect text files and perform LF normalization
|
||||
* text=auto
|
||||
|
||||
# Custom for Visual Studio
|
||||
*.cs diff=csharp
|
||||
*.sln merge=union
|
||||
*.csproj merge=union
|
||||
*.vbproj merge=union
|
||||
*.fsproj merge=union
|
||||
*.dbproj merge=union
|
||||
|
||||
# Standard to msysgit
|
||||
*.doc diff=astextplain
|
||||
*.DOC diff=astextplain
|
||||
*.docx diff=astextplain
|
||||
*.DOCX diff=astextplain
|
||||
*.dot diff=astextplain
|
||||
*.DOT diff=astextplain
|
||||
*.pdf diff=astextplain
|
||||
*.PDF diff=astextplain
|
||||
*.rtf diff=astextplain
|
||||
*.RTF diff=astextplain
|
192
firmware/libraries/APDS9930-master/.gitignore
vendored
Normal file
192
firmware/libraries/APDS9930-master/.gitignore
vendored
Normal file
|
@ -0,0 +1,192 @@
|
|||
#################
|
||||
## SparkFun Useful stuff
|
||||
#################
|
||||
|
||||
## AVR Development
|
||||
*.eep
|
||||
*.elf
|
||||
*.lst
|
||||
*.lss
|
||||
*.sym
|
||||
*.d
|
||||
*.o
|
||||
*.srec
|
||||
*.map
|
||||
|
||||
## Notepad++ backup files
|
||||
*.bak
|
||||
|
||||
## BOM files
|
||||
*bom*
|
||||
|
||||
#################
|
||||
## Eclipse
|
||||
#################
|
||||
|
||||
*.pydevproject
|
||||
.project
|
||||
.metadata
|
||||
bin/
|
||||
tmp/
|
||||
*.tmp
|
||||
*.bak
|
||||
*.swp
|
||||
*~.nib
|
||||
local.properties
|
||||
.classpath
|
||||
.settings/
|
||||
.loadpath
|
||||
|
||||
# External tool builders
|
||||
.externalToolBuilders/
|
||||
|
||||
# Locally stored "Eclipse launch configurations"
|
||||
*.launch
|
||||
|
||||
# CDT-specific
|
||||
.cproject
|
||||
|
||||
# PDT-specific
|
||||
.buildpath
|
||||
|
||||
|
||||
#############
|
||||
## Eagle
|
||||
#############
|
||||
|
||||
# Ignore the board and schematic backup files
|
||||
*.b#?
|
||||
*.s#?
|
||||
|
||||
|
||||
#################
|
||||
## Visual Studio
|
||||
#################
|
||||
|
||||
## Ignore Visual Studio temporary files, build results, and
|
||||
## files generated by popular Visual Studio add-ons.
|
||||
|
||||
# User-specific files
|
||||
*.suo
|
||||
*.user
|
||||
*.sln.docstates
|
||||
|
||||
# Build results
|
||||
[Dd]ebug/
|
||||
[Rr]elease/
|
||||
*_i.c
|
||||
*_p.c
|
||||
*.ilk
|
||||
*.meta
|
||||
*.obj
|
||||
*.pch
|
||||
*.pdb
|
||||
*.pgc
|
||||
*.pgd
|
||||
*.rsp
|
||||
*.sbr
|
||||
*.tlb
|
||||
*.tli
|
||||
*.tlh
|
||||
*.tmp
|
||||
*.vspscc
|
||||
.builds
|
||||
*.dotCover
|
||||
|
||||
## TODO: If you have NuGet Package Restore enabled, uncomment this
|
||||
#packages/
|
||||
|
||||
# Visual C++ cache files
|
||||
ipch/
|
||||
*.aps
|
||||
*.ncb
|
||||
*.opensdf
|
||||
*.sdf
|
||||
|
||||
# Visual Studio profiler
|
||||
*.psess
|
||||
*.vsp
|
||||
|
||||
# ReSharper is a .NET coding add-in
|
||||
_ReSharper*
|
||||
|
||||
# Installshield output folder
|
||||
[Ee]xpress
|
||||
|
||||
# DocProject is a documentation generator add-in
|
||||
DocProject/buildhelp/
|
||||
DocProject/Help/*.HxT
|
||||
DocProject/Help/*.HxC
|
||||
DocProject/Help/*.hhc
|
||||
DocProject/Help/*.hhk
|
||||
DocProject/Help/*.hhp
|
||||
DocProject/Help/Html2
|
||||
DocProject/Help/html
|
||||
|
||||
# Click-Once directory
|
||||
publish
|
||||
|
||||
# Others
|
||||
[Bb]in
|
||||
[Oo]bj
|
||||
sql
|
||||
TestResults
|
||||
*.Cache
|
||||
ClientBin
|
||||
stylecop.*
|
||||
~$*
|
||||
*.dbmdl
|
||||
Generated_Code #added for RIA/Silverlight projects
|
||||
|
||||
# Backup & report files from converting an old project file to a newer
|
||||
# Visual Studio version. Backup files are not needed, because we have git ;-)
|
||||
_UpgradeReport_Files/
|
||||
Backup*/
|
||||
UpgradeLog*.XML
|
||||
|
||||
|
||||
############
|
||||
## Windows
|
||||
############
|
||||
|
||||
# Windows image file caches
|
||||
Thumbs.db
|
||||
|
||||
# Folder config file
|
||||
Desktop.ini
|
||||
|
||||
|
||||
#############
|
||||
## Python
|
||||
#############
|
||||
|
||||
*.py[co]
|
||||
|
||||
# Packages
|
||||
*.egg
|
||||
*.egg-info
|
||||
dist
|
||||
build
|
||||
eggs
|
||||
parts
|
||||
bin
|
||||
var
|
||||
sdist
|
||||
develop-eggs
|
||||
.installed.cfg
|
||||
|
||||
# Installer logs
|
||||
pip-log.txt
|
||||
|
||||
# Unit test / coverage reports
|
||||
.coverage
|
||||
.tox
|
||||
|
||||
#Translations
|
||||
*.mo
|
||||
|
||||
#Mr Developer
|
||||
.mr.developer.cfg
|
||||
|
||||
# Mac crap
|
||||
.DS_Store
|
22
firmware/libraries/APDS9930-master/LICENSE
Normal file
22
firmware/libraries/APDS9930-master/LICENSE
Normal file
|
@ -0,0 +1,22 @@
|
|||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2015 Davide Depau
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
92
firmware/libraries/APDS9930-master/README.md
Normal file
92
firmware/libraries/APDS9930-master/README.md
Normal file
|
@ -0,0 +1,92 @@
|
|||
APDS9930 Ambient Light and Proximity sensor
|
||||
===========================================
|
||||
|
||||
This is a fork of the [library from Sparkfun for the APDS-9960 sensor](https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor). It has been adapted to read values from this other model.
|
||||
|
||||
[**Quick-start guide available here**](https://web.archive.org/web/20151224052223/http://davideddu.org/blog/posts/apds-9930-arduino-quickstart/)
|
||||
|
||||
[**Purchase an Avago APDS-9930 Breakout Board here**](http://www.dx.com/p/384037?Utm_rid=14976370&Utm_source=affiliate)
|
||||
|
||||
|
||||
# DO NOT EMAIL ME IF YOU HAVE AN ISSUE
|
||||
It will be deleted without reading. If you have an issue, [create an issue](https://github.com/Depau/APDS9930/issues) here on GitHub.
|
||||
|
||||
# Unmaintained
|
||||
I'm not going to maintain this library any more. I will merge pull requests, though. Contributions are welcome. Just don't expect anything from me.
|
||||
|
||||
![Avago APDS-9930 Breakout Board](http://img.dxcdn.com/productimages/sku_384037_1.jpg)
|
||||
|
||||
**Note:** even though it says APDS-9960, it's an APDS-9930. That's how I ended up getting one of those. I wanted the RGB sensor. I found this crap in my mailbox. But I decided to write a library for it anyways ;)
|
||||
|
||||
Getting Started
|
||||
---------------
|
||||
|
||||
* Download the Git repository as a ZIP ("Download ZIP" button)
|
||||
* Unzip
|
||||
* Copy the entire library directory (APDS-9930) to
|
||||
\<Arduino installation directory\>/libraries
|
||||
* Open the Arduino program
|
||||
* Select File -> Examples -> APDS9930 -> GestureTest
|
||||
* Plug in your Arduino and APDS-9930 with the following connections
|
||||
|
||||
*-OR-*
|
||||
|
||||
* Use the library manager
|
||||
|
||||
| Arduino Pin | APDS-9930 Board | Function |
|
||||
|---|---|---|
|
||||
| 3.3V | VCC | Power |
|
||||
| GND | GND | Ground |
|
||||
| A4 | SDA | I²C Data |
|
||||
| A5 | SCL | I²C Clock |
|
||||
| 2 | INT | Interrupt |
|
||||
|
||||
*P.S.: you already know you can't use this purple little thing with your 5V Arduino without a level shifter, right? :) In case you don't have a level shifter, you can detach the microcontroller from an Arduino Uno, reconnect the oscillator pins, the RX and TX pins, the reset and the LED/SCK pins back to the board with some jumper wires. You can then power the microcontroller from a 3.3V source (the 3V3 output on the board should work) and connect the sensor directly to the MCU. Look up "Arduino on Breadboard".*
|
||||
|
||||
* Go to Tools -> Board and select your Arduino board
|
||||
* Go to Tools -> Serial Port and select the COM port of your Arduino board
|
||||
* Click "Upload"
|
||||
* Go to Tools -> Serial Monitor
|
||||
* Ensure the baud rate is set at 9600 baud
|
||||
* Swipe your hand over the sensor in various directions!
|
||||
|
||||
Repository Contents
|
||||
-------------------
|
||||
|
||||
* **/examples** - Example sketches for the library (.ino). Run these from the Arduino IDE.
|
||||
* **/extras** - Additional documentation for the user. These files are ignored by the IDE.
|
||||
* **/src** - Source files for the library (.cpp, .h).
|
||||
* **keywords.txt** - Keywords from this library that will be highlighted in the Arduino IDE.
|
||||
* **library.properties** - General library properties for the Arduino package manager.
|
||||
|
||||
Documentation
|
||||
--------------
|
||||
|
||||
* **[Quickstart Guide](https://web.archive.org/web/20151224052223/http://davideddu.org/blog/posts/apds-9930-arduino-quickstart/)** - Basic hookup guide for the sensor.
|
||||
* **[Product Repository](https://github.com/Davideddu/APDS9930)** - Main repository (including hardware files) for the APDS9930 ambient light and proximity sensor.
|
||||
* **[Installing an Arduino Library Guide](https://learn.sparkfun.com/tutorials/installing-an-arduino-library)** - Basic information on how to install an Arduino library.
|
||||
|
||||
|
||||
Version History
|
||||
---------------
|
||||
* master - Adapted for use with APDS-9930
|
||||
* [V_1.4.0](https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor_Arduino_Library/tree/V_1.4.0) - Updated to new library structure
|
||||
* V_1.3.0 - Implemented disableProximitySensor(). Thanks to jmg5150 for catching that!
|
||||
* V_1.2.0 - Added pinMode line to GestureTest demo to fix interrupt bug with some Arduinos
|
||||
* V_1.1.0 - Updated GestureTest demo to not freeze with fast swipes
|
||||
* V_1.0.0: Initial release
|
||||
* Ambient and RGB light sensing implemented
|
||||
* Ambient light interrupts working
|
||||
* Proximity sensing implemented
|
||||
* Proximity interrupts working
|
||||
|
||||
License Information
|
||||
-------------------
|
||||
|
||||
This product is _**open source**_!
|
||||
|
||||
Please use, reuse, and modify these files as you see fit. Please maintain attribution to SparkFun Electronics and release anything derivative under the same license.
|
||||
|
||||
Distributed as-is; no warranty is given.
|
||||
|
||||
- Your friends at SparkFun. And Davide Depau :*
|
|
@ -0,0 +1,180 @@
|
|||
/****************************************************************
|
||||
AmbientLightInterrupt.ino
|
||||
APDS-9930 RGB and Gesture Sensor
|
||||
Shawn Hymel @ SparkFun Electronics
|
||||
October 24, 2014
|
||||
https://github.com/sparkfun/APDS-9930_RGB_and_Gesture_Sensor
|
||||
|
||||
Tests the ambient light interrupt abilities of the APDS-9930.
|
||||
Configures the APDS-9930 over I2C and waits for an external
|
||||
interrupt based on high or low light conditions. Try covering
|
||||
the sensor with your hand or bringing the sensor close to a
|
||||
bright light source. You might need to adjust the LIGHT_INT_HIGH
|
||||
and LIGHT_INT_LOW values to get the interrupt to work correctly.
|
||||
|
||||
Hardware Connections:
|
||||
|
||||
IMPORTANT: The APDS-9930 can only accept 3.3V!
|
||||
|
||||
Arduino Pin APDS-9930 Board Function
|
||||
|
||||
3.3V VCC Power
|
||||
GND GND Ground
|
||||
A4 SDA I2C Data
|
||||
A5 SCL I2C Clock
|
||||
2 INT Interrupt
|
||||
13 - LED
|
||||
|
||||
Resources:
|
||||
Include Wire.h and APDS9930.h
|
||||
|
||||
Development environment specifics:
|
||||
Written in Arduino 1.0.5
|
||||
Tested with SparkFun Arduino Pro Mini 3.3V
|
||||
|
||||
This code is beerware; if you see me (or any other SparkFun
|
||||
employee) at the local, and you've found our code helpful, please
|
||||
buy us a round!
|
||||
|
||||
Distributed as-is; no warranty is given.
|
||||
****************************************************************/
|
||||
|
||||
#define DUMP_REGS
|
||||
|
||||
#include <Wire.h>
|
||||
#include <APDS9930.h>
|
||||
|
||||
// Pins
|
||||
#define APDS9930_INT 2 // Needs to be an interrupt pin
|
||||
#define LED_PIN 13 // LED for showing interrupt
|
||||
|
||||
// Constants
|
||||
#define LIGHT_INT_HIGH 1000 // High light level for interrupt
|
||||
#define LIGHT_INT_LOW 10 // Low light level for interrupt
|
||||
|
||||
// Global variables
|
||||
APDS9930 apds = APDS9930();
|
||||
float ambient_light = 0;
|
||||
uint16_t ch0 = 0;
|
||||
uint16_t ch1 = 1;
|
||||
volatile bool isr_flag = false;
|
||||
uint16_t threshold = 0;
|
||||
|
||||
void setup() {
|
||||
|
||||
// Set LED as output
|
||||
pinMode(LED_PIN, OUTPUT);
|
||||
pinMode(APDS9930_INT, INPUT);
|
||||
|
||||
// Initialize Serial port
|
||||
Serial.begin(9600);
|
||||
Serial.println();
|
||||
Serial.println(F("----------------------------"));
|
||||
Serial.println(F("APDS-9930 - Light Interrupts"));
|
||||
Serial.println(F("----------------------------"));
|
||||
|
||||
// Initialize interrupt service routine
|
||||
attachInterrupt(0, interruptRoutine, FALLING);
|
||||
|
||||
// Initialize APDS-9930 (configure I2C and initial values)
|
||||
if ( apds.init() ) {
|
||||
Serial.println(F("APDS-9930 initialization complete"));
|
||||
} else {
|
||||
Serial.println(F("Something went wrong during APDS-9930 init!"));
|
||||
}
|
||||
|
||||
// Set high and low interrupt thresholds
|
||||
if ( !apds.setLightIntLowThreshold(LIGHT_INT_LOW) ) {
|
||||
Serial.println(F("Error writing low threshold"));
|
||||
}
|
||||
if ( !apds.setLightIntHighThreshold(LIGHT_INT_HIGH) ) {
|
||||
Serial.println(F("Error writing high threshold"));
|
||||
}
|
||||
|
||||
// Start running the APDS-9930 light sensor (no interrupts)
|
||||
if ( apds.enableLightSensor(false) ) {
|
||||
Serial.println(F("Light sensor is now running"));
|
||||
} else {
|
||||
Serial.println(F("Something went wrong during light sensor init!"));
|
||||
}
|
||||
|
||||
// Read high and low interrupt thresholds
|
||||
if ( !apds.getLightIntLowThreshold(threshold) ) {
|
||||
Serial.println(F("Error reading low threshold"));
|
||||
} else {
|
||||
Serial.print(F("Low Threshold: "));
|
||||
Serial.println(threshold);
|
||||
}
|
||||
if ( !apds.getLightIntHighThreshold(threshold) ) {
|
||||
Serial.println(F("Error reading high threshold"));
|
||||
} else {
|
||||
Serial.print(F("High Threshold: "));
|
||||
Serial.println(threshold);
|
||||
}
|
||||
|
||||
// Enable interrupts
|
||||
if ( !apds.setAmbientLightIntEnable(1) ) {
|
||||
Serial.println(F("Error enabling interrupts"));
|
||||
}
|
||||
|
||||
#ifdef DUMP_REGS
|
||||
/* Register dump */
|
||||
uint8_t reg;
|
||||
uint8_t val;
|
||||
|
||||
for(reg = 0x00; reg <= 0x19; reg++) {
|
||||
if( (reg != 0x10) && \
|
||||
(reg != 0x11) )
|
||||
{
|
||||
apds.wireReadDataByte(reg, val);
|
||||
Serial.print(reg, HEX);
|
||||
Serial.print(": 0x");
|
||||
Serial.println(val, HEX);
|
||||
}
|
||||
}
|
||||
apds.wireReadDataByte(0x1E, val);
|
||||
Serial.print(0x1E, HEX);
|
||||
Serial.print(": 0x");
|
||||
Serial.println(val, HEX);
|
||||
#endif
|
||||
|
||||
// Wait for initialization and calibration to finish
|
||||
delay(500);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
|
||||
// If interrupt occurs, print out the light levels
|
||||
if ( isr_flag ) {
|
||||
|
||||
// Read the light levels (ambient, red, green, blue) and print
|
||||
if ( !apds.readAmbientLightLux(ambient_light) ||
|
||||
!apds.readCh0Light(ch0) ||
|
||||
!apds.readCh1Light(ch1) ) {
|
||||
Serial.println("Error reading light values");
|
||||
} else {
|
||||
Serial.print("Interrupt! Ambient: ");
|
||||
Serial.print(ambient_light);
|
||||
Serial.print(F(" Ch0: "));
|
||||
Serial.print(ch0);
|
||||
Serial.print(F(" Ch1: "));
|
||||
Serial.println(ch1);
|
||||
}
|
||||
|
||||
// Turn on LED for a half a second
|
||||
digitalWrite(LED_PIN, HIGH);
|
||||
delay(500);
|
||||
digitalWrite(LED_PIN, LOW);
|
||||
|
||||
// Reset flag and clear APDS-9930 interrupt (IMPORTANT!)
|
||||
isr_flag = false;
|
||||
if ( !apds.clearAmbientLightInt() ) {
|
||||
Serial.println("Error clearing interrupt");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void interruptRoutine() {
|
||||
isr_flag = true;
|
||||
}
|
|
@ -0,0 +1,113 @@
|
|||
/****************************************************************
|
||||
AmbientLightLED.ino
|
||||
|
||||
Tests the ambient light sensing abilities of the
|
||||
APDS-9930. Configures APDS-9930 over I2C and polls the sensor for
|
||||
ambient light levels, which are displayed over the
|
||||
serial console.
|
||||
|
||||
Hardware Connections:
|
||||
|
||||
IMPORTANT: The APDS-9930 can only accept 3.3V!
|
||||
|
||||
Arduino Pin APDS-9930 Board Function
|
||||
|
||||
3.3V VCC Power
|
||||
GND GND Ground
|
||||
A4 SDA I2C Data
|
||||
A5 SCL I2C Clock
|
||||
|
||||
10 (pwm) LED anode
|
||||
|
||||
Distributed as-is; no warranty is given.
|
||||
****************************************************************/
|
||||
|
||||
#define PWM_LED_PIN 10
|
||||
#define DUMP_REGS
|
||||
|
||||
#include <Wire.h>
|
||||
#include <APDS9930.h>
|
||||
|
||||
// Global Variables
|
||||
APDS9930 apds = APDS9930();
|
||||
float ambient_light = 0; // can also be an unsigned long
|
||||
uint16_t ch0 = 0;
|
||||
uint16_t ch1 = 1;
|
||||
float max_light = 0;
|
||||
|
||||
void setup() {
|
||||
//analogReference(EXTERNAL);
|
||||
pinMode(PWM_LED_PIN, OUTPUT);
|
||||
|
||||
// Initialize Serial port
|
||||
Serial.begin(9600);
|
||||
Serial.println();
|
||||
Serial.println(F("--------------------------------"));
|
||||
Serial.println(F("APDS-9930 - Ambient light sensor"));
|
||||
Serial.println(F("--------------------------------"));
|
||||
|
||||
// Initialize APDS-9930 (configure I2C and initial values)
|
||||
if ( apds.init() ) {
|
||||
Serial.println(F("APDS-9930 initialization complete"));
|
||||
} else {
|
||||
Serial.println(F("Something went wrong during APDS-9930 init!"));
|
||||
}
|
||||
|
||||
// Start running the APDS-9930 light sensor (no interrupts)
|
||||
if ( apds.enableLightSensor(false) ) {
|
||||
Serial.println(F("Light sensor is now running"));
|
||||
} else {
|
||||
Serial.println(F("Something went wrong during light sensor init!"));
|
||||
}
|
||||
|
||||
#ifdef DUMP_REGS
|
||||
/* Register dump */
|
||||
uint8_t reg;
|
||||
uint8_t val;
|
||||
|
||||
for(reg = 0x00; reg <= 0x19; reg++) {
|
||||
if( (reg != 0x10) && \
|
||||
(reg != 0x11) )
|
||||
{
|
||||
apds.wireReadDataByte(reg, val);
|
||||
Serial.print(reg, HEX);
|
||||
Serial.print(": 0x");
|
||||
Serial.println(val, HEX);
|
||||
}
|
||||
}
|
||||
apds.wireReadDataByte(0x1E, val);
|
||||
Serial.print(0x1E, HEX);
|
||||
Serial.print(": 0x");
|
||||
Serial.println(val, HEX);
|
||||
#endif
|
||||
|
||||
// Wait for initialization and calibration to finish
|
||||
delay(500);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
|
||||
// Read the light levels (ambient, red, green, blue)
|
||||
if ( !apds.readAmbientLightLux(ambient_light) ||
|
||||
!apds.readCh0Light(ch0) ||
|
||||
!apds.readCh1Light(ch1) ) {
|
||||
Serial.println(F("Error reading light values"));
|
||||
} else {
|
||||
Serial.print(F("Ambient: "));
|
||||
Serial.print(ambient_light);
|
||||
Serial.print(F(" Ch0: "));
|
||||
Serial.print(ch0);
|
||||
Serial.print(F(" Ch1: "));
|
||||
Serial.println(ch1);
|
||||
|
||||
if ( ambient_light > max_light ) {
|
||||
max_light = ambient_light;
|
||||
}
|
||||
ambient_light = map(ambient_light, 0, max_light, 0, 1023);
|
||||
analogWrite(PWM_LED_PIN, ambient_light);
|
||||
|
||||
}
|
||||
|
||||
// Wait 1 second before next reading
|
||||
delay(50);
|
||||
}
|
|
@ -0,0 +1,120 @@
|
|||
/****************************************************************
|
||||
AmbientLightSensor.ino
|
||||
APDS-9930 Ambient light and proximity sensor
|
||||
Davide Depau
|
||||
December 11, 2015
|
||||
https://github.com/Davideddu/APDS9930
|
||||
|
||||
Shawn Hymel @ SparkFun Electronics
|
||||
October 15, 2014
|
||||
https://github.com/sparkfun/APDS-9930_RGB_and_Gesture_Sensor
|
||||
|
||||
Tests thembient light sensing abilities of the
|
||||
APDS-9930. Configures APDS-9930 over I2C and polls the sensor for
|
||||
ambient light levels, which are displayed over the
|
||||
serial console.
|
||||
|
||||
Hardware Connections:
|
||||
|
||||
IMPORTANT: The APDS-9930 can only accept 3.3V!
|
||||
|
||||
Arduino Pin APDS-9930 Board Function
|
||||
|
||||
3.3V VCC Power
|
||||
GND GND Ground
|
||||
A4 SDA I2C Data
|
||||
A5 SCL I2C Clock
|
||||
|
||||
Resources:
|
||||
Include Wire.h and APDS-9930.h
|
||||
|
||||
Development environment specifics:
|
||||
Written in Arduino 1.6.5
|
||||
Tested with Arduino Uno and Mega.
|
||||
|
||||
This code is beerware; if you see me (or any other SparkFun
|
||||
employee) at the local, and you've found our code helpful, please
|
||||
buy us a round!
|
||||
|
||||
Distributed as-is; no warranty is given.
|
||||
****************************************************************/
|
||||
|
||||
#define DUMP_REGS
|
||||
|
||||
#include <Wire.h>
|
||||
#include <APDS9930.h>
|
||||
|
||||
// Global Variables
|
||||
APDS9930 apds = APDS9930();
|
||||
float ambient_light = 0; // can also be an unsigned long
|
||||
uint16_t ch0 = 0;
|
||||
uint16_t ch1 = 1;
|
||||
|
||||
void setup() {
|
||||
//analogReference(EXTERNAL);
|
||||
|
||||
// Initialize Serial port
|
||||
Serial.begin(9600);
|
||||
Serial.println();
|
||||
Serial.println(F("--------------------------------"));
|
||||
Serial.println(F("APDS-9930 - Ambient light sensor"));
|
||||
Serial.println(F("--------------------------------"));
|
||||
|
||||
// Initialize APDS-9930 (configure I2C and initial values)
|
||||
if ( apds.init() ) {
|
||||
Serial.println(F("APDS-9930 initialization complete"));
|
||||
} else {
|
||||
Serial.println(F("Something went wrong during APDS-9930 init!"));
|
||||
}
|
||||
|
||||
// Start running the APDS-9930 light sensor (no interrupts)
|
||||
if ( apds.enableLightSensor(false) ) {
|
||||
Serial.println(F("Light sensor is now running"));
|
||||
} else {
|
||||
Serial.println(F("Something went wrong during light sensor init!"));
|
||||
}
|
||||
|
||||
#ifdef DUMP_REGS
|
||||
/* Register dump */
|
||||
uint8_t reg;
|
||||
uint8_t val;
|
||||
|
||||
for(reg = 0x00; reg <= 0x19; reg++) {
|
||||
if( (reg != 0x10) && \
|
||||
(reg != 0x11) )
|
||||
{
|
||||
apds.wireReadDataByte(reg, val);
|
||||
Serial.print(reg, HEX);
|
||||
Serial.print(": 0x");
|
||||
Serial.println(val, HEX);
|
||||
}
|
||||
}
|
||||
apds.wireReadDataByte(0x1E, val);
|
||||
Serial.print(0x1E, HEX);
|
||||
Serial.print(": 0x");
|
||||
Serial.println(val, HEX);
|
||||
#endif
|
||||
|
||||
// Wait for initialization and calibration to finish
|
||||
delay(500);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
|
||||
// Read the light levels (ambient, red, green, blue)
|
||||
if ( !apds.readAmbientLightLux(ambient_light) ||
|
||||
!apds.readCh0Light(ch0) ||
|
||||
!apds.readCh1Light(ch1) ) {
|
||||
Serial.println(F("Error reading light values"));
|
||||
} else {
|
||||
Serial.print(F("Ambient: "));
|
||||
Serial.print(ambient_light);
|
||||
Serial.print(F(" Ch0: "));
|
||||
Serial.print(ch0);
|
||||
Serial.print(F(" Ch1: "));
|
||||
Serial.println(ch1);
|
||||
}
|
||||
|
||||
// Wait 1 second before next reading
|
||||
delay(1000);
|
||||
}
|
|
@ -0,0 +1,108 @@
|
|||
/****************************************************************
|
||||
AmbientLightToneAC.ino
|
||||
|
||||
Tests the ambient light sensing abilities of the
|
||||
APDS-9930. Configures APDS-9930 over I2C and polls the sensor for
|
||||
ambient light levels, which are displayed over the
|
||||
serial console.
|
||||
|
||||
Hardware Connections:
|
||||
|
||||
IMPORTANT: The APDS-9930 can only accept 3.3V!
|
||||
|
||||
Arduino Pin APDS-9930 Board Function
|
||||
|
||||
3.3V VCC Power
|
||||
GND GND Ground
|
||||
A4 SDA I2C Data
|
||||
A5 SCL I2C Clock
|
||||
|
||||
Connect speakers to the correct pins. Check toneAC.h for more info.
|
||||
|
||||
Distributed as-is; no warranty is given.
|
||||
****************************************************************/
|
||||
|
||||
#define DUMP_REGS
|
||||
|
||||
#include <Wire.h>
|
||||
#include <APDS9930.h>
|
||||
#include <toneAC.h>
|
||||
|
||||
// Global Variables
|
||||
APDS9930 apds = APDS9930();
|
||||
float ambient_light = 0; // can also be an unsigned long
|
||||
uint16_t ch0 = 0;
|
||||
uint16_t ch1 = 1;
|
||||
float max_light = 0;
|
||||
|
||||
void setup() {
|
||||
//analogReference(EXTERNAL);
|
||||
|
||||
// Initialize Serial port
|
||||
Serial.begin(9600);
|
||||
Serial.println();
|
||||
Serial.println(F("--------------------------------"));
|
||||
Serial.println(F("APDS-9930 - Ambient light sensor"));
|
||||
Serial.println(F("--------------------------------"));
|
||||
|
||||
// Initialize APDS-9930 (configure I2C and initial values)
|
||||
if ( apds.init() ) {
|
||||
Serial.println(F("APDS-9930 initialization complete"));
|
||||
} else {
|
||||
Serial.println(F("Something went wrong during APDS-9930 init!"));
|
||||
}
|
||||
|
||||
// Start running the APDS-9930 light sensor (no interrupts)
|
||||
if ( apds.enableLightSensor(false) ) {
|
||||
Serial.println(F("Light sensor is now running"));
|
||||
} else {
|
||||
Serial.println(F("Something went wrong during light sensor init!"));
|
||||
}
|
||||
|
||||
#ifdef DUMP_REGS
|
||||
/* Register dump */
|
||||
uint8_t reg;
|
||||
uint8_t val;
|
||||
|
||||
for(reg = 0x00; reg <= 0x19; reg++) {
|
||||
if( (reg != 0x10) && \
|
||||
(reg != 0x11) )
|
||||
{
|
||||
apds.wireReadDataByte(reg, val);
|
||||
Serial.print(reg, HEX);
|
||||
Serial.print(": 0x");
|
||||
Serial.println(val, HEX);
|
||||
}
|
||||
}
|
||||
apds.wireReadDataByte(0x1E, val);
|
||||
Serial.print(0x1E, HEX);
|
||||
Serial.print(": 0x");
|
||||
Serial.println(val, HEX);
|
||||
#endif
|
||||
|
||||
// Wait for initialization and calibration to finish
|
||||
delay(500);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
|
||||
// Read the light levels (ambient, red, green, blue)
|
||||
if ( !apds.readAmbientLightLux(ambient_light) ||
|
||||
!apds.readCh0Light(ch0) ||
|
||||
!apds.readCh1Light(ch1) ) {
|
||||
Serial.println(F("Error reading light values"));
|
||||
} else {
|
||||
Serial.print(F("Ambient: "));
|
||||
Serial.print(ambient_light);
|
||||
Serial.print(F(" Ch0: "));
|
||||
Serial.print(ch0);
|
||||
Serial.print(F(" Ch1: "));
|
||||
Serial.println(ch1);
|
||||
|
||||
unsigned long freq = map(ch0, 0, 1024, 60, 16000);
|
||||
toneAC(freq, 10, 50, true);
|
||||
}
|
||||
|
||||
// Wait 1 second before next reading
|
||||
delay(50);
|
||||
}
|
|
@ -0,0 +1,157 @@
|
|||
/****************************************************************
|
||||
ProximityInterrupt.ino
|
||||
APDS-9930 Ambient light and proximity sensor
|
||||
Davide Depau
|
||||
December 11, 2015
|
||||
https://github.com/Davideddu/APDS9930
|
||||
|
||||
Shawn Hymel @ SparkFun Electronics
|
||||
October 24, 2014
|
||||
https://github.com/sparkfun/APDS-9930_RGB_and_Gesture_Sensor
|
||||
|
||||
Tests the proximity interrupt abilities of the APDS-9930.
|
||||
Configures the APDS-9930 over I2C and waits for an external
|
||||
interrupt based on high or low proximity conditions. Move your
|
||||
hand near the sensor and watch the LED on pin 13.
|
||||
|
||||
Hardware Connections:
|
||||
|
||||
IMPORTANT: The APDS-9930 can only accept 3.3V!
|
||||
|
||||
Arduino Pin APDS-9930 Board Function
|
||||
|
||||
3.3V VCC Power
|
||||
GND GND Ground
|
||||
A4 SDA I2C Data
|
||||
A5 SCL I2C Clock
|
||||
2 INT Interrupt
|
||||
13 - LED
|
||||
|
||||
Resources:
|
||||
Include Wire.h and APDS9930.h
|
||||
|
||||
Development environment specifics:
|
||||
Written in Arduino 1.6.5
|
||||
Tested with Arduino Uno and Mega
|
||||
|
||||
This code is beerware; if you see me (or any other SparkFun
|
||||
employee) at the local, and you've found our code helpful, please
|
||||
buy us a round!
|
||||
|
||||
Distributed as-is; no warranty is given.
|
||||
****************************************************************/
|
||||
|
||||
#define DUMP_REGS
|
||||
|
||||
#include <Wire.h>
|
||||
#include <APDS9930.h>
|
||||
|
||||
// Pins
|
||||
#define APDS9930_INT 2 // Needs to be an interrupt pin
|
||||
#define LED_PIN 13 // LED for showing interrupt
|
||||
|
||||
// Constants
|
||||
#define PROX_INT_HIGH 600 // Proximity level for interrupt
|
||||
#define PROX_INT_LOW 0 // No far interrupt
|
||||
|
||||
// Global variables
|
||||
APDS9930 apds = APDS9930();
|
||||
uint16_t proximity_data = 0;
|
||||
volatile bool isr_flag = false;
|
||||
|
||||
void setup() {
|
||||
|
||||
// Set LED as output
|
||||
pinMode(LED_PIN, OUTPUT);
|
||||
pinMode(APDS9930_INT, INPUT);
|
||||
|
||||
// Initialize Serial port
|
||||
Serial.begin(9600);
|
||||
Serial.println();
|
||||
Serial.println(F("------------------------------"));
|
||||
Serial.println(F("APDS-9930 - ProximityInterrupt"));
|
||||
Serial.println(F("------------------------------"));
|
||||
|
||||
// Initialize interrupt service routine
|
||||
attachInterrupt(0, interruptRoutine, FALLING);
|
||||
|
||||
// Initialize APDS-9930 (configure I2C and initial values)
|
||||
if ( apds.init() ) {
|
||||
Serial.println(F("APDS-9930 initialization complete"));
|
||||
} else {
|
||||
Serial.println(F("Something went wrong during APDS-9930 init!"));
|
||||
}
|
||||
|
||||
// Adjust the Proximity sensor gain
|
||||
if ( !apds.setProximityGain(PGAIN_2X) ) {
|
||||
Serial.println(F("Something went wrong trying to set PGAIN"));
|
||||
}
|
||||
|
||||
// Set proximity interrupt thresholds
|
||||
if ( !apds.setProximityIntLowThreshold(PROX_INT_LOW) ) {
|
||||
Serial.println(F("Error writing low threshold"));
|
||||
}
|
||||
if ( !apds.setProximityIntHighThreshold(PROX_INT_HIGH) ) {
|
||||
Serial.println(F("Error writing high threshold"));
|
||||
}
|
||||
|
||||
// Start running the APDS-9930 proximity sensor (interrupts)
|
||||
if ( apds.enableProximitySensor(true) ) {
|
||||
Serial.println(F("Proximity sensor is now running"));
|
||||
} else {
|
||||
Serial.println(F("Something went wrong during sensor init!"));
|
||||
}
|
||||
|
||||
#ifdef DUMP_REGS
|
||||
/* Register dump */
|
||||
uint8_t reg;
|
||||
uint8_t val;
|
||||
|
||||
for(reg = 0x00; reg <= 0x19; reg++) {
|
||||
if( (reg != 0x10) && \
|
||||
(reg != 0x11) )
|
||||
{
|
||||
apds.wireReadDataByte(reg, val);
|
||||
Serial.print(reg, HEX);
|
||||
Serial.print(": 0x");
|
||||
Serial.println(val, HEX);
|
||||
}
|
||||
}
|
||||
apds.wireReadDataByte(0x1E, val);
|
||||
Serial.print(0x1E, HEX);
|
||||
Serial.print(": 0x");
|
||||
Serial.println(val, HEX);
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
void loop() {
|
||||
|
||||
// If interrupt occurs, print out the proximity level
|
||||
if ( isr_flag ) {
|
||||
|
||||
// Read proximity level and print it out
|
||||
if ( !apds.readProximity(proximity_data) ) {
|
||||
Serial.println("Error reading proximity value");
|
||||
} else {
|
||||
Serial.print("Proximity detected! Level: ");
|
||||
Serial.println(proximity_data);
|
||||
}
|
||||
|
||||
// Turn on LED for a half a second
|
||||
digitalWrite(LED_PIN, HIGH);
|
||||
delay(500);
|
||||
digitalWrite(LED_PIN, LOW);
|
||||
|
||||
// Reset flag and clear APDS-9930 interrupt (IMPORTANT!)
|
||||
isr_flag = false;
|
||||
if ( !apds.clearProximityInt() ) {
|
||||
Serial.println("Error clearing interrupt");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void interruptRoutine() {
|
||||
isr_flag = true;
|
||||
}
|
|
@ -0,0 +1,131 @@
|
|||
/****************************************************************
|
||||
ProximityLED.ino
|
||||
Davide Depau
|
||||
December 11, 2015
|
||||
https://github.com/Davideddu/APDS9930
|
||||
|
||||
https://github.com/sparkfun/APDS-9930_RGB_and_Gesture_Sensor
|
||||
|
||||
Tests the proximity sensing abilities of the APDS-9930.
|
||||
Configures the APDS-9930 over I2C and polls for the distance to
|
||||
the object nearest the sensor, then turns on an LED accordingly.
|
||||
|
||||
Hardware Connections:
|
||||
|
||||
IMPORTANT: The APDS-9930 can only accept 3.3V!
|
||||
|
||||
Arduino Pin APDS-9930 Board Function
|
||||
|
||||
3.3V VCC Power
|
||||
GND GND Ground
|
||||
A4 SDA I2C Data
|
||||
A5 SCL I2C Clock
|
||||
|
||||
10 (PWM) LED Anode
|
||||
|
||||
Resources:
|
||||
Include Wire.h and APDS9930.h
|
||||
|
||||
Development environment specifics:
|
||||
Written in Sublime Text + Stino + Arduino 1.7.2
|
||||
Tested with Arduino Uno + level shifter
|
||||
|
||||
This code is chocolateware; if you see me at the grocery store,
|
||||
and you've found our code helpful, please buy us me a chocolate bar! :D
|
||||
|
||||
Distributed as-is; no warranty is given.
|
||||
****************************************************************/
|
||||
|
||||
#define DUMP_REGS
|
||||
#define PWM_LED_PIN 10
|
||||
|
||||
#include <Wire.h>
|
||||
#include <APDS9930.h>
|
||||
|
||||
// Global Variables
|
||||
APDS9930 apds = APDS9930();
|
||||
uint16_t proximity_data = 0;
|
||||
int proximity_max = 0;
|
||||
|
||||
void setup() {
|
||||
//analogReference(EXTERNAL);
|
||||
pinMode(PWM_LED_PIN, OUTPUT);
|
||||
|
||||
// Initialize Serial port
|
||||
Serial.begin(9600);
|
||||
Serial.println();
|
||||
Serial.println(F("------------------------"));
|
||||
Serial.println(F("APDS-9930 - ProximityLED"));
|
||||
Serial.println(F("------------------------"));
|
||||
|
||||
// Initialize APDS-9930 (configure I2C and initial values)
|
||||
if ( apds.init() ) {
|
||||
Serial.println(F("APDS-9930 initialization complete"));
|
||||
} else {
|
||||
Serial.println(F("Something went wrong during APDS-9930 init!"));
|
||||
}
|
||||
|
||||
// Adjust the Proximity sensor gain
|
||||
if ( !apds.setProximityGain(PGAIN_1X) ) {
|
||||
Serial.println(F("Something went wrong trying to set PGAIN"));
|
||||
}
|
||||
|
||||
// Start running the APDS-9930 proximity sensor (no interrupts)
|
||||
if ( apds.enableProximitySensor(false) ) {
|
||||
Serial.println(F("Proximity sensor is now running"));
|
||||
} else {
|
||||
Serial.println(F("Something went wrong during sensor init!"));
|
||||
}
|
||||
|
||||
#ifdef DUMP_REGS
|
||||
/* Register dump */
|
||||
uint8_t reg;
|
||||
uint8_t val;
|
||||
|
||||
for(reg = 0x00; reg <= 0x19; reg++) {
|
||||
if( (reg != 0x10) && \
|
||||
(reg != 0x11) )
|
||||
{
|
||||
apds.wireReadDataByte(reg, val);
|
||||
Serial.print(reg, HEX);
|
||||
Serial.print(": 0x");
|
||||
Serial.println(val, HEX);
|
||||
}
|
||||
}
|
||||
apds.wireReadDataByte(0x1E, val);
|
||||
Serial.print(0x1E, HEX);
|
||||
Serial.print(": 0x");
|
||||
Serial.println(val, HEX);
|
||||
#endif
|
||||
}
|
||||
|
||||
void loop() {
|
||||
|
||||
// Read the proximity value
|
||||
if ( !apds.readProximity(proximity_data) ) {
|
||||
Serial.println("Error reading proximity value");
|
||||
} else {
|
||||
Serial.print("Proximity: ");
|
||||
Serial.print(proximity_data);
|
||||
|
||||
// This is an ugly hack to reduce sensor noise.
|
||||
// You may want to adjust POFFSET instead.
|
||||
/*
|
||||
proximity_data -= 200;
|
||||
if (proximity_data > 50000) {
|
||||
proximity_data = 0;
|
||||
}
|
||||
if (proximity_data > proximity_max) {
|
||||
proximity_max = proximity_data;
|
||||
}
|
||||
proximity_data = map(proximity_data, 0, proximity_max, 0, 1023);
|
||||
*/
|
||||
|
||||
Serial.print(F(" Remapped: "));
|
||||
Serial.println(proximity_data);
|
||||
analogWrite(PWM_LED_PIN, proximity_data);
|
||||
}
|
||||
|
||||
// Wait 250 ms before next reading
|
||||
delay(10);
|
||||
}
|
|
@ -0,0 +1,113 @@
|
|||
/****************************************************************
|
||||
ProximitySensor.ino
|
||||
APDS-9930 ambient light and proximity sensor
|
||||
Davide Depau
|
||||
December 11, 2015
|
||||
https://github.com/Davideddu/APDS9930
|
||||
|
||||
Shawn Hymel @ SparkFun Electronics
|
||||
October 28, 2014
|
||||
https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor
|
||||
|
||||
Tests the proximity sensing abilities of the APDS-9930.
|
||||
Configures the APDS-9930 over I2C and polls for the distance to
|
||||
the object nearest the sensor.
|
||||
|
||||
Hardware Connections:
|
||||
|
||||
IMPORTANT: The APDS-9930 can only accept 3.3V!
|
||||
|
||||
Arduino Pin APDS-9930 Board Function
|
||||
|
||||
3.3V VCC Power
|
||||
GND GND Ground
|
||||
A4 SDA I2C Data
|
||||
A5 SCL I2C Clock
|
||||
|
||||
Resources:
|
||||
Include Wire.h and SparkFun_APDS-9930.h
|
||||
|
||||
Development environment specifics:
|
||||
Written in Arduino 1.0.5
|
||||
Tested with SparkFun Arduino Pro Mini 3.3V
|
||||
|
||||
This code is beerware; if you see me (or any other SparkFun
|
||||
employee) at the local, and you've found our code helpful, please
|
||||
buy us a round!
|
||||
|
||||
Distributed as-is; no warranty is given.
|
||||
****************************************************************/
|
||||
|
||||
#define DUMP_REGS
|
||||
|
||||
#include <Wire.h>
|
||||
#include <APDS9930.h>
|
||||
|
||||
// Global Variables
|
||||
APDS9930 apds = APDS9930();
|
||||
uint16_t proximity_data = 0;
|
||||
|
||||
void setup() {
|
||||
//analogReference(EXTERNAL);
|
||||
|
||||
// Initialize Serial port
|
||||
Serial.begin(9600);
|
||||
Serial.println();
|
||||
Serial.println(F("---------------------------"));
|
||||
Serial.println(F("APDS-9930 - ProximitySensor"));
|
||||
Serial.println(F("---------------------------"));
|
||||
|
||||
// Initialize APDS-9930 (configure I2C and initial values)
|
||||
if ( apds.init() ) {
|
||||
Serial.println(F("APDS-9930 initialization complete"));
|
||||
} else {
|
||||
Serial.println(F("Something went wrong during APDS-9930 init!"));
|
||||
}
|
||||
|
||||
// // Adjust the Proximity sensor gain
|
||||
// if ( !apds.setProximityGain(PGAIN_2X) ) {
|
||||
// Serial.println(F("Something went wrong trying to set PGAIN"));
|
||||
// }
|
||||
|
||||
// Start running the APDS-9930 proximity sensor (no interrupts)
|
||||
if ( apds.enableProximitySensor(false) ) {
|
||||
Serial.println(F("Proximity sensor is now running"));
|
||||
} else {
|
||||
Serial.println(F("Something went wrong during sensor init!"));
|
||||
}
|
||||
|
||||
#ifdef DUMP_REGS
|
||||
/* Register dump */
|
||||
uint8_t reg;
|
||||
uint8_t val;
|
||||
|
||||
for(reg = 0x00; reg <= 0x19; reg++) {
|
||||
if( (reg != 0x10) && \
|
||||
(reg != 0x11) )
|
||||
{
|
||||
apds.wireReadDataByte(reg, val);
|
||||
Serial.print(reg, HEX);
|
||||
Serial.print(": 0x");
|
||||
Serial.println(val, HEX);
|
||||
}
|
||||
}
|
||||
apds.wireReadDataByte(0x1E, val);
|
||||
Serial.print(0x1E, HEX);
|
||||
Serial.print(": 0x");
|
||||
Serial.println(val, HEX);
|
||||
#endif
|
||||
}
|
||||
|
||||
void loop() {
|
||||
|
||||
// Read the proximity value
|
||||
if ( !apds.readProximity(proximity_data) ) {
|
||||
Serial.println("Error reading proximity value");
|
||||
} else {
|
||||
Serial.print("Proximity: ");
|
||||
Serial.println(proximity_data);
|
||||
}
|
||||
|
||||
// Wait 250 ms before next reading
|
||||
delay(250);
|
||||
}
|
0
firmware/libraries/APDS9930-master/keywords.txt
Normal file
0
firmware/libraries/APDS9930-master/keywords.txt
Normal file
9
firmware/libraries/APDS9930-master/library.properties
Normal file
9
firmware/libraries/APDS9930-master/library.properties
Normal file
|
@ -0,0 +1,9 @@
|
|||
name=APDS-9930 Ambient Light and Proximity Sensor
|
||||
version=1.5.1
|
||||
author=Davide Depau
|
||||
maintainer=Davide Depau
|
||||
sentence=Library for the Avago APDS-9930 sensor
|
||||
paragraph=This library works with the breakout board for the Avago APDS-9930 proximity and light sensor
|
||||
category=Sensors
|
||||
url=https://github.com/Davideddu/APDS9930
|
||||
architectures=*
|
1147
firmware/libraries/APDS9930-master/src/APDS9930.cpp
Normal file
1147
firmware/libraries/APDS9930-master/src/APDS9930.cpp
Normal file
File diff suppressed because it is too large
Load diff
231
firmware/libraries/APDS9930-master/src/APDS9930.h
Normal file
231
firmware/libraries/APDS9930-master/src/APDS9930.h
Normal file
|
@ -0,0 +1,231 @@
|
|||
/**
|
||||
* @file APDS-9930.h
|
||||
* @brief Library for the SparkFun APDS-9930 breakout board
|
||||
* @author Shawn Hymel (SparkFun Electronics)
|
||||
*
|
||||
* @copyright This code is public domain but you buy me a beer if you use
|
||||
* this and we meet someday (Beerware license).
|
||||
*
|
||||
* This library interfaces the Avago APDS-9930 to Arduino over I2C. The library
|
||||
* relies on the Arduino Wire (I2C) library. to use the library, instantiate an
|
||||
* APDS9930 object, call init(), and call the appropriate functions.
|
||||
*/
|
||||
|
||||
#ifndef APDS9930_H
|
||||
#define APDS9930_H
|
||||
|
||||
#include <Arduino.h>
|
||||
|
||||
/* Debug */
|
||||
#define DEBUG 0
|
||||
|
||||
/* APDS-9930 I2C address */
|
||||
#define APDS9930_I2C_ADDR 0x39
|
||||
|
||||
/* Command register modes */
|
||||
#define REPEATED_BYTE 0x80
|
||||
#define AUTO_INCREMENT 0xA0
|
||||
#define SPECIAL_FN 0xE0
|
||||
|
||||
/* Error code for returned values */
|
||||
#define ERROR 0xFF
|
||||
|
||||
/* Acceptable device IDs */
|
||||
#define APDS9930_ID_1 0x12
|
||||
#define APDS9930_ID_2 0x39
|
||||
|
||||
/* Misc parameters */
|
||||
#define FIFO_PAUSE_TIME 30 // Wait period (ms) between FIFO reads
|
||||
|
||||
/* APDS-9930 register addresses */
|
||||
#define APDS9930_ENABLE 0x00
|
||||
#define APDS9930_ATIME 0x01
|
||||
#define APDS9930_PTIME 0x02
|
||||
#define APDS9930_WTIME 0x03
|
||||
#define APDS9930_AILTL 0x04
|
||||
#define APDS9930_AILTH 0x05
|
||||
#define APDS9930_AIHTL 0x06
|
||||
#define APDS9930_AIHTH 0x07
|
||||
#define APDS9930_PILTL 0x08
|
||||
#define APDS9930_PILTH 0x09
|
||||
#define APDS9930_PIHTL 0x0A
|
||||
#define APDS9930_PIHTH 0x0B
|
||||
#define APDS9930_PERS 0x0C
|
||||
#define APDS9930_CONFIG 0x0D
|
||||
#define APDS9930_PPULSE 0x0E
|
||||
#define APDS9930_CONTROL 0x0F
|
||||
#define APDS9930_ID 0x12
|
||||
#define APDS9930_STATUS 0x13
|
||||
#define APDS9930_Ch0DATAL 0x14
|
||||
#define APDS9930_Ch0DATAH 0x15
|
||||
#define APDS9930_Ch1DATAL 0x16
|
||||
#define APDS9930_Ch1DATAH 0x17
|
||||
#define APDS9930_PDATAL 0x18
|
||||
#define APDS9930_PDATAH 0x19
|
||||
#define APDS9930_POFFSET 0x1E
|
||||
|
||||
|
||||
/* Bit fields */
|
||||
#define APDS9930_PON 0b00000001
|
||||
#define APDS9930_AEN 0b00000010
|
||||
#define APDS9930_PEN 0b00000100
|
||||
#define APDS9930_WEN 0b00001000
|
||||
#define APSD9930_AIEN 0b00010000
|
||||
#define APDS9930_PIEN 0b00100000
|
||||
#define APDS9930_SAI 0b01000000
|
||||
|
||||
/* On/Off definitions */
|
||||
#define OFF 0
|
||||
#define ON 1
|
||||
|
||||
/* Acceptable parameters for setMode */
|
||||
#define POWER 0
|
||||
#define AMBIENT_LIGHT 1
|
||||
#define PROXIMITY 2
|
||||
#define WAIT 3
|
||||
#define AMBIENT_LIGHT_INT 4
|
||||
#define PROXIMITY_INT 5
|
||||
#define SLEEP_AFTER_INT 6
|
||||
#define ALL 7
|
||||
|
||||
/* LED Drive values */
|
||||
#define LED_DRIVE_100MA 0
|
||||
#define LED_DRIVE_50MA 1
|
||||
#define LED_DRIVE_25MA 2
|
||||
#define LED_DRIVE_12_5MA 3
|
||||
|
||||
/* Proximity Gain (PGAIN) values */
|
||||
#define PGAIN_1X 0
|
||||
#define PGAIN_2X 1
|
||||
#define PGAIN_4X 2
|
||||
#define PGAIN_8X 3
|
||||
|
||||
/* ALS Gain (AGAIN) values */
|
||||
#define AGAIN_1X 0
|
||||
#define AGAIN_8X 1
|
||||
#define AGAIN_16X 2
|
||||
#define AGAIN_120X 3
|
||||
|
||||
/* Interrupt clear values */
|
||||
#define CLEAR_PROX_INT 0xE5
|
||||
#define CLEAR_ALS_INT 0xE6
|
||||
#define CLEAR_ALL_INTS 0xE7
|
||||
|
||||
/* Default values */
|
||||
#define DEFAULT_ATIME 0xED
|
||||
#define DEFAULT_WTIME 0xFF
|
||||
#define DEFAULT_PTIME 0xFF
|
||||
#define DEFAULT_PPULSE 0x08
|
||||
#define DEFAULT_POFFSET 0 // 0 offset
|
||||
#define DEFAULT_CONFIG 0
|
||||
#define DEFAULT_PDRIVE LED_DRIVE_100MA
|
||||
#define DEFAULT_PDIODE 2
|
||||
#define DEFAULT_PGAIN PGAIN_8X
|
||||
#define DEFAULT_AGAIN AGAIN_1X
|
||||
#define DEFAULT_PILT 0 // Low proximity threshold
|
||||
#define DEFAULT_PIHT 50 // High proximity threshold
|
||||
#define DEFAULT_AILT 0xFFFF // Force interrupt for calibration
|
||||
#define DEFAULT_AIHT 0
|
||||
#define DEFAULT_PERS 0x22 // 2 consecutive prox or ALS for int.
|
||||
|
||||
/* ALS coefficients */
|
||||
#define DF 52
|
||||
#define GA 0.49
|
||||
#define B 1.862
|
||||
#define C 0.746
|
||||
#define D 1.291
|
||||
|
||||
/* State definitions */
|
||||
enum {
|
||||
NOTAVAILABLE_STATE,
|
||||
NEAR_STATE,
|
||||
FAR_STATE,
|
||||
ALL_STATE
|
||||
};
|
||||
|
||||
#ifdef _AVR_IO_H_
|
||||
// Do not use this alias as it's deprecated
|
||||
#define NA_STATE NOTAVAILABLE_STATE
|
||||
#endif
|
||||
|
||||
/* APDS9930 Class */
|
||||
class APDS9930 {
|
||||
public:
|
||||
|
||||
/* Initialization methods */
|
||||
APDS9930();
|
||||
~APDS9930();
|
||||
bool init();
|
||||
uint8_t getMode();
|
||||
bool setMode(uint8_t mode, uint8_t enable);
|
||||
|
||||
/* Turn the APDS-9930 on and off */
|
||||
bool enablePower();
|
||||
bool disablePower();
|
||||
|
||||
/* Enable or disable specific sensors */
|
||||
bool enableLightSensor(bool interrupts = false);
|
||||
bool disableLightSensor();
|
||||
bool enableProximitySensor(bool interrupts = false);
|
||||
bool disableProximitySensor();
|
||||
|
||||
/* LED drive strength control */
|
||||
uint8_t getLEDDrive();
|
||||
bool setLEDDrive(uint8_t drive);
|
||||
// uint8_t getGestureLEDDrive();
|
||||
// bool setGestureLEDDrive(uint8_t drive);
|
||||
|
||||
/* Gain control */
|
||||
uint8_t getAmbientLightGain();
|
||||
bool setAmbientLightGain(uint8_t gain);
|
||||
uint8_t getProximityGain();
|
||||
bool setProximityGain(uint8_t gain);
|
||||
bool setProximityDiode(uint8_t drive);
|
||||
uint8_t getProximityDiode();
|
||||
|
||||
|
||||
/* Get and set light interrupt thresholds */
|
||||
bool getLightIntLowThreshold(uint16_t &threshold);
|
||||
bool setLightIntLowThreshold(uint16_t threshold);
|
||||
bool getLightIntHighThreshold(uint16_t &threshold);
|
||||
bool setLightIntHighThreshold(uint16_t threshold);
|
||||
|
||||
/* Get and set interrupt enables */
|
||||
uint8_t getAmbientLightIntEnable();
|
||||
bool setAmbientLightIntEnable(uint8_t enable);
|
||||
uint8_t getProximityIntEnable();
|
||||
bool setProximityIntEnable(uint8_t enable);
|
||||
|
||||
/* Clear interrupts */
|
||||
bool clearAmbientLightInt();
|
||||
bool clearProximityInt();
|
||||
bool clearAllInts();
|
||||
|
||||
/* Proximity methods */
|
||||
bool readProximity(uint16_t &val);
|
||||
|
||||
/* Ambient light methods */
|
||||
bool readAmbientLightLux(float &val);
|
||||
bool readAmbientLightLux(unsigned long &val);
|
||||
float floatAmbientToLux(uint16_t Ch0, uint16_t Ch1);
|
||||
unsigned long ulongAmbientToLux(uint16_t Ch0, uint16_t Ch1);
|
||||
bool readCh0Light(uint16_t &val);
|
||||
bool readCh1Light(uint16_t &val);
|
||||
|
||||
//private:
|
||||
|
||||
/* Proximity Interrupt Threshold */
|
||||
uint16_t getProximityIntLowThreshold();
|
||||
bool setProximityIntLowThreshold(uint16_t threshold);
|
||||
uint16_t getProximityIntHighThreshold();
|
||||
bool setProximityIntHighThreshold(uint16_t threshold);
|
||||
|
||||
/* Raw I2C Commands */
|
||||
bool wireWriteByte(uint8_t val);
|
||||
bool wireWriteDataByte(uint8_t reg, uint8_t val);
|
||||
bool wireWriteDataBlock(uint8_t reg, uint8_t *val, unsigned int len);
|
||||
bool wireReadDataByte(uint8_t reg, uint8_t &val);
|
||||
int wireReadDataBlock(uint8_t reg, uint8_t *val, unsigned int len);
|
||||
};
|
||||
|
||||
#endif
|
23
firmware/sensor_apds9930.ino
Normal file
23
firmware/sensor_apds9930.ino
Normal file
|
@ -0,0 +1,23 @@
|
|||
#include <APDS9930.h>
|
||||
|
||||
APDS9930 _sensor_apds9930 = APDS9930();
|
||||
|
||||
bool sensor_apds9930_begin() {
|
||||
bool status = _sensor_apds9930.init();
|
||||
if (status) {
|
||||
_sensor_apds9930.enableLightSensor(false);
|
||||
debug("APDS9930 Connected");
|
||||
} else {
|
||||
debug("Could not find a valid APDS9930 sensor, check wiring!");
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
float apds9930_light() {
|
||||
float ambient_light = 0;
|
||||
if (_sensor_apds9930.readAmbientLightLux(ambient_light)) {
|
||||
return ambient_light;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
27
firmware/sensor_apds9960.ino
Normal file
27
firmware/sensor_apds9960.ino
Normal file
|
@ -0,0 +1,27 @@
|
|||
#include <Adafruit_APDS9960.h> // Adafruit APDS9960 - https://www.makerfabs.com/index.php?route=product/product&product_id=281
|
||||
|
||||
Adafruit_APDS9960 _sensor_apds9960;
|
||||
|
||||
bool sensor_apds9960_begin() {
|
||||
bool status = _sensor_apds9960.begin();
|
||||
if (status) {
|
||||
_sensor_apds9960.enableColor(true);
|
||||
debug("APDS9960 Connected");
|
||||
} else {
|
||||
debug("Could not find a valid APDS9960 sensor, check wiring!");
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
float apds9960_light() {
|
||||
uint16_t red, green, blue, white, lux;
|
||||
|
||||
while(!_sensor_apds9960.colorDataReady()) {
|
||||
delay(5);
|
||||
}
|
||||
|
||||
_sensor_apds9960.getColorData(&red, &green, &blue, &white);
|
||||
//calculate lux
|
||||
lux = _sensor_apds9960.calculateLux(red, green, blue);
|
||||
return lux * LIGHT_FACTOR;
|
||||
}
|
48
firmware/sensor_battery.ino
Normal file
48
firmware/sensor_battery.ino
Normal file
|
@ -0,0 +1,48 @@
|
|||
float _sensor_battery_saveMode = 0;
|
||||
uint16_t energySavingIterations = 0;
|
||||
|
||||
// Copied from https://arduinodiy.wordpress.com/2016/12/25/monitoring-lipo-battery-voltage-with-wemos-d1-minibattery-shield-and-thingspeak/
|
||||
float battery_voltage() {
|
||||
// ESP8266 ADC pin input voltage range ist 0V .. 1V
|
||||
// The Wemos D1 mini does already contain a voltage divider circuit: A0(Wemos PCB) -- [220kOhm] -- ADC (ESP8266)-- [100kOhm] -- GND
|
||||
// The (+) pole of the battery is connected to the A0 pin of the Wemos board through a additional 100kOhm resistance.
|
||||
// The battery voltage of 4.2V max is measured as 1.0V on ESP8266 ADC pin.
|
||||
uint16_t raw = analogRead(A0);
|
||||
float volt = raw / 1023.0;
|
||||
return volt * 4.2;
|
||||
}
|
||||
|
||||
float battery_charging() {
|
||||
if (LOW == digitalRead(BAT_CHARGING_PIN)) {
|
||||
return BAT_CHARGE_STATE_CHARGING;
|
||||
} else if (LOW == digitalRead(BAT_CHARGED_PIN)) {
|
||||
return BAT_CHARGE_STATE_CHARGED;
|
||||
}
|
||||
|
||||
return BAT_CHARGE_STATE_NOTCHARGING;
|
||||
}
|
||||
|
||||
int energySavingMode() {
|
||||
// Give the solar panel some time to load the cell to prevent
|
||||
// flapping.
|
||||
if (energySavingIterations > 0) {
|
||||
energySavingIterations--;
|
||||
_sensor_battery_saveMode = ENERGY_SAVE_MODE_ENABLED;
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Is the battery low?
|
||||
if (currentSensorData[SENSOR_BAT_VOLTAGE] <= BAT_LOW_VOLTAGE) {
|
||||
// Entering energy saving
|
||||
energySavingIterations = ENERGY_SAVING_ITERATIONS;
|
||||
_sensor_battery_saveMode = ENERGY_SAVE_MODE_ENABLED;
|
||||
return 1;
|
||||
}
|
||||
|
||||
_sensor_battery_saveMode = ENERGY_SAVE_MODE_DISABLED;
|
||||
return 0;
|
||||
}
|
||||
|
||||
float isEnergySavingMode() {
|
||||
return _sensor_battery_saveMode;
|
||||
}
|
24
firmware/sensor_bme280.ino
Normal file
24
firmware/sensor_bme280.ino
Normal file
|
@ -0,0 +1,24 @@
|
|||
#include <Adafruit_BME280.h> // BME280 - https://www.roboter-bausatz.de/1704/bmp280-barometer-luftdrucksensor?gclid=EAIaIQobChMIlpumj8Hp2wIVFWYbCh01PgmFEAQYAyABEgIwBvD_BwE
|
||||
#include "config_user.h"
|
||||
|
||||
Adafruit_BME280 _sensor_bme280;
|
||||
|
||||
bool sensor_bme280_begin(uint8_t addr) {
|
||||
bool status = _sensor_bme280.begin(addr);
|
||||
if (status) {
|
||||
debug("BME280 Connected!");
|
||||
} else {
|
||||
debug("Could not find a valid BME280 sensor, check wiring!");
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
float bme280_temperature() {
|
||||
return _sensor_bme280.readTemperature();
|
||||
}
|
||||
float bme280_pressure() {
|
||||
return _sensor_bme280.readPressure() / 100.0F;
|
||||
}
|
||||
float bme280_humidity() {
|
||||
return _sensor_bme280.readHumidity() * HUMIDITY_FACTOR;
|
||||
}
|
23
firmware/sensor_wind.ino
Normal file
23
firmware/sensor_wind.ino
Normal file
|
@ -0,0 +1,23 @@
|
|||
#include "config_user.h"
|
||||
|
||||
int anemometerRotations = 0;
|
||||
unsigned long currentTime = 0;
|
||||
|
||||
ICACHE_RAM_ATTR void _anemometerInterrupt() {
|
||||
anemometerRotations++;
|
||||
#ifdef DEBUG
|
||||
Serial.print("*");
|
||||
#endif
|
||||
}
|
||||
|
||||
float wind_speed() {
|
||||
anemometerRotations = 0;
|
||||
currentTime = millis();
|
||||
int interruptNumber = digitalPinToInterrupt(ANEMOMETER_PIN);
|
||||
|
||||
attachInterrupt(interruptNumber, _anemometerInterrupt, RISING);
|
||||
delay(1000 * 5);
|
||||
detachInterrupt(interruptNumber);
|
||||
|
||||
return (float)anemometerRotations / 5.0 * 2.4;
|
||||
}
|
|
@ -1,75 +0,0 @@
|
|||
#include "config_user.h"
|
||||
|
||||
int anemometerRotations = 0;
|
||||
unsigned long currentTime = 0;
|
||||
|
||||
float fetchTemperature() {
|
||||
return bme.readTemperature();
|
||||
}
|
||||
|
||||
float fetchPressure() {
|
||||
return bme.readPressure() / 100.0F;
|
||||
}
|
||||
|
||||
float fetchHumidity() {
|
||||
return bme.readHumidity() * HUMIDITY_FACTOR;
|
||||
}
|
||||
|
||||
float fetchLight() {
|
||||
//TODO read values
|
||||
uint16_t red, green, blue, white, lux;
|
||||
|
||||
while(!apds.colorDataReady()) {
|
||||
delay(5);
|
||||
}
|
||||
|
||||
apds.getColorData(&red, &green, &blue, &white);
|
||||
//calculate lux
|
||||
lux = apds.calculateLux(red, green, blue);
|
||||
return lux * LIGHT_FACTOR;
|
||||
}
|
||||
|
||||
ICACHE_RAM_ATTR void _anemometerInterrupt() {
|
||||
anemometerRotations++;
|
||||
#ifdef DEBUG
|
||||
Serial.print("*");
|
||||
#endif
|
||||
}
|
||||
|
||||
float fetchWindspeed() {
|
||||
anemometerRotations = 0;
|
||||
currentTime = millis();
|
||||
int interruptNumber = digitalPinToInterrupt(ANEMOMETER_PIN);
|
||||
|
||||
attachInterrupt(interruptNumber, _anemometerInterrupt, RISING);
|
||||
delay(1000 * 5);
|
||||
detachInterrupt(interruptNumber);
|
||||
|
||||
return (float)anemometerRotations / 5.0 * 2.4;
|
||||
}
|
||||
|
||||
// Copied from https://arduinodiy.wordpress.com/2016/12/25/monitoring-lipo-battery-voltage-with-wemos-d1-minibattery-shield-and-thingspeak/
|
||||
#ifdef BATTERY_POWERED
|
||||
float getBatteryVoltage() {
|
||||
// ESP8266 ADC pin input voltage range ist 0V .. 1V
|
||||
// The Wemos D1 mini does already contain a voltage divider circuit: A0(Wemos PCB) -- [220kOhm] -- ADC (ESP8266)-- [100kOhm] -- GND
|
||||
// The (+) pole of the battery is connected to the A0 pin of the Wemos board through a additional 100kOhm resistance.
|
||||
// The battery voltage of 4.2V max is measured as 1.0V on ESP8266 ADC pin.
|
||||
uint16_t raw = analogRead(A0);
|
||||
float volt = raw / 1023.0;
|
||||
return volt * 4.2;
|
||||
}
|
||||
|
||||
float isBatCharging() {
|
||||
if (LOW == digitalRead(BAT_CHARGING_PIN))
|
||||
{
|
||||
return BAT_CHARGE_STATE_CHARGING;
|
||||
} else if (LOW == digitalRead(BAT_CHARGED_PIN))
|
||||
{
|
||||
return BAT_CHARGE_STATE_CHARGED;
|
||||
}
|
||||
|
||||
return BAT_CHARGE_STATE_NOTCHARGING;
|
||||
}
|
||||
|
||||
#endif
|
|
@ -46,7 +46,7 @@ void doWebUpdater(void)
|
|||
void setSensorData(String device, String localip, float sensorValues[]) {
|
||||
dev = device;
|
||||
ip = localip;
|
||||
for (uint8_t i = 0; i < 7; i++)
|
||||
for (uint8_t i = 0; i < VALUES; i++)
|
||||
{
|
||||
sensValues[i] = sensorValues[i];
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue