目录
4.1温湿度传感器(要监测当前环境的温度、湿度,通过温湿度传感器来实现的)
4.2.光敏电阻传感器(要监测当前环境的光照(黑天和白天),通过光敏电阻传感器来实现的,如果是黑夜,LED灯就亮蓝色,蜂鸣器会报警)
4.3红外线传感器(要监测当前有没有人:通过红外感应传感器,如果有人过来的,蜂鸣器会报警)
4.4超声波传感器(要监测人离你家的距离:通过超声波测试来实现,距离小于20cm,LED灯就亮红色)
4.5 SIM900a模块(有人过来的话,(要把距离、当前环境的的温度、湿度、光照发送短信给你手机))
监测当前环境(通过各种传感(温湿度传感器、超声波传感器。。。)来监测),一旦你的获取的数据(从你的传感器上来的)超过你的阀值(比如当前温度超过这个26°),就会发送短信到你的手机上面去。
硬件环境:STM32开发板
软件环境:KEIL5
传感器:温湿度传感器DHT11、超声波传感器、光敏电阻传感器、红外感应传感器 + GPRS模块

引脚说明:

相关宏定义:

输入输出配置:
if(DHT11_Dout_IN()==Bit_RESET)
{
/*轮询直到从机发出 的80us 低电平 响应信号结束*/
while(DHT11_Dout_IN()==Bit_RESET);
/*轮询直到从机发出的 80us 高电平 标置信号结束*/
while(DHT11_Dout_IN()==Bit_SET);
/*开始接收数据*/
DHT11_Data->humi_int= DHT11_ReadByte();
DHT11_Data->humi_deci= DHT11_ReadByte();
DHT11_Data->temp_int= DHT11_ReadByte();
DHT11_Data->temp_deci= DHT11_ReadByte();
DHT11_Data->check_sum= DHT11_ReadByte();
打印显示温度并设置报警温度:
if(DHT11_Read_TempAndHumidity (&DHT11_Data) == SUCCESS)
{
char BUFF1[100];
sprintf(BUFF1,"°☆☆☆温度: %d.%d°C ☆☆☆°",DHT11_Data.temp_int, DHT11_Data.temp_deci);
printf("%d.%d\r\n",DHT11_Data.temp_int, DHT11_Data.temp_deci);
LCD_ClearLine(LINE(1));
ILI9341_DispStringLine_EN_CH(LINE(1),BUFF1);
i f (DHT11_Data.temp_int>=26)
{
LED1_ON;
BEEP( Open); // 响
Delay(0x0FFFFF);
BEEP( Close ); // 不响
Delay(0x0FFFFF);
LCD_ClearLine(LINE(3)); /* 清除单行文字 */
ILI9341_DispStringLine_EN_CH(LINE(3),"警告,温度过高!");
}
else
{
LCD_ClearLine(LINE(3)); /* 清除单行文字 */
ILI9341_DispStringLine_EN_CH(LINE(3),"温度正常!");
}
void LDR_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*开启端口的时钟*/
RCC_APB2PeriphClockCmd(LDR_GPIO_CLK,ENABLE);
//选择输入的引脚
GPIO_InitStructure.GPIO_Pin = LDR_GPIO_PIN;
// 设置光敏输入的引脚为下拉输入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(LDR_GPIO_PORT, &GPIO_InitStructure);
}
光敏电阻测试:
uint8_t LDR_Test(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
{
/*检测光敏输入状态 */
if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == 1 )
{
return LDR_OFF; // 无光
}
else
return LDR_ON; // 有光
}
显示白天黑夜并报警
if (LDR_Test(LDR_GPIO_PORT,LDR_GPIO_PIN) == LDR_ON)
{
LED3_OFF;
LCD_ClearLine(LINE(4)); /* 清除单行文字 */
ILI9341_DispStringLine_EN_CH(LINE(4),"o(* ̄▽ ̄*)ブ光线充足,不亮灯");
}
else if(LDR_Test(LDR_GPIO_PORT,LDR_GPIO_PIN) == LDR_OFF)
{
LED3_ON;
//BEEP( Open); // 响
//Delay(0x0FFFFF);
//BEEP( Close ); // 不响
//Delay(0x0FFFFF);
LCD_ClearLine(LINE(4)); /* 清除单行文字 */
ILI9341_DispStringLine_EN_CH(LINE(4),"┭┮﹏┭┮光线不足,亮灯");
}
主函数调用(改写)引脚
if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_5) == 0)
{
printf("附近没人\r\n");
ILI9341_DisplayStringEx(0,240,18,18,(uint8_t *)"无人靠近,一切正常!",0);
}
引脚说明:

定时器设置:
void hcsr04_NVIC()
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
通过定时器计数器值推算距离
float Hcsr04GetLength(void)
{
u32 t = 0;
int i = 0;
float lengthTemp = 0;
float sum = 0;
while(i!=5)
{
TRIG_Send = 1;
delay_us(20);
TRIG_Send = 0;
while(ECHO_Reci == 0);
OpenTimerForHc();
i = i + 1;
while(ECHO_Reci == 1);
CloseTimerForHc();
t = GetEchoTimer();
lengthTemp = ((float)t/58.0);//cm
sum = lengthTemp + sum ;
}
lengthTemp = sum/5.0;
return lengthTemp;
}
显示超声波距离并设置警报
length = Hcsr04GetLength();
printf("距离为:%.3fcm\n",length);
sprintf(dispBuff,"/****距离为:%.3fcm ****/",length);
LCD_ClearLine(LINE(5)); /* 清除单行文字 */
LCD_ClearLine(LINE(6)); /* 清除单行文字 */
ILI9341_DispStringLine_EN_CH(LINE(5),"*******提示:监测到距离*******");
ILI9341_DispStringLine_EN_CH(LINE(6),dispBuff);
if(length<=20)
{
LED1_ON;
BEEP(Open); // 响
Delay(0x0FFFFF);
BEEP(Close); // 不响
Delay(0x0FFFFF);
sprintf(dispBuff,"/*距离过近,距离为:%.3fcm */",length);
LCD_ClearLine(LINE(7)); /* 清除单行文字 */
ILI9341_DispStringLine_EN_CH(LINE(7),dispBuff);
}
else{
LCD_ClearLine(LINE(7)); /* 清除单行文字 */
ILI9341_DispStringLine_EN_CH(LINE(7),"距离正常!");
}
Sim900A.c:
void SIM900A_phone(void){
SIM900A_Clear();
while(SIM900A_SendCmd("ATD19901541203;\r\n", "OK")) // SIM900A
{
Delay(0x0FFFFF);
//printf( " --AT \n");
}
}
SIM900A_sendCmd函数:
Bool SIM900A_SendCmd(char *cmd, char *res)
{
unsigned char timeOut = 10;//200;
Usart_SendString(SIM900A_USART, (unsigned char *)cmd, strlen((const char *)cmd));
//Usart_SendString(SIM900A_USART, (unsigned char *)cmd);
while(timeOut--)
{
//printf("[%d]%s \n",SIM900A_cnt,SIM900A_buf);
if(SIM900A_WaitRecive() == REV_OK) //如果收到数据
{
//printf("Usart_GetReceive: %s \n",SIM900A_buf);
if(strstr((const char *)SIM900A_buf, res) != NULL) //如果检索到关键词
{
printf("GOT: %s \n",SIM900A_buf);
SIM900A_Clear(); //清空缓存
return 0;
}
}
Delay(0x0FFFFF);
}
我进行项目的时候也是刚刚接触stm32单片机这类硬件方面的。其实学会了单片机基础,就会发现也并没有那么难的东西。基础的stm32还是比较简单的,但是硬件需要大量的调试和测样,这才是最繁琐的事情。
以上代码只是一部分,我只讲了比较关键的地方,更多代码还请关注我的github:
zhouwenqi123/chuanganqi: 物联网实训stm32单片机关于 温湿度DHT11、超声波,光敏电阻,红外感应,GPRS模块的应用 (github.com)
文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,
说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时
我在我的rails应用程序中安装了来自github.com的acts_as_versioned插件,但有一段代码我不完全理解,我希望有人能帮我解决这个问题class_eval我知道block内的方法(或任何它是什么)被定义为类内的实例方法,但我在插件的任何地方都找不到定义为常量的CLASS_METHODS,而且我也不确定是什么here,并且有问题的代码从lib/acts_as_versioned.rb的第199行开始。如果有人愿意告诉我这里的内幕,我将不胜感激。谢谢-C 最佳答案 这是一个异端。http://en.wikipedia
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我最近开始学习Ruby,这是我的第一门编程语言。我对语法感到满意,并且我已经完成了许多只教授相同基础知识的教程。我已经写了一些小程序(包括我自己的数组排序方法,在有人告诉我谷歌“冒泡排序”之前我认为它非常聪明),但我觉得我需要尝试更大更难的东西来理解更多关于Ruby.关于如何执行此操作的任何想法?
我在Ruby中遇到了一个关于Dir[]和File.join()的简单程序,blobs_dir='/path/to/dir'Dir[File.join(blobs_dir,"**","*")].eachdo|file|FileUtils.rm_rf(file)ifFile.symlink?(file)我有两个困惑:首先,File.join(@blobs_dir,"**","*")中的第二个和第三个参数是什么意思?其次,Dir[]在Ruby中有什么用?我只知道它等价于Dir.glob(),但是,我对Dir.glob()确实不是很清楚。 最佳答案
1.回顾.TransportServicepublicclassTransportServiceextendsAbstractLifecycleComponentTransportService:方法:1publicfinalTextendsTransportResponse>voidsendRequest(finalTransport.Connectionconnection,finalStringaction,finalTransportRequestrequest,finalTransportRequestOptionsoptions,TransportResponseHandlerT>
LL库和HAL库简介LL:Low-Layer,底层库HAL:HardwareAbstractionLayer,硬件抽象层库LL库和hal库对比,很精简,这实际上是一个精简的库。LL库的配置选择如下:在STM32CUBEMX中,点击菜单的“ProjectManager”–>“AdvancedSettings”,在下面的界面中选择“AdvancedSettings”,然后在每个模块后面选择使用的库总结:1、如果使用的MCU是小容量的,那么STM32CubeLL将是最佳选择;2、如果结合可移植性和优化,使用STM32CubeHAL并使用特定的优化实现替换一些调用,可保持最大的可移植性。另外HAL和L
目录一.大致如下常见问题:(1)找不到程序所依赖的Qt库version`Qt_5'notfound(requiredby(2)CouldnotLoadtheQtplatformplugin"xcb"in""eventhoughitwasfound(3)打包到在不同的linux系统下,或者打包到高版本的相同系统下,运行程序时,直接提示段错误即segmentationfault,或者Illegalinstruction(coredumped)非法指令(4)ldd应用程序或者库,查看运行所依赖的库时,直接报段错误二.问题逐个分析,得出解决方法:(1)找不到程序所依赖的Qt库version`Qt_5'
我是Ruby的新手,但过去两周我一直在对Chef测试进行大量研究。该测试使用ChefSpec和Fauxhai,但它看起来不是很“像ruby”,我希望社区能给我一些编码风格的建议。有没有更好的方法来编写这样的嵌套循环?Recipe/foo/recipes/default.rbpackage"foo"doaction:installendRecipe/foo/spec/default_spec.rbrequire'chefspec'describe'foo::default'doplatforms={"debian"=>['6.0.5'],"ubuntu"=>['12.04','10.04
假设一个使用类变量的简单ruby程序,classHolder@@var=99defHolder.var=(val)@@var=valenddefvar@@varendend@@var="toplevelvariable"a=Holder.newputsa.var我猜结果应该是99,但输出不是99。我想知道为什么。由于类变量的范围是类,我假设@@var="toplevelvariable"行不会影响类中的变量。 最佳答案 @@var是Holder的类变量。而顶层的@@var不是Holder的同名类变量@@var,是你在创建类Obj