diff --git a/BUILDS.md b/BUILDS.md index ec1720d44..92d081c1e 100644 --- a/BUILDS.md +++ b/BUILDS.md @@ -139,6 +139,9 @@ | USE_HRXL | - | - | - | - | x | - | - | | USE_TASMOTA_SLAVE | - | - | - | - | - | - | - | | USE_OPENTHERM | - | - | - | - | - | - | - | +| USE_VEML6075 | - | - | - | - | - | - | - | +| USE_VEML7700 | - | - | - | - | - | - | - | +| USE_MCP9808 | - | - | - | - | - | - | - | | | | | | | | | | | USE_NRF24 | - | - | - | - | - | - | - | | USE_MIBLE | - | - | - | - | - | - | - | diff --git a/I2CDEVICES.md b/I2CDEVICES.md index 788145d3e..4f6718b90 100644 --- a/I2CDEVICES.md +++ b/I2CDEVICES.md @@ -71,4 +71,5 @@ Index | Define | Driver | Device | Address(es) | Description 47 | USE_DISPLAY_SEVENSEG| xdsp_11 | HT16K33 | 0x70 - 0x77 | Seven segment LED 48 | USE_AS3935 | xsns_67 | AS3935 | 0x03 | Franklin Lightning Sensor 49 | USE_VEML6075 | xsns_70 | VEML6075 | 0x10 | UVA/UVB/UVINDEX Sensor - 50 | USE_VEML7700 | xsns_71 | VEML7700 | 0x10 | Ambient light intensity sensor \ No newline at end of file + 50 | USE_VEML7700 | xsns_71 | VEML7700 | 0x10 | Ambient light intensity sensor + 51 | USE_MCP9808 | xsns_72 | MCP9808 | 0x18 - 0x1F | Temperature sensor \ No newline at end of file diff --git a/RELEASENOTES.md b/RELEASENOTES.md index f0f2c1e69..2453fd5d4 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -72,3 +72,4 @@ The following binary downloads have been compiled with ESP8266/Arduino library c - Add ``CpuFrequency`` to ``status 2`` - Add ``FlashFrequency`` to ``status 4`` - Add support for up to two BH1750 sensors controlled by commands ``BH1750Resolution`` and ``BH1750MTime`` (#8139) +- Add support for up to eight MCP9808 temperature sensors by device111 (#8594) diff --git a/lib/Adafruit_MCP9808_Tasmota/.github/ISSUE_TEMPLATE.md b/lib/Adafruit_MCP9808_Tasmota/.github/ISSUE_TEMPLATE.md new file mode 100644 index 000000000..f0e26146f --- /dev/null +++ b/lib/Adafruit_MCP9808_Tasmota/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,46 @@ +Thank you for opening an issue on an Adafruit Arduino library repository. To +improve the speed of resolution please review the following guidelines and +common troubleshooting steps below before creating the issue: + +- **Do not use GitHub issues for troubleshooting projects and issues.** Instead use + the forums at http://forums.adafruit.com to ask questions and troubleshoot why + something isn't working as expected. In many cases the problem is a common issue + that you will more quickly receive help from the forum community. GitHub issues + are meant for known defects in the code. If you don't know if there is a defect + in the code then start with troubleshooting on the forum first. + +- **If following a tutorial or guide be sure you didn't miss a step.** Carefully + check all of the steps and commands to run have been followed. Consult the + forum if you're unsure or have questions about steps in a guide/tutorial. + +- **For Arduino projects check these very common issues to ensure they don't apply**: + + - For uploading sketches or communicating with the board make sure you're using + a **USB data cable** and **not** a **USB charge-only cable**. It is sometimes + very hard to tell the difference between a data and charge cable! Try using the + cable with other devices or swapping to another cable to confirm it is not + the problem. + + - **Be sure you are supplying adequate power to the board.** Check the specs of + your board and plug in an external power supply. In many cases just + plugging a board into your computer is not enough to power it and other + peripherals. + + - **Double check all soldering joints and connections.** Flakey connections + cause many mysterious problems. See the [guide to excellent soldering](https://learn.adafruit.com/adafruit-guide-excellent-soldering/tools) for examples of good solder joints. + + - **Ensure you are using an official Arduino or Adafruit board.** We can't + guarantee a clone board will have the same functionality and work as expected + with this code and don't support them. + +If you're sure this issue is a defect in the code and checked the steps above +please fill in the following fields to provide enough troubleshooting information. +You may delete the guideline and text above to just leave the following details: + +- Arduino board: **INSERT ARDUINO BOARD NAME/TYPE HERE** + +- Arduino IDE version (found in Arduino -> About Arduino menu): **INSERT ARDUINO + VERSION HERE** + +- List the steps to reproduce the problem below (if possible attach a sketch or + copy the sketch code in too): **LIST REPRO STEPS BELOW** diff --git a/lib/Adafruit_MCP9808_Tasmota/.github/PULL_REQUEST_TEMPLATE.md b/lib/Adafruit_MCP9808_Tasmota/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 000000000..7b641eb86 --- /dev/null +++ b/lib/Adafruit_MCP9808_Tasmota/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,26 @@ +Thank you for creating a pull request to contribute to Adafruit's GitHub code! +Before you open the request please review the following guidelines and tips to +help it be more easily integrated: + +- **Describe the scope of your change--i.e. what the change does and what parts + of the code were modified.** This will help us understand any risks of integrating + the code. + +- **Describe any known limitations with your change.** For example if the change + doesn't apply to a supported platform of the library please mention it. + +- **Please run any tests or examples that can exercise your modified code.** We + strive to not break users of the code and running tests/examples helps with this + process. + +Thank you again for contributing! We will try to test and integrate the change +as soon as we can, but be aware we have many GitHub repositories to manage and +can't immediately respond to every request. There is no need to bump or check in +on a pull request (it will clutter the discussion of the request). + +Also don't be worried if the request is closed or not integrated--sometimes the +priorities of Adafruit's GitHub code (education, ease of use) might not match the +priorities of the pull request. Don't fret, the open source community thrives on +forks and GitHub makes it easy to keep your changes in a forked repo. + +After reviewing the guidelines above you can delete this text from the pull request. diff --git a/lib/Adafruit_MCP9808_Tasmota/.github/workflows/githubci.yml b/lib/Adafruit_MCP9808_Tasmota/.github/workflows/githubci.yml new file mode 100644 index 000000000..cb226da94 --- /dev/null +++ b/lib/Adafruit_MCP9808_Tasmota/.github/workflows/githubci.yml @@ -0,0 +1,32 @@ +name: Arduino Library CI + +on: [pull_request, push, repository_dispatch] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/setup-python@v1 + with: + python-version: '3.x' + - uses: actions/checkout@v2 + - uses: actions/checkout@v2 + with: + repository: adafruit/ci-arduino + path: ci + + - name: pre-install + run: bash ci/actions_install.sh + + - name: test platforms + run: python3 ci/build_platform.py main_platforms + + - name: clang + run: python3 ci/run-clang-format.py -e "ci/*" -e "bin/*" -r . + + - name: doxygen + env: + GH_REPO_TOKEN: ${{ secrets.GH_REPO_TOKEN }} + PRETTYNAME : "Adafruit MCP9808 Arduino Library" + run: bash ci/doxy_gen_and_deploy.sh diff --git a/lib/Adafruit_MCP9808_Tasmota/.gitignore b/lib/Adafruit_MCP9808_Tasmota/.gitignore new file mode 100644 index 000000000..542d266a9 --- /dev/null +++ b/lib/Adafruit_MCP9808_Tasmota/.gitignore @@ -0,0 +1,8 @@ +# osx +.DS_Store + +# doxygen +Doxyfile* +doxygen_sqlite3.db +html +*.tmp diff --git a/lib/Adafruit_MCP9808_Tasmota/Adafruit_MCP9808.cpp b/lib/Adafruit_MCP9808_Tasmota/Adafruit_MCP9808.cpp new file mode 100644 index 000000000..db3fa9f86 --- /dev/null +++ b/lib/Adafruit_MCP9808_Tasmota/Adafruit_MCP9808.cpp @@ -0,0 +1,273 @@ +/*! + * @file Adafruit_MCP9808.cpp + * + * @mainpage Adafruit MCP9808 I2C Temp Sensor + * + * @section intro_sec Introduction + * + * I2C Driver for Microchip's MCP9808 I2C Temp sensor + * + * This is a library for the Adafruit MCP9808 breakout: + * http://www.adafruit.com/products/1782 + * + * Adafruit invests time and resources providing this open source code, + * please support Adafruit and open-source hardware by purchasing products from + * Adafruit! + * + * @section author Author + * + * K.Townsend (Adafruit Industries) + * + * @section license License + * + * BSD (see license.txt) + * + * @section HISTORY + * + * v1.0 - First release + * + * changes by Martin Wagner for tasmota project: + * + * - the libary supports variabel I2C address + * + */ + +#if ARDUINO >= 100 +#include "Arduino.h" +#else +#include "WProgram.h" +#endif + +#ifdef __AVR_ATtiny85__ +#include "TinyWireM.h" +#define Wire TinyWireM +#else +#include +#endif + +#include "Adafruit_MCP9808.h" + +/*! + * @brief Instantiates a new MCP9808 class + */ +Adafruit_MCP9808::Adafruit_MCP9808() {} + +/*! + * @brief Setups the HW + * @param *theWire + * @return True if initialization was successful, otherwise false. + */ +bool Adafruit_MCP9808::begin(TwoWire *theWire) { + _wire = theWire; + _i2caddr = MCP9808_I2CADDR_DEFAULT; + return init(); +} + +/*! + * @brief Setups the HW + * @param addr + * @return True if initialization was successful, otherwise false. + */ +bool Adafruit_MCP9808::begin(uint8_t addr) { + _i2caddr = addr; + _wire = &Wire; + return init(); +} + +/*! + * @brief Setups the HW + * @param addr + * @param *theWire + * @return True if initialization was successful, otherwise false. + */ +bool Adafruit_MCP9808::begin(uint8_t addr, TwoWire *theWire) { + _i2caddr = addr; + _wire = theWire; + return init(); +} + +/*! + * @brief Setups the HW with default address + * @return True if initialization was successful, otherwise false. + */ +bool Adafruit_MCP9808::begin() { + _i2caddr = MCP9808_I2CADDR_DEFAULT; + _wire = &Wire; + return init(); +} + +/*! + * @brief init function + * @return True if initialization was successful, otherwise false. + */ +bool Adafruit_MCP9808::init() { + _wire->begin(); + + if (read16(MCP9808_REG_MANUF_ID) != 0x0054) + return false; + if (read16(MCP9808_REG_DEVICE_ID) != 0x0400) + return false; + + write16(MCP9808_REG_CONFIG, 0x0); + return true; +} + +/*! + * @brief Reads the 16-bit temperature register and returns the Centigrade + * temperature as a float. + * @return Temperature in Centigrade. + */ +float Adafruit_MCP9808::readTempC(uint8_t addr) { + _i2caddr = addr; + float temp = NAN; + uint16_t t = read16(MCP9808_REG_AMBIENT_TEMP); + + if (t != 0xFFFF) { + temp = t & 0x0FFF; + temp /= 16.0; + if (t & 0x1000) + temp -= 256; + } + + return temp; +} + +/*! + * @brief Reads the 16-bit temperature register and returns the Fahrenheit + * temperature as a float. + * @return Temperature in Fahrenheit. + */ +float Adafruit_MCP9808::readTempF(uint8_t addr) { + _i2caddr = addr; + float temp = NAN; + uint16_t t = read16(MCP9808_REG_AMBIENT_TEMP); + + if (t != 0xFFFF) { + temp = t & 0x0FFF; + temp /= 16.0; + if (t & 0x1000) + temp -= 256; + + temp = temp * 9.0 / 5.0 + 32; + } + + return temp; +} + +/*! + * @brief Set Sensor to Shutdown-State or wake up (Conf_Register BIT8) + * @param sw true = shutdown / false = wakeup + */ +void Adafruit_MCP9808::shutdown_wake(uint8_t addr, boolean sw) { + _i2caddr = addr; + uint16_t conf_shutdown; + uint16_t conf_register = read16(MCP9808_REG_CONFIG); + if (sw == true) { + conf_shutdown = conf_register | MCP9808_REG_CONFIG_SHUTDOWN; + write16(MCP9808_REG_CONFIG, conf_shutdown); + } + if (sw == false) { + conf_shutdown = conf_register & ~MCP9808_REG_CONFIG_SHUTDOWN; + write16(MCP9808_REG_CONFIG, conf_shutdown); + } +} + +/*! + * @brief Shutdown MCP9808 + */ +void Adafruit_MCP9808::shutdown(uint8_t addr) { shutdown_wake(addr, true); } + +/*! + * @brief Wake up MCP9808 + */ +void Adafruit_MCP9808::wake(uint8_t addr) { + shutdown_wake(addr, false); + delay(250); +} + +/*! + * @brief Get Resolution Value + * @return Resolution value + */ +uint8_t Adafruit_MCP9808::getResolution(uint8_t addr) { + _i2caddr = addr; + return read8(MCP9808_REG_RESOLUTION); +} + +/*! + * @brief Set Resolution Value + * @param value + */ +void Adafruit_MCP9808::setResolution(uint8_t addr, uint8_t value) { + _i2caddr = addr; + write8(MCP9808_REG_RESOLUTION, value & 0x03); +} + +/*! + * @brief Low level 16 bit write procedures + * @param reg + * @param value + */ +void Adafruit_MCP9808::write16(uint8_t reg, uint16_t value) { + _wire->beginTransmission(_i2caddr); + _wire->write((uint8_t)reg); + _wire->write(value >> 8); + _wire->write(value & 0xFF); + _wire->endTransmission(); +} + +/*! + * @brief Low level 16 bit read procedure + * @param reg + * @return value + */ +uint16_t Adafruit_MCP9808::read16(uint8_t reg) { + uint16_t val = 0xFFFF; + uint8_t state; + + _wire->beginTransmission(_i2caddr); + _wire->write((uint8_t)reg); + state = _wire->endTransmission(); + + if (state == 0) { + _wire->requestFrom((uint8_t)_i2caddr, (uint8_t)2); + val = _wire->read(); + val <<= 8; + val |= _wire->read(); + } + + return val; +} + +/*! + * @brief Low level 8 bit write procedure + * @param reg + * @param value + */ +void Adafruit_MCP9808::write8(uint8_t reg, uint8_t value) { + _wire->beginTransmission(_i2caddr); + _wire->write((uint8_t)reg); + _wire->write(value); + _wire->endTransmission(); +} + +/*! + * @brief Low level 8 bit read procedure + * @param reg + * @return value + */ +uint8_t Adafruit_MCP9808::read8(uint8_t reg) { + uint8_t val = 0xFF; + uint8_t state; + + _wire->beginTransmission(_i2caddr); + _wire->write((uint8_t)reg); + state = _wire->endTransmission(); + + if (state == 0) { + _wire->requestFrom((uint8_t)_i2caddr, (uint8_t)1); + val = _wire->read(); + } + + return val; +} diff --git a/lib/Adafruit_MCP9808_Tasmota/Adafruit_MCP9808.h b/lib/Adafruit_MCP9808_Tasmota/Adafruit_MCP9808.h new file mode 100644 index 000000000..c93351ca1 --- /dev/null +++ b/lib/Adafruit_MCP9808_Tasmota/Adafruit_MCP9808.h @@ -0,0 +1,87 @@ +/*! + * @file Adafruit_MCP9808.h + * + * I2C Driver for Microchip's MCP9808 I2C Temp sensor + * + * This is a library for the Adafruit MCP9808 breakout: + * http://www.adafruit.com/products/1782 + * + * Adafruit invests time and resources providing this open source code, + *please support Adafruit and open-source hardware by purchasing products from + * Adafruit! + * + * + * BSD license (see license.txt) + * + * changes by Martin Wagner for tasmota project: + * + * - the libary supports variabel I2C address + * + */ + +#ifndef _ADAFRUIT_MCP9808_H +#define _ADAFRUIT_MCP9808_H + +#if ARDUINO >= 100 +#include "Arduino.h" +#else +#include "WProgram.h" +#endif + +#include + +#define MCP9808_I2CADDR_DEFAULT 0x18 ///< I2C address +#define MCP9808_REG_CONFIG 0x01 ///< MCP9808 config register + +#define MCP9808_REG_CONFIG_SHUTDOWN 0x0100 ///< shutdown config +#define MCP9808_REG_CONFIG_CRITLOCKED 0x0080 ///< critical trip lock +#define MCP9808_REG_CONFIG_WINLOCKED 0x0040 ///< alarm window lock +#define MCP9808_REG_CONFIG_INTCLR 0x0020 ///< interrupt clear +#define MCP9808_REG_CONFIG_ALERTSTAT 0x0010 ///< alert output status +#define MCP9808_REG_CONFIG_ALERTCTRL 0x0008 ///< alert output control +#define MCP9808_REG_CONFIG_ALERTSEL 0x0004 ///< alert output select +#define MCP9808_REG_CONFIG_ALERTPOL 0x0002 ///< alert output polarity +#define MCP9808_REG_CONFIG_ALERTMODE 0x0001 ///< alert output mode + +#define MCP9808_REG_UPPER_TEMP 0x02 ///< upper alert boundary +#define MCP9808_REG_LOWER_TEMP 0x03 ///< lower alert boundery +#define MCP9808_REG_CRIT_TEMP 0x04 ///< critical temperature +#define MCP9808_REG_AMBIENT_TEMP 0x05 ///< ambient temperature +#define MCP9808_REG_MANUF_ID 0x06 ///< manufacture ID +#define MCP9808_REG_DEVICE_ID 0x07 ///< device ID +#define MCP9808_REG_RESOLUTION 0x08 ///< resolutin + +/*! + * @brief Class that stores state and functions for interacting with + * MCP9808 Temp Sensor + */ +class Adafruit_MCP9808 { +public: + Adafruit_MCP9808(); + bool begin(); + bool begin(TwoWire *theWire); + bool begin(uint8_t addr); + bool begin(uint8_t addr, TwoWire *theWire); + + bool init(); + float readTempC(uint8_t addr); + float readTempF(uint8_t addr); + uint8_t getResolution(uint8_t addr); + void setResolution(uint8_t addr, uint8_t value); + + void shutdown_wake(uint8_t addr, boolean sw); + void shutdown(uint8_t addr); + void wake(uint8_t addr); + + void write16(uint8_t reg, uint16_t val); + uint16_t read16(uint8_t reg); + + void write8(uint8_t reg, uint8_t val); + uint8_t read8(uint8_t reg); + +private: + TwoWire *_wire; + uint8_t _i2caddr; +}; + +#endif diff --git a/lib/Adafruit_MCP9808_Tasmota/README.md b/lib/Adafruit_MCP9808_Tasmota/README.md new file mode 100644 index 000000000..0623f214f --- /dev/null +++ b/lib/Adafruit_MCP9808_Tasmota/README.md @@ -0,0 +1,18 @@ +# Adafruit MCP9808 Library [![Build Status](https://github.com/adafruit/Adafruit_MCP9808_Library/workflows/Arduino%20Library%20CI/badge.svg)](https://github.com/adafruit/Adafruit_MCP9808_Library/actions)[![Documentation](https://github.com/adafruit/ci-arduino/blob/master/assets/doxygen_badge.svg)](http://adafruit.github.io/Adafruit_MCP9808_Library/html/index.html) + + + +This is the Adafruit MCP9808 Precision I2C Temperature sensor library + +Tested and works great with the Adafruit MCP9808 Breakout Board +* http://www.adafruit.com/products/1782 + +This chip uses I2C to communicate, 2 pins are required to interface + +Adafruit invests time and resources providing this open source code, please support Adafruit and open-source hardware by purchasing products from Adafruit! + +Written by Kevin Townsend/Limor Fried for Adafruit Industries. +BSD license, check license.txt for more information +All text above must be included in any redistribution + +To install, use the Arduino Library Manager and search for "Adafruit MCP9808" and install the library. diff --git a/lib/Adafruit_MCP9808_Tasmota/assets/board.jpg b/lib/Adafruit_MCP9808_Tasmota/assets/board.jpg new file mode 100644 index 000000000..69644e1c5 Binary files /dev/null and b/lib/Adafruit_MCP9808_Tasmota/assets/board.jpg differ diff --git a/lib/Adafruit_MCP9808_Tasmota/code-of-conduct.md b/lib/Adafruit_MCP9808_Tasmota/code-of-conduct.md new file mode 100644 index 000000000..8ee6e4498 --- /dev/null +++ b/lib/Adafruit_MCP9808_Tasmota/code-of-conduct.md @@ -0,0 +1,127 @@ +# Adafruit Community Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and leaders pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level or type of +experience, education, socio-economic status, nationality, personal appearance, +race, religion, or sexual identity and orientation. + +## Our Standards + +We are committed to providing a friendly, safe and welcoming environment for +all. + +Examples of behavior that contributes to creating a positive environment +include: + +* Be kind and courteous to others +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Collaborating with other community members +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and sexual attention or advances +* The use of inappropriate images, including in a community member's avatar +* The use of inappropriate language, including in a community member's nickname +* Any spamming, flaming, baiting or other attention-stealing behavior +* Excessive or unwelcome helping; answering outside the scope of the question + asked +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate + +The goal of the standards and moderation guidelines outlined here is to build +and maintain a respectful community. We ask that you don’t just aim to be +"technically unimpeachable", but rather try to be your best self. + +We value many things beyond technical expertise, including collaboration and +supporting others within our community. Providing a positive experience for +other community members can have a much more significant impact than simply +providing the correct answer. + +## Our Responsibilities + +Project leaders are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project leaders have the right and responsibility to remove, edit, or +reject messages, comments, commits, code, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any community member for other behaviors that they deem +inappropriate, threatening, offensive, or harmful. + +## Moderation + +Instances of behaviors that violate the Adafruit Community Code of Conduct +may be reported by any member of the community. Community members are +encouraged to report these situations, including situations they witness +involving other community members. + +You may report in the following ways: + +In any situation, you may send an email to . + +On the Adafruit Discord, you may send an open message from any channel +to all Community Helpers by tagging @community helpers. You may also send an +open message from any channel, or a direct message to @kattni#1507, +@tannewt#4653, @Dan Halbert#1614, @cater#2442, @sommersoft#0222, or +@Andon#8175. + +Email and direct message reports will be kept confidential. + +In situations on Discord where the issue is particularly egregious, possibly +illegal, requires immediate action, or violates the Discord terms of service, +you should also report the message directly to Discord. + +These are the steps for upholding our community’s standards of conduct. + +1. Any member of the community may report any situation that violates the +Adafruit Community Code of Conduct. All reports will be reviewed and +investigated. +2. If the behavior is an egregious violation, the community member who +committed the violation may be banned immediately, without warning. +3. Otherwise, moderators will first respond to such behavior with a warning. +4. Moderators follow a soft "three strikes" policy - the community member may +be given another chance, if they are receptive to the warning and change their +behavior. +5. If the community member is unreceptive or unreasonable when warned by a +moderator, or the warning goes unheeded, they may be banned for a first or +second offense. Repeated offenses will result in the community member being +banned. + +## Scope + +This Code of Conduct and the enforcement policies listed above apply to all +Adafruit Community venues. This includes but is not limited to any community +spaces (both public and private), the entire Adafruit Discord server, and +Adafruit GitHub repositories. Examples of Adafruit Community spaces include +but are not limited to meet-ups, audio chats on the Adafruit Discord, or +interaction at a conference. + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. As a community +member, you are representing our community, and are expected to behave +accordingly. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 1.4, available at +, +and the [Rust Code of Conduct](https://www.rust-lang.org/en-US/conduct.html). + +For other projects adopting the Adafruit Community Code of +Conduct, please contact the maintainers of those projects for enforcement. +If you wish to use this code of conduct for your own project, consider +explicitly mentioning your moderation policy or making a copy with your +own moderation policy so as to avoid confusion. diff --git a/lib/Adafruit_MCP9808_Tasmota/examples/mcp9808test/mcp9808test.ino b/lib/Adafruit_MCP9808_Tasmota/examples/mcp9808test/mcp9808test.ino new file mode 100644 index 000000000..6002487e9 --- /dev/null +++ b/lib/Adafruit_MCP9808_Tasmota/examples/mcp9808test/mcp9808test.ino @@ -0,0 +1,69 @@ + +/**************************************************************************/ +/*! +This is a demo for the Adafruit MCP9808 breakout +----> http://www.adafruit.com/products/1782 +Adafruit invests time and resources providing this open source code, +please support Adafruit and open-source hardware by purchasing +products from Adafruit! +*/ +/**************************************************************************/ + +#include +#include "Adafruit_MCP9808.h" + +// Create the MCP9808 temperature sensor object +Adafruit_MCP9808 tempsensor = Adafruit_MCP9808(); + +void setup() { + Serial.begin(9600); + while (!Serial); //waits for serial terminal to be open, necessary in newer arduino boards. + Serial.println("MCP9808 demo"); + + // Make sure the sensor is found, you can also pass in a different i2c + // address with tempsensor.begin(0x19) for example, also can be left in blank for default address use + // Also there is a table with all addres possible for this sensor, you can connect multiple sensors + // to the same i2c bus, just configure each sensor with a different address and define multiple objects for that + // A2 A1 A0 address + // 0 0 0 0x18 this is the default address + // 0 0 1 0x19 + // 0 1 0 0x1A + // 0 1 1 0x1B + // 1 0 0 0x1C + // 1 0 1 0x1D + // 1 1 0 0x1E + // 1 1 1 0x1F + if (!tempsensor.begin(0x18)) { + Serial.println("Couldn't find MCP9808! Check your connections and verify the address is correct."); + while (1); + } + + Serial.println("Found MCP9808!"); + + tempsensor.setResolution(3); // sets the resolution mode of reading, the modes are defined in the table bellow: + // Mode Resolution SampleTime + // 0 0.5°C 30 ms + // 1 0.25°C 65 ms + // 2 0.125°C 130 ms + // 3 0.0625°C 250 ms +} + +void loop() { + Serial.println("wake up MCP9808.... "); // wake up MCP9808 - power consumption ~200 mikro Ampere + tempsensor.wake(); // wake up, ready to read! + + // Read and print out the temperature, also shows the resolution mode used for reading. + Serial.print("Resolution in mode: "); + Serial.println (tempsensor.getResolution()); + float c = tempsensor.readTempC(); + float f = tempsensor.readTempF(); + Serial.print("Temp: "); + Serial.print(c, 4); Serial.print("*C\t and "); + Serial.print(f, 4); Serial.println("*F."); + + delay(2000); + Serial.println("Shutdown MCP9808.... "); + tempsensor.shutdown_wake(1); // shutdown MSP9808 - power consumption ~0.1 mikro Ampere, stops temperature sampling + Serial.println(""); + delay(200); +} diff --git a/lib/Adafruit_MCP9808_Tasmota/library.properties b/lib/Adafruit_MCP9808_Tasmota/library.properties new file mode 100644 index 000000000..3c4ee86ce --- /dev/null +++ b/lib/Adafruit_MCP9808_Tasmota/library.properties @@ -0,0 +1,10 @@ +name=Adafruit MCP9808 Library +version=1.1.2 +author=Adafruit +maintainer=Adafruit +sentence=Arduino library for the MCP9808 sensors in the Adafruit shop +paragraph=Arduino library for the MCP9808 sensors in the Adafruit shop +category=Sensors +url=https://github.com/adafruit/Adafruit_MCP9808_Library +architectures=* +depends=Adafruit Unified Sensor diff --git a/lib/Adafruit_MCP9808_Tasmota/license.txt b/lib/Adafruit_MCP9808_Tasmota/license.txt new file mode 100644 index 000000000..f6a0f22b8 --- /dev/null +++ b/lib/Adafruit_MCP9808_Tasmota/license.txt @@ -0,0 +1,26 @@ +Software License Agreement (BSD License) + +Copyright (c) 2012, Adafruit Industries +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 copyright holders 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 COPYRIGHT HOLDERS ''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 COPYRIGHT HOLDER 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. diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index 46d88e0d7..0d968b1f8 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -518,6 +518,7 @@ // #define USE_AS3935 // [I2cDriver48] Enable AS3935 Franklin Lightning Sensor (I2C address 0x03) (+5k4 code) // #define USE_VEML6075 // [I2cDriver49] Enable VEML6075 UVA/UVB/UVINDEX Sensor (I2C address 0x10) (+2k1 code) // #define USE_VEML7700 // [I2cDriver50] Enable VEML7700 Ambient Light sensor (I2C addresses 0x10) (+4k5 code) +// #define USE_MCP9808 // [I2cDriver51] Enable MCP9808 temperature sensor (I2C addresses 0x18 - 0x1F) (+0k9 code) // #define USE_DISPLAY // Add I2C Display Support (+2k code) #define USE_DISPLAY_MODES1TO5 // Enable display mode 1 to 5 in addition to mode 0 diff --git a/tasmota/support_features.ino b/tasmota/support_features.ino index ef757e5b6..5622bcde9 100644 --- a/tasmota/support_features.ino +++ b/tasmota/support_features.ino @@ -569,8 +569,10 @@ void GetFeatures(void) #ifdef USE_VEML7700 feature6 |= 0x00001000; // xsns_71_veml7700.ino #endif +#ifdef USE_MCP9808 + feature6 |= 0x00002000; // xsns_72_mcp9808.ino +#endif -// feature6 |= 0x00002000; // feature6 |= 0x00004000; // feature6 |= 0x00008000; diff --git a/tasmota/tasmota_configurations.h b/tasmota/tasmota_configurations.h index 8ba54e60b..811076d8f 100644 --- a/tasmota/tasmota_configurations.h +++ b/tasmota/tasmota_configurations.h @@ -154,6 +154,7 @@ #define USE_HRXL // Add support for MaxBotix HRXL-MaxSonar ultrasonic range finders (+0k7) //#define USE_TASMOTA_SLAVE // Add support for Arduino Uno/Pro Mini via serial interface including flashing (+2k3 code, 44 mem) //#define USE_OPENTHERM // Add support for OpenTherm (+15k code) +//#define USE_MCP9808 // Add support for MCP9808 temperature sensor (+0k9 code) #define USE_ENERGY_SENSOR // Add energy sensors (-14k code) #define USE_PZEM004T // Add support for PZEM004T Energy monitor (+2k code) diff --git a/tasmota/xsns_72_mcp9808.ino b/tasmota/xsns_72_mcp9808.ino new file mode 100644 index 000000000..42fdd7ab9 --- /dev/null +++ b/tasmota/xsns_72_mcp9808.ino @@ -0,0 +1,136 @@ +/* + xsns_72_mcp9808 - MCP9808 I2C temperature sensor support for Tasmota + + Copyright (C) 2020 Martin Wagner and Theo Arends + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +*/ + +#ifdef USE_I2C +#ifdef USE_MCP9808 +/*********************************************************************************************\ + * MCP9808 - Temperature Sensor + * + * I2C Address: 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F + * +\*********************************************************************************************/ + +#define XSNS_72 72 +#define XI2C_51 51 // See I2CDEVICES.md + +#include "Adafruit_MCP9808.h" +Adafruit_MCP9808 mcp9808 = Adafruit_MCP9808(); // create object copy + +#define MCP9808_MAX_SENSORS 8 +#define MCP9808_START_ADDRESS 0x18 + +struct { +char types[9] = "MCP9808"; +uint8_t count = 0; +} mcp9808_cfg; + +struct { + float temperature = NAN; + uint8_t address; +} mcp9808_sensors[MCP9808_MAX_SENSORS]; + +/********************************************************************************************/ + +float MCP9808Read(uint8_t addr) { + float t = mcp9808.readTempC(addr); + return t; +} + +void MCP9808Detect(void) { + for (uint8_t i = 0; i < MCP9808_MAX_SENSORS; i++) { + if (!I2cSetDevice(MCP9808_START_ADDRESS + i)) { continue; } + + if (mcp9808.begin(MCP9808_START_ADDRESS + i)) { + mcp9808_sensors[mcp9808_cfg.count].address = MCP9808_START_ADDRESS + i; + I2cSetActiveFound(mcp9808_sensors[mcp9808_cfg.count].address, mcp9808_cfg.types); + mcp9808.setResolution (mcp9808_sensors[mcp9808_cfg.count].address, 2); // Set Resolution to 0.125°C + mcp9808_cfg.count++; + } + } +} + +void MCP9808EverySecond(void) { + for (uint32_t i = 0; i < mcp9808_cfg.count; i++) { + float t = MCP9808Read(mcp9808_sensors[i].address); + mcp9808_sensors[i].temperature = ConvertTemp(t); + } +} + +void MCP9808Show(bool json) { + for (uint32_t i = 0; i < mcp9808_cfg.count; i++) { + char temperature[33]; + dtostrfd(mcp9808_sensors[i].temperature, Settings.flag2.temperature_resolution, temperature); + + char sensor_name[10]; + strlcpy(sensor_name, mcp9808_cfg.types, sizeof(sensor_name)); + if (mcp9808_cfg.count > 1) { + snprintf_P(sensor_name, sizeof(sensor_name), PSTR("%s%c%d"), sensor_name, IndexSeparator(), i +1); // MCP9808-1 + } + + if (json) { + ResponseAppend_P(PSTR(",\"%s\":{\"" D_JSON_TEMPERATURE "\":%s}"), sensor_name, temperature); + if (0 == tele_period) { +#ifdef USE_DOMOTICZ + DomoticzSensor(DZ_TEMP, temperature); +#endif // USE_DOMOTICZ +#ifdef USE_KNX + KnxSensor(KNX_TEMPERATURE, mcp9808_sensors[i].temperature); +#endif // USE_KNX + } +#ifdef USE_WEBSERVER + } else { + WSContentSend_PD(HTTP_SNS_TEMP, sensor_name, temperature, TempUnit()); +#endif // USE_WEBSERVER + } + } +} + +/*********************************************************************************************\ + * Interface +\*********************************************************************************************/ + +bool Xsns72(uint8_t function) +{ + if (!I2cEnabled(XI2C_51)) { return false; } + bool result = false; + + if (FUNC_INIT == function) { + MCP9808Detect(); + } + else if (mcp9808_cfg.count){ + switch (function) { + case FUNC_EVERY_SECOND: + MCP9808EverySecond(); + break; + case FUNC_JSON_APPEND: + MCP9808Show(1); + break; + #ifdef USE_WEBSERVER + case FUNC_WEB_SENSOR: + MCP9808Show(0); + break; + #endif // USE_WEBSERVER + } + } + return result; +} + +#endif // USE_MCP9808 +#endif // USE_I2C \ No newline at end of file diff --git a/tools/decode-status.py b/tools/decode-status.py index a992a621c..67898d784 100755 --- a/tools/decode-status.py +++ b/tools/decode-status.py @@ -204,7 +204,7 @@ a_features = [[ "USE_KEELOQ","USE_HRXL","USE_SONOFF_D1","USE_HDC1080", "USE_IAQ","USE_DISPLAY_SEVENSEG","USE_AS3935","USE_PING", "USE_WINDMETER","USE_OPENTHERM","USE_THERMOSTAT","USE_VEML6075", - "USE_VEML7700","","","", + "USE_VEML7700","USE_MCP9808","","", "","","","", "","","","", "","","","",