?
目錄
1. 功能介紹
2. 硬件接線介紹
2.1 DS18B20溫度傳感器
2.2 ESP8266 WIFI模塊
3. 案例代碼
3.1 QT設計的上位機
3.2 B節點DS18B20代碼
3.3 協調器-ESP8266代碼
1. 功能介紹
這是基于CC2530設計的遠程溫度報警器,通過CC2530終端檢測環境溫度上傳給手機APP實時顯示。
一共有兩塊CC2530開發板,這里就分別稱為A板(當做協調器)、B板(當做溫度節點),A板上接了ESP8266 WIF模塊,用于與手機APP之間通信。B板上接了DS18B20 溫度傳感器模塊,用于給A板傳遞檢測的溫度,A板收到DS18B20的溫度之后,發送給手機APP顯示。APP上位機采用Qt框架設計,支持跨平臺,Android、windows、IOS、Linux都可以編譯運行安裝。
?編輯
資料包里包含:
2. 硬件接線介紹
2.1 DS18B20溫度傳感器
作為B節點的CC2530開發板上接了DS18B20溫度傳感器,采集溫度傳遞給A節點。
這是B節點的程序,在主函數1秒采集一次DS18B20溫度數據,然后傳遞給A節點。
2.2 ESP8266 WIFI模塊
作為A節點協調器的CC2530開發板用到了2個串口:
(1)串口0—作為常規調試串口,可以向串口調試助手打印調試信息。
(2)串口1—連接ESP8266 WIFI,進行通信。 P0.4,P0.5用作串口
上面這張圖是代碼的截圖,設置ESP8266的AP熱點名稱和密碼。 把ESP8266接線接好之后,在把程序下載進去。 正常情況下,ESP8266就會創建一個名稱為” wbyq_Cortex_M3” 的熱點,連接密碼為”12345678”, 這是打開手機APP搜索這個WIFI名稱,然后連接即可,連接上了,打開專用的手機APP,點擊連接服務器,然后就可以收到ESP8266發送過來的溫度數據了。
下面這個是代碼主函數里,1秒的頻率向APP上傳DS18B20的溫度。
3. 案例代碼
3.1 QT設計的上位機
?編輯
3.2 B節點DS18B20代碼
代碼也可以在這里下載:https://download.csdn.net/download/xiaolong1126626497/75315395
#define Ds18b20IO P0_6 //溫度傳感器引腳
?
void Delay_us(unsigned int k)//us延時函數
{
T1CC0L = 0x06;
T1CC0H = 0x00;
T1CTL = 0x02;
while(k)
{
while(!(T1CNTL >= 0x04));
k--;
}
T1CTL = 0x00; //關閉定時器
}
?
void Delay_ms(unsigned int k)
{
T1CC0L = 0xe8;
T1CC0H = 0x03;
T1CTL = 0x0a; //模模式 32分頻
while(k)
{
while(!((T1CNTL >= 0xe8)&&(T1CNTH >= 0x03)));
k--;
}
T1CTL = 0x00; //關閉定時器
}
?
void Delay_s(unsigned int k)
{
while(k)
{
Delay_ms(1000);
k--;
}
}
?
//時鐘頻率為32M
void Ds18b20Delay(unsigned int k)
{
unsigned int i,j;
for(i=0;i 8000)Flag_1 = 0;
Status = Ds18b20IO;
}
Ds18b20OutputInitial();
Ds18b20IO = 1;
Ds18b20Delay(100);
return Status; //返回初始化狀態
}
?
void Ds18b20Write(unsigned char infor)
{
unsigned int i;
Ds18b20OutputInitial();
for(i=0;i<8;i++)
? {
? ? ? ?if((infor & 0x01))
? ? ? {
? ? ? ? ? ?Ds18b20IO = 0;
? ? ? ? ? ?Ds18b20Delay(6);
? ? ? ? ? ?Ds18b20IO = 1;
? ? ? ? ? ?Ds18b20Delay(50);
? ? ? }
? ? ? ?else
? ? ? {
? ? ? ? ? ?Ds18b20IO = 0;
? ? ? ? ? ?Ds18b20Delay(50);
? ? ? ? ? ?Ds18b20IO = 1;
? ? ? ? ? ?Ds18b20Delay(6);
? ? ? }
? ? ? ?infor >>= 1;
}
}
?
unsigned char Ds18b20Read(void)
{
unsigned char Value = 0x00;
unsigned int i;
Ds18b20OutputInitial();
Ds18b20IO = 1;
Ds18b20Delay(10);
for(i=0;i<8;i++)
? {
? ? ? ?Value >>= 1;
Ds18b20OutputInitial();
Ds18b20IO = 0;// 給脈沖信號
Ds18b20Delay(3);
Ds18b20IO = 1;// 給脈沖信號
Ds18b20Delay(3);
Ds18b20InputInitial();
if(Ds18b20IO == 1) Value |= 0x80;
Ds18b20Delay(15);
}
return Value;
}
?
?
?
//溫度讀取函數 帶1位小數位
float floatReadDs18B20(void)
{
unsigned char V1,V2; //定義高低8位 緩沖
unsigned int temp; //定義溫度緩沖寄存器
float fValue;
Ds18b20Initial();
Ds18b20Write(0xcc); // 跳過讀序號列號的操作
Ds18b20Write(0x44); // 啟動溫度轉換
Ds18b20Initial();
Ds18b20Write(0xcc); //跳過讀序號列號的操作
Ds18b20Write(0xbe); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
V1 = Ds18b20Read(); //低位
V2 = Ds18b20Read(); //高位
//temp = ((V1 >> 4)+((V2 & 0x07)*16)); //轉換數據
temp=V2*0xFF+V1;
fValue = temp*0.0625;
return fValue;
};i++)>
3.3 協調器-ESP8266代碼
#include "esp8266.h"
?
uint lenU1 = 0;
uchar tempRXU1;
uchar RecdataU1[MAXCHAR];
//AP+服務器模式
char *ESP8266_AP_Server[]=
{
"ATrn",
"ATE0rn",
"AT+CWMODE=2rn",
"AT+RSTrn",
"ATE0rn",
"AT+CWSAP="wbyq_Cortex_M3","12345678",1,4rn",
"AT+CIPMUX=1rn",
"AT+CIPSERVER=1,8089rn",
"AT+CIFSRrn"
};
?
?
//"AT+CIPSEND=0,10rn" //長度10
//返回">" 之后就可以正常發送數據了
//發送成功返回 "SEND OK"
?
?
//發送數據
void ESP8266_SendData(char *p,int len)
{
char buff[50];
sprintf(buff,"AT+CIPSEND=0,%drn",len);
clearBuffU1();
Uart1_Send_String(buff);
DelayMs(1000);
RecdataU1[lenU1]='?';
UR0SendString(RecdataU1);
clearBuffU1();
//發送數據
Uart1_Send_String(p);
//等待發送完成
DelayMs(1000);
RecdataU1[lenU1]='?';
UR0SendString(RecdataU1);
clearBuffU1();
}
?
?
/****************************************************************************
* 名 稱: SetWifi()
* 功 能: 設置LED燈相應的IO口
* 入口參數: 無
* 出口參數: 無
****************************************************************************/
void SetWifi(void)
{
P0DIR |= 0x40; //P0.6定義為輸出
IGT = 0; //高電平復位
DelayMs(500);
IGT = 1; //低電平工作
}
?
/*
設置WIFI為AP模式+TCP服務器
*/
void SetESP8266_AP_TCP_Server()
{
clearBuffU1();
Uart1_Send_String("ATrn");
DelayMs(2000);
RecdataU1[lenU1]='?';
UR0SendString(RecdataU1);
clearBuffU1();
Uart1_Send_String("ATE0rn");
DelayMs(2000);
RecdataU1[lenU1]='?';
UR0SendString(RecdataU1);
clearBuffU1();
Uart1_Send_String("AT+CWMODE=2rn");
DelayMs(2000);
RecdataU1[lenU1]='?';
UR0SendString(RecdataU1);
clearBuffU1();
Uart1_Send_String("AT+RSTrn");
DelayMs(2000);
DelayMs(2000);
RecdataU1[lenU1]='?';
UR0SendString(RecdataU1);
clearBuffU1();
Uart1_Send_String("ATE0rn");
DelayMs(2000);
RecdataU1[lenU1]='?';
UR0SendString(RecdataU1);
clearBuffU1();
Uart1_Send_String("AT+CWSAP="wifi_cc2530","12345678",1,4rn");
DelayMs(2000);
RecdataU1[lenU1]='?';
UR0SendString(RecdataU1);
clearBuffU1();
Uart1_Send_String("AT+CIPMUX=1rn");
DelayMs(2000);
RecdataU1[lenU1]='?';
UR0SendString(RecdataU1);
clearBuffU1();
Uart1_Send_String("AT+CIPSERVER=1,8080rn");
DelayMs(2000);
RecdataU1[lenU1]='?';
UR0SendString(RecdataU1);
clearBuffU1();
Uart1_Send_String("AT+CIFSRrn");
DelayMs(2000);
RecdataU1[lenU1]='?';
UR0SendString(RecdataU1);
}
?
?
unsigned char dataRecv;
unsigned char Flag = 0;
/*===================UR1初始化函數====================*/
void Init_Uart1()
{
PERCFG = 0x00; //位置1 P0.4/P0.5口
P0SEL |= 0x30; //P0.4,P0.5用作串口(外部設備功能)
U1CSR |= 0x80; //設置為UART方式
U1GCR |= 11; //BAUD_E
U1BAUD |= 216; //BAUD_M 波特率設為115200
UTX1IF = 0; //UART1 TX中斷標志初始置位0
U1CSR |= 0X40; //允許接收
IEN0 |= 0x88; // 開總中斷,UART1接收中斷
}
?
?
void clearBuffU1(void)
{
int j;
for(j=0;j;j++)>
?
審核編輯:湯梓紅
-
開發板
+關注
關注
25文章
4959瀏覽量
97214 -
溫度報警器
+關注
關注
3文章
29瀏覽量
11238 -
CC2530
+關注
關注
19文章
221瀏覽量
57950
發布評論請先 登錄
相關推薦
評論