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

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

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. 示例程序

#include <reg51.h>

#include <intrins.h> //内部函数,包含_nop_0空函数指令#define uchar unsigned char

#define uint unsigned int

sbit RS = P1^0; / 定义 LCD 模块控制引脚

sbit RW=P1^1;

sbit E=P1^2;

#define DataPort P2 //定义LCD 模块数据端口

#define Busy0x80 //忙标志,D7位为1说明忙

uchar Xpos; 11列方向地址指针

uchar Ypos; //行方向地址指针

//以下是短延时函数

void Delay5Ms(void){

uinti=5552;

while(i--);

}

void Delay400Ms(void)

{

unsigned char TempCycA = 5;

unsigned int TempCycB;

while(TempCycA--)

{

TempCycB=7269;

while(TempCycB--);

};

}

//以下是读忙状态函数

// 功能:在正常读写操作之前检测LCD模块的忙鬃刺?

//D7=0:LCD 控制器空闲;D7=1:LCD 控制器忙

void CheckBusy( void )

{

DataPort = Oxff; //P1 口写1

RS=0; //选择指令寄存器

RW=1; 11选择读模式

_nop_0;

E=1; //使能 LCD

_nop_0;

_nop_0;

while(DataPort & Busy)://若D7=1,则 DataPort&Busy=1,说明忙,等待E=0; //若 D7=0,说明不忙,令 E=0

}

//以下是写入 IR 寄存器命令函数

//功能:向LCD 模块写入命令字符CMD

//若 AttribC=1 检测忙信号,若 AttribC=0不检测忙信号

void WriteIR(uchar CMD,uchar AttribC)

{

if(AttribC)CheckBusyO://若AttribC=1则检测忙信号,否则,顺序执行RS=0; //选择指令寄存器

RW=0; //选择写模式

_nop_0;

DataPort = CMD; //将命令送数据端口

_nop_0;

E=1; //使能 LCD

_nop_0;

_nop_0;

E=0; //禁止LCD

}

//以下是写入 DDR 寄存器函数

//功能:在当前光标位置显示一个字符

void WriteDDR(charc)

{

CheckBusyO; //检测忙信号

RS=1; //选择数据寄存器

RW=0; 11选择写模式

_nop_0;

DataPort=c; // 将显示字符送往数据口

_nop_0;

E=1; //写使能

_nop_0;

_nop_0;

E=0; //禁止 LCD

}

//以下是光标定位函数

void LcdPos(uchar Xpos,uchar Ypos)

{

uchar tmp; //定义 tmp 为指令码

Xpos&=0x0f; //16xx 型液晶的范围是0~15

Ypos&=0x01; //Y 的范围是 0~1

tmp=Xpos;

if(Ypos==1)

tmpl=0xc0; //若 Ypos为1(显示第2 行),地址码+0xc0

tmpl=0x80; //若 Ypos为0(显示第1行),地址码+0x80

WriteIR (tmp,0);

}

//以下是初始化函数

//功能:向LCD模块写入不同命令,完成必要的初始化过程

void LedReset( void )

{

Delay400Ms0;

WriteIR(0x30.0)://设为 8 位接口模式,显示 2 行字符.busv=0 不检测忙信号Delay5Ms0;

WriteIR(0x30,0);

Delay5Ms0;

WriteIR(0x30,0);

Delay5MsO;

WriteIR( 0x30,1); //设置显示模式(以后均检测忙信号)

WriteIR( Ox08,1); //显示开关控制指令,显示关闭

WriteIR(Ox01,1);;//清屏指令,将DDRAM数据全部填入”空白”

WriteIR(Ox06, 1); //输入方式设置指令,字符不动,光标自动右移一格WriteIR( OxOf, 1); //显示开关控制指令,显示器开,光标开,光标闪烁

}

//以下是在指定行列显示字符函数

void WriteChar(uchar Xpos,uchar Ypos,char c)

{

LcdPos(Xpos,Ypos);

WriteDDR(c);

}

//以下是显示字符串函数

void WriteString(uchar Xpos,uchar Ypos,char s[])

{

uchar p=0;

for(;;)

{

WriteChar(Xpos,Ypos,s[p]):

p++;

if(s[p]==0)

break;

if(++Xpos>=15) //每行最多显示16个字符

{

Xpos=0; //如果一行显示不完,则转到下一行或上一行的第一个字

符

Ypos=1;} /I如果一行显示不完,则转到下一行或上一行显示

}

}

//Filename:SHT10.c

//Author : Chen Fen

//Date:2008-8-26

//SHT10数字温湿度传感器的读写程序

#include <intrins.h>

#define uintunsigned int

uchar wendu,shidu,air,wendugao,wendudi,shidugao,shidudi,Mgao,Mdi;//定义要发送的温度和湿度 空气质量

// SHT10 interface

sbit SCK = P3^4; //define clock interface

sbit DATA = P3^0; //define data interface

sbit tem=P1^3;

sbit wet=P1^4;

sbit set=P1^5;

sbit add=P1^6;

sbit sub=P1^7;

typedef union

{ unsigned int i; //define two union

float f;

} value;

enum {TEMP,HUMI}; //TEMP=0,HUMI=1

#define noACK 0 //用于判断是否结束通讯

#define ACK 1 /1结束数据传输

//adr command t/w

#define STATUS_REG_W 0x06 //000 0011 0

#define STATUS_REG_R 0x07 //000 0011 1

#define MEASURE_TEMP 0x03 //000 0001 1

#define MEASURE_HUMI 0x05 //000 0010 1

#define RESET Oxle //000 1111 0

void s_transstart(void)://启动传输函数

void s_connectionreset(void); //连接复位函数

char s_write_byte(uchar value)://DHT90写函数

char s_read_byte(uchar ack); //DHT90 读函数

char s_measure(uchar *p_value, uchar *p_checksum,uchar mode);//测量温湿度函数void calc_dht90(float *p_humidity,float *p_temperature)://温湿度补偿

void Get_TH();

void Get_TH();

{

value humi_val,temp_val;

uchar error,checksum;

s_connectionresetO;

error=0;

error+=s_measure((uchar*) &humi_val.i,&checksum,HUMI); //measure humidity

error+=s_measure((uchar*) &temp_val.i,&checksum,TEMP); //measure temperature

if(error!=0) s_connectionreset(O; //in case of an error:

connection reset

else

{humi_val.f=(float)humi_val.i; //converts integer to float

temp_val.f=(float)temp_val.i; //converts integer to float

calc_dht90(&humi_val.f.&temp_val.f); //calculate humidity, temperature

wendu=temp_val.f;

shidu=humi_val.f;

}

}

void s_transstart(void)

// generates a transmission start

// DATA:

// SCK:

{

DATA=1; SCK=0; //Initial state

_nop_0;

SCK=1;

_nop_0;

DATA=0;

_nop_0;

SCK=0;

_nop_O:_nop_O:_nop_O;

SCK=1;

_nop_0;

DATA=1;

_nop_0; /

SCK=0;

}

void s_connectionreset(void)

// communication reset: DATA-line=1 and at least 9 SCK cycles followed by transstart

// DATA:

// SCK:

{

uchar i;

DATA=1;SCK=0; //Anitial state

for(i=0;i<9;i++) //9 SCK cycles

{

SCK=1;

SCK=0;

}

s_transstart(O; //transmission start

}

char s_write_byte(uchar value)

// writes a byte on the Sensibus and checks the acknowledge

{

uchar i.error=0;

for (i=0x80;i>0;i/=2) //shift bit for masking

{

if (i & value) DATA=1; //masking value with i ,write to SENSI-BUS else DATA=0;

SCK=1; //clk for SENSI-BUS

_nop_0_nop_0:nop_O; //pulswith approx. 5 us

SCK=0;

}

DATA=1; //release DATA-line

SCK=1; //clk #9 for ack

error=DATA; //check ack (DATA will be pulled down by

DHT90),DATA在第9个上升沿将被DHT90自动下拉为低电平。_nop_0:_nop_O:_nop_0;

SCK=0;

DATA=1; //release DATA-line

return error; //error=1 in case of no acknowledge //返回:0成功,

1失败

}

char s_read_byte(uchar ack)

// reads a byte form the Sensibus and gives an acknowledge in case of "ack=1”1

{

uchar i,val=0;

DATA=1; //release DATA-line

for(i=0x80;i>0;i/=2) //shift bit for masking

{SCK=1; //clk for SENSI-BUS

if (DATA) val=(val li); //read bit

_nop_0:_nop_O_nop_O; //pulswith approx. 5 us

SCK=0;

}

if(ack==1)DATA=0; //in case of "ack==1" pull down DATA-Line

else DATA=1; //如果是校验(ack==0),读取完后结束通讯

_nop_0:_nop_0:_nop_0; //pulswith approx. 5 us

SCK=1; //clk #9 for ack

_nop_0:_nop_0:_nop_O; //pulswith approx. 5 us

SCK=0;

_nop_0_nop_O:_nop_O; //pulswith approx. 5 us

DATA=1; //release DATA-line

return val;

}

char s_measure(uchar *p_value, uchar *p_checksum, uchar mode)

// makes a measurement (humidity/temperature) with checksum

{

unsigned error=0;

unsigned int i;

s_transstartO; //transmission start

switch(mode)( //send command to sensor

case TEMP :error+=s_write_byte(MEASURE_TEMP);break;

case HUMI :error+=s_write_byte(MEASURE_HUMI);break;

default : break;

}

for (i=0;i<65535;i++) if(DATA==0) break; //wait until sensor has finished the measurement

if(DATA) error+=1; // or timeout (~2 sec.) is reached

*(p_value) =s_read_byte(ACK); //read the first byte (MSB)

*(p_value+1)=s_read_byte(ACK)://read the second byte (LSB)

*p_checksum =s_read_byte(noACK); //read checksum

return error;

}

void calc_dht90(float *p_humidity ,float *p_temperature)

// calculates temperature [C] and humidity [%RH]

// input: humi [Ticks] (12 bit)

temp [Ticks] (14 bit)

// output:humi [%RH]

temp [C]

{ const float C1=-4.0; // for 12 Bit

const float C2=+0.0405; // for 12 Bit

const float C3=-0.0000028; // for 12 Bit

const float T1=+0.01; // for 14 Bit @ 5V

const float T2=+0.00008; // for 14 Bit @ 5V

float rh=*p_humidity; // th: Humidity [Ticks] 12 Bit

float t=*p_temperature; //t: Temperature [Ticks] 14 Bit

float rh_lin; // rh_lin: Humidity linear

float rh_true; // rh_true: Temperature compensated humidity

float t_C; //_C : Temperature [C]

LC=t*0.01 - 40; //calc. temperature from ticks to [C]

rh_lin=C3*rh*rh + C2*rh + C1; //cale. humidity from ticks to [%RH]

rh_true=(t_C-25)*(T1+T2*rh)+rh_lin; //calc. temperature compensated humidity [%RH]

if(rh_true>100)rh_true=100; //cut

*p_temperature=L_C; //return temperature [C]

*p_humidity=rh_true; //return humidity[%RH]

}

void delayms(uchar count) //延时 count ms 子程序

{

ucharij;

do

{

for(i=5;i>0;i--)

for(j=98:j>0;j--);

}while(--count);

}

void keepoffwendu(uchar nowtem)

{

wendugao=nowtem/10;

wendudi=nowtem%10;

wendugao=wendugao+'0';

wendudi=wendudi+0';

}

void keepoffshidu(uchar nowtem)

{

shidugao=nowtem/10;

shidudi=nowtem%10;

shidugao=shidugao+'0;

shidudi=shidudi+'0';

}

void keepoffM(uchar nowtem)

{

Mgao=nowtem/10;

Mdi=nowtem%10;

Mgao=Mgao+'0;

Mdi=Mdi+'0;

}

void showwendu(uchar shi,uchar ge)

{

LcdResetO;

WriteString(0,0,"tem:");

WriteChar(6,0,shi);

WriteChar(7,0.ge);

WriteChar(9,0,C");

}

void showshidu(uchar shi,uchar ge)

{

LcdResetO;

WriteString(0.0,"wet:");

WriteChar(6,0,shi);

WriteChar(7,0.ge);

WriteString(9,0,"%RH”);

}

void mainO

{

uchar M;

M=40;

s_connectionresetO; //

delayms(100);

while(1)

{

LcdResetO;

WriteString(0,0,"hello.");

if(tem==0)

{

TEM: while(1)

{

Get_TH0; //获得温度和湿度

keepoffwendu(wendu);

showwendu(wendugao,wendudi);

if(wet==0)

goto WET;

else if (set==0)

goto SET;

}

}

if(wet==0)

{

WET: while(1)

Get_THO; 1/获得温度和湿度

keepoffshidu(shidu);

showshidu(shidugao,shidudi);

if(tem==0)

goto TEM;

else if (set==0)

goto SET;

}

}

if(set==0)

{

while(1)

SET: while(1)

{

keepoffM(M);

showshidu(Mgao,Mdi);

if(add==0)

M=M+1;

else if (sub==0)

M=M-1;

else if (tem==0)

goto TEM;

else if (wet==0)

goto WET;

}

}

9. 结论

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

参考文献

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/170286.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux shell编程学习笔记28:脚本调试 set命令

0 引入 在Linux Shell 脚本编程的过程中&#xff0c;编写简单功能的脚本&#xff0c;代码不多&#xff0c;一般阅读起来没什么难度&#xff0c;有问题也比较有查出原因和修正。但是当脚本要实现的功能较多&#xff0c;代码变得较为复杂时&#xff0c;阅读起来就不那么容易看明…

Bean实例化的基本流程

Spring容器在进行初始化时&#xff0c;会将xml配置的<bean>的信息封装成一个BeanDefintion对象&#xff0c;所有的BeanDefintion存储到BeanDefintionMap的Map集合中去&#xff0c;Spring框架对该Map进行遍历&#xff0c;使用反射创建Bean实例对象&#xff0c;创建好的Bea…

以“防方视角”观Shiro反序列化漏洞

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 案例概述02 攻击路径03 防方思路 01 案例概述 这篇文章来自微信公众号“潇湘信安”&#xff0c;记录的某师傅如何发现、利用Shiro反序列化漏洞&#xff0c;又是怎样绕过火绒安全防护实现文件落地、…

Leetcode刷题详解——删除并获得点数

1. 题目链接&#xff1a;740. 删除并获得点数 2. 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;你可以对它进行一些操作。 每次操作中&#xff0c;选择任意一个 nums[i] &#xff0c;删除它并获得 nums[i] 的点数。之后&#xff0c;你必须删除 所有 等于 nums[i] …

github 开源whisper ros llm

GitHub - openai/whisper: Robust Speech Recognition via Large-Scale Weak Supervision openai whisper ROS LLM https://github.com/Auromix/ROS-LLM/tree/ros2-humble/llm_input

Pandas数据集的合并与连接merge()方法_Python数据分析与可视化

数据集的合并与连接 merge()解析merge()的主要参数 merge()解析 merge()可根据一个或者多个键将不同的DataFrame连接在一起&#xff0c;类似于SQL数据库中的合并操作。 数据连接的类型 一对一的连接&#xff1a; df1 pd.DataFrame({employee: [Bob, Jake, Lisa, Sue], grou…

Vue移动 HTML 元素到指定位置 teleport 标签

teleport 标签&#xff1a;用于将组件中的 HTML 元素移动到任意的位置。 使用 teleport 标签移动 HTML 元素&#xff1a; <!-- 将 teleport 中的内容移动到 body 标签中 --> <teleport to"body"><div><h3>我是第三层组件的标题</h3>…

【练习】检测U盘并自动复制内容到电脑的软件

软件作用&#xff1a; 有U盘插在电脑上后&#xff0c;程序会检测到U盘的路径。 自己可以提前设置一个保存复制文件的路径或者使用为默认保存的复制路径&#xff08;默认为桌面&#xff0c;可自行修改&#xff09;。 检测到U盘后程序就会把U盘的文件复制到电脑对应的…

初刷leetcode题目(5)——数据结构与算法

&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️Take your time ! &#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️…

如何使用http来获取thingsbord中的设备数据

背景 有个读者问我,他想做tb的二次开发,想要通过一个接口来查询设备的遥测数据。 于是我给他写了这篇文章。 具体实现 由于他使用的是cloud版本,于是我使用cloud来做演示 文档的接口 https://thingsboard.cloud/swagger-ui/#/telemetry-controller/getTimeseriesUsing…

day15-Linux对文件系统的支持

1.Linux中使用文件系统分几个部分 1.1 有关于Linux中高速缓冲区的管理程序。 分页机制 buffer.c 1.2 文件系统的底层通用函数(对于硬盘的读写 分配 释放等&#xff0c;对于目录的节点管理 inode 内存与磁盘的映射) 1.3 对文件数据进行读写操作模块 (VFS&#xff1a;虚拟文件系统…

数据结构:枚举

概念 枚举主要用途是&#xff1a;将一组常量组织起来&#xff0c;在这之前表示一组常量通常使用定义常量的方式&#xff1a; 比如下面的例子&#xff1a; public static final int RED 1; public static final int GREEN 2; public static final int BLACK 3; 利用常量…

Re50:读论文 Large Language Models Struggle to Learn Long-Tail Knowledge

诸神缄默不语-个人CSDN博文目录 诸神缄默不语的论文阅读笔记和分类 论文名称&#xff1a;Large Language Models Struggle to Learn Long-Tail Knowledge ArXiv网址&#xff1a;https://arxiv.org/abs/2211.08411 官方GitHub项目&#xff08;代码和实体&#xff09;&#xf…

python note

Python 基本操作 &#xff08;赋值、分支及循环语句、使用 import 导入库&#xff09;&#xff1b; Python 的 With 语句 &#xff1b; NumPy &#xff0c;Python 下常用的科学计算库。TensorFlow 与之结合紧密&#xff1b; 向量 和 矩阵 运算&#xff08;矩阵的加减法、矩阵…

基于安卓android微信小程序的好物分享系统

运行环境 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&a…

【数据结构】C语言实现带头双向循环链表万字详解(附完整运行代码)

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 一.了解项目功能 在本次项目中我们的目标是实现一个带头双向循环链表: 该带头双向循环链表使用动态内存分配空间,可以用来存储任意数量的同类型数据. 带头双向循环链表结点(No…

全志H616开发版

开发板介绍&#xff1a; 二、开发板刷机 SDFormatter TF卡的格式化工具、Win32Diskimager 刷机工具 刷机镜像为&#xff1a;Orangepizero2_2.2.0_ubuntu_bionic_desktop_linux4.9.170.img 使用MobaXterm_Personal_20.3连接使用 网络配置&#xff1a;nmcli dev wifi 命令接入网…

【机器学习】034_多层感知机Part.2_从零实现多层感知机

一、解决XOR问题 1. 回顾XOR问题&#xff1a; 如图&#xff0c;如何对XOR面进行分割以划分四个输入 对应的输出 呢&#xff1f; 思路&#xff1a;采用两个分类器分类&#xff0c;每次分出两个输入 &#xff0c;再借助这两个分类从而分出 。 即采用同或运算&#xff0c;当两…

Redis轻松添加从节点:零阻塞、零烦恼,系统性能再飙升

点击上方蓝字关注我 生成环境的Redis有时需要替换或添加从节点&#xff0c;如果此时主库较大&#xff0c;添加从节点时将可能因为主节点在做bgsave数据备份时使得主库压力大&#xff0c;从而引起其他操作变慢&#xff0c;进而出现阻塞等操作。那么有什么方法可以尽最大程度地减…

C语言中的指针(上)

目录 一、基本概念 1.变量的存储空间 2.定义指针 3.引用与解引用 二、指针的算术运算、类型以及通用指针 1.指针的算数运算 2.指针类型以及通用型指针 三、指向指针的指针&#xff08;pointers to pointers&#xff09; 四、函数传值以及传引用 1.局部变量 2.从存储地…