原帖。感谢
https://www.arduino.cn/thread-48849-1-1.html
智能花盆
项目简介:
1、远程浇水2、远程补光
3、远程赏花
4、平台实时采集环境数据
5、语音自我介绍
6、APP实时观察状况
以下为更新项目内容
摘要
随着社会的进步,人民生活水平的提高,越来越多的人喜欢养花来装饰室内、陶冶情操,另外也是由于环境污染不得不养植物净化空气。但经常由于工作繁忙或在外出差而忘记照料植物。或是对植物的习性不了解养不活植物。不管因为什么原因,都是因为养花者与盆栽里的植物缺少“交流”。而随着科技的发展,“智能”一词进入了我们的视野,智能盆栽拉近了人与盆栽的距离。
从当前社会的需求出发设计了智能花盆系统。该设备主要由信息传感模块、显示模块、语音模块、远程视频监控、无线通信模块、储存模块组成。通过感知设备与语音交互实现互动式养花,通过云服务进行远程查看花生长、浇水、光照,为用户解决了上班忙无时间照料植物、出差担心家中植物的问题,此作品成本低,市场同类产品少、有极大的市场竞争力和很好的经济价值。
智能花盆系统的设计在于创新理念与设计实践的结合,一方面,解决不会养花的问题,养花系统利用温湿度传感器、光照传感器、土壤湿度传感器等获取植物土壤的水份、光照情况经过MCU的处理实现自动浇水、自动光照和远程赏花。另一方面,生活的快节奏化,让我们没时间养花,但又希望享受绿意,养花系统通过我们日常不离手的手机将虚拟与现实结合。通过WiFi将植物信息发送到手机APP上,用户不仅手指一点就可随时随地了解植物最新信息。而且在现实生活中感受到植物带给我们的好处,一份绿色,一份健康。同时,你也可以打开手机界面的花友圈,找一群志同道合的花友们讨论养花之道,系统也会实时推送最新养花技巧。
随着现代化科技的发展,该项目的前景广阔,养花系统还可以应用到市政园林上,对城市环境进行保护。
功能特色
自助养花系统的技术属于自主研发,主要由上位机、下位机和云服务终端组成
![](https://www.arduino.cn/data/attachment/forum/201710/02/211722e3g7nlgh74qgphf4.png)
本系统硬件部分采用arduino单片机为处理器,控制各模块之间的衔接。通过感知层的数据采集,传入主控芯片进行处理后;网络层利用WIFI无线通信,将数据传输到云平台;在应用层的智能终端设备上显示所有数据。各个传感器来采集温湿度等相关数据,处理器会将花的数据记录并存储,并通过通信模块(WiFi传感单元)将数据上传到云平台分析出植物所差的养分,平台上就能操作电子阀泵控来自动浇水、添加营养液。这样无论你在何处,都不用担心自己的花没浇水,随时随地、想看就看、一键操作。
作品展示
![](https://www.arduino.cn/data/attachment/forum/201710/02/212128xmpooos2e3ml93ol.jpg)
所需硬件:远程监控视频传感器,arduino语音模块,IIC1602,光照传感器GY-30,WiFi模块8266,灯泡,湿度传感器,DHT11温湿度模块,电源模块,其他耗材(水管,喷头,花盆,洞洞板,导线......)等。
硬件组成
“智能花盆系统”。温度传感器、湿度传感器、光强传感器组成传感模块,这些模块一起作输入;输出由无线传感模块、语音模块、显示模块、自动控制模块组成。首先是输入端采集信号给单片机,单片机在对采集到的数据进行分析处理;然后在显示模块上进行数据显示,语音模块主要是用来播报天气预报,温度、湿度、光照等信息;再通过WIFI模块将数据传输到云服务,那么在终端上就能查看数据,了解到植物的生长情况;最后在终端设备进行所需操作,如:补光、浇水、拍照等。其整个硬件结构如图所示:
![](https://www.arduino.cn/data/attachment/forum/201710/02/213303mlnrrryrnelelr3n.png)
硬件部分
首先是通过对控制模块、传感器模块的检测给单片机输入信号,单片机在对采集到的数据进行分析处理,通过蓝牙/WIFI模块将数据传输到后台数据库,可以在终端上查看数据,了解到植物的生长情况;然后输出相应的控制信号对语音模块控制,语音模块主要是用来播报天气预报,温度、湿度、光照等。
由电源、光照传感器、温度传感器、湿度传感器、水泵电子阀、摄像头、WIFI模块七大部分为单片机(CPU)服务,共同构成智慧花盆的硬件,来实现远程访问,自动控制浇水、拍照,并将数据传输到后台,通过终端查看。硬件组成框图如下图所示:
![](https://www.arduino.cn/data/attachment/forum/201710/02/213623rlx8alil3bpl0l0k.png)
花盆整个主控部分
![](https://www.arduino.cn/data/attachment/forum/201710/02/215048cjls5t54a5wh00wy.jpg)
语音控制部分
![](https://www.arduino.cn/data/attachment/forum/201710/02/215119ymcyjg10qgg6rpc7.jpg)![](https://www.arduino.cn/data/attachment/forum/201710/02/215120ocxnu2nnex7mhx2h.jpg)
显示部分
![](https://www.arduino.cn/data/attachment/forum/201710/02/215121inw9zhk49k4coc0f.jpg)
远程监控部分
![](https://www.arduino.cn/data/attachment/forum/201710/02/215125x9q48da44kddkevd.jpg)
土壤传感器部分
![](https://www.arduino.cn/data/attachment/forum/201710/02/215122h6qxfhddl2kfd60h.jpg)
光照传感器部分
![](https://www.arduino.cn/data/attachment/forum/201710/02/215429l9z2le5dxxfmuxy9.jpg)
补光部分
![](https://www.arduino.cn/data/attachment/forum/201710/02/215432hns86ew0ns90n2z4.jpg)
软件架构
软件系统主要包括主程序、Web程序、中断控制程序。在云服务系统中,会将设备域(智能花盆)检测数据和控制参数上传到平台域,平台会进行数据分析及处理、事件告警,之后在应用层的终端设备查看养花信息,也能进行相应的操作。云服务结构如图所示
![](https://www.arduino.cn/data/attachment/forum/201710/02/213928d0yr3qenjzqfjhqm.png)
作品成本
该作品成本低,只要是采购一些硬件设备,其他都是团队成员一手设计。采购清单如下表:
序号 名称单价(元)数量总价(元)1led小射灯184722继电器3.3516.53光照传感器6.2212.44土壤传感器2.36511.85WIFI模块12.3336.96语音模块541547水泵271278花盆15.8115.89温湿度传感器模块4.314.310漫反射红外模块15.45230.911arduino开发板2511251 12 视频传感器1201120
传统花卉产业与互联网融合是一个良好的机遇和更是一个花卉产业转型升级的好开头,实践过程中虽然会有专业、技术、经验等方面的不足,但经过不断的学习和团队间的互助将养花系统一步步完善。“传统植物花卉产业”+“技术”+“互联网”之间的结合,在未来发展空间非常大,必将成为未来市场、社会的大势所趋,也将代替传统花卉产业中的不足,提升我国经济和国民经济。
展望
智能养花系统,将来发展方向如下:
1.小型化
体积小型化,带来用户方便快捷。
2.便宜化
降低成本,提高精度,增加用户数量。
3.智能化
增加更多的高级功能,如:APP、健全语音库。
4.全面化
推广用户:花店、花卉市场、种植基地。
5.专用化
设置专用的系统,提高精度,保护珍稀灭绝植物(如:金花葵,华山新麦草),实时监测它的生长。
~~~
软件代码部分
软件部分分为联网部分,数据上传部分,接收命令控制和数据读取部分
\[kenrobot\_code\]8266AT指令部分
while (!doCmdOk("AT", "OK"));
digitalWrite(8, HIGH); // 使Led亮
while (!doCmdOk("AT+CWMODE=3", "OK")); //工作模式
while (!doCmdOk("AT+CWJAP=\\"MyI9023\\",\\"wds109609\\"", "OK"));
while (!doCmdOk("AT+CIPSTART=\\"TCP\\",\\"183.230.40.39\\",876", "CONNECT"));
while (!doCmdOk("AT+CIPMODE=1", "OK")); //透传模式
while (!doCmdOk("AT+CIPSEND", ">")); //开始发送
/\* EDP 连接 \*/
if (!edp\_connect)
{
while (WIFI\_UART.available()) WIFI\_UART.read(); //清空串口接收缓存
packetSend(packetConnect(ID, KEY)); //发送EPD连接包
while (!WIFI\_UART.available()); //等待EDP连接应答
if ((tmp = WIFI\_UART.readBytes(rcv\_pkt.data, sizeof(rcv\_pkt.data))) > 0 )
{
rcvDebug(rcv\_pkt.data, tmp);
if (rcv\_pkt.data\[0\] == 0x20 && rcv\_pkt.data\[2\] == 0x00 && rcv\_pkt.data\[3\] == 0x00)
{
edp\_connect = 1;
DBG\_UART.println("EDP connected.");
}
else
DBG\_UART.println("EDP connect error.");
}
packetClear(&rcv\_pkt);
}
数据上传部分
//光照
liggger = readGZ(lig);
if (edp\_connect && liggger)
{
DBG\_UART.print("guang: ");
DBG\_UART.println(lig);
packetSend(packetDataSaveTrans(PUSH\_ID, "HIG", lig)); //发送数据存储包
digitalWrite(8, HIGH);
delay(100);
digitalWrite(8, LOW);
}
接收命令部分
while (WIFI\_UART.available())
{
readEdpPkt(&rcv\_pkt);
if (isEdpPkt(&rcv\_pkt))
{
pkt\_type = rcv\_pkt.data\[0\];
switch (pkt\_type)
{
case CMDREQ:
char edp\_command\[50\];
char edp\_cmd\_id\[40\];
long id\_len, cmd\_len, rm\_len;
char datastr\[20\];
char val\[10\];
memset(edp\_command, 0, sizeof(edp\_command));
memset(edp\_cmd\_id, 0, sizeof(edp\_cmd\_id));
edpCommandReqParse(&rcv\_pkt, edp\_cmd\_id, edp\_command, &rm\_len, &id\_len, &cmd\_len);
DBG\_UART.print("rm\_len: ");
DBG\_UART.println(rm\_len, DEC);
delay(10);
DBG\_UART.print("id\_len: ");
DBG\_UART.println(id\_len, DEC);
delay(10);
DBG\_UART.print("cmd\_len: ");
DBG\_UART.println(cmd\_len, DEC);
delay(10);
DBG\_UART.print("id: ");
DBG\_UART.println(edp\_cmd\_id);
delay(10);
DBG\_UART.print("cmd: ");
DBG\_UART.println(edp\_command);
//数据处理与应用中EDP命令内容对应
//本例中格式为 shuju:{V}
sscanf(edp\_command, "%\[^:\]:%s", datastr, val);
//光照开关
if (atoi(val) == 1)
digitalWrite(6, HIGH);
if (atoi(val) == 11)
digitalWrite(6, LOW);
//浇水系统
if (atoi(val) == 2)
digitalWrite(7, HIGH);
if (atoi(val) == 22)
digitalWrite(7, LOW);
packetSend(packetDataSaveTrans(NULL, datastr, val)); //将新数据值上传至数据流
break;
default:
DBG\_UART.print("unknown type: ");
DBG\_UART.println(pkt\_type, HEX);
break;
}
}
传感器数据读取
bool temperature(char \*hum)
{
int i, sun\_val, val = 0;
for (i = 0; i <= 10; i++)
{
sun\_val += analogRead(A2);
}
val = map(sun\_val / 10, 0, 1023, 0, 99);
delay(1000);
lcd.setCursor(0, 0); //设置显示指针
lcd.print("SH:"); //输出字符到LCD1602上
lcd.print(val);
lcd.setCursor(5, 0);
lcd.print("rh");
delay(100);
sprintf(hum, "%d", val);
}\[/kenrobot\_code\]
~~~
最后,作品的全部质料我将全部上传,视频质料一并上传!