hdc1080.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. /*
  2. * Driver for TI Texas Instruments HDC1080 Temperature/Humidity Sensor.
  3. * Code By Metin KOC
  4. * Sixfab Inc. metin@sixfab.com
  5. * Code based on ADXL345 driver.
  6. */
  7. #include "module.h"
  8. #include "lauxlib.h"
  9. #include "platform.h"
  10. #include "user_interface.h"
  11. #include <stdlib.h>
  12. #include <string.h>
  13. #include <math.h>
  14. static const uint32_t hdc1080_i2c_id = 0;
  15. static const uint8_t hdc1080_i2c_addr = 0x40;
  16. #define HDC1080_TEMPERATURE_REGISTER 0X00
  17. #define HDC1080_HUMIDITY_REGISTER 0X01
  18. #define HDC1080_CONFIG_REGISTER 0X02
  19. static int hdc1080_setup(lua_State* L) {
  20. // Configure Sensor
  21. platform_i2c_send_start(hdc1080_i2c_id);
  22. platform_i2c_send_address(hdc1080_i2c_id, hdc1080_i2c_addr, PLATFORM_I2C_DIRECTION_TRANSMITTER);
  23. platform_i2c_send_byte(hdc1080_i2c_id, HDC1080_CONFIG_REGISTER);
  24. platform_i2c_send_byte(hdc1080_i2c_id, 0x05); //Bit[10] to 1 for 11 bit resolution , Set Bit[9:8] to 01 for 11 bit resolution.
  25. platform_i2c_send_byte(hdc1080_i2c_id, 0x00);
  26. platform_i2c_send_stop(hdc1080_i2c_id);
  27. return 0;
  28. }
  29. static int hdc1080_read(lua_State* L) {
  30. uint8_t data[2];
  31. #ifdef LUA_NUMBER_INTEGRAL
  32. int temp;
  33. int humidity;
  34. #else
  35. float temp;
  36. float humidity;
  37. #endif
  38. int i;
  39. platform_i2c_send_start(hdc1080_i2c_id);
  40. platform_i2c_send_address(hdc1080_i2c_id, hdc1080_i2c_addr, PLATFORM_I2C_DIRECTION_TRANSMITTER);
  41. platform_i2c_send_byte(hdc1080_i2c_id, HDC1080_TEMPERATURE_REGISTER);
  42. platform_i2c_send_stop(hdc1080_i2c_id);
  43. os_delay_us(7000);
  44. platform_i2c_send_start(hdc1080_i2c_id);
  45. platform_i2c_send_address(hdc1080_i2c_id, hdc1080_i2c_addr, PLATFORM_I2C_DIRECTION_RECEIVER);
  46. for (i=0; i<2; i++) {
  47. data[i] = platform_i2c_recv_byte(hdc1080_i2c_id, 1);
  48. }
  49. platform_i2c_send_stop(hdc1080_i2c_id);
  50. #ifdef LUA_NUMBER_INTEGRAL
  51. temp = ((((data[0]<<8)|data[1])*165)>>16)-40;
  52. lua_pushinteger(L, (int)temp);
  53. #else
  54. temp = ((float)((data[0]<<8)|data[1])/(float)pow(2,16))*165.0f-40.0f;
  55. lua_pushnumber(L, temp);
  56. #endif
  57. platform_i2c_send_start(hdc1080_i2c_id);
  58. platform_i2c_send_address(hdc1080_i2c_id, hdc1080_i2c_addr, PLATFORM_I2C_DIRECTION_TRANSMITTER);
  59. platform_i2c_send_byte(hdc1080_i2c_id, HDC1080_HUMIDITY_REGISTER);
  60. platform_i2c_send_stop(hdc1080_i2c_id);
  61. os_delay_us(7000);
  62. platform_i2c_send_start(hdc1080_i2c_id);
  63. platform_i2c_send_address(hdc1080_i2c_id, hdc1080_i2c_addr, PLATFORM_I2C_DIRECTION_RECEIVER);
  64. for (i=0; i<2; i++) {
  65. data[i] = platform_i2c_recv_byte(hdc1080_i2c_id, 1);
  66. }
  67. platform_i2c_send_stop(hdc1080_i2c_id);
  68. #ifdef LUA_NUMBER_INTEGRAL
  69. humidity = ((((data[0]<<8)|data[1]))*100)>>16;
  70. lua_pushinteger(L, (int)humidity);
  71. #else
  72. humidity = ((float)((data[0]<<8)|data[1])/(float)pow(2,16))*100.0f;
  73. lua_pushnumber(L, humidity);
  74. #endif
  75. return 2;
  76. }
  77. LROT_BEGIN(hdc1080, NULL, 0)
  78. LROT_FUNCENTRY( read, hdc1080_read )
  79. LROT_FUNCENTRY( setup, hdc1080_setup )
  80. LROT_END(hdc1080, NULL, 0)
  81. NODEMCU_MODULE(HDC1080, "hdc1080", hdc1080, NULL);