mirror of
https://github.com/RobTillaart/Arduino.git
synced 2024-10-03 18:09:02 -04:00
0.1.3 ACD10
This commit is contained in:
parent
3c330e8f73
commit
2db5f197b6
@ -2,8 +2,8 @@
|
||||
// FILE: ACD10.cpp
|
||||
// AUTHOR: Rob Tillaart
|
||||
// DATE: 2023-09-25
|
||||
// VERSION: 0.1.2
|
||||
// PUPROSE: Arduino library for for I2C ACD10 CO2 sensor
|
||||
// VERSION: 0.1.3
|
||||
// PURPOSE: Arduino library for for I2C ACD10 CO2 sensor
|
||||
// URL: https://github.com/RobTillaart/ACD10
|
||||
// http://www.aosong.com/en/products-77.html
|
||||
|
||||
@ -19,6 +19,8 @@ ACD10::ACD10(TwoWire *wire)
|
||||
_concentration = 0;
|
||||
_temperature = 0;
|
||||
_preHeatStart = millis();
|
||||
_requestTime = 80;
|
||||
_requestStart = 0;
|
||||
}
|
||||
|
||||
|
||||
@ -29,6 +31,9 @@ bool ACD10::begin()
|
||||
_lastRead = 0;
|
||||
_concentration = 0;
|
||||
_temperature = 0;
|
||||
_requestTime = 80;
|
||||
_requestStart = 0;
|
||||
|
||||
if (! isConnected())
|
||||
{
|
||||
return false;
|
||||
@ -292,7 +297,7 @@ int ACD10::getLastError()
|
||||
int ACD10::_command(uint8_t * arr, uint8_t size)
|
||||
{
|
||||
_wire->beginTransmission(_address);
|
||||
for (int i = 0; i < size; i++)
|
||||
for (uint8_t i = 0; i < size; i++)
|
||||
{
|
||||
_wire->write(arr[i]);
|
||||
}
|
||||
@ -303,7 +308,7 @@ int ACD10::_command(uint8_t * arr, uint8_t size)
|
||||
|
||||
int ACD10::_request(uint8_t * arr, uint8_t size)
|
||||
{
|
||||
int bytes = _wire->requestFrom(_address, size);
|
||||
uint8_t bytes = _wire->requestFrom(_address, size);
|
||||
if (bytes == 0)
|
||||
{
|
||||
_error = -1;
|
||||
@ -315,7 +320,7 @@ int ACD10::_request(uint8_t * arr, uint8_t size)
|
||||
return _error;
|
||||
}
|
||||
|
||||
for (int i = 0; i < size; i++)
|
||||
for (uint8_t i = 0; i < size; i++)
|
||||
{
|
||||
arr[i] = _wire->read();
|
||||
}
|
||||
@ -327,10 +332,10 @@ int ACD10::_request(uint8_t * arr, uint8_t size)
|
||||
uint8_t ACD10::_crc8(uint8_t * arr, uint8_t size)
|
||||
{
|
||||
uint8_t crc = 0xFF;
|
||||
for (int b = 0; b < size; b++)
|
||||
for (uint8_t b = 0; b < size; b++)
|
||||
{
|
||||
crc ^= arr[b];
|
||||
for (int bit = 0x80; bit; bit >>= 1)
|
||||
for (uint8_t bit = 0x80; bit; bit >>= 1)
|
||||
{
|
||||
if (crc & 0x80)
|
||||
{
|
||||
|
@ -3,8 +3,8 @@
|
||||
// FILE: ACD10.h
|
||||
// AUTHOR: Rob Tillaart
|
||||
// DATE: 2023-09-25
|
||||
// VERSION: 0.1.2
|
||||
// PUPROSE: Arduino library for for I2C ACD10 CO2 sensor
|
||||
// VERSION: 0.1.3
|
||||
// PURPOSE: Arduino library for for I2C ACD10 CO2 sensor
|
||||
// URL: https://github.com/RobTillaart/ACD10
|
||||
// http://www.aosong.com/en/products-77.html
|
||||
|
||||
@ -13,7 +13,7 @@
|
||||
#include "Wire.h"
|
||||
|
||||
|
||||
#define ACD10_LIB_VERSION (F("0.1.2"))
|
||||
#define ACD10_LIB_VERSION (F("0.1.3"))
|
||||
#define ACD10_DEFAULT_ADDRESS 0x2A
|
||||
|
||||
// ERROR CODES
|
||||
@ -76,12 +76,12 @@ private:
|
||||
int _request(uint8_t * arr, uint8_t size);
|
||||
uint8_t _crc8(uint8_t * arr, uint8_t size);
|
||||
|
||||
uint32_t _preHeatStart = 0;
|
||||
uint32_t _lastRead = 0;
|
||||
uint32_t _concentration = 0; // why datasheet states 32 bit as 400-5000 fit in 16 bit??
|
||||
uint16_t _temperature = 0;
|
||||
uint8_t _requestTime = 80;
|
||||
uint32_t _requestStart = 0;
|
||||
uint32_t _preHeatStart;
|
||||
uint32_t _lastRead;
|
||||
uint32_t _concentration; // why datasheet states 32 bit as 400-5000 fit in 16 bit??
|
||||
uint16_t _temperature;
|
||||
uint8_t _requestTime;
|
||||
uint32_t _requestStart;
|
||||
uint8_t _error;
|
||||
};
|
||||
|
||||
|
@ -6,12 +6,18 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/)
|
||||
and this project adheres to [Semantic Versioning](http://semver.org/).
|
||||
|
||||
|
||||
## [0.1.3] - 2024-01-01
|
||||
- fix examples
|
||||
- add multiplex demo
|
||||
- update readme.md
|
||||
- minor edits
|
||||
|
||||
|
||||
## [0.1.2] - 2023-11-23
|
||||
- add temperature disclaimer in readme.md.
|
||||
- update keywords.txt
|
||||
- minor edits
|
||||
|
||||
|
||||
## [0.1.1] - 2023-10-05
|
||||
- refactor **begin()**
|
||||
- add **ACD10_readSensor_wire1.ino** ESP32 et al.
|
||||
|
@ -1,6 +1,6 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2023-2023 Rob Tillaart
|
||||
Copyright (c) 2023-2024 Rob Tillaart
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
@ -27,7 +27,7 @@ a normal building setting.
|
||||
The sensor is not suitable for CO2 heavy "industrial" environments.
|
||||
|
||||
**Warning** The temperature range the sensor can measure is **UNKNOWN**
|
||||
as there is no documentation how to convert the raw data to meaningfull one.
|
||||
as there is no documentation how to convert the raw data to meaningful one.
|
||||
|
||||
|
||||
#### Pre-heat period
|
||||
@ -60,6 +60,11 @@ The device has a fixed I2C address of 0x2A (42).
|
||||
The I2C communication supports 3-5V so any 3.3V MCU should be able to connect.
|
||||
Do not forget appropriate pull up resistors on the I2C SDA and SCL lines.
|
||||
|
||||
If you need to control more ACD10 sensors you can use a multiplexer e.g. TCA9548
|
||||
- https://github.com/RobTillaart/TCA9548
|
||||
|
||||
See example **TCA9548_demo_ACD10.ino**
|
||||
|
||||
|
||||
#### Datasheet warning
|
||||
|
||||
@ -216,7 +221,7 @@ Read the datasheet about calibration process (twice).
|
||||
Incorrect calibration leads to incorrect output.
|
||||
|
||||
- **bool setCalibrationMode(uint8_t mode)** 0 = manual mode, 1 = automatic mode.
|
||||
returns false if mode out of range ( > 1).
|
||||
Returns false if mode out of range ( > 1).
|
||||
- **uint8_t readCallibrationMode()** return set mode.
|
||||
- **void setManualCalibration(uint16_t value)** as the range of the device is
|
||||
from 400 to 5000, the parameter value should be in this range.
|
||||
@ -247,20 +252,17 @@ Minimum length is 11.
|
||||
- improve documentation
|
||||
- get hardware to test
|
||||
|
||||
|
||||
#### Should
|
||||
|
||||
- investigate the acquisition time of 80 milliseconds
|
||||
- can it be made shorter by default?
|
||||
- improve error handling
|
||||
|
||||
|
||||
#### Could
|
||||
|
||||
- rethink function names?
|
||||
- create unit tests if possible
|
||||
|
||||
|
||||
#### Wont
|
||||
|
||||
|
||||
|
@ -1,7 +1,8 @@
|
||||
//
|
||||
// FILE: ACD10_demo.ino
|
||||
// AUTHOR: Rob Tillaart
|
||||
// PUPROSE: test basic behaviour and performance
|
||||
// PURPOSE: test basic behaviour and performance
|
||||
// URL: https://github.com/RobTillaart/ACD10
|
||||
|
||||
|
||||
#include "Wire.h"
|
||||
|
@ -1,7 +1,8 @@
|
||||
//
|
||||
// FILE: ACD10_isConnected.ino
|
||||
// AUTHOR: Rob Tillaart
|
||||
// PUPROSE: test basic behaviour and performance
|
||||
// PURPOSE: test basic behaviour and performance
|
||||
// URL: https://github.com/RobTillaart/ACD10
|
||||
|
||||
|
||||
#include "Wire.h"
|
||||
|
@ -1,7 +1,8 @@
|
||||
//
|
||||
// FILE: ACD10_preheat_test.ino
|
||||
// AUTHOR: Rob Tillaart
|
||||
// PUPROSE: test basic behaviour and performance
|
||||
// PURPOSE: test basic behaviour and performance
|
||||
// URL: https://github.com/RobTillaart/ACD10
|
||||
|
||||
|
||||
#include "Wire.h"
|
||||
|
@ -1,8 +1,8 @@
|
||||
//
|
||||
// FILE: ACD10_readSensor.ino
|
||||
// AUTHOR: Rob Tillaart
|
||||
// PUPROSE: test basic behaviour and performance
|
||||
|
||||
// PURPOSE: test basic behaviour and performance
|
||||
// URL: https://github.com/RobTillaart/ACD10
|
||||
|
||||
#include "Wire.h"
|
||||
#include "ACD10.h"
|
||||
|
@ -1,7 +1,8 @@
|
||||
//
|
||||
// FILE: ACD10_readSensorCode.ino
|
||||
// AUTHOR: Rob Tillaart
|
||||
// PUPROSE: test basic behaviour and performance
|
||||
// PURPOSE: test basic behaviour and performance
|
||||
// URL: https://github.com/RobTillaart/ACD10
|
||||
|
||||
|
||||
#include "Wire.h"
|
||||
|
@ -1,7 +1,8 @@
|
||||
//
|
||||
// FILE: ACD10_readSensor_performance.ino
|
||||
// AUTHOR: Rob Tillaart
|
||||
// PUPROSE: test basic behaviour and performance
|
||||
// PURPOSE: test basic behaviour and performance
|
||||
// URL: https://github.com/RobTillaart/ACD10
|
||||
|
||||
|
||||
#include "Wire.h"
|
||||
@ -11,6 +12,34 @@
|
||||
ACD10 mySensor;
|
||||
|
||||
|
||||
void test(uint32_t speed)
|
||||
{
|
||||
Wire.setClock(speed);
|
||||
delay(100);
|
||||
|
||||
uint32_t start = micros();
|
||||
mySensor.requestSensor();
|
||||
uint32_t duration1 = micros() - start;
|
||||
|
||||
while(mySensor.requestReady() == false) delay(10);
|
||||
|
||||
start = micros();
|
||||
mySensor.readSensor();
|
||||
uint32_t duration2 = micros() - start;
|
||||
|
||||
Serial.print("| ");
|
||||
Serial.print(speed);
|
||||
Serial.print(" | ");
|
||||
Serial.print(duration1);
|
||||
Serial.print(" | ");
|
||||
Serial.print(duration2);
|
||||
Serial.print(" |");
|
||||
Serial.println();
|
||||
// reset I2C bus
|
||||
Wire.setClock(100000);
|
||||
}
|
||||
|
||||
|
||||
void setup()
|
||||
{
|
||||
Serial.begin(115200);
|
||||
@ -40,32 +69,4 @@ void loop()
|
||||
}
|
||||
|
||||
|
||||
void test(uint32_t speed)
|
||||
{
|
||||
Wire.setClock(speed);
|
||||
delay(100);
|
||||
|
||||
uint32_t start = micros();
|
||||
mySensor.requestSensor();
|
||||
uint32_t duration1 = micros() - start;
|
||||
|
||||
while(mySensor.requestReady() == false) delay(10);
|
||||
|
||||
start = micros();
|
||||
mySensor.readSensor();
|
||||
uint32_t duration2 = micros() - start;
|
||||
|
||||
Serial.print("| ");
|
||||
Serial.print(speed);
|
||||
Serial.print(" | ");
|
||||
Serial.print(duration1);
|
||||
Serial.print(" | ");
|
||||
Serial.print(duration2);
|
||||
Serial.print(" |");
|
||||
Serial.println();
|
||||
// reset I2C bus
|
||||
Wire.setClock(100000);
|
||||
}
|
||||
|
||||
|
||||
// -- END OF FILE --
|
||||
|
@ -1,7 +1,8 @@
|
||||
//
|
||||
// FILE: ACD10_readSensor.ino
|
||||
// AUTHOR: Rob Tillaart
|
||||
// PUPROSE: test basic behaviour and performance
|
||||
// PURPOSE: test basic behaviour and performance
|
||||
// URL: https://github.com/RobTillaart/ACD10
|
||||
|
||||
|
||||
#include "Wire.h"
|
||||
|
29
libraries/ACD10/examples/TCA9548_demo_ACD10/.arduino-ci.yml
Normal file
29
libraries/ACD10/examples/TCA9548_demo_ACD10/.arduino-ci.yml
Normal file
@ -0,0 +1,29 @@
|
||||
platforms:
|
||||
rpipico:
|
||||
board: rp2040:rp2040:rpipico
|
||||
package: rp2040:rp2040
|
||||
gcc:
|
||||
features:
|
||||
defines:
|
||||
- ARDUINO_ARCH_RP2040
|
||||
warnings:
|
||||
flags:
|
||||
|
||||
packages:
|
||||
rp2040:rp2040:
|
||||
url: https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json
|
||||
|
||||
compile:
|
||||
# Choosing to run compilation tests on 2 different Arduino platforms
|
||||
platforms:
|
||||
- uno
|
||||
# - due
|
||||
# - zero
|
||||
# - leonardo
|
||||
- m4
|
||||
- esp32
|
||||
- esp8266
|
||||
# - mega2560
|
||||
- rpipico
|
||||
libraries:
|
||||
- "TCA9548"
|
@ -0,0 +1,88 @@
|
||||
//
|
||||
// FILE: TCA9548_demo_ACD10.ino
|
||||
// AUTHOR: Rob Tillaart
|
||||
// PURPOSE: demo TCA9548 I2C multiplexer
|
||||
// URL: https://github.com/RobTillaart/TCA9548
|
||||
// URL: https://github.com/RobTillaart/ACD10
|
||||
|
||||
|
||||
#include "ACD10.h"
|
||||
#include "TCA9548.h"
|
||||
|
||||
PCA9546 MP(0x70);
|
||||
uint8_t channels = 0;
|
||||
|
||||
ACD10 living; // channel 0
|
||||
ACD10 kitchen; // channel 1
|
||||
ACD10 outside; // channel 2
|
||||
|
||||
uint32_t lastTime = 0;
|
||||
|
||||
void setup()
|
||||
{
|
||||
Serial.begin(115200);
|
||||
Serial.println(__FILE__);
|
||||
Serial.print("TCA9548_LIB_VERSION: ");
|
||||
Serial.println(TCA9548_LIB_VERSION);
|
||||
Serial.print("ACD10_LIB_VERSION: ");
|
||||
Serial.println(ACD10_LIB_VERSION);
|
||||
Serial.println();
|
||||
|
||||
Wire.begin();
|
||||
// initialize multiplexer
|
||||
if (MP.begin() == false)
|
||||
{
|
||||
Serial.println("Multiplexer error");
|
||||
}
|
||||
channels = MP.channelCount();
|
||||
|
||||
// initialize the temperature sensors
|
||||
MP.selectChannel(0);
|
||||
if (living.begin() == false)
|
||||
{
|
||||
Serial.println("living error");
|
||||
}
|
||||
MP.selectChannel(1);
|
||||
if (kitchen.begin() == false )
|
||||
{
|
||||
Serial.println("kitchen error");
|
||||
}
|
||||
MP.selectChannel(2);
|
||||
if (outside.begin() == false )
|
||||
{
|
||||
Serial.println("outside error");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void loop()
|
||||
{
|
||||
if ((millis() - lastTime) > 5000)
|
||||
{
|
||||
lastTime = millis();
|
||||
|
||||
MP.selectChannel(0);
|
||||
living.requestSensor();
|
||||
while (!living.requestReady()) {};
|
||||
living.readSensor();
|
||||
Serial.print(living.getCO2Concentration());
|
||||
Serial.print("\t");
|
||||
|
||||
MP.selectChannel(1);
|
||||
kitchen.requestSensor();
|
||||
while (!kitchen.requestReady()) {};
|
||||
kitchen.readSensor();
|
||||
Serial.print(kitchen.getCO2Concentration());
|
||||
Serial.print("\t");
|
||||
|
||||
MP.selectChannel(2);
|
||||
outside.requestSensor();
|
||||
while (!outside.requestReady()) {};
|
||||
outside.readSensor();
|
||||
Serial.print(outside.getCO2Concentration());
|
||||
Serial.print("\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// -- END OF FILE --
|
@ -15,7 +15,7 @@
|
||||
"type": "git",
|
||||
"url": "https://github.com/RobTillaart/ACD10.git"
|
||||
},
|
||||
"version": "0.1.2",
|
||||
"version": "0.1.3",
|
||||
"license": "MIT",
|
||||
"frameworks": "*",
|
||||
"platforms": "*",
|
||||
|
@ -1,5 +1,5 @@
|
||||
name=ACD10
|
||||
version=0.1.2
|
||||
version=0.1.3
|
||||
author=Rob Tillaart <rob.tillaart@gmail.com>
|
||||
maintainer=Rob Tillaart <rob.tillaart@gmail.com>
|
||||
sentence=Arduino library for the ACD10 CO2 sensor.
|
||||
|
@ -3,7 +3,7 @@
|
||||
// AUTHOR: Rob Tillaart
|
||||
// DATE: 2023-09-25
|
||||
// PURPOSE: unit tests for the ACD10 library
|
||||
// https://github.com/RobTillaart/ACD10
|
||||
// URL: https://github.com/RobTillaart/ACD10
|
||||
// https://github.com/Arduino-CI/arduino_ci/blob/master/REFERENCE.md
|
||||
//
|
||||
|
||||
@ -28,7 +28,6 @@
|
||||
#include "ACD10.h"
|
||||
|
||||
|
||||
|
||||
unittest_setup()
|
||||
{
|
||||
fprintf(stderr, "ACD10_LIB_VERSION: %s\n", (char *) ACD10_LIB_VERSION);
|
||||
|
Loading…
Reference in New Issue
Block a user