STM32的串口打印土壤湿度传感器(YL-69)数据
最近在弄课设,需要使用土壤传感器来读取数据,用来测量土壤或其他的湿度数据,我选择使用串口打印数据。
用的控制器是STM32F103C8T6,在网上找了好多代码,各种问题,都没有用,或许的要实现的功能不一样,有些是要在OLED显示的,所以放进去就没用,所以就就写下这篇博客,来弥补这一程序空缺。由于我用的是STM32的芯片,所以那些51的代码都没有试,可能有些有用,有兴趣的可以去试一下。
先介绍硬件及连线,有助于初学者理解。传感器及芯片都是在淘宝的优信电子上面购买的,个人感觉这个店比较好。
最小系统用的是STM32F103C8T6便宜实惠,
传感器用的是YL-69土壤湿度传感器,四线制的,中间两根手动连起来。
连线:
传感器GND–芯片GND
传感器VCC–芯片3.3V
传感器AO–芯片PA1(用于读取实时湿度数据)
传感器DO不连(主要用于超出范围报警)
为什么AO连接PA1,因为AO是传感器的模拟输出(输出的是电压这种连续的值),DO是传感器的数字输出(直接输出0101这样的)。由于AO输出的是模拟量,而单片机只能读取数字量,所以就要做一个ADC(模数转换),PA1是芯片的ADC引脚,用于处理模拟数据的,感兴趣的朋友可以看一下STM32的参考手册里的引脚定义和ADC的详细讲解,是12位的ADC。接线完成后就需要进行代码编写,用的是KEIL5这个软件。
基本上所有的传感器只需要建立两个文件,比如这个传感器,需要建立adc.c和adc.h这两个文件,然后将.c文件处理得到的数据返回到main.c中即可得到数据。有串口打印的话还要添加串口的.c和.h文件,其他的文件都是工程里自带的,就能直接编译然后烧录(注意:这里没有以YL-69.c和YL-69.h来命名,因为这个功能主要是用ADC来读取数据,关于传感器的代码就两行)
先看adc.c,一共就三个函数,代码可以不看,文字一定要看!!
Adc_Init(void)是用来ADC初始化,就是配置ADC的基本属性,具体是哪个通道,哪个引脚,传输的速度等等。。。
Get_Adc(u8 ch)用于获取芯片处理后的010101这样的数据,从传感器传来的模拟量,连续的,这里已经将他数字化
Get_Adc(u8 ch)用于将数字化的数据转换成我们生活中所见的湿度数据,我想你也不想看见010101这样的数据。
adc.c的代码如下:
#include "adc.h"
#include "delay.h"int shidu1;
void Adc_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;ADC_InitTypeDef ADC_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE);
/*PA_1设置为模拟输入*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHzGPIO_Init(GPIOA, &GPIO_InitStructure); RCC_ADCCLKConfig(RCC_PCLK2_Div6);//设置ADC分频因子ADC_DeInit(ADC1);//复位ADC//初始化ADC参数ADC_InitStruct.ADC_ContinuousConvMode=DISABLE;ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right;ADC_InitStruct.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;ADC_InitStruct.ADC_Mode=ADC_Mode_Independent;ADC_InitStruct.ADC_NbrOfChannel=1;ADC_InitStruct.ADC_ScanConvMode=DISABLE;ADC_Init(ADC1, &ADC_InitStruct);ADC_Cmd(ADC1,ENABLE);//使能ADC1ADC_ResetCalibration(ADC1); //使能复位校准 while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束ADC_StartCalibration(ADC1); //开启AD校准while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束}u16 Get_Adc(u8 ch) //获取ADC数据
{ADC_RegularChannelConfig(ADC1,ch,1, ADC_SampleTime_239Cycles5);ADC_SoftwareStartConvCmd(ADC1,ENABLE);while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));return ADC_GetConversionValue(ADC1);
}u16 Get_Adc_Average(u8 ch,u8 times) //获取土壤湿度数据并返回给主函数
{u32 temp_val=0;u8 t;for(t=0;t<times;t++){temp_val+=Get_Adc(ch);delay_ms(1);}temp_avrg=temp_val/times;shidu1=(4092-temp_avrg)/3292*100;return shidu1;
}
然后adc.h,这是对adc.c的头文件声明,比较简单,adc.h代码如下
#ifndef __ADC_H
#define __ADC_H
#include "sys.h"//正点原子的adc采集代码
void Adc_Init(void);
u16 Get_Adc(u8 ch);
u16 Get_Adc_Average(u8 ch,u8 times);
extern float temp_avrg;
extern int shidu;#endif
剩下的就是main.c文件了,因为我是用串口获取了温湿度数据(DHT11)和土壤湿度数据,所以为了只打印土壤湿度数据,我将printf函数的温湿度打印拿出来了,如果有人想打印三个数据,可以放回到printf函数里即可
main.c代码如下
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "stdio.h"
#include "dht11.h"
#include "adc.h"int shidu;float temp_avrg=0;
u8 buff[30]; //参数显示缓存数组
u8 DHT11_Temp,DHT11_Hum; //温湿度int main(void)
{ delay_init(); //延时函数初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级DHT11_Init();Adc_Init();uart_init(9600);
while(1){ shidu=Get_Adc_Average(1,10);DHT11_Read_Data(&DHT11_Temp,&DHT11_Hum); printf("土壤湿度:%d\r\n",shidu); //将后面这个代码放到printf的相应的位置即可打印空气的温湿度数据了,直接剪切过去(当前温度:%d 当前湿度:%d DHT11_Temp,DHT11_Hum,)delay_ms(100); }}
至此,代码就写完了。下面进行程序测试,用Fly mcu烧录程序,然后用串口打印助手ATK X.COM来打印(可去野火的论坛里下载,资源丰富),如下图:
烧入成功,如下:
最后就进入到紧张自己的打印环节了,准备好湿的纸放到感应区,串口打印结果就会有变化,结果如下:
打印完毕,这个实验到这就算结束了。
因为我的代码是用来测量空气温湿度和土壤湿度的,按照的我提示修改后可打印三个数据,就改一行printf代码,如下:
printf("当前温度:%d 当前湿度:%d 土壤湿度:%d\r\n",DHT11_Temp,DHT11_Hum,shidu);
即可
打印结果如下:
完结!有问题可以评论区交流。
工程在这 链接:https://pan.baidu.com/s/1v6FBqHxaiMLEHFfaoBBnYQ 提取码:hj5d
STM32的串口打印土壤湿度传感器(YL-69)数据相关推荐
- STM32 KEIL 串口打印printf使用详解
常规打印方法 在STM32的应用中,我们常常对printf进行重定向的方式来把打印信息printf到我们的串口助手. 在MDK环境中,我们常常使用MicroLIB+fputc的方式实现串口打印功能,即 ...
- 51单片机上连YL69土壤湿度传感器获取的数据在LCD上显示出来
要做一个项目,被分配到做DS18B20温度传感与YL69土壤湿度传感器在51单片机上用LCD显示屏显示出来.温度传感模块很简单,网上到处都是资料,但是YL69的资料就很少了,特别还是在51单片机上实现 ...
- 在simulink下编程stm32,为什么我的stm32用串口打印数据,总是00或者ff
这个带红圈的地方非常重要,否则收到的数据就是00或者ff了
- STM32单片机串口空闲中断接收不定长数据
在使用单片机的串口通信功能时,常用的接收数据方法是通过固定的字节数来判断一帧数是否发送完成,或者是通过固定的结束标志位来表示一帧数据发送完成.但是有时候会遇到发送的数据长度不固定,也没有固定的结束标志 ...
- 51单片机 DHT11温湿度传感器LCD显示+串口打印显示
第一部分:DHT11详解: DHT11是一款有已校准数字信号输出的温湿度传感器. 精度湿度±5%RH, 温度±2℃,量程湿度20-90%RH, 温度0~50℃. **一.电路连接分析 1.引脚图** ...
- STM32单片机串口空闲中断+DMA接收不定长数据
在上一篇文章STM32单片机串口空闲中断接收不定长数据中介绍了利用串口空闲中断接收不定长数据,这种方式有一个问题就是串口每接收到一个字节就会进入一次中断,如果发送的数据比较频繁,那么串口中断就会不停打 ...
- stm32 USART串口半双工功能测试
一.串口半双工 stm32的串口支持全双工使用,即数据可双向同时传递,特点是有Rx和Tx两根数据线.这很好,可以满足大部分需要的 有些特殊场合,我们需要使用半双工,比如驱动某些数字舵机.这时数据也是双 ...
- STM32串口接收粉尘传感器数据
本文章主要记录STM32实现对粉尘传感器的数据采集及简单处理. 材料: 1.正点原子Mini开发板STM32f103RC 2.ZH03A激光粉尘传感器 3.USB TO TTL线(就是烧写51单片机的 ...
- K_A12_002 基于STM32等单片机采集光敏电阻传感器参数串口与OLED0.96双显示
K_A12_002 基于STM32等单片机采集光敏电阻传感器参数串口与OLED0.96双显示 一.资源说明 二.基本参数 参数 引脚说明 三.驱动说明 IIC地址/采集通道选择/时序 对应程序: 四. ...
最新文章
- Js时间格式[转载]
- HDU 2431 Counting Problem
- 所长不会用计算机,梅州市公安局: 两派出所所长不会电脑被停职
- phpcms调用栏目描述_phpcms v9栏目列表调用每一篇文章内容方法
- ESD二极管,替代国际品牌型号汇总
- 学习16位DOS汇编笔记
- 说说Shell在代码重构中的应用
- 绝大多数人努力程度之低,根本轮不上拼天赋
- 安装postgreSQL出现configure:error:readline library not found解决方法及pg安装全过程
- 体验Solaris 中文斥地者x86版装置
- Java代码关于TIFF/TIF图片转PNG
- Spark SQL架构工作原理及流程解析
- 2019年Q4三星和华为都败了,谁也想不到第一名是它
- Unity3D研究院之在MAC上脚本XlsxWriter写入Excel .xlsx格式
- 爱伦·坡:写作的哲学
- 爬虫初学——爬取京东商品的评论(一)
- 【socket】从计算机网络基础到socket编程——Windows Linux C语言 + Python实现(TCP+UDP)
- leetcode 1-100 medium难度题目汇总
- android控制台没有报出错误,小弟我有意制造了一个错误,但是它却不在Console控制台显示啊100分...
- 河源做java_河源java工资怎么样,河源java工资最低多少,河源java工资一般待遇怎么样...
热门文章
- 尚品汇前端每日跟练笔记
- python的乌龟画画的扩展运用
- control的用法及短语_有关control的短语
- [日推荐] 『无忧育儿说』养育孩子就是这么简单!
- 战争与征服服务器维护,战争与征服 8月29日停机维护公告_战争与征服 8月29日更新了什么_玩游戏网...
- 程序员吃饭段子Java吃完就走_程序员专用段子笑话,笑话死循环
- 微软必应词典客户端的案例分析
- nacos项目启动报错:Connection refused: no further information
- 基于Java Web的汽车租赁系统的设计与实现
- C语言-(1)初始C语言 已完成,待二次修改完善