分享

使用乐为物联GPRS模块搭建远程环境监测系统

 开启美好每一天 2015-11-13
使用乐为物联GPRS模块搭建远程环境监测系统

1 目的
    试验基于Arduino硬件平台,采用乐为物联GPRS模块监控不具备有线网络接入条件的山区环境,可以用于农业、林业数据采集。
2 实验条件
    硬件设备列表:
1)        Arduino Nano约50RMB,
arduino nano.jpg
2)        乐为物联GPRS模块为测试版(必要的GPRS资费SIM卡),
3)        DSM501A模块约30RMB,颗粒物传感器,目的在于监测花粉浓度,PWM输出,
4)        HTF3223LF模块23RMB,用于监测空气温湿度,NTC温度输出(试验采用10k上拉),湿度频率输出,
5)        BH1750模块13RMB,监测光照强度,I2C输出,
6)        降雨传感器,大约10元,用于监测降雨情况,逻辑电平输出,
7)        LCD1602,大约10元,
    数据系统平台:乐联网http://www.
3 硬件连线
1)        乐为物联GPRS模块为6脚,本次只用1、2、3、4脚,1脚为Vcc接电源5-12伏输入,2脚为接地,3脚为TTL电平TX,4脚为TTL电平RX。
GPRS.JPG

2)        DSM501A,本次只使用2、3、5脚,2脚为Vout 2 output (PWM)接Arduino D8, 3脚为Vcc接电源5伏,5脚为GND接地。
501a.JPG DSM501A.JPG

3)        HTF3223LF模块,使用1、2、3、4脚,1脚为NTC输出端,接Arduino A0,2脚为GND接地,3脚为湿度频率输出,接Arduino D2,4脚为Vcc接电源5伏。
3223.jpg
4)        BH1750模块为5脚,I2C接口,本次不用接ADD脚,VCC接电源5伏,SCL接Arduino A5,SDA接Arduino A4,GND接地。
1750.jpg
5)        降雨传感器为4脚,逻辑输出接Arduino D10,VCC接电源5伏,GND接地。
下雨传感器.jpg
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伏供电,背景灯可设开关。
  


4 程序
ARDUINO 代码复制打印
  1. #include<string.h>
  2. //#include <SoftwareSerial.h>
  3. #include <Wire.h>
  4. #include <math.h>
  5. //#include <MsTimer2.h>
  6. #include <LiquidCrystal.h>
  7. LiquidCrystal lcd(12, 11, 4, 5, 6, 7);
  8. //* LCD RS pin to digital pin 12
  9. // * LCD Enable pin to digital pin 11
  10. // * LCD D4 pin to digital pin 4
  11. // * LCD D5 pin to digital pin 5
  12. // * LCD D6 pin to digital pin 6
  13. // * LCD D7 pin to digital pin 7
  14. // * LCD R/W pin to ground
  15. // * 10K resistor:
  16. // * ends to +5V and ground
  17. // * wiper to LCD VO pin (pin 3)
  18. //SoftwareSerial mySerial(9, 10); // RX, TX
  19. //String inputString = "";
  20. const int buttonPin = 10;     //the number of the jiangyu input pin
  21. int buttonState = 0;         // variable for reading the jiangyu status
  22. int Rain = 1;
  23. int BH1750address = 0x23;//BH1750 I2C地址
  24. byte buff[2];
  25. float BH = 0;
  26. const int analogInPin = A0;  // Analog input pin that the potentiometer is attached to//*//Freqinput pin D2
  27. int pin = 8;//DSM501A input D8
  28. float wuchaxiuzheng = 0;
  29. unsigned long duration;
  30. unsigned long starttime;
  31. unsigned long endtime;
  32. unsigned long sampletime_ms = 30000;
  33. unsigned long lowpulseoccupancy = 0;
  34. float ratio = 0;
  35. float concentration = 0;
  36. float tempconcentration=0;
  37. int sensorValue = 0;        // value read from the NTC
  38. int TEMPRATURE=0;
  39. int i=0;
  40. float R_Data=0;
  41. 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电表格
  42. int divider[6] = {0, 1, 8, 64, 256, 1024};//read RH use interrupt get F
  43. int prescaler = 5;
  44. double count = 0;
  45. double middle = 0;
  46. char x = 0;
  47. int Fout=0;
  48. int RH=0;
  49. byte du[8]={
  50. B00111,
  51. B00101,
  52. B00111,
  53. B00000,
  54. B00000,
  55. B00000,
  56. B00000,
  57. };//define 1602 char
  58. ISR(TIMER1_OVF_vect)
  59. {
  60.     if (prescaler < 4)
  61.     {
  62.         prescaler++;
  63.     }
  64. }
  65. void interrupt()
  66. {
  67.     if (!x)
  68.     {
  69.         count = TCNT1;
  70.         TCNT1 = 0x000;
  71.         TCCR1B = prescaler;
  72.         attachInterrupt(0, interrupt, FALLING);
  73.     }
  74.     else
  75.     {
  76.         middle = TCNT1;
  77.         attachInterrupt(0, interrupt, RISING);
  78.     }
  79.     x = ~x;
  80. }
  81. void setup()
  82. {
  83. Wire.begin();
  84.   Serial.begin(9600);
  85. //  mySerial.begin(9600);
  86. //  inputString.reserve(200);
  87. //  MsTimer2::set(2000, timer); //定时器设置,每2秒触发一次timer函数操作
  88. //  MsTimer2::start();
  89.   //  pinMode(buttonPin, INPUT);  
  90.   analogReference(DEFAULT);//INTERNAL
  91.     lcd.createChar(1,du);
  92.     lcd.begin(16, 2);  
  93.     lcd.clear();
  94. //    lcd.setCursor(0, 0);
  95. //    lcd.print("PM2.5=");
  96. //    lcd.setCursor(0, 1);
  97. //    lcd.print("T=     ");
  98. //    //lcd.write(1);
  99. //    lcd.print("   RH=  %");
  100. //    Serial.begin(9600);
  101.     pinMode(buttonPin, INPUT);
  102.     pinMode(8,INPUT);
  103.     TIMSK1 = 0x01;
  104.     TCCR1A = 0x00;
  105.     attachInterrupt(0, interrupt, RISING);
  106.     starttime = millis();
  107. }
  108. void loop()
  109. {

  110.   duration = pulseIn(pin, LOW);
  111.   lowpulseoccupancy += duration;
  112.   endtime = millis();
  113.   if ((endtime-starttime) > sampletime_ms)
  114.   {
  115.     ratio = (lowpulseoccupancy-endtime+starttime + sampletime_ms)/(sampletime_ms*10.0);  // Integer percentage 0=>100
  116.     concentration = 1.1*pow(ratio,3)-3.8*pow(ratio,2)+520*ratio+0.62; // using spec sheet curve
  117.     //Serial.print(lowpulseoccupancy);
  118.     // Serial.print(",");
  119.     //Serial.print(ratio);
  120. //    Serial.print("DSM501A:");
  121. //    Serial.println(concentration);
  122. //    Serial.print(";");
  123. //Serial.println(endtime-starttime);
  124. wuchaxiuzheng = (endtime-starttime-30000)/30000.0;
  125. //Serial.println(wuchaxiuzheng);
  126. concentration = (1.00-wuchaxiuzheng)*concentration;
  127. //Serial.println(concentration);

  128.     lcd.setCursor(6, 0);
  129.     lcd.print(concentration);
  130.     lcd.print("pcs/0.01cf");
  131. //    lowpulseoccupancy = 0;
  132. //    starttime = millis();
  133.   }
  134.   sensorValue = analogRead(analogInPin);    // read the analog in value:
  135.   delay(10);  
  136.   R_Data=sensorValue*5/1024.0;
  137.   //Serial.print("R_Data = " );                       
  138.   //Serial.print(R_Data);   
  139.   for(i=0;i<111;i++){
  140.      if(R_Data>4.67)
  141.      {
  142.        TEMPRATURE =-30;//对应-30℃
  143.       }
  144.      else if(R_Data<0.62)
  145.      {
  146.       TEMPRATURE=80; //对应80℃      
  147.       }
  148.      else if(R_Data<U_data[i]&&R_Data>U_data[i+1])
  149.      {
  150.       TEMPRATURE=int(i-30-3);
  151.       }
  152. }
  153. //     Serial.print("T:" );
  154. //     Serial.print(TEMPRATURE);
  155. //     Serial.print(";" );
  156.      delay(10);


  157.     lcd.setCursor(0, 0);
  158.     lcd.print("PM2.5=");
  159.     lcd.setCursor(0, 1);
  160.     lcd.print("T=     ");
  161.     //lcd.write(1);
  162.     lcd.print("   RH=  %");
  163. //     lcd.setCursor(0, 1);
  164. //     lcd.print("T=     ");
  165. //    //lcd.write(1);
  166. //    lcd.print("   RH=  %");
  167.      lcd.setCursor(2, 1);
  168.      lcd.print(TEMPRATURE);
  169.      lcd.write(1);
  170.     lcd.print("C");
  171.      Fout=(16000000.0 / divider[prescaler] / count);  
  172.      //Serial.print("Vsensor=" );                       
  173.      //Serial.print(sensorValue);      
  174.      //Serial.print(", " );
  175.      //Serial.print("Freq=");
  176.      //Serial.print(Fout);
  177. //    Serial.print("   ");
  178. //    Serial.print(int(divider));
  179. //    Serial.print("   ");
  180. //    Serial.print(prescaler);
  181. //    Serial.print("   ");
  182. //    Serial.println(count);
  183. if (Fout<8115)
  184. {
  185. RH=100;
  186. //      Serial.print("RH:100");
  187. //      Serial.println(";");
  188.       lcd.setCursor(13, 1);
  189.       lcd.print("H.");
  190. }
  191. else if(Fout>9595)
  192. {
  193. RH=0;
  194.   //   Serial.print("RH:0");
  195. //   Serial.println(";");
  196.    lcd.setCursor(13, 1);
  197.    lcd.print("L.");
  198. }
  199. else
  200. {

  201. RH=(9595-Fout)/14.8;
  202. // Serial.print("RH:");
  203. // Serial.print(RH);
  204. // Serial.println(";");
  205. lcd.setCursor(13, 1);
  206. lcd.print(RH);
  207. }
  208.     if (prescaler > 1)
  209.     {
  210.         prescaler--;
  211.         delay(200);
  212.     }

  213. //if(  flag )//
  214. //  {
  215. //    Serial.print( BH1750() );
  216. //    Serial.println("[lux]");
  217. //   
  218. //    flag = 0;//归零,等着定时中断重新赋值
  219. //  }
  220. delay(2000);

  221.    if(tempconcentration!=concentration)
  222.    {
  223.     tempconcentration=concentration;
  224.     BH=BH1750();
  225.     // read the state of the jiangyu value:
  226.   buttonState = digitalRead(buttonPin);
  227.     // check if the jiangyu is low.
  228.   // if it is, the buttonState is LOW:
  229.   if (buttonState == LOW) {     
  230.     Rain=0;
  231.     }
  232.   else {
  233.     Rain=1;
  234.     }
  235. //lewei ouput by computer tools  
  236. //     Serial.print("D:");
  237. //     Serial.print(concentration);
  238. //     Serial.print(";");
  239. //     Serial.print("T:" );
  240. //     Serial.print(TEMPRATURE);
  241. //     Serial.print(";" );
  242. //     Serial.print("R:");
  243. //     Serial.print(RH);
  244. //     Serial.print(";" );
  245. //     Serial.print("B:" );
  246. //     Serial.print(BH);
  247. //     Serial.print(";" );
  248. //     Serial.print("W:");
  249. //     Serial.print(Rain);
  250. //     Serial.println(";");

  251. //lewei ouput by GPRS   

  252.     lcd.setCursor(0, 1);
  253.     lcd.print("                ");
  254.     lcd.setCursor(0, 1);
  255.     lcd.print(BH);
  256.     lcd.print("LUX");
  257.     //delay(5000);

  258.     String tempstring="@uploading(01,D,";
  259.     String tempstring1=")";
  260.     Serial.print(tempstring);
  261.     Serial.print(int(concentration));
  262.     Serial.println(tempstring1);
  263. //    delay(12000); min transtime
  264. delay(30000);

  265.     String tempstring2="@uploading(01,T,";
  266.     String tempstring3=")";
  267.     Serial.print(tempstring2);
  268.     Serial.print(TEMPRATURE);
  269.     Serial.println(tempstring3);
  270. //    delay(12000);
  271. delay(30000);

  272.     String tempstring4="@uploading(01,R,";
  273.     String tempstring5=")";
  274.     Serial.print(tempstring4);
  275.     Serial.print(RH);
  276.     Serial.println(tempstring5);
  277. //    delay(15000);
  278.     delay(30000);

  279.     String tempstring6="@uploading(01,B,";
  280.     String tempstring7=")";
  281.     Serial.print(tempstring6);
  282.     Serial.print(int(BH));
  283.     Serial.println(tempstring7);
  284. //    delay(2000);
  285. delay(30000);

  286.     String tempstring8="@uploading(01,W,";
  287.     String tempstring9=")";
  288.     Serial.print(tempstring8);
  289.     Serial.print(Rain);
  290.     Serial.println(tempstring9);
  291. delay(30000);

  292.     lowpulseoccupancy = 0;
  293.     starttime = millis();

  294.     }

  295. }

  296. double BH1750() //BH1750设备操作
  297. {
  298.   int i=0;
  299.   double  val=0;
  300.   //开始I2C读写操作
  301.   Wire.beginTransmission(BH1750address);
  302.   Wire.write(0x10);//1lx reolution 120ms//发送命令
  303.   Wire.endTransmission();  

  304.   delay(200);
  305.   //读取数据
  306.   Wire.beginTransmission(BH1750address);
  307.   Wire.requestFrom(BH1750address, 2);
  308.   while(Wire.available()) //
  309.   {
  310.     buff[i] = Wire.read();  // receive one byte
  311.     i++;
  312.   }
  313.   Wire.endTransmission();
  314.   if(2==i)
  315.   {
  316.    val=((buff[0]<<8)|buff[1])/1.2;
  317.   }
  318.   if(val<0) val=56134+val;
  319.   return val;
  320. }


5 总结
    乐为gprs模块使用非常简单,但是要注意供电问题,我用5v1.5a开关电源有时会出现初始化无法通过的问题,后来改用12v1.5a开关电源一切正常。
乐为gprs命令非常简单,通常可以先用串口连接PC设置key,使用串口工具发送@key=你的key值,模块返回key=你的key值,然后就可以当作黑盒子使用了。
因为数据操作通常只使用上传命令@uploading(a,b,c),a为网关标识(2位数字),b 设备标识(1-8位字符),c 为上传数值(如果是负数,请在数值前加‘-’号),简单情况下根本不需要考虑交互反馈的判断条件,只需要等待适当的延时就可以了。
希望今后可以考虑短信控制的输出协议,便于同时使用短信操作Arduino,也希望能将GPRS模块协议与乐联网串口工具协议保持一致,便于程序调试的兼容。
试验结果可以访问
http://open./home/gatewaystatus/361


初学Arduino,程序中的问题还请大家批评指正。



上几张照片看看
IMAG1326.jpg
IMAG1327.jpg
IMAG1328.jpg
IMAG1329.jpg
IMAG1330.jpg
IMAG1331.jpg
IMAG1332.jpg
2013-3-28 11:05 上传
下载附件 (53.49 KB)

IMAG1333.jpg

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多