From 548685492c37b54e5765868316e787d8af056544 Mon Sep 17 00:00:00 2001
From: getlarge <getlarge@users.noreply.github.com>
Date: Sat, 15 Jul 2017 15:58:59 +0200
Subject: [PATCH] Added support for AM2320, DHT21, PT100 and TSL2561 sensors
 (#171 #109 #110 #111)

---
 .gitignore      |   0
 NodeManager.cpp | 306 ++++++++++++++++++++++++++++++++++++++++++++++--
 NodeManager.h   | 121 ++++++++++++++++++-
 NodeManager.ino |  12 +-
 README.md       |  22 +++-
 config.h        |  12 +-
 6 files changed, 455 insertions(+), 18 deletions(-)
 mode change 100644 => 100755 .gitignore
 mode change 100644 => 100755 NodeManager.cpp
 mode change 100644 => 100755 NodeManager.h
 mode change 100644 => 100755 NodeManager.ino
 mode change 100644 => 100755 README.md
 mode change 100644 => 100755 config.h

diff --git a/.gitignore b/.gitignore
old mode 100644
new mode 100755
diff --git a/NodeManager.cpp b/NodeManager.cpp
old mode 100644
new mode 100755
index 21d6451..03a891a
--- a/NodeManager.cpp
+++ b/NodeManager.cpp
@@ -10,21 +10,21 @@
 
 // set the vcc and ground pin the sensor is connected to
 void PowerManager::setPowerPins(int ground_pin, int vcc_pin, int wait_time) {
+  _ground_pin = ground_pin;
+  _vcc_pin = vcc_pin;
   #if DEBUG == 1
     Serial.print(F("PWR G="));
-    Serial.print(ground_pin);
+    Serial.print(_ground_pin);
     Serial.print(F(" V="));
-    Serial.println(vcc_pin);
+    Serial.println(_vcc_pin);
   #endif
   if (_ground_pin > 0) {
     // configure the ground pin as output and initialize to low
-    _ground_pin = ground_pin;
     pinMode(_ground_pin, OUTPUT);
     digitalWrite(_ground_pin, LOW);
   }
   if (_vcc_pin > 0) {
     // configure the vcc pin as output and initialize to high (power on)
-    _vcc_pin = vcc_pin;
     pinMode(_vcc_pin, OUTPUT);
     digitalWrite(_vcc_pin, HIGH);
   }
@@ -1027,6 +1027,7 @@ SensorDigitalOutput::SensorDigitalOutput(NodeManager* node_manager, int child_id
 // what to do during before
 void SensorDigitalOutput::onBefore() {
   _setupPin(_pin);
+
 }
 
 // what to do during setup
@@ -2501,6 +2502,272 @@ void SensorMHZ19::onProcess(Request & request) {
 
 #endif
 
+/*
+   SensorAM2320
+*/
+#if MODULE_AM2320 == 1
+// constructor
+SensorAM2320::SensorAM2320(NodeManager* node_manager, int child_id, AM2320* th, int sensor_type): Sensor(node_manager, child_id,A2) {
+  _th = th;
+  _sensor_type = sensor_type;
+  if (_sensor_type == SensorAM2320::TEMPERATURE) {
+    // temperature sensor
+    setPresentation(S_TEMP);
+    setType(V_TEMP);
+    setValueType(TYPE_FLOAT);
+  }
+  else if (_sensor_type == SensorAM2320::HUMIDITY) {
+    // humidity sensor
+    setPresentation(S_HUM);
+    setType(V_HUM);
+    setValueType(TYPE_FLOAT);
+  }
+}
+
+// what do to during before
+void SensorAM2320::onBefore() {
+
+}
+
+// what do to during setup
+void SensorAM2320::onSetup() {
+}
+
+// what do to during loop
+void SensorAM2320::onLoop() {
+  switch(_th->Read()) {
+    case 0:
+      // temperature sensor
+      if (_sensor_type == SensorAM2320::TEMPERATURE) {
+        // read the temperature
+        float temperature = _th->t;
+        #if DEBUG == 1
+          Serial.print(F("AM2320 I="));
+          Serial.print(_child_id);
+          Serial.print(F(" T="));
+          Serial.println(temperature);
+        #endif
+        // store the value
+        _value_float = temperature;
+      }
+      // humidity sensor
+      else if (_sensor_type == SensorAM2320::HUMIDITY) {
+        // read humidity
+        float humidity = _th->h;
+        if (isnan(humidity)) return;
+          #if DEBUG == 1
+            Serial.print(F("AM2320 I="));
+            Serial.print(_child_id);
+            Serial.print(F(" H="));
+            Serial.println(humidity);
+          #endif
+          // store the value
+          _value_float = humidity;
+        }
+        break;
+      case 1: Serial.println(F("AM2320 offline")); break;
+      case 2: Serial.println(F("AM2320 CRC failed")); break;
+    }
+}
+
+// what do to as the main task when receiving a message
+void SensorAM2320::onReceive(const MyMessage & message) {
+  onLoop();
+}
+
+// what to do when receiving a remote message
+void SensorAM2320::onProcess(Request & request) {
+}
+#endif
+
+/*
+   SensorTSL2561
+*/
+#if MODULE_TSL2561 == 1
+// contructor
+SensorTSL2561::SensorTSL2561(NodeManager* node_manager, int child_id): Sensor(node_manager, child_id,A2) {
+  setPresentation(S_LIGHT_LEVEL);
+  setType(V_LEVEL);
+}
+
+// setter/getter
+void SensorTSL2561::setGain(int value) {
+  _tsl_gain = value;
+}
+void SensorTSL2561::setTiming(int value) {
+  _tsl_timing = value;
+}
+void SensorTSL2561::setSpectrum(int value) {
+  _tsl_spectrum = value;
+}
+void SensorTSL2561::setAddress(int value) {
+  _tsl_address = value;
+}
+
+// what do to during before
+void SensorTSL2561::onBefore() {
+   switch (_tsl_address) {
+    case SensorTSL2561::ADDR_FLOAT:
+      _tsl = new TSL2561(TSL2561_ADDR_FLOAT);
+      break;
+    case SensorTSL2561::ADDR_LOW:
+      _tsl = new TSL2561(TSL2561_ADDR_LOW);
+      break;   
+    case SensorTSL2561::ADDR_HIGH:
+      _tsl = new TSL2561(TSL2561_ADDR_HIGH);
+      break;   
+  }
+}
+
+// what do to during setup
+void SensorTSL2561::onSetup() {
+   if (_tsl->begin()) {
+    switch (_tsl_gain) {
+      case SensorTSL2561::GAIN_0X:
+        _tsl->setGain(TSL2561_GAIN_0X);
+        break; 
+      case SensorTSL2561::GAIN_16X:
+        _tsl->setGain(TSL2561_GAIN_16X);
+        break;      
+    }
+    switch (_tsl_timing) {
+      case SensorTSL2561::INTEGRATIONTIME_13MS:
+        _tsl->setTiming(TSL2561_INTEGRATIONTIME_13MS);
+        break; 
+      case SensorTSL2561::INTEGRATIONTIME_101MS:
+        _tsl->setTiming(TSL2561_INTEGRATIONTIME_101MS); 
+        break; 
+      case SensorTSL2561::INTEGRATIONTIME_402MS:
+        _tsl->setTiming(TSL2561_INTEGRATIONTIME_402MS); 
+        break;
+    }
+  }
+  else {
+    Serial.println(F("TSL2561 offline"));
+  } 
+}
+
+// what do to during loop
+void SensorTSL2561::onLoop() {
+  // request the light level
+   switch (_tsl_spectrum) {
+    case SensorTSL2561::VISIBLE:
+      _value_int = _tsl->getLuminosity(TSL2561_VISIBLE); 
+      break; 
+    case SensorTSL2561::FULLSPECTRUM:
+      _value_int = _tsl->getLuminosity(TSL2561_FULLSPECTRUM); 
+      break; 
+    case SensorTSL2561::INFRARED:
+      _value_int = _tsl->getLuminosity(TSL2561_INFRARED); 
+      break; 
+    case SensorTSL2561::FULL:
+      // request the full light level
+      uint32_t lum = _tsl->getFullLuminosity(); 
+      uint16_t ir, full;
+      ir = lum >> 16;
+      full = lum & 0xFFFF;
+      _value_int = _tsl->calculateLux(full, ir);
+  #if DEBUG == 1
+      Serial.print(F("TSL I="));
+      Serial.print(_child_id);
+      Serial.print(F(" LUX="));
+      Serial.print(_value_int);
+      Serial.print(F(" IR="));
+      Serial.print(ir);
+      Serial.print(F(" FULL="));
+      Serial.print(full);
+      Serial.print(F(" VIS="));
+      Serial.println(full-ir);
+   #endif
+      break; 
+  }
+  #if DEBUG == 1
+    if (_tsl_spectrum < 3) {
+      Serial.print(F("TSL I="));
+      Serial.print(_child_id);
+      Serial.print(F(" L="));
+      Serial.println(_value_int);
+    }
+  #endif
+}
+
+// what do to as the main task when receiving a message
+void SensorTSL2561::onReceive(const MyMessage & message) {
+  onLoop();
+}
+
+// what to do when receiving a remote message
+void SensorTSL2561::onProcess(Request & request) {
+  int function = request.getFunction();
+  switch(function) {
+    case 101: setGain(request.getValueInt()); break;
+    case 102: setTiming(request.getValueInt()); break;
+    case 103: setSpectrum(request.getValueInt()); break;
+    case 104: setAddress(request.getValueInt()); break;
+    default: return;
+  }
+  _send(_msg_service.set(function));
+}
+#endif
+
+/*
+   SensorPT100
+*/
+
+// contructor
+SensorPT100::SensorPT100(NodeManager* node_manager, int child_id, int pin): Sensor(node_manager, child_id, pin) {
+  // set presentation, type and value type
+  setPresentation(S_TEMP);
+  setType(V_TEMP);
+  setValueType(TYPE_FLOAT);
+}
+
+//// setter/getter
+void SensorPT100::setVoltageRef(float value) {
+   _voltageRef = value;
+}
+
+// what to do during before
+void SensorPT100::onBefore() {
+  _PT100 = new DFRobotHighTemperature(_voltageRef); 
+  // set the pin as input
+  pinMode(_pin, INPUT);
+}
+
+// what to do during setup
+void SensorPT100::onSetup() {
+}
+
+// what to do during loop
+void SensorPT100::onLoop() {
+  // read the PT100 sensor
+  int temperature = _PT100->readTemperature(_pin);  
+  
+  #if DEBUG == 1
+    Serial.print(F("PT100 I="));
+    Serial.print(_child_id);
+    Serial.print(F(" T="));
+    Serial.println(temperature);
+  #endif
+  // store the value
+  _value_float = temperature;
+}
+
+// what to do as the main task when receiving a message
+void SensorPT100::onReceive(const MyMessage & message) {
+  if (message.getCommand() == C_REQ) onLoop();
+}
+
+// what to do when receiving a remote message
+void SensorPT100::onProcess(Request & request) {
+   int function = request.getFunction();
+  switch(function) {
+    case 101: setVoltageRef(request.getValueFloat()); break;
+    default: return;
+  }
+  _send(_msg_service.set(function));
+}
+
 
 /*******************************************
    NodeManager
@@ -2597,7 +2864,7 @@ void NodeManager::setInterruptMinDelta(long value) {
     _powerManager.setPowerPins(ground_pin, vcc_pin, wait_time);
   }
   void NodeManager::setAutoPowerPins(bool value) {
-    _auto_power_pins = value;
+    _auto_power_pins = value;  
   }
   void NodeManager::powerOn() {
     _powerManager.powerOn();
@@ -2666,8 +2933,11 @@ int NodeManager::registerSensor(int sensor_type, int pin, int child_id) {
     else if (sensor_type == SENSOR_LATCHING_RELAY) return registerSensor(new SensorLatchingRelay(this,child_id, pin));
   #endif
   #if MODULE_DHT == 1
-    else if (sensor_type == SENSOR_DHT11 || sensor_type == SENSOR_DHT22) {
-      int dht_type = sensor_type == SENSOR_DHT11 ? DHT11 : DHT22;
+    else if (sensor_type == SENSOR_DHT11 || sensor_type == SENSOR_DHT22 || sensor_type == SENSOR_DHT21) {
+      int dht_type;
+      if (sensor_type == SENSOR_DHT11) dht_type = DHT11;
+      else if (sensor_type == SENSOR_DHT21) dht_type = DHT21;
+      else if (sensor_type == SENSOR_DHT22) dht_type = DHT22;
       DHT* dht = new DHT(pin,dht_type);
       // register temperature sensor
       registerSensor(new SensorDHT(this,child_id,pin,dht,SensorDHT::TEMPERATURE,dht_type));
@@ -2807,6 +3077,28 @@ int NodeManager::registerSensor(int sensor_type, int pin, int child_id) {
       return registerSensor(new SensorMHZ19(this, child_id, pin));
     }
   #endif
+  #if MODULE_AM2320 == 1
+    else if (sensor_type == SENSOR_AM2320) {
+      AM2320* th = new AM2320();
+      // register temperature sensor
+      registerSensor(new SensorAM2320(this,child_id,th,SensorAM2320::TEMPERATURE));
+      // register humidity sensor
+      child_id = _getAvailableChildId();
+      return registerSensor(new SensorAM2320(this,child_id,th,SensorAM2320::HUMIDITY));
+    }
+  #endif
+  #if MODULE_TSL2561 == 1 
+    else if (sensor_type == SENSOR_TSL2561) {    
+      // register light sensor
+      return registerSensor(new SensorTSL2561(this,child_id));
+    }
+  #endif
+   #if MODULE_PT100 == 1 
+    else if (sensor_type == SENSOR_PT100) {   
+      // register temperature sensor
+      return registerSensor(new SensorPT100(this,child_id,pin));
+    }
+  #endif
   else {
     #if DEBUG == 1
       Serial.print(F("INVALID "));
diff --git a/NodeManager.h b/NodeManager.h
old mode 100644
new mode 100755
index cc96a56..58c4c44
--- a/NodeManager.h
+++ b/NodeManager.h
@@ -111,7 +111,7 @@
    Default module settings
 */
 
-// Enable this module to use one of the following sensors: SENSOR_ANALOG_INPUT, SENSOR_LDR, SENSOR_THERMISTOR, SENSOR_ACS712
+// Enable this module to use one of the following sensors: SENSOR_ANALOG_INPUT, SENSOR_LDR, SENSOR_THERMISTOR, SENSOR_ACS712, SENSOR_PT100
 #ifndef MODULE_ANALOG_INPUT
   #define MODULE_ANALOG_INPUT 0
 #endif
@@ -127,7 +127,11 @@
 #ifndef MODULE_SHT21
   #define MODULE_SHT21 0
 #endif
-// Enable this module to use one of the following sensors: SENSOR_DHT11, SENSOR_DHT22
+// Enable this module to use one of the following sensors: SENSOR_AM2320
+#ifndef MODULE_AM2320
+  #define MODULE_AM2320 0
+#endif
+// Enable this module to use one of the following sensors: SENSOR_DHT11, SENSOR_DHT22, SENSOR_DHT21
 #ifndef MODULE_DHT
   #define MODULE_DHT 0
 #endif
@@ -143,6 +147,10 @@
 #ifndef MODULE_BH1750
   #define MODULE_BH1750 0
 #endif
+// Enable this module to use one of the following sensors: SENSOR_TSL2561
+#ifndef MODULE_TSL2561
+  #define MODULE_TSL2561 0
+#endif
 // Enable this module to use one of the following sensors: SENSOR_MLX90614
 #ifndef MODULE_MLX90614
   #define MODULE_MLX90614 0
@@ -214,6 +222,7 @@ enum supported_sensors {
     // DHT11/DHT22 sensors, return temperature/humidity based on the attached DHT sensor
     SENSOR_DHT11,
     SENSOR_DHT22,
+    SENSOR_DHT21,
   #endif
   #if MODULE_SHT21 == 1
     // SHT21 sensor, return temperature/humidity based on the attached SHT21 sensor
@@ -268,7 +277,20 @@ enum supported_sensors {
     // MH-Z19 CO2 sensor
     SENSOR_MHZ19,
   #endif
+  #if MODULE_TSL2561 == 1
+    // TSL2561 sensor, return light in lux
+    SENSOR_TSL2561,
+  #endif
+  #if MODULE_AM2320 == 1
+    // AM2320 sensors, return temperature/humidity based on the attached AM2320 sensor
+    SENSOR_AM2320,
+  #endif
+   #if MODULE_PT100 == 1
+    // High temperature sensor associated with DFRobot Driver, return the temperature in C° from the attached PT100 sensor
+    SENSOR_PT100,
+  #endif
 };
+ 
 /***********************************
   Libraries
 */
@@ -328,6 +350,17 @@ enum supported_sensors {
 #if MODULE_MHZ19 == 1
   #include <SoftwareSerial.h>
 #endif
+#if MODULE_AM2320 == 1
+  #include <Wire.h>
+  #include <AM2320.h>
+#endif
+#if MODULE_TSL2561 == 1
+  #include <TSL2561.h>
+  #include <Wire.h>
+#endif
+#if MODULE_PT100 == 1
+  #include<DFRobotHighTemperatureSensor.h>
+#endif
 
 /*******************************************************************
    Classes
@@ -1175,6 +1208,90 @@ class SensorMHZ19: public Sensor {
 };
 #endif
 
+/*
+   SensorAM2320
+*/
+#if MODULE_AM2320 == 1
+class SensorAM2320: public Sensor {
+  public:
+    SensorAM2320(NodeManager* node_manager, int child_id, AM2320* th, int sensor_type);
+    // define what to do at each stage of the sketch
+    void onBefore();
+    void onSetup();
+    void onLoop();
+    void onReceive(const MyMessage & message);
+    void onProcess(Request & request);
+    // constants
+    const static int TEMPERATURE = 0;
+    const static int HUMIDITY = 1;
+  protected:
+    AM2320* _th;
+    int _sensor_type = 0;
+};
+#endif
+
+/*
+   SensorTSL2561
+*/
+#if MODULE_TSL2561 == 1
+class SensorTSL2561: public Sensor {
+  public:
+    SensorTSL2561(NodeManager* node_manager, int child_id);
+    // [101] set the gain, possible values are SensorTSL2561::GAIN_0X (0), SensorTSL2561::GAIN_16X (1) (default 16x)
+    void setGain(int value);
+    // [102] set the timing, possible values are SensorTSL2561::INTEGRATIONTIME_13MS (0), SensorTSL2561::INTEGRATIONTIME_101MS (1), SensorTSL2561::INTEGRATIONTIME_402MS (2) (default: 13ms)
+    void setTiming(int value);
+    // [103] set the spectrum, possible values are SensorTSL2561::VISIBLE (0), SensorTSL2561::FULLSPECTRUM (1), SensorTSL2561::INFRARED (2), SensorTSL2561::FULL (3) (default: visible)
+    void setSpectrum(int value);
+    // [104] set the i2c address values are SensorTSL2561::ADDR_FLOAT, SensorTSL2561::ADDR_LOW, SensorTSL2561::ADDR_HIGH
+    void setAddress(int value);
+    // define what to do at each stage of the sketch
+    void onBefore();
+    void onSetup();
+    void onLoop();
+    void onReceive(const MyMessage & message);
+    void onProcess(Request & request);
+    // constants
+    const static int ADDR_FLOAT = 0;
+    const static int ADDR_LOW = 1;
+    const static int ADDR_HIGH = 2;
+    const static int GAIN_0X = 0;
+    const static int GAIN_16X = 1;
+    const static int INTEGRATIONTIME_13MS = 0;
+    const static int INTEGRATIONTIME_101MS = 1;
+    const static int INTEGRATIONTIME_402MS = 2;
+    const static int VISIBLE = 0;
+    const static int FULLSPECTRUM = 1;
+    const static int INFRARED = 2;
+    const static int FULL = 3;
+  protected:
+    TSL2561* _tsl;
+    int _tsl_address = 0;
+    int _tsl_gain = 1;
+    int _tsl_timing = 0;
+    int _tsl_spectrum = 0;
+};
+#endif
+
+/*
+    SensorPT100
+*/
+
+class SensorPT100: public Sensor {
+  public:
+    SensorPT100(NodeManager* node_manager, int child_id, int pin);
+    // [101] set the voltageRef used to compare with analog measures
+    void setVoltageRef(float value);
+    // define what to do at each stage of the sketch
+    void onBefore();
+    void onSetup();
+    void onLoop();
+    void onReceive(const MyMessage & message);
+    void onProcess(Request & request);
+  protected:
+    DFRobotHighTemperature* _PT100;
+    float _voltageRef = 3.3;
+};
 
 /***************************************
    NodeManager: manages all the aspects of the node
diff --git a/NodeManager.ino b/NodeManager.ino
old mode 100644
new mode 100755
index 32e2fa7..f2296b5
--- a/NodeManager.ino
+++ b/NodeManager.ino
@@ -1,13 +1,11 @@
 /*
 NodeManager is intended to take care on your behalf of all those common tasks a MySensors node has to accomplish, speeding up the development cycle of your projects.
-
 NodeManager includes the following main components:
 - Sleep manager: allows managing automatically the complexity behind battery-powered sensors spending most of their time sleeping
 - Power manager: allows powering on your sensors only while the node is awake
 - Battery manager: provides common functionalities to read and report the battery level
 - Remote configuration: allows configuring remotely the node without the need to have physical access to it
 - Built-in personalities: for the most common sensors, provide embedded code so to allow their configuration with a single line 
-
 Documentation available on: https://github.com/mysensors/NodeManager
  */
 
@@ -30,11 +28,15 @@ NodeManager nodeManager;
 void before() {
   // setup the serial port baud rate
   Serial.begin(MY_BAUD_RATE);  
+
   /*
-   * Register below your sensors
+   * Register below your device specific config
   */
 
-
+   
+  /*
+   * Register below your sensors
+  */
 
 
   /*
@@ -72,5 +74,3 @@ void receiveTime(unsigned long ts) {
   // call NodeManager receiveTime routine
   nodeManager.receiveTime(ts);
 }
-
-
diff --git a/README.md b/README.md
old mode 100644
new mode 100755
index fe8c0eb..3c85131
--- a/README.md
+++ b/README.md
@@ -151,7 +151,7 @@ Those NodeManager's directives in the `config.h` file control which module/libra
 #define MODULE_DIGITAL_OUTPUT 1
 // Enable this module to use one of the following sensors: SENSOR_SHT21
 #define MODULE_SHT21 0
-// Enable this module to use one of the following sensors: SENSOR_DHT11, SENSOR_DHT22
+// Enable this module to use one of the following sensors: SENSOR_DHT11, SENSOR_DHT22, SENSOR_DHT21
 #define MODULE_DHT 0
 // Enable this module to use one of the following sensors: SENSOR_SWITCH, SENSOR_DOOR, SENSOR_MOTION
 #define MODULE_SWITCH 0
@@ -175,6 +175,10 @@ Those NodeManager's directives in the `config.h` file control which module/libra
 #define MODULE_MQ 0
 // Enable this module to use one of the following sensors: SENSOR_MHZ19
 #define MODULE_MHZ19 0
+// Enable this module to use one of the following sensors: SENSOR_AM2320
+#define MODULE_AM2320 0
+// Enable this module to use one of the following sensors: SENSOR_TSL2561
+#define MODULE_TSL2561 0
 ~~~
 
 ### Installing the dependencies
@@ -193,6 +197,8 @@ MODULE_SONOFF | https://github.com/thomasfredericks/Bounce2
 MODULE_BMP085 | https://github.com/adafruit/Adafruit-BMP085-Library
 MODULE_HCSR04 | https://github.com/mysensors/MySensorsArduinoExamples/tree/master/libraries/NewPing
 MODULE_MCP9808 | https://github.com/adafruit/Adafruit_MCP9808_Library
+MODULE_AM2320 | https://github.com/thakshak/AM2320
+MODULE_TSL2561 | https://github.com/adafruit/TSL2561-Arduino-Library
 
 ### Configure NodeManager
 
@@ -340,6 +346,8 @@ SENSOR_RAIN_GAUGE | Rain gauge sensor
 SENSOR_RAIN | Rain sensor, return the percentage of rain from an attached analog sensor
 SENSOR_SOIL_MOISTURE | Soil moisture sensor, return the percentage of moisture from an attached analog sensor
 SENSOR_MHZ19 | MH-Z19 CO2 sensor via UART (SoftwareSerial, default on pins 6(Rx) and 7(Tx)
+SENSOR_TSL2561 | TSL2561 sensor, return light in lux
+SENSOR_AM2320 | AM2320 sensors, return temperature/humidity based on the attached AM2320 sensor
 
 To register a sensor simply call the NodeManager instance with the sensory type and the pin the sensor is conncted to. For example:
 ~~~c
@@ -602,6 +610,18 @@ Each sensor class can expose additional methods.
     void setRxTx(int rxpin, int txpin);
 ~~~
 
+* SensorTSL2561
+~~~c
+    // [101] set the gain, possible values are SensorTSL2561::GAIN_0X (0), SensorTSL2561::GAIN_16X (1) (default 16x)
+    void setGain(int value);
+    // [102] set the timing, possible values are SensorTSL2561::INTEGRATIONTIME_13MS (0), SensorTSL2561::INTEGRATIONTIME_101MS (1), SensorTSL2561::INTEGRATIONTIME_402MS (2) (default: 13ms)
+    void setTiming(int value);
+    // [103] set the spectrum, possible values are SensorTSL2561::VISIBLE (0), SensorTSL2561::FULLSPECTRUM (1), SensorTSL2561::INFRARED (2), SensorTSL2561::FULL (3) (default: visible)
+    void setSpectrum(int value);
+    // [104] set the i2c address values are SensorTSL2561::ADDR_FLOAT, SensorTSL2561::ADDR_LOW, SensorTSL2561::ADDR_HIGH
+    void setAddress(int value);
+~~~
+
 ### Upload your sketch
 
 Upload your sketch to your arduino board as you are used to.
diff --git a/config.h b/config.h
old mode 100644
new mode 100755
index 0e8878e..f3136dd
--- a/config.h
+++ b/config.h
@@ -18,11 +18,13 @@
 //#define MY_NODE_ID 100
 
 // NRF24 radio settings
-#define MY_RADIO_NRF24
+//#define MY_RADIO_NRF24
 //#define MY_RF24_ENABLE_ENCRYPTION
+
 //#define MY_RF24_CHANNEL 76
 //#define MY_RF24_PA_LEVEL RF24_PA_HIGH
 //#define MY_DEBUG_VERBOSE_RF24
+//#define MY_RF24_DATARATE RF24_250KBPS
 
 // RFM69 radio settings
 //#define MY_RADIO_RFM69
@@ -108,7 +110,7 @@
 #define MODULE_DIGITAL_INPUT 1
 // Enable this module to use one of the following sensors: SENSOR_DIGITAL_OUTPUT, SENSOR_RELAY, SENSOR_LATCHING_RELAY
 #define MODULE_DIGITAL_OUTPUT 1
-// Enable this module to use one of the following sensors: SENSOR_DHT11, SENSOR_DHT22
+// Enable this module to use one of the following sensors: SENSOR_DHT11, SENSOR_DHT22, SENSOR_DHT21
 #define MODULE_DHT 0
 // Enable this module to use one of the following sensors: SENSOR_SHT21
 #define MODULE_SHT21 0
@@ -134,5 +136,11 @@
 #define MODULE_MQ 0
 // Enable this module to use one of the following sensors: SENSOR_MHZ19
 #define MODULE_MHZ19 0
+// Enable this module to use one of the following sensors: SENSOR_AM2320    
+#define MODULE_AM2320 0
+// Enable this module to use one of the following sensors: SENSOR_TSL2561    
+#define MODULE_TSL2561 0
+// Enable this module to use one of the following sensors: SENSOR_PT100
+#define MODULE_PT100 0
 #endif
 
-- 
GitLab