Как стать автором
Обновить

Еще один беспроводной датчик температуры и влажности. Z-Wave плата Z-Uno + Sensirion SHT20

Время на прочтение 5 мин
Количество просмотров 18K
Как положено порядочному гигу у меня есть метеостанция, которую я собрал сам из DHT22, Raspberry Pi и экранчика Nokia, это решение на постоянном питании, передающее данные по Ethernet.

Но теперь мне понадобилась мобильная метеостанция на балкон беспроводная и на батарейках.
В качестве радио модуля я использовал Z-Wave плату Z-Uno, в качестве датчика температуры и влажности решил попробовать Sensirion SHT20 работающий по I2C.



Материалы и цены:
Материал Магазин Цена
1 Z-Wave плата Z-Uno 5smart.ru 3500 р
2 Датчик Sensirion SHT20 voltmaster.ru 72 р
3 Корпус Gainta G517B voltmaster.ru 160 р
4 Батарейный отсек BH421 2xAAA voltmaster.ru 14 р


Z-Uno постоянно обновляется, добавляется поддержка новой периферии и библиотеки. На данный момент актуальная версия прошивки 2.0.9 и в ней появилась поддержка следующих устройств:

  • 1-Wire DS18B20 temperature sensor
  • DHT22 && DHT11 temperature and humidity sensor
  • 125Khz RFID card reader
  • I2C BMP180 pressure and temperature sensor
  • и другие устройства, примеры здесь z-uno.z-wave.me/examples


Датчика Sensirion SHT20, работающего по I2C шине в списке поддерживаемых не оказалось, поэтому пришлось написать свою реализацию для Z-Uno. Синтаксис скетча под Z-Uno максимально похож на Arduino, весь скетч уместился в 35 строк:



Скетч для Z-Uno по работе с датчиком температуры и влажности Sensirion SHT20
#include <Wire.h>
#include "SHT2x.h"

int16_t temperature;
uint8_t humidity;

ZUNO_SETUP_SLEEPING_MODE(ZUNO_SLEEPING_MODE_SLEEPING);

#define ZUNO_CHANNEL_TEMPERATURE   1
#define ZUNO_CHANNEL_HUMIDITY   2

ZUNO_SETUP_CHANNELS(
    ZUNO_SENSOR_MULTILEVEL_TEMPERATURE(getterTemp),
    ZUNO_SENSOR_MULTILEVEL_HUMIDITY(getterHumid)
);

void setup() {
  Wire.begin();
}

void loop() { 
  temperature = SHT2x.GetTemperature();
  zunoSendReport(ZUNO_CHANNEL_TEMPERATURE);
  humidity = SHT2x.GetHumidity();
  zunoSendReport(ZUNO_CHANNEL_HUMIDITY);
  zunoSendDeviceToSleep(); 
}

byte getterTemp(void) {
  return temperature;
}

byte getterHumid(void) {
  return humidity;
}


SHT2x.cpp доработанный для Z-Uno
/*
  SHT2x - A Humidity Library for Arduino.

  Supported Sensor modules:
    SHT21-Breakout Module - http://www.moderndevice.com/products/sht21-humidity-sensor
	SHT2x-Breakout Module - http://www.misenso.com/products/001
	
  Created by Christopher Ladden at Modern Device on December 2009.
  Modified by Paul Badger March 2010
  
  Modified by www.misenso.com on October 2011:
	- code optimisation
	- compatibility with Arduino 1.0

  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library 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
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

//#include <inttypes.h>
#include <Wire.h>
#include "Arduino.h"
#include "SHT2x.h"



/******************************************************************************
 * Global Functions
 ******************************************************************************/

/**********************************************************
 * GetHumidity
 *  Gets the current humidity from the sensor.
 *
 * @return float - The relative humidity in %RH
 **********************************************************/
float SHT2xClass::GetHumidity(void)
{
	return (-6.0 + 125.0 / 65536.0 * (float)(readSensor(eRHumidityNoHoldCmd)));
 
}

/**********************************************************
 * GetTemperature
 *  Gets the current temperature from the sensor.
 *
 * @return float - The temperature in Deg C
 **********************************************************/
float SHT2xClass::GetTemperature(void)
{
	return (-46.85 + 175.72 / 65536.0 * (float)(readSensor(eTempNoHoldCmd)));
}


/******************************************************************************
 * Private Functions
 ******************************************************************************/

uint16_t SHT2xClass::readSensor(uint8_t command)
{
    uint16_t result = 0 ;
    uint8_t data[2];

    // Sending request to sensor
    Wire.beginTransmission(eSHT2xAddress);   // We have to read some registers from sensor 
    Wire.write(command);        // Command     
    Wire.endTransmission(); 
    delay(100);
    
    Wire.requestFrom(eSHT2xAddress, 3); //Get 3 bytes
    byte i = 0;
    while(Wire.available()) {
      data[i++] = Wire.read();
    }

    result = data[0] << 8;
    result += data[1];
    result &= ~0x0003;   // clear two low bits (status bits)
    return result;
}

SHT2xClass SHT2x;


SHT2x.h
/*
  SHT2x - A Humidity Library for Arduino.

  Supported Sensor modules:
    SHT21-Breakout Module - http://www.moderndevice.com/products/sht21-humidity-sensor
	SHT2x-Breakout Module - http://www.misenso.com/products/001
	
  Created by Christopher Ladden at Modern Device on December 2009.
  
  Modified by www.misenso.com on October 2011:
	- code optimisation
	- compatibility with Arduino 1.0

  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library 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
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/


#ifndef SHT2X_H
#define SHT2X_H

//#include <inttypes.h>

typedef enum {
    eSHT2xAddress = 0x40,
} HUM_SENSOR_T;

typedef enum {
    eTempHoldCmd		= 0xE3,
    eRHumidityHoldCmd	= 0xE5,
    eTempNoHoldCmd      = 0xF3,
    eRHumidityNoHoldCmd = 0xF5,
} HUM_MEASUREMENT_CMD_T;

class SHT2xClass
{
  private:
	uint16_t readSensor(uint8_t command);
  uint8_t _data; 
  public:
    SHT2xClass(){};
    float GetHumidity(void);
    float GetTemperature(void);
};

extern SHT2xClass SHT2x;

#endif


Из особенных вещей, в скетче присутствует только строчка переводящая Z-Uno в спящий режим:

ZUNO_SETUP_SLEEPING_MODE(ZUNO_SLEEPING_MODE_SLEEPING);

И настройка, в какой канал отправлять температуру, а в какой влажность:

ZUNO_SETUP_CHANNELS(
    ZUNO_SENSOR_MULTILEVEL_TEMPERATURE(getterTemp),
    ZUNO_SENSOR_MULTILEVEL_HUMIDITY(getterHumid)
);

В остальном обычный Arduino код.

Sensirion SHT20 работает по I2C и подключается 2 проводками. По умолчанию в библиотеке Wire.h для I2C определены пины 9 и 10.

image

Информацию с датчика можно посмотреть на телефоне и она используется в автоматизации, для управления увлажнителем и кондиционером.


Данные обновляются каждые 12 минут, в таком режиме датчик должен проработать более 2-х лет от одного комплекта батареек.



Гаинтовский корпус G517B 90 х 60 х 20 см специально выбирался с местом под батареечный отсек, все отлично влезло.

На разработку Z-Wave датчика температуры и влажности ушло примерно 2 часа и 3746 р. Можно еще добавить E-Ink экран и повесить на стену!
Теги:
Хабы:
Если эта публикация вас вдохновила и вы хотите поддержать автора — не стесняйтесь нажать на кнопку
+11
Комментарии 79
Комментарии Комментарии 79

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн