8 stm32项目——基于stm32的智能家居设计( 三 )


在程序设计时,我用了一个按键控制了WIFI模块的连接,按下K0,才进行WIFI模块连接到原子云这一步工作 。
9.LED和蜂鸣器
LED和蜂鸣器直接用板子上自带就即可 。
10.火焰传感器
火焰传感器是专门用来探测火源的传感器 。火焰传感器利用红外线对火焰非常敏感的特点,使用特制的红外线接收管来检测火焰,然后把火焰的亮度转化为模拟电压信号输出 。本次使用的火焰传感器,火焰强度越大,输出的电压越低 。火焰强度越小,输出的电压越大 。是一个反比例关系 。
所以,当有火焰时,该模块输出低电平 。单片机检测到低电平就可以进行相关的控制操作 。
11.气体传感器
气体传感器使用的是MQ2,MQ-2气体传感器对气体敏感,能检测出包括天然气、甲烷、酒精在内的多种可燃性气体,是一款高性价比传感器 。下图为MQ-2传感器的实物图:
本次只使用了它的数字输出口,当传感器检测到有烟雾时就会输出低电平,单片机检测到这个低电平就知道有烟雾产生了 。
四.程序设计 1.连线方式
/**
****************************************************************************************************
红外避障端口 数字输出端“D” 接到单片机PB3口
汽车抬杆控制口为PB0
光照传感器接PA5
控制开窗的舵机接PB1
温湿度传感器接PG9
风扇的INA接PC0 INB 接PC2
火焰传感器 数字输出端“D” 接PB6
气体传感器 数字输出端“D” 接PB7
控制大门的舵机接 PB2
****************************************************************************************************
*/
2.注意事项
//开机后,用遥控输入开机密码 初始密码为输入时 按键按下去的时间必须非常短暂,避免重复触发 密码输入完成后 按下遥控器电源键进行密码判断
//密码输入过程中 如果输错了数字 可以按下删除键进行删除
//密码输入正确后 按下KEY0键 进行WIFI连接 连接过程会在LCD上显示
//连接上原子云后 温度 湿度 光照会传到原子云显示 从原子云发送1 控制大门的舵机会打开 发送0 大门关闭
3.主程序代码
/******************************************************************************************************红外避障端口数字输出端“D” 接到单片机PB3口汽车抬杆控制口为PB0光照传感器接PA5控制开窗的舵机接PB1温湿度传感器接PG9风扇的INA接PC0INB 接PC2火焰传感器 数字输出端“D” 接PB6气体传感器 数字输出端“D” 接PB7控制大门的舵机接 PB2*****************************************************************************************************///开机后,用遥控输入开机密码初始密码为 123456 输入时 按键按下去的时间必须非常短暂,避免重复触发 密码输入完成后 按下遥控器电源键进行密码判断//密码输入过程中 如果输错了数字 可以按下删除键进行删除//密码输入正确后按下KEY0键 进行WIFI连接 连接过程会在LCD上显示//连接上原子云后温度 湿度 光照会传到原子云显示从原子云发送1 控制大门的舵机会打开发送0大门关闭#include "./SYSTEM/sys/sys.h"#include "./SYSTEM/usart/usart.h"#include "./SYSTEM/delay/delay.h"#include "./BSP/LED/led.h"#include "./BSP/LCD/lcd.h"#include "./BSP/BEEP/beep.h"#include "./BSP/KEY/key.h"#include "./BSP/ADC/adc.h"#include "./BSP/DHT11/dht11.h"#include "./BSP/SENSOR/sensor.h"#include "./BSP/REMOTE/remote.h"#include "./BSP/TIMER/btim.h"#include "string.h"char mima[]="123456";//密码intlight_yuzhi=200;//光照强度阈值(可根据实际情况修改)inttemp_yuzhi=20;//温度阈值int main(void){uint8_t key;uint8_t flag=0;//若flag=1说明输入的密码正确uint8_t i = 0;uint16_t adcx=0;//保存AD转换的值该值的大小反应了光照强度uint8_t temperature=0;//保存温度数据uint8_t humidity=0;//保存湿度数据char str[]="";char *p;HAL_Init();/* 初始化HAL库 */sys_stm32_clock_init(336, 8, 2, 7);/* 设置时钟,168Mhz */delay_init(168);/* 延时初始化 */usart_init(115200);/* 串口初始化为115200 */btim_timx_int_init(10 - 1, 8400 - 1); /* 84 000 000 / 84 00 = 10 000 10Khz的计数频率,计数10次为1ms */usart3_init(115200);//WIFI 初始化 波特率必须为 9600led_init();/* 初始化LED */lcd_init();/* 初始化LCD */sensor_init();//各种开关量传感器初始化beep_init();/* 初始化蜂鸣器 */key_init();/* 初始化按键 */remote_init();/* 红外接收初始化 */dht11_init();//温湿度传感器初始化adc_init();/* 初始化ADC采集光照强度要用到ADC */g_point_color = RED;lcd_show_string(50, 40, 300, 32, 32, "SMART HOME SYSTEM", RED);//显示标题lcd_show_string(50,100, 300, 16, 16, "key:", RED);//显示标题lcd_show_string(30, 160, 200, 16, 16, "Light_Intensity", BLUE);//显示光照强度lcd_show_string(30, 180, 200, 16, 16, "Light_yuzhi", BLUE);//显示光照强度阈值lcd_show_xnum(110, 180, light_yuzhi, 5, 16, 0, BLUE);lcd_show_string(30, 200, 200, 16, 16, "Temp:C", BLUE);//显示温度lcd_show_string(30, 220, 200, 16, 16, "Humi:%", BLUE);//显示湿度lcd_show_string(30, 240, 200, 16, 16, "Temp_yuzhi:C", BLUE);//显示温度阈值lcd_show_num(30 + 84, 240, temp_yuzhi, 2, 16, BLUE); while (1){key = remote_scan();//检测红外遥控是否有按键按下if(key)//如果按键被按下{switch (key){case 22:str[i++] = '1';break;case 25:str[i++] = '2';break;case 13:str[i++] = '3';break;case 12:str[i++] = '4';break;case 24:str[i++] = '5';break;case 94:str[i++] = '6';break;case 8:str[i++] = '7';break;case 28:str[i++] = '8';break;case 90:str[i++] = '9';break;case 66:str[i++] = '0';break;case 74:str[--i] = ' ';//如果按了回退键,那么指针左移一位 相当于删除最后一位数字break;case 69://69 是电源键按下以后进行密码判断if(strcmp(str,mima)==0)//如果密码正确{flag=1;}else{flag=0;lcd_show_string(80, 100, 300, 16, 16, "", RED);//清空前面输错的密码}i=0;strcpy(str,"");//清空便于下次输入密码break;}}lcd_show_string(80, 100, 300, 16, 16, str, RED);//显示输入的密码if(flag==1){LED1(0);//密码正确 绿灯亮LED0(1);lcd_show_string(50,100, 300, 16, 16, "welcaom to my smart home system", RED);lcd_show_string(30, 320, 200, 16, 16, "press key0 to connect wifi", BLUE);if(KEY0==0){lcd_show_string(30, 340, 200, 16, 16, "WIFI Connecting......", BLUE);u3_printf("AT+CWMODE=1\r\n");delay_ms(3000);u3_printf("AT+CWJAP=\"FAST_0A5C\",\"123456789\"\r\n");//FAST_0A5C改成你自己的WIFI名字后面的一串数字改成你自己的WIFI密码delay_ms(8000);u3_printf("AT+ATKCLDSTA=\"22021955902980447838\",\"88888888\"\r\n");//这里的数字是设备编号 和 设备密码改成你自己原子云里面对应的就行delay_ms(3000);lcd_show_string(30, 340, 200, 16, 16, "WIFI Conneced!", BLUE);}if(Infrared==0)//如果红外避障检测到有车{rod_ctrl(180);//那么抬起杆子(控制杆子的舵机接在PB0角度控制范围为0-180°)}else{rod_ctrl(90);//否则杆子不抬起}adcx = adc_get_result_average(ADC_ADCX_CHY, 10);/* ADCX即为光照强度 范围为0-4095 值越大 代表光照越强 用手指蒙住传感器adcx为50左右 正常情况下为180左右用手电筒照射,可达到3000多(设定光照阈值时 可供参考)*/lcd_show_xnum(160, 160, adcx, 5, 16, 0, BLUE);/* 显示ADC采样后的原始值 */if(adcx>light_yuzhi)//光照强度阈值 我设置为100window_ctrl(180);//开窗elsewindow_ctrl(90);//关窗dht11_read_data(&temperature, &humidity);/* 读取温湿度值 */lcd_show_num(30 + 40, 200, temperature, 2, 16, BLUE); /* 显示温度 */lcd_show_num(30 + 40, 220, humidity, 2, 16, BLUE);/* 显示湿度 */if(temperature>temp_yuzhi)//如果温度大于阈值{INB(1);INA(0);//开风扇}else{INB(0);INA(0);//关风扇}if(Fire==0 || Gas==0)BEEP(1);//开启蜂鸣器elseBEEP(0);u3_printf("temp:%d,humi:%d,light:%d\r\n",temperature,humidity,adcx);//向原子云发送数据}else{LED0(0);//否则 红灯亮LED1(1);}delay_ms(1000);}}