From e7c7dc2b551e647df7222b359ec8b93edd9d2f5d Mon Sep 17 00:00:00 2001 From: Pat Wood Date: Fri, 26 Jun 2015 10:53:17 -0400 Subject: [PATCH] Removed getTemperature() and getHumidity() functions; made module stateless. --- app/modules/dht.c | 71 +++++++++++++++++++++++++---------------------- 1 file changed, 38 insertions(+), 33 deletions(-) diff --git a/app/modules/dht.c b/app/modules/dht.c index 9f0303e1..792cd2db 100644 --- a/app/modules/dht.c +++ b/app/modules/dht.c @@ -1,4 +1,30 @@ // Module for DHT11/21/22 temp/humidity modules +// Updated for nodemcu/lua by Pat Wood +// https://github.com/patrickhwood/nodemcu-firmware + +/** +Originally from: http://harizanov.com/2014/11/esp8266-powered-web-server-led-control-dht22-temperaturehumidity-sensor-reading/ +Adapted from: https://github.com/adafruit/Adafruit_Python_DHT/blob/master/source/Raspberry_Pi/pi_dht_read.c +LICENSE: +//#include "c_stdlib.h" +// Copyright (c) 2014 Adafruit Industries +// Author: Tony DiCola +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +*/ #include "platform.h" #include "auxmods.h" @@ -11,8 +37,6 @@ typedef enum { DHT22 = 22, } DHT_TYPE; -static short int temp = -10000, hum = -10000; - #define DHT_MAXTIMINGS 10000 #define DHT_BREAKTIME 20 #define DHT_MAXCOUNT 32000 @@ -27,7 +51,7 @@ static short int temp = -10000, hum = -10000; #define sleepms(x) os_delay_us(x*1000); -static bool DHTRead(int pin, DHT_TYPE type) +static bool DHTRead(int pin, signed short *temp, signed short *hum, DHT_TYPE type) { int counter = 0; int laststate = 1; @@ -61,7 +85,6 @@ static bool DHTRead(int pin, DHT_TYPE type) if(i == DHT_MAXCOUNT) { DHT_DEBUG("DHT: Failed to get reading from GPIO%d, dying\r\n", pin); - temp = hum = -10000; return false; } @@ -98,28 +121,26 @@ static bool DHTRead(int pin, DHT_TYPE type) // checksum is valid switch (type) { case DHT11: - hum = data[0]; - temp = data[2]; + *hum = data[0]; + *temp = data[2]; break; case DHT21: case DHT22: - hum = (data[0] << 8) + data[1]; - temp = (data[2] << 8) + data[3]; + *hum = (data[0] << 8) + data[1]; + *temp = (data[2] << 8) + data[3]; break; } DHT_DEBUG("DHT: Temperature = %d *C, Humidity = %d %% (GPIO%d)\n", - (int) (temp), (int) (hum), pin); + (int) (*temp), (int) (*hum), pin); } else { DHT_DEBUG("DHT: Checksum was incorrect after %d bits. Expected %d but got %d (GPIO%d)\r\n", j, data[4], checksum, pin); - temp = hum = -10000; return false; } } else { DHT_DEBUG("DHT: Got too few bits: %d should be at least 40 (GPIO%d)\r\n", j, pin); - temp = hum = -10000; return false; } return true; @@ -128,8 +149,10 @@ static bool DHTRead(int pin, DHT_TYPE type) // Lua: dht.read11(gpio_pin) static int dht_read11(lua_State *L) { + signed short temp = -10000, hum = -10000; unsigned pin = luaL_checkinteger(L, 1); - if (DHTRead(pin, DHT11)) { + + if (DHTRead(pin, &temp, &hum, DHT11)) { lua_pushinteger(L, temp); lua_pushinteger(L, hum); return 2; @@ -141,8 +164,10 @@ static int dht_read11(lua_State *L) // Lua: dht.read22(gpio_pin) static int dht_read22(lua_State *L) { + signed short temp = -10000, hum = -10000; unsigned pin = luaL_checkinteger(L, 1); - if (DHTRead(pin, DHT22)) { + + if (DHTRead(pin, &temp, &hum, DHT22)) { lua_pushinteger(L, temp); lua_pushinteger(L, hum); return 2; @@ -151,24 +176,6 @@ static int dht_read22(lua_State *L) return 1; } -static int dht_getTemperature(lua_State *L) -{ - if (temp == -10000) - lua_pushnil(L); - else - lua_pushinteger(L, temp); - return 1; -} - -static int dht_getHumidity(lua_State *L) -{ - if (hum == -10000) - lua_pushnil(L); - else - lua_pushinteger(L, hum); - return 1; -} - // Module function map #define MIN_OPT_LEVEL 2 #include "lrodefs.h" @@ -176,8 +183,6 @@ const LUA_REG_TYPE dht_map[] = { { LSTRKEY("read11"), LFUNCVAL(dht_read11) }, { LSTRKEY("read22"), LFUNCVAL(dht_read22) }, - { LSTRKEY("getTemperature"), LFUNCVAL(dht_getTemperature) }, - { LSTRKEY("getHumidity"), LFUNCVAL(dht_getHumidity) }, #if LUA_OPTIMIZE_MEMORY > 0