• 机器人制作开源方案 | 智能照科植物花架


    作者:付菲菲、于海鑫、王子敏
    单位:黑河学院
    指导老师:索向峰、李岩
     

    1. 概述

    1.1设计背景
           随着时代的发展,城市化脚步加快、城市人口密度越来越大、城市生活节奏快压力大作息难成规律。城市建筑建筑面积迅速增加、而绿地面积越来越少,生活环境逐渐变差。身居城市的人们渴望一个舒适安宁。 自然和谐的环境从而不同程度的着手绿化环境。家庭养植开始快速发展,对增加城市绿的面积,改善特定范围内的人居环境有着极其重要的意义。人们对花卉的需求量越来越大,但是现今的花卉养植基本都是靠花卉主进行的人工培育、所以,养殖主要花卉大量的精力去培育花卉,如此一来就会浪费大量的人力物力和财力,造成资源浪费,也会造成花开成本升高、也二降低了花卉主的收益以及人们的购买力。在家庭养植发展的同时物联网技术也在迅速发展。而技术也正在快速的发展和成熟,将基于的物联网技术应用到家庭养植管理是一个很好的发展方向。通过这个智能监测系统。可以准确的采集花生卉长环境的各项指标。并将所测得的花卉指标通过与标准环境进行对比、人们便可以准确及时的进行改变其生长环境到最佳生长环境状态下。那么只需要花费少量的资源来对花卉生长环境进行修正即可还大大的提高了花卉的成活率减少损失提高效率。

    1.2综述
          目前植物检测器有两大分类,一种为监测型,另一种为养护型。监测型价格便宜但功能较少。养护型可以全方位的对植物进行呵护有利于植物更好的成长。大家现在的解决方案基本都为软硬件结合,通过手机和智能硬件互动。监测型产品国外代表产品有“flower power智能盆栽检测器”,与国内小米公司的“花花草草检测器”类似。只能进行植物信息的采集和反馈。并不具备对植物进行补光和浇水等功能。养护型产品国内有“花小白智能盆栽”,其具备浇水功能,但产品设计分散,花盆与水箱分离,美观性和实用性不强。而本次探索者程序设计的智能花架的智能体现在它可以通过实时监测植物生长的外界环境因素(空气温湿度,土壤湿度,光照强度等),随着植物生长环境条件的变化,自动浇水,自动补光,自动补充从而适时的调节植物正常生长所需的外界环境因素,使植物生长在一个合适的环境当中。解决了用户无法实时照顾植物的痛点。智能花架的实时监测功能,可以监测植物的当前状态,自动浇水,自动补光功能完全可以替代人的照料。即使用户身处在另一座城市之中,植物也会得到及时的照料。

    2. 系统整体设计

    2.1设计要求
           在本次探索者创新设计挑战赛中,本队伍设计的智能花架具有自动感应参数功能,要求花架感应植物生长环境的变化,针对不利于植物正常生长的环境参数如:温度、土壤和空气湿度、光线强度等做出调整,使之有利于植物的正常生长
           ① 感应要求
           感应功能要求能够正确的感知植物土壤的湿度是否有利于当前植物的需求;
           感知植物所处空间的湿度与温度是否符合当前植物生长的需求;感知当前室内光照强度是否利于植物的正常生长
           ② 调整要求
           调整功能需要通过设备感应与系统控制功能相结合,在不符合要求的土壤湿度环境下,对植物进行自动灌溉,当满足要求时,系统自动停止灌溉;在不符合环境温度空气湿度情况下,通过温度传感器、湿度传感器与发热器、喷洒器改变植物周围的温度与湿度,是植物保持正常生长;在不符合光照强度情况下,通过智能调光版与采光系统,使植物受到的光照强度符合生长要求。

    2.2 智能花架系统总体设计
           根据设计方案,花架共包括五大模块:温度器模块、湿度传感器模块、光线传感器模块、灌溉模块、采光与调光模块、电源模块。

           ① 湿度感器模块:在该模块中对在该模块中对植物周围空气中水分和土壤中的水分所占的比例进行测量其作用主要是将测量结果反馈给控制系统,让其与系统预设湿度进行比对,从而让系统判断是否需要对植物周围湿度和土壤湿度做出调整。
           ② 温度传感器模块:在该模块中通过热敏电阻将植物周围温度传递给控制系统,让其与系统预设温度进行比对,从而让系统判断是否需要对植物周围温度做出调整。
           ③ 光线传感器模块:在该模块中将植物周围光线强度传递给控制系统,让其与系统预设光线强度进行比对,如果植物受到的光照强度过强则控制调光版使周围光线强度降低;如果植物受到光照强度较弱,则通过光线追踪控制调整植物角度使其最大范围,最大角度接受光照。
           ④ 灌溉模块:当系统接受到湿度传感器的信息后,如果不符合预设要求,则控制系统会控制水泵自动抽水对植物进行灌溉,直到传感器信息符合预设要求调整灌溉。
           ⑤ 调光与采光模块:当系统接受到光线传感器的信息后,如果不符合要求,则控制系统会通过调光版以及光线追踪,角度调整对植物受到的光照强度进行调整。
     

    3. 机械结构设计

    3.1主体结构和机械运作结构
           主体花架采用立体分层式结构设计,便携轻巧,节省空间,总体结构美观。机械运作,通过电磁阀门控制水泵灌溉与水箱自动上水,水位报警采用硬件电路控制,实现水箱水位实时监测功能;通过调光版升降程度与位置调节器调整植物摆放角度与受光强度,实现受光控制功能;通过机械臂控制喷水器方位,通过电磁喷嘴控制喷水强度,实现湿度稳定功能。

    3.2传输模块
           选用的传输模块是nRF905,利用nRF905的ShockBrusrTM接收模式接收其他模块传来的数据和 ShockBrusTM 发送模式将接收到的数据发送给其他需要数据的模块。
           ShockBrusrTM接收模式:当一个包含正确地址和数据的数据包被接收到后,地址匹配(AM)和数据准备好(DR)两引脚通知微控制器。
           ShockBrusTM 发送模式:nRF905 自动产生字头和 CRC 校验码(循环冗余码校验),当发送过程完成后,数据准备好引脚通知微处理器数据发射完毕。
           整个系统的数据流动将主要依靠 nRF905 无线传输模块中的ShockBrusrTM接收模式和ShockBrusTM 发送模式进行,以此来使正个系统各项指令的能快捷方便的传输。

    3.3主控模块
           通过给AT89C51单片机进行程序编程让 AT89C51单片机实现对DHT11温度传感器,DHT11湿度传感器,BH1750光照传感器,土壤湿度传感器的控制与参数调节,通过螺丝和螺柱来调节高度使单片机主控板方便接线,并且主板与各器件处于对称的位置,有利于花架的稳定。

    3.4电源模块
           可以采用机车移动式电源与家用电器交流电源两种类型,方便智能花架应运于各种场景

    4. 硬件信息

    4.1 AT89C51单片机
           AT89C51是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,闪烁可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制浩技术制造、与工业标准的MCS-51指合集和输出管脚相兼容。由多功能8位CPU和闪烁存储器组合在单个芯片中。AT89C51单片机为智能花架嵌入式控制系统提供了一种灵活性高且价廉的方案。

    4.2 DHT11湿度传感器
           DHT11数字湿度传感器是一款含有已校准数字信号输出的湿度复合传感器,它应用专用的数字模块采集技术湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。传感器为一个电阻式感湿元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个 DHT11 传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,使其成为该类应用中,在苛刻应用场合的最佳选择。产品为4针单排引脚封装,连接方便。

    4.3 DHT11温度传感器
           DHT11数字温度传感器是一款含有已校准数字信号输出的温度复合传感器,它应用专用的数字模块采集技术温度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。传感器为一个NTC 测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个 DHT11 传感器都在极为精确的温度校验室中进行校准。校准系数以程序的形式存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,使其成为该类应用中,在苛刻应用场合的最佳选择。产品为4针单排引脚封装,连接方便。

    4.4 BH1750光照传感器
           BH1750环境光传感器内置16位的模数转换器,它能够直接输出一个数字信号,不需要再做复杂的计算。这是一种更精良的和容易使用简易电阻器的版本,通过计算电压,来获得有效的数据。这款环境光传感器能够直接通过光度计来测量。光强度的单位是流明"Ix”。当物体在均匀的光照下它能够在每平方米获 得1lx的光通量,它们的光强度是1lx。有时为了充分利用光源,你可以增加一个光源的反射装置。那样在某些方向就能获得更多的光通量,以增加被照表面的亮度。

    4.5 土壤湿度传感器
           模块中蓝色的电位器是用于土壤湿度的阀值调节,数字量输出DO可以与单片机直接相连,通过单片机来检测高低电平,由此来检测土壤湿度;小板模拟量输出AO可以和AD模块相连,通过AD转换,可以获得土壤湿度更精确的数值。

    5. 工作流程

    5.1流程框架图

    5.2详细功能与指标

    6. 系统开发与测试

           产品的问题是不可避免的,所以必须经过严格的测试。通过对本产品的测试,尽可能的发现产品中存在的错误,借以减少系统内部各模块的逻辑,功能上的缺陷和错误,保证每个单元能正确地实现其预期的功能。检测和排除子系统(或系统)结构或相应程序结构上的错误,使所有的系统单元配合合适,整体的性能和功能完整。

    6.1功能测试
           主要核实所有功能均已正常实现,与需求一致。测试是否可以正常监测植物周边环境的空气温湿度、光照、土壤湿度信息。

    6.2性能测试

           主要测试设备连续工作是否正常,观察智能养护效果是否理想。调光版和浇水对植物的影响是否明显。

    6.3测试数据
           我们进行了24小时不间断测试,环境数据我们通过标准测量设备测出,实测数据通过我们的产品传感器测出。

    6.4结果分析
           可以从以上分析看出我们的对植物的补光和补水效果比较明显。当土壤湿度不宜时,水泵会自动调节浇水水量,始终使土壤湿度维持到一个正常范围。当光照不足或光照时间不足时,led 补光系统以及调光版和光线追踪系统会根据植物属性进行不同的光照调节,使植物始终受到合理的光照,利于植物生长。
     

    7. 特色与创新点

    7.1产品特色
           智能照科有植物花架外观简洁美观,我们努力把它做成家中的艺术品。此款产品适合城市居民使用,即能提高自己的品味又能净化空气,减少辐射。

    7.2产品创新
           市面上大部分花架不具备对植物进行补光和浇水监测等功能,而少部分花架产品如国内有“花小白智能盆栽”,其具备浇水功能,但产品设计分散,花盆与水箱分离,美观性和实用性不强。而本次探索者程序设计的智能花架的智能体现在它可以通过实时监测植物生长的外界环境因素(空气温湿度,土壤湿度,光照强度等),随着植物生长环境条件的变化,自动浇水,自动补光,自动补充从而适时的调节植物正常生长所需的外界环境因素,使植物生长在一个合适的环境当中。解决了用户无法实时照顾植物的痛点。智能花架的实时监测功能,可以监测植物的当前状态,自动浇水,自动补光功能完全可以替代人的照料。即使用户身处在另一座城市之中,植物也会得到及时的照料。

    8. 示例程序

    1. #include
    2. #include //内部函数,包含_nop_0空函数指令#define uchar unsigned char
    3. #define uint unsigned int
    4. sbit RS = P1^0; / 定义 LCD 模块控制引脚
    5. sbit RW=P1^1;
    6. sbit E=P1^2;
    7. #define DataPort P2 //定义LCD 模块数据端口
    8. #define Busy0x80 //忙标志,D7位为1说明忙
    9. uchar Xpos; 11列方向地址指针
    10. uchar Ypos; //行方向地址指针
    11. //以下是短延时函数
    12. void Delay5Ms(void){
    13. uinti=5552;
    14. while(i--);
    15. }
    16. void Delay400Ms(void)
    17. {
    18. unsigned char TempCycA = 5;
    19. unsigned int TempCycB;
    20. while(TempCycA--)
    21. {
    22. TempCycB=7269;
    23. while(TempCycB--);
    24. };
    25. }
    26. //以下是读忙状态函数
    27. // 功能:在正常读写操作之前检测LCD模块的忙鬃刺?
    28. //D7=0:LCD 控制器空闲;D7=1:LCD 控制器忙
    29. void CheckBusy( void )
    30. {
    31. DataPort = Oxff; //P1 口写1
    32. RS=0; //选择指令寄存器
    33. RW=1; 11选择读模式
    34. _nop_0;
    35. E=1; //使能 LCD
    36. _nop_0;
    37. _nop_0;
    38. while(DataPort & Busy)://若D7=1,则 DataPort&Busy=1,说明忙,等待E=0; //若 D7=0,说明不忙,令 E=0
    39. }
    40. //以下是写入 IR 寄存器命令函数
    41. //功能:向LCD 模块写入命令字符CMD
    42. //若 AttribC=1 检测忙信号,若 AttribC=0不检测忙信号
    43. void WriteIR(uchar CMD,uchar AttribC)
    44. {
    45. if(AttribC)CheckBusyO://若AttribC=1则检测忙信号,否则,顺序执行RS=0; //选择指令寄存器
    46. RW=0; //选择写模式
    47. _nop_0;
    48. DataPort = CMD; //将命令送数据端口
    49. _nop_0;
    50. E=1; //使能 LCD
    51. _nop_0;
    52. _nop_0;
    53. E=0; //禁止LCD
    54. }
    55. //以下是写入 DDR 寄存器函数
    56. //功能:在当前光标位置显示一个字符
    57. void WriteDDR(charc)
    58. {
    59. CheckBusyO; //检测忙信号
    60. RS=1; //选择数据寄存器
    61. RW=0; 11选择写模式
    62. _nop_0;
    63. DataPort=c; // 将显示字符送往数据口
    64. _nop_0;
    65. E=1; //写使能
    66. _nop_0;
    67. _nop_0;
    68. E=0; //禁止 LCD
    69. }
    70. //以下是光标定位函数
    71. void LcdPos(uchar Xpos,uchar Ypos)
    72. {
    73. uchar tmp; //定义 tmp 为指令码
    74. Xpos&=0x0f; //16xx 型液晶的范围是0~15
    75. Ypos&=0x01; //Y 的范围是 0~1
    76. tmp=Xpos;
    77. if(Ypos==1)
    78. tmpl=0xc0; //若 Ypos为1(显示第2 行),地址码+0xc0
    79. tmpl=0x80//若 Ypos为0(显示第1行),地址码+0x80
    80. WriteIR (tmp,0);
    81. }
    82. //以下是初始化函数
    83. //功能:向LCD模块写入不同命令,完成必要的初始化过程
    84. void LedReset( void )
    85. {
    86. Delay400Ms0;
    87. WriteIR(0x30.0)://设为 8 位接口模式,显示 2 行字符.busv=0 不检测忙信号Delay5Ms0;
    88. WriteIR(0x30,0);
    89. Delay5Ms0;
    90. WriteIR(0x30,0);
    91. Delay5MsO;
    92. WriteIR( 0x30,1); //设置显示模式(以后均检测忙信号)
    93. WriteIR( Ox08,1); //显示开关控制指令,显示关闭
    94. WriteIR(Ox01,1);;//清屏指令,将DDRAM数据全部填入”空白”
    95. WriteIR(Ox06, 1); //输入方式设置指令,字符不动,光标自动右移一格WriteIR( OxOf, 1); //显示开关控制指令,显示器开,光标开,光标闪烁
    96. }
    97. //以下是在指定行列显示字符函数
    98. void WriteChar(uchar Xpos,uchar Ypos,char c)
    99. {
    100. LcdPos(Xpos,Ypos);
    101. WriteDDR(c);
    102. }
    103. //以下是显示字符串函数
    104. void WriteString(uchar Xpos,uchar Ypos,char s[])
    105. {
    106. uchar p=0;
    107. for(;;)
    108. {
    109. WriteChar(Xpos,Ypos,s[p]):
    110. p++;
    111. if(s[p]==0)
    112. break;
    113. if(++Xpos>=15) //每行最多显示16个字符
    114. {
    115. Xpos=0; //如果一行显示不完,则转到下一行或上一行的第一个字
    116. Ypos=1;} /I如果一行显示不完,则转到下一行或上一行显示
    117. }
    118. }
    119. //Filename:SHT10.c
    120. //Author : Chen Fen
    121. //Date:2008-8-26
    122. //SHT10数字温湿度传感器的读写程序
    123. #include
    124. #define uintunsigned int
    125. uchar wendu,shidu,air,wendugao,wendudi,shidugao,shidudi,Mgao,Mdi;//定义要发送的温度和湿度 空气质量
    126. // SHT10 interface
    127. sbit SCK = P3^4; //define clock interface
    128. sbit DATA = P3^0; //define data interface
    129. sbit tem=P1^3;
    130. sbit wet=P1^4;
    131. sbit set=P1^5;
    132. sbit add=P1^6;
    133. sbit sub=P1^7;
    134. typedef union
    135. { unsigned int i; //define two union
    136. float f;
    137. } value;
    138. enum {TEMP,HUMI}; //TEMP=0,HUMI=1
    139. #define noACK 0 //用于判断是否结束通讯
    140. #define ACK 1 /1结束数据传输
    141. //adr command t/w
    142. #define STATUS_REG_W 0x06 //000 0011 0
    143. #define STATUS_REG_R 0x07 //000 0011 1
    144. #define MEASURE_TEMP 0x03 //000 0001 1
    145. #define MEASURE_HUMI 0x05 //000 0010 1
    146. #define RESET Oxle //000 1111 0
    147. void s_transstart(void)://启动传输函数
    148. void s_connectionreset(void)//连接复位函数
    149. char s_write_byte(uchar value)://DHT90写函数
    150. char s_read_byte(uchar ack); //DHT90 读函数
    151. char s_measure(uchar *p_value, uchar *p_checksum,uchar mode);//测量温湿度函数void calc_dht90(float *p_humidity,float *p_temperature)://温湿度补偿
    152. void Get_TH();
    153. void Get_TH();
    154. {
    155. value humi_val,temp_val;
    156. uchar error,checksum;
    157. s_connectionresetO;
    158. error=0;
    159. error+=s_measure((uchar*) &humi_val.i,&checksum,HUMI); //measure humidity
    160. error+=s_measure((uchar*) &temp_val.i,&checksum,TEMP); //measure temperature
    161. if(error!=0) s_connectionreset(O; //in case of an error:
    162. connection reset
    163. else
    164. {humi_val.f=(float)humi_val.i; //converts integer to float
    165. temp_val.f=(float)temp_val.i; //converts integer to float
    166. calc_dht90(&humi_val.f.&temp_val.f); //calculate humidity, temperature
    167. wendu=temp_val.f;
    168. shidu=humi_val.f;
    169. }
    170. }
    171. void s_transstart(void)
    172. // generates a transmission start
    173. // DATA:
    174. // SCK:
    175. {
    176. DATA=1; SCK=0; //Initial state
    177. _nop_0;
    178. SCK=1;
    179. _nop_0;
    180. DATA=0;
    181. _nop_0;
    182. SCK=0;
    183. _nop_O:_nop_O:_nop_O;
    184. SCK=1;
    185. _nop_0;
    186. DATA=1;
    187. _nop_0; /
    188. SCK=0;
    189. }
    190. void s_connectionreset(void)
    191. // communication reset: DATA-line=1 and at least 9 SCK cycles followed by transstart
    192. // DATA:
    193. // SCK:
    194. {
    195. uchar i;
    196. DATA=1;SCK=0; //Anitial state
    197. for(i=0;i<9;i++) //9 SCK cycles
    198. {
    199. SCK=1;
    200. SCK=0;
    201. }
    202. s_transstart(O; //transmission start
    203. }
    204. char s_write_byte(uchar value)
    205. // writes a byte on the Sensibus and checks the acknowledge
    206. {
    207. uchar i.error=0;
    208. for (i=0x80;i>0;i/=2) //shift bit for masking
    209. {
    210. if (i & value) DATA=1; //masking value with i ,write to SENSI-BUS else DATA=0;
    211. SCK=1; //clk for SENSI-BUS
    212. _nop_0_nop_0:nop_O; //pulswith approx. 5 us
    213. SCK=0;
    214. }
    215. DATA=1; //release DATA-line
    216. SCK=1; //clk #9 for ack
    217. error=DATA; //check ack (DATA will be pulled down by
    218. DHT90),DATA在第9个上升沿将被DHT90自动下拉为低电平。_nop_0:_nop_O:_nop_0;
    219. SCK=0;
    220. DATA=1; //release DATA-line
    221. return error; //error=1 in case of no acknowledge //返回:0成功,
    222. 1失败
    223. }
    224. char s_read_byte(uchar ack)
    225. // reads a byte form the Sensibus and gives an acknowledge in case of "ack=1”1
    226. {
    227. uchar i,val=0;
    228. DATA=1; //release DATA-line
    229. for(i=0x80;i>0;i/=2) //shift bit for masking
    230. {SCK=1; //clk for SENSI-BUS
    231. if (DATA) val=(val li); //read bit
    232. _nop_0:_nop_O_nop_O; //pulswith approx. 5 us
    233. SCK=0;
    234. }
    235. if(ack==1)DATA=0; //in case of "ack==1" pull down DATA-Line
    236. else DATA=1; //如果是校验(ack==0),读取完后结束通讯
    237. _nop_0:_nop_0:_nop_0; //pulswith approx. 5 us
    238. SCK=1; //clk #9 for ack
    239. _nop_0:_nop_0:_nop_O; //pulswith approx. 5 us
    240. SCK=0;
    241. _nop_0_nop_O:_nop_O; //pulswith approx. 5 us
    242. DATA=1; //release DATA-line
    243. return val;
    244. }
    245. char s_measure(uchar *p_value, uchar *p_checksum, uchar mode)
    246. // makes a measurement (humidity/temperature) with checksum
    247. {
    248. unsigned error=0;
    249. unsigned int i;
    250. s_transstartO; //transmission start
    251. switch(mode)( //send command to sensor
    252. case TEMP :error+=s_write_byte(MEASURE_TEMP);break;
    253. case HUMI :error+=s_write_byte(MEASURE_HUMI);break;
    254. defaultbreak
    255. }
    256. for (i=0;i<65535;i++) if(DATA==0) break; //wait until sensor has finished the measurement
    257. if(DATA) error+=1; // or timeout (~2 sec.) is reached
    258. *(p_value) =s_read_byte(ACK); //read the first byte (MSB)
    259. *(p_value+1)=s_read_byte(ACK)://read the second byte (LSB)
    260. *p_checksum =s_read_byte(noACK); //read checksum
    261. return error;
    262. }
    263. void calc_dht90(float *p_humidity ,float *p_temperature)
    264. // calculates temperature [C] and humidity [%RH]
    265. // input: humi [Ticks] (12 bit)
    266. temp [Ticks] (14 bit)
    267. // output:humi [%RH]
    268. temp [C]
    269. { const float C1=-4.0; // for 12 Bit
    270. const float C2=+0.0405; // for 12 Bit
    271. const float C3=-0.0000028; // for 12 Bit
    272. const float T1=+0.01; // for 14 Bit @ 5V
    273. const float T2=+0.00008; // for 14 Bit @ 5V
    274. float rh=*p_humidity; // th: Humidity [Ticks] 12 Bit
    275. float t=*p_temperature; //t: Temperature [Ticks] 14 Bit
    276. float rh_lin; // rh_lin: Humidity linear
    277. float rh_true; // rh_true: Temperature compensated humidity
    278. float t_C; //_C : Temperature [C]
    279. LC=t*0.01 - 40; //calc. temperature from ticks to [C]
    280. rh_lin=C3*rh*rh + C2*rh + C1; //cale. humidity from ticks to [%RH]
    281. rh_true=(t_C-25)*(T1+T2*rh)+rh_lin; //calc. temperature compensated humidity [%RH]
    282. if(rh_true>100)rh_true=100; //cut
    283. *p_temperature=L_C; //return temperature [C]
    284. *p_humidity=rh_true; //return humidity[%RH]
    285. }
    286. void delayms(uchar count) //延时 count ms 子程序
    287. {
    288. ucharij;
    289. do
    290. {
    291. for(i=5;i>0;i--)
    292. for(j=98:j>0;j--);
    293. }while(--count);
    294. }
    295. void keepoffwendu(uchar nowtem)
    296. {
    297. wendugao=nowtem/10;
    298. wendudi=nowtem%10;
    299. wendugao=wendugao+'0';
    300. wendudi=wendudi+0';
    301. }
    302. void keepoffshidu(uchar nowtem)
    303. {
    304. shidugao=nowtem/10;
    305. shidudi=nowtem%10;
    306. shidugao=shidugao+'0;
    307. shidudi=shidudi+'0';
    308. }
    309. void keepoffM(uchar nowtem)
    310. {
    311. Mgao=nowtem/10;
    312. Mdi=nowtem%10;
    313. Mgao=Mgao+'0;
    314. Mdi=Mdi+'0;
    315. }
    316. void showwendu(uchar shi,uchar ge)
    317. {
    318. LcdResetO;
    319. WriteString(0,0,"tem:");
    320. WriteChar(6,0,shi);
    321. WriteChar(7,0.ge);
    322. WriteChar(9,0,C");
    323. }
    324. void showshidu(uchar shi,uchar ge)
    325. {
    326. LcdResetO;
    327. WriteString(0.0,"wet:");
    328. WriteChar(6,0,shi);
    329. WriteChar(7,0.ge);
    330. WriteString(9,0,"%RH”);
    331. }
    332. void mainO
    333. {
    334. uchar M;
    335. M=40;
    336. s_connectionresetO; //
    337. delayms(100);
    338. while(1)
    339. {
    340. LcdResetO;
    341. WriteString(0,0,"hello.");
    342. if(tem==0)
    343. {
    344. TEM: while(1)
    345. {
    346. Get_TH0; //获得温度和湿度
    347. keepoffwendu(wendu);
    348. showwendu(wendugao,wendudi);
    349. if(wet==0)
    350. goto WET;
    351. else if (set==0)
    352. goto SET;
    353. }
    354. }
    355. if(wet==0)
    356. {
    357. WET: while(1)
    358. Get_THO; 1/获得温度和湿度
    359. keepoffshidu(shidu);
    360. showshidu(shidugao,shidudi);
    361. if(tem==0)
    362. goto TEM;
    363. else if (set==0)
    364. goto SET;
    365. }
    366. }
    367. if(set==0)
    368. {
    369. while(1)
    370. SET: while(1)
    371. {
    372. keepoffM(M);
    373. showshidu(Mgao,Mdi);
    374. if(add==0)
    375. M=M+1;
    376. else if (sub==0)
    377. M=M-1;
    378. else if (tem==0)
    379. goto TEM;
    380. else if (wet==0)
    381. goto WET;
    382. }
    383. }

    9. 结论

           此次大赛是本团队第一次参加该赛事,所遇到的困难和问题都欠缺处理的经验和解决的方法。但我们参赛队员饱含热情不抛弃不放弃,遇到问题就解决问题,在困难中探索,在困境中越障,在生活中循迹,想必这也是此次比赛乃至中国机器人行业从业者的精神内涵。
           为了让用户不再因为养殖植物死亡而烦恼,我们设计了家庭智能照科花架。我们希望通过我们的产品解决用户的痛点,并能爱上植物养殖。目前我们已经实现了智能盆栽的植物土壤湿度、光照、空气温湿度的信息采集与处理,并能使盆栽自动浇水与补光,使植物始终处于合适的生长环境,真正实现了24小时全面养护植物。
           然而还需要改进的地方还有许多,虽然可以通过大量的实验检测使得数据贴合的更完美,但毕竟属于开环控制,所以我们离真正智能化还有很大的一段距离要走,这也正是我们未来的目标和奋斗的方向。同时为提供比赛的举办方和协办单位提出感谢,正是前行者们的不断努力才能使对机器人有着兴趣的广大爱好者们有着参赛机会和了解行业前沿知识的机会。相信每一个对机器人有兴趣的参赛者们最终也会铭记此次参赛经历。
     

    参考文献

    * 更多详情请见 【S025】智能照科植物花架

  • 相关阅读:
    【Python笔记-设计模式】桥接模式
    行业领先的三个企业正在利用聊天机器人变得更强
    抽象工厂 责任链模式,观察者模式
    初阶JavaEE(15)(Cookie 和 Session、理解会话机制 (Session)、实现用户登录网页、上传文件网页、常用的代码片段)
    IP&TCP知识
    js匹配查找JSON中属性并返回路径
    Java学习笔记3.5.3 继承 - super关键字
    Ubuntu下命令行解析
    【atoi函数的介绍以及模拟实现】
    【Overload游戏引擎细节分析】Lambert材质Shader分析
  • 原文地址:https://blog.csdn.net/Robotway/article/details/134487951