聚豐項(xiàng)目 > 歡樂園丁
歡樂園丁實(shí)現(xiàn)的是將互聯(lián)網(wǎng)游戲QQ農(nóng)場(chǎng)與物聯(lián)網(wǎng)智能硬件相結(jié)合的產(chǎn)品,實(shí)現(xiàn)智能盆栽養(yǎng)護(hù)管理以及用戶交互分享相結(jié)合的應(yīng)用模式。
huanzxj

huanzxj
團(tuán)隊(duì)成員
周小軍 工程師

1、硬件部分組成為:主控MCU-STM32,輔助MCU-MSP430G2553,溫濕度傳感器TSY01,水分傳感模塊Moisture等部分組成;
2、功能說明。
1)主控STM32:負(fù)責(zé)傳感數(shù)據(jù)的獲取以及Wifi模組控制,連接到阿里云。用戶可以從APP端訪問數(shù)據(jù),通過阿里云套件與Wifi模塊3080B交互,進(jìn)而可以控制底端傳感模塊獲取實(shí)時(shí)數(shù)據(jù)。
2)輔助MCU-MSP430G2553:輔助進(jìn)行溫濕度采集數(shù)據(jù),存儲(chǔ),處理,由于數(shù)據(jù)量較大,采用了以前項(xiàng)目中使用的較為成熟的建議變送器模塊;
3)TSYS01:精度可達(dá)到0.01℃的溫濕度傳感器,采集土壤溫濕度數(shù)據(jù);
4)Moisture:水分傳感模塊,實(shí)現(xiàn)水分參數(shù)檢測(cè)。
3、相關(guān)原理圖說明。
1)水分傳感模塊原理圖:

2、TSYS01部分原理圖:

1、430串口通信程序:
#include "msp430g2553.h"
//#include "12864.h"
#include "uart.h"
#define CPU_F ((double)8000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
#define uchar unsigned char
//extern int guangzhaozhi,turangzhi;
//uchar cflag=0;
//uchar i1,i2;
//uchar tu[]={0,0,0};
//uchar guang[]={0,0,0,0,0};
void int_port(void) //初始化I/O口
{
// P1SEL&=~BIT0;
// P1DIR&=BIT0;
// P2SEL&=~(BIT6+BIT7);
// P2DIR&=~(BIT6+BIT0+BIT7);
P1SEL&=~(BIT6+BIT7);
P1DIR|=BIT6+BIT7;
}
void initurt(void)
{
//WDTCTL = WDTPW + WDTHOLD; // Stop WDT
// P1DIR = 0xFF; // All P1.x outputs
// P1OUT = 0; // All P1.x reset
//P1OUT|=BIT6;
P1DIR |= BIT2;
P1SEL = BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXD
P1SEL2= BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXD
UCA0CTL1 |= UCSSEL_2; // CLK = ACLK
UCA0BR0 = 0x41; // 32kHz/9600 = 3.41
UCA0BR1 = 0x03; //
//UCA0MCTL = UCBRS1 + UCBRS0; // Modulation UCBRSx = 3
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
IE2 |= UCA0RXIE; // Enable USCI_A0 RX interrupt
}
// Echo back RXed character, confirm TX buffer is ready first
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
if(UCA0RXBUF=='c')
{
}
}2、溫濕度傳感器數(shù)據(jù)獲?。?br/>
#include "msp430g2553.h"
#include "tsys01.h"
#define SCL_H P1OUT |= BIT6 //I2C使用引腳:P1.6(SCL) P1.7(SDA)
#define SCL_L P1OUT &= ~BIT6
#define SDA_H P1OUT |= BIT7
#define SDA_L P1OUT &= ~BIT7
#define SDA_IN P1DIR &= ~BIT7 //SDA改成輸入模式
#define SDA_OUT P1DIR |= BIT7 //SDA變回輸出模式
#define SDA_VAL P1IN&BIT7 //SDA的bit值
#define CPU_F ((double)8000000)
#define Delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define Delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
#define _NOP() __no_operation()
#define DeviceAddress_Write 0xee //定義器件在IIC總線中的從地址
#define DeviceAddress_Read 0xef //定義器件在IIC總線中的從地址
#define Reset_cmd 0x1e
#define uchar unsigned char
#define uint unsigned int //ALT ADDRESS引腳接地時(shí)地址為0xA6,接電源時(shí)地址為0x3A
long ADC24,ADC16;
long k0,k1,k2,k3,k4;
float Temperature=0.0;
double double_ADC16,aa,ADC16_k4,ADC16_k3,ADC16_k2,ADC16_k1,ADC16_k0;
char ack1,ack2;
int t;
uint ge,shi,bai,qian;
void IIC_Start() //IIC起始信號(hào)
{
SDA_H; //拉高數(shù)據(jù)線
SCL_H; //拉高時(shí)鐘線
Delay_us(5); //延時(shí)
SDA_L; //產(chǎn)生下降沿
Delay_us(5);//延時(shí)
SCL_L; //拉低時(shí)鐘線
Delay_us(10);//延時(shí)
}
void IIC_Stop()
{
SDA_L; //拉低數(shù)據(jù)線
SCL_H; //拉高時(shí)鐘線
Delay_us(5); //延時(shí)
SDA_H; //產(chǎn)生上升沿
Delay_us(5); //延時(shí)
}
void IIC_SendACK(void) //主機(jī)發(fā)送應(yīng)答信號(hào)
{
SDA_L;
_NOP();_NOP();
SCL_H; //拉高時(shí)鐘線
Delay_us(5); //延時(shí)
SCL_L; //拉低時(shí)鐘線
_NOP();_NOP();
SDA_H;
Delay_us(5); //延時(shí)
}
void mnack(void) //主機(jī)發(fā)送無應(yīng)答信號(hào)
{
SDA_H;
_NOP(); _NOP(); //空指令延時(shí)
SCL_H;
Delay_us(5);
SCL_L;
_NOP(); _NOP(); //空指令延時(shí)
SDA_L;
Delay_us(5);
}
uchar IIC_RecvACK() //接收應(yīng)答信號(hào)
{
uchar ack;
SDA_H;
_NOP(); _NOP();
SCL_H;
_NOP(); _NOP();
SDA_IN;
Delay_us(5);
ack = SDA_VAL; //讀入SDA數(shù)值
SCL_L;
Delay_us(5);
SDA_OUT;
if(ack) return 0; //從機(jī)無應(yīng)答
else return 1; //從機(jī)有應(yīng)答
}
void write1(void) //寫"1"
{
SDA_H;
Delay_us(5);
SCL_H;
Delay_us(5);
SCL_L;
Delay_us(5);
}
void write0(void) //寫"0"
{
SDA_L;
Delay_us(5);
SCL_H;
Delay_us(5);
SCL_L;
Delay_us(5);
}
char IIC_SendByte(unsigned char dat) //發(fā)送一個(gè)字節(jié)
{
unsigned char i;
for (i = 0; i < 8; i++)
{ //8位計(jì)數(shù)器
if(dat&0x80)
write1();
else
write0();
dat <<= 1; //移出數(shù)據(jù)的最高位
}
return IIC_RecvACK();
}
unsigned char IIC_RecvByte() //接收一個(gè)字節(jié)
{
unsigned char i;
unsigned char dat = 0,flag;
SDA_H; //使能內(nèi)部上拉,準(zhǔn)備讀取數(shù)據(jù),
for (i = 0; i < 8; i++)
{ //8位計(jì)數(shù)器
//SDA_H;
//Delay5us();
SCL_H;
SDA_IN;
Delay_us(5);
flag=SDA_VAL;
dat <<= 1;
if(flag)
dat|=0x01;
SDA_OUT;
SCL_L;
Delay_us(5);
}
return dat;
}
void Reset_tsys01(void) //tsys01復(fù)位
{
IIC_Start(); //起始信號(hào)
IIC_SendByte(DeviceAddress_Write); //發(fā)送設(shè)備地址+寫信號(hào)
IIC_SendByte(Reset_cmd); //內(nèi)部寄存器地址,請(qǐng)參考中文pdf22頁
IIC_Stop(); //發(fā)送停止信號(hào)
}
void Read_tsys01_PROM(int cmd,int variable)
{
IIC_Start(); //起始信號(hào)
IIC_SendByte(DeviceAddress_Write); //發(fā)送設(shè)備地址+寫信號(hào)
IIC_SendByte(cmd);
IIC_Stop();
// Delay_ms(10);
IIC_Start(); //起始信號(hào)
IIC_SendByte(DeviceAddress_Read); //發(fā)送設(shè)備地址+讀信號(hào)
variable = IIC_RecvByte();
IIC_SendACK(); //發(fā)送ACK 應(yīng)答
variable<<=8;
variable|= IIC_RecvByte();
mnack(); //最后一個(gè)字節(jié)無應(yīng)答
IIC_Stop();
Delay_ms(10);
}
void conversion(void) //啟動(dòng)轉(zhuǎn)換命令
{
IIC_Start(); //起始信號(hào)
IIC_SendByte(DeviceAddress_Write); //發(fā)送設(shè)備地址+寫信號(hào)
IIC_SendByte(0x48); //轉(zhuǎn)換指令
IIC_Stop();
}
void Read_ADC_Result(void)
{
IIC_Start(); //起始信號(hào)
IIC_SendByte(DeviceAddress_Write); //發(fā)送設(shè)備地址+寫信號(hào)
IIC_SendByte(0x00); //讀ADC Result指令
IIC_Stop();
IIC_Start(); //起始信號(hào)
IIC_SendByte(DeviceAddress_Read); //發(fā)送設(shè)備地址+讀信號(hào)
ADC24 = IIC_RecvByte();
IIC_SendACK(); //發(fā)送ACK 應(yīng)答
ADC24<<=8;
ADC24|= IIC_RecvByte();
IIC_SendACK();
ADC24<<=8;
ADC24|= IIC_RecvByte(); //BUF[0]存儲(chǔ)0x32地址中的數(shù)據(jù)
mnack(); //最后一個(gè)字節(jié)無應(yīng)答
IIC_Stop();
}
void tsys01_int(void)
{
Reset_tsys01(); //tsys01復(fù)位
// Delay_us(10);
Delay_ms(10);
Read_tsys01_PROM(0xaa,k0);
Read_tsys01_PROM(0xa8,k1);
Read_tsys01_PROM(0xa6,k2);
Read_tsys01_PROM(0xa4,k3);
Read_tsys01_PROM(0xa2,k4);
// Delay_ms(10);
}
void get_data(void)
{
conversion(); //啟動(dòng)轉(zhuǎn)換
Delay_ms(10); //轉(zhuǎn)換時(shí)間不超過9.04ms
Read_ADC_Result(); //讀取ADC轉(zhuǎn)換結(jié)果
k0=40781;
k1=32791;
k2=36016;
k3=24926;
k4=28446;
ADC16=ADC24/256;
double_ADC16=ADC16*ADC16*0.000001;
/*代入校準(zhǔn)參數(shù)進(jìn)行計(jì)算*/
ADC16_k4=-2*k4*0.00001*double_ADC16*0.0001*double_ADC16;
ADC16_k3=4*k3*0.0000000001*double_ADC16*ADC16;
ADC16_k2=-2*k2*0.00001*double_ADC16;
ADC16_k1=k1*0.000001*ADC16;
ADC16_k0=-1.5*k0*0.01;
Temperature=ADC16_k4+ADC16_k3+ADC16_k2+ADC16_k1+ADC16_k0;
t=(int)(Temperature*100);
qian=(int)t/1000;
bai =t%1000/100;
shi=t%100/10;
ge=t%10;
while (!(IFG2&UCA0TXIFG));
UCA0TXBUF=qian+'0';
while (!(IFG2&UCA0TXIFG));
UCA0TXBUF=bai+'0';
while (!(IFG2&UCA0TXIFG));
UCA0TXBUF='.';
while (!(IFG2&UCA0TXIFG));
UCA0TXBUF=shi+'0';
while (!(IFG2&UCA0TXIFG));
UCA0TXBUF=ge+'0';
// while (!(IFG2&UCA0TXIFG));
// UCA0TXBUF='C';
while (!(IFG2&UCA0TXIFG));
UCA0TXBUF='\n';
}3、主控程序?yàn)镸bed開發(fā),省略;
Wifi模塊燒錄boot損壞導(dǎo)致無法開機(jī),聯(lián)系慶科-李博給出了方法,使用J-LINK刷新無效,確認(rèn)模塊已經(jīng)完全損壞,故無法提供演示效果。
APP開發(fā)未能完成,暫時(shí)只能是上位機(jī)交互模式。