Маленькие пояснения:
Переменная VAR2 устанавливает время переодической отправки данных в минутах 1,2,3........
Переменная VAR3 осуществляет калибровку батареи при полном ее заряде после замены нужно отправить на ноду число 255
Переменная VAR5 отправляет команду для батарейных нод на перезагрузку для прошивки число тоже 255
Код: Выделить всё
#define MY_RADIO_NRF24
#define MY_NODE_ID 36
#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_BattCall 5
#define NODE_Prog 6
unsigned long SLEEP_TIME = 30000;
float Temp, OldTemp, Humidity, OldHumidity;
int ADCin=3, a;
int BatteryPcnt, OldBatteryPcnt, s;
byte flagProg, Flag = 1;
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 msgCall(NODE_BattCall, V_VAR3);
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_BattCall, S_CUSTOM, "BattCall");
present(NODE_Prog, S_CUSTOM, "Set programm");
}
void setup(){
wdt_enable(WDTO_8S);
Wire.begin();
analogReference(INTERNAL);
pinMode(ADCin, INPUT);
int L = loadState(3);
if((L) > 0 && (L)< 255)
SLEEP_TIME=L*60000;
}
void loop()
{
wdt_reset();
if(Flag)
start();
SendDevInfo();
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_VAR3) {
if((message.getInt()) == 255){
send(msgCall.set(255));
BattCall();
send(msgCall.set(0));
}
}
if (message.type==V_VAR5) {
if((message.getInt())== 255){
send(msgProg.set(0));
delay(20000);
}
}
}
//0000000000000000000000000000000000000000000000000000000000
void BattCall()
{
for(int i=0; i<3; i++)
{
wdt_reset();
s = analogRead(ADCin);
send(msgbatt.set(s)); //value переменная 2-указываеьт сколько знаков после запятой выводить.
delay(5000);
}
saveState(1, lowByte(s));
saveState(2, highByte(s));
}
void BattInfo()
{
a = analogRead(ADCin);
int sl = loadState (1);
int sh = loadState (2);
int max_batt = word(sh, sl);
float con = (4.20/3.00);
int min_batt = a/con;
BatteryPcnt = min(map(a, min_batt, max_batt, 0, 100), 100);
}
void SendDevInfo()
{
Temp = (SHT2x.readT());
Humidity = (SHT2x.readRH());
//========= Temp =============
if (OldTemp != Temp){
if (!send(msgT.set(Temp, 1)))
{
OldTemp = 0;
}
else
{
OldTemp = Temp;
}
}
//========= Humidity =============
if (OldHumidity != Humidity){
if (!send(msgH.set(Humidity, 0)))
{
OldHumidity = 0;
}
else
{
OldHumidity = Humidity;
}
}
//========= Battery =============
BattInfo();
if (OldBatteryPcnt != BatteryPcnt){
if (!send(msgbatt.set(BatteryPcnt)))
{
OldBatteryPcnt = 0;
}
else
{
OldBatteryPcnt = BatteryPcnt;
}
}
}
void start()
{
send(msgTime.set((SLEEP_TIME)/60000));
delay(100);
send(msgProg.set(0));
delay(100);
send(msgCall.set(0));
Flag = 0;
}