//*******************************************/
//神經(jīng)元2號(hào)控制器
//Neuron Ver 2.02D
//高勝 2012-4-1
//修改 2012-8-12
//電信基站機(jī)房監(jiān)控
//D0-D1為串口和網(wǎng)絡(luò)模塊接口
//OUT1 2號(hào)口(開關(guān)量輸出)煙感報(bào)警器1按鈕接口
//OUT2 3號(hào)口(開關(guān)量輸出)煙感報(bào)警器2按鈕接口
//SG 4號(hào)口(開關(guān)量輸出)室外聲光警報(bào)器輸出口
//VD4 5號(hào)口(開關(guān)量輸出)通訊狀態(tài)燈
//VD3 6號(hào)口(開關(guān)量輸出)設(shè)備故障燈
//VD2 7號(hào)口(開關(guān)量輸入)報(bào)警燈
//IN5 8號(hào)口(開關(guān)量輸入)測(cè)試按鈕
//IN6 9號(hào)口(開關(guān)量輸入)煙感報(bào)警器1接口
//GZ1 10號(hào)口(開關(guān)量輸入)煙感報(bào)警器2接口
//A0 模擬0 (模擬量輸入)采集室外聲光報(bào)警器電壓
//********************************************/
//修改輸出字串 變DD[20] 為 DD[0-19]+DH[4-10] (DH[4-10]為參數(shù))
/*
寫入基本信息指令: {*009,255;010,255;014,060;}
寫入標(biāo)識(shí)信息指令: {*041,001;}
保存指令: {#}
*/
//Lib函數(shù)庫庫
#include <EEPROM.h>
#include <avr/wdt.h> //使用WDT看門狗
//數(shù)字傳感器端口
#define smoke1_pin 9 //煙感報(bào)警器1接口
#define smoke2_pin 10 //煙感報(bào)警器2接口
#define alarm1_test_pin 2 //煙感報(bào)警器1按鈕接口
#define alarm2_test_pin 3 //煙感報(bào)警器2按鈕接口
#define alarm_pin 4 //室外聲光警報(bào)器輸出口
#define reset_pin 4 //電源復(fù)位 (常開接點(diǎn),需要上電是輸出高電平)
#define commled_pin 5 //通訊狀態(tài)燈
#define led_pin 6 //設(shè)備故障燈
#define alarmled_pin 7 //報(bào)警燈
#define testbutton_pin 8 //測(cè)試按鈕
//模擬傳感器端口
#define ac_pin 0 //電源電壓傳感器
#define bj_pin 0 //聲光報(bào)警器電壓傳感器
int count; //程序控制器計(jì)數(shù)器
int connect_count; // 通訊計(jì)數(shù)器
byte alarmcount[20]; //為每個(gè)參數(shù)分配一個(gè)報(bào)警計(jì)數(shù)器
byte unalarmcount[20]; //為每個(gè)參數(shù)分配一個(gè)un報(bào)警計(jì)數(shù)器
byte alarmstatus[20];
//int resetcount;
int status; //系統(tǒng)進(jìn)入空閑狀態(tài)
int address; //程序控制器變量
int values; //程序控制器變量
static uint32_t timer; //計(jì)時(shí)器
boolean testflag = false; //自檢測(cè)時(shí)標(biāo)示
boolean alarmflag = false; //報(bào)警標(biāo)示
int checkcount; //煙感報(bào)警器和聲光報(bào)警器狀態(tài)檢測(cè)周期計(jì)數(shù)器 每1小時(shí)檢測(cè)一次
long jiange;
int DD[20]; //動(dòng)態(tài)數(shù)據(jù) |ADD|NULL|D2|D3|....|D11|D12|D13|A0|..|A5| 一共20個(gè)
byte DH[42]; //[0]:標(biāo)示為"N" 否則認(rèn)定沒有設(shè)置參數(shù)
//[1]-[20]為控制位 1-8字節(jié) 1(1 啟用本通道 0 禁用本通道 ) 2、3(00數(shù)字輸入 01數(shù)字輸出 10
//模擬輸入 11模擬輸出)4(1高位報(bào)警 0低位報(bào)警) 5、6(00不報(bào)、01只監(jiān)控、10上限報(bào)警 11下限報(bào)警)
//7、8(00網(wǎng)絡(luò)報(bào)警 01 聲音 10 短信 11聲音+短信)
//[21]-[40]對(duì)應(yīng)[1]-[20]的報(bào)警數(shù)值
//[41]設(shè)備地址碼
//DH[9] DH[10] fire DH[14] timer
void setup()
{
//初始化串口
Serial.begin(9600);
//煙感報(bào)警器接口(輸入)
pinMode(smoke1_pin,INPUT);
pinMode(smoke2_pin,INPUT);
pinMode(testbutton_pin ,INPUT);
//煙感報(bào)警器測(cè)試按鈕接口(輸出)
pinMode(alarm1_test_pin,OUTPUT);
pinMode(alarm2_test_pin,OUTPUT);
//輸出 LED燈 報(bào)警器 電源復(fù)位
pinMode(led_pin,OUTPUT);
pinMode(commled_pin,OUTPUT);
pinMode(alarmled_pin,OUTPUT);
pinMode(reset_pin,OUTPUT);
pinMode(alarm_pin,OUTPUT);
//拉高電平給設(shè)備供電
digitalWrite(reset_pin, LOW);
digitalWrite(alarm1_test_pin, LOW);
digitalWrite(alarm2_test_pin, LOW);
digitalWrite(alarm_pin, LOW);
int i;
for (i=0;i<20;i++){
alarmcount[i]=0;
}
for (i=0;i<20;i++){
DD[i]=1;
}
//設(shè)備初始化
deviceinit();
//變量初始化
delay(1000);
jiange=millis();
status = 0;
count = 100;
connect_count=0;
//初始化看門狗
wdt_enable(WDTO_8S);
}
//主循環(huán)程序
void loop()
{
byte inbyte;
wdt_reset(); //喂狗
if (Serial.available() > 0){ //從串口接收指令
inbyte = Serial.read(); //
action(inbyte); //調(diào)用控制函數(shù)進(jìn)入指令狀態(tài)
}
if (status==0) //status==0 那么系統(tǒng)進(jìn)入空閑狀態(tài),繼續(xù)采集數(shù)據(jù)、監(jiān)控報(bào)警,否則進(jìn)入忙狀態(tài)暫停采集報(bào)警任務(wù)
{
data_capture(); //數(shù)據(jù)采集
if (testflag==true) {
alarmcheck(); //報(bào)警檢測(cè)
}
if (!digitalRead(testbutton_pin)) //按下自檢測(cè)試按鈕
{
testflag=false;
checkcount=0;
checkfire(); //進(jìn)行火災(zāi)探測(cè)器的自檢測(cè)試
delay(1000);
checkalarm(); //進(jìn)行聲光報(bào)警器的自檢測(cè)試
}
}
//設(shè)備自檢自啟動(dòng)
void selftest(){
Serial.print("<i|SELF_TEST|");
Serial.print(DH[41],DEC);
Serial.println("|>");
for(int i=1;i<=3;i++){
digitalWrite(led_pin, HIGH);
digitalWrite(alarmled_pin, HIGH);
wdt_reset(); //喂狗
delay(3000);
digitalWrite(led_pin, LOW);
digitalWrite(alarmled_pin, LOW);
}
Serial.print("<i|SYSTEM_RESET|");
Serial.print(DH[41],DEC);
Serial.println("|>");
delay(10000); //8S后系統(tǒng)復(fù)位
}