Arduino+GPRS 的环境监控方案

设备前台界面: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,

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

3) DSM501A模块约30RMB,颗粒物传感器,目的在于监测花粉浓度,PWM输出,

4) HTF3223LF模块23RMB,用于监测空气温湿度,NTC温度输出(试验采用10k上拉),湿度频率输出,

5) BH1750模块13RMB,监测光照强度,I2C输出,

6) 降雨传感器,大约10元,用于监测降雨情况,逻辑电平输出,

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伏供电,背景灯可设开关。

XML/HTML代码

  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. }
时间: 2024-10-19 10:58:11

Arduino+GPRS 的环境监控方案的相关文章

无线监控方案的优势

随着无线通信技术的快速发展,无线监控方案应用越来越被各行各业所采用.在无线监控方案建设时,往往受到地理环境的制约,造成布线施工周期长,成本高等缺点,甚至在某些环境下根本无法实现.面对此类问题,无线监控方案作为一个新的方式也逐渐被广大用户看好,开始利用无线监控来摆脱线缆的束缚,突显安装方便.灵活性强.性价比高等特性.无线监控技术已经在现代化小区.交通.运输.水利.航运.治安.消防等领域得到了广泛的应用. 无线监控方案和传统的监控方案相比,具有以下几个优点: 1.无线监控方案组建网络灵活方便.可扩展

ZigBee温室环境监控系统设计

1 引言 在温室农业生产过程中,温度与湿度等环境参数直接影响到作物的生长.因此,环境的监测与控制是保证温室生产优质高效的重要手段.而大部分的温室监控系统采用PLC温室控制和现场总线控制系统,这些系统具有布线费时.抗干扰性差和成本高的缺点,制约了其推广应用.再加上目前针对特定地区(如我国最北部地区)气候存在着温度低.昼夜温差大.光照强度大等条件研究较少,使得环境监测的可靠性.稳定性成为急需解决的问题. 结合实地考察与测量,引入ZigBee数传技术到温室栽培中,建立温室环境监控系统,可以极大的节省劳

Android TransactionTooLargeException 解析,思考与监控方案

最近公司遇到了一个很有意思的 Crash:android.os.TransactionTooLargeException,这个 Crash 大家可能见到过,错误堆栈的信息多种多样,下面是其中的常见错误堆栈信息之一: #1 main android.os.TransactionTooLargeException java.lang.RuntimeException:Adding window failed android.view.ViewRootImpl.setView(ViewRootImpl

NET 的 ELK 监控方案

NET 的 ELK 监控方案 https://www.jianshu.com/p/3c26695cfc38 背景就不多说了,谁家没有个几个十系统在跑啊.如何监控这几十个系统的运行状况,对于非运营人员来说,太TM五花八门了.. 背景就不多说了,谁家没有个几个十系统在跑啊.如何监控这几十个系统的运行状况,对于非运营人员来说,太TM五花八门了... 名词 ELK = ElashticSearch + LogStash + Kibana Lucene 是搜索引擎,搜索引擎的特点就不用说了吧.但是使用起来

机房没安装动力环境监控的缺点及危害

一.机房概念 现在的机房在IT业,机房普遍指的是电信.网通.移动.双线.电力以及政府或者企业等,存放服务器的,为用户以及员工提供IT服务的地方,小的几十平米,一般放置二三十个机柜,大的上万平米放置上千个机柜,甚至更多,机房里面通常放置各种服务器和小型机,例如IBM小型机,HP小型机,SUN小型机,等等,机房的温度和湿度以及防静电措施都有严格的要求,非专业项目人员一般不能进入,机房里的服务器运行着很多业务,例如移动的彩信.短消息,通话业务等.机房很重要,没有了机房,工作.生活都会受到极大影响,所以

畜禽养殖智能环境监控系统

一.项目背景 随着社会经济以及科技的发展,现代养殖业也如火如荼开展起来,大型养殖业和农村养殖户不断涌现.殖鸡.鸭.猪.牛的企业和个体户越来越多,如何从养殖业中获取收益,是每个企业都非常关心的问题 除了品种优良.营养合理外,动物生长的环境也是非常重要,科学合理的温湿度环境,及时将氨气.二氧化碳气体.硫化氢等气体浓度降到合理的范围内,提供更长的照明时间等等都是非常有利于动物的生长. 厦门计讯结合用户的实际需求,推出了适用于各类畜禽养殖环境监控的无线智能畜牧养殖温湿度监控系统,有效地养殖区域环境温湿度

机房环境监控系统设计与实施重点!

机房环境监控系统的设计方案是否合理.优化.实用,决定了前期投资的经济性.因此,机房的总体设计方案的确定是很重要的,这取决于设计的理念和技术水平. 建设方一般对机房前期的建设比较慎重,要选择有技术实力的设计单位和技术人员进行机房的设计和施工,以保证机房方案的经济实用和机房的施工质量的保证. 机房里除了摆放的计算机.网络设备外,还有许多保证机房环境的设备:如UPS电源设备.空调新风设备.配电设备.安防设备.其它控制设备及弱电设备.为了减少因环境和人为失误造成的损失,用户需要拥有一套先进.可靠的机房环

Docker学习(12):Docker监控方案之Prometheus

Docker常用的监控方案 Prometheus Prometheus架构 Prometheus是一种很不错的监控方案,它提供了监控数据搜集.存储.处理.可视化和警告一套完整的解决方案,下面是Prometheus的架构 Prometheus Server Prometheus Server负责从Exporter拉取和存储监控数据,并提供一套灵活的查询语言(PromQL)供用户使用 Exporter Exporter负责收集目标对象(host,container...)的性能数据,并通过HTTP接

视频直播的用户体验体系与质量监控方案

转自:https://www.upyun.com/opentalk/396.html 首页 > Open Talk NO.42 | 2018 音视频技术沙龙·上海站 > 视频直播的用户体验体系与质量监控方案 讲师简介 战旗直播高级流媒体研发工程师,2012年进入直播行业,先后在奥点云.战旗直播从事流媒体开发工作:2013年独立完成<RTMP协议规范1.0>的中文翻译:对于Windows.Android.iOS平台的直播和播放框架都有一定的研究. 6月24日,又拍云Open Talk