一、CC2530核心板电路设计。
(1)器件选型,填写好选型表,粘贴在此。
器件名称及封装 |
所需数量 |
单价 |
MINI-USB |
1 |
8.9 |
晶振 |
1 |
3.03 |
电容 |
6 |
0.08 |
LED |
7 |
0.06 |
电阻 |
14 |
0.1 |
三极管 |
1 |
2.52 |
继电器 |
1 |
7.96 |
滑动电阻 |
1 |
9.8 |
开关 |
4 |
0.24 |
AMS117-3.3 |
1 |
2.65 |
CH340 |
1 |
12.8 |
(2)原理图设计--清楚截图并简要说明。
IO口配置我们需要配置的寄存器,外部中断需要配置三个寄存器,IRCON:中断标志4,;0为无中断请求。1为有中断请求。TIMIF:定时器1的溢出中断屏蔽与定时器3、4的中断标志。D6为定时器1的溢出中断屏蔽,0为屏蔽,1为使能,默认为1.D5~D0为定时器3和4中各个通道的中断标志,T3 定时器主要是配置三个寄存器,定时器3或定时器4的方式控制寄存器。
(3)PCB设计--清楚截图并简要说明。
定义一块宽为1800mil,长为2000mil的单层电路板。设置度量单位为英制,分别设置可视栅格、捕获栅格、元件栅格和电气栅格的数值为20mil,25mil,25mil,10mil,在Topoverlayer层上放置字符串,旋转角度为30度。设置底层丝印层的颜色为100号色。设置多边形敷铜栅格尺寸为20mil,路径宽度为5mil,最小长度为3mil,焊盘环绕形状为八边形。
二、CC2530底板电路设计。
(1)器件选型,填写好选型表,粘贴在此。
器件名称及封装 |
所需数量 |
单价 |
CC2530 |
1 |
20 |
电容 |
18 |
0.08 |
电阻 |
4 |
0.1 |
晶振 |
1 |
3.03 |
SMA |
1 |
4.81 |
(2)原理图设计--清楚截图并简要说明。
CC2530 具有一个IEEE 802.15.4 兼容无线收发器。RF 内核控制模拟无线模块。另外,它提供了MCU 和无线设备之间的一个接口, 它有三种不同的内存访问总线(SFR,DATA 和CODE/XDATA),单周期访问SFR,DATA 和主SRAM。它还包括一个调试接口和一个18 输入扩展中断单元。 中断控制器总共提供了18 个中断源,分为六个中断组,每个与四个中断优先级之一相关
(3)PCB设计--清楚截图并简要说明。
在Topoverlayer层上放置字符串,旋转角度为30度。设置底层丝印层的颜色为100号色。设置多边形敷铜栅格尺寸为20mil,路径宽度为5mil,最小长度为3mil,焊盘环绕形状为八边形。定义一块宽为1800mil,长为2000mil的单层电路板。设置度量单位为英制,分别设置可视栅格、捕获栅格、元件栅格和电气栅格的数值为20mil,25mil,25mil,10mil.
三、网关模块电路设计。
(1)器件选型,填写好选型表,粘贴在此。
器件名称及封装 |
所需数量 |
单价 |
MicroUSB |
1 |
8.8 |
CH340 |
1 |
12.8 |
晶振 |
1 |
3.03 |
电容 |
5 |
0.08 |
LED |
6 |
0.06 |
电阻 |
13 |
0.1 |
三极管 |
2 |
2.52 |
开关 |
2 |
0.24 |
ESP8266 |
1 |
28.00 |
继电器 |
1 |
7.96 |
DHT11 |
1 |
6.90 |
蜂鸣器 |
1 |
2.90 |
光敏电阻 |
1 |
3.3 |
(2)原理图设计--清楚截图并简要说明。
1、电源转换电路:对从USB接口输入的电流进行稳压稳流处理
2、USB转TTL电路:带电阻负载的BJT反相器,其动态性能不理想。在保持逻辑功能不变的前提下,可以另外增加若干元器以改善其动态性能,如减少由于BJT基区电荷存储效应和负载电容所引起的时延。
3、USB接口电路:传输电流以及信息
4、序号1~18组成9组的跳线帽:各个接口直接的连接与断开
5、ESP8266模块接口:主要模块,匹配串口实现数据传输
6、蜂鸣器:GPIO14引脚,低电平触发
7、光敏电路:光敏电路,实现感光效果
8、温湿度(DHT11)电路:测量温湿度
9、彩灯电路:R、G、B三色彩灯模块
10、按键和电路指示灯:系统重启按键,LED灯指示
11、继电器电路:电路控制模块,控制高低电压的流通
(3)PCB设计--清楚截图并简要说明。
定义一块宽为1800mil,长为2000mil的单层电路板。设置度量单位为英制,分别设置可视栅格、捕获栅格、元件栅格和电气栅格的数值为20mil,25mil,25mil,10mil,在Topoverlayer层上放置字符串,旋转角度为30度。设置底层丝印层的颜色为100号色。设置多边形敷铜栅格尺寸为20mil,路径宽度为5mil,最小长度为3mil,焊盘环绕形状为八边形。
包括:电源转换电路:ESP8266IO口、外部传感器电源接口、外部彩灯接口,ESP8266模块接口,USB转TTL电路及USB接口电路,蜂鸣器及光敏电路,温湿度(DHT11)电路,彩灯电路,按键和电路指示灯,继电器电路。
四、程序设计。
(1)CC2530数据采集关键代码并详细注释。
static void appSwitch()
{
// halLcdWriteLine(HAL_LCD_LINE_1, "Switch");
// halLcdWriteLine(HAL_LCD_LINE_2, "Joystick Push");
// halLcdWriteLine(HAL_LCD_LINE_3, "Send Command");
#ifdef ASSY_EXP4618_CC2420 //液晶模块的定义,我们不用管他
halLcdClearLine(1);
halLcdWriteSymbol(HAL_LCD_SYMBOL_TX, 1);
#endif
// pTxData[0] = LIGHT_TOGGLE_CMD;
char data[APP_PAYLOAD_LENGTH]="DHT11:1&";
// for(int i=0;0==data[i]-'0';i++)
// {
// pTxData[i+1]=data[i];
// }
// pTxData="DHT11:123&";
//sprintf(pTxData,"%s",data);
// Initialize BasicRF
basicRfConfig.myAddr = SWITCH_ADDR;
if(basicRfInit(&basicRfConfig)==FAILED) { //Basic RF 启动中的初始化,就是Basic RF 启动的第 3 步 HAL_ASSERT(FALSE);
}
pTxData[0] = LIGHT_TOGGLE_CMD;//Basic RF 发射第 1 步,把要发射的数据或者命令放入一个数据 buffer,此处把灯状态改变的命令 LIGHT_TOGGLE_CMD 放到 pTxData 中。
basicRfReceiveOff();//由于模块只需要发射,所以把接收屏蔽掉以降低功耗。
// Main loop
while (TRUE) {
// if( halJoystickPushed() ) { / qiujie tech
if(halButtonPushed()==HAL_BUTTON_1){ //按键 S1 被按下,if(halButtonPushed()==HAL_BUTTON_1)判断是否 S1 按下,函数halButtonPushed()是 halButton.c 里面的,它的功能是:按键 S1有 被 按 动 时 , 就 回 返 回 true ,则进入basicRfSendPacket(LIGHT_ADDR, pTxData, APP_PAYLOAD_LENGTH);
basicRfSendPacket(LIGHT_ADDR, data, APP_PAYLOAD_LENGTH);
//Basic RF 发射第 2 步,也是发送数据最关键的一步,
// Put MCU to sleep. It will wake up on joystick interrupt
halIntOff();
halMcuSetLowPowerMode(HAL_MCU_LPM_3); // Will turn on global
// interrupt enable
halIntOn();//使能中断发送的 appSwitch()讲解完毕,接下来就到我们的接收 appLight()函数了
}
}
}
(2)CC2530引脚控制关键代码并详细注释。
//函数声明
void Delay(uint);
void initUARTSEND(void);
void UartTX_Send_String(char *Data,int len);
char Txdata[50]={0};
void initUARTSEND(void)
{
CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振
while(CLKCONSTA & 0x40); //等待晶振稳定
CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ
PERCFG = 0x00; //位置1 P0口
P0SEL = 0x3c; //P0_2,P0_3,P0_4,P0_5用作串口
P2DIR &= ~0XC0; //P0优先作为UART0
U0CSR |= 0x80; //UART方式
U0GCR |= 11;
U0BAUD |= 216; //波特率设为115200
UTX0IF = 0; //UART0 TX中断标志初始置位0
}
(3)CC2530实现Zigbee数据传输关键代码并详细注释。
void zb_ReceiveDataIndication( uint16 source, uint16 command, uint16 len, uint8 *pData )
{
char buf[32];
//接收到数据之后LED灯闪烁
HalLedSet( HAL_LED_1, HAL_LED_MODE_OFF );
HalLedSet( HAL_LED_1, HAL_LED_MODE_BLINK );
if (len==6 && pData[0]==0xff) {
sprintf(buf, "DEVID:%02X SAddr:%02X%02X PAddr:%02X%02X",
pData[5], pData[1], pData[2], pData[3], pData[4]);
debug_str(buf);//将数据通过串口传递给上位机
}
}
void zb_HandleOsalEvent( uint16 event )//用户处理函数
{
if (event & ZB_ENTRY_EVENT) {//当有事件发送时
uint8 startOptions;
uint8 logicalType;
zb_ReadConfiguration( ZCD_NV_LOGICAL_TYPE, sizeof(uint8), &logicalType );//ZigBee读设置
if ( logicalType != ZG_DEVICETYPE_ENDDEVICE )
{
logicalType = ZG_DEVICETYPE_ENDDEVICE;
zb_WriteConfiguration(ZCD_NV_LOGICAL_TYPE, sizeof(uint8), &logicalType);// ZigBee写设置
}
zb_ReadConfiguration( ZCD_NV_STARTUP_OPTION, sizeof(uint8), &startOptions );
if (startOptions != ZCD_STARTOPT_AUTO_START) {
startOptions = ZCD_STARTOPT_AUTO_START;//ZigBee自动绑定
zb_WriteConfiguration( ZCD_NV_STARTUP_OPTION, sizeof(uint8), &startOptions );
}
HalLedSet( HAL_LED_2, HAL_LED_MODE_OFF );//设置灯灭 HalLedSet( HAL_LED_2, HAL_LED_MODE_FLASH ); //设置灯闪烁
}
if ( event & MY_START_EVT )//当有消息请求时
{
zb_StartRequest();
}
if (event & MY_REPORT_EVT) {//
myReportData();//采集数据
osal_start_timerEx( sapi_TaskID, MY_REPORT_EVT, REPORT_DELAY );// 返回成功或设定时间无效, 该函数是一个定时函数,网络组建成功后,每隔一段时间就会去执行
}
}
(4)CC2530串口数据通信关键代码并详细注释。
void UartTX_Send_String(char *Data,int len)//串口发送字符串函数
{
int j;
for(j=0;j<len;j++)
{
U0DBUF = *Data++;
while(UTX0IF == 0);
UTX0IF = 0;
}
}
static void appLight()
{
/*************************************************
halLcdWriteLine(HAL_LCD_LINE_1, "Light");
halLcdWriteLine(HAL_LCD_LINE_2, "Ready");
***************************************************/
#ifdef ASSY_EXP4618_CC2420LCD// 内容暂时不用理它
halLcdClearLine(1);
halLcdWriteSymbol(HAL_LCD_SYMBOL_RX, 1);
#endif
// Initialize BasicRF
basicRfConfig.myAddr = LIGHT_ADDR;
if(basicRfInit(&basicRfConfig)==FAILED) {//Basic RF 启动中的初始化,上面 Basic RF 启动的第 3 步
HAL_ASSERT(FALSE);
}
basicRfReceiveOn();//函数 basicRfReceiveOn(),开启无线接收功能,调用这个函数后模块一直会接收,除非再调用 basicRfReceiveOff()使它关闭接收。
// Main loop
while (TRUE) { //程序开始进行不断扫描的循环
while(!basicRfPacketIsReady());//Basic RF 接收的第 1 步,while(!basicRfPacketIsReady()) 检查是否接收上层数据, char shuju[20]={0};
//Basic RF 接收的第 2步,if(basicRfReceive(pRxData, APP_PAYLOAD_LENGTH,NULL)>0)判断否接收到有数据
// UartTX_Send_String(shuju,APP_PAYLOAD_LENGTH);
if(basicRfReceive(pRxData, APP_PAYLOAD_LENGTH, NULL)>0) {
//if(pRxData[0] == LIGHT_TOGGLE_CMD)判断接收到的数据是否就是发送函数里面的 LIGHT_TOGGLE_CMD
//if(pRxData[0] == LIGHT_TOGGLE_CMD) {
// UartTX_Send_String(pRxData[0],APP_PAYLOAD_LENGTH);
//shuju[0]=pRxData[1];
UartTX_Send_String(pRxData,strlen(pRxData));
// strcpy(Txdata,"1"); //将UART0 TX test赋给Txdata;
//UartTX_Send_String(pRxData,strlen(pRxData)); //串口发送数据
halLedToggle(1); //halLedToggle(1),改变 Led1 的状态。
// }
}
}
}
(5)网关模块模式控制及数据发送关键代码并详细注释。
//串口0数据接收函数
void UartData_cb(uint8 c){
//插入数据到缓冲RxData
RxData[RxLen]=c;
//os_sprintf(RxData,"%s","DHT11:123&");
//os_printf("RxData1:%24s\n",RxData);
//RxData[RxLen];
RxLen++;//每接收一个数据长度加一
if(c=='&'){
//os_printf("RxData:%s\n",RxData);
if(RxLen>=MAX_LEN) RxLen=0;//数据接收长度超出了范围,清零
char *PA;
char *PB;
PA=strstr(RxData,"DHT11:");
PA+=6;
PB=strstr(PA,"&");
os_memcpy(data.pc,PA,PB-PA);//清空,准备下次继续接收数据
//DHT11:2^45#& 23^45
//DHT11:28^71#&
char *PA1;
char *PB1;
char *PA2;
PA1=PA;
PB1=strstr(PA1,"^");
//pc:28^72# wendu:28^72#& shidu:^72
os_memcpy(data.wendu,PA1,PB1-PA1);//读取温度数据
PA2=PB1+1;
char *PC;
PC = strstr(PA2,"#");
os_memcpy(data.shidu,PA2,PC-PA2);//读取湿度数据
os_printf("pc:%s\t",data.pc);
os_printf("wendu:%s\n\t",data.wendu);
os_printf("shidu:%s\n\t",data.shidu);
//收到#号结束就去控制灯
ets_memset(RxData, 0, MAX_LEN);
RxLen=0;
}
}
void ICACHE_FLASH_ATTR
Wifi_conned(void *arg)
{
static uint8 count=0;
uint8 status;
os_timer_disarm(&connect_timer);
count++;
//检测STA连接状态
status=wifi_station_get_connect_status();
if(status==STATION_GOT_IP)
{
os_printf("Wifi connect success!");
//如果连接成功
//启动一个服务器
struct ip_info info;
const char remote_ip[4]={192,168,1,102};
wifi_get_ip_info(STATION_IF,&info);
os_printf("\r\n------STA ip:%d.%d.%d.%d.---------\r\n",
ip4_addr1(&info.ip.addr),
ip4_addr2(&info.ip.addr),
ip4_addr3(&info.ip.addr),
ip4_addr4(&info.ip.addr));
//启动TCP服务器,端口哦80,webservice默认port是80
server_init(&info.ip,80);
return;
}
else
{
if(count>=7)//等待超时
{
os_printf("Wifi connect fail!");
return;
}
}
os_timer_arm(&connect_timer,2000,false);
}
(6)网页设计核心代码段并添加必要注释
<html><head>//使用AJAX,异步刷新
<meta http-equiv=Content-Type content="text/html; charset=utf-8">
<title>室内环境监控</title>
<meta name='viewport' content='width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0'/>
<style type="text/css">
</style>
<body style="background-color: #f9e79f ">
<center>
<div>
<br><br><br>
<h1>基于WiFi的室内环境监控系统</h1>
</div>
<br>
<div><h2>
温度: <span id="temp_val">0</span>
<span id="Tdanwei"> ℃</span><br><br>
湿度: <span id="humi_val">0</span>
<span id="Hdanwei"> %RH</span><br><br>
</h2>
</div>
<script>
let status=false;
let status1=false;
setInterval(function()
{
getTempData();
getHumiData();
}, 700);
function getTempData() {
if(status)x.abort();
var xhttp = new XMLHttpRequest();
status=true;
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
status=false;
document.getElementById("temp_val").innerHTML =
this.responseText;//把接收的数据转换为文本
}
};
xhttp.open("GET", "tempread", true);//配置参数
xhttp.send();//发送数据
}
function getHumiData() {
if(status1)x.abort();
var xhttp = new XMLHttpRequest();
status1=true;
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
status1=false;
document.getElementById("humi_val").innerHTML =
this.responseText;
}
};
xhttp.open("GET", "humiread", true);
xhttp.send();
}
</script>
</center>
</body>
</html>
五、项目总结。要求:从电路原理、驱动程序设计、问题攻克、意义等方面展开总结,不少于500字。
CC2530核心板中IO口配置我们需要配置的寄存器,外部中断需要配置三个寄存器,IRCON:中断标志4,;0为无中断请求。1为有中断请求。TIMIF:定时器1的溢出中断屏蔽与定时器3、4的中断标志。D6为定时器1的溢出中断屏蔽,0为屏蔽,1为使能,默认为1.D5~D0为定时器3和4中各个通道的中断标志,T3 定时器主要是配置三个寄存器,定时器3或定时器4的方式控制寄存器。CC2530 具有一个IEEE 802.15.4 兼容无线收发器。RF 内核控制模拟无线模块。另外,它提供了MCU 和无线设备之间的一个接口, 它有三种不同的内存访问总线(SFR,DATA 和CODE/XDATA),单周期访问SFR,DATA 和主SRAM。它还包括一个调试接口和一个18 输入扩展中断单元。 中断控制器总共提供了18 个中断源,分为六个中断组,每个与四个中断优先级之一相关。
ESP8266 可以控制蜂鸣器,继电器,一个LED灯的颜色,蜂鸣器,光敏电路,DHT11,按键控制等,支持IIC总线,支持UART,可支持一个数字输入/输出口,不能直接接入模拟输入/输出设置,通过WIFI连接其他设备进行通信,可以采用AP模式,STA+AP模式工作。包括:电源转换电路:ESP8266IO口、外部传感器电源接口、外部彩灯接口,ESP8266模块接口,USB转TTL电路及USB接口电路,蜂鸣器及光敏电路,温湿度(DHT11)电路,彩灯电路,按键和电路指示灯,继电器电路。
在画PCB板时定义一块宽为1800mil,长为2000mil的单层电路板。设置度量单位为英制,分别设置可视栅格、捕获栅格、元件栅格和电气栅格的数值为20mil,25mil,25mil,10mil,在Topoverlayer层上放置字符串,旋转角度为30度。设置底层丝印层的颜色为100号色。设置多边形敷铜栅格尺寸为20mil,路径宽度为5mil,最小长度为3mil,焊盘环绕形状为八边形。在画电路图时有部分电子元件在库里面没有,需要我们在网上下载包含了对应元器件的元件库导入进去,或者也可以自己画出来,在铺设PCB板时,如果为了图快,直接选择自动布线会出现后续用的时候线之间会有干扰,导致结果出不来。但是毕竟只有2天时间,为了省时间还是选择了自动布线,在设置孔尺寸时一样的电子元件要设置一样的孔径。
在物联网短距离通信课上学到可以用CC2530与其他CC2530板子通信,用一个协调器,一个路由,一个终端,前提是它必须在一个Zigbee无线局域网里,如果它还没有入网,那么它仅仅是一个下载了响应功能代码的模块而已。下载了路由器和终端代码的模块,上电后第一件事是去寻找网络,请求加入;网络是不会平白无故产生的,所以创建网络这个工作由下载了协调器代码的模块来完成,下载协调器代码的模块上电的第一件事是去创建网络。任何一个网络,第一个节点一定是该网络的协调器,一个网络里有且仅有一个协调器。文章来源:https://www.toymoban.com/news/detail-577732.html
ESP8266支持3种工作模式”STA”、“AP”、“STA+AP”模式。STA模式:该模块通过路由器连接网络,手机或者电脑实现该设备的远程控制。AP模式:该模块作为热点,手机或者电脑连接wifi与该模块通信,实现局域网的无线控制。STA+AP模式:两种模式共存,既可以通过路由器连接到互联网,也可以作为WiFi热点,使其他设备连接到这个模块,实现广域网与局域网的无缝切换。文章来源地址https://www.toymoban.com/news/detail-577732.html
到了这里,关于CC2530+ESP8266 环境监测系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!