0.2.2 MCP9808_RT

This commit is contained in:
rob tillaart 2022-11-17 14:21:33 +01:00
parent 321993ce1a
commit 2da9513a7e
7 changed files with 132 additions and 73 deletions

View File

@ -1,3 +1,18 @@
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: compile:
# Choosing to run compilation tests on 2 different Arduino platforms # Choosing to run compilation tests on 2 different Arduino platforms
platforms: platforms:
@ -9,3 +24,4 @@ compile:
- esp32 - esp32
# - esp8266 # - esp8266
# - mega2560 # - mega2560
- rpipico

View File

@ -0,0 +1,44 @@
# Change Log MCP9808_RT
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/).
## [0.2.2] - 2022-11-17
- add RP2040 in build-CI
- add changelog.md
- edit readme.md
## [0.2.1] - 2021-12-21
- update library.json
- update license
- minor edits
## [0.2.0] - 2021-11-19
- fix #7 negative temperature
----
## [0.1.4] - 2021-11-08
- update build-CI, badges
- default offset for offset
- default Wire for I2C bus - setAddress()
## [0.1.3] - 2021-01-01
- Arduino-ci + unit test
## [0.1.2] - 2020-11-16
- removed hasAlert
- removed setAlertPin,
- added 2 alert examples
- refactor low level
## [0.1.1] - 2020-11-12
- refactor
## [0.1.0] - 2020-05-03
- initial version.

View File

@ -21,19 +21,19 @@ of electronics if the temperature hits a predefined value or zone.
### MCP9808 breakout board ### MCP9808 breakout board
``` ```
// //
// Adafruit MCP9808 breakout board // Adafruit MCP9808 breakout board
// +----------+ // +----------+
// |0 ALERT |---------------+--[ 4K7 ]---- +5V // |0 ALERT |---------------+--[ 4K7 ]---- +5V
// | A2 |---- GND | // | A2 |---- GND |
// | A1 |---- GND +--[ LED ]---- GND // or other electronics. // | A1 |---- GND +--[ LED ]---- GND // or other electronics.
// | A0 |---- GND // | A0 |---- GND
// | SDA |---- I2C MCU // | SDA |---- I2C MCU
// | SCL |---- I2C MCU // | SCL |---- I2C MCU
// | GND |---- GND MCU // | GND |---- GND MCU
// |0 VCC |---- +5V // |0 VCC |---- +5V
// +----------+ // +----------+
// //
// address above is 24 // address above is 24
// //
``` ```
@ -50,7 +50,7 @@ Default I2C bus is Wire.
#### Address #### Address
There ar max 8 sensors on one I2C bus. There are max 8 sensors on one I2C bus.
Normal address = 0011xxx where xxx = A2, A1, A0 Normal address = 0011xxx where xxx = A2, A1, A0
| Address | HEX | A2 | A1 | A0 | | Address | HEX | A2 | A1 | A0 |
@ -80,11 +80,11 @@ The value returned by **getStatus()** is the last value read by the call to **Ge
There are three bits, see table below. There are three bits, see table below.
A value of 6 == mask == 110 means that TA is above the upper and above the critical temperature. A value of 6 == mask == 110 means that TA is above the upper and above the critical temperature.
| Bit | Mask | Description | Notes | | Bit | Mask | Description | Notes |
|:----:|:------:|:------------|:----------------| |:-----:|:------:|:--------------|:-----------------|
| 0 | 0x01 | TA < TLOWER | lower | | 0 | 0x01 | TA < TLOWER | lower |
| 1 | 0x02 | TA > TUPPER | larger | | 1 | 0x02 | TA > TUPPER | larger |
| 2 | 0x04 | TA ≥ TCRIT | larger or equal | | 2 | 0x04 | TA ≥ TCRIT | larger or equal |
### Resolution ### Resolution
@ -92,12 +92,12 @@ A value of 6 == mask == 110 means that TA is above the upper and above the criti
- **void setResolution(uint8_t resolution = 3)** set the resolution, if resolution > 3, it is not set. - **void setResolution(uint8_t resolution = 3)** set the resolution, if resolution > 3, it is not set.
- **uint8_t getResolution()** returns the resolution set. - **uint8_t getResolution()** returns the resolution set.
| Value | Resolution | Conv time (ms) | Samples/s | Notes | | Value | Resolution | Conv time (ms) | Samples/s | Notes |
|:------:|:-----------|:--------------:|:---------:|:-------:| |:-------:|:-------------|:----------------:|:-----------:|:--------:|
| 0 | 0.5°C | 30 | 33 | | | 0 | 0.5°C | 30 | 33 | |
| 1 | 0.25°C | 65 | 15 | | | 1 | 0.25°C | 65 | 15 | |
| 2 | 0.125°C | 130 | 7 | | | 2 | 0.125°C | 130 | 7 | |
| 3 | 0.0625°C | 250 | 4 | default | | 3 | 0.0625°C | 250 | 4 | default |
Note: for the same resolution it is about 3x faster than a DS18B20. Note: for the same resolution it is about 3x faster than a DS18B20.
@ -112,7 +112,7 @@ Note: for the same resolution it is about 3x faster than a DS18B20.
|:-----:|:------:|:-----------|:----------------|:-------| |:-----:|:------:|:-----------|:----------------|:-------|
| 0 | 0x0001 | ALT MOD | alert mode | **0 = comparator output**, 1 = interrupt output | 0 | 0x0001 | ALT MOD | alert mode | **0 = comparator output**, 1 = interrupt output
| 1 | 0x0002 | ALT POL | alert polarity | **0 = active low**, 1 = active high | 1 | 0x0002 | ALT POL | alert polarity | **0 = active low**, 1 = active high
| 2 | 0x0004 | ALT SEL | alert select | **0 = upper+lower+crit**, 1 = crit only | 2 | 0x0004 | ALT SEL | alert select | **0 = upper+lower+crit**, 1 = critical only
| 3 | 0x0008 | ALT CNT | alert control | **0 = OFF**, 1 = ON | 3 | 0x0008 | ALT CNT | alert control | **0 = OFF**, 1 = ON
| 4 | 0x0010 | ALT STAT | alert status | **0 = OFF**, 1 = ON (read!) | 4 | 0x0010 | ALT STAT | alert status | **0 = OFF**, 1 = ON (read!)
| 5 | 0x0020 | INT CLR | interrupt clear | **0 = none**, 1 = clear interrupt | 5 | 0x0020 | INT CLR | interrupt clear | **0 = none**, 1 = clear interrupt
@ -163,8 +163,19 @@ See examples
## Future ## Future
#### must
- update documentation - update documentation
- do unit test - compare DS18B20?
- add more examples for the **ALERT** - test more
- - negative temperatures
#### should
- do unit test
- check for optimizations
#### could
- add examples
- for the **ALERT**
- multi sensor

View File

@ -15,7 +15,7 @@
"type": "git", "type": "git",
"url": "https://github.com/RobTillaart/MCP9808_RT.git" "url": "https://github.com/RobTillaart/MCP9808_RT.git"
}, },
"version": "0.2.1", "version": "0.2.2",
"license": "MIT", "license": "MIT",
"frameworks": "arduino", "frameworks": "arduino",
"platforms": "*", "platforms": "*",

View File

@ -1,5 +1,5 @@
name=MCP9808_RT name=MCP9808_RT
version=0.2.1 version=0.2.2
author=Rob Tillaart <rob.tillaart@gmail.com> author=Rob Tillaart <rob.tillaart@gmail.com>
maintainer=Rob Tillaart <rob.tillaart@gmail.com> maintainer=Rob Tillaart <rob.tillaart@gmail.com>
sentence=Arduino Library for I2C MCP9808 temperature sensor sentence=Arduino Library for I2C MCP9808 temperature sensor

View File

@ -1,22 +1,10 @@
// //
// FILE: mcp9808.cpp // FILE: mcp9808.cpp
// AUTHOR: Rob Tillaart // AUTHOR: Rob Tillaart
// VERSION: 0.2.1 // VERSION: 0.2.2
// PURPOSE: Arduino Library for I2C mcp9808 temperature sensor // PURPOSE: Arduino Library for I2C mcp9808 temperature sensor
// DATE: 2020-05-03 // DATE: 2020-05-03
// URL: https://github.com/RobTillaart/MCP9808_RT // URL: https://github.com/RobTillaart/MCP9808_RT
//
// HISTORY:
// 0.1.0 2020-05-03 initial version
// 0.1.1 2020-11-12 refactor
// 0.1.2 2020-11-16 removed hasAlert, removed setAlertPin,
// added 2 alert examples, refactor low level
// 0.1.3 2021-01-01 Arduino-ci + unit test
// 0.1.4 2021-11-08 update build-CI, badges
// default offset for offset
// default Wire for I2C bus - setAddress()
// 0.2.0 2021-11-19 fix #7 negative temperature
// 0.2.1 2021-12-21 update library.json, license, minor edits
#include "mcp9808.h" #include "mcp9808.h"
@ -33,16 +21,16 @@
/* /*
0000 = RFU, Reserved for Future Use (Read-Only register) 0000 = RFU, Reserved for Future Use (Read-Only register)
0001 = Configuration register (CONFIG) 0001 = Configuration register (CONFIG)
0010 = Alert Temperature Upper Boundary Trip register (TUPPER) 0010 = Alert Temperature Upper Boundary Trip register (TUPPER)
0011 = Alert Temperature Lower Boundary Trip register (TLOWER) 0011 = Alert Temperature Lower Boundary Trip register (TLOWER)
0100 = Critical Temperature Trip register (TCRIT) 0100 = Critical Temperature Trip register (TCRIT)
0101 = Temperature register (TA) 0101 = Temperature register (TA)
0110 = Manufacturer ID register 0110 = Manufacturer ID register
0111 = Device ID/Revision register 0111 = Device ID/Revision register
1000 = Resolution register 1000 = Resolution register
1xxx = Reserved(1) 1xxx = Reserved(1)
*/ */
@ -195,7 +183,7 @@ uint16_t MCP9808::getRFU()
//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////
// //
// PRIVATE // PRIVATE
// //
void MCP9808::writeFloat(uint8_t reg, float f) void MCP9808::writeFloat(uint8_t reg, float f)
{ {
@ -214,7 +202,7 @@ float MCP9808::readFloat(uint8_t reg)
{ {
_status = (val & 0xE000) >> 13; _status = (val & 0xE000) >> 13;
} }
if (val & 0x1000) // negative value if (val & 0x1000) // negative value
{ {
return ((val & 0x0FFF) * 0.0625) - 256.0; return ((val & 0x0FFF) * 0.0625) - 256.0;
} }
@ -224,7 +212,7 @@ float MCP9808::readFloat(uint8_t reg)
void MCP9808::writeReg8(uint8_t reg, uint8_t value) void MCP9808::writeReg8(uint8_t reg, uint8_t value)
{ {
if (reg > MCP9808_RES) return; // see p.16 if (reg > MCP9808_RES) return; // see p.16
Wire.beginTransmission(_address); Wire.beginTransmission(_address);
Wire.write(reg); Wire.write(reg);
Wire.write(value); Wire.write(value);
@ -234,7 +222,7 @@ void MCP9808::writeReg8(uint8_t reg, uint8_t value)
uint8_t MCP9808::readReg8(uint8_t reg) uint8_t MCP9808::readReg8(uint8_t reg)
{ {
if (reg > MCP9808_RES) return 0; // see p.16 if (reg > MCP9808_RES) return 0; // see p.16
Wire.beginTransmission(_address); Wire.beginTransmission(_address);
Wire.write(reg); Wire.write(reg);
Wire.endTransmission(); Wire.endTransmission();
@ -245,18 +233,18 @@ uint8_t MCP9808::readReg8(uint8_t reg)
void MCP9808::writeReg16(uint8_t reg, uint16_t value) void MCP9808::writeReg16(uint8_t reg, uint16_t value)
{ {
if (reg > MCP9808_RES) return; // see p.16 if (reg > MCP9808_RES) return; // see p.16
Wire.beginTransmission(_address); Wire.beginTransmission(_address);
Wire.write(reg); Wire.write(reg);
Wire.write(value >> 8); // hi byte Wire.write(value >> 8); // hi byte
Wire.write(value & 0xFF); // lo byte Wire.write(value & 0xFF); // lo byte
Wire.endTransmission(); Wire.endTransmission();
} }
uint16_t MCP9808::readReg16(uint8_t reg) uint16_t MCP9808::readReg16(uint8_t reg)
{ {
if (reg > MCP9808_RES) return 0; // see p.16 if (reg > MCP9808_RES) return 0; // see p.16
Wire.beginTransmission(_address); Wire.beginTransmission(_address);
Wire.write(reg); Wire.write(reg);
Wire.endTransmission(); Wire.endTransmission();

View File

@ -2,7 +2,7 @@
// //
// FILE: mcp9808.h // FILE: mcp9808.h
// AUTHOR: Rob Tillaart // AUTHOR: Rob Tillaart
// VERSION: 0.2.1 // VERSION: 0.2.2
// PURPOSE: Arduino Library for I2C mcp9808 temperature sensor // PURPOSE: Arduino Library for I2C mcp9808 temperature sensor
// DATE: 2020-05-03 // DATE: 2020-05-03
// URL: https://github.com/RobTillaart/MCP9808_RT // URL: https://github.com/RobTillaart/MCP9808_RT
@ -12,16 +12,16 @@
#include "Arduino.h" #include "Arduino.h"
#include "Wire.h" #include "Wire.h"
// VALID ADDRESSES, // VALID ADDRESSES,
// max 8 sensors on one bus // max 8 sensors on one bus
// 24..31 == 0x18..0x1F // 24..31 == 0x18..0x1F
#define MCP9808_LIB_VERSION (F("0.2.1")) #define MCP9808_LIB_VERSION (F("0.2.2"))
// CONFIGURATION REGISTER MASKS // CONFIGURATION REGISTER MASKS
// check the datasheet for exact usage // check the datasheet for exact usage
#define MCP9808_THYSTERESIS 0x0600 #define MCP9808_THYSTERESIS 0x0600
#define MCP9808_SHUTDOWN 0x0100 #define MCP9808_SHUTDOWN 0x0100
#define MCP9808_CRIT_LOCK 0x0080 #define MCP9808_CRIT_LOCK 0x0080
@ -38,7 +38,7 @@ class MCP9808
{ {
public: public:
#if defined(ESP8266) || defined(ESP32) #if defined(ESP8266) || defined(ESP32)
// dataPin and clockPin can be used for ESP8266 // dataPin and clockPin can be used for ESP8266
MCP9808(const uint8_t address, const uint8_t dataPin = 255, const uint8_t clockPin = 255); MCP9808(const uint8_t address, const uint8_t dataPin = 255, const uint8_t clockPin = 255);
#else #else
MCP9808(const uint8_t address); MCP9808(const uint8_t address);
@ -61,8 +61,8 @@ public:
float getOffset(); float getOffset();
float getTemperature(); float getTemperature();
// getStatus() returns 0..7 // getStatus() returns 0..7
// to get latest status, getTemperature() must be called first // to get latest status, getTemperature() must be called first
uint8_t getStatus(); uint8_t getStatus();
void setResolution(uint8_t resolution = 3); void setResolution(uint8_t resolution = 3);
@ -72,13 +72,13 @@ public:
uint8_t getDeviceID(); uint8_t getDeviceID();
uint8_t getRevision(); uint8_t getRevision();
// Reserved Register, not used // Reserved Register, not used
uint16_t getRFU(); uint16_t getRFU();
private: private:
float _offset = 0; float _offset = 0;
uint8_t _status = 0; // 0..7 uint8_t _status = 0; // 0..7
uint8_t _address; uint8_t _address;
TwoWire* _wire; TwoWire* _wire;