打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
基于STM32的土壤湿度实时监测器的制作 附源码 原理图
本文设计的是基于单片机STM32F103CBT6的土壤湿度检测系统,主要以广泛应用的土壤湿度传感器YL-69作为温度和湿度的检测,该仪器具有测量精度较高、硬件电路简单、并能很好的进行显示,可测试不同土壤环境湿度的特点。
单片机是系统的控制核心,所以单片机的性能关系到整个系统的好坏。因此单片机的选择,对所设计系统的实现以及功能的扩展有着很大的影响。本次设计是以STM32F103CBT6单片机为核心,配合土壤湿度传感器YL-69,IIC OLED显示器以及按键和蜂鸣器组成的湿度检测系统,通过传感器检测环境中的湿度的变化,可以接收所测土壤环境的湿度信号,并对采集到的数据进行处理和传输,再通过IIC OLED显示器显示湿度,实时监控环境的湿度数据。

硬件方面:
1、系统结构框图



2、土壤湿度传感器简介:湿度的采集可以用湿度传感器来实现。将湿度传感器看作可调变阻器,当湿度传感器采集到湿度时,电阻值发生变化,湿度最小时的电阻值为 10K,湿度最大时为0.1Ω。 变化的幅度是根据湿度传感器采集到的湿度大小而定。随着电阻值的变化,电路的输出电压也跟着变化。调节电阻值的大小,可得到想要的电压,满足电路的需求。此次设计采用的是土壤湿度传感器YL-69

土壤湿度传感器原理图

3、土壤湿度传感器特性:(1)   土壤湿度传感器YL-69,表面采用镀镍处理,有加宽的感应面积,可以提高导电性能 ,防止接触土壤容易生锈的问题,延长使用寿命;(2)   采用三线制,接线简单,只需把VCC外接3.3V-5V电压,GND外接数字地,AO“小板模拟量输出接口”接到单片机即可;3)   比较器采用LM393芯片,工作稳定
软件方面:
1、系统软件流程框图


程序如下:
  1. #include 'delay.h'
  2. #include 'stm32f10x.h'
  3. #include 'OLED_I2C.h'
  4. #include 'led.h'
  5. #include 'usart.h'        
  6. #include 'string.h'        
  7. #include 'adc.h'
  8. #include 'timer.h'
  9. #include 'sys.h'
  10. #include 'exti.h'
  11. #include 'beep.h'

  12. float temp_avrg=0;
  13. int temp_LL=40;
  14. int shidu;
  15. int num;
  16. int num_adj=1;
  17. int j=0;
  18. int times;
  19. float total=0;

  20. void Hardware_Init(void)   
  21. {        
  22.         Delay_Init();                    
  23.         
  24.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  25.         
  26.         I2C_Configuration();      
  27.         
  28.         OLED_Init();               
  29.         
  30.         Led_Init();                                                                        
  31.         
  32.         uart_init(9600);                                       
  33.         Adc_Init();                                                        
  34.         
  35.         EXTIX_Init();                                                               
  36.         
  37.         BEEP_Init();                                                               
  38. }

  39. void OLED_Show(void)                                
  40. {
  41.         unsigned char i;
  42.         extern const unsigned char BMP2[];
  43.         OLED_CLS();                  
  44.         OLED_DrawBMP(0,0,128,8,(unsigned char *)BMP2);
  45.         
  46.         for(i=10;i<14;i++)            
  47.                 OLED_ShowCN(0,2*(i-10),i);
  48.         
  49.         for(i=14;i<18;i++)            
  50.                 OLED_ShowCN(112,2*(i-14),i);
  51.         
  52.         DelayMs(2500);
  53.         OLED_CLS();                 
  54.         
  55.         for(i=0;i<4;i++)            
  56.                 OLED_ShowCN(31+i*16,1,i);
  57.         
  58.         for(i=18;i<21;i++)           
  59.                 OLED_ShowCN(39+(i-18)*16,5,i);
  60.         
  61.         DelayMs(1500);
  62.         OLED_CLS();                  
  63.         
  64.         for(i=4;i<10;i++)           
  65.                 OLED_ShowCN(14+(i-4)*16,0,i);
  66.                
  67.         for(i=6;i<8;i++)              
  68.                 OLED_ShowCN(0+(i-6)*16,3,i);
  69.                
  70.         OLED_ShowStr(36,4,':',1);
  71.         OLED_ShowStr(90,4,'%',1);
  72.         

  73.         for(i=6;i<8;i++)               
  74.                 OLED_ShowCN(0+(i-6)*16,6,i);
  75.         for(i=21;i<23;i++)               
  76.                 OLED_ShowCN(32+(i-21)*16,6,i);

  77.         
  78.         OLED_ShowStr(70,7,':',1);
  79.         OLED_ShowStr(110,7,'%',1);
  80.         OLED_ShowNum(75,7,temp_LL,1);
  81. int main(void)
  82. {
  83.         num=50;        
  84.          Hardware_Init();     
  85.         printf('\r\n³õʼ»¯Íê³É\r\n');
  86.         OLED_Show();         
  87.         
  88.          while(1)
  89.         {
  90.                  Get_Adc_Average(1,10);
  91.                 DelayMs(500);
  92.                
  93.                 if(shidu>10000)
  94.                         shidu=10000;
  95.                
  96.                 if(shidu<0)
  97.                         shidu=0;
  98.                
  99.                 OLED_ShowNum(60,4,shidu%100,1);
  100.                 OLED_ShowNum(40,4,shidu/100,1);
  101.                 OLED_ShowStr(64,4,'.',1);
  102.                
  103.                 if(shidu/100<temp_LL)
  104.                 {
  105.                         BEEP=0;
  106.                         DelayMs(500);
  107.                         BEEP=1;
  108.                         DelayMs(500);
  109.                         
  110.                 }
  111.          }  
  112. }

  113. /*AD转化处理*/
  114. u16  Get_Adc(u8 ch)
  115. {
  116.         
  117.         ADC_RegularChannelConfig(ADC1,ch,1, ADC_SampleTime_239Cycles5);
  118.         
  119.         ADC_SoftwareStartConvCmd(ADC1,ENABLE);
  120.         
  121.         while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));
  122.         
  123.         return ADC_GetConversionValue(ADC1);
  124. }
  125. u16 Get_Adc_Average(u8 ch,u8 times)
  126. {
  127.         u32 temp_val=0;
  128.         u8 t;
  129.         for(t=0;t<times;t++)
  130.         {
  131.                 temp_val+=Get_Adc(ch);
  132.                 DelayMs(1);
  133.         }
  134.         temp_avrg=temp_val/times;
  135.         shidu=(4092-temp_avrg)/3292*10000;
  136.         
  137.         
  138.         
  139.         return temp_avrg;
  140. }

第一次发帖,多有不足,希望大家提出来和多多包涵,谢谢!
附件在一楼下载

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
一个好人 | 自动浇花装置
8051单片机实现智能浇花
一种便携式土壤温湿度数据采集器的研制
有多种玩法的土壤湿度传感器,价格仅几元钱。
土壤水分传感器安装注意事项
【新提醒】HC32F460开发板数据采样及显示
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服