//单片机头文件
#include "stm32f10x.h"
//硬件驱动
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "dht11.h"
#include "ds18b20.h"
#include "oled.h"
#include "adc.h"
//C库
#include
void Hardware_Init(void);
void OLED_Display(void);
u8 temp,temp_soil,humi,soil,light,co2,slave=1;
int beep,pump,led,fan,Auto=0;
int temp_min=20,soiltemp_min=15;
int humi_min=35,soilhumi_min=30;
int light_min=45,co2_min=30;
int main(void)
{
unsigned short timeCount = 0; //发送间隔变量
unsigned char *dataPtr = NULL;
Hardware_Init(); //初始化外围硬件
Adc_Init();
EXTIX_Init();
OLED_Clear();
while(1)
{
if(++timeCount >= 10) //发送间隔设置
{
DHT11_Read_Data(&temp,&humi);
temp_soil = DS18B20_Get_Temp()/10;
light = 100 - (float)Get_Adc(ADC_Channel_6)/4096*100;
soil = 100 - (float)Get_Adc(ADC_Channel_7)/4096*100;
co2 = (float)Get_Adc(ADC_Channel_4)/4096*100;
OLED_Display(); //屏幕显示
warning_control();
}
//printf("T:%2d,H:%2d,S:%2d,O:%2d,L:%2d,C:%2d",temp,humi,temp_soil,soil,light,co2);
UsartPrintf(USART_DEBUG, "S:%2d,T:%2d,H:%2d,S:%2d,O:%2d,L:%2d,C:%2d",slave,temp,humi,temp_soil,soil,light,co2);
DelayMs(50);
}
}
void Hardware_Init(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断控制器分组设置
Delay_Init(); //systick初始化
Usart1_Init(9600); //串口1,打印信息用
Usart2_Init(115200); //串口2,驱动ESP8266用
OLED_Init();
DHT11_Init();
DS18B20_Init();
PUMP_Init(); //水泵
FAN_Init(); //FAN
Led_Init(); //LED
WARNING_Init(); //蜂鸣器
OLED_Clear();
OLED_ShowString(0,0,"Hardware init OK",16);
DelayMs(1000);
}
int select=0,state=0;
void OLED_Display(void)
{
char buf[3];
if(select==0)
{
if(state==0)
{
OLED_Clear();
state=1;
}
OLED_ShowString(0,0,"Co2:",8);
OLED_ShowString(0,1,"Tem1:",8);
OLED_ShowString(0,2,"Hum1:",8);
OLED_ShowString(0,3,"Tem2:",8);
OLED_ShowString(0,4,"Hum2:",8);
OLED_ShowString(0,5,"ligh:",8);
sprintf(buf, "%2d", co2);
OLED_ShowString(40,0,buf,8); //气体
sprintf(buf, "%2d", temp);
OLED_ShowString(40,1,buf,8); //温度
sprintf(buf, "%2d", humi);
OLED_ShowString(40,2,buf,8); //湿度
sprintf(buf, "%2d", temp_soil);
OLED_ShowString(40,3,buf,8); //土壤温度
sprintf(buf, "%2d", soil);
OLED_ShowString(40,4,buf,8); //土壤湿度
sprintf(buf, "%2d", light);
OLED_ShowString(40,5,buf,8); //光照强度
if(fan) OLED_ShowString(64,0,"fan :on ",8);
else OLED_ShowString(64,0,"fan :off",8);
if(pump) OLED_ShowString(64,1,"pump:on ",8);
else OLED_ShowString(64,1,"pump:off",8);
if(led) OLED_ShowString(64,2,"led :on ",8);
else OLED_ShowString(64,2,"led :off",8);
if(beep) OLED_ShowString(64,3,"beep:on ",8);
else OLED_ShowString(64,3,"beep:off",8);
if(Auto) OLED_ShowString(64,4,"Auto:on ",8);
else OLED_ShowString(64,4,"Auto:off",8);
}
else{
if(state==0)
{
OLED_Clear();
state=1;
}
OLED_ShowString(48,0,"temp",8);
sprintf(buf, "%2d", temp_min);
OLED_ShowString(10,0,buf,8);
OLED_ShowString(32,1,"soiltemp",8);
sprintf(buf, "%2d", soiltemp_min);
OLED_ShowString(10,1,buf,8);
OLED_ShowString(48,2,"humi",8);
sprintf(buf, "%2d", humi_min);
OLED_ShowString(10,2,buf,8);
OLED_ShowString(32,3,"soilhumi",8);
sprintf(buf, "%2d", soilhumi_min);
OLED_ShowString(10,3,buf,8);
OLED_ShowString(44,4,"light",8);
sprintf(buf, "%2d", light_min);
OLED_ShowString(10,4,buf,8);
OLED_ShowString(52,5,"co2",8);
sprintf(buf, "%2d", co2_min);
OLED_ShowString(10,5,buf,8);
}
}
主机代码:
//单片机头文件
#include "stm32f10x.h"
//网络协议层
#include "onenet.h"
//网络设备
#include "esp8266.h"
//硬件驱动
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "dht11.h"
#include "oled.h"
#include "adc.h"
//C库
#include
#define ESP8266_ONENET_INFO "AT+CIPSTART=\"TCP\",\"mqtts.heclouds.com\",1883\r\n"
void Hardware_Init(void);
void OLED_Display(void);
u8 temp1,temp_soil1,humi1,soil1,light1,co21;
u8 temp2,temp_soil2,humi2,soil2,light2,co22;
int pump1,led1,fan1,Auto1,pump2,led2,fan2,Auto2,beep,Auto;
int main(void)
{
unsigned short timeCount = 0; //发送间隔变量
unsigned char *dataPtr = NULL;
Hardware_Init(); //初始化外围硬件
ESP8266_Init(); //初始化ESP8266
OLED_Clear();
OLED_ShowString(0,0,"Connect MQTTs Server...",16);
while(ESP8266_SendCmd(ESP8266_ONENET_INFO, "CONNECT"))
DelayXms(500);
OLED_ShowString(0,4,"Connect MQTT Server Success",16); DelayXms(500);
OLED_Clear();
OLED_ShowString(0,0,"Device login ...",16);
while(OneNet_DevLink()) //接入OneNET
{
ESP8266_SendCmd(ESP8266_ONENET_INFO, "CONNECT");
DelayXms(500);
}
OneNET_Subscribe();
OLED_Clear();
while(1)
{
if(++timeCount >= 350) //发送间隔设置
{
OLED_Display(); //屏幕显示
OneNet_SendData(); //发送数据
warning_control(); //控制模式
UsartPrintf(USART_DEBUG, "S:%1d,P:%1d,L:%1d,F:%1d,A:%1d",1,pump1,led1,fan1,Auto1);
DelayMs(10);
UsartPrintf(USART_DEBUG, "S:%1d,P:%1d,L:%1d,F:%1d,A:%1d",2,pump2,led2,fan2,Auto2);
DelayMs(10);
timeCount = 0;
ESP8266_Clear();
}
//dataPtr = ESP8266_GetIPD(0);
//if(dataPtr != NULL) OneNet_RevPro(dataPtr);
}
}
void Hardware_Init(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断控制器分组设置
Delay_Init(); //systick初始化
Usart1_Init(9600); //串口1,Zigbee用
Usart2_Init(115200); //串口2,驱动ESP8266用
Usart3_Init(9600); //串口3,打印信息用
WARNING_Init(); //蜂鸣器初始化
OLED_Init(); //初始化OLED
OLED_Clear();
OLED_ShowString(0,0,"Hardware init OK",16);
DelayMs(1000);
}
void OLED_Display(void)
{
char buf[10];
OLED_ShowString(0,0,"co2 : ",8);
OLED_ShowString(0,1,"temp: ",8);
OLED_ShowString(0,2,"humi: ",8);
OLED_ShowString(0,3,"tem2: ",8);
OLED_ShowString(0,4,"hum2: ",8);
OLED_ShowString(0,5,"ligh: ",8);
sprintf(buf, "%2d", co21);
OLED_ShowString(58,0,buf,8); //co2值
sprintf(buf, "%2d", temp1);
OLED_ShowString(58,1,buf,8); //温度值
sprintf(buf, "%2d", humi1);
OLED_ShowString(58,2,buf,8); //湿度值
sprintf(buf, "%2d", temp_soil1);
OLED_ShowString(58,3,buf,8); //温度值
sprintf(buf, "%2d", soil1);
OLED_ShowString(58,4,buf,8); //湿度值
sprintf(buf, "%2d", light1);
OLED_ShowString(58,5,buf,8); //光照值
sprintf(buf, "%2d", co22);
OLED_ShowString(88,0,buf,8); //co2值
sprintf(buf, "%2d", temp2);
OLED_ShowString(88,1,buf,8); //温度值
sprintf(buf, "%2d", humi2);
OLED_ShowString(88,2,buf,8); //湿度值
sprintf(buf, "%2d", temp_soil2);
OLED_ShowString(88,3,buf,8); //温度值
sprintf(buf, "%2d", soil2);
OLED_ShowString(88,4,buf,8); //湿度值
sprintf(buf, "%2d", light2);
OLED_ShowString(88,5,buf,8); //光照值
if(beep) OLED_ShowString(0,6,"Beep:on ",8);
else OLED_ShowString(0,6,"Beep:off",8);
if(Auto) OLED_ShowString(0,7,"Auto:on ",8);
else OLED_ShowString(0,7,"Auto:off",8);
}