From 74d0876c5978f5f0b37430334dc03ed92af030b4 Mon Sep 17 00:00:00 2001 From: Rafal Zajac Date: Sun, 12 Nov 2017 22:49:10 +0100 Subject: [PATCH] Initial commit --- .gitignore | 2 + CMakeLists.txt | 38 +++ LICENSE | 174 +++++++++++++ README.md | 52 ++++ build/.gitignore | 2 + doc/dht22-pinout.jpg | Bin 0 -> 67031 bytes doc/ds18b20.jpg | Bin 0 -> 41975 bytes doc/sht21.jpg | Bin 0 -> 58375 bytes examples/CMakeLists.txt | 19 ++ examples/dht22_temp_hum/CMakeLists.txt | 31 +++ examples/dht22_temp_hum/README.md | 12 + examples/dht22_temp_hum/main.c | 117 +++++++++ examples/ds18b20_search/CMakeLists.txt | 37 +++ examples/ds18b20_search/README.md | 12 + examples/ds18b20_search/main.c | 55 +++++ examples/ds18b20_temp/CMakeLists.txt | 37 +++ examples/ds18b20_temp/README.md | 12 + examples/ds18b20_temp/main.c | 81 +++++++ examples/include/user_config.h | 1 + examples/sht21_example/CMakeLists.txt | 34 +++ examples/sht21_example/README.md | 15 ++ examples/sht21_example/main.c | 131 ++++++++++ install.sh | 63 +++++ src/CMakeLists.txt | 18 ++ src/esp_dht22/CMakeLists.txt | 32 +++ src/esp_dht22/Findesp_dht22.cmake | 46 ++++ src/esp_dht22/README.md | 13 + src/esp_dht22/esp_dht22.c | 178 ++++++++++++++ src/esp_dht22/include/esp_dht22.h | 75 ++++++ src/esp_ds18b20/CMakeLists.txt | 38 +++ src/esp_ds18b20/Findesp_ds18b20.cmake | 52 ++++ src/esp_ds18b20/README.md | 45 ++++ src/esp_ds18b20/esp_ds18b20.c | 305 +++++++++++++++++++++++ src/esp_ds18b20/include/esp_ds18b20.h | 187 ++++++++++++++ src/esp_sht21/CMakeLists.txt | 33 +++ src/esp_sht21/Findesp_sht21.cmake | 46 ++++ src/esp_sht21/README.md | 18 ++ src/esp_sht21/esp_sht21.c | 324 +++++++++++++++++++++++++ src/esp_sht21/include/esp_sht21.h | 168 +++++++++++++ 39 files changed, 2503 insertions(+) create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 LICENSE create mode 100644 README.md create mode 100644 build/.gitignore create mode 100644 doc/dht22-pinout.jpg create mode 100644 doc/ds18b20.jpg create mode 100644 doc/sht21.jpg create mode 100644 examples/CMakeLists.txt create mode 100644 examples/dht22_temp_hum/CMakeLists.txt create mode 100644 examples/dht22_temp_hum/README.md create mode 100644 examples/dht22_temp_hum/main.c create mode 100644 examples/ds18b20_search/CMakeLists.txt create mode 100644 examples/ds18b20_search/README.md create mode 100644 examples/ds18b20_search/main.c create mode 100644 examples/ds18b20_temp/CMakeLists.txt create mode 100644 examples/ds18b20_temp/README.md create mode 100644 examples/ds18b20_temp/main.c create mode 100644 examples/include/user_config.h create mode 100644 examples/sht21_example/CMakeLists.txt create mode 100644 examples/sht21_example/README.md create mode 100644 examples/sht21_example/main.c create mode 100755 install.sh create mode 100644 src/CMakeLists.txt create mode 100644 src/esp_dht22/CMakeLists.txt create mode 100644 src/esp_dht22/Findesp_dht22.cmake create mode 100644 src/esp_dht22/README.md create mode 100644 src/esp_dht22/esp_dht22.c create mode 100644 src/esp_dht22/include/esp_dht22.h create mode 100644 src/esp_ds18b20/CMakeLists.txt create mode 100644 src/esp_ds18b20/Findesp_ds18b20.cmake create mode 100644 src/esp_ds18b20/README.md create mode 100644 src/esp_ds18b20/esp_ds18b20.c create mode 100644 src/esp_ds18b20/include/esp_ds18b20.h create mode 100644 src/esp_sht21/CMakeLists.txt create mode 100644 src/esp_sht21/Findesp_sht21.cmake create mode 100644 src/esp_sht21/README.md create mode 100644 src/esp_sht21/esp_sht21.c create mode 100644 src/esp_sht21/include/esp_sht21.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..13bbe5b --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.idea/ + diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..4a52fcf --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,38 @@ +# Copyright 2017 Rafal Zajac . +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + + +# Bootstrap before call to project(). +include("$ENV{ESPROOT}/esp-cmake/ESP8266.bootstrap.cmake") +cmake_minimum_required(VERSION 3.5) + +project(esp_drv C) +set(CMAKE_C_STANDARD 99) + +# The directory containing global user_congih.h header file. +set(ESP_USER_CONFIG_DIR "${CMAKE_CURRENT_LIST_DIR}/examples/include") +set(ESP_USER_CONFIG "${ESP_USER_CONFIG_DIR}/user_config.h") +set(ESP_CMAKE_FIND_DIR "${CMAKE_CURRENT_LIST_DIR}/cmake") +set(ESP_LIB_BIN_DIR "${CMAKE_CURRENT_LIST_DIR}/bin") + +# Magic. +include("${ESP_CMAKE_DIR}/ESP8266.cmake") + +# Main application. +# Must define esp_main executable target. +add_subdirectory(src) +add_subdirectory(examples) + +set(CPACK_GENERATOR "TGZ") +include(CPack) diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..895657b --- /dev/null +++ b/LICENSE @@ -0,0 +1,174 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..7f8f5af --- /dev/null +++ b/README.md @@ -0,0 +1,52 @@ +## ESP8266 drivers. + +The collection of device drivers for ESP8266. + +- [DS18B20](src/esp_ds18b20) OneWire temperature sensor. +- [DHT22 (AM2302)](src/esp_dht22) temperature and humidity sensor. +- [SHT21 (Si7020)](src/esp_sht21) temperature and humidity sensor. + +## Build environment. + +This library is part of my build system for ESP8266 based on CMake. +To compile / flash examples you will have to have the ESP development +environment setup as described at https://github.com/rzajac/esp-dev-env. + +## Development environment installation. + +There are two ways to install device drivers in the development environment: + +``` +$ wget -O - https://raw.githubusercontent.com/rzajac/esp-drv/master/install.sh | bash +``` + +or if you already cloned this repository you can do: + +``` +$ cd build +$ cmake .. +$ make +$ make install +``` + +## Examples. + +- [DHT22 get temperature and humidity](examples/dht22_temp_hum) +- [DS18B20 get temperature](examples/ds18b20_temp) +- [Search for DS18B20](examples/ds18b20_search) + +# Dependencies. + +This library depends on: + +- https://github.com/rzajac/esp-prot + +to install dependency run: + +``` +$ wget -O - https://raw.githubusercontent.com/rzajac/esp-prot/master/install.sh | bash +``` + +## License. + +[Apache License Version 2.0](LICENSE) unless stated otherwise. diff --git a/build/.gitignore b/build/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/build/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/doc/dht22-pinout.jpg b/doc/dht22-pinout.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c9de3e0adaf3523a483ba1d7a9659a9630178bb9 GIT binary patch literal 67031 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 T*=1_&CA)K;V!vwsxAuPke6|fz literal 0 HcmV?d00001 diff --git a/doc/ds18b20.jpg b/doc/ds18b20.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c8e240ba03166300709e91ec834b18d25b6cfec8 GIT binary patch literal 41975 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. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + + +add_subdirectory(ds18b20_search) +add_subdirectory(ds18b20_temp) +add_subdirectory(dht22_temp_hum) +add_subdirectory(sht21_example) diff --git a/examples/dht22_temp_hum/CMakeLists.txt b/examples/dht22_temp_hum/CMakeLists.txt new file mode 100644 index 0000000..83789d0 --- /dev/null +++ b/examples/dht22_temp_hum/CMakeLists.txt @@ -0,0 +1,31 @@ +# Copyright 2017 Rafal Zajac . +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + + +find_package(esp_sdo REQUIRED) +find_package(esp_util REQUIRED) + +add_executable(dht22_temp_hum main.c ${ESP_USER_CONFIG}) + +target_include_directories(dht22_temp_hum PUBLIC + ${ESP_USER_CONFIG_DIR} + ${esp_sdo_INCLUDE_DIRS} + ${esp_util_INCLUDE_DIRS}) + +target_link_libraries(dht22_temp_hum + ${esp_sdo_LIBRARIES} + ${esp_util_LIBRARIES} + esp_dht22) + +esp_gen_exec_targets(dht22_temp_hum) diff --git a/examples/dht22_temp_hum/README.md b/examples/dht22_temp_hum/README.md new file mode 100644 index 0000000..4d7b1c5 --- /dev/null +++ b/examples/dht22_temp_hum/README.md @@ -0,0 +1,12 @@ +## DHT22 example. + +Demonstrates how to get temperature and humidity from DHT22 sensor. + +## Flashing + +``` +$ cd build +$ cmake .. +$ make dht22_temp_hum_flash +$ miniterm.py /dev/ttyUSB0 74880 +``` diff --git a/examples/dht22_temp_hum/main.c b/examples/dht22_temp_hum/main.c new file mode 100644 index 0000000..b43aec7 --- /dev/null +++ b/examples/dht22_temp_hum/main.c @@ -0,0 +1,117 @@ +/* + * Copyright 2017 Rafal Zajac . + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +#include +#include +#include +#include +#include + +os_timer_t timer; + +/** + * Rise base to power of. + * + * From: http://bbs.espressif.com/viewtopic.php?t=246 + * + * @param base The number. + * @param exp The exponent. + * + * @return Product. + */ +static int ICACHE_FLASH_ATTR +power(int base, int exp) +{ + int result = 1; + while (exp) { + result *= base; + exp--; + } + + return result; +} + +/** + * Get string representation of float. + * + * From: http://bbs.espressif.com/viewtopic.php?t=246 + * + * Warning: limited to 15 chars & non-reentrant. + * e.g., don't use more than once per os_printf call. + * + * @param num The float to convert to string. + * @param decimals The number of decimal places. + * + * @return The float string representation. + */ +static char *ICACHE_FLASH_ATTR +ftoa(float num, uint8_t decimals) +{ + static char *buf[16]; + + int whole = (int) num; + int decimal = (int) ((num - whole) * power(10, decimals)); + if (decimal < 0) { + // get rid of sign on decimal portion + decimal -= 2 * decimal; + } + + char *pattern[10]; // setup printf pattern for decimal portion + os_sprintf((char *) pattern, "%%d.%%0%dd", decimals); + os_sprintf((char *) buf, (const char *) pattern, whole, decimal); + + return (char *) buf; +} + +void ICACHE_FLASH_ATTR +sys_init_done(void* arg) +{ + esp_dht22_err err; + esp_dht22_dev *dev = esp_dht22_new_dev(GPIO2); + + // Get temperature. + err = esp_dht22_get(dev); + if (err != ESP_DHT22_OK) { + os_free(dev); + os_printf("DHT22 error code: %d\n", err); + return; + } + + os_printf("Temp: %s\n", ftoa(dev->temp, 2)); + os_printf("Hum: %s\n", ftoa(dev->hum, 2)); + os_printf("--------------------\n"); + os_free(dev); +} + +void ICACHE_FLASH_ATTR +user_init() +{ + // No need for wifi for this example. + wifi_station_disconnect(); + wifi_set_opmode_current(NULL_MODE); + + //system_init_done_cb(sys_init_done); + stdout_init(BIT_RATE_74880); + + // Initialize DHT22 on GPIO 2. + esp_dht22_init(GPIO2); + + // Wait before running main code. + os_printf("Initialized.\n"); + os_timer_disarm(&timer); + os_timer_setfn(&timer, sys_init_done, NULL); + os_timer_arm(&timer, 1500, true); +} diff --git a/examples/ds18b20_search/CMakeLists.txt b/examples/ds18b20_search/CMakeLists.txt new file mode 100644 index 0000000..433b27f --- /dev/null +++ b/examples/ds18b20_search/CMakeLists.txt @@ -0,0 +1,37 @@ +# Copyright 2017 Rafal Zajac . +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + + +find_package(esp_sdo REQUIRED) +find_package(esp_ow REQUIRED) +find_package(esp_eb REQUIRED) +find_package(esp_util REQUIRED) + +add_executable(ds18b20_search main.c ${ESP_USER_CONFIG}) + +target_include_directories(ds18b20_search PUBLIC + ${ESP_USER_CONFIG_DIR} + ${esp_sdo_INCLUDE_DIRS} + ${esp_ow_INCLUDE_DIRS} + ${esp_eb_INCLUDE_DIRS} + ${esp_util_INCLUDE_DIRS}) + +target_link_libraries(ds18b20_search + ${esp_sdo_LIBRARIES} + ${esp_ow_LIBRARIES} + ${esp_eb_LIBRARIES} + ${esp_util_LIBRARIES} + esp_ds18b20) + +esp_gen_exec_targets(ds18b20_search) diff --git a/examples/ds18b20_search/README.md b/examples/ds18b20_search/README.md new file mode 100644 index 0000000..f44edce --- /dev/null +++ b/examples/ds18b20_search/README.md @@ -0,0 +1,12 @@ +## Find DS18b20 devices. + +Demonstrates how to search OneWire bus for DS18b20. + +## Flashing + +``` +$ cd build +$ cmake .. +$ make ds18b20_search_flash +$ miniterm.py /dev/ttyUSB0 74880 +``` diff --git a/examples/ds18b20_search/main.c b/examples/ds18b20_search/main.c new file mode 100644 index 0000000..5d9b410 --- /dev/null +++ b/examples/ds18b20_search/main.c @@ -0,0 +1,55 @@ +/* + * Copyright 2017 Rafal Zajac . + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +#include +#include +#include +#include +#include + +// List of found devices on the OneWire bus. +static esp_ow_device *root = NULL; + +static void ICACHE_FLASH_ATTR +sys_init_done() +{ + esp_ow_err err; + + if (esp_ds18b20_init(GPIO2) == false) { + os_printf("Error initializing DS18B20.\n"); + return; + } + + err = esp_ds18b20_search(GPIO2, false, &root); + if (err != ESP_OW_OK) { + os_printf("Search error: %d\n", err); + return; + } + + // Log found devices to serial. + esp_ow_dump_found(root); +} + +void ICACHE_FLASH_ATTR +user_init() +{ + // No need for wifi for this examples. + wifi_station_disconnect(); + wifi_set_opmode_current(NULL_MODE); + + stdout_init(BIT_RATE_74880); + system_init_done_cb(sys_init_done); +} diff --git a/examples/ds18b20_temp/CMakeLists.txt b/examples/ds18b20_temp/CMakeLists.txt new file mode 100644 index 0000000..51a7e15 --- /dev/null +++ b/examples/ds18b20_temp/CMakeLists.txt @@ -0,0 +1,37 @@ +# Copyright 2017 Rafal Zajac . +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + + +find_package(esp_sdo REQUIRED) +find_package(esp_ow REQUIRED) +find_package(esp_eb REQUIRED) +find_package(esp_util REQUIRED) + +add_executable(ds18b20_temp main.c ${ESP_USER_CONFIG}) + +target_include_directories(ds18b20_temp PUBLIC + ${ESP_USER_CONFIG_DIR} + ${esp_sdo_INCLUDE_DIRS} + ${esp_ow_INCLUDE_DIRS} + ${esp_eb_INCLUDE_DIRS} + ${esp_util_INCLUDE_DIRS}) + +target_link_libraries(ds18b20_temp + ${esp_sdo_LIBRARIES} + ${esp_ow_LIBRARIES} + ${esp_eb_LIBRARIES} + ${esp_util_LIBRARIES} + esp_ds18b20) + +esp_gen_exec_targets(ds18b20_temp) diff --git a/examples/ds18b20_temp/README.md b/examples/ds18b20_temp/README.md new file mode 100644 index 0000000..591a2cb --- /dev/null +++ b/examples/ds18b20_temp/README.md @@ -0,0 +1,12 @@ +## Get temperature measured by DS18B20. + +Demonstrates how to search OneWire bus for DS18b20. + +## Flashing + +``` +$ cd build +$ cmake .. +$ make ds18b20_temp_flash +$ miniterm.py /dev/ttyUSB0 74880 +``` diff --git a/examples/ds18b20_temp/main.c b/examples/ds18b20_temp/main.c new file mode 100644 index 0000000..ab0e721 --- /dev/null +++ b/examples/ds18b20_temp/main.c @@ -0,0 +1,81 @@ +/* + * Copyright 2017 Rafal Zajac . + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + + +#include +#include +#include +#include +#include +#include +#include + +// List of found devices on the OneWire bus. +static esp_ow_device *root = NULL; + + +// Handle temperature conversion callbacks. +static void ICACHE_FLASH_ATTR +temperature(const char *event, void *arg) +{ + esp_ow_device *dev = arg; + esp_ds18b20_st *st = dev->custom; + + if (st->last_temp == ESP_DS18B20_TEMP_ERR) { + os_printf("Temperature read error.\n"); + } else { + os_printf("Temperature: %s\n", esp_util_ftoa(st->last_temp, 4)); + } +} + +static void ICACHE_FLASH_ATTR +sys_init_done() +{ + esp_ow_err err; + + if (esp_ds18b20_init(GPIO2) == false) { + os_printf("Error initializing DS18B20.\n"); + return; + } + + err = esp_ds18b20_search(GPIO2, false, &root); + if (err != ESP_OW_OK) { + os_printf("Search error: %d\n", err); + return; + } + + if (root == NULL) { + os_printf("No devices found.\n"); + } + + // Callbacks will be called when conversion is finished. + esp_eb_attach(ESP_DS18B20_EV_TEMP_READY, temperature); + esp_eb_attach(ESP_DS18B20_EV_TEMP_ERROR, temperature); + + // Get temperature from the first DS18B20 sensor. + esp_ds18b20_convert(root); +} + +void ICACHE_FLASH_ATTR +user_init() +{ + // No need for wifi for this examples. + wifi_station_disconnect(); + wifi_set_opmode_current(NULL_MODE); + + stdout_init(BIT_RATE_74880); + system_init_done_cb(sys_init_done); +} diff --git a/examples/include/user_config.h b/examples/include/user_config.h new file mode 100644 index 0000000..780488c --- /dev/null +++ b/examples/include/user_config.h @@ -0,0 +1 @@ +// This is only here to make the API headers happy. diff --git a/examples/sht21_example/CMakeLists.txt b/examples/sht21_example/CMakeLists.txt new file mode 100644 index 0000000..d7d86bf --- /dev/null +++ b/examples/sht21_example/CMakeLists.txt @@ -0,0 +1,34 @@ +# Copyright 2017 Rafal Zajac . +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + + +find_package(esp_sdo REQUIRED) +find_package(esp_i2c REQUIRED) +find_package(esp_util REQUIRED) + +add_executable(sht21_example main.c ${ESP_USER_CONFIG}) + +target_include_directories(sht21_example PUBLIC + ${ESP_USER_CONFIG_DIR} + ${esp_sdo_INCLUDE_DIRS} + ${esp_i2c_INCLUDE_DIRS} + ${esp_util_INCLUDE_DIRS}) + +target_link_libraries(sht21_example + ${esp_sdo_LIBRARIES} + ${esp_i2c_LIBRARIES} + ${esp_util_LIBRARIES} + esp_sht21) + +esp_gen_exec_targets(sht21_example) diff --git a/examples/sht21_example/README.md b/examples/sht21_example/README.md new file mode 100644 index 0000000..7644cca --- /dev/null +++ b/examples/sht21_example/README.md @@ -0,0 +1,15 @@ +## SHT21 example. + +Demonstrates how to: +- get serial number, +- get firmware version, +- get humidity and temperature. + +## Flashing + +``` +$ cd build +$ cmake .. +$ make sht21_example_flash +$ miniterm.py /dev/ttyUSB0 74880 +``` diff --git a/examples/sht21_example/main.c b/examples/sht21_example/main.c new file mode 100644 index 0000000..1b6d538 --- /dev/null +++ b/examples/sht21_example/main.c @@ -0,0 +1,131 @@ +/* + * Copyright 2017 Rafal Zajac . + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +#include +#include +#include +#include + +#define SCL GPIO0 +#define SDA GPIO2 + +os_timer_t timer; + +/** + * Rise base to power of. + * + * From: http://bbs.espressif.com/viewtopic.php?t=246 + * + * @param base The number. + * @param exp The exponent. + * + * @return Product. + */ +static int ICACHE_FLASH_ATTR +power(int base, int exp) +{ + int result = 1; + while (exp) { + result *= base; + exp--; + } + + return result; +} + +/** + * Get string representation of float. + * + * From: http://bbs.espressif.com/viewtopic.php?t=246 + * + * Warning: limited to 15 chars & non-reentrant. + * e.g., don't use more than once per os_printf call. + * + * @param num The float to convert to string. + * @param decimals The number of decimal places. + * + * @return The float string representation. + */ +static char *ICACHE_FLASH_ATTR +ftoa(float num, uint8_t decimals) +{ + static char *buf[16]; + + int whole = (int) num; + int decimal = (int) ((num - whole) * power(10, decimals)); + if (decimal < 0) { + // get rid of sign on decimal portion + decimal -= 2 * decimal; + } + + char *pattern[10]; // setup printf pattern for decimal portion + os_sprintf((char *) pattern, "%%d.%%0%dd", decimals); + os_sprintf((char *) buf, (const char *) pattern, whole, decimal); + + return (char *) buf; +} + +void ICACHE_FLASH_ATTR +run_sht21() +{ + uint8_t rev; + float value; + uint8_t sn[8]; + esp_i2c_err err; + + err = esp_sht21_init(SCL, SDA); + if (err != ESP_I2C_OK) { + os_printf("SHT21 init error.\n"); + return; + } + + err = esp_sht21_get_sn(sn); + if (err != ESP_I2C_OK) os_printf("SHT21 sn error %d.\n", err); + + os_printf("SHT21 SN: %02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X\n", + sn[0], sn[1], sn[2], sn[3], + sn[4], sn[5], sn[6], sn[7]); + + err = esp_sht21_get_rev(&rev); + if (err != ESP_I2C_OK) os_printf("SHT21 sn error %d.\n", err); + + os_printf("Firmware rev: 0x%02X\n", rev); + + err = esp_sht21_get_rh(&value); + if (err != ESP_I2C_OK) os_printf("Get RH error: %d\n", err); + + os_printf("Humidity: %s%%\n", ftoa(value, 2)); + + err = esp_sht21_get_temp_last(&value); + if (err != ESP_I2C_OK) os_printf("Get TEMP error: %d\n", err); + + os_printf("Temperature: %s deg. C\n", ftoa(value, 2)); +} + +void ICACHE_FLASH_ATTR +user_init() +{ + // We don't need WiFi for this example. + wifi_station_disconnect(); + wifi_set_opmode(NULL_MODE); + + stdout_init(BIT_RATE_74880); + os_printf("Starting...\n"); + + os_timer_disarm(&timer); + os_timer_setfn(&timer, (os_timer_func_t *) run_sht21, NULL); + os_timer_arm(&timer, 1500, false); +} diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..b7cf6ad --- /dev/null +++ b/install.sh @@ -0,0 +1,63 @@ +#!/usr/bin/env bash + +# Copyright 2017 Rafal Zajac . +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +# ESP8266 library installation script. +# +# Installer expects that: +# - The ESPROOT environment variable set. +# - The esp-open-sdk is installed and compiled at ESPROOT/esp-open-sdk. + +# The full GitHub URL to the library. +LIB_FULL_NAME="rzajac/esp-drv" + +# No modifications below this comment unless you know what you're doing. + +TMP_DIR=`mktemp -d` +LIB_REPO="https://github.com/${LIB_FULL_NAME}" +LIB_NAME=${LIB_FULL_NAME##*/} +CMAKE=`which cmake` + +# Remove temporary directory. +function rm_tmp() { + echo "Removing ${TMP_DIR}" + rm -rf ${TMP_DIR} +} + +# Check / set ESPROOT. +if [ "${ESPROOT}" == "" ]; then ESPROOT=$HOME/esproot; fi +if ! [ -d "${ESPROOT}" ]; then mkdir -p ${ESPROOT}; fi +echo "Using ${ESPROOT} as ESPROOT" + +echo "Cloning ${LIB_REPO} to temporary directory ${TMP_DIR}." +git clone ${LIB_REPO} ${TMP_DIR} +if [ $? != 0 ]; then + echo "Error: Cloning ${LIB_REPO} failed!" + rm_tmp + exit 1 +fi + +echo "Installing library ${LIB_NAME} to ${ESPROOT}" +mkdir ${TMP_DIR}/auto-build +(cd ${TMP_DIR}/auto-build && ${CMAKE} .. && make install) +if [ $? != 0 ]; then + echo "Error: Installing library ${LIB_NAME} failed!" + rm_tmp + exit 1 +fi + +rm_tmp + +exit 0 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..aae6ab3 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,18 @@ +# Copyright 2017 Rafal Zajac . +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + + +add_subdirectory(esp_ds18b20) +add_subdirectory(esp_dht22) +add_subdirectory(esp_sht21) diff --git a/src/esp_dht22/CMakeLists.txt b/src/esp_dht22/CMakeLists.txt new file mode 100644 index 0000000..bf16851 --- /dev/null +++ b/src/esp_dht22/CMakeLists.txt @@ -0,0 +1,32 @@ +# Copyright 2017 Rafal Zajac . +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + + +project(esp_dht22 C) + +find_package(esp_gpio REQUIRED) + +add_library(esp_dht22 STATIC + esp_dht22.c + include/esp_dht22.h) + +target_include_directories(esp_dht22 PUBLIC + $ + $ + ${esp_gpio_INCLUDE_DIRS} + ${ESP_USER_CONFIG_DIR}) + +esp_gen_lib(esp_dht22 + ${ESP_CMAKE_FIND_DIR} + ${esp_gpio_LIBRARIES}) diff --git a/src/esp_dht22/Findesp_dht22.cmake b/src/esp_dht22/Findesp_dht22.cmake new file mode 100644 index 0000000..e601124 --- /dev/null +++ b/src/esp_dht22/Findesp_dht22.cmake @@ -0,0 +1,46 @@ +# Copyright 2017 Rafal Zajac . +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +# Try to find esp_dht22 +# +# Once done this will define: +# +# esp_dht22_FOUND - System found the library. +# esp_dht22_INCLUDE_DIR - The library include directory. +# esp_dht22_INCLUDE_DIRS - If library has dependencies this will be set +# to _INCLUDE_DIR [, ...]. +# esp_dht22_LIBRARY - The path to the library. +# esp_dht22_LIBRARIES - The dependencies to link to use the library. +# It will have a form of _LIBRARY [dep1_name_LIBRARIES, ...]. +# + + +find_path(esp_dht22_INCLUDE_DIR esp_dht22.h) +find_library(esp_dht22_LIBRARY NAMES esp_dht22) + +find_package(esp_gpio REQUIRED) + +include(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(esp_dht22 + DEFAULT_MSG + esp_dht22_LIBRARY + esp_dht22_INCLUDE_DIR) + +set(esp_dht22_INCLUDE_DIRS + ${esp_dht22_INCLUDE_DIR} + ${esp_gpio_INCLUDE_DIRS}) + +set(esp_dht22_LIBRARIES + ${esp_dht22_LIBRARY} + ${esp_gpio_LIBRARIES}) diff --git a/src/esp_dht22/README.md b/src/esp_dht22/README.md new file mode 100644 index 0000000..ca2d183 --- /dev/null +++ b/src/esp_dht22/README.md @@ -0,0 +1,13 @@ +## DHT22 (AM2302) driver for ESP8266. + +ESP8266 driver for very popular DHT22 (AM2302) temperature and humidity sensor. + +![DHT22](../../doc/dht22-pinout.jpg) + +Before you can get the temperature and humidity from DHT22 you have to call +`esp_dht22_init`. You need to call it only once unless you change the GPIO +pin setup somewhere else in your code. + + +See driver documentation in [esp_dht22.h](include/esp_dht22.h) header file +for more details. diff --git a/src/esp_dht22/esp_dht22.c b/src/esp_dht22/esp_dht22.c new file mode 100644 index 0000000..352ebb3 --- /dev/null +++ b/src/esp_dht22/esp_dht22.c @@ -0,0 +1,178 @@ +/* + * Copyright 2017 Rafal Zajac . + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +#include +#include +#include +#include + +#define BUS_LOW(gpio_num) (GPIO_OUT_EN_S = (0x1 << (gpio_num))) +#define BUS_HIGH(gpio_num) (GPIO_OUT_EN_C = (0x1 << (gpio_num))) +#define BUS_RELEASE(gpio_num) (GPIO_OUT_EN_C = (0x1 << (gpio_num))) +#define BUS_READ(gpio_num) ((GPIO_IN & (0x1 << (gpio_num))) != 0) + +/** + * Measure number of 10us slots the state was kept. + * + * The maximum wait time for GPIO to change state is 500us. + * + * @param gpio_num The GPIO number. + * @param exp_state The state. + * + * @return The number time slots. + */ +static uint8_t ICACHE_FLASH_ATTR +state_lenght(uint8_t gpio_num, bool exp_state) +{ + uint8_t slot = 0; + + while (BUS_READ(gpio_num) == exp_state) { + if (slot++ > 50) break; + os_delay_us(8); + } + + return slot; +} + +/** + * Calculate temperature. + * + * @param data The pointer to 5 bytes read from the bus. + * + * @return Temperature in Celsius. + */ +static float calc_temp(const uint8_t *data) +{ + // Remove negative temp indicator bit. + float temp = data[2] & 0x7F; + temp *= 0x100; + temp += data[3]; + temp /= 10; + if ((data[2] & 0x80) > 0) temp *= -1; + + return temp; +} + +void ICACHE_FLASH_ATTR +esp_dht22_init(uint8_t gpio_num) +{ + esp_gpio_setup(gpio_num, GPIO_MODE_INPUT_PULLUP); +} + +esp_dht22_dev *ICACHE_FLASH_ATTR +esp_dht22_new_dev(uint8_t gpio_num) +{ + esp_dht22_dev *dev = os_zalloc(sizeof(esp_dht22_dev)); + if (dev == NULL) return NULL; + + dev->gpio_num = gpio_num; + + return dev; +} + +esp_dht22_err ICACHE_FLASH_ATTR +esp_dht22_get(esp_dht22_dev *device) +{ + uint16_t cnt = 0; + // The humidity, temperature and parity data. + uint8_t *data; + // Current byte index in data (0-4). + int8_t data_byte_idx = 0; + // Current mask for data byte. We start with MSB. + uint8_t data_byte_mask = 0x80; + // The bit from the bus. + bool bit; + // Previous bit. + bool prev_bit = false; + // Number of high states. + uint8_t high_cnt = 0; + + if (device == NULL) return ESP_DHT22_ERR_DEV_NULL; + + data = os_zalloc(5); + if (data == NULL) return ESP_DHT22_ERR_MEM; + + // Emmit start signal. + BUS_LOW(device->gpio_num); + os_delay_us(820); + + // End start signal. + BUS_RELEASE(device->gpio_num); + os_delay_us(25); + + // Entering time critical code. + ETS_GPIO_INTR_DISABLE(); + + // Device responds with 80us low followed by 80us high. + cnt = state_lenght(device->gpio_num, 0); + if (cnt < 8 || cnt > 10) { + ETS_GPIO_INTR_ENABLE(); + return ESP_DHT22_ERR_BAD_RESP_SIGNAL; + } + + cnt = state_lenght(device->gpio_num, 1); + if (cnt < 8 || cnt > 10) { + ETS_GPIO_INTR_ENABLE(); + return ESP_DHT22_ERR_BAD_RESP_SIGNAL; + } + + // Sample data bus for 40 bits. + // + // Device transmits + // - 0 as 50us low followed by 25us high (total 75us). + // - 1 as 50us low followed by 70us high (total 120us). + // + // Data is transmitted MSB first. + // + // This means 40 bits transfer takes between 3000us and 4800us. + // The code below samples the bus no more then 4800us (10us * 480). + // During that time we count falling edges and count number of + // high states seen since last falling edge. The number of seen + // high states tells us if this was o or 1. + do { + bit = BUS_READ(device->gpio_num); + if (bit) high_cnt++; + if (bit == false && prev_bit == true) { + if (high_cnt >= 6) data[data_byte_idx] |= data_byte_mask; + high_cnt = 0; + data_byte_mask >>= 1; + if (data_byte_mask == 0) { + data_byte_idx++; + data_byte_mask = 0x80; + } + } + prev_bit = bit; + cnt++; + os_delay_us(10); + } while (data_byte_idx < 5 && cnt <= 480); + + ETS_GPIO_INTR_ENABLE(); + + device->last_measure = system_get_time(); + + if (((uint8_t) (data[0] + data[1] + data[2] + data[3])) != data[4]) { + return ESP_DHT22_ERR_PARITY; + } + + device->temp = calc_temp(data); + device->hum = data[0] * 0x100; + device->hum += data[1]; + device->hum /= 10; + + //os_free(data); + return ESP_DHT22_OK; +} + diff --git a/src/esp_dht22/include/esp_dht22.h b/src/esp_dht22/include/esp_dht22.h new file mode 100644 index 0000000..83cd057 --- /dev/null +++ b/src/esp_dht22/include/esp_dht22.h @@ -0,0 +1,75 @@ +/* + * Copyright 2017 Rafal Zajac . + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +#ifndef ESP_DHT22_H +#define ESP_DHT22_H + +#include + +// Structure representing DHT22 device. +typedef struct { + float hum; // Humidity. + float temp; // Temperature in Celsius. + uint8_t gpio_num; // The GPIO this device is connected to. + uint32_t last_measure; // Last measure time. Uses system_get_time(). +} esp_dht22_dev; + +// Error codes. +typedef enum { + ESP_DHT22_OK, + ESP_DHT22_ERR_MEM, + ESP_DHT22_ERR_DEV_NULL, + ESP_DHT22_ERR_BAD_RESP_SIGNAL, + ESP_DHT22_ERR_PARITY, +} esp_dht22_err; + +// Espressif SDK missing includes. +void ets_isr_mask(unsigned intr); +void ets_isr_unmask(unsigned intr); + +/** + * Initialize DHT22. + * + * @param gpio_num The GPIO number DHT22 is connected to. + */ +void ICACHE_FLASH_ATTR +esp_dht22_init(uint8_t gpio_num); + +/** + * Get DHT22 structure. + * + * It's up to a caller to release the memory at some point. + * + * @param gpio_num The GPIO number connected to the data bus. + * + * @return Device. + */ +esp_dht22_dev *ICACHE_FLASH_ATTR +esp_dht22_new_dev(uint8_t gpio_num); + +/** + * Get temperature and humidity. + * + * NOTE: You must keep calls to this function at least 2s apart. + * + * @param device The device structure to set values on. + * + * @return Error code. + */ +esp_dht22_err ICACHE_FLASH_ATTR +esp_dht22_get(esp_dht22_dev *device); + +#endif //ESP_DHT22_H diff --git a/src/esp_ds18b20/CMakeLists.txt b/src/esp_ds18b20/CMakeLists.txt new file mode 100644 index 0000000..f4bfcc0 --- /dev/null +++ b/src/esp_ds18b20/CMakeLists.txt @@ -0,0 +1,38 @@ +# Copyright 2017 Rafal Zajac . +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + + +project(esp_ds18b20 C) + +find_package(esp_ow REQUIRED) +find_package(esp_eb REQUIRED) +find_package(esp_tim REQUIRED) + +add_library(esp_ds18b20 STATIC + esp_ds18b20.c + include/esp_ds18b20.h) + +target_include_directories(esp_ds18b20 PUBLIC + $ + $ + ${esp_ow_INCLUDE_DIRS} + ${esp_eb_INCLUDE_DIRS} + ${esp_tim_INCLUDE_DIRS} + ${ESP_USER_CONFIG_DIR}) + +esp_gen_lib(esp_ds18b20 + ${ESP_CMAKE_FIND_DIR} + ${esp_ow_LIBRARIES} + ${esp_eb_LIBRARIES} + ${esp_tim_LIBRARIES}) diff --git a/src/esp_ds18b20/Findesp_ds18b20.cmake b/src/esp_ds18b20/Findesp_ds18b20.cmake new file mode 100644 index 0000000..bcfeb80 --- /dev/null +++ b/src/esp_ds18b20/Findesp_ds18b20.cmake @@ -0,0 +1,52 @@ +# Copyright 2017 Rafal Zajac . +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +# Try to find esp_ds18b20 +# +# Once done this will define: +# +# esp_ds18b20_FOUND - System found the library. +# esp_ds18b20_INCLUDE_DIR - The library include directory. +# esp_ds18b20_INCLUDE_DIRS - If library has dependencies this will be set +# to _INCLUDE_DIR [, ...]. +# esp_ds18b20_LIBRARY - The path to the library. +# esp_ds18b20_LIBRARIES - The dependencies to link to use the library. +# It will have a form of _LIBRARY [dep1_name_LIBRARIES, ...]. +# + + +find_path(esp_ds18b20_INCLUDE_DIR esp_ds18b20.h) +find_library(esp_ds18b20_LIBRARY NAMES esp_ds18b20) + +find_package(esp_ow REQUIRED) +find_package(esp_eb REQUIRED) +find_package(esp_tim REQUIRED) + +include(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(esp_ds18b20 + DEFAULT_MSG + esp_ds18b20_LIBRARY + esp_ds18b20_INCLUDE_DIR) + +set(esp_ds18b20_INCLUDE_DIRS + ${esp_ds18b20_INCLUDE_DIR} + ${esp_ow_INCLUDE_DIRS} + ${esp_eb_INCLUDE_DIRS} + ${esp_tim_INCLUDE_DIRS}) + +set(esp_ds18b20_LIBRARIES + ${esp_ds18b20_LIBRARY} + ${esp_ow_LIBRARIES} + ${esp_eb_LIBRARIES} + ${esp_tim_LIBRARIES}) diff --git a/src/esp_ds18b20/README.md b/src/esp_ds18b20/README.md new file mode 100644 index 0000000..81f1332 --- /dev/null +++ b/src/esp_ds18b20/README.md @@ -0,0 +1,45 @@ +## DS18B20 driver for ESP8266. + +Full featured DS18B20 digital thermometer driver. + +![DS18B20](../../doc/ds18b20.jpg) + +Before you can get the temperature from DS18B20 you have to call +`esp_ds18b20_init`. You need to call it only once unless you change the GPIO +pin setup somewhere else in your code. + +To find device(s) on the OneWire bus you can use `esp_ds18b20_search` which +will give you linked list of `esp_ow_device` devices. + +It's up to the user to release memory allocated for the linked list with +library provided helper function `esp_ds18b20_free_list` when it's not needed +anymore. + +Most of the operations with the DS18B20 library is based on passing pointers +to the `esp_ow_device` structure which has pointer to `esp_ds18b20_st` +status structure. The `esp_ds18b20_st` keeps track of last scratch pad read +the last temperature conversion. + +``` +esp_ow_device *device; +esp_ds18b20_st *st = device->custom; +``` + +If you already know the ROM address of your device you can use +`esp_ds18b20_new_dev`: + +``` +uint8_t rom[8] = {0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0} +esp_ow_dev *device = esp_ds18b20_new_dev(rom); + +``` + +With DS18B20 temperature measurement takes between 94 and 750ms depending +on resolution. You don't want to block the CPU for that long waiting for +example using some kind of delay. That's why library is using event bus +(esp_eb) to emmit events when the temperature conversion is ready to read. +Check [example program](../../examples/ds18b20_temp) to see how it should be +done. + +See driver documentation in [esp_ds18b20.h](include/esp_ds18b20.h) header file +for more details. diff --git a/src/esp_ds18b20/esp_ds18b20.c b/src/esp_ds18b20/esp_ds18b20.c new file mode 100644 index 0000000..8746511 --- /dev/null +++ b/src/esp_ds18b20/esp_ds18b20.c @@ -0,0 +1,305 @@ +/* + * Copyright 2017 Rafal Zajac . + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + + +#include +#include +#include +#include + + +/** + * Decode temperature. + * + * @param sp The address for first scrachpad byte. + * + * @return The temperature. + */ +float ICACHE_FLASH_ATTR +decode_temp(const uint8_t *sp) +{ + bool minus; + uint8_t integer = 0; + float decimal = 0; + + // Get only bits responsible for temperature and sign. + int16_t temp = sp[0] | (sp[1] << 8); + minus = (temp & 0x8000) > 0; + + // Detect negative number. + if (minus) { + temp = (int16_t) (~temp + 1); // 2's complement. + } + + // Remove fraction. + integer = (uint8_t) (temp >> 4); + // take only 3 LSB form MSB. + integer |= ((temp >> 8) & 0x07) << 4; + + // Calculate fraction accounting for resolution. + switch ((sp[4] & 0x60) >> 5) { + case ESP_DS18B20_RES_12: + decimal = (temp & 0x0F) * ((float) ESP_DS18B20_STEP_12); + break; + + case ESP_DS18B20_RES_11: + decimal = ((temp >> 1) & 0x07) * ((float) ESP_DS18B20_STEP_11); + break; + + case ESP_DS18B20_RES_10: + decimal = ((temp >> 2) & 0x03) * ((float) ESP_DS18B20_STEP_10); + break; + + case ESP_DS18B20_RES_9: + decimal = ((temp >> 3) & 0x01) * ((float) ESP_DS18B20_STEP_9); + break; + + default: + decimal = 0; + } + + decimal = integer + decimal; + if (minus) decimal = 0 - decimal; + + return decimal; +} + +esp_ow_err ICACHE_FLASH_ATTR +esp_d18b20_read_sp(esp_ow_device *device) +{ + uint8_t idx; + uint8_t crc = 0; + + esp_ds18b20_st *st = device->custom; + + if (esp_ow_reset(device->gpio_num) == false) { + st->retries = -1; + return ESP_OW_ERR_NO_DEV; + } + + esp_ow_match_dev(device); + esp_ow_write(device->gpio_num, ESP_DS18B20_CMD_READ_SP); + esp_ow_read_bytes(device->gpio_num, st->sp, 9); + + for (idx = 0; idx < 9; idx++) { + crc = esp_ow_crc8(crc, st->sp[idx]); + } + + if (crc != 0) { + memset(st->sp, 0, 9); + return ESP_OW_ERR_BAD_CRC; + } + + return ESP_OW_OK; +} + +esp_ow_err ICACHE_FLASH_ATTR +esp_ds18b20_write_sp(esp_ow_device *device) +{ + uint8_t *start; + esp_ds18b20_st *st = device->custom; + + if (esp_ow_reset(device->gpio_num) == false) { + return ESP_OW_ERR_NO_DEV; + } + + esp_ow_match_dev(device); + esp_ow_write(device->gpio_num, ESP_DS18B20_CMD_WRITE_SP); + + // We transmit only 3 bytes (Th, Tl, cfg). + start = &st->sp[2]; + + esp_ow_write_bytes(device->gpio_num, start, 3); + + return ESP_OW_OK; +} + +esp_ow_err ICACHE_FLASH_ATTR +read_temp(esp_ow_device *device) +{ + esp_ds18b20_st *st = device->custom; + esp_ow_err err = esp_d18b20_read_sp(device); + + st->retries = -1; + if (err != ESP_OW_OK) return err; + + st->last_temp = decode_temp(st->sp); + + return ESP_OW_OK; +} + +static void ICACHE_FLASH_ATTR +start_conversion(void *arg) +{ + esp_tim_timer *timer = arg; + + bool done = false; + esp_ow_device *dev = timer->payload; + esp_ds18b20_st *st = dev->custom; + uint32_t sample_count = 200; + + st->retries++; + + do { + if (esp_ow_read_bit(dev->gpio_num)) { + done = true; + break; + } + os_delay_us(5); + sample_count--; + } while (sample_count > 0); + + if (done == true) { + if (read_temp(dev) != ESP_OW_OK) { + esp_eb_trigger(ESP_DS18B20_EV_TEMP_ERROR, dev); + } else { + esp_eb_trigger(ESP_DS18B20_EV_TEMP_READY, dev); + } + } else { + // The worst case from datasheet is 750ms when + // 12 bits of resolution is set. + // Each call to this function takes about 200*5us (1ms). + // If temperature is not available we call ourselves again + // after 10ms. That gives 11ms per call. 68 calls * 11ms = 748ms. + // This condition basically makes sure we are not + // calling ourselves forever. + if (st->retries > 68) { + st->retries = -1; + esp_eb_trigger(ESP_DS18B20_EV_TEMP_ERROR, dev); + } else { + // Try again. + esp_tim_continue(timer); + } + } +} + +bool ICACHE_FLASH_ATTR +esp_ds18b20_init(uint8_t gpio_num) +{ + esp_ow_init(gpio_num); + + return true; +} + +esp_ow_err ICACHE_FLASH_ATTR +esp_ds18b20_search(uint8_t gpio_num, bool in_alert, esp_ow_device **list) +{ + esp_ow_device *curr; + + esp_ow_cmd cmd = in_alert ? ESP_OW_CMD_SEARCH_ROM_ALERT : ESP_OW_CMD_SEARCH_ROM; + esp_ow_err err = esp_ow_search_family(gpio_num, cmd, ESP_DS18B20_FAMILY_CODE, list); + if (err != ESP_OW_OK) return err; + + curr = *list; + while (curr) { + curr->custom = os_zalloc(sizeof(esp_ds18b20_st)); + ((esp_ds18b20_st *) curr->custom)->last_temp = ESP_DS18B20_TEMP_ERR; + ((esp_ds18b20_st *) curr->custom)->retries = -1; + curr = curr->next; + } + + return err; +} + +esp_ow_device *ICACHE_FLASH_ATTR +esp_ds18b20_new_dev(uint8_t *rom) +{ + esp_ow_device *device = os_zalloc(sizeof(esp_ow_device)); + esp_ds18b20_st *st = os_zalloc(sizeof(esp_ds18b20_st)); + + os_memcpy(device->rom, rom, 8); + st->last_temp = ESP_DS18B20_TEMP_ERR; + st->retries = -1; + device->custom = st; + + return device; +} + + +esp_ow_device *ICACHE_FLASH_ATTR +esp_ds18b20_get(uint8_t gpio_num) +{ + return esp_ow_read_rom_dev(gpio_num); +} + +esp_ow_err ICACHE_FLASH_ATTR +esp_ds18b20_get_alarm(esp_ow_device *dev, int8_t *low, int8_t *high) +{ + esp_ds18b20_st *st = dev->custom; + esp_ow_err err = esp_d18b20_read_sp(dev); + if (err != ESP_OW_OK) return err; + + *low = st->sp[3]; + *high = st->sp[2]; + + return ESP_OW_OK; +} + +esp_ow_err ICACHE_FLASH_ATTR +esp_ds18b20_set_alarm(esp_ow_device *dev, int8_t low, int8_t high) +{ + esp_ds18b20_st *st = dev->custom; + esp_ow_err err = esp_d18b20_read_sp(dev); + if (err != ESP_OW_OK) return err; + + st->sp[3] = low; + st->sp[2] = high; + + return esp_ds18b20_write_sp(dev); +} + +void ICACHE_FLASH_ATTR +esp_ds18b20_free_list(esp_ow_device *list) +{ + esp_ow_free_device_list(list, true); +} + +esp_ds18b20_err ICACHE_FLASH_ATTR +esp_ds18b20_convert(esp_ow_device *device) +{ + esp_ds18b20_st *st = device->custom; + + // We are already waiting for the conversion. + if (st->retries >= 0) return ESP_DS18B20_ERR_CONV_IN_PROG; + + if (esp_ow_reset(device->gpio_num) == false) return ESP_DS18B20_NO_DEV; + + // Send conversion command. + esp_ow_match_dev(device); + esp_ow_write(device->gpio_num, ESP_DS18B20_CMD_CONVERT); + + if (esp_tim_start(start_conversion, device)) { + st->retries = 0; + } + + return ESP_DS18B20_OK; +} + +bool ICACHE_FLASH_ATTR +esp_ds18b20_has_parasite(uint8_t gpio_num) +{ + bool has_parasite; + + if (esp_ow_reset(gpio_num) == false) { + return false; // No devices. + } + + esp_ow_write(gpio_num, ESP_OW_CMD_SKIP_ROM); + esp_ow_write(gpio_num, ESP_DS18B20_CMD_READ_PWR); + has_parasite = !esp_ow_read_bit(gpio_num); + + return has_parasite; +} diff --git a/src/esp_ds18b20/include/esp_ds18b20.h b/src/esp_ds18b20/include/esp_ds18b20.h new file mode 100644 index 0000000..f5318e7 --- /dev/null +++ b/src/esp_ds18b20/include/esp_ds18b20.h @@ -0,0 +1,187 @@ +/* + * Copyright 2017 Rafal Zajac . + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +#ifndef ESP_DS18B20_H +#define ESP_DS18B20_H + +#include +#include + +// The DS18B20 family code from datasheet. +#define ESP_DS18B20_FAMILY_CODE 0x28 + +// The absolute zero temperature is returned as error. +#define ESP_DS18B20_TEMP_ERR (-273) + +// Temperature conversion ready. +#define ESP_DS18B20_EV_TEMP_READY "ds18b20tReady" +// Temperature conversion error. +#define ESP_DS18B20_EV_TEMP_ERROR "ds18b20tError" + +// Temperature resolutions. +#define ESP_DS18B20_RES_9 0x0 +#define ESP_DS18B20_RES_10 0x1 +#define ESP_DS18B20_RES_11 0x2 +#define ESP_DS18B20_RES_12 0x3 + +// Temperature steps. +#define ESP_DS18B20_STEP_9 0.5 +#define ESP_DS18B20_STEP_10 0.25 +#define ESP_DS18B20_STEP_11 0.125 +#define ESP_DS18B20_STEP_12 0.0625 + +// OneWire commands. +typedef enum { + ESP_DS18B20_CMD_READ_PWR = 0xB4, + ESP_DS18B20_CMD_CONVERT = 0x44, + ESP_DS18B20_CMD_READ_SP = 0xBE, + ESP_DS18B20_CMD_WRITE_SP = 0x4E, +} esp_ds18b20_cmd; + +typedef enum { + ESP_DS18B20_OK, + ESP_DS18B20_NO_DEV, + ESP_DS18B20_ERR_CONV_IN_PROG, // Conversion in progress. +} esp_ds18b20_err; + +// DS18B20 status. +typedef struct { + uint8_t sp[9]; + int8_t retries; // Is greater then zero when conversion in progress. + float last_temp; // Last successful temperature read. +} esp_ds18b20_st; + + +/** + * Initialize OneWire bus where DS18B20 is. + * + * To use many OneWire buses you have to initialize all of them. + * + * @param gpio_num The GPIO where OneWire bus is connected. + * + * @return Returns true on success, false otherwise. + */ +bool ICACHE_FLASH_ATTR +esp_ds18b20_init(uint8_t gpio_num); + +/** + * Find devices on OneWire bus. + * + * @param in_alert Find only devices in alert mode. + * @param list The list of found devices or NULL. + * + * @return OneWire error code. + */ +esp_ow_err ICACHE_FLASH_ATTR +esp_ds18b20_search(uint8_t gpio_num, bool in_alert, esp_ow_device **list); + +/** + * Construct DS18B20 device. + * + * It's up to a caller to release the memory at some point. + * + * @param rom The pointer to 8 byte ROM address + * + * @return The device. + */ +esp_ow_device *ICACHE_FLASH_ATTR +esp_ds18b20_new_dev(uint8_t *rom); + +/** + * Get the only device on the bus. + * + * Can be used only when there is only one device on the OneWire bus! + * + * @param gpio_num The GPIO where OneWire bus is connected. + * + * @return The OneWire device. On error ROM address has all zeros. + */ +esp_ow_device *ICACHE_FLASH_ATTR +esp_ds18b20_get(uint8_t gpio_num); + +/** + * Get DS18B20 alarm thresholds. + * + * @param dev The device to get alarm thresholds for. + * @param low The low threshold in Celsius. + * @param high The high threshold in Celsius. + * + * @return OneWire error code. + */ +esp_ow_err ICACHE_FLASH_ATTR +esp_ds18b20_get_alarm(esp_ow_device *dev, int8_t *low, int8_t *high); + +/** + * Set DS18B20 alarm thresholds. + * + * @param dev The device to get alarm thresholds for. + * @param low The low threshold in Celsius. + * @param high The high threshold in Celsius. + * + * @return OneWire error code. + */ +esp_ow_err ICACHE_FLASH_ATTR +esp_ds18b20_set_alarm(esp_ow_device *dev, int8_t low, int8_t high); + +/** + * Read scrachpad. + * + * @param device The device to read scratchpad for. + * + * @return OneWire error code. + */ +esp_ow_err ICACHE_FLASH_ATTR +esp_d18b20_read_sp(esp_ow_device *device); + +/** + * Write scratchpad to the device. + * + * @param device The device to write scratchpad to. + * + * @return OneWire error code. + */ +esp_ow_err ICACHE_FLASH_ATTR +esp_ds18b20_write_sp(esp_ow_device *device); + +/** + * Free memory allocated by devices found on OneWire bus. + * + * @param list + */ +void ICACHE_FLASH_ATTR +esp_ds18b20_free_list(esp_ow_device *list); + +/** + * Start temperature conversion. + * + * @param device The device to start conversion on. + * + * @return Error code. + */ +esp_ds18b20_err ICACHE_FLASH_ATTR +esp_ds18b20_convert(esp_ow_device *device); + +/** + * Check if OneWire bus has device with parasite power supply. + * + * @param gpio_num The GPIO where OneWire bus is connected. + * + * @return Returns true if parasite present, false otherwise. + */ +bool ICACHE_FLASH_ATTR +esp_ds18b20_has_parasite(uint8_t gpio_num); + +#endif //ESP_DS18B20_H diff --git a/src/esp_sht21/CMakeLists.txt b/src/esp_sht21/CMakeLists.txt new file mode 100644 index 0000000..8985324 --- /dev/null +++ b/src/esp_sht21/CMakeLists.txt @@ -0,0 +1,33 @@ +# Copyright 2017 Rafal Zajac . +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + + +project(esp_sht21 C) + +find_package(esp_i2c REQUIRED) + +add_library(esp_sht21 STATIC + esp_sht21.c + include/esp_sht21.h) + +target_include_directories(esp_sht21 PUBLIC + $ + $ + ${esp_i2c_INCLUDE_DIRS} + ${ESP_USER_CONFIG_DIR}) + +esp_gen_lib(esp_sht21 + ${ESP_CMAKE_FIND_DIR} + ${esp_i2c_LIBRARIES} + ${esp_tim_LIBRARIES}) diff --git a/src/esp_sht21/Findesp_sht21.cmake b/src/esp_sht21/Findesp_sht21.cmake new file mode 100644 index 0000000..988d30a --- /dev/null +++ b/src/esp_sht21/Findesp_sht21.cmake @@ -0,0 +1,46 @@ +# Copyright 2017 Rafal Zajac . +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +# Try to find esp_sht21 +# +# Once done this will define: +# +# esp_sht21_FOUND - System found the library. +# esp_sht21_INCLUDE_DIR - The library include directory. +# esp_sht21_INCLUDE_DIRS - If library has dependencies this will be set +# to _INCLUDE_DIR [, ...]. +# esp_sht21_LIBRARY - The path to the library. +# esp_sht21_LIBRARIES - The dependencies to link to use the library. +# It will have a form of _LIBRARY [dep1_name_LIBRARIES, ...]. +# + + +find_path(esp_sht21_INCLUDE_DIR esp_sht21.h) +find_library(esp_sht21_LIBRARY NAMES esp_sht21) + +find_package(esp_i2c REQUIRED) + +include(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(esp_sht21 + DEFAULT_MSG + esp_sht21_LIBRARY + esp_sht21_INCLUDE_DIR) + +set(esp_sht21_INCLUDE_DIRS + ${esp_sht21_INCLUDE_DIR} + ${esp_i2c_INCLUDE_DIRS}) + +set(esp_sht21_LIBRARIES + ${esp_sht21_LIBRARY} + ${esp_i2c_LIBRARIES}) diff --git a/src/esp_sht21/README.md b/src/esp_sht21/README.md new file mode 100644 index 0000000..e782677 --- /dev/null +++ b/src/esp_sht21/README.md @@ -0,0 +1,18 @@ +## SHT21 driver for ESP8266. + +SHT21 a.k.a Si7021 driver for ESP8266. Features: + +![DS18B20](../../doc/sht21.jpg) + +- Humidity and temperature measurements. +- Get/set humidity and temperature measurement resolution. +- Get SHT21 serial number. +- Get SHT21 firmware revision. +- Turn on on-board heater to drive off condensation. + +Before you can start communicating with SHT21 you have to call +`esp_sht21_init`. You need to call it only once unless you change the GPIO +pins setup somewhere else in your code. + +See driver documentation in [esp_sht21.h](include/esp_sht21.h) header file +for more details. diff --git a/src/esp_sht21/esp_sht21.c b/src/esp_sht21/esp_sht21.c new file mode 100644 index 0000000..783b87d --- /dev/null +++ b/src/esp_sht21/esp_sht21.c @@ -0,0 +1,324 @@ +/* + * Copyright 2017 Rafal Zajac . + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +#include +#include + +static uint8_t ICACHE_FLASH_ATTR +calc_crc(uint8_t init, const uint8_t *data, uint8_t len) +{ + uint8_t idx; + uint8_t bit; + + // Calculates 8 bit checksum with polynomial 0x131 (10011001). + for (idx = 0; idx < len; idx++) { + init ^= (data[idx]); + for (bit = 0; bit < 8; bit++) { + if (init & 0x80) init = (uint8_t) ((init << 1) ^ 0x131); + else init = (init << 1); + } + } + + return init; +} + +esp_i2c_err ICACHE_FLASH_ATTR +esp_sht21_init(uint8_t gpio_scl, uint8_t gpio_sda) +{ + return esp_i2c_init(gpio_scl, gpio_sda); +} + +static float ICACHE_FLASH_ATTR +calc_rh(const uint8_t *data) +{ + float hu; + hu = (float) (125.0 / 65536.0); + hu = hu * (((data[0] << 8) | data[1]) & ~0x3); + + return hu - 6; +} + +static float ICACHE_FLASH_ATTR +calc_temp(const uint8_t *data) +{ + float temp; + temp = (float) (175.72 / 65536.0); + temp = temp * (((data[0] << 8) | data[1]) & ~0x3); + + return (float) (temp - 46.85); +} + +esp_i2c_err ICACHE_FLASH_ATTR +esp_sht21_get_rh(float *humidity) +{ + esp_i2c_err err; + uint8_t data[3]; + + *humidity = ESP_SHT21_BAD_RH; + + err = esp_i2c_start_read(ESP_SHT21_ADDRESS, ESP_SHT21_RH_HM); + if (err != ESP_I2C_OK) return err; + + err = esp_i2c_read_bytes(data, 3); + if (err != ESP_I2C_OK) return err; + + err = esp_i2c_stop(); + + if (calc_crc(0x0, data, 2) == data[2]) { + *humidity = calc_rh(data); + } else if (err == ESP_I2C_OK) { + err = ESP_I2C_ERR_DATA_CORRUPTED; + } + + return err; +} + +/** + * Get temperature. + * + * @param temp The temperature. + * @param cmd The temperature command. + * + * @return The I2C error code. + */ +static esp_i2c_err ICACHE_FLASH_ATTR +get_temp(float *temp, uint8_t cmd) +{ + esp_i2c_err err; + uint8_t data[3]; + + // When getting temperature from previous humidity measurement + // the CRC checksum is not available. + uint8_t data_len = (uint8_t) (cmd == ESP_SHT21_TEMP_HM ? 3 : 2); + + *temp = ESP_SHT21_BAD_TEMP; + + err = esp_i2c_start_read(ESP_SHT21_ADDRESS, cmd); + if (err != ESP_I2C_OK) return err; + + err = esp_i2c_read_bytes(data, data_len); + if (err != ESP_I2C_OK) return err; + + err = esp_i2c_stop(); + + if (data_len == 2 || calc_crc(0x0, data, 2) == data[2]) { + *temp = calc_temp(data); + } else if (err == ESP_I2C_OK) { + err = ESP_I2C_ERR_DATA_CORRUPTED; + } + + return err; +} + +esp_i2c_err ICACHE_FLASH_ATTR +esp_sht21_get_temp(float *temp) +{ + return get_temp(temp, ESP_SHT21_TEMP_HM); +} + +esp_i2c_err ICACHE_FLASH_ATTR +esp_sht21_get_temp_last(float *temp) +{ + return get_temp(temp, ESP_SHT21_TEMP_LAST); +} + +esp_i2c_err ICACHE_FLASH_ATTR +esp_sht21_get_sn(uint8_t *sn) +{ + uint8_t idx; + esp_i2c_err err; + uint8_t sn_idx = 0; + uint8_t crc; + uint8_t cmd1[2] = {0xFA, 0x0F}; + uint8_t cmd2[2] = {0xFC, 0xC9}; + uint8_t data[14]; + + err = esp_i2c_start_read_write(ESP_I2C_ADDR_WRITE(ESP_SHT21_ADDRESS), true); + if (err != ESP_I2C_OK) return err; + + err = esp_i2c_write_bytes(cmd1, 2); + if (err != ESP_I2C_OK) return err; + + err = esp_i2c_start_read_write(ESP_I2C_ADDR_READ(ESP_SHT21_ADDRESS), true); + if (err != ESP_I2C_OK) return err; + + err = esp_i2c_read_bytes(data, 8); + if (err != ESP_I2C_OK) return err; + + err = esp_i2c_stop(); + if (err != ESP_I2C_OK) return err; + + err = esp_i2c_start_read_write(ESP_I2C_ADDR_WRITE(ESP_SHT21_ADDRESS), true); + if (err != ESP_I2C_OK) return err; + + err = esp_i2c_write_bytes(cmd2, 2); + if (err != ESP_I2C_OK) return err; + + err = esp_i2c_start_read_write(ESP_I2C_ADDR_READ(ESP_SHT21_ADDRESS), true); + if (err != ESP_I2C_OK) return err; + + err = esp_i2c_read_bytes((data + 8), 6); + if (err != ESP_I2C_OK) return err; + + err = esp_i2c_stop(); + + // Validate data. + crc = 0x0; + for (idx = 0; idx < 8; idx += 2) { + crc = calc_crc(crc, &data[idx], 1); + if (data[idx + 1] != crc) { + return ESP_I2C_ERR_DATA_CORRUPTED; + } + sn[sn_idx++] = data[idx]; + } + + crc = 0x0; + for (idx = 8; idx < 14; idx += 3) { + crc = calc_crc(crc, &data[idx], 2); + if (data[idx + 2] != crc) { + return ESP_I2C_ERR_DATA_CORRUPTED; + } + sn[sn_idx++] = data[idx]; + sn[sn_idx++] = data[idx + 1]; + } + + return err; +} + +esp_i2c_err ICACHE_FLASH_ATTR +esp_sht21_get_rev(uint8_t *rev) +{ + esp_i2c_err err; + uint8_t cmd[2] = {0x84, 0xB8}; + + err = esp_i2c_start_read_write(ESP_I2C_ADDR_WRITE(ESP_SHT21_ADDRESS), true); + if (err != ESP_I2C_OK) return err; + + err = esp_i2c_write_bytes(cmd, 2); + if (err != ESP_I2C_OK) return err; + + err = esp_i2c_start_read_write(ESP_I2C_ADDR_READ(ESP_SHT21_ADDRESS), true); + if (err != ESP_I2C_OK) return err; + + err = esp_i2c_read_bytes(rev, 1); + if (err != ESP_I2C_OK) return err; + + return esp_i2c_stop(); +} + +static esp_i2c_err ICACHE_FLASH_ATTR +register_get(uint8_t address, uint8_t reg_adr, uint8_t *reg) +{ + esp_i2c_err err; + + // Read the register. + err = esp_i2c_start_read(address, reg_adr); + if (err != ESP_I2C_OK) return err; + + err = esp_i2c_read_bytes(reg, 1); + if (err != ESP_I2C_OK) return err; + + return esp_i2c_stop(); +} + +static esp_i2c_err ICACHE_FLASH_ATTR +register_set(uint8_t address, uint8_t reg_adr, uint8_t value) +{ + esp_i2c_err err; + + err = esp_i2c_start_write(address, reg_adr); + if (err != ESP_I2C_OK) return err; + + err = esp_i2c_write_bytes(&value, 1); + if (err != ESP_I2C_OK) return err; + + return esp_i2c_stop(); +} + +esp_i2c_err ICACHE_FLASH_ATTR +esp_sht21_res_get(uint8_t *res) +{ + esp_i2c_err err; + uint8_t reg1 = 0; + + err = register_get(ESP_SHT21_ADDRESS, ESP_SHT21_UR1_READ, ®1); + if (err != ESP_I2C_OK) return err; + + *res = (uint8_t) (((reg1 >> 6) & 0x2) | (reg1 & 0x1)); + + return ESP_I2C_OK; +} + +esp_i2c_err ICACHE_FLASH_ATTR +esp_sht21_res_set(uint8_t res) +{ + esp_i2c_err err; + uint8_t reg1 = 0; + + err = register_get(ESP_SHT21_ADDRESS, ESP_SHT21_UR1_READ, ®1); + if (err != ESP_I2C_OK) return err; + + // Clear bits 7 and 0 + reg1 = (uint8_t) (reg1 & 0x7E); + // Logical or after some bit manipulation. + reg1 |= ((((res & 0x3) != 0) << 7) | ((res & 0x1) != 0)); + + return register_set(ESP_SHT21_ADDRESS, ESP_SHT21_UR1_WRITE, reg1); +} + +esp_i2c_err ICACHE_FLASH_ATTR +esp_sht21_heater_get(bool *on_off, uint8_t *level) +{ + esp_i2c_err err; + uint8_t reg1 = 0; + uint8_t hcr = 0; + + err = register_get(ESP_SHT21_ADDRESS, ESP_SHT21_UR1_READ, ®1); + if (err != ESP_I2C_OK) return err; + err = register_get(ESP_SHT21_ADDRESS, ESP_SHT21_HCR_READ, &hcr); + if (err != ESP_I2C_OK) return err; + + *on_off = (reg1 & 0x4) != 0; + *level = (uint8_t) (hcr & 0xF); + + return ESP_I2C_OK; +} + +esp_i2c_err ICACHE_FLASH_ATTR +esp_sht21_heater_set(bool on_off, uint8_t level) +{ + esp_i2c_err err; + uint8_t reg1 = 0; + uint8_t hcr = 0; + + // Read both registers. + err = register_get(ESP_SHT21_ADDRESS, ESP_SHT21_UR1_READ, ®1); + if (err != ESP_I2C_OK) return err; + err = register_get(ESP_SHT21_ADDRESS, ESP_SHT21_HCR_READ, &hcr); + if (err != ESP_I2C_OK) return err; + + // Write new values. + reg1 = (uint8_t) (reg1 & 0xFB); + reg1 = reg1 | (on_off << 2); + err = register_set(ESP_SHT21_ADDRESS, ESP_SHT21_UR1_WRITE, reg1); + if (err != ESP_I2C_OK) return err; + + hcr = (uint8_t) ((hcr & 0xF0) | (level & 0x0F)); + err = register_set(ESP_SHT21_ADDRESS, ESP_SHT21_HCR_WRITE, 0x0); + if (err != ESP_I2C_OK) return err; + + return register_set(ESP_SHT21_ADDRESS, ESP_SHT21_HCR_WRITE, hcr); +} diff --git a/src/esp_sht21/include/esp_sht21.h b/src/esp_sht21/include/esp_sht21.h new file mode 100644 index 0000000..d842323 --- /dev/null +++ b/src/esp_sht21/include/esp_sht21.h @@ -0,0 +1,168 @@ +/* + * Copyright 2017 Rafal Zajac . + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + + +#ifndef ESP_SHT21_H +#define ESP_SHT21_H + +#include +#include + +#define ESP_SHT21_ADDRESS 0x40 +// Measure relative humidity. Hold Master Mode. +#define ESP_SHT21_RH_HM 0xE5 +// Measure relative humidity. No Hold Master Mode. +#define ESP_SHT21_RH_NHM 0xF5 +// Measure temperature. Hold Master Mode. +#define ESP_SHT21_TEMP_HM 0xE3 +// Measure temperature. No Hold Master Mode. +#define ESP_SHT21_TEMP_NHM 0xF3 +// Read temperature from previous RH measurement. +#define ESP_SHT21_TEMP_LAST 0xE0 +// Read User Register 1. +#define ESP_SHT21_UR1_READ 0xE7 +// Write User Register 1. +#define ESP_SHT21_UR1_WRITE 0xE6 +// Read Heater Control Register +#define ESP_SHT21_HCR_READ 0x11 +// Write Heater Control Register +#define ESP_SHT21_HCR_WRITE 0x51 + +// Invalid humidity. +#define ESP_SHT21_BAD_RH ((float)-1.00) +// Invalid temperature. +#define ESP_SHT21_BAD_TEMP ((float)-273) + +// SHT21 humidity and temperature resolutions. +// RH: 12bit TEMP: 14bit +#define ESP_SHT21_RES3 0x0 +// RH: 8bit TEMP: 12bit +#define ESP_SHT21_RES2 0x1 +// RH: 10bit TEMP: 13bit +#define ESP_SHT21_RES1 0x2 +// RH: 11bit TEMP: 11bit +#define ESP_SHT21_RES0 0x3 + +/** + * Initialize SHT21. + * + * @param gpio_scl The GPIO pin used for clock. + * @param gpio_sda The GPIO pin used for data. + * + * @return The I2C error code. + */ +esp_i2c_err ICACHE_FLASH_ATTR +esp_sht21_init(uint8_t gpio_scl, uint8_t gpio_sda); + +/** + * Measure humidity. + * + * It takes approximately around 20ms to return the value. + * + * @return The I2C error code. + */ +esp_i2c_err ICACHE_FLASH_ATTR +esp_sht21_get_rh(float *humidity); + +/** + * Measure temperature. + * + * This function slow. Faster method is to use esp_sht21_get_temp_last + * function which will return temperature value from previous + * humidity measurement. + * + * @param temp The measured temperature. + * + * @return The I2C error code. + */ +esp_i2c_err ICACHE_FLASH_ATTR +esp_sht21_get_temp(float *temp); + +/** + * Get temperature from previous humidity measurement. + * + * This function is faster then esp_sht21_get_temp. + * + * @param temp The measured temperature. + * + * @return The I2C error code. + */ +esp_i2c_err ICACHE_FLASH_ATTR +esp_sht21_get_temp_last(float *temp); + +/** + * Get 64 bit unique SHT21 serial number. + * + * @param sn The pointer to 8 byte array. + * + * @return The I2C error code. + */ +esp_i2c_err ICACHE_FLASH_ATTR +esp_sht21_get_sn(uint8_t *sn); + +/** + * Get firmware revision. + * + * @param rev The revision to set. + * + * @return The I2C error code. + */ +esp_i2c_err ICACHE_FLASH_ATTR +esp_sht21_get_rev(uint8_t *rev); + +/** + * Get humidity and temperature measurement resolution. + * + * @param res The measurement resolution. One of the ESP_SHT21_RES* defines. + * + * @return The I2C error code. + */ +esp_i2c_err ICACHE_FLASH_ATTR +esp_sht21_res_get(uint8_t *res); + +/** + * Set SHT21 humidity and temperature measurement resolution. + * + * @param res The resolution. One of the ESP_SHT21_RES* defines. + * + * @return The I2C error code. + */ +esp_i2c_err ICACHE_FLASH_ATTR +esp_sht21_res_set(uint8_t res); + +/** + * Get on-board heater status. + * + * @param on_off The on/off status. + * @param level The heater level value 0-15. + * + * @return The I2C error code. + */ +esp_i2c_err ICACHE_FLASH_ATTR +esp_sht21_heater_get(bool *on_off, uint8_t *level); + +/** + * Set on-board heater status. + * + * @param on_off The on/off status. + * @param level The heater level value 0-15. + * + * @return The I2C error code. + */ +esp_i2c_err ICACHE_FLASH_ATTR +esp_sht21_heater_set(bool on_off, uint8_t level); + +#endif //ESP_SHT21_H