Browse Source

Telaire T6613 Support (#1956)

* Added T6613

* Added T6613

* Added T6613

* Added T6613

* Added T6613

* Added T6613

* Added T6613

* Added T6613

* Added T6613

* Updated copyright string

* Buffer from 6 bytes to 8 bytes

Current gcc-4 does not mark this as warning, but gcc-9 notices the 3 char size requirement. Buffer should be 8

* Use 5000ppm max
master
James 5 years ago
committed by Max Prokhorov
parent
commit
d177634a70
9 changed files with 226 additions and 1 deletions
  1. +1
    -0
      README.md
  2. +1
    -0
      code/espurna/config/arduino.h
  3. +3
    -0
      code/espurna/config/progmem.h
  4. +22
    -0
      code/espurna/config/sensors.h
  5. +1
    -0
      code/espurna/config/types.h
  6. +9
    -0
      code/espurna/sensor.ino
  7. +187
    -0
      code/espurna/sensors/T6613Sensor.h
  8. +1
    -1
      code/html/custom.js
  9. +1
    -0
      code/test/build/sensor.h

+ 1
- 0
README.md View File

@ -101,6 +101,7 @@ Since November 2018, Max Prokhorov (**@mcspr**) is also actively working as a co
* **AM2320** temperature and humidity sensor over I2C * **AM2320** temperature and humidity sensor over I2C
* **Dallas OneWire sensors** like the DS18B20 * **Dallas OneWire sensors** like the DS18B20
* **MHZ19** CO2 sensor * **MHZ19** CO2 sensor
* **T6613** CO2 sensor
* **MICS2710** CO2 & NO2 sensor * **MICS2710** CO2 & NO2 sensor
* **MICS5525** CO & CO2 sensor * **MICS5525** CO & CO2 sensor
* **SenseAir S8** CO2 sensor * **SenseAir S8** CO2 sensor


+ 1
- 0
code/espurna/config/arduino.h View File

@ -217,6 +217,7 @@
//#define SHT3X_I2C_SUPPORT 1 //#define SHT3X_I2C_SUPPORT 1
//#define SI7021_SUPPORT 1 //#define SI7021_SUPPORT 1
//#define SONAR_SUPPORT 1 //#define SONAR_SUPPORT 1
//#define T6613_SUPPORT 1
//#define TMP3X_SUPPORT 1 //#define TMP3X_SUPPORT 1
//#define V9261F_SUPPORT 1 //#define V9261F_SUPPORT 1
//#define VEML6075_SUPPORT 1 //#define VEML6075_SUPPORT 1


+ 3
- 0
code/espurna/config/progmem.h View File

@ -264,6 +264,9 @@ PROGMEM const char espurna_sensors[] =
#if SONAR_SUPPORT #if SONAR_SUPPORT
"SONAR " "SONAR "
#endif #endif
#if T6613_SUPPORT
"T6613 "
#endif
#if TMP3X_SUPPORT #if TMP3X_SUPPORT
"TMP3X " "TMP3X "
#endif #endif


+ 22
- 0
code/espurna/config/sensors.h View File

@ -1052,6 +1052,23 @@
#define SONAR_ITERATIONS 5 // Number of iterations to ping for #define SONAR_ITERATIONS 5 // Number of iterations to ping for
#endif // error correction. #endif // error correction.
//------------------------------------------------------------------------------
// T6613 CO2 sensor
// Enable support by passing T6613_SUPPORT=1 build flag
//------------------------------------------------------------------------------
#ifndef T6613_SUPPORT
#define T6613_SUPPORT 0
#endif
#ifndef T6613_RX_PIN
#define T6613_RX_PIN 4
#endif
#ifndef T6613_TX_PIN
#define T6613_TX_PIN 5
#endif
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// TMP3X analog temperature sensor // TMP3X analog temperature sensor
// Enable support by passing TMP3X_SUPPORT=1 build flag // Enable support by passing TMP3X_SUPPORT=1 build flag
@ -1216,6 +1233,7 @@
SHT3X_I2C_SUPPORT || \ SHT3X_I2C_SUPPORT || \
SI7021_SUPPORT || \ SI7021_SUPPORT || \
SONAR_SUPPORT || \ SONAR_SUPPORT || \
T6613_SUPPORT || \
TMP3X_SUPPORT || \ TMP3X_SUPPORT || \
V9261F_SUPPORT || \ V9261F_SUPPORT || \
VEML6075_SUPPORT || \ VEML6075_SUPPORT || \
@ -1403,6 +1421,10 @@
#include "../sensors/SonarSensor.h" #include "../sensors/SonarSensor.h"
#endif #endif
#if T6613_SUPPORT
#include "../sensors/T6613Sensor.h"
#endif
#if TMP3X_SUPPORT #if TMP3X_SUPPORT
#include "../sensors/TMP3XSensor.h" #include "../sensors/TMP3XSensor.h"
#endif #endif


+ 1
- 0
code/espurna/config/types.h View File

@ -316,6 +316,7 @@
#define SENSOR_MAX6675_ID 35 #define SENSOR_MAX6675_ID 35
#define SENSOR_LDR_ID 36 #define SENSOR_LDR_ID 36
#define SENSOR_ADE7953_ID 37 #define SENSOR_ADE7953_ID 37
#define SENSOR_T6613_ID 38
//-------------------------------------------------------------------------------- //--------------------------------------------------------------------------------
// Magnitudes // Magnitudes


+ 9
- 0
code/espurna/sensor.ino View File

@ -1028,6 +1028,15 @@ void _sensorLoad() {
_sensors.push_back(sensor); _sensors.push_back(sensor);
} }
#endif #endif
#if T6613_SUPPORT
{
T6613Sensor * sensor = new T6613Sensor();
sensor->setRX(T6613_RX_PIN);
sensor->setTX(T6613_TX_PIN);
_sensors.push_back(sensor);
}
#endif
#if TMP3X_SUPPORT #if TMP3X_SUPPORT
{ {


+ 187
- 0
code/espurna/sensors/T6613Sensor.h View File

@ -0,0 +1,187 @@
// -----------------------------------------------------------------------------
// T6613 CO2 sensor
// https://www.amphenol-sensors.com/en/telaire/co2/525-co2-sensor-modules/321-t6613
// Uses SoftwareSerial library
// Copyright (C) 2017-2019 by Xose Pérez <xose dot perez at gmail dot com>
// -----------------------------------------------------------------------------
#if SENSOR_SUPPORT && T6613_SUPPORT
#pragma once
#include "Arduino.h"
#include "BaseSensor.h"
#include <SoftwareSerial.h>
#define T6613_REQUEST_LEN 5
#define T6613_RESPONSE_LEN 5
#define T6613_TIMEOUT 1000
#define T6613_GETPPM 0x020203
class T6613Sensor : public BaseSensor {
public:
// ---------------------------------------------------------------------
// Public
// ---------------------------------------------------------------------
T6613Sensor(): BaseSensor() {
_count = 1;
_sensor_id = SENSOR_T6613_ID;
}
~T6613Sensor() {
if (_serial) delete _serial;
}
// ---------------------------------------------------------------------
void setRX(unsigned char pin_rx) {
if (_pin_rx == pin_rx) return;
_pin_rx = pin_rx;
_dirty = true;
}
void setTX(unsigned char pin_tx) {
if (_pin_tx == pin_tx) return;
_pin_tx = pin_tx;
_dirty = true;
}
// ---------------------------------------------------------------------
unsigned char getRX() {
return _pin_rx;
}
unsigned char getTX() {
return _pin_tx;
}
// ---------------------------------------------------------------------
// Sensor API
// ---------------------------------------------------------------------
// Initialization method, must be idempotent
void begin() {
if (!_dirty) return;
if (_serial) delete _serial;
_serial = new SoftwareSerial(_pin_rx, _pin_tx, false, 32);
_serial->enableIntTx(false);
_serial->begin(19200);
_ready = true;
_dirty = false;
}
// Descriptive name of the sensor
String description() {
char buffer[28];
snprintf(buffer, sizeof(buffer), "T6613 @ SwSerial(%u,%u)", _pin_rx, _pin_tx);
return String(buffer);
}
// Descriptive name of the slot # index
String slot(unsigned char index) {
return description();
};
// Address of the sensor (it could be the GPIO or I2C address)
String address(unsigned char index) {
char buffer[8];
snprintf(buffer, sizeof(buffer), "%u:%u", _pin_rx, _pin_tx);
return String(buffer);
}
// Type for slot # index
unsigned char type(unsigned char index) {
if (index == 0) return MAGNITUDE_CO2;
return MAGNITUDE_NONE;
}
void pre() {
_read();
}
// Current value for slot # index
double value(unsigned char index) {
if (index == 0) return _co2;
return 0;
}
protected:
// ---------------------------------------------------------------------
// Protected
// ---------------------------------------------------------------------
void _write(unsigned char * command) {
_serial->write(command, T6613_REQUEST_LEN);
_serial->flush();
}
void _write(unsigned int command, unsigned char * response) {
unsigned char buffer[T6613_REQUEST_LEN] = {0};
buffer[0] = 0xFF;
buffer[1] = 0xFE;
buffer[2] = command >> 16;
buffer[3] = (command >> 8) & 0xFF;
buffer[4] = command & 0xFF;
_write(buffer);
if (response != NULL) {
unsigned long start = millis();
while (_serial->available() == 0) {
if (millis() - start > T6613_TIMEOUT) {
_error = SENSOR_ERROR_TIMEOUT;
return;
}
yield();
}
_serial->readBytes(response, T6613_RESPONSE_LEN);
}
}
void _write(unsigned int command) {
_write(command, NULL);
}
void _read() {
unsigned char buffer[T6613_RESPONSE_LEN] = {0};
_write(T6613_GETPPM, buffer);
// Check response
if ((buffer[0] == 0xFF)
&& (buffer[1] == 0xFA)
&& (buffer[2] == 0x02)) {
unsigned int value = buffer[3] * 256 + buffer[4];
if (0 <= value && value <= 5000) {
_co2 = value;
_error = SENSOR_ERROR_OK;
} else {
_error = SENSOR_ERROR_OUT_OF_RANGE;
}
} else {
_error = SENSOR_ERROR_CRC;
}
}
double _co2 = 0;
unsigned int _pin_rx;
unsigned int _pin_tx;
SoftwareSerial * _serial = NULL;
};
#endif // SENSOR_SUPPORT && T6613_SUPPORT

+ 1
- 1
code/html/custom.js View File

@ -51,7 +51,7 @@ function sensorName(id) {
"HLW8012", "V9261F", "ECH1560", "Analog", "Digital", "HLW8012", "V9261F", "ECH1560", "Analog", "Digital",
"Events", "PMSX003", "BMX280", "MHZ19", "SI7021", "Events", "PMSX003", "BMX280", "MHZ19", "SI7021",
"SHT3X I2C", "BH1750", "PZEM004T", "AM2320 I2C", "GUVAS12SD", "SHT3X I2C", "BH1750", "PZEM004T", "AM2320 I2C", "GUVAS12SD",
"TMP3X", "Sonar", "SenseAir", "GeigerTicks", "GeigerCPM",
"T6613", "TMP3X", "Sonar", "SenseAir", "GeigerTicks", "GeigerCPM",
"NTC", "SDS011", "MICS2710", "MICS5525", "VL53L1X", "VEML6075", "NTC", "SDS011", "MICS2710", "MICS5525", "VL53L1X", "VEML6075",
"EZOPH" "EZOPH"
]; ];


+ 1
- 0
code/test/build/sensor.h View File

@ -13,6 +13,7 @@
#define MICS5525_SUPPORT 1 #define MICS5525_SUPPORT 1
#define MAX6675_SUPPORT 1 #define MAX6675_SUPPORT 1
#define DHT_SUPPORT 1 #define DHT_SUPPORT 1
#define T6613_SUPPORT 1
#define TMP3X_SUPPORT 1 #define TMP3X_SUPPORT 1
#define EVENTS_SUPPORT 1 #define EVENTS_SUPPORT 1
#define DIGITAL_SUPPORT 1 #define DIGITAL_SUPPORT 1


Loading…
Cancel
Save