arduino 通过gprs 监测环境指标-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 10060|回复: 5

arduino 通过gprs 监测环境指标

[复制链接]
发表于 2013-4-23 18:53 | 显示全部楼层 |阅读模式
本帖最后由 laoliu1982 于 2013-4-23 20:41 编辑

原文地址:http://www.geek-workshop.com/thread-3829-1-1.html

设备前台界面:http://www.lewei50.com/home/gatewaystatus/361#576

本实采用的硬件,除了一个串口模块以外(约200元),其他均可以从taobo上面找到标准产品

发帖子不是为了买模块,如果不愿意用gprs的可以用w5100(以太网)替代,见帖子 http://www.lewei50.com/dev/doc/94

比较有意思的地方:可以通过手机app,微信随时掌控监测数据的情况。

---------------------------------------------------------------万恶的分界线-------------------------------------------------------------------
使用乐为物联GPRS模块搭建远程环境监测系统

1 目的
     试验基于Arduino硬件平台,采用乐为物联GPRS模块监控不具备有线网络接入条件的山区环境,可以用于农业、林业数据采集。

2 实验条件
     硬件设备列表:
1)        Arduino Nano约50RMB,
1.JPG

2)        乐为物联GPRS模块为测试版(必要的GPRS资费SIM卡),

2.JPG
3)        DSM501A模块约30RMB,颗粒物传感器,目的在于监测花粉浓度,PWM输出,
3.JPG
4)        HTF3223LF模块23RMB,用于监测空气温湿度,NTC温度输出(试验采用10k上拉),湿度频率输出,
4.JPG
5)        BH1750模块13RMB,监测光照强度,I2C输出,
5.JPG
6)        降雨传感器,大约10元,用于监测降雨情况,逻辑电平输出,
6.JPG
7)        LCD1602,大约10元,
     
数据系统平台:乐联网http://www.lewei50.com

3 硬件连线

1)        乐为物联GPRS模块为6脚,本次只用1、2、3、4脚,1脚为Vcc接电源5-12伏输入,2脚为接地,3脚为TTL电平TX,4脚为TTL电平RX。
2)        DSM501A,本次只使用2、3、5脚,2脚为Vout 2 output (PWM)接Arduino D8, 3脚为Vcc接电源5伏,5脚为GND接地。
3)        HTF3223LF模块,使用1、2、3、4脚,1脚为NTC输出端,接Arduino A0,2脚为GND接地,3脚为湿度频率输出,接Arduino D2,4脚为Vcc接电源5伏。
4)        BH1750模块为5脚,I2C接口,本次不用接ADD脚,VCC接电源5伏,SCL接Arduino A5,SDA接Arduino A4,GND接地。
5)        降雨传感器为4脚,逻辑输出接Arduino D10,VCC接电源5伏,GND接地。
6)        LCD1602,本次采用4数据线连接法,RS 接Arduino D12,Enable接Arduino D11, LCD D4接Arduino D4,LCD D5接Arduino D5,LCD D6接Arduino D6,LCD D7接Arduino D7,LCD R/W 接地,LCD V0接10k可调电阻,LCD使用5伏供电,背景灯可设开关。

//不知道为啥没有插入代码的功能   

#include<string.h>

//#include <SoftwareSerial.h>

#include <Wire.h>

#include <math.h>

//#include <MsTimer2.h>

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 4, 5, 6, 7);

//* LCD RS pin to digital pin 12

// * LCD Enable pin to digital pin 11

// * LCD D4 pin to digital pin 4

// * LCD D5 pin to digital pin 5

// * LCD D6 pin to digital pin 6

// * LCD D7 pin to digital pin 7

// * LCD R/W pin to ground

// * 10K resistor:

// * ends to +5V and ground

// * wiper to LCD VO pin (pin 3)

//SoftwareSerial mySerial(9, 10); // RX, TX

//String inputString = "";

const int buttonPin = 10;     //the number of the jiangyu input pin

int buttonState = 0;         // variable for reading the jiangyu status

int Rain = 1;

int BH1750address = 0x23;//BH1750 I2C地址

byte buff[2];

float BH = 0;

const int analogInPin = A0;  // Analog input pin that the potentiometer is attached to//*//Freqinput pin D2

int pin = 8;//DSM501A input D8

float wuchaxiuzheng = 0;

unsigned long duration;

unsigned long starttime;

unsigned long endtime;

unsigned long sampletime_ms = 30000;

unsigned long lowpulseoccupancy = 0;

float ratio = 0;

float concentration = 0;

float tempconcentration=0;

int sensorValue = 0;        // value read from the NTC

int TEMPRATURE=0;

int i=0;

float R_Data=0;

float U_data [111]={4.67,4.65,4.64,4.62,4.60,4.57,4.55,4.53,4.51,4.48,4.46,4.43,4.40,4.38,4.35,4.32,4.28,4.25,4.22,4.19,4.15,4.11,4.08,4.04,4.00,3.96,3.92,3.88,3.83,3.79,3.75,3.70,3.65,3.61,3.56,3.51,3.47,3.42,3.37,3.32,3.27,3.22,3.17,3.11,3.06,3.01,2.96,2.91,2.86,2.81,2.75,2.70,2.65,2.60,2.54,2.50,2.44,2.39,2.34,2.29,2.24,2.20,2.15,2.10,2.06,2.01,1.96,1.92,1.87,1.83,1.78,1.74,1.70,1.66,1.62,1.58,1.54,1.50,1.47,1.43,1.39,1.36,1.32,1.29,1.25,1.22,1.19,1.15,1.12,1.09,1.06,1.04,1.01,0.98,0.96,0.93,0.91,0.88,0.86,0.84,0.81,0.79,0.77,0.75,0.73,0.713,0.69,0.67,0.66,0.64,0.62};//温度对应NTC电表格

int divider[6] = {0, 1, 8, 64, 256, 1024};//read RH use interrupt get F

int prescaler = 5;

double count = 0;

double middle = 0;

char x = 0;

int Fout=0;

int RH=0;

byte du[8]={

B00111,

B00101,

B00111,

B00000,

B00000,

B00000,

B00000,

};//define 1602 char
ISR(TIMER1_OVF_vect)

{

    if (prescaler < 4)

    {

        prescaler++;

    }

}

void interrupt()

{

    if (!x)

    {

        count = TCNT1;

        TCNT1 = 0x000;

        TCCR1B = prescaler;

        attachInterrupt(0, interrupt, FALLING);

    }

    else

    {

        middle = TCNT1;

        attachInterrupt(0, interrupt, RISING);

    }

    x = ~x;

}

void setup()

{

Wire.begin();

  Serial.begin(9600);

//  mySerial.begin(9600);

//  inputString.reserve(200);

//  MsTimer2::set(2000, timer); //定时器设置,每2秒触发一次timer函数操作

//  MsTimer2::start();

  //  pinMode(buttonPin, INPUT);  

  analogReference(DEFAULT);//INTERNAL

    lcd.createChar(1,du);

    lcd.begin(16, 2);  

    lcd.clear();

//    lcd.setCursor(0, 0);

//    lcd.print("PM2.5=");

//    lcd.setCursor(0, 1);

//    lcd.print("T=     ");

//    //lcd.write(1);

//    lcd.print("   RH=  %");

//    Serial.begin(9600);

    pinMode(buttonPin, INPUT);

    pinMode(8,INPUT);

    TIMSK1 = 0x01;

    TCCR1A = 0x00;

    attachInterrupt(0, interrupt, RISING);

    starttime = millis();
}

void loop()

{

  duration = pulseIn(pin, LOW);

  lowpulseoccupancy += duration;

  endtime = millis();

  if ((endtime-starttime) > sampletime_ms)

  {

    ratio = (lowpulseoccupancy-endtime+starttime + sampletime_ms)/(sampletime_ms*10.0);  // Integer percentage 0=>100

    concentration = 1.1*pow(ratio,3)-3.8*pow(ratio,2)+520*ratio+0.62; // using spec sheet curve

    //Serial.print(lowpulseoccupancy);

    // Serial.print(",");

    //Serial.print(ratio);

//    Serial.print("DSM501A:");

//    Serial.println(concentration);

//    Serial.print(";");

//Serial.println(endtime-starttime);

wuchaxiuzheng = (endtime-starttime-30000)/30000.0;

//Serial.println(wuchaxiuzheng);

concentration = (1.00-wuchaxiuzheng)*concentration;

//Serial.println(concentration);

    lcd.setCursor(6, 0);

    lcd.print(concentration);

    lcd.print("pcs/0.01cf");

//    lowpulseoccupancy = 0;

//    starttime = millis();

  }

  sensorValue = analogRead(analogInPin);    // read the analog in value:
  delay(10);  

  R_Data=sensorValue*5/1024.0;

  //Serial.print("R_Data = " );                       

  //Serial.print(R_Data);   

  for(i=0;i<111;i++){

     if(R_Data>4.67)

     {

       TEMPRATURE =-30;//对应-30℃

      }

     else if(R_Data<0.62)

     {

      TEMPRATURE=80; //对应80℃      

      }

     else if(R_Data<U_data&&R_Data>U_data[i+1])

     {

      TEMPRATURE=int(i-30-3);
      }

}

//     Serial.print("T:" );

//     Serial.print(TEMPRATURE);

//     Serial.print(";" );

     delay(10);


    lcd.setCursor(0, 0);

    lcd.print("PM2.5=");

    lcd.setCursor(0, 1);

    lcd.print("T=     ");

    //lcd.write(1);

    lcd.print("   RH=  %");

//     lcd.setCursor(0, 1);

//     lcd.print("T=     ");

//    //lcd.write(1);

//    lcd.print("   RH=  %");

     lcd.setCursor(2, 1);

     lcd.print(TEMPRATURE);

     lcd.write(1);

    lcd.print("C");

     Fout=(16000000.0 / divider[prescaler] / count);  

     //Serial.print("Vsensor=" );                       

     //Serial.print(sensorValue);      

     //Serial.print(", " );
     //Serial.print("Freq=");

     //Serial.print(Fout);

//    Serial.print("   ");

//    Serial.print(int(divider));

//    Serial.print("   ");

//    Serial.print(prescaler);

//    Serial.print("   ");

//    Serial.println(count);

if (Fout<8115)

{

RH=100;

//      Serial.print("RH:100");

//      Serial.println(";");

      lcd.setCursor(13, 1);

      lcd.print("H.");

}

else if(Fout>9595)

{

RH=0;

  //   Serial.print("RH:0");

//   Serial.println(";");

   lcd.setCursor(13, 1);

   lcd.print("L.");

}

else

{

RH=(9595-Fout)/14.8;

// Serial.print("RH:");

// Serial.print(RH);

// Serial.println(";");

lcd.setCursor(13, 1);

lcd.print(RH);

}

    if (prescaler > 1)

    {

        prescaler--;

        delay(200);

    }

//if(  flag )//

//  {

//    Serial.print( BH1750() );

//    Serial.println("[lux]");

//   
//    flag = 0;//归零,等着定时中断重新赋值

//  }

delay(2000);

   if(tempconcentration!=concentration)

   {

    tempconcentration=concentration;

    BH=BH1750();

    // read the state of the jiangyu value:

  buttonState = digitalRead(buttonPin);

    // check if the jiangyu is low.

  // if it is, the buttonState is LOW:

  if (buttonState == LOW) {     

    Rain=0;

    }
  else {

    Rain=1;

    }

//lewei ouput by computer tools  

//     Serial.print("D:");

//     Serial.print(concentration);

//     Serial.print(";");

//     Serial.print("T:" );

//     Serial.print(TEMPRATURE);

//     Serial.print(";" );

//     Serial.print("R:");

//     Serial.print(RH);

//     Serial.print(";" );

//     Serial.print("B:" );

//     Serial.print(BH);

//     Serial.print(";" );

//     Serial.print("W:");

//     Serial.print(Rain);

//     Serial.println(";");

//lewei ouput by GPRS   

    lcd.setCursor(0, 1);

    lcd.print("                ");

    lcd.setCursor(0, 1);

    lcd.print(BH);

    lcd.print("LUX");

    //delay(5000);
    String tempstring="@uploading(01,D,";

    String tempstring1=")";

    Serial.print(tempstring);

    Serial.print(int(concentration));

    Serial.println(tempstring1);
//    delay(12000); min transtime

delay(30000);

    String tempstring2="@uploading(01,T,";

    String tempstring3=")";

    Serial.print(tempstring2);

    Serial.print(TEMPRATURE);

    Serial.println(tempstring3);
//    delay(12000);

delay(30000);

    String tempstring4="@uploading(01,R,";

    String tempstring5=")";

    Serial.print(tempstring4);

    Serial.print(RH);

    Serial.println(tempstring5);
//    delay(15000);

    delay(30000);

    String tempstring6="@uploading(01,B,";

    String tempstring7=")";

    Serial.print(tempstring6);

    Serial.print(int(BH));

    Serial.println(tempstring7);
//    delay(2000);

delay(30000);

    String tempstring8="@uploading(01,W,";

    String tempstring9=")";

    Serial.print(tempstring8);

    Serial.print(Rain);

    Serial.println(tempstring9);
delay(30000);

    lowpulseoccupancy = 0;

    starttime = millis();

    }

}

double BH1750() //BH1750设备操作

{

  int i=0;

  double  val=0;

  //开始I2C读写操作

  Wire.beginTransmission(BH1750address);

  Wire.write(0x10);//1lx reolution 120ms//发送命令

  Wire.endTransmission();  

  delay(200);

  //读取数据

  Wire.beginTransmission(BH1750address);

  Wire.requestFrom(BH1750address, 2);

  while(Wire.available()) //

  {

    buff = Wire.read();  // receive one byte

    i++;

  }

  Wire.endTransmission();

  if(2==i)

  {

   val=((buff[0]<<8)|buff[1])/1.2;

  }

  if(val<0) val=56134+val;

  return val;

}











如果你需要更详细的技术交流或者疑问咨询,可以加入乐为物联技术支持群:59162154;或关注乐为物联新浪微博@乐为物联

关注乐联网微信:搜索公众账号乐联网。或者扫描下面的二维码来添加关注乐联网

7.JPG
8.JPG
9.JPG
10.JPG
11.JPG
12.JPG
13.JPG
14.JPG
发表于 2013-4-23 19:04 | 显示全部楼层
沙发了,楼主这套设备真心很不错。。。。全部是你自己完成的吗?
 楼主| 发表于 2013-4-23 19:45 | 显示全部楼层
hotboy 发表于 2013-4-23 19:04
沙发了,楼主这套设备真心很不错。。。。全部是你自己完成的吗?

不是啊,我就是给转过来了,呵呵

作者是这位 http://www.geek-workshop.com/thread-3829-1-1.html
发表于 2013-4-23 20:06 | 显示全部楼层
我说呢,那么牛怎么才是新手,也潜伏的太深了。。那么楼主你有没有兴趣复制一套这样的设备出来呢。
 楼主| 发表于 2013-4-23 20:43 | 显示全部楼层
hotboy 发表于 2013-4-23 20:06
我说呢,那么牛怎么才是新手,也潜伏的太深了。。那么楼主你有没有兴趣复制一套这样的设备出来呢。 ...

呵呵,

感兴趣倒是感兴趣,估计没时间整了。我其实主要是为了发下面这句话的

如果你需要更详细的技术交流或者疑问咨询,可以加入乐为物联技术支持群:59162154;或关注乐为物联新浪微博@乐为物联;
关注乐联网微信:搜索公众账号“乐联网”。或者扫描下面的二维码来添加关注“乐联网”。
发表于 2013-4-24 11:59 | 显示全部楼层
                           
                                      
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-28 15:34 , Processed in 0.084119 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表