【DigiKey创意大赛】植物护理助手-Grove Arduino和Gravity WIFI module的结合
[复制链接]
- 方案名称:设计一个智能植物护理助手
去年在某个群里看到有人分享了Grove接口的Arduino初学者套件,其中的模块化设计让人印象非常深刻,稍微了解后发现,这种模块化设计对Arduino嵌入式初学者很友好,这次趁得捷电子的比赛,结合平时初步的学习和生活中养花种草的经验,给出了一个想法,就是题目中提到的对植物的生长环境进行监测,并且能远程查看的方法。
- 方案照片:
下图中是一个完整的实现方案,主要是Grove Arduino套件,因为套件中没有无线模块,额外配一块Gravity接口的模块,在图片中的右上角,用塑料螺丝锁在Grove Arduino套件上。通过杜邦线和套件相连接。
- 方案简介:
名为智能植物护理助手,利用Grove Arduino入门套件的传感器模块,为植物提供全方位的护理和监测。
通过模拟实时监测土壤湿度、温度、光照,并提供在线数据,以用于提醒用户浇水、调整光照等操作。
同时,能在线记录环境数据,以供用户种植做参考。
- 系统框图
下面是整个系统的功能框图,主要是套件中的ATmega CPU结合周边的传感器,以及显示屏和无线模块,另外通过板载的USB转UART进行程序下载和串口数据读取调试等功能,系统供电也是通过Micro-USB进行。
- 各部分功能的实现说明和解析
(功能一) 监测内容包括土壤湿度、温度、光照:
Grove Arduino入门套件中包含温湿度传感器模块(DHT20/BMP280-temp),光强度传感器模块(ADC端口的光传感器),使用这些传感器可以模拟采集温湿度和光照信息。
(功能二) LED显示检测内容
Grove Arduino入门套件中包含一块0.96寸的OLED,可以使用OLED显示监测的光照,温湿度数据。
(功能三) 需要联网远程看到传感器采集的信息,网页上查看监测的光照,温湿度数据。
这部分功能结合无线模块来使用,使用SIOT平台来收集无线模块的信息,并且SIOT平台提供自动刷新数据,并且保存数据的功能。
- 方案使用的源码及说明
这个方案中可以使用两种IDE来实现,其中Arduino IDE适配于数据采集和显示,Mind+ IDE适配于无线数据的传输。
1) 使用Arduino IDE来编译
当使用Arduino IDE时,适用于Grove套件中的传感器和OLED,比如先载入相关的库
#include "DHT20.h"
#include <Arduino.h>
#include <U8x8lib.h>
#include "Wire.h"
接下来初始化一些模拟端口
int sensorpin = A6; // Analog input pin that the sensor is attached to
int ledPin = 4; // LED port
int lightValue = 0; // value read from the port
DHT20 DHT;
U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(/* reset=*/ U8X8_PIN_NONE);
然后进行一些必要的设置,并且打开串口进行需要的信息输出
void setup()
{
pinMode(ledPin,OUTPUT); //Light
pinMode(sensorpin, INPUT);
DHT.begin();
Wire.setClock(400000);
Serial.begin(9600);
Serial.println(__FILE__);
Serial.print("DHT20 LIBRARY VERSION: ");
Serial.println(DHT20_LIB_VERSION);
Serial.println();
delay(2000);
Serial.println("Type,\tStatus,\tHumidity (%),\tTemperature (C)");
u8x8.begin();
u8x8.setPowerSave(0);
u8x8.setFlipMode(1);
}
逻辑设置,包括抓取数据,显示,以及设置灯光的触发条件等
void loop()
{
float temp, humi;
temp = DHT.getTemperature();
humi = DHT.getHumidity();
// read the Light sensor analog in value:
lightValue = analogRead(sensorpin);
Serial.println(lightValue);
if (lightValue > 1) {
digitalWrite(ledPin, LOW);
}
else {
digitalWrite(ledPin, HIGH);
}
delay(200);
if (millis() - DHT.lastRead() >= 1000)
{
// READ DATA
uint32_t start = micros();
int status = DHT.read();
uint32_t stop = micros();
switch (status)
{
case DHT20_OK:
Serial.print("OK,\t");
break;
case DHT20_ERROR_CHECKSUM:
Serial.print("Checksum error,\t");
break;
case DHT20_ERROR_CONNECT:
Serial.print("Connect error,\t");
break;
case DHT20_MISSING_BYTES:
Serial.print("Missing bytes,\t");
break;
default:
Serial.print("Unknown error,\t");
break;
}
// DISPLAY DATA, sensor has only one decimal.
Serial.print("DHT20, \t");
Serial.print(DHT.getHumidity(), 1);
Serial.print(",\t");
Serial.print(DHT.getTemperature(), 1);
Serial.print(",\t");
Serial.print(stop - start);
Serial.print("\n");
u8x8.setFont(u8x8_font_chroma48medium8_r);
u8x8.setCursor(0, 33);
u8x8.print("Temp: ");
u8x8.print(temp);
u8x8.print(" C");
u8x8.setCursor(0,50);
u8x8.print("Humi: ");
u8x8.print(humi);
u8x8.print(" %");
u8x8.setCursor(0,51);
u8x8.print("Light: ");
u8x8.print(lightValue);
u8x8.print(" lux");
u8x8.refreshDisplay();
delay(200);2
}
}
显示效果大致如下:
包含温湿度和亮度数据,以及当亮度过低时,自动打开灯。
2) 使用Mind+ IDE来编译
源程序后面加附件里面,下面截图简单说明:
首先初始化网络设置,接下来初始化传感器,读取传感器数据并且通过无线模块上传到MQTT服务器中。
这里的重难点在服务器的配置上,第一次会有些麻烦,试过两次后就熟悉了。
在SIOT网页中,可以查看各个传感器数据,并且可以图形化显示,可根据自己的需要和开发板之间接收发送数据,同时SIOT中会根据需求存储采集的数据。下面是一些采集数据的截图
首先是设备列表,这个可以在程序中设置
下面是BMP280采集的温度数据和图表,我会用手放传感器上演示温度波动
下面是DHT20采集的湿度和温度数据和图表,我会用手放传感器上演示温湿度波动,前两张是湿度,后两张是温度,温度变化慢一些,湿度变化明显一些。
下面是光亮度,这里通过遮盖来体现变化,所以遮盖后光亮度就是0
7. 证明作品能完成既定工作或功能的演示视频
演示的视频如下:前半部分是通过OLED显示温湿度和光照信息,后半部分是看SIOT网页远程的数据采集和数据存储情况。
8. 其他相关资料和说明:
资料中包含了套件的线路图,使用器件的SPEC,两种IDE的源代码,如果有问题,可以站内回帖,私信,或者B站留言私信都可以,初学的练手,让大家见笑了。
|