个人项目-STM32+机智云上传温湿度和MQ135数据,APP查看
本项目通过STM32的C8t6获取DHT11的温湿度数据,以及空气质量传感器MQ135,通过一块ESP8266模块连接wifi,把数据上传到机智云平台,可通过手机APP查看
1、模块准备
.一块STM32F103C8T6
一块IIC的OLED模块
一个DHT11
一个MQ135空气质量模块
一块ATK-8266wifi模块
一个ST-link下载模块
杜邦线若干
2、程序准备
首先,先让C8T6能够在OLED上正常显示温度、湿度、以及空气污染气体传感器
在这里我主要说一下MQ135的计算,至于DHT11如何显示温度湿度。
请看这里STM32C8T6+DHT11在OLED上显示 温度,湿度!
我这里就主要说一下MQ135的使用以及计算
MQ135的资料
MQ-135气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(Sn02)。当传感器所处环境中存在污染气体时,传感器的电导率随空气中污染气体浓度的增加而增大。使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。
MQ-135气体传感器对氨气,硫化物,苯系蒸气的灵敏度高,对烟雾和其他有害气体的检测也很理想。这种传感器可检测多种有害气体,是一款适合多种应用的低成本传感器。
特点:
1.在较宽的浓度范围内对有害气体有良好的灵敏度2.对氨气,硫化物,苯系等气氛灵敏度较高
3.长寿命,低成本
4.简单的驱动电路
特点
灵敏度特性
规格
MQ135外形
因为我这里要让他显示实时的空气质量所以我选择了模拟量输出
这边用了一个STM32的AD转换
C文件
#include "adc.h"
#include "delay.h"
//STM32C8T6
//ADC 代码
//引脚 PA4
//*@Cheng*/
//初始化ADC
void Adc_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1 , ENABLE ); //使能ADC1通道时钟
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M
//PA1 作为模拟通道输入引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_DeInit(ADC1); //复位ADC1
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在独立模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //模数转换工作在单通道模式
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //模数转换工作在单次转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换由软件而不是外部触发启动
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1; //顺序进行规则转换的ADC通道的数目
ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1
ADC_ResetCalibration(ADC1); //使能复位校准
while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束
ADC_StartCalibration(ADC1); //开启AD校准
while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束
// ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能
}
//获得ADC值
//ch:通道值 0~3
u16 Get_Adc(u8 ch)
{
//设置指定ADC的规则组通道,一个序列,采样时间
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道,采样时间为239.5周期
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
return ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果
}
u16 Get_Adc_Average(u8 ch,u8 times)
{
u32 temp_val=0;
u8 t;
for(t=0;t<times;t++)
{
temp_val+=Get_Adc(ch);
delay_ms(5);
}
return temp_val/times;
头文件
#ifndef __ADC_H
#define __ADC_H
#include "sys.h"
void Adc_Init(void);
u16 Get_Adc(u8 ch);
u16 Get_Adc_Average(u8 ch,u8 times);
#endif
主函数部分以及计算部分
adcx=Get_Adc_Average(ADC_Channel_4,20);
MQ135=(double)adcx/4095*3300/1000;
sprintf(MQ135_BUF,"MQ:%0.3fPM ",MQ135);
//下面这一句是在OLED上的显示,当然也可以用串口打印出来查看
OLED_ShowString(0,6,MQ135_BUF,16);
计算部分我参考了这位老哥的计算公式
3、机智云移植
如果可以正常显示温度和湿度以及MQ135的数值了,那下面就开始准备机智云的移植了,
首先先到机智云官网注册一个账号,然后登陆
首先点击创建个人项目
选择方案,我这里是STM32+WIFi的方案,就选择第一个
然后添加数据点
温度:Temp,类型为数值,控制方式只读,
湿度:Humi,类型为数值,控制方式只读
空气质量:MQ135 ,类型数值,只读,
范围这些就很好理解了
开关类可选择布尔值,比如控制LED
然后保存方案
点开基本信息,获取你的密钥
然后点击MUC方案,点击修改,把你的密钥粘贴,然后生成代码包
点击下载
我用的是标准库,机智云生成的是Hal库,要修改一下,这里我直接给出Usart3和定时器的代码
usart3
#include "usart3.h"
#include "gizwits_product.h"
//串口3中断服务函数
void USART3_IRQHandler(void)
{
u8 res;
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)//接收到数据
{
res =USART_ReceiveData(USART3);
gizPutData(&res, 1);//数据写入到缓冲区
}
}
//初始化IO 串口3
//pclk1:PCLK1时钟频率(Mhz)
//bound:波特率
void usart3_init(u32 bound)
{
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //GPIOB时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); //串口3时钟使能
USART_DeInit(USART3); //复位串口3
//USART3_TX PB10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB10
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB10
//USART3_RX PB11
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB11
USART_InitStructure.USART_BaudRate = bound; //波特率一般设置为9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字长为8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1; //一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No; //无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
USART_Init(USART3, &USART_InitStructure); //初始化串口3
USART_Cmd(USART3, ENABLE); //使能串口
//使能接收中断
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); //开启中断
//设置中断优先级
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
}
#ifndef __USART3_H
#define __USART3_H
#include "sys.h"
void usart3_init(u32 bound); //串口3初始化
#endif
Tiner的
#include "timer.h"
#include "gizwits_product.h"
//通用定时器3中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!
void TIM3_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
//定时器TIM3初始化
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
//中断优先级NVIC设置
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
TIM_Cmd(TIM3, ENABLE); //使能TIMx
}
//定时器3中断服务程序
void TIM3_IRQHandler(void) //TIM3中断
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新中断标志
gizTimerMs();
}
}
#ifndef __TIMER_H
#define __TIMER_H
#include "sys.h"
void TIM3_Int_Init(u16 arr,u16 psc);
#endif
把机智云生成的Pack解压,复制里面的Gizwits和Ultis到C8t6的目录下
然后添加刚刚的Timer usart3.
然后把这些文件添加到C8t6工程里面,include路径等
然后开始打开gizwits_product.c"
程序
/**
************************************************************
* @file gizwits_product.c
* @brief Gizwits control protocol processing, and platform-related hardware initialization
* @author Gizwits
* @date 2017-07-19
* @version V03030000
* @copyright Gizwits
*
* @note 机智云.只为智能硬件而生
* Gizwits Smart Cloud for Smart Products
* 链接|增值ֵ|开放|中立|安全|自有|自由|生态
* www.gizwits.com
*
***********************************************************/
#include <stdio.h>
#include <string.h>
//#include "hal_key.h"
#include "gizwits_product.h"
#include "common.h"
static uint32_t timerMsCount;
uint8_t aRxBuffer;
extern u8 min;
extern u8 sec;
extern u8 hou;
extern u16 Year;
extern u8 Month;
extern u8 Day;
/** User area the current device state structure*/
extern dataPoint_t currentDataPoint;
//extern keysTypedef_t keys;
//extern TIM_HandleTypeDef htim2;
//extern UART_HandleTypeDef huart1;
//extern UART_HandleTypeDef huart2;
/**@} */
/**@name Gizwits User Interface
* @{
*/
/**
* @brief Event handling interface
* Description:
* 1. Users can customize the changes in WiFi module status
* 2. Users can add data points in the function of event processing logic, such as calling the relevant hardware peripherals operating interface
* @param [in] info: event queue
* @param [in] data: protocol data
* @param [in] len: protocol data length
* @return NULL
* @ref gizwits_protocol.h
*/
int8_t gizwitsEventProcess(eventInfo_t *info, uint8_t *gizdata, uint32_t len)
{
uint8_t i = 0;
dataPoint_t *dataPointPtr = (dataPoint_t *)gizdata;
moduleStatusInfo_t *wifiData = (moduleStatusInfo_t *)gizdata;
protocolTime_t *ptime = (protocolTime_t *)gizdata;
#if MODULE_TYPE
gprsInfo_t *gprsInfoData = (gprsInfo_t *)gizdata;
#else
moduleInfo_t *ptModuleInfo = (moduleInfo_t *)gizdata;
#endif
if((NULL == info) || (NULL == gizdata))
{
return -1;
}
for(i=0; i<info->num; i++)
{
switch(info->event[i])
{
case EVENT_LED1:
currentDataPoint.valueLED1 = dataPointPtr->valueLED1;
GIZWITS_LOG("Evt: EVENT_LED1 %d \n", currentDataPoint.valueLED1);
if(0x01 == currentDataPoint.valueLED1)
{
//user handle
}
else
{
//user handle
}
break;
case WIFI_SOFTAP:
break;
case WIFI_AIRLINK:
break;
case WIFI_STATION:
break;
case WIFI_CON_ROUTER:
break;
case WIFI_DISCON_ROUTER:
break;
case WIFI_CON_M2M:
break;
case WIFI_DISCON_M2M:
break;
case WIFI_RSSI:
GIZWITS_LOG("RSSI %d\n", wifiData->rssi);
break;
case TRANSPARENT_DATA:
GIZWITS_LOG("TRANSPARENT_DATA \n");
//user handle , Fetch data from [data] , size is [len]
break;
case WIFI_NTP:
GIZWITS_LOG("WIFI_NTP : [%d-%d-%d %02d:%02d:%02d][%d] \n",ptime->year,ptime->month,ptime->day,ptime->hour,ptime->minute,ptime->second,ptime->ntp);
sec=ptime->second;//获取年月日时分秒
min=ptime->minute;
hou=ptime->hour;
Day=ptime->day;
Month=ptime->month;
Year=ptime->year;
break;
case MODULE_INFO:
GIZWITS_LOG("MODULE INFO ...\n");
#if MODULE_TYPE
GIZWITS_LOG("GPRS MODULE ...\n");
//Format By gprsInfo_t
#else
GIZWITS_LOG("WIF MODULE ...\n");
//Format By moduleInfo_t
GIZWITS_LOG("moduleType : [%d] \n",ptModuleInfo->moduleType);
#endif
break;
default:
break;
}
}
return 0;
}
/**
* User data acquisition
* Here users need to achieve in addition to data points other than the collection of data collection, can be self-defined acquisition frequency and design data filtering algorithm
* @param none
* @return none
*/
//void userHandle(void)
//{
// /*
// currentDataPoint.valueTemperature = ;//Add Sensor Data Collection
// currentDataPoint.valuehumidity = ;//Add Sensor Data Collection
// currentDataPoint.valueMQ135 = ;//Add Sensor Data Collection
// currentDataPoint.valueBEEP = ;//Add Sensor Data Collection
// */
//
//}
///**
//* Data point initialization function
//* In the function to complete the initial user-related data
//* @param none
//* @return none
//* @note The developer can add a data point state initialization value within this function
//*/
//void userInit(void)
//{
// memset((uint8_t*)¤tDataPoint, 0, sizeof(dataPoint_t));
//
// /** Warning !!! DataPoint Variables Init , Must Within The Data Range **/
// /*
// currentDataPoint.valueLED1 = ;
// currentDataPoint.valueTemperature = ;
// currentDataPoint.valuehumidity = ;
// currentDataPoint.valueMQ135 = ;
// currentDataPoint.valueBEEP = ;
// */
//}
/**
* @brief Millisecond timing maintenance function, milliseconds increment, overflow to zero
* @param none
* @return none
*/
void gizTimerMs(void)
{
timerMsCount++;
}
/**
* @brief Read millisecond count
* @param none
* @return millisecond count
*/
uint32_t gizGetTimerCount(void)
{
return timerMsCount;
}
/**
* @brief MCU reset function
* @param none
* @return none
*/
void mcuRestart(void)
{
__set_FAULTMASK(1);
NVIC_SystemReset();
}
/**@} */
//#ifdef __GNUC__
// /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
// set to 'Yes') calls __io_putchar() */
// #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
//#else
// #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
//#endif /* __GNUC__ */
///**
// * @brief Retargets the C library printf function to the USART.
// * @param None
// * @retval None
// */
//PUTCHAR_PROTOTYPE
//{
// /* Place your implementation of fputc here */
// /* e.g. write a character to the USART1 and Loop until the end of transmission */
// HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
//
// return ch;
//}
/**
* @brief Period elapsed callback in non blocking mode
* @param htim : TIM handle
* @retval None
*/
//void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
//{
// if(htim==&htim2)
// {
// keyHandle((keysTypedef_t *)&keys);
// gizTimerMs();
// }
//}
///**
//* @brief Timer TIM3 init function
//* @param none
//* @return none
//*/
//void timerInit(void)
//{
// HAL_TIM_Base_Start_IT(&htim2);
//}
///**
// * @brief This function handles USART IDLE interrupt.
// */
//void HAL_UART_RxCpltCallback(UART_HandleTypeDef*UartHandle)
//{
// if(UartHandle->Instance == USART2)
// {
// gizPutData((uint8_t *)&aRxBuffer, 1);
// HAL_UART_Receive_IT(&huart2, (uint8_t *)&aRxBuffer, 1);//开启下一次接收中断
// }
//}
/**
* @brief USART init function
* Serial communication between WiFi modules and device MCU
* @param none
* @return none
*/
//void uartInit(void)
//{
// HAL_UART_Receive_IT(&huart2, (uint8_t *)&aRxBuffer, 1);//开启下一次接收中断
//}
/**
* @brief Serial port write operation, send data to WiFi module
*
* @param buf : buf address
* @param len : buf length
*
* @return : Return effective data length;-1,return failure
*/
int32_t uartWrite(uint8_t *buf, uint32_t len)
{
uint8_t crc[1] = {0x55};
uint32_t i = 0;
if(NULL == buf)
{
return -1;
}
for(i=0; i<len; i++)
{
// HAL_UART_Transmit_IT(&huart2, (uint8_t *)&buf[i], 1);
// while (huart2.gState != HAL_UART_STATE_READY);//Loop until the end of transmission
// if(i >=2 && buf[i] == 0xFF)
// {
// HAL_UART_Transmit_IT(&huart2, (uint8_t *)&crc, 1);
// while (huart2.gState != HAL_UART_STATE_READY);//Loop until the end of transmission
// }
USART_SendData(USART3,buf[i]);
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET); //循环发送,直到发送完毕
if(i >=2 && buf[i] == 0xFF)
{
USART_SendData(USART3,0x55);
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET); //循环发送,直到发送完毕
}
}
#ifdef PROTOCOL_DEBUG
GIZWITS_LOG("MCU2WiFi[%4d:%4d]: ", gizGetTimerCount(), len);
for(i=0; i<len; i++)
{
GIZWITS_LOG("%02x ", buf[i]);
if(i >=2 && buf[i] == 0xFF)
{
GIZWITS_LOG("%02x ", 0x55);
}
}
GIZWITS_LOG("\n");
#endif
return len;
}
接下来处理Main函数部分
由于我这边以及处理好了,我就给你们看就好了
u8 min=0;
u8 sec=0;
u8 hou=0;
u16 Year=2021;
u8 Month=05;
u8 Day=30;
//协议初始化
void Gizwits_Init(void)
{
TIM3_Int_Init(9,7199);//1MS系统定时
usart3_init(9600);//WIFI初始化
memset((uint8_t*)¤tDataPoint, 0, sizeof(dataPoint_t));//设备状态结构体初始化
gizwitsInit();//缓冲区初始化
}
void userHandle()
{
DHT11_Read_Data(&temperature,&humidity); //读取温湿度值
currentDataPoint.valueTemperature=temperature;//温度
currentDataPoint.valuehumidity=humidity; //湿度
currentDataPoint.valueMQ135 =MQ135;
//LED=currentDataPoint.valueLED1;//控制LED灯
//
// adcx=Get_Adc_Average(ADC_Channel_4,20);
// MQ135=(double)adcx/4096*3300/1000;
//
}
然后是通过按键连接wifi部分
gizwitsGetNTP();//获取网络时间
userHandle();//获取传感器数据
if(wifi_con==wifi_sta)
wifi_con?printf("connect"):printf("close");
gizwitsHandle((dataPoint_t*)¤tDataPoint);
adcx=Get_Adc_Average(ADC_Channel_4,20);
MQ135=(double)adcx/4096*3300/1000;
//OLED_ShowString(95,0,"WiFi",16);
if(Key_Scan(GPIOA,GPIO_Pin_0) == KEY_ON)
{ //OLED_Clear() ;
printf("wifi进入连接模式\r\n");
OLED_ShowString(0,6,"AIRLINK_MODE",16);
gizwitsSetMode(WIFI_AIRLINK_MODE);
//LED=0;
delay_ms(800) ;
//OLED_Clear() ;
}
接下里是获取网络时间的部分
//定义
extern u8 min;
extern u8 sec;
extern u8 hou;
extern u16 Year;
extern u8 Month;
extern u8 Day;
在文件gizwits_product.c"里面找到
在这一句下面获取时间信息,
GIZWITS_LOG("WIFI_NTP : [%d-%d-%d %02d:%02d:%02d][%d] \n",ptime->year,ptime->month,ptime->day,ptime->hour,ptime->minute,ptime->second,ptime->ntp);
sec=ptime->second;//获取年月日时分秒
min=ptime->minute;
hou=ptime->hour;
Day=ptime->day;
Month=ptime->month;
Year=ptime->year;
主函数部分代码
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "rxc6.h"
#include "usart.h"
#include "beep.h"
#include "pwm_output.h"
#include "string.h"
#include "stm32f10x.h"
#include "zhiwen.h"
#include "oled.h"
#include "stdio.h"
#include "dht11.h"
#include "usart3.h"
#include "timer.h"
#include "gizwits_product.h"
#include "adc.h"
/***************STM32F103C8T6**********************
* 文件名 :main.h
* 描述 : DHT11温湿度显示OLED
* 实验平台:STM32F103C8T6
* 备注 :
* 接口 :
* 缺点 :
****************STM32F103C8T6**********************/
/* 用户区当前设备状态结构体*/
dataPoint_t currentDataPoint;
//WIFI连接状态
//wifi_sta 0: 断开
// 1: 已连接
u8 wifi_sta=0;
u8 min=0;
u8 sec=0;
u8 hou=0;
u16 Year=0;
u8 Month=0;
u8 Day=0;
u8 temperature=10;
u8 humidity=20;
u8 wifi=0;
u8 Tim_BUF[20];
u8 tem_BUF[20];
u8 hum_BUF[20];
u8 date_BUF[20];
u16 adcx=0;
u8 MQ135_BUF[20];
double MQ135=0;
u8 s=0;
u8 wifi_con=0;
//协议初始化
void Gizwits_Init(void)
{
TIM3_Int_Init(9,7199);//1MS系统定时
usart3_init(9600);//WIFI初始化
memset((uint8_t*)¤tDataPoint, 0, sizeof(dataPoint_t));//设备状态结构体初始化
gizwitsInit();//缓冲区初始化
}
void userHandle()
{
DHT11_Read_Data(&temperature,&humidity); //读取温湿度值
currentDataPoint.valueTemperature=temperature;//温度
currentDataPoint.valuehumidity=humidity; //湿度
currentDataPoint.valueMQ135 =MQ135;
//LED=currentDataPoint.valueLED1;//控制LED灯
}
int main(void)
{
Adc_Init();
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
LED_Init(); //LED端口初始化
zhiwen_Init();
Key_GPIO_Config(); //矩阵键盘初始化
Gizwits_Init();
//key(); //矩阵键盘返回值函数初始化
SystemInit(); //配置系统时钟为72M
TIM1_PWM_Init(); //TIM1 PWM波输出初始化,并使能TIM1 PWM输出
//printf("矩阵键盘测试\r\n"); //在串口上打印出矩阵键盘测试
DHT11_Init();
OLED_Init(); //初始化OLED
OLED_Clear();
LED=1;
while(1)
{
gizwitsGetNTP();
userHandle();
if(wifi_con==wifi_sta)
wifi_con?printf("connect"):printf("close");
gizwitsHandle((dataPoint_t*)¤tDataPoint);
adcx=Get_Adc_Average(ADC_Channel_4,20);
MQ135=(double)adcx/4096*3300/1000;
//OLED_ShowString(95,0,"WiFi",16);
if(Key_Scan(GPIOA,GPIO_Pin_0) == KEY_ON)
{ OLED_Clear() ;
printf("wifi进入AIRLINK模式\r\n");
OLED_ShowString(0,6,"AIRLINK_MODE",16);
gizwitsSetMode(WIFI_AIRLINK_MODE);
//LED=0;
delay_ms(800) ;
OLED_Clear() ;
}//else OLED_Clear()
if(!DHT11_Check())
{
printf("\r\n EEROR! THE DHT11 HAS NO RESPOND...");
OLED_ShowString(0,6,"DHT11 Error!",16);
}
//DHT11_Read_Data(&temperature,&humidity); //读取温湿度值
sprintf(Tim_BUF,"%02d:%02d:%02d",hou,min,sec);
sprintf(date_BUF,"%02d/%02d/%02d",Year,Month,Day);
sprintf(tem_BUF,"%d ",temperature);
sprintf(hum_BUF,"%d ",humidity);
sprintf(MQ135_BUF,"MQ:%0.3fPM ",MQ135);
if (s==0)
{
OLED_Clear() ;
OLED_ShowCHinese(0,4,0);//温
OLED_ShowCHinese(16,4,1);//度
OLED_ShowCHinese(62,4,4);//℃
OLED_ShowString(36,4,tem_BUF,16);
OLED_ShowCHinese(0,6,2);//湿
OLED_ShowCHinese(16,6,3);//度
OLED_ShowString(36,6,hum_BUF,16);
OLED_ShowString(62,6,"%RH",16);
} else
{
OLED_Clear() ;
OLED_ShowString(0,6,MQ135_BUF,16);
}
OLED_ShowString(0,0,date_BUF,16);
OLED_ShowString(0,2,Tim_BUF,16);
OLED_ShowString(96,0,"WiFi",16);
if (wifi_sta==1)
{
OLED_ShowCHinese(76,2,7);//已
OLED_ShowCHinese(92,2,8);//连
OLED_ShowCHinese(110,2,9);//接
}else
{
OLED_ShowCHinese(76,2,10);//已
OLED_ShowCHinese(92,2,11);//断
OLED_ShowCHinese(110,2,12);//开
}
delay_ms(700);
s=!s;
//OLED_Clear();
}
}
注:某些你们没有的头文件记得注释掉
把代码编译通过后就下载到开发板里面
然后按下按键,因为我的是c8t6的系统版,有一个按键,你们没有的可以用一个杜邦线接3.3来代替一下。
按下按键进入AIRLINK,然后机智云点击我的设备界面的右上角的+,点击一键配置然后手机连接一个2.4g的wifi,然后等待配置成功
4、效果
开发板运行效果
还可以在官网查看数据变化曲线
码云地址:C8T6_OLED_DHT11_MQ135LOT(无product key…
版权声明:本文为CSDN博主「行之天道总司一切」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41930631/article/details/117562739
暂无评论