Suaig 发表于 2017-4-25 15:16:31

基于arduino Nano 的植物

本帖最后由 Suaig 于 2017-5-7 21:14 编辑

开个新坑,内容太多。慢慢更:D:D:D。适合人群:看过入门贴。没看过的传送门:http://club.gizwits.com/thread-5393-1-1.html

这个植物宝目前具备监测光线强度,空气温湿度,土壤温湿度,并配备手动远程浇水功能。空气温湿度采用新型的温湿度传感器DHT12,采用I2C通讯。为了用这个我还专门为arduino写了个DHT12的驱动。
先来说说这个DHT12传感器。新出的哟。
//
DHT12数字式温湿度传感器是一款含有已校准数字信号输出的温湿度复合型传感器,为DHT11的升级产品。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有较高的可靠性与卓越的长期稳定性。
DHT12具有单总线和标准I2
C两种通讯,且单总线通讯方式完全兼容DHT11。标准单总线接口,使系统集成变得简易快捷。具
有超小的体积、较低的功耗,适合多种多样的应用场合。I2
C通信
方式采用标准的通信时序,用户可直接挂在I2
C通信总线上,无需额外布线,使用简单。两种通信方式可自由切换,用户可自由选择,使用方便,应该领域广泛。产品为4引线,连接方便,特殊封装形式可根据用户需求而提供。

//
比起DHT11很明显的改变就是协议增加了一种,I2C比1-wire协议完成一次读取所消耗的时间更少,耗费的CPU也更小。我想是由于网上缺少库把,所以arduino爱好者用的人很少。这里我完成了他的驱动。


根据数据手册,I2C通讯的器件地址是0xB8 由于arduino写器件地址的时候需要右移以为,也就是0x5C了。即1011 1000 变成 0101 1100
数据手册上写着几个数据的地址。0x00湿度整数位0x01湿度小数位
0x02温度整数位
0x03温度小数位
0x04校验和
我们根据这个地址读出所有信息。并整理
      /**********
      @采集空气温湿度信息
      @ Humi 湿度信息,只保留整数部分
      @ Temp 温度信息,保留小数后两位
      **********/
      Wire.beginTransmission(0x5C); //开启DHT12的传输
      Wire.write(0x00); //指定寄存器地址
      Wire.requestFrom(0x5C, 5, true); //将输据读出到缓存
      Wire.endTransmission(true); //关闭传输模式
      delay(2);
      for(int i =0 ;i<5;i++)
      {
      DHT12BUFF =Wire.read();
      }
      if(DHT12BUFF = (DHT12BUFF+DHT12BUFF+DHT12BUFF+DHT12BUFF)) //检查校验和。
      {
      Humi = (float)DHT12BUFF;    //这里只使用了湿度的整数位。小数位没意义,因为他精度是5%的湿度
      Temp = (float)DHT12BUFF+(float)DHT12BUFF * 0.01;
      }

这个传感器主要是采集到我们植物周围空气的温度湿度,那么植物还有另外几个重要参数,光强。土壤温度,土壤湿度,我们这里土壤湿度使用了防水的NTC温度传感器。NTC温度传感器相当于一个会随着温度
变化的电阻,温度越高,电阻越低,而且不是线性的,好在他的曲线轨迹还是有迹可循的。
Rt = R*EXP(B*(1/T1 - 1/T2)
这个是NTC温度和阻值的计算关系。T1对应Rt,T2对应R,B是一个几乎不随温度变化的常量。一般商家会告诉你,我这里的B值是3958.不过我计算的是在3950-3970之间呢,NTC电阻在25度时候的电阻值就是
标称电阻,我这里是10K。
NTC 电路连接
3.3 --- 20k --- NTC ---GND

为了把电阻值变化变成模拟量变化,我这里串联了一个20K的电阻到3.3V稳压电源,用3.3V稳压电源的原因就是他准啊,稳定在3.3V。

然后我们就采集20K和NTC之间的分压拉~。根据欧姆定律可以计算出NTC的电阻。然后带入公式。注意啦。T1和T2是开尔文。是摄氏度+273.

这里上代码,对咯。我这里A7接了一个TL431,接成了一个2.5V的基准源。所以这边V的计算应该是2.5*D0/D7啦。。。
2.5 = Vcc * D7/1024
进而算出Vcc    实际上Vcc的变化是会很大的,而NTC需要一个很准的采样,才能把精度控制在0.5内。
float SoilTemp()
{
double v0 = (double)analogRead(A0);
double v7 = (double)analogRead(A7);
double num=0;
num = v0/(-v0/2+33*v7/50);
num = log(num)/3958;
num = num + 0.0033557047;
num = 1/num;
//Serial.println(num-273);
return num-273;
}
土壤湿度传感器:

其实原理很简单拉,这个就是两个金属片,土壤里水分越多导电能力越强。
我们街上VCC之后把他的A0端口接到我们Nano的模拟口就行。

float SoilHumi()
{
return 20*2.5*(float)analogRead(A2)/(float)analogRead(A7);
}

我这里把测量到的电压扩大了20倍。把量程从扩大到了0-20VCC方便查看嘛。

光线传感器:

光线传感器同为模拟输出类。所以接法和土壤传感器一样,后面会上电路图。
float LightLL()
{
return 2.5*(float)analogRead(A3)/(float)analogRead(A7);
}


传感器先介绍到这里。
连接
NANO TXD --- WIFI RXD
NANO RXD --- WIFI TXD

NANO D3   --- KEY_1
NANO D4   --- KEY_0

NANO D2--- LED_0
NANO D12 --- 继电器浇水/其他装置

NANO A4---- DHT12 SDA
NANO A5---- DHT12 SCL
NANO A0---- NTC
NANO A2 ----- 土壤传感器
NANO A3----- 光线传感器
整体原理图,前几天没上原理图大家看着这个项目也没啥意思啊哈。原理图中10k的滑动变阻器代替的是10K的热敏电阻B值一般都是商家给的,由于原理图中采用了基准电压,并且给热敏电阻的供电是经过降压稳压到3.3的实际测得温度还是挺精准的,使用的是NTC,

植物宝实物,焊接+调试花了我一下午,晚上急急的更了就上课去了,不好意思各位~~看到我土壤传感器没,是的我插土里正常工作过了。除了供电比较麻烦得插一个充电宝,机智云的稳定性是很棒的。我上个月做的一个STM32控制器用的机智云,一个月没关机(我加了看门狗就是),如有需要,我上传个视频。(主要是我没有优酷啥的账户也没上传过,,,哈哈哈)今天晚上更新了原理图和实物图,相信大家很快能做出来,祝创客玩的愉快。





admin 发表于 2017-5-3 09:30:50

楼主楼主 贴个视频呢??

yunxiao 发表于 2017-6-1 19:09:31

图全挂了啊

小米粒 发表于 2017-7-19 17:54:05

期待您的回复

本帖最后由 小米粒 于 2017-7-19 17:59 编辑

您好!能将你的作品卖给我吗?自己琢磨了好久也弄不好!

物联网小白 发表于 2017-11-3 20:09:04

问一个问题:Gizwits.ccp是要自己编辑,对吗?包括gizwits_protocol.h

qwertasdfg 发表于 2021-10-28 22:29:30

赞一个,冲冲冲

Jnice 发表于 2021-11-24 22:33:03

你好,请问您知道传感器数值在机智云app上显示不出来是什么原因吗,就比如土壤湿度温度后面是一片空白,没有数值,但是数据点已经设置了只读,求教,谢谢!

随便看看 发表于 2022-9-14 14:14:03

赞一个,冲冲冲
页: [1]
查看完整版本: 基于arduino Nano 的植物