Arduino+GPRS 的环境监控方案
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[i]&&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[i] = 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;
- }
Arduino+GPRS 的环境监控方案的更多相关文章
- 前端性能监控方案window.performance 调研(转)
1. 业界案例 目前前端性能监控系统大致为分两类:以GA为代表的代码监控和以webpagetest为代表的工具监控. 代码监控依托于js代码并部署到需监控的页面,手动计算时间差或者使用浏览器的的API ...
- cassandra 监控方案评估
摘要 最开始做cassandra monitor 方案的选型时,主要是从cassandra 本身入手,后来发现cassandra运行在JVM上,所有的metrics都是通过JMX 暴露出来.所以又可以 ...
- 关于Kafka监控方案的讨论
之前在知乎上尝试过回答这个问题,后来问的人挺多,干脆在博客里面保存一下. 目前Kafka监控方案看似很多,然而并没有一个"大而全"的通用解决方案.各家框架也是各有千秋,以下是我了解 ...
- 第 10 章 容器监控 - 078 - Docker 最常用的监控方案
Docker 最常用的监控方案 当 Docker 部署规模逐步变大后,可视化监控容器环境的性能和健康状态将会变得越来越重要. Docker 自带的几个监控子命令: ps .top .stats 功能更 ...
- Kafka设计解析(二十三)关于Kafka监控方案的讨论
转载自 huxihx,原文链接 关于Kafka监控方案的讨论 目前Kafka监控方案看似很多,然而并没有一个“大而全”的通用解决方案.各家框架也是各有千秋,以下是我了解到的一些内容: 一.Kafka ...
- Linux云主机 监控方案浅析
1.为何需要监控 监控是运维工程师的眼睛,它可帮助运维工程师第一时间发现系统的问题. 对于服务器的整个生命周期,都要和监控打交道: 当有服务器上架,都需要加入比如CPU负载.内存.网络.磁盘等基础监控 ...
- NET 的 ELK 监控方案
NET 的 ELK 监控方案 https://www.jianshu.com/p/3c26695cfc38 背景就不多说了,谁家没有个几个十系统在跑啊.如何监控这几十个系统的运行状况,对于非运营人员来 ...
- 【译】Kubernetes监控实践(2):可行监控方案之Prometheus和Sensu
本文介绍两个可行的K8s监控方案:Prometheus和Sensu.两个方案都能全面提供系统级的监控数据,帮助开发人员跟踪K8s关键组件的性能.定位故障.接收预警. 拓展阅读:Kubernetes监控 ...
- 移动端性能监控方案Hertz
移动端性能监控方案Hertz 吴凯 瑞利 富强 徐宏 ·2016-12-19 16:10 性能问题是造成App用户流失的罪魁祸首之一.App的性能问题包括崩溃.网络请求错误或超时.响应速度慢.列表滚动 ...
随机推荐
- 一致性hash与CRUSH算法总结
相同之处:都解决了数据缓存系统中数据如何存储与路由. 不同之处:区别在于虚拟节点和物理节点的映射办法不同 由于一般的哈希函数返回一个int(32bit)型的hashCode.因此,可以将该哈希函数能够 ...
- 安全测试===Mysql 注入技巧学习 MySQL注入技巧(1)
默认存在的数据库: mysql 需要root权限读取 information_schema 在5以上的版本中存在 测试是否存在注入方法 假:表示查询是错误的 (MySQL 报错/返回页面与原来不同) ...
- servlet(6) - servlet总结 - 小易Java笔记
垂阅前必看: 这都是我总结的我觉得是学习servlet应该掌握的,我在学习期间也做了一个博客项目来让所学的知识得以巩固.下面就是博客项目链接.前面的servlet相关的笔记总汇,还有就是我把觉得在学习 ...
- 表单重置 jQuery
//重置 $('.reset-bottom').click(function(){ $('.mui-input-clear').attr('value','');//text类型 $('input[n ...
- 《Java编程思想》笔记 第十四章 类型信息
1.RTTI:在运行时识别一个对象类型 JAVA在运行时 有时要 识别对象和类的信息这个机制叫RTTI.Java提供了两种机制去做这件事.传统的RTTI 和 反射. 传统的RTTI 假定编译时就已经 ...
- Selenium2+python自动化41-绕过验证码(add_cookie)【转载】
前言 验证码这种问题是比较头疼的,对于验证码的处理,不要去想破解方法,这个验证码本来就是为了防止别人自动化登录的.如果你能破解,说明你们公司的验证码吗安全级别不高,那就需要提高级别了. 对于验证码,要 ...
- Mysql优化之——启用查询缓存
启用MySQL查询缓存可以极大地减低数据库服务器的CPU使用率,实际使用情况是:开启前CPU使用率120%左右,开启后降到了10%. 查看查询缓存情况: mysql> show variable ...
- 康托展开&逆展开算法笔记
康托展开(有关全排列) 康托展开:已知一个排列,求这个排列在全排列中是第几个 康托展开逆运算:已知在全排列中排第几,求这个排列 定义: X=an(n-1)!+an-1(n-2)!+...+ai(i-1 ...
- 5、Django实战第5天:首页和登录页面的配置
从这天开始我们需要用到前端源码,需要的朋友可以进行小额打赏(15元),打赏二维码在博客的右侧,打赏后可以凭截图联系463951510@qq.com,博主收到邮件后会立即回复发送所有源码素材,实战过程中 ...
- sed replace HEX sequence in your binary file:
Here is how to replace a HEX sequence in your binary file: $ sed 's/\x0D\x4D\x53\x48/\x0D\x0A\x4D\x5 ...