STM32连YL69土壤湿度传感器以及内部温度传感器采集数据并在LCD上显示
终于把32好好学习了一遍,做了一次以前的项目练手,把土壤湿度与温度采集起来,数据在显示屏上显示。效果如图
首先硬件连接,就不说了,以前51的项目说过。直接附代码。需要说明的是我用的是STM32F407开发板,ADC1的扫描模式。
首先main.c
#include "sys.h" #include "delay.h" #include "usart.h" #include "led.h" #include "lcd.h" #include "adc.h" __IO uint16_t ADC1ConvertedValue[64][2]; __IO uint32_t ADC1ConvertedVoltage[2]; int main(void) { u8 i,j;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//ÉèÖÃϵͳÖжÏÓÅÏȼ¶·Ö×é2delay_init(168); //³õʼ»¯ÑÓʱº¯Êýuart_init(115200); //³õʼ»¯´®¿Ú²¨ÌØÂÊΪ115200LED_Init();//³õʼ»¯LEDLCD_Init(); //Òº¾§³õʼ»¯Adc_Init(); //ÄÚ²¿Î¶ȴ«¸ÐÆ÷ADC³õʼ»¯POINT_COLOR=RED;LCD_ShowString(30,50,200,16,16,"YL69-data");LCD_ShowString(30,90,200,16,16,"temperature");POINT_COLOR=BLUE;//ÉèÖÃ×ÖÌåΪÀ¶É«while(1){for(i = 0;i<2;i++){ ADC1ConvertedVoltage[i] = 0; } for(i=0;i<2;i++) { for(j=0;j<64;j++) { ADC1ConvertedVoltage[i] += ADC1ConvertedValue[j][i]; } ADC1ConvertedVoltage[i] = ADC1ConvertedVoltage[i]/64; }if(DMA_GetFlagStatus(DMA2_Stream0,DMA_FLAG_TCIF0)!=RESET){ LCD_ShowxNum(30,70,ADC1ConvertedVoltage[0],8,16,0);LCD_ShowxNum(30,110,ADC1ConvertedVoltage[1],8,16,0);DMA_ClearFlag(DMA2_Stream0,DMA_FLAG_TCIF0);}delay_ms(250);} }
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556这里的lcd与led两个C文件的代码我就不附上了,太长了,也不重要。
下面是adc.c
#include "adc.h" #include "delay.h" #define ADC1_DR_ADDRESS ((uint32_t)0x4001204C) extern __IO uint16_t ADC1ConvertedValue[64][2]; void Adc_Init() {GPIO_InitTypeDef GPIO_InitStructure;ADC_CommonInitTypeDef ADC_CommonInitStructure;ADC_InitTypeDef ADC_InitStructure;DMA_InitTypeDef DMA_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//??GPIOA??RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //??ADC1??RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE); //ADC1??RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE);//????ADC_TempSensorVrefintCmd(ENABLE);//ʹÄÜÄÚ²¿Î¶ȴ«¸ÐÆ÷DMA_DeInit(DMA2_Stream0);while (DMA_GetCmdStatus(DMA2_Stream0) != DISABLE) {} //??DMA???DMA_InitStructure.DMA_Channel = DMA_Channel_0; //????DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->DR;//DMA????DMA_InitStructure.DMA_Memory0BaseAddr = (u32)ADC1ConvertedValue;//DMA ???0??DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;//????????DMA_InitStructure.DMA_BufferSize = 4;//?????DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//???????DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//???????DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//??????:32?DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//???????:32?DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;DMA_InitStructure.DMA_Priority = DMA_Priority_High;//?????DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//?????????DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//????????DMA_Init(DMA2_Stream0, &DMA_InitStructure);//???DMA StreamDMA_Cmd(DMA2_Stream0,ENABLE);//????ADC1??5 IO?//GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_4|GPIO_Pin_3|GPIO_Pin_2|GPIO_Pin_1|GPIO_Pin_0;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//????GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//?????GPIO_Init(GPIOA, &GPIO_InitStructure);//???ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_20Cycles;ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;//???4??ADC_CommonInit(&ADC_CommonInitStructure);//???ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12???ADC_InitStructure.ADC_ScanConvMode = ENABLE;ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//??????,??????ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//???ADC_InitStructure.ADC_NbrOfConversion = 2;ADC_Init(ADC1, &ADC_InitStructure);//ADC???ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 1, ADC_SampleTime_144Cycles );ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 2, ADC_SampleTime_144Cycles );//ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_144Cycles ); //ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_144Cycles ); //ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 5, ADC_SampleTime_144Cycles ); //ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 6, ADC_SampleTime_144Cycles );ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);ADC_DMACmd(ADC1,ENABLE);ADC_Cmd(ADC1, ENABLE);//??AD???ADC_SoftwareStartConv(ADC1); }
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879唉。。这些个说明全部乱码了,等我有时间再修改吧。
下面是我敲代码时遇到的问题。
1.extern __IO uint16_t ADC1ConvertedValue[64][2];
这个地方用来存储数据,需要在两个.c文件中都要使用,所以需要extern volatile的声明,再在另一个也就是main文件中不加extern声明一次。
2.引入文件,我对32不怎么熟悉,在创建工程时就花费了太多时间了。我明明添加了文件了,但是它一直显示没有,查资料说编译一次就会出现,但是没有引入根本就编译不了,进入了一个死循环,最后重启就行了。。果然,没有什么是重启解决不了的
3.这个项目完成后其次以后采集数据方便多了,直接修改一点点就好了,很明显修改GPIO引脚,修改ADC_NbrOfConversion,修改ADC_RegularChannelConfig,采集的周期啊,延时函数啊看情况进行修改,最最最不容易想到的(我就栽在这个地方好几天)修改DMA_InitStructure.DMA_BufferSize = 4。这个地方不修改的话你试试,屏幕上啥也没有。
最后说明一点,数据采集到了,关于数据的处理我这个代码并不完善,欢迎大家给出意见和建议
相关知识
基于STM32的植物浇水系统开发
【IoT开发】机智云平台+STM32的植物浇水系统的设计与实现
如何将土壤湿度传感器与Arduino接口
基于STM32开发的智能农业监测与控制系统
土壤湿度传感器,出远门再也不怕花没人浇水了
土壤湿度传感器资讯
基于瑞萨RA MCU的简易智能养花系统设计
基于STM32的智能室内植物养护系统设计
基于STM32开发的智能空气质量监测系统
推荐文章:探索智能园艺新时代 —— STC89C51驱动的自动浇花控制系统
网址: STM32连YL69土壤湿度传感器以及内部温度传感器采集数据并在LCD上显示 https://www.huajiangbk.com/newsview511356.html
上一篇: 温湿度监控系统 |
下一篇: [园林绿化]园林绿化常用机具盘点 |
推荐分享

- 1君子兰什么品种最名贵 十大名 4012
- 2世界上最名贵的10种兰花图片 3364
- 3花圈挽联怎么写? 3286
- 4迷信说家里不能放假花 家里摆 1878
- 5香山红叶什么时候红 1493
- 6花的意思,花的解释,花的拼音 1210
- 7教师节送什么花最合适 1167
- 8勿忘我花图片 1103
- 9橄榄枝的象征意义 1093
- 10洛阳的市花 1039