Батарейная нода для мониторинга влажности и температуры
Добавлено: 04 июл 2017, 16:06
Код: Выделить всё
#define MY_RADIO_NRF24
#define MY_NODE_ID 32
#include <MySensors.h>
#include <SPI.h>
#include <Wire.h>
#include <SHT2x.h>
#include <avr/wdt.h>
#define NODE_IDT 1
#define NODE_IDH 2
#define NODE_IDV 3
#define NODE_Time 4
#define NODE_Prog 5
unsigned long SLEEP_TIME = 30000;
float T, H;
int ADCin=3, prog = 3;
int BatteryPcnt;
byte flag = 0, flagProg;
MyMessage msgT(NODE_IDT, V_TEMP);
MyMessage msgH(NODE_IDH, V_HUM);
MyMessage msgbatt(NODE_IDV, V_VAR1);
MyMessage msgTime(NODE_Time, V_VAR2);
MyMessage msgProg(NODE_Prog, V_VAR5);
void presentation()
{
sendSketchInfo("Temp sensor", "V1.0_19062017");
//present(NODE_IDH, S_HUM);
present(NODE_IDT, S_TEMP, "Temp");
present(NODE_IDH, S_HUM, "humidity");
present(NODE_IDV, S_CUSTOM, "Battery");
present(NODE_Time, S_CUSTOM, "Time sleep");
present(NODE_Prog, S_CUSTOM, "Set programm");
}
void setup(){
wdt_disable();
Wire.begin();
analogReference(INTERNAL);
pinMode(ADCin, INPUT);
pinMode(prog, INPUT);
digitalWrite(prog, LOW);
if(digitalRead(prog)==1)
flag=1;
else
flag=0;
int L = loadState(3);
if((L) > 0 && (L)< 255)
SLEEP_TIME=L*60000;
send(msgProg.set(0));
flagProg=0;
}
void loop()
{
T = (SHT2x.readT());
send(msgT.set(T, 2)); //value переменная 2-указываеьт сколько знаков после запятой выводить.
H = (SHT2x.readRH());
send(msgH.set(H, 2)); //value переменная 2-указываеьт сколько знаков после запятой выводить.
if(flag == 1){
int s = analogRead(ADCin);
saveState(1, lowByte(s));
saveState(2, highByte(s));
send(msgbatt.set(s)); //value переменная 2-указываеьт сколько знаков после запятой выводить.
delay(10000);
}
else{
int a = analogRead(ADCin);
int sl = loadState (1);
int sh = loadState (2);
int battconst = word(sh, sl);
int batt3V = (30*battconst)/42;
int b = battconst - batt3V;
if((a - batt3V)>0){
BatteryPcnt = ((a - batt3V)*100)/b; // 293=1023=100%=4.2V
}
else
BatteryPcnt = 0;
send(msgbatt.set(BatteryPcnt)); //value переменная 2-указываеьт сколько знаков после запятой выводить.
send(msgTime.set((SLEEP_TIME)/60000));
if(flagProg){
delay(10000);
send(msgProg.set(10));
}
else{
send(msgProg.set(0));
smartSleep(SLEEP_TIME);
}
}
}
//********************************************************
void receive(const MyMessage &message) {
if (message.type==V_VAR2) {
if((message.getInt())<255){
saveState(3, message.getInt());
SLEEP_TIME = (loadState(3)*60000);
send(msgTime.set((SLEEP_TIME)/60000));
}
}
if (message.type==V_VAR5) {
if((message.getInt())<255){
SLEEP_TIME = message.getInt();
if (SLEEP_TIME == 52)
flagProg = 1;
}
}
}