电源设计技术信息网站

订阅电子杂志   English   繁體中文   日本語   한국어

下载中心

TECH INFOArduino入门指南

利用Arduino Create和ROHM传感器评估套件制作智能花园系统

这篇文章来源于DevicePlus.com英语网站的翻译稿。

smart garden

今天,我们将利用ROHM传感器评估套件打造一套智能花园系统。在此项目中,我们整合接近/环境光传感器(ALS)和其他传感器,实现植物培育设备的自动化操作!

有关ROHM传感器的更多信息,请参阅我们的文章ROHM传感器评估套件概览!

此外,我们将使用Arduino Create对系统进行编程。

Arduino Create是一个多合一的在线平台,可以编写代码、配置电路板、共享项目。该平台于2016年8月18日正式发布。

smart garden

Arduino Create 提供以下服务:

Arduino Web Editor

Arduino Web Editor 是一款在线编辑器,用户可以编写代码并将程序从网页浏览器上传至任何Arduino开发板上。

  • 将代码写入或导入 Arduino
  • 上传/分享程序
  • 使用Arduino库
  • 通过云连接服务

Arduino Project Hub

Arduino Project Hub 是一个hackstar.io提供的教程平台。该Hub拥有大量不同难度和人气的项目。

Arduino Cloud

凭借Arduino Cloud,用户可以通过互联网在云中管理项目。Arduino Cloud执行亚马逊的云计算服务,能够为用户提供安全的开发环境。

  • 将Arduino直接连接到互联网
  • 通过MQTT在Arduino之间进行互通
  • 采用AWS IoT和AWS Lambda

 

今天的电子食谱

预计完成时间:120分钟

所需部件:

※ 您可以从以下站点购买罗姆传感器评估套件!

Chip One Stop

Mouser Electronics

 

考虑植物培育设备的电气规格

打造智能花园系统的第一步就是要确定需要集成的内容。我们如何使用这些传感器打造一套有利于植物培育的设备呢?首先,我们看一下各种传感器的功能和用法以及它们在该项目中的潜在用途。

传感器评估套件提供8种不同的传感器。我们应将哪些传感器集成到植物培育系统中呢?我们来复习一下每个传感器的功能,看看系统可以采用哪些传感器。

smart garden

图1 传感器评估套件包含的传感器

  • 加速度计: 检测倾斜、运动、振动等。→我们可能不会用此器件来测量加速度。
  • 气压传感器:检测大气压力→压力与天气之间的关系似乎与室内植物没有关系
  • 地磁传感器:检测方向→可以根据太阳的方向改变植物的朝向吗(?)
  • 接近传感器:检测正在接近的物体;检测亮度→如果我们的系统只是在白天(或明亮时)而不是在黑暗中工作,那么这个器件很有用。
  • 颜色传感器:检测颜色→叶子是否枯萎,等等……我们以后再研究这个功能吧……
  • 霍尔传感器:通过磁铁检测物体→我觉得这个项目可能不会使用接近开关或定位功能…
  • 温度传感器:检测温度→我们可以用温度数据来控制植物的浇水情况(比如温度较高时应该多浇水,等等)。
  • 紫外线传感器:检测紫外线→日光太强/太弱时可通知用户相关情况。

 

根据各个传感器的功能简述,为了完成此项目,我们可能需要在系统中整合多个传感器。那么我们应该集成哪些传感器呢?

smart garden

图2 一般植物生长注意事项

如图2所示,种植健康的植物必须满足一定条件。一般来讲,植物在通风良好、阳光充足和温度适中的地方生长最好。当然,它们需要水。

根据这些信息,我们可以缩小传感器的选择范围:

  • 日光条件→利用紫外线传感器和温度传感器检查温度是否过高/紫外线强度是否过大,并采取必要的措施以减少日光照射。
  • 浇水原则→利用土壤传感器,我们可以确定土壤中的水分含量,并根据盆的大小为植物浇水。
  • 关于温度→如果温度过高或过低,我们可以检查植物含量并触发警报。
  • 通风→我们可以测量室内空气流速,如果室内风量不够,我们可以用风扇来产生风。

现在,我们开始构造这个系统吧!

类似的设备……

说到植物培育设备……已经有人制作过大型植物培育系统。比如FarmBot。从外观上看,FarmBot就像是一台巨大的激光切割机或3D打印机。正如下面的视频所示,该机器还可以帮忙播种,似乎我们通过电脑或移动应用程序就能控制播种过程。长时间在室外管理和控制这些设备会比较困难,尤其是在天气比较恶劣的情况下。不管怎样,这些非常酷的设备在改善可持续发展农业领域具有巨大的潜力。

FARMBOT GENESIS – https://farmbot.io/

 

Arduino Create × Rohm 传感器评估套件!

接下来我们看一下如何用Arduino Create编写程序。

smart garden

图3 Arduino Create

Arduino Create 网站

Arduino Create 入门

我们循序渐进地看一下Arduino Create如何使用。Arduino Create的迷人之处就在于您可以直接在浏览器中在线编写代码并进行共享(比如在社交媒体上)。通常,如果您要使用Arduino,您得在电脑上下载并安装Arduino IDE,但是Arduino Create无需这个步骤。

 

  1. 打开浏览器,然后转到Arduino Create 网站
  2. 如果您是首次使用Arduino,那么必须创建一个用户帐户。请进入用户注册页面以创建您的帐户(如果您有Arduino帐户,那么可以直接用现有帐户登录)。
  3. (仅适用于初次使用的用户)完成注册后,您会收到一封包含一个URL的电子邮件,点击该链接完成注册。
  4. (仅适用于初次使用的用户)安装“Arduino Web Editor Plugin”(或“ArduinoCreateAgent”),以便浏览器可以连接到Arduino主机。
  5. 打开Arduino Web Editor

 

PC版和网络版之间的主要区别是什么呢?

  • 只要可以上网,您几乎能在任何地方查看/编辑您的程序。
  • 网络版还支持多个库,因此即使更换电脑,您也不必重新安装原来使用的库。

Arduino Create非常有用。唯一的缺点是:要使用Web Editor,您必须连接互联网,否则是无法使用的。我觉得介绍的差不多了。此时,您可以简单地在电脑上使用现有的Arduino软件。

运行Arduino Create主屏幕和传感器评估套件库

首先打开Arduino Web Editor.

smart garden

图 4. Arduino Create Web Editor

您会看到编辑器在浏览器中打开。值得一提的是,与Arduino Software IDE相比,这些菜单更易于查看和定位。有时,在电脑上使用IDE并打开太多带有很多程序的窗口时,它们会变得杂乱无章;但是这个编辑器的窗口整洁有序,您可以轻松地找到所需文件。

菜单栏位于编辑器的左侧。

smart garden

图5 Arduino Create Web Editor – 基本功能

我们来查看一些常用功能。我们从“Blink.ino”开始(路径:Examples →BUILT IN→01.BASICS→Blink)。使用屏幕上方中央的下拉菜单,选择要连接的Arduino开发板和端口。然后,点击“Verify”→“Upload”(通常在Arduino软件中执行此操作)。

 

 

 

添加传感器评估套件库

接下来,我们将添加传感器评估套件库。要添加库,您可以点击左侧菜单的“Libraries”,并单击“ADD ZIP LIBRARY”。然后,选择要添加的库的zip文件完成添加。您可以从此处为每个传感器下载传感器评估套件库(zip文件)。

smart garden

图6 Arduino Create Web Editor – 添加库

 

传感器评估套件已成功连接。现在,我们进行连线和编程!

整个系统的设计理念如下:

  • 日光条件→利用紫外线传感器和温度传感器检查温度是否过高/紫外线强度是否过大,并采取必要的措施以减少日光照射。

用伺服电机遮阳!

  • 浇水原则→利用土壤传感器,我们可以确定土壤中的水分含量,并根据盆的大小为植物浇水。

使用土壤传感器和喷壶!

  • 关于温度→如果温度过高或过低,我们可以检测植物的环境温度并触发警报。

用LED触发警报!(也许将来我们可以通过网络通知程序来实现这个功能!)

  • 通风→我们可以测量室内空气流速,如果室内风量不够,我们可以用扇子来产生风。

用伺服电机操作扇子扇风。

smart garden

图7 电路框图(假设传感器评估套件已连接到Arduino)

至于程序,在循环的前半部分获取每个传感器的值后,我们将根据每个传感器的值启动伺服电机和LED灯。由于每个传感器的激活阈值因设备大小而异,因此您可以自己的喜好调整具体数值。

 

程序–植物培育设备

#include <Wire.h>
#include <Servo.h>
#include <RPR-0521RS.h>
#include <BD1020.h>
#include <ML8511A.h>
#include <BM1383GLV.h>
 
//***********************************************
//Set threshold
//***********************************************
int moi_threshold   = 500;  //set the moisture threshold (moist←0~1023→dry)
int upper_temp_threshold  = 30;   //high temperature-red LED 
int under_temp_threshold  = 10;   //low temperature-blue LED
int uv_threshold  = 4;   //set the intensity of ultraviolet light, shade if exceeded
int send_wind_sec  = 30; //wind blowing interval (in seconds)
//***********************************************
 
Servo uvServo;          	
Servo windServo;          	
Servo waterServo;          	
 
int redLedPin   = 13;   	
int blueLedPin   = 12;
int moisture_pin = A0;
int tempout_pin = A2;
int uvout_pin = A0;
 
int counter = 0;
bool uvFlg = false;
 
BD1020 bd1020;
RPR0521RS rpr0521rs;
ML8511A ml8511a;
BM1383GLV bm1383;
 
//***********************************************************
void setup() {
  Serial.begin(9600);
  while (!Serial);
  Wire.begin();
 
  byte rc; 
  rc = rpr0521rs.init();
  rc = bm1383.init();
 
  pinMode(redLedPin,OUTPUT);
  pinMode(blueLedPin,OUTPUT);
  uvServo.attach(9);
  windServo.attach(10);
  waterServo.attach(11);
  bd1020.init(tempout_pin);
  ml8511a.init(uvout_pin);
}
 
//***********************************************************
void loop() {
    //*********************************
    //Soil Sensor
    int moi = analogRead(moisture_pin);
    Serial.write("MOISTURE = ");
    Serial.println(moi);
    Serial.println();
    
    //*********************************
    //Temperature sensor
    float temp;
    bd1020.get_val(&temp);
    Serial.print("BD1020HFV Temp=");
    Serial.print(temp);
    Serial.print("  [degrees Celsius], ADC=");
    Serial.println(bd1020.temp_adc);
 
    //*********************************
    //UV sensor
    float uv;
    ml8511a.get_val(&uv);	
    Serial.write("ML8511A UV = ");
    Serial.print(uv);
    Serial.println(" [mW/cm2]");
    Serial.println();	
 
    //*********************************
    //Barometric pressure sensor
    byte cp;
    float press;
     
    cp = bm1383.get_val(&press);
    if (cp == 0) {
      Serial.write("BM1383GLV (PRESS) = ");
      Serial.print(press);
      Serial.println(" [hPa]");
      Serial.println();
    }
     
    //*********************************
    //ALS/proximity sensor
    byte rc;
    unsigned short ps_val;
    float als_val;
    byte near_far;
     
    rc = rpr0521rs.get_psalsval(&ps_val, &als_val);
    if (rc == 0) {
      Serial.print(F("RPR-0521RS (Proximity) 	= "));
      Serial.print(ps_val);
      Serial.print(F(" [count]"));
      near_far = rpr0521rs.check_near_far(ps_val);
      if (near_far == RPR0521RS_NEAR_VAL) {
        Serial.println(F(" Near"));
      } else {
        Serial.println(F(" Far"));
      }
       
      if (als_val != RPR0521RS_ERROR) {
        Serial.print(F("RPR-0521RS (Ambient Light) = "));
        Serial.print(als_val);
        Serial.println(F(" [lx]"));
        Serial.println();
      }
    }
 
    //***********************************
    //depending on the sensor value each time
 
    //the water level will rise when the soil dries
    if(moi > moi_threshold){
      Serial.println("Water Servo start.");
      for(int m=0;m < 10;m++){ waterServo.write(0); //move servomotor to 0 degree
            delay(1500); //wait 1.5 seconds
            waterServo.write(90); //move the servomotor to 90 degrees
      }
    } //Temperature   activate
    if(upper_temp_threshold > temp){
      digitalWrite(redLedPin, HIGH);  //turn on LED
      delay(moi);                 	//set the moisture to LED flashing time 
      digitalWrite(redLedPin, LOW);   //turn off LED
    }
    if(under_temp_threshold < temp){
      digitalWrite(blueLedPin, HIGH);  //turn on LED
      delay(moi);                 	//set the moisture to LED flashing time 
      digitalWrite(blueLedPin, LOW);   //turn off LED
    }
 
    //shades when the sunlight is too strong
    if(uv < uv_threshold && !uvFlg){
        waterServo.write(90);
        uvFlg = true;
    }
    else if(uv >= uv_threshold && uvFlg){
        waterServo.write(0);	
        uvFlg = false;
    }
 
    //create wind  at a specific time
    if(counter > send_wind_sec){
      Serial.println("Wind Servo start.");
      for(int n=0;n < 10;n++){
        waterServo.write(0);
        delay(1000);    	
        waterServo.write(90);
      }
      counter = 0;
    }
 
    counter++;
    delay(1000);
}

 

组装植物培育系统!

现在,接线和编程已经完成,我们来把系统组合在一起。

smart garden

图8 迷你盆栽植物

首先,您需要一棵植物(当然)!

smart garden

图9 组装遮阳部件

当紫外线太强时,安装在伺服电机上的遮光板将旋转90度,从而挡住窗户上的阳光。

smart garden

图10 装有伺服电机的喷壶

我们可以根据湿度水平利用伺服电机拉动喷壶进行喷水。

我们的吹风设备是一把东方折扇!

smart garden

图11 组装完成的植物培育系统

整个系统仍有很大的改进空间。如果您想要科技感更高一些,您可以使用小型水泵、PC风扇等设备。此外,如果房间中没有窗户,那么可以同时利用LED与照度传感器,在房间变暗时关闭植物的LED。

总结

在本项目中,我们组合使用传感器评估套件中的多个传感器来打造智能花园系统。市面上已经出现了一些很酷的植物培育设备(教程中做了简要介绍),我相信本教程能够为开发更先进的植物培育设备奠定坚实的基础。

在下一个教程中,我们将更详细地介绍Arduino Create,并尝试使用传感器评估套件中的加速度计。

DevicePlus 编辑团队
DevicePlus 编辑团队

设备升级版适用于所有热爱电子和机电一体化的人。

分享到社交媒体