0 前言
🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。
为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是
🚩 毕业设计 单片机农业土壤酸度检测系统
🥇学长这里给一个题目综合评分(每项满分5分)
- 难度系数:3分
- 工作量:3分
- 创新点:3分
🧿 选题指导, 项目分享:
1 简介
本项目使用土壤酸碱度传感器(pH Sensor)和Arduino开发板制作自己的土壤酸度计,用于测量土壤的pH值。土壤可以是天然酸性或碱性的,可以通过测试其pH值来测量。土壤pH值是衡量土壤酸度或碱度的指标。
除了土壤pH值外,土壤中的氮、磷、钾、EC和盐度含量也对植物生长有用。对于NPK含量的测量,我们可以使用NPK Sensor。对于土壤电导率(EC)和盐度测量,我们可以使用土壤EC传感器,但与土壤NPK相比,土壤pH值是完全不同的因素。
在这文中,我们将了解土壤酸度传感器和Arduino的连接方法,并设计一款简易的Arduino土壤酸度计,并在0.96寸OLED显示屏上显示土壤pH值。
2 主要器件
- Arduino Nano开发板
- HONDETEC土壤pH传感器
- 0.96寸I2C OLED显示屏
- MAX485 Modbus模块
- 5V - 30V直流电源
- 连接跳线
- 面包板
3 实现效果
传感器稳定下来,就可以开始测试了。传感器暴露在空气中时的Ph值为7.0,可以在OLED显示屏上观察到
另外,将传感器放入不同的土壤样本中。您会看到pH值的变化取决于土壤的类型。 该值像模拟土壤酸度传感器一样增加或减少,也可以用作物联网土壤酸度传感器。
4 硬件设计
土壤酸碱度传感器
这是一款防水防尘的土壤pH传感器,可以测量从3到9的土壤pH值,精度高达±0.3PH。传感器具有IP68保护壳,采用高密度环氧树脂密封,可防止水分进入机身内部。该传感器适用于农业种植、工业生产、环境监测、畜牧业和污水处理。
土壤pH传感器有4个引脚,因为它需要连接到RS485模块。四种颜色的电线是黄色、蓝色、黑色和棕色。
该模块使用的通信协议是Modbus。设备作为从机设备工作,设备地址如下所示。您可以发送该指令或查询帧并读取设备地址0x01处的土壤pH。
您将获得如下响应帧。从响应帧中,您可以计算pH值。
根据收到的响应帧数据,您可以计算pH值。第4位(从第0 开始)是pH值。假设我们得到的是0047H(十六进制)= 71 十进制 => pH = 7.1pH
土壤pH传感器与Arduino的硬件连接
现在,让我们使用MAX485 Modbus模块将土壤pH传感器与Arduino Nano开发板连接起来。连接图如下。
Modbus的RO和DI引脚使用软件串口连接到Arduino的D2和D3。同样,我们必须设置DE和RE高电平,因此将它们连接到Arduino的D7和D8引脚。pH传感器有4根电线。棕色的是 VCC,需要一个5V-30V的电源,可以连接到Arduino的5V。黑色线的GND引脚需要连接到Arduino的GND。B 脚蓝线连接到MAX485的B脚,黄线A脚连接到MAX485的A脚。
0.96寸SSD1306 OLED显示屏是I2C模块。OLED显示屏的VCC和GND分别连接到Arduino的3.3V和GND。另外,将它的SDA和SCL引脚连接到Arduino的A4和A5。按照电路图在面包板上组装电路。
5 软件说明
土壤pH传感器的Arduino代码
下面给出的代码用于将土壤pH传感器与Arduino连接并通过Modbus命令从传感器中检索土壤pH值。您可以发送命令并检索代码中的HEX值。需要将十六进制代码转换为十进制才能获得测量的土壤pH值数据。
由于我们使用OLED显示屏进行显示,因此需要OLED库。下载以下OLED库并将其添加到Arduino IDE。
-
Adafruit SSD1306库
-
Adafruit GFX库
以下是完整的源代码。编译并上传到Arduino Nano开发板
#include <SoftwareSerial.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define RE 8
#define DE 7
const byte ph[] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x01, 0x84, 0x0A};
byte values[11];
SoftwareSerial mod(2, 3);
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1 // Reset pin # (or -1 if sharing reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
void setup()
{
Serial.begin(9600);
mod.begin(4800);
pinMode(RE, OUTPUT);
pinMode(DE, OUTPUT);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C))
{
Serial.println(F("SSD1306 allocation failed"));
for (;;); // Don't proceed, loop forever
}
display.display();
delay(100);
display.clearDisplay();
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(20, 20);
display.print("PH Meter");
display.display();
delay(3000);
}
void loop()
{
byte val;
digitalWrite(DE, HIGH);
digitalWrite(RE, HIGH);
delay(10);
if (mod.write(ph, sizeof(ph)) == 8)
{
digitalWrite(DE, LOW);
digitalWrite(RE, LOW);
for (byte i = 0; i < 11; i++)
{
values[i] = mod.read();
Serial.print(values[i], HEX);
}
Serial.println();
}
float soil_ph = float(values[4]) / 10;
Serial.print("Soil Ph: ");
Serial.println(soil_ph, 1);
display.clearDisplay();
display.setTextSize(2);
display.setCursor(20,0);
display.println("Ph Value");
display.setTextSize(3);
display.setCursor(35,30);
display.print(soil_ph, 1);
display.display();
delay(3000);
}