(超详细)Arduino实现光照、温度、湿度、二氧化碳等数据的蓝牙传输,并根据土壤湿度自动浇水

一. 目标实现功能

使用Arduino,收集光照、温度、空气湿度、CO2浓度等数据,并通过蓝牙传输至PC。同时,收集土壤湿度,并设定阈值使得硬件在土壤湿度过低时自动浇水。

最终成品演示视频参见:https://www.bilibili.com/video/BV1T44y167WE


二. 相关硬件模块以及连接方式

1. 主板(搭载MCU):Arduino UNO R3

在这里插入图片描述

2. 扩展板:Studio IOShield V3 (YwRobot)

在这里插入图片描述

3. 光照传感器:BH1750FVI

BH1750FVI共有5个接口,分别为VCC、SCL、DAT、GND、ADDR,其中ADDR不接,剩余接口分别与扩展板上的5V、SCL、SDA、GND相接。

可得,BH1750FVI使用I2C接口传输光照数据。

在这里插入图片描述

4. 温湿度传感器:DHT11

DHT11共有3个接口,分别为VCC、DAT、GND,其分别与扩展板上的5V、数字接口8、GND相接。

可得,DHT11使用Arduino数字接口(即扩展板上SVG区)传输温度和湿度数据。

在这里插入图片描述

5. CO2传感器:SPG30

SPG30共有4个接口,分别为VCC、GND、SCL、SDA,其分别与扩展板上的3.3V、GND、SCL、SDA相接。

可得,SPG30需要在3.3V电压下工作,且使用I2C接口传输TVOC、CO2、Raw H2、Raw Ethanol的浓度数据。

在这里插入图片描述

6. 土壤湿度传感器:Moisture Sensor (YwRobot)

该版本Moisture Sensor共有3个接口,分别为OUT、VCC、GND,其分别与扩展板上的模拟接口A0、5V、GND相接。

可得,Moisture Sensor使用Arduino模拟接口(即扩展板上GVS区)传输土壤湿度数据。当然,该数据无需显示,只需用来判断水泵是否需要启动。

在这里插入图片描述

7. 水泵驱动模块:Motor Driver Module T0 (YwRobot)

该版本Motor Driver Module共有3个接口,分别为IN、VCC、GND,其分别与扩展板上的数字接口6、5V、GND相接。

可得,可以通过在数字接口6写入的方式使得水泵驱动模块工作亦或暂停工作,从而控制水泵开关。需要注意的是,由于使用该控制方式,此驱动模块的模式选择应选择VCC而非VIN。

在这里插入图片描述

8. 直流水泵(YwRobot)

该版本直流水泵直接与水泵驱动模块V+及V-连接即可,同时出口端接入水管。将直流水泵置于水中,其在水泵驱动打开后会抽取其周边的水,并通过水管流出。

在这里插入图片描述

9. 状态显示灯:Traffic Light (YwRobot)

该版本Traffic Light共有4个接口,分别为GND、R、Y、G,其分别与扩展板上的GND、数字接口11、数字接口12、数字接口13相接。

其用于显示Arduino工作状态,红灯亮表示Arduino正在工作,黄灯亮表示缺水并正在浇水,绿灯亮表示不缺水。

在这里插入图片描述

10. 蓝牙模块:HC05

HC05共有6个接口,分别为KEY、VCC、GND、TXD、RXD、STATE,其中KEY、STATE不接,剩余接口分别与扩展板上的3.3V、GND、RX、TX相接。

可得,HC05需要在3.3V电压下工作,且应当其接口与TX、RX应反接(即RX接TX,TX接RX)。

若没有蓝牙模块,Arduino已经可以通过有线传输(USB接口)实现数据的串口传输(以本PC为例,此时端口为COM7)。当然如果接入蓝牙模块,Arduino可以实现无线数据传输,只需在PC端蓝牙设备选项找到相关设备(HC05设备名称的显示可以通过配套蓝牙修改助手),其连接的初始密码为1234(也可修改),连接后即可使用(以本PC为例,此时端口为COM10,有时也可能是COM9)。同时,它在完成连接前指示灯是处在快闪的状态,在完成连接后指示灯将慢闪。

在这里插入图片描述

11. 锂电池供电模块 14500 (YwRobot)

由于要使用蓝牙远程无线通信,Arduino的供电应由独立电源完成,该锂电池供电模块即可实现此目的。

在这里插入图片描述


三. 相关代码

使用的IDE:Arduino IDE

在以上模块连接完毕后,将如下代码烧录至Arduino中

#include <Wire.h>
#include "Adafruit_SGP30.h"
#include "DHT.h"

Adafruit_SGP30 sgp;

#define DHTPIN 8
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);

#define ADDRESS_BH1750FVI 0x23    //ADDR="L" for this module
#define ONE_TIME_H_RESOLUTION_MODE 0x20

byte highByte = 0;
byte lowByte = 0;
unsigned int sensorOut = 0;
unsigned int illuminance = 0;

#define LED_BUILTIN 6
int led1 = 11;
int led2 = 12;
int led3 = 13;


void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  Wire.begin();
  Serial.begin(9600);
  while (!Serial) {delay(10);} // Wait for serial console to open!
  digitalWrite(led1, HIGH);
  dht.begin();
  sgp.begin();
}


void loop() {
  Wire.beginTransmission(ADDRESS_BH1750FVI); //"notify" the matching device
  Wire.write(ONE_TIME_H_RESOLUTION_MODE);     //set operation mode
  Wire.endTransmission();
         
  delay(180);

  Wire.requestFrom(ADDRESS_BH1750FVI, 2); //ask Arduino to read back 2 bytes from the sensor
  highByte = Wire.read();  // get the high byte
  lowByte = Wire.read(); // get the low byte
     
  sensorOut = (highByte<<8)|lowByte;
  illuminance = sensorOut/1.2;
  
  //BH1750数据输出
//  Serial.print("Illum: ");
  Serial.print(illuminance); 
  Serial.print(" ");   
//  Serial.println(" lux");

  //DHT11数据输出
  float hum = dht.readHumidity();      //将湿度值赋给hum
//  Serial.print("Hum:");
  Serial.print(hum);
  Serial.print(" ");
//  Serial.print("%/t");
 
  float tem = dht.readTemperature();   //将湿度值赋给tem
//  Serial.print("    Temp:");
  Serial.print(tem);
  Serial.print(" ");
//  Serial.println("*C");

  sgp.IAQmeasure();
  //SGP30数据输出
//  Serial.print("TVOC "); 
  Serial.print(sgp.TVOC);
  Serial.print(" ");
//  Serial.print(" ppb\t");

//  Serial.print("eCO2 "); 
  Serial.print(sgp.eCO2);
  Serial.print(" ");
//  Serial.println(" ppm");

  sgp.IAQmeasureRaw();
//  Serial.print("Raw H2 "); 
  Serial.print(sgp.rawH2); 
  Serial.print(" ");
//  Serial.print(" \t");

//  Serial.print("Raw Ethanol "); 
  Serial.println(sgp.rawEthanol);  
//  Serial.println("");  

  int val;
  val=analogRead(0);   //传感器接于模拟口0

  if(val<100){  //湿度小于100开始浇水
    digitalWrite(led3, LOW);  //绿灯灭
    digitalWrite(led2, HIGH);  //黄灯亮
    digitalWrite(LED_BUILTIN,HIGH);
  }
  else{
    digitalWrite(led2, LOW);   //黄灯灭
    digitalWrite(led3, HIGH);   //绿灯亮
    digitalWrite(LED_BUILTIN,LOW);      
  }

  delay(1000);
}

使用Arduino IDE自带的串口监视器可得如下输出:

在这里插入图片描述

其中需要被GUI界面实时显示的是每一行的第1,2,3,5个数据,即光照(lux)、空气湿度(%)、温度(℃)、二氧化碳浓度(ppm)。

同时此时硬件部分可以根据土壤湿度自动转换状态显示灯的状态以及判断水泵是否需要工作。

  • 17
    点赞
  • 219
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
实现这个功能,需要以下步骤: 1. 购买土壤湿度传感器和ESP8266 WIFI模块。 2. 将土壤湿度传感器连接到Arduino的模拟输入引脚。 3. 将ESP8266 WIFI模块连接到Arduino的数字引脚,并使用软串口库将它与Arduino通信。 4. 在Arduino代码中,读取土壤湿度传感器的值,并将其转换为百分比。 5. 将湿度数据通过WIFI上传到Blinker App。可以使用Blinker库来实现这一点。 下面是一个简单的代码示例: ``` #include <SoftwareSerial.h> #include <Blinker.h> // Define the pins for the soil moisture sensor #define SOIL_MOISTURE_SENSOR_PIN A0 // Define the pins for the ESP8266 WIFI module #define RX_PIN 2 #define TX_PIN 3 // Define the WIFI credentials #define WIFI_SSID "your_wifi_ssid" #define WIFI_PASSWORD "your_wifi_password" // Define the Blinker credentials #define BLINKER_AUTHKEY "your_blinker_authkey" #define BLINKER_DEVID "your_blinker_devid" SoftwareSerial esp8266(RX_PIN, TX_PIN); BlinkerButton btn = BlinkerButton("btn"); void setup() { Serial.begin(9600); // Initialize the soil moisture sensor pin pinMode(SOIL_MOISTURE_SENSOR_PIN, INPUT); // Initialize the ESP8266 WIFI module esp8266.begin(9600); esp8266.println("AT+RST"); delay(1000); esp8266.println("AT+CWMODE=1"); esp8266.println("AT+CWJAP=\"" WIFI_SSID "\",\"" WIFI_PASSWORD "\""); delay(5000); // Initialize the Blinker library Blinker.begin(BLINKER_AUTHKEY, BLINKER_DEVID); Blinker.attachData("soil_moisture", getSoilMoisture); } void loop() { Blinker.run(); } int getSoilMoisture() { // Read the soil moisture sensor value and convert to percentage int sensorValue = analogRead(SOIL_MOISTURE_SENSOR_PIN); int percentage = map(sensorValue, 0, 1023, 0, 100); // Send the percentage value to Blinker return percentage; } ``` 在Blinker App中,创建一个新的设备,并将其与代码中定义的BLINKER_DEVID匹配。然后,将代码上传到Arduino板上,打开串口监视器,确认WIFI连接成功,并检查数据是否已成功上传到Blinker App。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ada’s bulldog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值