add BH1750 sensor example
This commit is contained in:
parent
944f1b06d6
commit
a95b0c9d46
22
examples/osd/arduino-bh1750/BH1750FVI-master/.gitattributes
vendored
Normal file
22
examples/osd/arduino-bh1750/BH1750FVI-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
|
36
examples/osd/arduino-bh1750/BH1750FVI-master/.gitignore
vendored
Normal file
36
examples/osd/arduino-bh1750/BH1750FVI-master/.gitignore
vendored
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
# Windows image file caches
|
||||||
|
Thumbs.db
|
||||||
|
ehthumbs.db
|
||||||
|
|
||||||
|
# Folder config file
|
||||||
|
Desktop.ini
|
||||||
|
|
||||||
|
# Recycle Bin used on file shares
|
||||||
|
$RECYCLE.BIN/
|
||||||
|
|
||||||
|
# Windows Installer files
|
||||||
|
*.cab
|
||||||
|
*.msi
|
||||||
|
*.msm
|
||||||
|
*.msp
|
||||||
|
|
||||||
|
# =========================
|
||||||
|
# Operating System Files
|
||||||
|
# =========================
|
||||||
|
|
||||||
|
# OSX
|
||||||
|
# =========================
|
||||||
|
|
||||||
|
.DS_Store
|
||||||
|
.AppleDouble
|
||||||
|
.LSOverride
|
||||||
|
|
||||||
|
# Icon must ends with two \r.
|
||||||
|
Icon
|
||||||
|
|
||||||
|
# Thumbnails
|
||||||
|
._*
|
||||||
|
|
||||||
|
# Files that might appear on external disk
|
||||||
|
.Spotlight-V100
|
||||||
|
.Trashes
|
209
examples/osd/arduino-bh1750/BH1750FVI-master/BH1750FVI.cpp
Normal file
209
examples/osd/arduino-bh1750/BH1750FVI-master/BH1750FVI.cpp
Normal file
|
@ -0,0 +1,209 @@
|
||||||
|
#include "BH1750FVI.h"
|
||||||
|
#if ARDUINO >= 100
|
||||||
|
#include "Arduino.h"
|
||||||
|
#else
|
||||||
|
#include "WProgram.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <Wire.h>
|
||||||
|
|
||||||
|
void BH1750FVI::begin(byte mode, byte addr, double sens, int pin){
|
||||||
|
if(pin>=0 && pin<55){
|
||||||
|
pinMode(pin, OUTPUT);
|
||||||
|
if(addr==BH_AddrL) digitalWrite(pin, LOW);
|
||||||
|
if(addr==BH_AddrH) digitalWrite(pin, HIGH);
|
||||||
|
}
|
||||||
|
byte sensitivity;
|
||||||
|
if(sens<BH_MinSv){
|
||||||
|
sens = constrain(sens, ((double)BH_MinSv/(double)BH_DefSv), ((double)BH_MaxSv/(double)BH_DefSv));
|
||||||
|
sensitivity = (byte)round(sens*(double)BH_DefSv);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
sensitivity = constrain((byte)sens, BH_MinSv, BH_MaxSv);
|
||||||
|
}
|
||||||
|
address = addr;
|
||||||
|
currentSensitivity = sensitivity;
|
||||||
|
MTreg_hiByte = BH_MTrHb | (sensitivity >> 5);
|
||||||
|
MTreg_loByte = BH_MTrLb | (sensitivity & 0b00011111);
|
||||||
|
switch(mode){
|
||||||
|
case BH_ContL:
|
||||||
|
case BH_ContH:
|
||||||
|
case BH_Conth:
|
||||||
|
startOngoingSamples(mode);
|
||||||
|
break;
|
||||||
|
case BH_SingH:
|
||||||
|
case BH_Singh:
|
||||||
|
case BH_SingL:
|
||||||
|
startSingleSample(mode);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
mode = BH_EasyH;
|
||||||
|
startOngoingSamples(mode);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
sampleUnseen = false;
|
||||||
|
lastSampleStart = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
word BH1750FVI::startOngoingSamples(char mode){
|
||||||
|
if(mode==BH_NoMod) mode=currentMode;
|
||||||
|
byte lowLevelMode = mode;
|
||||||
|
if(lowLevelMode==BH_EasyH) lowLevelMode=BH_ContH;
|
||||||
|
switch(mode){
|
||||||
|
case BH_EasyH:
|
||||||
|
case BH_ContH:
|
||||||
|
case BH_Conth:
|
||||||
|
case BH_ContL:
|
||||||
|
i2cWrite(BH_PowOn);
|
||||||
|
i2cWrite(MTreg_hiByte);
|
||||||
|
i2cWrite(MTreg_loByte);
|
||||||
|
i2cWrite(lowLevelMode);
|
||||||
|
lastSampleStart = millis();
|
||||||
|
currentMode = mode;
|
||||||
|
return setSensitivity(currentSensitivity);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
word BH1750FVI::startSingleSample(char mode){
|
||||||
|
if(mode==BH_NoMod){
|
||||||
|
mode=currentMode;
|
||||||
|
}
|
||||||
|
switch(mode){
|
||||||
|
case BH_SingH:
|
||||||
|
case BH_Singh:
|
||||||
|
case BH_SingL:
|
||||||
|
i2cWrite(BH_PowOn);
|
||||||
|
i2cWrite(MTreg_hiByte);
|
||||||
|
i2cWrite(MTreg_loByte);
|
||||||
|
i2cWrite(mode);
|
||||||
|
lastSampleStart = millis();
|
||||||
|
currentMode = mode;
|
||||||
|
return setSensitivity(currentSensitivity);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool BH1750FVI::sampleIsFresh(){
|
||||||
|
if(sampleUnseen) return true;
|
||||||
|
else if((millis() > (lastSampleStart+currentSamplingTime))){
|
||||||
|
sampleUnseen = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
word BH1750FVI::getLightLevel(char mode){
|
||||||
|
unsigned long int Intensity_value;
|
||||||
|
sampleUnseen = false;
|
||||||
|
Intensity_value = i2cRead();
|
||||||
|
if(mode!='r'){
|
||||||
|
Intensity_value = (Intensity_value*5)/6;
|
||||||
|
if(mode!='c'){
|
||||||
|
Intensity_value = (Intensity_value*69)/currentSensitivity;
|
||||||
|
}
|
||||||
|
/*this next adjustment is not useful in practice. if you're using
|
||||||
|
a half-scale mode, you want the extra sensitivity. I'm leaving it
|
||||||
|
here for reference.
|
||||||
|
switch(currentMode){
|
||||||
|
case BH_Singh:
|
||||||
|
case BH_Conth:
|
||||||
|
Intensity_value /= 2;
|
||||||
|
}*/
|
||||||
|
Intensity_value = constrain(Intensity_value, 0, 65535);
|
||||||
|
}
|
||||||
|
switch(currentMode){
|
||||||
|
case BH_ContH:
|
||||||
|
case BH_Conth:
|
||||||
|
case BH_ContL:
|
||||||
|
case BH_EasyH:
|
||||||
|
//this is a fake previous sample time that will keep pace with
|
||||||
|
//the actual BH1750FVI's sampling rate, but isn't necessarily
|
||||||
|
//synchronized to the earliest time each new sample is available.
|
||||||
|
//if you want true synchronized timing, use a single-sample mode.
|
||||||
|
lastSampleStart = millis();
|
||||||
|
}
|
||||||
|
return (word)Intensity_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
word BH1750FVI::setSensitivity(double sens){
|
||||||
|
if(sens<((double)(BH_MinSv/2))){
|
||||||
|
sens = constrain(sens,
|
||||||
|
((double)BH_MinSv/(double)BH_DefSv),
|
||||||
|
((double)BH_MaxSv/(double)BH_DefSv)
|
||||||
|
);
|
||||||
|
sens = sens*(double)BH_DefSv;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
sens = constrain(sens, (double)BH_MinSv, (double)BH_MaxSv);
|
||||||
|
}
|
||||||
|
return setSensitivity((byte)round(sens));
|
||||||
|
}
|
||||||
|
|
||||||
|
word BH1750FVI::setSensitivity(float sens){
|
||||||
|
return setSensitivity((double)sens);
|
||||||
|
}
|
||||||
|
|
||||||
|
word BH1750FVI::setSensitivity(int sens){
|
||||||
|
sens = constrain(sens, 1, BH_MaxSv);
|
||||||
|
return setSensitivity((byte)sens);
|
||||||
|
}
|
||||||
|
|
||||||
|
word BH1750FVI::setSensitivity(byte sens){
|
||||||
|
if(sens<(BH_MinSv/2)){
|
||||||
|
sens = BH_DefSv*(constrain(sens, (byte)1, (byte)3));
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
sens = constrain(sens, BH_MinSv, BH_MaxSv);
|
||||||
|
}
|
||||||
|
switch(currentMode){
|
||||||
|
case BH_ContL:
|
||||||
|
case BH_SingL:
|
||||||
|
currentSamplingTime = (word)((BH_FastD*(unsigned long int)sens)/BH_DefSv);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
currentSamplingTime = (word)((((unsigned long int)BH_SlowD)*((unsigned long int)sens))/BH_DefSv);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
MTreg_hiByte = BH_MTrHb | (sens >> 5);
|
||||||
|
MTreg_loByte = BH_MTrLb | (sens & 0b00011111);
|
||||||
|
currentSensitivity = sens;
|
||||||
|
sampleUnseen = false;
|
||||||
|
return currentSamplingTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BH1750FVI::powerDown(){
|
||||||
|
i2cWrite(BH_PowOf);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*I2C INTERFACE
|
||||||
|
These two functions were originally based on code written by
|
||||||
|
https://github.com/claws/ and
|
||||||
|
https://github.com/Genotronex/
|
||||||
|
*/
|
||||||
|
void BH1750FVI::i2cWrite(byte dataToSend){
|
||||||
|
Wire.beginTransmission(address);
|
||||||
|
Wire.write(dataToSend);
|
||||||
|
Wire.endTransmission();
|
||||||
|
}
|
||||||
|
|
||||||
|
word BH1750FVI::i2cRead(){
|
||||||
|
word value;
|
||||||
|
Wire.beginTransmission(address);
|
||||||
|
Wire.requestFrom(address, (byte)2);
|
||||||
|
if(Wire.available()){
|
||||||
|
value = Wire.read();
|
||||||
|
if(Wire.available()){
|
||||||
|
value <<= 8;
|
||||||
|
value |= Wire.read();
|
||||||
|
}
|
||||||
|
else value=0;
|
||||||
|
}
|
||||||
|
else value=0;
|
||||||
|
Wire.endTransmission();
|
||||||
|
return value;
|
||||||
|
}
|
115
examples/osd/arduino-bh1750/BH1750FVI-master/BH1750FVI.h
Normal file
115
examples/osd/arduino-bh1750/BH1750FVI-master/BH1750FVI.h
Normal file
|
@ -0,0 +1,115 @@
|
||||||
|
#ifndef BH1750FVI_h
|
||||||
|
#define BH1750FVI_h
|
||||||
|
|
||||||
|
#if ARDUINO >= 100
|
||||||
|
#include "Arduino.h"
|
||||||
|
#else
|
||||||
|
#include "WProgram.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <Wire.h>
|
||||||
|
|
||||||
|
//device address options
|
||||||
|
#define BH_AddrL 0x23 // Device address when addr pin is LOW
|
||||||
|
#define BH_AddrH 0x5C // Device address when addr pin is HIGH
|
||||||
|
|
||||||
|
//power codes
|
||||||
|
#define BH_PowOf 0x00 // power-off code
|
||||||
|
#define BH_PowOn 0x01 // power-on code
|
||||||
|
#define BH_Reset 0x07 // code to reset the light reading register to zero
|
||||||
|
|
||||||
|
//mode codes
|
||||||
|
#define BH_NoMod 0x02 // No mode specified. Keeps mode the same as before.
|
||||||
|
#define BH_EasyH 0x03 // 'easy' mode. basically the same as ContH
|
||||||
|
#define BH_ContH 0x10 // continuous full-scale, high-resolution sampling
|
||||||
|
#define BH_Conth 0x11 // continuous with twice the resolution but half the max value
|
||||||
|
#define BH_ContL 0x13 // continuous full-scale, low-resolution sampling. faster.
|
||||||
|
#define BH_SingH 0x20 // take one high-resolution, full-scale sample then turn off
|
||||||
|
#define BH_Singh 0x21 // take one high-resolution, half-scale sample then turn off
|
||||||
|
#define BH_SingL 0x23 // take one low-resolution, full-scale sample then turn off
|
||||||
|
// (happens to be the same as the low address value)
|
||||||
|
|
||||||
|
//sensitivity codes
|
||||||
|
#define BH_MTrHb 0x40 // last 3 bits must be masked to 3 MSB of desired value
|
||||||
|
#define BH_MTrLb 0x60 // last 5 bits must be masked to 5 LSB of desired value
|
||||||
|
#define BH_MinSv 31 // minimum sensitivity register value, yields Lux * 0.45
|
||||||
|
#define BH_MaxSv 254 // maximum sensitivity register value, yields Lux * 3.68
|
||||||
|
#define BH_DefSv 69 // default sensitivity register value, yields Lux * 1.00
|
||||||
|
|
||||||
|
//timing delays. they're actually longer than the datasheet says.
|
||||||
|
#define BH_FastD 18 // basic delay in microseconds for a fast sample
|
||||||
|
#define BH_SlowD 125 // basic delay in microseconds for a slow sample
|
||||||
|
|
||||||
|
class BH1750FVI {
|
||||||
|
public:
|
||||||
|
/*BEGIN
|
||||||
|
this is intended to be as error-tolerant as possible. if you don't supply
|
||||||
|
a mode, the default mode will be 'easy'. the sensitivity obviously defaults
|
||||||
|
to 1.0 (byte value of 69). Default address selection is LOW, which is how
|
||||||
|
the BH1750FVI should default if you don't connect anything to its ADDR pin.
|
||||||
|
*/void begin(byte mode=BH_EasyH, byte addr=BH_AddrL, double sens=BH_DefSv, int addrPin=-1);
|
||||||
|
|
||||||
|
/*FRESH SAMPLE POLLING
|
||||||
|
Check whether you have already looked at the current sample.
|
||||||
|
*/bool sampleIsFresh();
|
||||||
|
|
||||||
|
/*ACTUALLY GET A READING FROM THE SENSOR
|
||||||
|
This is probably all you wanted from this library. Return value is an
|
||||||
|
unsigned 16 bit integer with units of Lux. There are three possible modes:
|
||||||
|
'r' raw numerical reading, no units, you get what you get
|
||||||
|
'c' convert units to Lux or half-Lux, depending on the mode, but don't
|
||||||
|
compensate for the sensitivity setting. This allows sensitivity to
|
||||||
|
be used as enclosure optics calibration/compensation.
|
||||||
|
't' true Lux (or half-Lux) reading, regardless of sensitivity settings.
|
||||||
|
*/word getLightLevel(char adjustments='c');
|
||||||
|
|
||||||
|
word retrieveSample();
|
||||||
|
|
||||||
|
/*CONTINUOUS SAMPLING
|
||||||
|
Return value of this start function is the delay time between refreshes of
|
||||||
|
the ambient light reading. After you call this function, you can use getLightLevel()
|
||||||
|
to read the most recent ambient light level. If you try to run this ongoing start
|
||||||
|
function with a one-time mode argument, it will do nothing and return 0.
|
||||||
|
*/word startOngoingSamples(char mode=BH_NoMod);
|
||||||
|
|
||||||
|
/*ONE-TIME SAMPLE START
|
||||||
|
Return value of this start function is the delay time before the new ambient
|
||||||
|
light reading will be available. You can check whether the new sample is ready
|
||||||
|
yet using sampleIsFresh(). Retrieve that single sample with getLightLevel().
|
||||||
|
If you give this one-time start function a continuous mode argument, it will
|
||||||
|
do nothing and return 0.
|
||||||
|
*/word startSingleSample(char mode=BH_NoMod);
|
||||||
|
|
||||||
|
/*SENSITIVITY SETTINGS
|
||||||
|
This function lets you change the 'sensitivity' of the BH1750FVI by changing
|
||||||
|
its sampling time up or down. The sensitivity is stored as a number between
|
||||||
|
31 and 254, with a default value of 69. This is intended to compensate for
|
||||||
|
having the chip installed in an enclosure that blocks some ambient light.
|
||||||
|
The floating point versions of the function allow the sensitivity to be
|
||||||
|
given as a ratio between ~0.45 and ~3.68. The return value is the number of
|
||||||
|
milliseconds that the chip will take to create a new light level reading.
|
||||||
|
*/word setSensitivity(double sens);
|
||||||
|
word setSensitivity(float sens);
|
||||||
|
word setSensitivity(int sens);
|
||||||
|
word setSensitivity(byte sens=BH_DefSv);
|
||||||
|
|
||||||
|
/*POWERDOWN FUNCTION
|
||||||
|
In case you want to turn off the BH1750FVI to save power. Other commands will wake
|
||||||
|
the chip back up. Single sample modes automatically turn off the chip after sampling,
|
||||||
|
but you can still read the value from it without waking it up.
|
||||||
|
*/void powerDown();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void init(byte mode, byte addr, byte sens);
|
||||||
|
void i2cWrite(byte dataToSend);
|
||||||
|
word i2cRead();
|
||||||
|
byte address;
|
||||||
|
byte currentMode;
|
||||||
|
byte currentSensitivity;
|
||||||
|
bool sampleUnseen;
|
||||||
|
byte MTreg_hiByte;
|
||||||
|
byte MTreg_loByte;
|
||||||
|
unsigned long int lastSampleStart;
|
||||||
|
word currentSamplingTime;
|
||||||
|
};
|
||||||
|
#endif
|
|
@ -0,0 +1,23 @@
|
||||||
|
#include <Wire.h>
|
||||||
|
#include <BH1750FVI.h>
|
||||||
|
|
||||||
|
BH1750FVI eye;
|
||||||
|
word maxLux = 0;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Wire.begin();
|
||||||
|
Serial.begin(115200);
|
||||||
|
//most basic setup with all default options
|
||||||
|
eye.begin();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
//take a sensor reading, with units of Lux
|
||||||
|
word value = eye.getLightLevel();
|
||||||
|
byte spaces;
|
||||||
|
if(value>maxLux) maxLux=value;
|
||||||
|
spaces=map(value, 0, maxLux, 0, 32);
|
||||||
|
for(int i=0; i<spaces; i++) Serial.print(' ');
|
||||||
|
Serial.println(value);
|
||||||
|
delay(100);
|
||||||
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
#include <Wire.h>
|
||||||
|
#include <BH1750FVI.h>
|
||||||
|
|
||||||
|
BH1750FVI eye;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Wire.begin();
|
||||||
|
Serial.begin(115200);
|
||||||
|
//setup with continuous sampling, using the low address and double sensitivity
|
||||||
|
eye.begin(BH_ContH, BH_AddrL, 2.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
//test if the sensor has had time to produce a new reading
|
||||||
|
if(eye.sampleIsFresh()){
|
||||||
|
//read the calibration-adjusted value, according to the sensitivity setting
|
||||||
|
word value = eye.getLightLevel('c');
|
||||||
|
logarithmicGraphing(value);
|
||||||
|
Serial.println(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void logarithmicGraphing(word value){
|
||||||
|
int i=0;
|
||||||
|
while(value>>i){
|
||||||
|
i++;
|
||||||
|
Serial.print(" ");
|
||||||
|
}
|
||||||
|
if(i>=2){
|
||||||
|
i=i-2;
|
||||||
|
if(value&(1<<i))Serial.print(' ');
|
||||||
|
}
|
||||||
|
}
|
2
examples/osd/arduino-bh1750/BH1750FVI-master/README
Normal file
2
examples/osd/arduino-bh1750/BH1750FVI-master/README
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
This library interfaces with the BH1750FVI ambient light sensor.
|
||||||
|
Written by Drew Morgan in September 2014 while I stayed at home with my first baby.
|
47
examples/osd/arduino-bh1750/BH1750FVI-master/keywords.txt
Normal file
47
examples/osd/arduino-bh1750/BH1750FVI-master/keywords.txt
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
#######################################
|
||||||
|
# Syntax Coloring Map For BH1750FVI
|
||||||
|
#######################################
|
||||||
|
|
||||||
|
#######################################
|
||||||
|
# Datatypes (KEYWORD1)
|
||||||
|
#######################################
|
||||||
|
|
||||||
|
BH1750FVI KEYWORD1
|
||||||
|
|
||||||
|
#######################################
|
||||||
|
# Methods and Functions (KEYWORD2)
|
||||||
|
#######################################
|
||||||
|
|
||||||
|
sampleIsFresh KEYWORD2
|
||||||
|
getLightLevel KEYWORD2
|
||||||
|
retrieveSample KEYWORD2
|
||||||
|
startOngoingSamples KEYWORD2
|
||||||
|
startSingleSample KEYWORD2
|
||||||
|
setSensitivity KEYWORD2
|
||||||
|
startSingleSample KEYWORD2
|
||||||
|
printDebug KEYWORD2
|
||||||
|
|
||||||
|
#######################################
|
||||||
|
# Constants (LITERAL1)
|
||||||
|
#######################################
|
||||||
|
|
||||||
|
BH_AddrL LITERAL1
|
||||||
|
BH_AddrH LITERAL1
|
||||||
|
BH_PowOf LITERAL1
|
||||||
|
BH_PowOn LITERAL1
|
||||||
|
BH_Reset LITERAL1
|
||||||
|
BH_NoMod LITERAL1
|
||||||
|
BH_EasyH LITERAL1
|
||||||
|
BH_ContH LITERAL1
|
||||||
|
BH_Conth LITERAL1
|
||||||
|
BH_ContL LITERAL1
|
||||||
|
BH_SingH LITERAL1
|
||||||
|
BH_Singh LITERAL1
|
||||||
|
BH_SingL LITERAL1
|
||||||
|
BH_MTrHb LITERAL1
|
||||||
|
BH_MTrLb LITERAL1
|
||||||
|
BH_MinSv LITERAL1
|
||||||
|
BH_MaxSv LITERAL1
|
||||||
|
BH_DefSv LITERAL1
|
||||||
|
BH_FastD LITERAL1
|
||||||
|
BH_SlowD LITERAL1
|
209
examples/osd/arduino-bh1750/BH1750FVI.cpp
Normal file
209
examples/osd/arduino-bh1750/BH1750FVI.cpp
Normal file
|
@ -0,0 +1,209 @@
|
||||||
|
#include "BH1750FVI.h"
|
||||||
|
//#if ARDUINO >= 100
|
||||||
|
#include "Arduino.h"
|
||||||
|
//#else
|
||||||
|
// #include "WProgram.h"
|
||||||
|
//#endif
|
||||||
|
|
||||||
|
#include <Wire.h>
|
||||||
|
|
||||||
|
void BH1750FVI::begin(byte mode, byte addr, double sens, int pin){
|
||||||
|
if(pin>=0 && pin<55){
|
||||||
|
pinMode(pin, OUTPUT);
|
||||||
|
if(addr==BH_AddrL) digitalWrite(pin, LOW);
|
||||||
|
if(addr==BH_AddrH) digitalWrite(pin, HIGH);
|
||||||
|
}
|
||||||
|
byte sensitivity;
|
||||||
|
if(sens<BH_MinSv){
|
||||||
|
sens = constrain(sens, ((double)BH_MinSv/(double)BH_DefSv), ((double)BH_MaxSv/(double)BH_DefSv));
|
||||||
|
sensitivity = (byte)round(sens*(double)BH_DefSv);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
sensitivity = constrain((byte)sens, BH_MinSv, BH_MaxSv);
|
||||||
|
}
|
||||||
|
address = addr;
|
||||||
|
currentSensitivity = sensitivity;
|
||||||
|
MTreg_hiByte = BH_MTrHb | (sensitivity >> 5);
|
||||||
|
MTreg_loByte = BH_MTrLb | (sensitivity & 0b00011111);
|
||||||
|
switch(mode){
|
||||||
|
case BH_ContL:
|
||||||
|
case BH_ContH:
|
||||||
|
case BH_Conth:
|
||||||
|
startOngoingSamples(mode);
|
||||||
|
break;
|
||||||
|
case BH_SingH:
|
||||||
|
case BH_Singh:
|
||||||
|
case BH_SingL:
|
||||||
|
startSingleSample(mode);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
mode = BH_EasyH;
|
||||||
|
startOngoingSamples(mode);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
sampleUnseen = false;
|
||||||
|
lastSampleStart = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
word BH1750FVI::startOngoingSamples(char mode){
|
||||||
|
if(mode==BH_NoMod) mode=currentMode;
|
||||||
|
byte lowLevelMode = mode;
|
||||||
|
if(lowLevelMode==BH_EasyH) lowLevelMode=BH_ContH;
|
||||||
|
switch(mode){
|
||||||
|
case BH_EasyH:
|
||||||
|
case BH_ContH:
|
||||||
|
case BH_Conth:
|
||||||
|
case BH_ContL:
|
||||||
|
i2cWrite(BH_PowOn);
|
||||||
|
i2cWrite(MTreg_hiByte);
|
||||||
|
i2cWrite(MTreg_loByte);
|
||||||
|
i2cWrite(lowLevelMode);
|
||||||
|
lastSampleStart = millis();
|
||||||
|
currentMode = mode;
|
||||||
|
return setSensitivity(currentSensitivity);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
word BH1750FVI::startSingleSample(char mode){
|
||||||
|
if(mode==BH_NoMod){
|
||||||
|
mode=currentMode;
|
||||||
|
}
|
||||||
|
switch(mode){
|
||||||
|
case BH_SingH:
|
||||||
|
case BH_Singh:
|
||||||
|
case BH_SingL:
|
||||||
|
i2cWrite(BH_PowOn);
|
||||||
|
i2cWrite(MTreg_hiByte);
|
||||||
|
i2cWrite(MTreg_loByte);
|
||||||
|
i2cWrite(mode);
|
||||||
|
lastSampleStart = millis();
|
||||||
|
currentMode = mode;
|
||||||
|
return setSensitivity(currentSensitivity);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool BH1750FVI::sampleIsFresh(){
|
||||||
|
if(sampleUnseen) return true;
|
||||||
|
else if((millis() > (lastSampleStart+currentSamplingTime))){
|
||||||
|
sampleUnseen = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
word BH1750FVI::getLightLevel(char mode){
|
||||||
|
unsigned long int Intensity_value;
|
||||||
|
sampleUnseen = false;
|
||||||
|
Intensity_value = i2cRead();
|
||||||
|
if(mode!='r'){
|
||||||
|
Intensity_value = (Intensity_value*5)/6;
|
||||||
|
if(mode!='c'){
|
||||||
|
Intensity_value = (Intensity_value*69)/currentSensitivity;
|
||||||
|
}
|
||||||
|
/*this next adjustment is not useful in practice. if you're using
|
||||||
|
a half-scale mode, you want the extra sensitivity. I'm leaving it
|
||||||
|
here for reference.
|
||||||
|
switch(currentMode){
|
||||||
|
case BH_Singh:
|
||||||
|
case BH_Conth:
|
||||||
|
Intensity_value /= 2;
|
||||||
|
}*/
|
||||||
|
Intensity_value = constrain(Intensity_value, 0, 65535);
|
||||||
|
}
|
||||||
|
switch(currentMode){
|
||||||
|
case BH_ContH:
|
||||||
|
case BH_Conth:
|
||||||
|
case BH_ContL:
|
||||||
|
case BH_EasyH:
|
||||||
|
//this is a fake previous sample time that will keep pace with
|
||||||
|
//the actual BH1750FVI's sampling rate, but isn't necessarily
|
||||||
|
//synchronized to the earliest time each new sample is available.
|
||||||
|
//if you want true synchronized timing, use a single-sample mode.
|
||||||
|
lastSampleStart = millis();
|
||||||
|
}
|
||||||
|
return (word)Intensity_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
word BH1750FVI::setSensitivity(double sens){
|
||||||
|
if(sens<((double)(BH_MinSv/2))){
|
||||||
|
sens = constrain(sens,
|
||||||
|
((double)BH_MinSv/(double)BH_DefSv),
|
||||||
|
((double)BH_MaxSv/(double)BH_DefSv)
|
||||||
|
);
|
||||||
|
sens = sens*(double)BH_DefSv;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
sens = constrain(sens, (double)BH_MinSv, (double)BH_MaxSv);
|
||||||
|
}
|
||||||
|
return setSensitivity((byte)round(sens));
|
||||||
|
}
|
||||||
|
|
||||||
|
word BH1750FVI::setSensitivity(float sens){
|
||||||
|
return setSensitivity((double)sens);
|
||||||
|
}
|
||||||
|
|
||||||
|
word BH1750FVI::setSensitivity(int sens){
|
||||||
|
sens = constrain(sens, 1, BH_MaxSv);
|
||||||
|
return setSensitivity((byte)sens);
|
||||||
|
}
|
||||||
|
|
||||||
|
word BH1750FVI::setSensitivity(byte sens){
|
||||||
|
if(sens<(BH_MinSv/2)){
|
||||||
|
sens = BH_DefSv*(constrain(sens, (byte)1, (byte)3));
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
sens = constrain(sens, BH_MinSv, BH_MaxSv);
|
||||||
|
}
|
||||||
|
switch(currentMode){
|
||||||
|
case BH_ContL:
|
||||||
|
case BH_SingL:
|
||||||
|
currentSamplingTime = (word)((BH_FastD*(unsigned long int)sens)/BH_DefSv);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
currentSamplingTime = (word)((((unsigned long int)BH_SlowD)*((unsigned long int)sens))/BH_DefSv);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
MTreg_hiByte = BH_MTrHb | (sens >> 5);
|
||||||
|
MTreg_loByte = BH_MTrLb | (sens & 0b00011111);
|
||||||
|
currentSensitivity = sens;
|
||||||
|
sampleUnseen = false;
|
||||||
|
return currentSamplingTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BH1750FVI::powerDown(){
|
||||||
|
i2cWrite(BH_PowOf);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*I2C INTERFACE
|
||||||
|
These two functions were originally based on code written by
|
||||||
|
https://github.com/claws/ and
|
||||||
|
https://github.com/Genotronex/
|
||||||
|
*/
|
||||||
|
void BH1750FVI::i2cWrite(byte dataToSend){
|
||||||
|
Wire.beginTransmission(address);
|
||||||
|
Wire.write(dataToSend);
|
||||||
|
Wire.endTransmission();
|
||||||
|
}
|
||||||
|
|
||||||
|
word BH1750FVI::i2cRead(){
|
||||||
|
word value;
|
||||||
|
Wire.beginTransmission(address);
|
||||||
|
Wire.requestFrom(address, (byte)2);
|
||||||
|
if(Wire.available()){
|
||||||
|
value = Wire.read();
|
||||||
|
if(Wire.available()){
|
||||||
|
value <<= 8;
|
||||||
|
value |= Wire.read();
|
||||||
|
}
|
||||||
|
else value=0;
|
||||||
|
}
|
||||||
|
else value=0;
|
||||||
|
Wire.endTransmission();
|
||||||
|
return value;
|
||||||
|
}
|
115
examples/osd/arduino-bh1750/BH1750FVI.h
Normal file
115
examples/osd/arduino-bh1750/BH1750FVI.h
Normal file
|
@ -0,0 +1,115 @@
|
||||||
|
#ifndef BH1750FVI_h
|
||||||
|
#define BH1750FVI_h
|
||||||
|
|
||||||
|
//#if ARDUINO >= 100
|
||||||
|
#include "Arduino.h"
|
||||||
|
//#else
|
||||||
|
// #include "WProgram.h"
|
||||||
|
//#endif
|
||||||
|
|
||||||
|
#include <Wire.h>
|
||||||
|
|
||||||
|
//device address options
|
||||||
|
#define BH_AddrL 0x23 // Device address when addr pin is LOW
|
||||||
|
#define BH_AddrH 0x5C // Device address when addr pin is HIGH
|
||||||
|
|
||||||
|
//power codes
|
||||||
|
#define BH_PowOf 0x00 // power-off code
|
||||||
|
#define BH_PowOn 0x01 // power-on code
|
||||||
|
#define BH_Reset 0x07 // code to reset the light reading register to zero
|
||||||
|
|
||||||
|
//mode codes
|
||||||
|
#define BH_NoMod 0x02 // No mode specified. Keeps mode the same as before.
|
||||||
|
#define BH_EasyH 0x03 // 'easy' mode. basically the same as ContH
|
||||||
|
#define BH_ContH 0x10 // continuous full-scale, high-resolution sampling
|
||||||
|
#define BH_Conth 0x11 // continuous with twice the resolution but half the max value
|
||||||
|
#define BH_ContL 0x13 // continuous full-scale, low-resolution sampling. faster.
|
||||||
|
#define BH_SingH 0x20 // take one high-resolution, full-scale sample then turn off
|
||||||
|
#define BH_Singh 0x21 // take one high-resolution, half-scale sample then turn off
|
||||||
|
#define BH_SingL 0x23 // take one low-resolution, full-scale sample then turn off
|
||||||
|
// (happens to be the same as the low address value)
|
||||||
|
|
||||||
|
//sensitivity codes
|
||||||
|
#define BH_MTrHb 0x40 // last 3 bits must be masked to 3 MSB of desired value
|
||||||
|
#define BH_MTrLb 0x60 // last 5 bits must be masked to 5 LSB of desired value
|
||||||
|
#define BH_MinSv 31 // minimum sensitivity register value, yields Lux * 0.45
|
||||||
|
#define BH_MaxSv 254 // maximum sensitivity register value, yields Lux * 3.68
|
||||||
|
#define BH_DefSv 69 // default sensitivity register value, yields Lux * 1.00
|
||||||
|
|
||||||
|
//timing delays. they're actually longer than the datasheet says.
|
||||||
|
#define BH_FastD 18 // basic delay in microseconds for a fast sample
|
||||||
|
#define BH_SlowD 125 // basic delay in microseconds for a slow sample
|
||||||
|
|
||||||
|
class BH1750FVI {
|
||||||
|
public:
|
||||||
|
/*BEGIN
|
||||||
|
this is intended to be as error-tolerant as possible. if you don't supply
|
||||||
|
a mode, the default mode will be 'easy'. the sensitivity obviously defaults
|
||||||
|
to 1.0 (byte value of 69). Default address selection is LOW, which is how
|
||||||
|
the BH1750FVI should default if you don't connect anything to its ADDR pin.
|
||||||
|
*/void begin(byte mode=BH_EasyH, byte addr=BH_AddrL, double sens=BH_DefSv, int addrPin=-1);
|
||||||
|
|
||||||
|
/*FRESH SAMPLE POLLING
|
||||||
|
Check whether you have already looked at the current sample.
|
||||||
|
*/bool sampleIsFresh();
|
||||||
|
|
||||||
|
/*ACTUALLY GET A READING FROM THE SENSOR
|
||||||
|
This is probably all you wanted from this library. Return value is an
|
||||||
|
unsigned 16 bit integer with units of Lux. There are three possible modes:
|
||||||
|
'r' raw numerical reading, no units, you get what you get
|
||||||
|
'c' convert units to Lux or half-Lux, depending on the mode, but don't
|
||||||
|
compensate for the sensitivity setting. This allows sensitivity to
|
||||||
|
be used as enclosure optics calibration/compensation.
|
||||||
|
't' true Lux (or half-Lux) reading, regardless of sensitivity settings.
|
||||||
|
*/word getLightLevel(char adjustments='c');
|
||||||
|
|
||||||
|
word retrieveSample();
|
||||||
|
|
||||||
|
/*CONTINUOUS SAMPLING
|
||||||
|
Return value of this start function is the delay time between refreshes of
|
||||||
|
the ambient light reading. After you call this function, you can use getLightLevel()
|
||||||
|
to read the most recent ambient light level. If you try to run this ongoing start
|
||||||
|
function with a one-time mode argument, it will do nothing and return 0.
|
||||||
|
*/word startOngoingSamples(char mode=BH_NoMod);
|
||||||
|
|
||||||
|
/*ONE-TIME SAMPLE START
|
||||||
|
Return value of this start function is the delay time before the new ambient
|
||||||
|
light reading will be available. You can check whether the new sample is ready
|
||||||
|
yet using sampleIsFresh(). Retrieve that single sample with getLightLevel().
|
||||||
|
If you give this one-time start function a continuous mode argument, it will
|
||||||
|
do nothing and return 0.
|
||||||
|
*/word startSingleSample(char mode=BH_NoMod);
|
||||||
|
|
||||||
|
/*SENSITIVITY SETTINGS
|
||||||
|
This function lets you change the 'sensitivity' of the BH1750FVI by changing
|
||||||
|
its sampling time up or down. The sensitivity is stored as a number between
|
||||||
|
31 and 254, with a default value of 69. This is intended to compensate for
|
||||||
|
having the chip installed in an enclosure that blocks some ambient light.
|
||||||
|
The floating point versions of the function allow the sensitivity to be
|
||||||
|
given as a ratio between ~0.45 and ~3.68. The return value is the number of
|
||||||
|
milliseconds that the chip will take to create a new light level reading.
|
||||||
|
*/word setSensitivity(double sens);
|
||||||
|
word setSensitivity(float sens);
|
||||||
|
word setSensitivity(int sens);
|
||||||
|
word setSensitivity(byte sens=BH_DefSv);
|
||||||
|
|
||||||
|
/*POWERDOWN FUNCTION
|
||||||
|
In case you want to turn off the BH1750FVI to save power. Other commands will wake
|
||||||
|
the chip back up. Single sample modes automatically turn off the chip after sampling,
|
||||||
|
but you can still read the value from it without waking it up.
|
||||||
|
*/void powerDown();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void init(byte mode, byte addr, byte sens);
|
||||||
|
void i2cWrite(byte dataToSend);
|
||||||
|
word i2cRead();
|
||||||
|
byte address;
|
||||||
|
byte currentMode;
|
||||||
|
byte currentSensitivity;
|
||||||
|
bool sampleUnseen;
|
||||||
|
byte MTreg_hiByte;
|
||||||
|
byte MTreg_loByte;
|
||||||
|
unsigned long int lastSampleStart;
|
||||||
|
word currentSamplingTime;
|
||||||
|
};
|
||||||
|
#endif
|
71
examples/osd/arduino-bh1750/Makefile
Normal file
71
examples/osd/arduino-bh1750/Makefile
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
# Set this to the name of your sketch (without extension .pde)
|
||||||
|
SKETCH=sketch
|
||||||
|
EXE=arduino-example
|
||||||
|
|
||||||
|
all: $(EXE)
|
||||||
|
|
||||||
|
CONTIKI=../../..
|
||||||
|
|
||||||
|
# Contiki IPv6 configuration
|
||||||
|
CONTIKI_WITH_IPV6 = 1
|
||||||
|
|
||||||
|
CFLAGS += -DPROJECT_CONF_H=\"project-conf.h\"
|
||||||
|
LFLAGS += -lm
|
||||||
|
|
||||||
|
PROJECT_SOURCEFILES += ${SKETCH}.cpp BH1750FVI.cpp
|
||||||
|
|
||||||
|
# automatically build RESTful resources
|
||||||
|
REST_RESOURCES_DIR = ./resources
|
||||||
|
REST_RESOURCES_DIR_COMMON = ../resources-common
|
||||||
|
REST_RESOURCES_FILES= $(notdir \
|
||||||
|
$(shell find $(REST_RESOURCES_DIR) -name '*.c') \
|
||||||
|
$(shell find $(REST_RESOURCES_DIR_COMMON) -name '*.c') \
|
||||||
|
)
|
||||||
|
|
||||||
|
PROJECTDIRS += $(REST_RESOURCES_DIR) $(REST_RESOURCES_DIR_COMMON)
|
||||||
|
PROJECT_SOURCEFILES += $(REST_RESOURCES_FILES)
|
||||||
|
|
||||||
|
# variable for Makefile.include
|
||||||
|
ifneq ($(TARGET), minimal-net)
|
||||||
|
CFLAGS += -DUIP_CONF_IPV6_RPL=1
|
||||||
|
else
|
||||||
|
# minimal-net does not support RPL under Linux and is mostly used to test CoAP only
|
||||||
|
${info INFO: compiling without RPL}
|
||||||
|
CFLAGS += -DUIP_CONF_IPV6_RPL=0
|
||||||
|
CFLAGS += -DHARD_CODED_ADDRESS=\"fdfd::10\"
|
||||||
|
${info INFO: compiling with large buffers}
|
||||||
|
CFLAGS += -DUIP_CONF_BUFFER_SIZE=2048
|
||||||
|
CFLAGS += -DREST_MAX_CHUNK_SIZE=1024
|
||||||
|
CFLAGS += -DCOAP_MAX_HEADER_SIZE=640
|
||||||
|
endif
|
||||||
|
|
||||||
|
# linker optimizations
|
||||||
|
SMALL=1
|
||||||
|
|
||||||
|
|
||||||
|
# REST Engine shall use Erbium CoAP implementation
|
||||||
|
APPS += er-coap
|
||||||
|
APPS += rest-engine
|
||||||
|
APPS += arduino
|
||||||
|
|
||||||
|
include $(CONTIKI)/Makefile.include
|
||||||
|
include $(CONTIKI)/apps/arduino/Makefile.include
|
||||||
|
|
||||||
|
$(CONTIKI)/tools/tunslip6: $(CONTIKI)/tools/tunslip6.c
|
||||||
|
(cd $(CONTIKI)/tools && $(MAKE) tunslip6)
|
||||||
|
|
||||||
|
connect-router: $(CONTIKI)/tools/tunslip6
|
||||||
|
sudo $(CONTIKI)/tools/tunslip6 aaaa::1/64
|
||||||
|
|
||||||
|
connect-router-cooja: $(CONTIKI)/tools/tunslip6
|
||||||
|
sudo $(CONTIKI)/tools/tunslip6 -a 127.0.0.1 aaaa::1/64
|
||||||
|
|
||||||
|
connect-minimal:
|
||||||
|
sudo ip address add fdfd::1/64 dev tap0
|
||||||
|
|
||||||
|
avr-size: $(EXE).$(TARGET).sz
|
||||||
|
|
||||||
|
flash: $(EXE).$(TARGET).u $(EXE).$(TARGET).eu
|
||||||
|
|
||||||
|
.PHONY: flash avr-size
|
||||||
|
.PRECIOUS: $(EXE).$(TARGET).hex $(EXE).$(TARGET).eep
|
11
examples/osd/arduino-bh1750/README.md
Normal file
11
examples/osd/arduino-bh1750/README.md
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
Arduino compatibility example
|
||||||
|
=============================
|
||||||
|
|
||||||
|
This example shows that it is now possible to re-use arduino sketches in
|
||||||
|
Contiki. This example documents the necessary magic. Arduino specifies
|
||||||
|
two routines, `setup` and `loop`. Before `setup` is called, the
|
||||||
|
framework initializes hardware. In original Arduino, all this is done in
|
||||||
|
a `main` function (in C). For contiki we define a process that does the
|
||||||
|
same.
|
||||||
|
|
||||||
|
See the documentation file in apps/contiki-compat/README.md
|
2
examples/osd/arduino-bh1750/arduino-example.c
Normal file
2
examples/osd/arduino-bh1750/arduino-example.c
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
#include <arduino-process.h>
|
||||||
|
AUTOSTART_PROCESSES(&arduino_sketch);
|
2
examples/osd/arduino-bh1750/flash.sh
Executable file
2
examples/osd/arduino-bh1750/flash.sh
Executable file
|
@ -0,0 +1,2 @@
|
||||||
|
#!/bin/bash
|
||||||
|
make TARGET=osd-merkur-128 flash
|
106
examples/osd/arduino-bh1750/project-conf.h
Normal file
106
examples/osd/arduino-bh1750/project-conf.h
Normal file
|
@ -0,0 +1,106 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010, Swedish Institute of Computer Science.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. Neither the name of the Institute nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef PROJECT_RPL_WEB_CONF_H_
|
||||||
|
#define PROJECT_RPL_WEB_CONF_H_
|
||||||
|
|
||||||
|
#define PLATFORM_HAS_LEDS 1
|
||||||
|
//#define PLATFORM_HAS_BUTTON 1
|
||||||
|
#define PLATFORM_HAS_BATTERY 1
|
||||||
|
|
||||||
|
#define SICSLOWPAN_CONF_FRAG 1
|
||||||
|
|
||||||
|
#define LOOP_INTERVAL (10 * CLOCK_SECOND)
|
||||||
|
|
||||||
|
/* Save energy */
|
||||||
|
//#define RDC_CONF_PT_YIELD_OFF
|
||||||
|
|
||||||
|
/* For Debug: Dont allow MCU sleeping between channel checks */
|
||||||
|
//#undef RDC_CONF_MCU_SLEEP
|
||||||
|
//#define RDC_CONF_MCU_SLEEP 0
|
||||||
|
|
||||||
|
/* Disabling RDC for demo purposes. Core updates often require more memory. */
|
||||||
|
/* For projects, optimize memory and enable RDC again. */
|
||||||
|
// #undef NETSTACK_CONF_RDC
|
||||||
|
//#define NETSTACK_CONF_RDC nullrdc_driver
|
||||||
|
|
||||||
|
/* Increase rpl-border-router IP-buffer when using more than 64. */
|
||||||
|
#undef REST_MAX_CHUNK_SIZE
|
||||||
|
#define REST_MAX_CHUNK_SIZE 64
|
||||||
|
|
||||||
|
/* Estimate your header size, especially when using Proxy-Uri. */
|
||||||
|
/*
|
||||||
|
#undef COAP_MAX_HEADER_SIZE
|
||||||
|
#define COAP_MAX_HEADER_SIZE 70
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* The IP buffer size must fit all other hops, in particular the border router. */
|
||||||
|
|
||||||
|
#undef UIP_CONF_BUFFER_SIZE
|
||||||
|
#define UIP_CONF_BUFFER_SIZE 256
|
||||||
|
|
||||||
|
|
||||||
|
/* Multiplies with chunk size, be aware of memory constraints. */
|
||||||
|
#undef COAP_MAX_OPEN_TRANSACTIONS
|
||||||
|
#define COAP_MAX_OPEN_TRANSACTIONS 4
|
||||||
|
|
||||||
|
/* Must be <= open transaction number, default is COAP_MAX_OPEN_TRANSACTIONS-1. */
|
||||||
|
/*
|
||||||
|
#undef COAP_MAX_OBSERVERS
|
||||||
|
#define COAP_MAX_OBSERVERS 2
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Filtering .well-known/core per query can be disabled to save space. */
|
||||||
|
/*
|
||||||
|
#undef COAP_LINK_FORMAT_FILTERING
|
||||||
|
#define COAP_LINK_FORMAT_FILTERING 0
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Save some memory for the sky platform. */
|
||||||
|
/*
|
||||||
|
#undef NBR_TABLE_CONF_MAX_NEIGHBORS
|
||||||
|
#define NBR_TABLE_CONF_MAX_NEIGHBORS 10
|
||||||
|
#undef UIP_CONF_MAX_ROUTES
|
||||||
|
#define UIP_CONF_MAX_ROUTES 10
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Reduce 802.15.4 frame queue to save RAM. */
|
||||||
|
/*
|
||||||
|
#undef QUEUEBUF_CONF_NUM
|
||||||
|
#define QUEUEBUF_CONF_NUM 4
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
#undef SICSLOWPAN_CONF_FRAG
|
||||||
|
#define SICSLOWPAN_CONF_FRAG 1
|
||||||
|
*/
|
||||||
|
|
||||||
|
#endif /* PROJECT_RPL_WEB_CONF_H_ */
|
80
examples/osd/arduino-bh1750/resources/res-bh1750.c
Normal file
80
examples/osd/arduino-bh1750/resources/res-bh1750.c
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2013, Institute for Pervasive Computing, ETH Zurich
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. Neither the name of the Institute nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* This file is part of the Contiki operating system.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \file
|
||||||
|
* Moisture resource
|
||||||
|
* \author
|
||||||
|
* Harald Pichler <harald@the-develop.net>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "contiki.h"
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include "rest-engine.h"
|
||||||
|
#include "Arduino.h"
|
||||||
|
|
||||||
|
static void res_get_handler(void *request, void *response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset);
|
||||||
|
|
||||||
|
/* A simple getter example. Returns the reading from the sensor with a simple etag */
|
||||||
|
RESOURCE(res_bh1750,
|
||||||
|
"title=\"Lux status\";rt=\"Lux\"",
|
||||||
|
res_get_handler,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
extern uint16_t lux;
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
res_get_handler(void *request, void *response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset)
|
||||||
|
{
|
||||||
|
|
||||||
|
unsigned int accept = -1;
|
||||||
|
REST.get_header_accept(request, &accept);
|
||||||
|
|
||||||
|
if(accept == -1 || accept == REST.type.TEXT_PLAIN) {
|
||||||
|
REST.set_header_content_type(response, REST.type.TEXT_PLAIN);
|
||||||
|
snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d", lux);
|
||||||
|
|
||||||
|
REST.set_response_payload(response, buffer, strlen((char *)buffer));
|
||||||
|
} else if(accept == REST.type.APPLICATION_JSON) {
|
||||||
|
REST.set_header_content_type(response, REST.type.APPLICATION_JSON);
|
||||||
|
snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'lux':%d}", lux);
|
||||||
|
|
||||||
|
REST.set_response_payload(response, buffer, strlen((char *)buffer));
|
||||||
|
} else {
|
||||||
|
REST.set_response_status(response, REST.status.NOT_ACCEPTABLE);
|
||||||
|
const char *msg = "Supporting content-types text/plain and application/json";
|
||||||
|
REST.set_response_payload(response, msg, strlen(msg));
|
||||||
|
}
|
||||||
|
}
|
5
examples/osd/arduino-bh1750/run.sh
Executable file
5
examples/osd/arduino-bh1750/run.sh
Executable file
|
@ -0,0 +1,5 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# For the ages-old bootloader (before 2014) you want to use
|
||||||
|
# BOOTLOADER_GET_MAC=0x0001f3a0 as parameter to make below.
|
||||||
|
make clean TARGET=osd-merkur-128
|
||||||
|
make TARGET=osd-merkur-128
|
49
examples/osd/arduino-bh1750/sketch.pde
Normal file
49
examples/osd/arduino-bh1750/sketch.pde
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
/*
|
||||||
|
* Sample arduino sketch using contiki features.
|
||||||
|
* We turn the LED off
|
||||||
|
* We allow read the moisture sensor
|
||||||
|
* Unfortunately sleeping for long times in loop() isn't currently
|
||||||
|
* possible, something turns off the CPU (including PWM outputs) if a
|
||||||
|
* Proto-Thread is taking too long. We need to find out how to sleep in
|
||||||
|
* a Contiki-compatible way.
|
||||||
|
* Note that for a normal arduino sketch you won't have to include any
|
||||||
|
* of the contiki-specific files here, the sketch should just work.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <Wire.h>
|
||||||
|
#include "BH1750FVI.h"
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
#include "arduino-process.h"
|
||||||
|
#include "rest-engine.h"
|
||||||
|
|
||||||
|
BH1750FVI lightMeter;
|
||||||
|
|
||||||
|
extern resource_t res_bh1750, res_battery;
|
||||||
|
uint16_t lux;
|
||||||
|
|
||||||
|
#define LED_PIN 4
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup (void)
|
||||||
|
{
|
||||||
|
// switch off the led
|
||||||
|
pinMode(LED_PIN, OUTPUT);
|
||||||
|
digitalWrite(LED_PIN, HIGH);
|
||||||
|
// BH1750 sensor
|
||||||
|
lightMeter.begin();
|
||||||
|
// init coap resourcen
|
||||||
|
rest_init_engine ();
|
||||||
|
rest_activate_resource (&res_bh1750, "s/lux");
|
||||||
|
rest_activate_resource (&res_battery, "s/battery");
|
||||||
|
}
|
||||||
|
|
||||||
|
// at project-conf.h
|
||||||
|
// LOOP_INTERVAL (10 * CLOCK_SECOND)
|
||||||
|
void loop (void)
|
||||||
|
{
|
||||||
|
mcu_sleep_off();
|
||||||
|
lux = lightMeter.getLightLevel();
|
||||||
|
mcu_sleep_on();
|
||||||
|
printf("Lux: %d",lux);
|
||||||
|
}
|
Loading…
Reference in a new issue