Как положено порядочному гигу у меня есть метеостанция, которую я собрал сам из 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 строк:
#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 - 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 - 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.
Информацию с датчика можно посмотреть на телефоне и она используется в автоматизации, для управления увлажнителем и кондиционером.
Данные обновляются каждые 12 минут, в таком режиме датчик должен проработать более 2-х лет от одного комплекта батареек.
Гаинтовский корпус G517B 90 х 60 х 20 см специально выбирался с местом под батареечный отсек, все отлично влезло.
На разработку Z-Wave датчика температуры и влажности ушло примерно 2 часа и 3746 р. Можно еще добавить E-Ink экран и повесить на стену!
Автор: aivs