/*
采用外接電源單獨供電,2 3口作為軟串口接PC機作為調(diào)試端
1 0為串口,連接WIFI模塊
*/
#include <SoftwareSerial.h>
#include "edp.c"
#include<dht11.h>
dht11 DHT11;
#define KEY "" //APIkey
#define ID "" //設(shè)備ID
//#define PUSH_ID "680788"
#define PUSH_ID NULL
// 串口
#define _baudrate 9600
#define _rxpin 3
#define _txpin 2
#define WIFI_UART Serial
#define DBG_UART dbgSerial //調(diào)試打印串口
#define DHT11PIN A0 //溫濕度傳感器的pin
#define MQ2 A1 //MQ-2傳感器的pin
#define FMQ 9 //蜂鳴器pin
SoftwareSerial dbgSerial( _rxpin, _txpin ); // 軟串口,調(diào)試打印
edp_pkt *pkt;
/*
* doCmdOk
* 發(fā)送命令至模塊,從回復(fù)中獲取期待的關(guān)鍵字
* keyword: 所期待的關(guān)鍵字
* 成功找到關(guān)鍵字返回true,否則返回false
*/
bool doCmdOk(String data, char *keyword)
{
bool result = false;
if (data != "") //對于tcp連接命令,直接等待第二次回復(fù)
{
WIFI_UART.println(data); //發(fā)送AT指令
DBG_UART.print("SEND: ");
DBG_UART.println(data);
}
if (data == "AT") //檢查模塊存在
delay(2000);
else
while (!WIFI_UART.available()); // 等待模塊回復(fù)
delay(200);
if (WIFI_UART.find(keyword)) //返回值判斷
{
DBG_UART.println("do cmd OK");
result = true;
}
else
{
DBG_UART.println("do cmd ERROR");
result = false;
}
while (WIFI_UART.available()) WIFI_UART.read(); //清空串口接收緩存
delay(500); //指令時間間隔
return result;
}
void setup()
{
char buf[100] = {0};
int tmp;
pinMode(13, OUTPUT); //WIFI模塊指示燈
pinMode(8, OUTPUT); //用于連接EDP控制的發(fā)光二極管
WIFI_UART.begin( _baudrate );
DBG_UART.begin( _baudrate );
WIFI_UART.setTimeout(3000); //設(shè)置find超時時間
delay(3000);
DBG_UART.println("hello world!");
delay(2000);
while (!doCmdOk("AT", "OK"));
digitalWrite(13, HIGH); // 使Led亮
while (!doCmdOk("AT+CWMODE=3", "OK")); //工作模式
while (!doCmdOk("AT+CWJAP=\"wififname\",\"password\"", "OK"));
while (!doCmdOk("AT+CIPSTART=\"TCP\",\"183.230.40.39\",876", "CONNECT"));
while (!doCmdOk("AT+CIPMODE=1", "OK")); //透傳模式
while (!doCmdOk("AT+CIPSEND", ">")); //開始發(fā)送
}
void loop()
{
static int edp_connect = 0;
bool trigger = false;
edp_pkt rcv_pkt;
unsigned char pkt_type;
int i, tmp;
char num[10];
int wd; //溫度
int sd; //濕度
int mq; //氣體
char wd1[10]; //字符串格式溫度
char sd1[10]; //字符串格式濕度
char mq1[10]; //字符串格式氣體
int chk = DHT11.read(DHT11PIN);//讀DHT11c
mq = analogRead(MQ2);
if(mq>=200)
digitalWrite(FMQ, HIGH); //蜂鳴器響
/* EDP 連接 */
if (!edp_connect)
{
while (WIFI_UART.available()) WIFI_UART.read(); //清空串口接收緩存
packetSend(packetConnect(ID, KEY)); //發(fā)送EPD連接包
while (!WIFI_UART.available()); //等待EDP連接應(yīng)答
if ((tmp = WIFI_UART.readBytes(rcv_pkt.data, sizeof(rcv_pkt.data))) > 0 )
{
rcvDebug(rcv_pkt.data, tmp);
if (rcv_pkt.data[0] == 0x20 && rcv_pkt.data[2] == 0x00 && rcv_pkt.data[3] == 0x00)
{
edp_connect = 1;
DBG_UART.println("EDP connected.");
}
else
DBG_UART.println("EDP connect error.");
}
packetClear(&rcv_pkt);
}
wd = (float)DHT11.temperature;//獲取溫度
sd = (float)DHT11.humidity;//獲取濕度
trigger = wd; //傳感器是否工作
if (edp_connect && trigger)
{
DBG_UART.print("temperature: ");
DBG_UART.println((float)DHT11.temperature, 2);
DBG_UART.print("humidity: ");
DBG_UART.println((float)DHT11.humidity, 2);
DBG_UART.print("MQ-2: ");
DBG_UART.println(analogRead(MQ2));
sprintf(wd1,"%d",wd); //int型轉(zhuǎn)換char型
sprintf(sd1,"%d",sd); //int型轉(zhuǎn)換char型
sprintf(mq1,"%d",mq); //int型轉(zhuǎn)換char型
packetSend(packetDataSaveTrans(PUSH_ID, "WD", wd1)); //發(fā)送數(shù)據(jù)存儲包 當PUSH_ID不為NULL時轉(zhuǎn)發(fā)至PUSH_ID
delay(100);
packetSend(packetDataSaveTrans(NULL, "SD", sd1)); //發(fā)送的數(shù)據(jù)必須為字符串 ""
delay(100);
packetSend(packetDataSaveTrans(NULL, "MQ", mq1));
delay(2000);
}
while (WIFI_UART.available())
{
readEdpPkt(&rcv_pkt);
if (isEdpPkt(&rcv_pkt))
{
pkt_type = rcv_pkt.data[0];
switch (pkt_type)
{
case CMDREQ:
char edp_command[50];
char edp_cmd_id[40];
long id_len, cmd_len, rm_len;
char datastr[20];
char val[10];
memset(edp_command, 0, sizeof(edp_command));
memset(edp_cmd_id, 0, sizeof(edp_cmd_id));
edpCommandReqParse(&rcv_pkt, edp_cmd_id, edp_command, &rm_len, &id_len, &cmd_len);
DBG_UART.print("rm_len: ");
DBG_UART.println(rm_len, DEC);
delay(10);
DBG_UART.print("id_len: ");
DBG_UART.println(id_len, DEC);
delay(10);
DBG_UART.print("cmd_len: ");
DBG_UART.println(cmd_len, DEC);
delay(10);
DBG_UART.print("id: ");
DBG_UART.println(edp_cmd_id);
delay(10);
DBG_UART.print("cmd: ");
DBG_UART.println(edp_command);
//數(shù)據(jù)處理與應(yīng)用中EDP命令內(nèi)容對應(yīng)
//本例中格式為 datastream:[1/0]
sscanf(edp_command, "%[^:]:%s", datastr, val);//datastr為數(shù)據(jù)流名
if (atoi(val) == 1)
digitalWrite(13, HIGH); // 使Led亮
else
digitalWrite(13, LOW); // 使Led滅
packetSend(packetDataSaveTrans(NULL, datastr,val)); //將新數(shù)據(jù)值上傳至數(shù)據(jù)流
break;
default:
DBG_UART.print("unknown type: ");
DBG_UART.println(pkt_type, HEX);
break;
}
}
//delay(4);
}
if (rcv_pkt.len > 0)
packetClear(&rcv_pkt);
delay(150);
//packetSend(packetDataSaveTrans(NULL, "text", 5)); //將新數(shù)據(jù)值上傳至數(shù)據(jù)流
}
/*
* readEdpPkt
* 從串口緩存中讀數(shù)據(jù)到接收緩存
*/
bool readEdpPkt(edp_pkt *p)
{
int tmp;
if ((tmp = WIFI_UART.readBytes(p->data + p->len, sizeof(p->data))) > 0 )
{
rcvDebug(p->data + p->len, tmp);
p->len += tmp;
}
return true;
}
/*
* packetSend
* 將待發(fā)數(shù)據(jù)發(fā)送至串口,并釋放到動態(tài)分配的內(nèi)存
*/
void packetSend(edp_pkt* pkt)
{
if (pkt != NULL)
{
WIFI_UART.write(pkt->data, pkt->len); //串口發(fā)送
WIFI_UART.flush();
free(pkt); //回收內(nèi)存
}
}
void rcvDebug(unsigned char *rcv, int len)
{
int i;
DBG_UART.print("rcv len: ");
DBG_UART.println(len, DEC);
for (i = 0; i < len; i++)
{
DBG_UART.print(rcv[i], HEX);
DBG_UART.print(" ");
}
DBG_UART.println("");
}
|