本帖最后由 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更新
这次不隐藏了,感兴趣的,帮我完善功能,比如增加触摸按键。。。--------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------
今晚又画了个供电系统图,毕竟是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上。
专门去超市买的水箱。。然后用电烙铁和刀子挖了个洞
|