You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

303 lines
7.8 KiB

/* *****************************************************************
* this is the code for Snsr unit in Living Room
*
* *****************************************************************/
// MQTT auth code and WIFI
#define MQTT_AUTH_CODE "f60664f86153"
#define WIFI_SSID "yimian-iot"
#define WIFI_PASSWD "1234567890."
// Pins Log ID
#define W_DEVICE_ID "6"
#define W_LIGHT_ID ""
#define W_SWI_ID ""
#define W_TEMP_ID "Tp1"
#define W_HUM_ID ""
#define W_TEL_ID ""
#define W_R1_ID "R5"
#define W_R2_ID "R6"
#define W_R3_ID "R7"
#define W_R4_ID "R8"
#define W_LED_ID "ll2"
#define W_BUZ_ID "B1"
#define W_LS_ID "Ls1"
#define W_SH_ID "Sh1" //Shake Snsr
// Set as WIFI mode
#define BLINKER_WIFI
#define BLINKER_PRINT Serial
// Include Blinker lib
#include <Blinker.h>
// Correspond Pins to Tag
#define lightSnsr D10 //detect the light
#define Buz D2 // Pins for buzz
#define rSnsr1 D6 // Pins for searching people
#define rSnsr2 D13 // Pins for searching people
#define rSnsr3 D8
#define rSnsr4 D3
#define Shake D9 // Pins for detect shake
#define led D0
#define TempSnsr A0 // Temp Detector
#define Source D1 // Power Source Detector
// Parameter Define
#define SWI_TRY_TIMES 300
#define SWI_ACTION_DELAY 30
#define UDOOR_OPEN_DELAY_TIME 800
#define LED_BLINK_FREQUENCY 10
#define LED_WARNING_FREQUENCY 800
#define MIN_DIRECT_CHANGE_TIME 10000
#define NO_PEOPLE_DELAY 28000
#define SHUTDOWN_LIGHT_DELAY 10000
#define ICE_TIME 300000
#define OFFLINE_TIME_LIMIT 15000
// Set wifi and MQTT config
char auth[] = MQTT_AUTH_CODE;
char ssid[] = WIFI_SSID;
char pswd[] = WIFI_PASSWD;
// load module
BlinkerButton wIoT("wIoT");
BlinkerButton ledBtn("led");
BlinkerButton wledBtn("w-light");
BlinkerButton walert("w-alert");
// declare global var
int rSnsr1Status,rSnsr2Status,rSnsr3Status,rSnsr4Status = 0;
int isPeople = 0;
int noPeople = 0;
int ledStatus = -1;
int LastCnnctTime = 0;
int Mode = 0;
int Alert = 0;
/******** Custom Functions *********/
/*** rSnsr functions ***/
//
int is_People()
{
int rCnt=0;
int change=0;
int t_rSnsr1Status,t_rSnsr2Status,t_rSnsr3Status,t_rSnsr4Status = 0;
t_rSnsr1Status = digitalRead(rSnsr1);
t_rSnsr2Status = digitalRead(rSnsr2);
t_rSnsr3Status = digitalRead(rSnsr3);
t_rSnsr4Status = digitalRead(rSnsr4);
if(t_rSnsr1Status == HIGH) {if(rSnsr1Status != t_rSnsr1Status)change=1;rCnt++;}
else if(rSnsr1Status != t_rSnsr1Status)change=1;
if(t_rSnsr2Status == HIGH) {if(rSnsr2Status != t_rSnsr2Status)change=1;rCnt++;}
else if(rSnsr2Status != t_rSnsr2Status)change=1;
if(t_rSnsr3Status == HIGH) {if(rSnsr3Status != t_rSnsr3Status)change=1;rCnt++;}
else if(rSnsr3Status != t_rSnsr3Status)change=1;
if(t_rSnsr4Status == HIGH) {if(rSnsr4Status != t_rSnsr4Status)change=1;rCnt++;}
else if(rSnsr4Status != t_rSnsr4Status)change=1;
rSnsr1Status = t_rSnsr1Status;
rSnsr2Status = t_rSnsr2Status;
rSnsr3Status = t_rSnsr3Status;
rSnsr4Status = t_rSnsr4Status;
if(change) rSnsr_data();
if(rCnt) return 1;
else return 0;
}
void rSnsr_data()
{
//static int t_ice = 0;
/*if(rSnsr1Status == HIGH) txtR1.print("r1","有人经过");
else txtR1.print("r1","无人");
if(rSnsr2Status == HIGH) txtR2.print("r2","有人经过");
else txtR2.print("r2","无人");
if(rSnsr3Status == HIGH) txtR3.print("r3","有人经过");
else txtR3.print("r3","无人");
if(rSnsr4Status == HIGH) txtR4.print("r4","有人经过");
else txtR4.print("r4","无人");
if((rSnsr1Status+rSnsr2Status+rSnsr3Status+rSnsr4Status>=2)&&(rSnsr1Status&&rSnsr2Status)&&(rSnsr3Status||rSnsr4Status)) {if(t_ice < millis()-MIN_DIRECT_CHANGE_TIME || hallDir == 1){txtDir.print("方向","出");hallDir=1;t_ice=millis();}}
else if((rSnsr1Status+rSnsr2Status+rSnsr3Status+rSnsr4Status>=2)&&(rSnsr1Status||rSnsr2Status)&&(rSnsr3Status&&rSnsr4Status)) {if(t_ice < millis()-MIN_DIRECT_CHANGE_TIME || hallDir == -1){txtDir.print("方向","进");hallDir=-1;t_ice=millis();}}
else if(!rSnsr1Status&&rSnsr2Status&&!rSnsr3Status&&rSnsr4Status) {txtDir.print("方向","未知");hallDir=0;}
else hallDir=0;*/
//PeopleChangeTime = millis();
}
/*** led functions ***/
// function for control led :: 0(shutdown),1(open)
int led_ctl(int cmd)
{
if(cmd == 0 && ledStatus == 0)
{
digitalWrite(led, LOW);
if(digitalRead(led) == LOW) {BLINKER_LOG("Run Funtion led_ctl :: led Shutdown");return 1;}
else {BLINKER_LOG("ERROR in Funtion led_ctl :: when led Shutdown");return 0;}
}
if(cmd == 1 && ledStatus == 0)
{
digitalWrite(led, HIGH);
if(digitalRead(led) == HIGH) {BLINKER_LOG("Run Funtion led_ctl :: led Open");ledStatus=1;return 1;}
else {BLINKER_LOG("ERROR in Funtion led_ctl :: when led Open");return 0;}
}
return 0;
}
void led_blink()
{
if(is_People())
if(ledStatus == 1)
{analogWrite(led, (millis()/LED_BLINK_FREQUENCY)%255);}
}
void led_warning()
{
if(ledStatus == -1)
if(millis()%LED_WARNING_FREQUENCY>LED_WARNING_FREQUENCY/2) digitalWrite(led, HIGH);
else digitalWrite(led, LOW);
}
void led_core()
{
led_blink();
led_warning();
if(Mode==1&&ledStatus!=-1) ledStatus = 0;
if(Mode==0&&ledStatus !=-1) ledStatus = 1;
}
/*** alert function ***/
void alert_core()
{
if(Alert) tone(Buz, ((int)millis()/100)%399);
else noTone(Buz);
}
/******** wIoT Functions **************/
void wlight_ctl(int cmd)
{
if(cmd == 0)
{
if(Mode == 1) {led_ctl(0);}
}
if(cmd == 1)
{
if(Mode == 1) {led_ctl(1);}
}
}
void wconnect_status()
{
static int former=0;
if(millis()>LastCnnctTime+OFFLINE_TIME_LIMIT) {former=ledStatus;ledStatus = -1;}
else if(ledStatus == -1&&former!=-1)ledStatus=former;
else ledStatus=1;
}
/******** Blinker Attached Function *********/
void ledBtn_callback(const String & state)
{
if (state == BLINKER_CMD_ON) digitalWrite(led, HIGH);
if (state == BLINKER_CMD_OFF) digitalWrite(led, LOW);
if (state == BLINKER_CMD_BUTTON_TAP) digitalWrite(led, !digitalRead(led));
}
void wledBtn_callback(const String & state)
{
if (state == "1") wlight_ctl(1);
if (state == "0") wlight_ctl(0);
}
void walert_callback(const String & state)
{
if (state == "1") Alert=1;
if (state == "0") Alert=0;
}
/******* Heartbeat Function ********/
// Heartbeat for wIoT
void heartbeat(const String & state)
{
Blinker.print("wIoT",1);
Blinker.print("mode6",Mode);
Blinker.print(W_R1_ID,digitalRead(rSnsr1));
Blinker.print(W_R2_ID,digitalRead(rSnsr2));
Blinker.print(W_R3_ID,digitalRead(rSnsr3));
Blinker.print(W_R4_ID,digitalRead(rSnsr4));
Blinker.print(W_BUZ_ID,digitalRead(Buz));
Blinker.print(W_LS_ID,digitalRead(lightSnsr));
Blinker.print(W_SH_ID,digitalRead(Shake));
Blinker.print(W_TEMP_ID,analogRead(TempSnsr));
Blinker.print(W_LED_ID,ledStatus);
if(state=="1") Mode=1;
else if(state=="0") Mode=0;
LastCnnctTime = millis();
digitalWrite(Source, HIGH);
}
/******* Arduino Setup Funstion *******/
void setup()
{
// Serial ini
Serial.begin(115200);
BLINKER_DEBUG.stream(Serial);
// Pins state declare
pinMode(rSnsr1, INPUT);
pinMode(rSnsr2, INPUT);
pinMode(rSnsr3, INPUT);
pinMode(rSnsr4, INPUT);
pinMode(led, OUTPUT);
pinMode(lightSnsr, INPUT);
pinMode(Buz, OUTPUT);
pinMode(Shake, INPUT);
pinMode(TempSnsr, INPUT);
pinMode(Source, OUTPUT);
digitalWrite(Source, LOW);
// rSnsr ini
rSnsr1Status = digitalRead(rSnsr1);
rSnsr2Status = digitalRead(rSnsr2);
rSnsr3Status = digitalRead(rSnsr3);
rSnsr4Status = digitalRead(rSnsr4);
// Blinker ini
Blinker.begin(auth, ssid, pswd);
// Blinker attached Functions
wIoT.attach(heartbeat);
ledBtn.attach(ledBtn_callback);
wledBtn.attach(wledBtn_callback);
walert.attach(walert_callback);
}
/******** Arduino Main loop Function********/
void loop() {
// Active Blinker
Blinker.run();
// wIoT connection check
wconnect_status();
// led
led_core();
// alert
alert_core();
}