Нода мониторинга температуры и влажности на улице

Показывайте и делитесь своими замечательными проектами здесь! Мы любим картинки!
Ответить
Sergey2055
Сообщения: 50
Зарегистрирован: 04 июл 2017, 13:43

Нода мониторинга температуры и влажности на улице

Сообщение Sergey2055 »

Корпус выполнен из тарелок от цветочных горшков. Ну такая идея пришла подсмотрел у синоптиков. Обязательное условие что бы датчик был в тени и продувался но не попадали осадки вот и решил так реализовать.
Маленькие пояснения:

Переменная 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;
}
Вложения
IMG_20170830_071444.jpg
IMG_20170830_071444.jpg (127.81 КБ) 13725 просмотров
IMG_20170628_180918.jpg
IMG_20170628_180918.jpg (130.65 КБ) 13725 просмотров
Ответить