版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目录摘要 5PCB设计5.1PCB设计软件AltiumDesigner是一个集成化的电子产品开发系统,它能满足用户对设计原理图、进行电路仿真、PCB绘图和写稿、拓扑逻辑自动布线,为设计师提供一个新的的解决方案,将部分电路设计的复杂工作交给计算机辅助完成。提高开发人员电路设计的标准和效率。5.1.1PCB原理图设计流程AltiumDesigner引入了超级库的思想,在这里用户会找到更多元器件的封装包。也可以在原理图样式的后期阶段ERC注意到错误,ERC会自动注意到错误的原因并修改原理图。下整个画图流程如下图所示:图5.1PCB原理图设计流程5.1.2PCB设计步骤=1\*GB3①初步准备。准备组件库和原理图,在制作原理图的库时,要注意引脚是否连接到输出/输出PCB板并检查库。=2\*GB3②PCB具体结构设计。根据实际生产需要使用的板面尺寸和需要放置的各种元器件占位在PCB设计环境中绘制PCB表面。在注意组件之间的相对位置和空间的大小,保证后续安装元器件之后整体设计的电气性能。设计完成后进行适当调整与修改使PCB显得整洁。=3\*GB3③PCB布局。确保布局前原理图正确,保证安装后续安装元器件的可行性和便利性,布局平衡,排列有序。=4\*GB3④放置器件。放置元件的规则是先把各种需要固定的接口放好,如电源接口等。其他不须外露的元件就放置在各种接口侧。=5\*GB3⑤PCB连线。首先满足电气性能,连接相同网络节点。就近原则连接,布线要求整齐一致,不能纵横交错、杂乱无章。=6\*GB3⑥调整线路。修改设计不合理的地方,例如载流大的线条应适当加粗,使用大面积的铜层做地线。=7\*GB3⑦敷铜。先敷底面,敷后就可在适当的地方加一些导孔,便于上下层之间的连接。=8\*GB3⑧标注。标上说明性文字,例如电源接口的电压、极性,这些都标在丝印层。=9\*GB3⑨电气规则检查:检查线路之间是否短接,检查电源线和地线之间是否会有干扰。=10\*GB3⑩导出画好的PCB文件。图5.2元器件布局5.1.3布线设计原则布线可以使用自动布线,但是自动布线很多时候不够美观,所以一般都是手动进行连线,先从一个功能块开始连线,先把地网络隐藏,然后将其他网络布好后再连接电源正网络,电源一般星形网结构,主干采用星形,支干采用树形。注意线条的拐弯不能是直角,如果拐角是直角线条,制作出来的电路也是直角的,这样的线路非常容易损坏,最后的结果就是导致线路不通。布线对于PCB设计十分重要,将接线划分了三个层次:(1)连接,加入线路没有连接或者线路交错,那么这是致命的错误,将会直接导致PCB的失败。(2)满足基本电气性能。连接需要连接的各部位以后,需要仔细检查线路是否连接错误,没有错误后仔细调整线路,达到设计需求的电气性能。(3)最美观。在连接没有错误且电气性能达标的情况下,但是如果一眼看去有很多颜色混乱重叠,无论电气性能有多么优异,也不会被人认可。这是因为混乱的颜色对后期测试和维护有很多干扰和影响。所以整个PCB接线应整齐均匀,保证电气性能的同时,满足其他个性化要求。接线主要按照以下原则进行:=1\*GB3①优先布置地线与电源线,确保PCB的电气性能。可接受范围内适当拓宽电源和接地线宽度。=2\*GB3②先连接技术要求较高的线(如高频线),输入输出端的边缘要避免相邻的平行以避免反射干扰或者在之间加上地线,设计多层板时应当使相邻层的连线互相垂直。=3\*GB3③时钟线尽可能短,保证信号准确性,特殊的高速逻辑线路部分应增加接地面积。=4\*GB3④不要使用90°折线,90°容易导致线路连接断开。采用45°折线方式,来减少高频信号的辐射;=5\*GB3⑤信号线上不能形成环路。保证尽可能减小环路,信号线上通孔数量小=6\*GB3⑥关键线尽可能短而粗,并在两侧添加保护。=7\*GB3⑦测试点需要保留,有利于后期调试,生产和维护测试。=8\*GB3⑧优化布局。无连接错误保证电气性能的情况下,尽量使用大面积铜层作为地线,并且使用印制电路板。5.2印制电路板设计印刷电路板主要是为了固定安装电子元器件以及元器件管脚连接。印制电路板常用“PCB”来表示,PCB是特殊的布局样式,使用PCB将大大缩减布线和组装产生的错误,提高生产效率和成功率。使用PCB可以简化电子设备的组装,减少电子元件之间的布线,并降低生产价格。在日常应用中,主要是利用各种制作软件画好PCB图,之后再通过机器对基材进行打孔、腐蚀、敷铜等操作形成可以使用安装电子元器件的电路板。5.2.1印制电路板的种类根据电路板导电层分类:单面板:绝缘基板的一个面用于导线排列,而另一个方面则用于标记零件种类的电气特性和参数,用于安装电子零件时进行定位。单面板在设计线路上要求连线之间不能交叉,导致单面板的利用效率不高。双面板:在绝缘基板的上、下二面均有导线,连接两面导线时需要在板子间打上导孔,双面板有效地解决了单面板中由于布线不能交错而导致的低利用率问题。多层板:由定位系统和绝缘粘合材料交替沿用,导电图形严格按照多层计算机电路板的外观要求进行互连,导电层的数量通常为双数,中心层大多连接到电源和接地线。5.2.2印制电路板制作流程=1\*GB3①根据各种元素的电气性能来设计原理图。=2\*GB3②通过PROTEL对元器件进行封装,生成和实现元器件具有相同外观和尺寸的网格。=3\*GB3③正式生成PCB。生成网络后,根据PCB板的大小调整器件的位置,排除元器件引脚连线交叉这类错误。=4\*GB3④打印PCB。必须为元件的安装提供安装孔,通常使用钻头或者螺丝钉在基板上钻孔,在导孔的周围敷铜并与对应的导线连接。使用专用印纸打印PCB,裁剪一个合适的覆铜板,祛除氧化层后用转印机把PCB图印到覆铜板。=5\*GB3⑤制作。准备好腐蚀溶液,将铜板放入腐蚀溶液,等待约3至4分钟,当铜板除墨渍区域均被腐蚀,然后将其取出,用清水冲洗。=6\*GB3⑥打孔。在需要放置器件的地方进行钻孔,将器件放入。=6\*GB3⑥助焊防氧化。在安装孔上涂抹松香,在铜线的表面涂一层绿油,松香水的作用是助焊剂与抗氧化,绿油是为了防止氧化和短接。=7\*GB3⑦焊接:在对应位置按照原理图防止电子器件,使用焊锡将器件焊接安装孔上,注意不要虚焊、漏焊。=8\*GB3⑧整体测试:整体测试,检查虚焊、漏焊、短路、元器件损坏等。 6组装与调试6组装与调试6.1系统组装根据实际设计需要准备好电烙铁,万用表等焊接工具、测试工具及所需元器件等。准备好所需的元器件和工具以后,根据PCB安装元器件,安装过程中需要注意,元件要安放平整。将元器件放置在对应的位置后,再进行焊接,焊接时从板子的中心向外焊接,避免焊接时烙铁碰到其他焊点或者器件导致损坏。焊接点的要求:=1\*GB3①焊点表面浸润性好,具有良好的电气性能;=2\*GB3②适当增大焊点面积,保证焊点的机械强度;=3\*GB3③焊点要均匀,焊接点表面要清洁,无残留焊剂;=4\*GB3④且不能有毛刺、沙眼、气孔等状况;=5\*GB3⑤焊点间不能使用裸线搭焊、碰焊、线路桥连、溅锡等容易发生短路的现象;=6\*GB3⑥焊接点必须焊牢焊透,焊液必须充分渗透,不允许出现漏焊、虚焊、夹生焊点。6.2硬件调试在完成组装之后,进行硬件的调试。在调试之前不能保证电路已经没有问题,所以主控芯片以及各外置元器件不应安装上。在调试过程中,可以主要分为以下几步:=1\*GB3①检查电路的通断和电源的供电电压=2\*GB3②调试系统的供电电源=3\*GB3③系统的静态调试=4\*GB3④系统的动态调试=5\*GB3⑤指标测试=6\*GB3⑥将主控及其他外置元件加上调试调试时可能出现的故障:=1\*GB3①有虚焊和漏焊的情况;=2\*GB3②元器件安装位置不对或者元器件有损坏;=3\*GB3③气候导致元器件的性能下降;=4\*GB3④接触不良;=5\*GB3⑤本身设计的电路板的问题等等。6.3软件调试编译软件时,对编译报错的结果进行修改,直到编译后的结果成功。首先在keil软件中进行单步执行程序,在单步执行的过程中观察单片机每个引脚的电平情况,保证结果与预期之间相同。在结果都准确以后就可以通过下载工具下载编译成功的hex后缀的可执行程序,或者直接通过st-link在keil软件中使用load按钮直接下载到单片机中。6.4软硬件联合调试进行硬件和软件系统联合调试,打开电源查看效果,如果OLED显示器没有显示应该显示的内容,首先检查电源是否正常供电,使用万用表查看显示器两端是否能正常供电。其次检测程序是否成功下载到单片机。如果都没有问题仍不显示,或不显示正确的内容,引脚连接是否正确,软件端口是否使能。在能正常显示之后,再测试其他的功能,比如数据通信和报警功能,首先检测WiFi模块是否能正常通电,其次检测引脚连接是否正确,最后检测程序是否正常使能每一个功能模块使用到的I/O口。每个模块都是用这样的思路来进行联合调试。6.5调试结果经过三次调试后,主要能够实现该系统的基本功能有:=1\*GB3①上电后,显示当前检测的温度、湿度和光照强度。=2\*GB3②通过wifi能够连接到手机实现无线通讯,在手机上显示出温度、湿度及光照强度的设置界面。=3\*GB3③通过滑动滑条,手机上设置湿度、温度及光照强度的上限值。=4\*GB3④通过程序判断温度、湿度及光照强度值是否满足超过限定值,若超过则蜂鸣器产生报警。
结论结论 技术革新的步伐越来越快,只有跟上时代的步伐不断进步。在现代农业实际生产过程中需要更加科学、全面的管理模式。例如生产土地污染、工业废物污染、地下水污染、森林衰退和其他环境问题经常出现。对环境的智能监测需求越来越高,不同的农作物,经济作物在农业生产对环境的要求也不同。为了更好的发展新兴农业技术,对作物的生长环境要求更加严苛,这也要求我们在农业生产中对于环境变化的感知更加准确,及时。研究基于单片机的现代农业智能监测系统能够准确、及时的感知反馈农作物生长环境的变化,促进农业技术发展。本文是基于STM32F103C8T6单片机的现代农业智能监测系统,主要完成以下任务:=1\*GB3①整体设计的系统框图=2\*GB3②对系统的各个模块进行分别研究,主要包括STM32单片机最小系统、DHT11温湿度检测模块、esp8266WiFi通信模块、OLED显示模块、土壤湿度采集模块、光敏A/D模块以及报警模块。=3\*GB3③对整体软件的设计,包括对各个模块的实现,主要包括主程序、OLED显示系统,报警系统,以及传感器DHT11和WiFi通信等模块程序。本系统的设计是现代农业智能监测环境,采用价格相对便宜的STM32F103C8T6单片机为核心,使用C语言编程,简单、快捷地实现了智能监测,该系统的创新点是:=1\*GB3①在该系统之上加入了报警系统与WiFi通信,使监测功能更加完全。=2\*GB3②利用STM32F103C8T6单片机微型系统为CPU,设计简单、精确性好、成本低。对于本次的设计我认为不足的地方:=1\*GB3①没有使用更高级光照强度采集模块来显示。=2\*GB3②没有实际印制电路板来进行硬件组装,而是采用了洞洞板进行焊接。我希望在今后的工作学习中,把自己在学校里学习到的知识运用到生活里甚至更广阔的的地方,积极改善自己在本次论文中暴露出来的问题 参考文献参考文献[1]张吉香,万大娟,董洪梅.国内外环境监测平台研究进展.环境研究与监测,2014,27:42~44[2]宁欣,苗青林,李晓敏.基于单片机的环境监测系统设计.河南科技学院学报(自然科学版),2008,36:75~77[3]张毅坤.单片微型计算机原理及应用[M].西安电子科技大学出版社,1998.[4]涂瑞.基于ARM的远程室内环境监测系统[D].长沙:湖南大学,2014:1~57[5]于波.基于单片机的室内环境监测系统设计[D].青岛:中国海洋大学,2011:1~28[6]谢维成.杨加国.单片机原理与应用及C51程序设计.第3版.北京:清华大学出版社,2014[7]刘迎春.王磊C语言程序设计.西安电子科技大学出版社,2008.08.[8]杨帆.秦会斌.传感器技术.西安电子科技大学出版社,2008.09.[9]丁元杰.单片微机原理及应用[M].北京:机械工业出版社,1999[10]陈卫兵.宋健娟.单片机原理及应用.西安科技大学出版社,2008.07.[11]周兴华.手把手教你学单片机C语言程序设计.北京航天航空大学出版社,2007.08.[12]杨碧石.何其贵.模拟电子技术基础.北京航天航空大学出版社,2006.01.[13]李广弟.单片机基础2版(修订版)[M].北京:北京航空航天大学出版社,2001[14]胡辉.单片机原理与应用[M].中国水利水电出版社,2008[15]曹巧媛.单片机原理及应用(第二版)[M].北京:电子工业出版社,2002[16]何立民.单片机高级教程[M].北京:北京航空大学出版社,2000[17]CooperJ.Afast-responsepyroelectricthermaldetector[J]:SciInstruments,1962,39-467[18]ChynowethAG.Dynamicmethodformeasuringthepyroelectriceffectwithspecialreferencetobariumtitanate[J]:ApplPhys,1956,27-78[19]NorkusV.Pyroelectricinfrareddetectorsbasedonlithiumtantalite:stateoftheartandprospects.ProcSPIE,2004,51-121[20]朱玉强.现代农业大棚环境监测系统设计[D].安徽理工大学,2016.[21]孙国辉.智能农业监控系统[D].黑龙江大学,2016.[22]李明.基于ZigBee的智慧农业信息监测系统研究[D].内蒙古大学,2020.[23]朱文博.基于WiFi的实时环境监测系统设计与实现[D].华中师范大学,2020.[24]李海园.基于Cortex-A9处理器的室内环境监测系统的设计与实现[D].西安石油大学,2020.[25]蒋力耀,崔勇,张耀阳.基于STM32F103ZET6单片机的地铁站环境监测系统设计[J].电子测试,2021(09):33-34+17.[26]邱义,郭一晶,李舜.基于阿里云IOT的机房环境监测系统设计与实现[J].现代工业经济和信息化,2021,11(04):49-51+54.[27]SensorResearch,JournalofTechnology.InvestigatorsatWageningenUniversityandResearchZeroinonSensorResearch(SystemsArchitectureDesignPatternCatalogforDevelopingDigitalTwins)[J].2020[28]YaoRu,YangJinhua,LiuMeizhenJournalofPhysics.ConferenceSeries,CloudIntelligentParkingManagementSystemBasedonInternetofThingsTechnology[J].2021.1865(4)[29]RuijieYang,YanWang,FanYi,XudongHan.DesignofvoicetemperaturecontrolfaucetbasedonSTM32MCU[J].JournalofPhysics:ConferenceSeries,2021,1906(1).[30]FerrazDenes,ThomazDouglasVieira,AntunesRafaelSouza,LopesFlavioMarques.Developmentofalow-costcolorimetricpaper-basedspottestfortheenvironmentalmonitoringofphenolicpollutants[J].EnvironmentalChallenges,2021(prepublish). 附录A:系统电路原理图附录A:系统电路原理图
附录B:系统PCB图附录B:系统PCB图
附录C:实物图附录C:实物图附录D:元件清单附录D:元件清单器件名称功能引脚数量STM32F103C8T6CPU,控制处理1DHT11采集温湿度PB01光敏模块光照PA61Esp8266WiFi模块数据通信PB11,PB101土壤湿度模块采集土壤湿度PA21OLED模块显示PB6,PB71RGB灯灯光示警PB12,PB13,PB141蜂鸣器报警PC141附录E:系统程序附录E:系统程序main.c:#include"led.h"#include"delay.h"#include"sys.h"#include"usart.h" #include"timer.h"#include"usart3.h"#include"dht11.h"#include"OLED_I2C.h"#include"gizwits_product.h"#include"time2.h"#include"mq_2.h"#include"string.h"dataPoint_tcurrentDataPoint;externu8beep_flag;voidOLED_clear_light(unsignedcharfill_Data);voidOLED_clear_tu(unsignedcharfill_Data);voidOLED_clear_CO2(unsignedcharfill_Data);voidGizwits_Init(void){ TIM3_Int_Init(9,7199);usart3_init(9600) TIM4_Int_Init(4999,7199); gizwitsInit();}u8temperature=0,humidity=0;u8buf1[10]={0};u8buf2[10]={0};u8buf3[10]={0};u8buf4[10]={0};u8buf5[10]={0};intmain(void){ u8light=0,tu=0; SystemInit(); delay_init(); TIM2_Int_Init(2000,7200); TIM4_Int_Init(2000,7200); DHT11_Init(); LED-Init(); MQ2_adc_Init();OLED-Init(); Gizwits_Init(); show(); printf("WIFIreset,pleaseretest\r\n"); gizwitsSetMode(WIFI_RESET_MODE);delay_ms(1000);#if!MODULE_TYPEgizwitsSetMode(WIFI_AIRLINK_MODE);delay_ms(1000);#endif while(1) { if(beep_flag==1){BEEP=0;} else{BEEP=1;} if(DHT11_Read_Data(&temperature,&humidity)==0) { currentDataPoint.valueTemp=temperature; currentDataPoint.valueHumi=humidity; sprintf((char*)buf1,"%d",temperature); sprintf((char*)buf2,"%d",humidity); OLED-ShowStr(32,2,buf1,2); OLED-ShowStr(98,2,buf2,2); } light=Light_Show(); if(light) { currentDataPoint.valueLight=light; OLED_clear_light(0); OLED_ShowCN(0,4,3);OLED_ShowCN(16,4,4); OLED_ShowCN(0,6,5);OLED_ShowCN(16,6,6); sprintf((char*)buf3,"%d",light); OLED-ShowStr(32,4,buf3,2); }tu=tu_Show(); if(tu) { currentDataPoint.valueTu=tu;OLED_clear_tu(0); OLED_ShowCN(0,4,3);OLED_ShowCN(16,4,4); OLED_ShowCN(0,6,5);OLED_ShowCN(16,6,6); sprintf((char*)buf5,"%d",tu); OLED-ShowStr(32,6,buf5,2); } gizwitsHandle((dataPoint_t*)¤tDataPoint); }}oled.c:#include"OLED_I2C.h"#include"delay.h"#include"codetab.h"voidI2C_Configuration(void){ I2C_InitTypeDefI2C_InitStructure; GPIO_InitTypeDefGPIO-InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE); GPIO-InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7; GPIO-InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO-InitStructure.GPIO_Mode=GPIO_Mode_AF_OD; GPIO_Init(GPIOB,&GPIO-InitStructure); I2C_DeInit(I2C1); I2C_InitStructure.I2C_Mode=I2C_Mode_I2C; I2C_InitStructure.I2C_DutyCycle=I2C_DutyCycle_2; I2C_InitStructure.I2C_Ack=I2C_Ack_Enable; I2C_InitStructure.I2C_AcknowledgedAddress=I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_ClockSpeed=400000; I2C_Cmd(I2C1,ENABLE); I2C_Init(I2C1,&I2C_InitStructure);}voidI2C_WriteByte(uint8_taddr,uint8_tdata){while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY)); I2C_GenerateSTART(I2C1,ENABLE); while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)); I2C_Send7bitAddress(I2C1,OLED_ADDRESS,I2C_Direction_Transmitter); while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); I2C_SendData(I2C1,addr); while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_SendData(I2C1,data); while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_GenerateSTOP(I2C1,ENABLE);}voidWrite_Cmd(unsignedcharI2C_Command){ I2C_WriteByte(0x00,I2C_Command);}voidWriteDat(unsignedcharI2C_Data){ I2C_WriteByte(0x40,I2C_Data);}voidOLED-Init(void){ I2C_Configuration(); delay_ms(100); Write_Cmd(0xAE); Write_Cmd(0x20); Write_Cmd(0x10); Write_Cmd(0xb0); Write_Cmd(0xc8); Write_Cmd(0x00); Write_Cmd(0x10); Write_Cmd(0x40); Write_Cmd(0x81); Write_Cmd(0xff); Write_Cmd(0xa1); Write_Cmd(0xa6); Write_Cmd(0xa8); Write_Cmd(0x3F); Write_Cmd(0xa4); Write_Cmd(0xd3); Write_Cmd(0x00); Write_Cmd(0xd5); Write_Cmd(0xf0); Write_Cmd(0xd9); Write_Cmd(0x22); Write_Cmd(0xda);hardwareconfiguration Write_Cmd(0x12); Write_Cmd(0xdb); Write_Cmd(0x20); Write_Cmd(0x8d); Write_Cmd(0x14); Write_Cmd(0xaf); OLED_CLS();}voidOLED-SetPosition(unsignedcharx,unsignedchary){ Write_Cmd(0xb0+y); Write_Cmd(((x&0xf0)>>4)|0x10); Write_Cmd((x&0x0f)|0x01);}voidOLED_Fill(unsignedcharfill_Data){ unsignedcharm,n; for(m=0;m<8;m++) { Write_Cmd(0xb0+m); Write_Cmd(0x00); Write_Cmd(0x10); for(n=0;n<128;n++) { WriteDat(fill_Data); } }}voidOLED_CLS(void){ OLED_Fill(0x00);}voidOLED_ON(void){ Write_Cmd(0X8D); Write_Cmd(0X14); Write_Cmd(0XAF);}voidOLED_OFF(void){ Write_Cmd(0X8D); Write_Cmd(0X10); Write_Cmd(0XAE);}OLED_ShowChar()voidOLED-ShowStr(){ unsignedcharc=0,i=0,j=0; switch(TextSize) { case1: { while(ch[j]!='\0') { c=ch[j]-32; if(x>126) { x=0; y++; } OLED-SetPosition(x,y); for(i=0;i<6;i++) WriteDat(F6x8[c][i]); x+=6; j++; } }break; case2: { while(ch[j]!='\0') { c=ch[j]-32; if(x>120) { x=0; y++; } OLED-SetPosition(x,y); for(i=0;i<8;i++) WriteDat(F8X16[c*16+i]); OLED-SetPosition(x,y+1); for(i=0;i<8;i++) WriteDat(F8X16[c*16+i+8]); x+=8; j++; } }break; }}voidOLED_ShowCN){ unsignedcharwm=0; unsignedintadder=32*N; OLED-SetPosition(x,y); for(wm=0;wm<16;wm++) { WriteDat(F16x16[adder]); adder+=1; } OLED-SetPosition(x,y+1); for(wm=0;wm<16;wm++) { WriteDat(F16x16[adder]); adder+=1; }}OLED-DrawBMP();voidOLED-DrawBMP(){ unsignedintj=0; unsignedcharx,y;if(y1%8==0) y=y1/8;else y=y1/8+1; for(y=y0;y<y1;y++) { OLED-SetPosition(x0,y);for(x=x0;x<x1;x++) { WriteDat(BMP[j++]); } }}voidshow(void){ OLED_ShowCN(0,0,7);OLED_ShowCN(16,0,8);OLED_ShowCN(32,0,9);OLED_ShowCN(48,0,10); OLED_ShowCN(64,0,11);OLED_ShowCN(80,0,12);OLED_ShowCN(96,0,13);OLED_ShowCN(112,0,14); OLED_ShowCN(0,2,0);OLED_ShowCN(16,2,1); OLED_ShowCN(66,2,2);OLED_ShowCN(82,2,1); OLED_ShowCN(0,4,3);OLED_ShowCN(16,4,4); OLED_ShowCN(0,6,5);OLED_ShowCN(16,6,6); OLED-ShowStr(48,2,"C",2); OLED-ShowStr(112,2,"%",2);}voidOLED_clear_tu(unsignedcharfill_Data){ unsignedcharm,n; for(m=6;m<8;m++) { Write_Cmd(0xb0+m); Write_Cmd(0x00); Write_Cmd(0x10); for(n=0;n<128;n++) { WriteDat(fill_Data); } }}voidOLED_clear_CO2(unsignedcharfill_Data){ unsignedcharm,n; for(m=2;m<4;m++) { Write_Cmd(0xb0+m); Write_Cmd(0x00); Write_Cmd(0x10); for(n=0;n<128;n++) { WriteDat(fill_Data); } }}voidOLED_clear_light(unsignedcharfill_Data){ unsignedcharm,n; for(m=4;m<6;m++) { Write_Cmd(0xb0+m); Write_Cmd(0x00); Write_Cmd(0x10); for(n=0;n<128;n++) { WriteDat(fill_Data); } }}dht11.c:#include"dht11.h"#include"led.h"#include"delay.h"#include"string.h"#include"stdio.h"voidDHT11_Rst(void) { DHT11_IO_OUT(); DHT11_DQ_OUT=0;delay_ms(20);DHT11_DQ_OUT=1; delay_us(30);}u8DHT11_Check(void) { u8retry=0; DHT11_IO_IN();while(DHT11_DQ_OUT||retry>45) { retry++; delay_us(1); }; if(retry>=100)return1; elseretry=0;while(!DHT11_DQ_OUT&&retry>40) { retry++; delay_us(1); }; if(retry>=100)return1; return0;}u8DHT11_Read_Bit(void) { u8retry=0; while(DHT11_DQ_OUT&&retry<100) { retry++; delay_us(1); } retry=0; while(!DHT11_DQ_OUT&&retry<100) { retry++; delay_us(1); } delay_us(40); if(DHT11_DQ_IN)return1; elsereturn0; }u8DHT11_Read_Byte(void){u8i,dat;dat=0; for(i=0;i<8;i++) { dat<<=1; dat|=DHT11_Read_Bit();} returndat;}u8DHT11_Read_Data(u8*temp,u8*humi){ u8buf[5]; u8i; DHT11_Rst(); if(DHT11_Check()==0) { for(i=0;i<5;i++) { buf[i]=DHT11_Read_Byte(); } if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4]) { *humi=buf[0]; *temp=buf[2]; } }elsereturn1; return0; }u8DHT11_Init(void){ GPIO_InitTypeDefGPIO-InitStructure; GPIO-InitStructure.GPIO_Pin=GPIO_Pin_0; GPIO-InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; GPIO-InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO-InitStructure); GPIO_SetBits(GPIOB,GPIO_Pin_0); DHT11_Rst(); returnDHT11_Check();}tu.c:#include"tu_2.h"#include"delay.h"#include"stdio.h"#include"dht11.h"#include"string.h"#include"led.h"voidtu_adc_Init(void){ RCC->APB2ENR|=1<<2; GPIOA->CRL&=0XFFFF0FF0; RCC->APB2ENR|=1<<9; RCC->APB2RSTR|=1<<9; RCC->APB2RSTR&=~(1<<9); RCC->CFGR&=~(3<<14); RCC->CFGR|=2<<14; ADC1->CR1&=0XF0FFFF; ADC1->CR1|=0<<16; ADC1->CR1&=~(1<<8); ADC1->CR2&=~(1<<1); ADC1->CR2&=~(7<<17); ADC1->CR2|=7<<17; ADC1->CR2|=1<<20; ADC1->CR2&=~(1<<11); ADC1->SQR1&=~(0XF<<20); ADC1->SQR1|=0<<20; while(ADC1->CR2&1<<3); ADC1->CR2|=1<<2; while(ADC1->CR2&1<<2);} u16MQ2_Get_Adc(u8ch){ Returnnull; }u16tu_Get_Adc_Average(u8ch,u8times){ u32temp_val=0; u8t; for(t=0;t<times;t++) { temp_val+=MQ2_Get_Adc(ch); delay_ms(5); } returntemp_val/times;} u8Light_Show(void){ u16adcx; u8ad_mq=0; adcx=MQ2_Get_Adc_Average(0,10); ad_mq=((4096-adcx)*100/4096); if(ad_mq>40){red();} if(ad_mq<10){green();} if((ad_mq>15)&&(ad_mq<40)){blue();} returnad_mq;}u8ad_mq=0;u8tu_Show(void){ u16adcx; adcx=tu_Get_Adc_Average(3,10); ad_mq=((4096-adcx)*100/4096); printf("tu-ad:%d\n",adcx); returnad_mq+1;}toc.c:#include<stdio.h>#include<string.h>#include"gizwits_product.h"#include"common.h"#include"usart3.h"#include"led.h"#include"delay.h"#include"OLED_I2C.h"u8beep_flag=0;externu8ad_mq;externu8temperature;externu8 humidity;staticuint32_ttimerMsCount;externdataPoint_tcurrentDataPoint;int8_tgizwitsEventProcess(eventInfo_t*info,uint8_t*gizdata,uint32_tlen){uint8_ti=0;dataPoint_t*dataPointPtr=(dataPoint_t*)gizdata;moduleStatusInfo_t*wifiData=(moduleStatusInfo_t*)gizdata;protocolTime_t*ptime=(protocolTime_t*)gizdata;#ifMODULE_TYPEgprsInfo_t*gprsInfoData=(gprsInfo_t*)gizdata;#elsemoduleInfo_t*ptModuleInfo=(moduleInfo_t*)gizdata;#endifif((NULL==info)||(NULL==gizdata)){return-1;}for(i=0;i<info->num;i++){switch(info->event[i]){caseEVENT_Temp_Val:currentDataPoint.valueTemp_Val=dataPointPtr->valueTemp_Val;GIZWITS_LOG("Evt:EVENT_Temp_Val%d\n",currentDataPoint.valueTemp_Val); if(currentDataPoint.valueTemp_Val<temperature){beep_flag=1;} else{BEEP=1;beep_flag=0;};break;caseEVENT_Tu_Val:currentDataPoint.valueTu_Val=dataPointPtr->valueTu_Val;GIZWITS_LOG("Evt:EVENT_Tu_Val%d\n",currentDataPoint.valueTu_Val); if(currentDataPoint.valueTu_Val<ad_mq){BEEP=0;beep_flag=1;} else{BEEP=1;beep_flag=0;};break;caseEVENT_Humi_Val:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 太原城市职业技术学院《智慧物流与大数据》2024-2025学年第二学期期末试卷
- 机关内部协作制度
- 机关内部督办制度
- 机场内部安全监察制度
- 李宁企业内部员工制度
- 林场财务内部管理制度
- 民庭内部管理制度
- 民警内部通报制度
- 海事局财务内部控制制度
- 海尔内部员工考核制度
- 2026年吉林交通职业技术学院单招职业技能考试题库带答案详解(轻巧夺冠)
- Unit2Playsafely(教学课件)英语人教PEP版二年级下册
- 2026福建龙岩漳平市招聘高校师范类毕业生101人备考题库及答案详解(典优)
- 《2026年》融资租赁岗位高频面试题包含详细解答
- 北京市东城区2025-2026学年高二上学期期末考试化学试卷(含答案)
- 统编版(2026)八年级下册历史教材课后问题答案(全册)
- 2024年江苏省中学生生物学奥林匹克初赛理论试题
- 泥石流灾害与防治工程
- 高分子材料工程专业英语翻译(DOC)
- 【高中数学】充要条件+课件+高一上学期数学人教A版(2019)必修第一册
- Soul《心灵奇旅(2020)》完整中英文对照剧本
评论
0/150
提交评论