聚丰项目 > 欢乐园丁
欢乐园丁实现的是将互联网游戏QQ农场与物联网智能硬件相结合的产品,实现智能盆栽养护管理以及用户交互分享相结合的应用模式。
huanzxj
分享huanzxj
团队成员
周小军 工程师
1、硬件部分组成为:主控MCU-STM32,辅助MCU-MSP430G2553,温湿度传感器TSY01,水分传感模块Moisture等部分组成;
2、功能说明。
1)主控STM32:负责传感数据的获取以及Wifi模组控制,连接到阿里云。用户可以从APP端访问数据,通过阿里云套件与Wifi模块3080B交互,进而可以控制底端传感模块获取实时数据。
2)辅助MCU-MSP430G2553:辅助进行温湿度采集数据,存储,处理,由于数据量较大,采用了以前项目中使用的较为成熟的建议变送器模块;
3)TSYS01:精度可达到0.01℃的温湿度传感器,采集土壤温湿度数据;
4)Moisture:水分传感模块,实现水分参数检测。
3、相关原理图说明。
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、温湿度传感器数据获取:
#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引脚接地时地址为0xA6,接电源时地址为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起始信号 { SDA_H; //拉高数据线 SCL_H; //拉高时钟线 Delay_us(5); //延时 SDA_L; //产生下降沿 Delay_us(5);//延时 SCL_L; //拉低时钟线 Delay_us(10);//延时 } void IIC_Stop() { SDA_L; //拉低数据线 SCL_H; //拉高时钟线 Delay_us(5); //延时 SDA_H; //产生上升沿 Delay_us(5); //延时 } void IIC_SendACK(void) //主机发送应答信号 { SDA_L; _NOP();_NOP(); SCL_H; //拉高时钟线 Delay_us(5); //延时 SCL_L; //拉低时钟线 _NOP();_NOP(); SDA_H; Delay_us(5); //延时 } void mnack(void) //主机发送无应答信号 { SDA_H; _NOP(); _NOP(); //空指令延时 SCL_H; Delay_us(5); SCL_L; _NOP(); _NOP(); //空指令延时 SDA_L; Delay_us(5); } uchar IIC_RecvACK() //接收应答信号 { uchar ack; SDA_H; _NOP(); _NOP(); SCL_H; _NOP(); _NOP(); SDA_IN; Delay_us(5); ack = SDA_VAL; //读入SDA数值 SCL_L; Delay_us(5); SDA_OUT; if(ack) return 0; //从机无应答 else return 1; //从机有应答 } 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) //发送一个字节 { unsigned char i; for (i = 0; i < 8; i++) { //8位计数器 if(dat&0x80) write1(); else write0(); dat <<= 1; //移出数据的最高位 } return IIC_RecvACK(); } unsigned char IIC_RecvByte() //接收一个字节 { unsigned char i; unsigned char dat = 0,flag; SDA_H; //使能内部上拉,准备读取数据, for (i = 0; i < 8; i++) { //8位计数器 //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复位 { IIC_Start(); //起始信号 IIC_SendByte(DeviceAddress_Write); //发送设备地址+写信号 IIC_SendByte(Reset_cmd); //内部寄存器地址,请参考中文pdf22页 IIC_Stop(); //发送停止信号 } void Read_tsys01_PROM(int cmd,int variable) { IIC_Start(); //起始信号 IIC_SendByte(DeviceAddress_Write); //发送设备地址+写信号 IIC_SendByte(cmd); IIC_Stop(); // Delay_ms(10); IIC_Start(); //起始信号 IIC_SendByte(DeviceAddress_Read); //发送设备地址+读信号 variable = IIC_RecvByte(); IIC_SendACK(); //发送ACK 应答 variable<<=8; variable|= IIC_RecvByte(); mnack(); //最后一个字节无应答 IIC_Stop(); Delay_ms(10); } void conversion(void) //启动转换命令 { IIC_Start(); //起始信号 IIC_SendByte(DeviceAddress_Write); //发送设备地址+写信号 IIC_SendByte(0x48); //转换指令 IIC_Stop(); } void Read_ADC_Result(void) { IIC_Start(); //起始信号 IIC_SendByte(DeviceAddress_Write); //发送设备地址+写信号 IIC_SendByte(0x00); //读ADC Result指令 IIC_Stop(); IIC_Start(); //起始信号 IIC_SendByte(DeviceAddress_Read); //发送设备地址+读信号 ADC24 = IIC_RecvByte(); IIC_SendACK(); //发送ACK 应答 ADC24<<=8; ADC24|= IIC_RecvByte(); IIC_SendACK(); ADC24<<=8; ADC24|= IIC_RecvByte(); //BUF[0]存储0x32地址中的数据 mnack(); //最后一个字节无应答 IIC_Stop(); } void tsys01_int(void) { Reset_tsys01(); //tsys01复位 // 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(); //启动转换 Delay_ms(10); //转换时间不超过9.04ms Read_ADC_Result(); //读取ADC转换结果 k0=40781; k1=32791; k2=36016; k3=24926; k4=28446; ADC16=ADC24/256; double_ADC16=ADC16*ADC16*0.000001; /*代入校准参数进行计算*/ 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、主控程序为Mbed开发,省略;
Wifi模块烧录boot损坏导致无法开机,联系庆科-李博给出了方法,使用J-LINK刷新无效,确认模块已经完全损坏,故无法提供演示效果。
APP开发未能完成,暂时只能是上位机交互模式。