Что может этот датчик температуры и влажности:
Прошивка по воздуху.
Работа на всех бутлоадерах.
Настраиваемая отправка показаний датчика на контролер
Лед индикация подключения к сети майсенсорс, отправки показаний
Три варианта держателя батарейки, 2430, 2450, 2477, соответственно разная толщина датчика.
Настройка параметров через контроллер:
-светодиод включен / выключен,
-интервал отправки показаний температуры и влажности 1мин-4 часа,
-интервал отправки заряда аккумулятора 1 час-7 дней.
Отправка остатка заряда батарейки в процентах
Настройка через модуль Майсенсорс в Мажордомо(да впринципе и через любой другой контролер):
Диаметр 35mm.
ATMEGA328_QFN32
SHT20
AT25DF512B(1.7v)
ATSHA204A
NRF24L01
Сrystal oscillator
LED SIDE 1206
ICSP interface (micro, 3х2/1,27)
FTDI interface (micro, 3х2/1,27)
Two side buttons (ресет, юзерская кнопка)
выведены как FTDI так и ICSP, так что полная свобода в манипуляциях над девайсом. Можете использовать мое ПО, можете написать крутое свое. Я как обычно только ЗА!!! Главное выкладывайте.
Приобрести готовый датчик можно тут - https://majordomo.smartliving.ru/forum/ ... =15&t=5726
Скрин страницы датчика движения в модуле Майсенсорс в Мажордомо Разводка платы под ЛУТ - Код тестовой програмы:
Код: Выделить всё
#include <Wire.h>
#include "DFRobot_SHT20.h"
DFRobot_SHT20 sht20; // https://github.com/DFRobot/DFRobot_SHT20
//#define MY_DEBUG
#define MY_DISABLED_SERIAL
#define MY_RADIO_RF24
//#define MY_RADIO_NRF5_ESB
#define MY_OTA_FIRMWARE_FEATURE
//#define MY_SIGNING_ATSHA204
//#define MY_SIGNING_ATSHA204_PIN A3
//#define MY_SIGNING_REQUEST_SIGNATURES
#define TEMP_SENS_ID 1
#define HUM_SENS_ID 2
#define SETTING_LED_SENS_ID 100
#define DELAY_TIME_SENS_ID 101
#define BATTARY_SEND_SENS_ID 102
#define BAT_COOF 3.04
#define BAT_MIN 200
#define BAT_MAX 290
#define ON 1
#define OFF 0
float humd;
float temp;
int oldhumd;
int oldtemp;
uint32_t send_batteryTime;
uint32_t w_battetyTime = 0;
static uint8_t led_pin = 4;
uint32_t delayTime;
int8_t battery;
int8_t old_battery;
uint8_t set_led;
boolean sleep_mode;
boolean first_send_battery = 1;
#include <MySensors.h>
MyMessage msg_temp(TEMP_SENS_ID, V_TEMP);
MyMessage msg_hum(HUM_SENS_ID, V_HUM);
MyMessage msg_setting_led(SETTING_LED_SENS_ID, V_VAR1);
MyMessage msg_delay_time(DELAY_TIME_SENS_ID, V_VAR1);
MyMessage msg_battary_send(BATTARY_SEND_SENS_ID, V_VAR1);
void preHwInit()
{
pinMode(led_pin, OUTPUT);
digitalWrite(led_pin, OFF);
}
void before()
{
set_led = loadState(100);
if (set_led > 1) {
set_led = 0;
saveState(100, set_led);
}
delayTime = loadState(101);
if (delayTime > 240) {
delayTime = 1;
saveState(101, delayTime);
}
send_batteryTime = loadState(102);
if (send_batteryTime > 168) {
send_batteryTime = 1;
saveState(102, send_batteryTime);
}
digitalWrite(led_pin, ON);
}
void presentation()
{
sendSketchInfo("Temp & Hum Sensor", "1.0");
wait(100);
present(TEMP_SENS_ID, S_TEMP, "TEMPERATURE DATA");
wait(100);
present(HUM_SENS_ID, S_HUM, "HUMIDITY DATA");
wait(100);
present(SETTING_LED_SENS_ID, S_CUSTOM, "LED MODE");
wait(100);
present(DELAY_TIME_SENS_ID, S_CUSTOM, "DELAY TIME/MIN");
wait(100);
present(BATTARY_SEND_SENS_ID, S_CUSTOM, "BATTERY SEND TIME/H");
}
void setup()
{
digitalWrite(led_pin, OFF);
wait(50);
digitalWrite(led_pin, ON);
wait(200);
digitalWrite(led_pin, OFF);
wait(50);
digitalWrite(led_pin, ON);
wait(200);
digitalWrite(led_pin, OFF);
wait(1000);
readBatLev();
wait(1000);
sht20.initSHT20();
send_data();
wait(100);
send(msg_delay_time.set(delayTime));
wait(100);
send(msg_setting_led.set(set_led));
wait(100);
send(msg_battary_send.set(send_batteryTime));
sleep_mode = 1;
}
void loop()
{
if (sleep_mode == 0) {
sleep(delayTime * 60 * 1000, false);
}
if (sleep_mode == 1) {
sleep(delayTime * 60 * 1000, true);
sleep_mode = 0;
}
w_battetyTime = w_battetyTime + (delayTime * 60 * 1000);
if (w_battetyTime >= send_batteryTime * 60 * 60 * 1000) {
readBatLev();
sleep_mode = 1;
w_battetyTime = 0;
}
send_data();
}
void receive(const MyMessage & message)
{
if (message.sensor == SETTING_LED_SENS_ID) {
if (message.type == V_VAR1) {
if (message.getByte() <= 1) {
set_led = message.getBool();
saveState(100, set_led);
send(msg_setting_led.set(set_led));
if (set_led == 0) {
TRANSPORT_DEBUG(PSTR("MyS: STATUS LED: OFF\n"));
}
if (set_led == 1) {
TRANSPORT_DEBUG(PSTR("MyS: STATUS LED: ON\n"));
if (set_led == 1) {
digitalWrite(led_pin, ON);
wait(50);
digitalWrite(led_pin, OFF);
}
}
}
}
}
if (message.sensor == DELAY_TIME_SENS_ID) {
if (message.type == V_VAR1) {
if (message.getULong() <= 240) {
delayTime = message.getULong();
saveState(101, delayTime);
send(msg_delay_time.set(delayTime));
TRANSPORT_DEBUG(PSTR("MyS: THE NEW INTERVAL TEMP&HUM SEND VALUE IS SET: %d MIN.\n"), delayTime);
if (set_led == 1) {
digitalWrite(led_pin, ON);
wait(50);
digitalWrite(led_pin, OFF);
}
}
}
}
if (message.sensor == BATTARY_SEND_SENS_ID) {
if (message.type == V_VAR1) {
if (message.getULong() <= 168) {
send_batteryTime = message.getULong();
saveState(102, send_batteryTime);
send(msg_battary_send.set(send_batteryTime));
TRANSPORT_DEBUG(PSTR("MyS: THE NEW INTERVAL BATTERY SEND IS SET: %d HOUR\n"), send_batteryTime);
if (set_led == 1) {
digitalWrite(led_pin, ON);
wait(50);
digitalWrite(led_pin, OFF);
}
}
}
}
}
void send_data()
{
humd = sht20.readHumidity();
temp = sht20.readTemperature();
int t_humd = (int)humd;
int t_temp = (int)temp;
if (oldtemp != t_temp) {
oldtemp = t_temp;
send(msg_temp.set(temp, 1));
//wait(1000, C_SET, V_TEMP );
if (set_led == 1) {
digitalWrite(led_pin, ON);
wait(50);
digitalWrite(led_pin, OFF);
}
}
wait(100);
if (oldhumd != t_humd) {
oldhumd = t_humd;
send(msg_hum.set(humd, 1));
//wait(1000, C_SET, V_HUM );
if (set_led == 1) {
digitalWrite(led_pin, ON);
wait(50);
digitalWrite(led_pin, OFF);
}
}
TRANSPORT_DEBUG(PSTR("MyS: SEND DATA - TEMPERATURE: %d, HUMIDITY %d\n"), t_temp, t_humd);
}
void readBatLev() {
ADMUX = _BV(REFS1) | _BV(REFS0) | _BV(MUX0);
wait(100);
RF24_startListening();
wait(500);
ADCSRA |= _BV(ADSC);
while (bit_is_set(ADCSRA, ADSC));
uint8_t low = ADCL;
uint8_t high = ADCH;
long temp = (high << 8) | low;
float vcc = temp * 1.1 / 1023 * BAT_COOF * 100;
battery = map((int)vcc, BAT_MIN, BAT_MAX, 0, 100);
if (battery < 0) {
battery = 0;
}
if (battery > 100) {
battery = 100;
}
TRANSPORT_DEBUG(PSTR("MyS: BATTERY LEVEL: %d, PREVIUS BATTERY LEVEL: %d\n"), battery, old_battery);
TRANSPORT_DEBUG(PSTR("MyS: BATTERY LEVEL ADC: %d\n"), temp);
if (first_send_battery == 1) {
first_send_battery = 0;
sendBatteryLevel(battery);
TRANSPORT_DEBUG(PSTR("MyS: SEND BATTERY LEVEL\n"));
old_battery = battery;
} else {
if (old_battery != battery) {
if (battery < old_battery) {
old_battery = battery;
sendBatteryLevel(battery);
TRANSPORT_DEBUG(PSTR("MyS: SEND BATTERY LEVEL\n"));
} else {
battery = old_battery;
}
}
}
}