本帖最后由 gaoyang9992006 于 2015-12-11 14:46 编辑
这么好的内容,不仅要回复可见,而且要连载,我一步一步做,然后一楼一楼的帖。。。之所以神奇是因为百度找不到这样的例子,我逛了几家的论坛也没有找到,那个LCD如何驱动显示字符串啊,显示单个字符啊,同时读取DHT11和MQ-2了。哈哈,是不是感觉像国产凌凌漆里的达文西。。。要你命3000
这个是基于去年参加活动送的板子:STM32F429i discovery 的板子做的。目前刚刚写了显示代码,读取DHT11,这个是温湿度传感器,下面的电压是MQ-2的。刚做个初步,希望大家回复给我个动力啊,后面我要干大事了。代码什么的,我先把这个板子研究透了,每一步我都发帖,代码在宿舍,晚上回去慢慢改,然后我上代码,谢谢,第一个图,是我刚调试好DHT11时候的情况,第二个是测MQ-2有害气体传感器时候的,这个无污染情况是0.3以下,刚开始没有开窗户,一下2.26,严重污染,其实不然,是因为电压接错了,应该接5V供电才行,这个MQ-2模块要接5V,因为内部要加热,3,3肯定不行。不过也是挺高的,当时是超过了1,我开了一晚上的窗户,空气跟外边一样了,是0.43,这说明南京的空气也是有一定污染的。
2015年,11,23更新
stm32f429 LCD.rar
(557.58 KB)
这次不隐藏了,感兴趣的,帮我完善功能,比如增加触摸按键。。。--------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------
今晚又画了个供电系统图,毕竟是DIY嘛,我们要画的形象好懂。
------------------------------------------------------------------
因为没有专业的容器,考虑用的是电脑CPU的风扇,我已经狠心把我台式机的CPU风扇拆了,我是不是太狠心了??
----------------------------------------------------------------------
考虑到如果没有水了或者发生烟雾了,比如电路起火了。要报警啊,来个警报器,我拆了个警报器的蜂鸣器。
---------------------------------
完善一下。
-------------------------------------------------
按键处理程序,一个按键搞定所有。靠谱吗?--------------------------------------------------
贴上我这很矬的代码
#include "stm32f4xx.h"
#include <stdio.h>
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "stm32f429i_discovery_lcd.h"
#include "dht11.h"
#include "adc.h"
RCC_ClocksTypeDef RCC_Clocks;
#define LED0 PGout(13)
#define LED1 PGout(14)
#define BUTTON PAin(0)
#define MESSAGE0 "shutdown---!"
#define MESSAGE1 "wendu: ^C"
#define MESSAGE2 "shidu: %"
#define MESSAGE3 " Working---!"
#define MESSAGE4 "DHT11(GPIO-PG9)"
#define MESSAGE5 "MQ-2 (GPIO-PA5)"
#define MESSAGE6 "voltage: V"
#define FONTSIZE Font12x12
Point oPoint1={10,10};
unsigned char on_off=0;
// PG13、PG14分别对应绿、红LED?
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG , ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOG, &GPIO_InitStructure);
GPIO_ResetBits(GPIOG,GPIO_Pin_13);
GPIO_ResetBits(GPIOG,GPIO_Pin_14);
}
static void Display_Init(void)
{
/* Initialize the LCD */
LCD_Init();
LCD_LayerInit();
/* Enable the LTDC */
LTDC_Cmd(ENABLE);
/* Set LCD Background Layer */
LCD_SetLayer(LCD_BACKGROUND_LAYER);
/* Clear the Background Layer */
LCD_Clear(LCD_COLOR_WHITE);
/* Configure the transparency for background */
LCD_SetTransparency(255);
// Set LCD Foreground Layer
LCD_SetLayer(LCD_FOREGROUND_LAYER);
//Configure the transparency for foreground
LCD_SetTransparency(127);
// Clear the Foreground Layer
// LCD_Clear(LCD_COLOR_WHITE);
LCD_Clear(LCD_COLOR_BLACK);
/*
// Set the LCD Text size */
LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);
LCD_SetFont(&Font16x24);
}
//按键程序,开机后默认红绿灯不亮,红绿灯分别对应风扇和雾化器。当按下后就翻转状态。
void Button(void)
{
if(BUTTON) {on_off=~on_off;while(BUTTON);} //按下后翻转标志变量,之后等待松手信号。
if(on_off) {LED0=1;LED1=1; LCD_DisplayStringLine(LCD_LINE_1, (uint8_t*)MESSAGE3); } //开机
else {LED0=0;LED1=0; LCD_DisplayStringLine(LCD_LINE_1, (uint8_t*)MESSAGE0);} //关机
}
int main(void)
{
int wendu_x=0;
int shidu_x=0;
u16 adcx,adcx_temp;
u8 temperature;
u8 humidity;
delay_init();
LED_Init();
Display_Init();
Adc_Init();
DHT11_Init();
while (1)
{
{
LCD_DisplayStringLine(LCD_LINE_3, (uint8_t*)MESSAGE4);
LCD_DisplayStringLine(LCD_LINE_7, (uint8_t*)MESSAGE5);
DHT11_Read_Data(&temperature,&humidity);
wendu_x=temperature;
shidu_x=humidity;
LCD_DisplayStringLine(LCD_LINE_4, (uint8_t*)MESSAGE1);
LCD_DisplayStringLine(LCD_LINE_5, (uint8_t*)MESSAGE2);
LCD_DisplayChar(LCD_LINE_4, 16*6, '0'+wendu_x/10);
LCD_DisplayChar(LCD_LINE_4, 16*7, '0'+wendu_x%10);
LCD_DisplayChar(LCD_LINE_5, 16*6, '0'+shidu_x/10);
LCD_DisplayChar(LCD_LINE_5, 16*7, '0'+shidu_x%10);
}
adcx=Get_Adc_Average(ADC_Channel_5,20);
adcx=(float)adcx*(3.3*1000/4096);
if(((adcx)%10)>=5) adcx=adcx+10; //四舍五入到百分位
adcx=adcx/10; //变换为三位数整数
adcx_temp=adcx;
LCD_DisplayStringLine(LCD_LINE_8, (uint8_t*)MESSAGE6);
LCD_DisplayChar(LCD_LINE_8, 16*8, '0'+adcx_temp/100); //显示个位
LCD_DisplayChar(LCD_LINE_8, 16*9, '.');
adcx_temp%=100;
LCD_DisplayChar(LCD_LINE_8, 16*10, '0'+adcx_temp/10); //显示十分位
LCD_DisplayChar(LCD_LINE_8, 16*11, '0'+adcx_temp%10); // 显示百分位
Button();
/* LED0=1;
LED1=0;
delay_ms(500);
LED0=0;
LED1=1;
delay_ms(500);
*/
}
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t* file, uint32_t line)
{
while (1)
{
}
}
#endif
//按键程序,开机后默认红绿灯不亮,红绿灯分别对应风扇和雾化器。当按下后就翻转状态。
void Button(void)
{
if(BUTTON) {on_off=~on_off;while(BUTTON);} //按下后翻转标志变量,之后等待松手信号。
if(on_off) {LED0=1;LED1=1; LCD_DisplayStringLine(LCD_LINE_1, (uint8_t*)MESSAGE3); } //开机
else {LED0=0;LED1=0; LCD_DisplayStringLine(LCD_LINE_1, (uint8_t*)MESSAGE0);} //关机
}我来说说我这个执行代码,人家按键都搞神马中断了,延时防抖了,我为何不搞,我的不靠谱吗?非也非也。
首先我没有对BUTTON进行初始化,这就错了吗?非也非也,实际上好多IO口默认就是IO口,默认就是准双向。所以我使用这个输入功能是不需要初始化可以直接使用的。
我先判断是否为1,也就是是否触发,如果触发进入函数段,翻转开关标志,接下来人家有的人估计会判断是不是抖动啊,我想说,抖动个毛线啊,我直接while锁死该变量,直到你释放按键,释放后,你抖动就不管我的事情了,我已经进入后面的程序了,等你抖动完了,我还在后面执行别的程序呢。哈哈哈,是不是?
差不多做好了,觉得报警多余就没有上,因为我这水箱很大的。全部用跳线连接到那个STM32F429i discovery上。
专门去超市买的水箱。。然后用电烙铁和刀子挖了个洞
|