Arduino 基於OneNet的環境監測系統 資料上傳(三)
摘要
隨著電腦科學的快速發展, 以及網際網路技術的發展, 人機互動技術的研究向著使人和實驗室管理系統以更加舒服、更加自然、更加有效率的方式發展。智慧實驗室是一種自然符合實驗室管理人員習慣性的管理方式, 擁有有實驗室全景的直觀性, 通過各種感測器, 將實驗室的資料進行採集打包, 並且經過本地伺服器的資料融合演算法對資料處理過濾後,利用網際網路將資料傳輸到雲端伺服器, 再使用客戶端向雲端伺服器請求相應的資料, 並且顯示在客戶端的介面上。本系統是以Arduino開源控制板,結合感測器技術及HTTP請求對系統硬體構架,功能模組及軟體設計進行研究,系統通過溫溼度感測器,煙霧感測器,光照感測器等作為採集裝置,進行資訊採集和處理後,傳送給本地伺服器,本地伺服器對採集的資料進行演算法處理後,監測實驗室內環境是否異常,如若異常而產生相應的處理措施,並且通過WiFi模組傳送到雲端伺服器。Web客戶端和手機客戶端通過網路連線著雲端伺服器,可實時監測實驗室內的環境情況。經過測試,系統部署快速簡易,搭建成本較低,在擴充套件性、普及性、定製性和適用性方面具有較好的表現,有效的針對校園實驗室環境進行監測,增強裝置儀器的使用壽命
總體設計
系統由測量模組、資料採集與控制模組、資料處理與通訊模組、物聯網雲平臺模組等多個模組組成並實現了溫溼度、煙感、光照等實驗室環境資料資訊的採集和上報.測量模組包含多種感測器對煙感、溫度、溼度和光照資料進行感知測量採集,資料採集是通過Arduino控制板讀取感測器資料,Arduino控制板對資料經過中位值濾波法後,進行防脈衝干擾平均濾波法處理和過濾,利用通訊模組4G或WiFi網路傳輸資料至雲端伺服器,通過第三方物聯網平臺OneNET來實現資料的收集、處理和監控.同時,雲平臺的感測資料可以隨時通過OneNET進行呼叫,實時檢視實驗室環境的監控資訊,並可設定相應閾值實現自動報警功能,在異常環境下的裝置維護需要而進行斷電處理。系統以OneNET平臺的Web及手機APP作為客戶端,使用柱狀圖和折現圖及儀表盤作為顯示,直觀的明瞭的展示資料的變化,通過多組感測器採集資料進行資料的對比,提高系統的可靠性,系統在環境採集的同時,也實現了遠端控制裝置,進而達到加強實驗室的安全防範的目的。
系統具有可高度個性化採集資料節點、歷史資料,可靠性強、易擴充套件,行動式以及成本低等特點。
所需硬體
- Arduino UNO x2
- ESP8266-01s X2
- DHT11溫溼度感測器
- 4路繼電器模組
- MQ-2煙霧氣敏感測器模組
- RGB全綵燈
- 蜂鳴器
- 紅外接收模組
- 光線感測器
- 紅外遙控
Arduino UNO開發板:
ESP8266-01S:
DHT11溫溼度感測器:
4路繼電器模組:
MQ-2煙霧氣敏感測器模組:
RGB全綵燈:
蜂鳴器:
紅外接收模組:
光線感測器:
紅外遙控:
Arduino UNO擴充套件板設計:
實物圖:
功能述說
溫溼度、光線、煙霧感測器作為採集節點,負責採集溫度、溼度、光線、煙霧的資料,紅外接收模組負責接收紅外遙控的遙控訊號,ESP8266 WIFI模組負責連線OneNet模組,將採集節點的資料傳給OneNet伺服器。當溫度>50,溼度>80,煙霧>600 時,蜂鳴器發出報警,溫度報警RGB彩燈發出紅光,持續時間10s,如果10s內紅外遙控按下ok,則關閉報警。同理,溼度報警發出藍光,煙霧報警發出綠光
程式
Arduino UNO板1(資料上傳,環境監測資料)
#include <dht11.h> //引用dht11庫檔案,使得下面可以呼叫相關引數
#include <Metro.h>
#include <IRremote.h>//紅外
#include <IRremoteInt.h>
//#include <MsTimer2.h> //定時器庫的標頭檔案
#include <Adafruit_NeoPixel.h> //RGB
#include<pt.h>//宣告protothread
#include<PT_timer.h>//宣告pt.timer
#define MAX_LED 9
#define DHT11PIN 8 //定義溫溼度針腳號為8號引腳
#define DHT11PIN2 9 //定義溫溼度針腳號為9號引腳
#define MQ_2_1PIN A0 //定義煙霧1引腳為A0
#define MQ_2_2PIN A1 //定義煙霧2引腳為A1
#define BuzzerPIN A3 //定義蜂鳴器引腳A2
#define ButtonPIN 4 //定義復位按鍵引腳4
#define LightPIN A2 //定義光線感測器引腳A2
#define RGBPIN 5 //定義RGB燈引腳
#define SMO1PIN 7
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2,3);//RX=2,TX=3
Adafruit_NeoPixel strip = Adafruit_NeoPixel( MAX_LED, RGBPIN, NEO_RGB + NEO_KHZ800 );//長度,引腳,型別
dht11 DHT11; //例項化一個物件
dht11 DHTT11_2;
Metro T_Hmetro = Metro(2500); //把 blink1Metro 例項化 Metro 物件 ,並設定間隔時間
Metro timermetro=Metro(1000);
PT_timer servotimer1;
PT_timer servotimer2;//定義兩個計時器
PT_timer servotimer3;//繼電器的定時器
IRrecv irrecv(ButtonPIN);//紅外
decode_results results;//紅外
uint8_t c;
static struct pt pt1,pt2,pt_r1_on,pt_r2_on,pt_r3_on,pt_r1_off,pt_r2_off,pt_r3_off;//執行緒
int data=0;//取樣data繼電器資料
int data_Value;//演算法消抖後資料 防脈衝干擾平均濾波法
int H=49;//ASCII
int L=48;
int tem_Value,hum_Value,tem2_Value,hum2_Value,smo1_Value,smo2_Value,light;//濾波後
int tem_warn=0,hum_warn=0,smo_warn=0;
int Tem_Value,Hum_Value,Tem2_Value,Hum2_Value,Smo1_Value,Smo2_Value;//報警資料
bool B_Flag=true;
bool relay_all=false;
bool flag;//紅外狀態標識
bool relay_flag;//WiFi是否被佔用
int label;
int init_light=250;//初始亮度
int init_color = 0;//初始顏色
int key=0;
//bool close_warn=false;
//uint32_t color_green = strip.Color(255,0,0);
//uint32_t color_red = strip.Color(0,255,0);
//uint32_t color_blue = strip.Color(0,0,255);
//uint32_t color[] = {color_no,color_red,color_green,color_blue};
void setup() { //設定
Serial.begin(115200); //設定波特率引數
pinMode(DHT11PIN,INPUT); //定義輸出口
pinMode(DHT11PIN2,INPUT);
pinMode(MQ_2_1PIN,INPUT);
pinMode(MQ_2_2PIN,INPUT);
pinMode(BuzzerPIN,OUTPUT);
pinMode(RGBPIN,OUTPUT);
pinMode(SMO1PIN,INPUT);
pinMode(LightPIN,INPUT);
strip.setBrightness(init_light);
strip.setPixelColor(0, strip.Color(0,0,0));//G R B
irrecv.enableIRIn(); //初始化紅外遙控
mySerial.begin(115200); //軟串列埠波特率初始化
PT_INIT(&pt1);
PT_INIT(&pt2);//兩個執行緒初始化,其實就是pt->lc歸零
PT_INIT(&pt_r1_on);
PT_INIT(&pt_r2_on);
PT_INIT(&pt_r3_on);
PT_INIT(&pt_r1_off);
PT_INIT(&pt_r2_off);
PT_INIT(&pt_r3_off);
}
void loop() { //迴圈
if(timermetro.check()){
int chk = DHT11.read(DHT11PIN); //將讀取到的值賦給chk
int tem=(float)DHT11.temperature; //將溫度值賦值給tem
int hum=(float)DHT11.humidity; //將溼度值賦給hum
delay(10);
int T1=Filter(tem);
int H1=Filter(hum);
tem_Value=Filter2(T1);//經過Filter(tem)中位值濾波法後的溫度
hum_Value=Filter2(H1);
int chk2 = DHTT11_2.read(DHT11PIN2); //將讀取到的值賦給chk
int tem2=(float)DHTT11_2.temperature; //將溫度值賦值給tem
int hum2=(float)DHTT11_2.humidity; //將溼度值賦給hum
delay(10);
int T2=Filter(tem2);//經過Filter(tem)中位值濾波法後的溫度
int H2=Filter(hum2);
tem2_Value=Filter2(T2);
hum2_Value=Filter2(H2);
int smo1=analogRead(MQ_2_1PIN);
int smo2=analogRead(MQ_2_2PIN);
int S1=Filter(smo1);
int S2=Filter(smo2);
smo1_Value=Filter2(S1);
smo2_Value=Filter2(S2);
float light_=analogRead(LightPIN);
light=light_/10.24;
}
// Serial.println(light);
//if(hongwai(1)||hongwai(2)||hongwai(3)||hongwai(4)||hongwai(5)||hongwai(6)){
//
//}else{
//
//}
if(T_Hmetro.check()&&relay_flag){ //檢查blink1Metro間隔(我的理解是計時器每隔100毫秒就會返回true,就執行以下程式)
mySerial.println("POST http://api.heclouds.com/devices/500259133/datapoints?type=3 HTTP/1.1"); //打印出http協議post命令
mySerial.println("api-key: sWydCX=jX3RfgT3bYxaorgEbZ9o="); //apikey OneNet提供的key
mySerial.println("Host:api.heclouds.com"); //主機
mySerial.println("Connection:close"); //斷開連線
mySerial.println("Content-Length:69"); //傳送的位元組
mySerial.print("\r\n{\"TEM\":"); //換行 傳送格式{"TEM":tem,"HUM":hum}
mySerial.print(tem_Value); //列印溫度資料
mySerial.print(",\"HUM\":"); //傳送格式
mySerial.print(hum_Value); //列印溼度資料
mySerial.print(",\"TEM2\":"); //傳送格式
mySerial.print(tem2_Value); //列印溫度資料
mySerial.print(",\"HUM2\":"); //傳送格式
mySerial.print(hum2_Value); //列印溼度資料
mySerial.print(",\"SMO\":"); //傳送格式
mySerial.print(smo1_Value); //列印溫度資料
mySerial.print(",\"SMO2\":"); //傳送格式
mySerial.print(smo2_Value); //列印溼度資料
mySerial.print(",\"LIG\":"); //傳送格式
mySerial.print(light); //列印溼度資料
mySerial.print("}"); //打印出}
Tem_Value=tem_Value;
Tem2_Value=tem2_Value;
Hum_Value=hum_Value;
Hum2_Value=hum2_Value;
Smo1_Value=smo1_Value;
Smo2_Value=smo2_Value;
// tem_warn=(tem_Value+tem2_Value)/2;//溫度1和溫度2 求平均用於警報觸發
// hum_warn=(hum_Value+hum2_Value)/2;
// smo_warn=(smo1_Value+smo2_Value)/2;
}
if(Tem_Value>=50||Tem2_Value>=50){
tem_warn=255;
}else{
tem_warn=0;
}
//Serial.println();
//Serial.print(" t1 ");
//Serial.print(tem_Value);
//Serial.print(" t2 ");
//Serial.print(tem2_Value);
//Serial.print(" h1 ");
//Serial.print(hum_Value);
//Serial.print(" h2 ");
//Serial.print(hum2_Value);
//Serial.print(" s1 ");
//Serial.print(smo1_Value);
//Serial.print(" s2 ");
//Serial.print(smo2_Value);
if(Hum_Value>=80||Hum2_Value>=80){
hum_warn=255;
}else{
hum_warn=0;
}
if(Smo1_Value>=600||Smo2_Value>=600){
smo_warn=255;
}else{
smo_warn=0;
}
mission1(&pt1);//執行緒1 檢測是否發生溫度,溼度,煙霧過高報警
mission2(&pt2);//執行緒2 檢測紅外遙控是否按下OK 按下關閉警報
if(relay_all){//是否發生警報
Relay_all();//關閉所有裝置
}
mission_r1_on(&pt_r1_on);
mission_r1_off(&pt_r1_off);
mission_r2_on(&pt_r2_on);
mission_r2_off(&pt_r2_off);
mission_r3_on(&pt_r3_on);
mission_r3_off(&pt_r3_off);
remote_control();
Serial.println(key);
//if(smo1_Value>=600||smo2_Value&&B_Flag){
// Serial.println("Buzzer");
// for(int i=200;i<=800;i++){
// tone(BuzzerPIN,i); //在四號埠輸出頻率
// delay(5); //該頻率維持5毫秒
// }
// delay(2000); //最高頻率下維持4秒鐘
// for(int i=800;i>=200;i--)
// {
// tone(BuzzerPIN,i);
// delay(10);
// }
//}else{
// B_Flag=false;
//}
if(digitalRead(ButtonPIN)==LOW){
B_Flag=false;
// Serial.println("LOW");
}
}
//////////////////////////////////////////////////
void remote_control(){
switch(key){
case 1:Relay1_on();break;
case 2:Relay2_on();break;
case 3:Relay3_on();break;
case 4:Relay1_off();break;
case 5:Relay2_off();break;
case 6:Relay3_off();break;
}
}
static int mission1(struct pt *pt)
{
PT_BEGIN(pt);//執行緒開始
while(1)
{
digitalWrite(BuzzerPIN,LOW);//蜂鳴器不響起
relay_all=false;
color_rgb(0,0,0);
PT_WAIT_UNTIL(pt,Smo1_Value>=600||Smo2_Value>=600||Tem_Value>=50||Tem2_Value>=50||Hum_Value>=80||Hum2_Value>=80);//等煙霧濃度過大
relay_all=true;
color_rgb(tem_warn,smo_warn,hum_warn);//指示燈 red green blue
digitalWrite(BuzzerPIN,HIGH);//蜂鳴器響起
servotimer1.setTimer(10000);//設定跪10秒,這裡單位1為一微妙
PT_WAIT_UNTIL(pt,(servotimer1.Expired()));//當時間溢位,這裡是10秒就結束
}
PT_END(pt);//執行緒結束
}
static int mission2(struct pt *pt)
{
PT_BEGIN(pt);
while(1)
{
digitalWrite(BuzzerPIN,LOW);//蜂鳴器不響起
color_rgb(0,0,0);
PT_WAIT_UNTIL(pt,hongwai(15));
digitalWrite(BuzzerPIN,LOW);//蜂鳴器不響起
// relay_all=false;
color_rgb(0,0,0);
PT_WAIT_UNTIL(pt,(servotimer1.Expired()));
}
PT_END(pt);
}
static int mission_r1_on(struct pt *pt)
{
PT_BEGIN(pt);
while(1)
{
key=0;
relay_flag=true;
PT_WAIT_UNTIL(pt,hongwai(1));
relay_flag=false;
key=1;
servotimer3.setTimer(5000);//設定跪2秒,這裡單位1為一微妙
PT_WAIT_UNTIL(pt,(servotimer3.Expired()));
}
PT_END(pt);
}
static int mission_r2_on(struct pt *pt)
{
PT_BEGIN(pt);
while(1)
{
key=0;
relay_flag=true;
PT_WAIT_UNTIL(pt,hongwai(2));
relay_flag=false;
key=2;
servotimer3.setTimer(5000);//設定跪2秒,這裡單位1為一微妙
PT_WAIT_UNTIL(pt,(servotimer3.Expired()));
}
PT_END(pt);
}
static int mission_r3_on(struct pt *pt)
{
PT_BEGIN(pt);
while(1)
{
key=0;
relay_flag=true;
PT_WAIT_UNTIL(pt,hongwai(3));
relay_flag=false;
key=3;
servotimer3.setTimer(5000);//設定跪2秒,這裡單位1為一微妙
PT_WAIT_UNTIL(pt,(servotimer3.Expired()));
}
PT_END(pt);
}
static int mission_r1_off(struct pt *pt)
{
PT_BEGIN(pt);
while(1)
{
key=0;
relay_flag=true;
PT_WAIT_UNTIL(pt,hongwai(4));
relay_flag=false;
key=4;
servotimer3.setTimer(5000);//設定跪2秒,這裡單位1為一微妙
PT_WAIT_UNTIL(pt,(servotimer3.Expired()));
}
PT_END(pt);
}
static int mission_r2_off(struct pt *pt)
{
PT_BEGIN(pt);
while(1)
{
key=0;
relay_flag=true;
PT_WAIT_UNTIL(pt,hongwai(5));
relay_flag=false;
key=5;
servotimer3.setTimer(5000);//設定跪2秒,這裡單位1為一微妙
PT_WAIT_UNTIL(pt,(servotimer3.Expired()));
}
PT_END(pt);
}
static int mission_r3_off(struct pt *pt)
{
PT_BEGIN(pt);
while(1)
{
key=0;
relay_flag=true;
PT_WAIT_UNTIL(pt,hongwai(6));
relay_flag=false;
key=6;
servotimer3.setTimer(5000);//設定跪2秒,這裡單位1為一微妙
PT_WAIT_UNTIL(pt,(servotimer3.Expired()));
}
PT_END(pt);
}
void color_rgb(int r,int g,int b){
strip.setPixelColor(0, strip.Color(g,r,b));
strip.show();
}
void Relay_all()
{
mySerial.println("POST http://api.heclouds.com/devices/500259133/datapoints?type=3 HTTP/1.1"); //打印出http協議post命令
mySerial.println("api-key: sWydCX=jX3RfgT3bYxaorgEbZ9o="); //apikey OneNet提供的key
mySerial.println("Host:api.heclouds.com"); //主機
mySerial.println("Connection:close"); //斷開連線
mySerial.println("Content-Length:39"); //傳送的位元組
mySerial.print("\r\n{\"Relay\":"); //換行 傳送格式{"Relay":L1,"Relay2":L2}
mySerial.print(0); //列印溫度資料
mySerial.print(",\"Relay2\":"); //傳送格式
mySerial.print(9); //列印溼度資料
mySerial.print(",\"Relay3\":"); //傳送格式
mySerial.print(4); //列印溼度資料
mySerial.print("}");
}
void Relay1_on(){
mySerial.println("POST http://api.heclouds.com/devices/500259133/datapoints?type=3 HTTP/1.1"); //打印出http協議post命令
mySerial.println("api-key: sWydCX=jX3RfgT3bYxaorgEbZ9o="); //apikey OneNet提供的key
mySerial.println("Host:api.heclouds.com"); //主機
mySerial.println("Connection:close"); //斷開連線
mySerial.println("Content-Length:24"); //傳送的位元組
mySerial.print("\r\n{\"Relay\":"); //換行 傳送格式{"Relay":L1,"Relay2":L2}
mySerial.print(2); //列印溫度資料
mySerial.print("}");
}
void Relay2_on(){
mySerial.println("POST http://api.heclouds.com/devices/500259133/datapoints?type=3 HTTP/1.1"); //打印出http協議post命令
mySerial.println("api-key: sWydCX=jX3RfgT3bYxaorgEbZ9o="); //apikey OneNet提供的key
mySerial.println("Host:api.heclouds.com"); //主機
mySerial.println("Connection:close"); //斷開連線
mySerial.println("Content-Length:24"); //傳送的位元組
mySerial.print("\r\n{\"Relay2\":"); //換行 傳送格式{"Relay":L1,"Relay2":L2}
mySerial.print(3); //列印溫度資料
mySerial.print("}");
}
void Relay3_on(){
mySerial.println("POST http://api.heclouds.com/devices/500259133/datapoints?type=3 HTTP/1.1"); //打印出http協議post命令
mySerial.println("api-key: sWydCX=jX3RfgT3bYxaorgEbZ9o="); //apikey OneNet提供的key
mySerial.println("Host:api.heclouds.com"); //主機
mySerial.println("Connection:close"); //斷開連線
mySerial.println("Content-Length:24"); //傳送的位元組
mySerial.print("\r\n{\"Relay3\":"); //換行 傳送格式{"Relay":L1,"Relay2":L2}
mySerial.print(6); //列印溫度資料
mySerial.print("}");
}
void Relay1_off(){
mySerial.println("POST http://api.heclouds.com/devices/500259133/datapoints?type=3 HTTP/1.1"); //打印出http協議post命令
mySerial.println("api-key: sWydCX=jX3RfgT3bYxaorgEbZ9o="); //apikey OneNet提供的key
mySerial.println("Host:api.heclouds.com"); //主機
mySerial.println("Connection:close"); //斷開連線
mySerial.println("Content-Length:24"); //傳送的位元組
mySerial.print("\r\n{\"Relay\":"); //換行 傳送格式{"Relay":L1,"Relay2":L2}
mySerial.print(0); //列印溫度資料
mySerial.print("}");
}
void Relay2_off(){
mySerial.println("POST http://api.heclouds.com/devices/500259133/datapoints?type=3 HTTP/1.1"); //打印出http協議post命令
mySerial.println("api-key: sWydCX=jX3RfgT3bYxaorgEbZ9o="); //apikey OneNet提供的key
mySerial.println("Host:api.heclouds.com"); //主機
mySerial.println("Connection:close"); //斷開連線
mySerial.println("Content-Length:24"); //傳送的位元組
mySerial.print("\r\n{\"Relay2\":"); //換行 傳送格式{"Relay":L1,"Relay2":L2}
mySerial.print(9); //列印溫度資料
mySerial.print("}");
}
void Relay3_off(){
mySerial.println("POST http://api.heclouds.com/devices/500259133/datapoints?type=3 HTTP/1.1"); //打印出http協議post命令
mySerial.println("api-key: sWydCX=jX3RfgT3bYxaorgEbZ9o="); //apikey OneNet提供的key
mySerial.println("Host:api.heclouds.com"); //主機
mySerial.println("Connection:close"); //斷開連線
mySerial.println("Content-Length:24"); //傳送的位元組
mySerial.print("\r\n{\"Relay3\":"); //換行 傳送格式{"Relay":L1,"Relay2":L2}
mySerial.print(4); //列印溫度資料
mySerial.print("}");
}
// 中位值濾波法
#define FILTER_N 5
int Filter(int getData) {
int filter_buf[FILTER_N];
int i, j;
int filter_temp;
for(i = 0; i < FILTER_N; i++) {
filter_buf[i] = getData;
delay(1);
}
// 取樣值從小到大排列(冒泡法)
for(j = 0; j < FILTER_N - 1; j++) {
for(i = 0; i < FILTER_N - 1 - j; i++) {
if(filter_buf[i] > filter_buf[i + 1]) {
filter_temp = filter_buf[i];
filter_buf[i] = filter_buf[i + 1];
filter_buf[i + 1] = filter_temp;
}
}
}
return filter_buf[(FILTER_N - 1) / 2];
}
// 中位值平均濾波法(又稱防脈衝干擾平均濾波法)(演算法1)
#define FILTER_N 6
int Filter2(int GetData2) {
int i, j;
int filter_temp, filter_sum = 0;
int filter_buf[FILTER_N];
for(i = 0; i < FILTER_N; i++) {
filter_buf[i] = GetData2;
delay(1);
}
// 取樣值從小到大排列(冒泡法)
for(j = 0; j < FILTER_N - 1; j++) {
for(i = 0; i < FILTER_N - 1 - j; i++) {
if(filter_buf[i] > filter_buf[i + 1]) {
filter_temp = filter_buf[i];
filter_buf[i] = filter_buf[i + 1];
filter_buf[i + 1] = filter_temp;
}
}
}
// 去除最大最小極值後求平均
for(i = 1; i < FILTER_N - 1; i++) filter_sum += filter_buf[i];
return filter_sum / (FILTER_N - 2);
}
bool hongwai(int r){
flag=false;
if (irrecv.decode(&results)) {
// Serial.println(results.value,HEX);
switch(results.value){
//1
case 0xFFA25D:
label=1;
break;
//2
case 0xFF629D:
label=2;
break;
//3
case 0xFFE21D:
label=3;
break;
//4
case 0xFF22DD:
label=4;
break;
//5
case 0xFF02FD:
Serial.println("5");
label=5;
break;
//6
case 0xFFC23D:
label=6;
break;
//7
case 0xFFE01F:
label=7;
break;
//8
case 0xFFA857:
label=8;
break;
//9
case 0xFF906F:
label=9;
break;
//0
case 0xFF9867:
label=0;
break;
//up
case 0xFF18E7:
label=11;
break;
//down
case 0xFF4AB5:
label=12;
break;
//left
case 0xFF10EF:
label=13;
break;
//right
case 0xFF5AA5:
label=14;
break;
//ok
case 0xFF38C7:
label=15;
break;
//*
case 0xFF6897:
label=16;
break;
//#
case 0xFFB04F:
label=17;
break;
//else
default:
break;
}
irrecv.resume(); // 接收下一個值
}
if(label==r) {
flag=true;//確定返回
label=99;//復位
}
return flag;
}
/*
A、名稱:中位值平均濾波法(又稱防脈衝干擾平均濾波法)
B、方法:
採一組佇列去掉最大值和最小值後取平均值,
相當於“中位值濾波法”+“算術平均濾波法”。
連續取樣N個數據,去掉一個最大值和一個最小值,
然後計算N-2個數據的算術平均值。
N值的選取:3-14。
C、優點:
融合了“中位值濾波法”+“算術平均濾波法”兩種濾波法的優點。
對於偶然出現的脈衝性干擾,可消除由其所引起的取樣值偏差。
對週期干擾有良好的抑制作用。
平滑度高,適於高頻振盪的系統。
D、缺點:
計算速度較慢,和算術平均濾波法一樣。
比較浪費RAM。
*/
/*
A、名稱:中位值濾波法
B、方法:
連續取樣N次(N取奇數),把N次取樣值按大小排列,
取中間值為本次有效值。
C、優點:
能有效克服因偶然因素引起的波動干擾;
對溫度、液位的變化緩慢的被測引數有良好的濾波效果。
D、缺點:
對流量、速度等快速變化的引數不宜。
*/
/***** POST命令格式
POST http://api.heclouds.com/devices/500259133/datapoints?type=3 HTTP/1.1
api-key: sWydCX=jX3RfgT3bYxaorgEbZ9o=
Host:api.heclouds.com
Connection:close
Content-Length:19
{"TEM":22,"HUM":52}
***** GET Realy
GET http://api.heclouds.com/devices/500259133/datastreams/Relay HTTP/1.1
api-key: sWydCX=jX3RfgT3bYxaorgEbZ9o=
Host:api.heclouds.com
Connection:close
*/
效果
客戶端視訊:https://v.youku.com/v_show/id_XMzk2NTE5MTk5Mg==.html?spm=a2h3j.8428770.3416059.1
OneNet:https://open.iot.10086.cn/iotbox/appsquare/appview?openid=5ca523334a5a9b576e316a586de6d738
QQ:690333105
驗證資訊:Arduino