基于arduino 两栖小鱼缸温湿度、水位、震动,三合一测量小用具
- 前言
- 一、硬件要求
- 二、参数基础
- 三、原理剖析
- 四、思路整合
- 五.程序概要
- 六.成品展示
- 总结
前言
随着夏日的暑气褪去,秋天的两栖动物又将迎来新的活力。环境温湿度、水位不好把握,还有小动物躲着不想见你,如果因这些困扰着你,希望本文的电子作品能带给你灵感。(优信小科技,电子生活更省力)
一、硬件要求
测试水位,本次使用这款Water Sensor传感器,通过平行的导线线迹就可以测出水位的变化,输出已经作为一个模拟量,没有冗杂的规格要求,使用起来简单又容易理解。
测试震动,使用的是这款Shock Sensor高灵敏震动传感器,上面专有的电平和模拟量两种输出,也是将模块的使用简单化。震动的作用也在于将鱼缸内一些小动物隐藏,便于寻找。以及包括水缸受周围高音波、支撑晃动干扰,可以将潜在风险排除。
测试温湿度,这款主带sht30芯片的GY-SHT30-D模块,就是非常适合的了。以其使用i2c协议的传输功能,进行数据传出。带给鱼缸或者室内的温湿度测试,要是有盆栽的也是可以同理使用。
二、参数基础
Water Sensor
工作电压:DC3-5V
工作电流:小于20mA
传感器类型:模拟
检测面积:40mm x 16mm
制作工艺:FR4双面喷锡+电子元件
工作温度:10℃-30℃
工作湿度:10%-90%无凝结
尺寸(LWH): 62.0mm20.0mm8.1mm
Shock Sensor高灵敏震动
工作电压:5V
制作工艺:焊接/贴片
端口:PH2.0
尺寸(LW): 40mm22.5mm
GY-SHT30-D模块
工作电压:DC2.4-5.5V推荐3.3v
工作温度:-40℃-125℃
储存温度:-40℃-150℃
测温范围:5℃-60℃
湿度范围:20%RH-80%RH
温度精度:±2%RH
湿度精度:±0.3℃
测试时间:<2s
RH响应时间:<2s
温度分辨率:0.015℃
通讯接口:i2c(最高达1MHz)
三、原理剖析
Water Sensor其平行暴露的导线,分为A,B两组,同组的导线均是相连的,电流由B经过液体的导通流到A,暴露的导线可以感知是否有液体以及所接触液体量的大小,量越大,则经过导线并终到达回路的电流加大,并由三极管转化为相应变化的模拟信号输出。通过外部系统读取输出的模拟信号,则可以得知相应液位的变化。
Shock Sensor高灵敏震动传感器模块实质是一个开关,其内部是一个金属片和一个弹簧, 产品不震动时,震动开关呈断开状态,输出端输出高电平;产品震动时,震动开关由于弹簧和金属片瞬间导通,输出端输出低电平;输出端可以与单片机直接相连,通过单片机来检测高低电平,由此来检测环境是否有震动,起到报警作用。
GY-SHT30-D以模块通过传感探头感知的数据,经过i2c协议进行编译、转化为能读取的数据,进而引用到整个程序中。由原理图中可以清晰的看到SDA和SCL的串行数据线以及串行时钟线,其中ADDR更是可以直接地址输入,还有ALERT可以作为报警指示点设置。
四、思路整合
Created with Raphaël 2.3.0 开始 arduino编程 传感器指示亮起 串口数据显示 数值核对 结束
根据程序
五.程序概要
代码如下(示例):
#include <Arduino.h>
#include <Wire.h>
#include "Adafruit_SHT31.h" //库引用
int cg = A1; //传感定义
int zd = 4;//震动定义
int g = 5; //因arduino供电口不足,专属震动传感器的电压输入
int link = 0; //空定义变量,方便赋值并显示出来
unsigned waterHigh = 0; //水深定义
Adafruit_SHT31 sht31 = Adafruit_SHT31(); //sht31库赋值定义
#if defined(ARDUINO_ARCH_SAMD)
// for Zero, output on USB Serial console, remove line below if using programming port to program the Zero!
#define Serial SerialUSB
#endif //sht31库文件调用
void setup() {
Serial.begin(115200); //波特率刷新
// put your setup code here, to run once:
pinMode(zd,INPUT);
pinMode(g,OUTPUT); //震动值是传感器传输到开发板是输入,电平口是电压输出
Serial.println("SHT31 test"); // 串口打印值
if (! sht31.begin(0x44)) { // 写到0x45 是用i2c的协议
Serial.println("Couldn't find SHT31"); // 串口打印值
while (1) delay(1);
}
}
void loop() {
// put your main code here, to run repeatedly:
digitalWrite(g,1); //先给震动传感器供电
waterHigh = analogRead(cg);//读水深值赋予到变量
link = digitalRead(zd); //读震动值赋予到变量
if(waterHigh>200){
Serial.println(waterHigh);
}
else{
Serial.println("水太浅");
} //if语句判断是否符合条件,然后决定串口显示水深的形式。
Serial.println(link);//读出震动值
delay(200);
float t = sht31.readTemperature(); //温度定义变量
float h = sht31.readHumidity(); //湿度定义变量
if (! isnan(t)) { // 检查t的值是否是数值
Serial.print("Temp *C = "); Serial.println(t=t-10);//是数值的情况下,温度值输出。这里因为实测是有29度,存在漂移,人为的用t-10来消除漂移值
} else {
Serial.println("Failed to read temperature");//不是数值的情况下,说明读取失败
}
if (! isnan(h)) { // check if 'is not a number'
Serial.print("Hum. % = "); Serial.println(h);
} else {
Serial.println("Failed to read humidity");//与温度同理
}
Serial.println();
delay(1000);
}
注意:该部分的库文件无法完全展示,若有需要完整库文件支持的,请在下方留言。
六.成品展示
总结
1、实用性:主要程序导入后,只要配合笔记本电脑,就能方便随处的使用、查看。
易学性:关于该程序的简单借助arduino的普通函数,就能实现传感器的功能,适合每一个程序的初学者理解。
2、本次的数值精度方面,水位能够很好的精确到三位数值,并且误差在5%的样子。至于温湿度,精确到小数点后一位,但是相对而言存在零点漂移,需要个人根据实际情况编程设置调零,且稳定数值时间需要约一分钟左右,建议家庭使用。
3、最后要提到的就是传感器的灵活应用,您可以看完这篇文章后突发奇想,借助程序移植,将传感器搭载到别的成品上配合使用。
(优信小科技,电子生活更省力)