Arduinoにおけるマルチセンサデータ収集の書き方
11279 ワード
今日家のArduinoを出してまた游びに来て、最近のネット上のいくつかの资料も见ました.今のネット上の文章はまだこのどのように使うか、それはどのように使うかの段階にとどまっているような気がします.合わせた例は少ない.では、今日書いたコードを貼って、レンガを撮るのを参考にします.
Arduinoは結局C言語の基礎です.だからプログラムの構造はやはり重要です.loop関数では,取得と具体的な処理を分ける書き方を持つ.これはプログラムの後続のメンテナンスにとって重要であるべきである.
もう1つは,C関数が配列を返すことである.この問題は従来のCで解決されたが,Arduino Cではやや異なるようだ.読者にもっと良い方法があれば、指摘を歓迎します.
次のくだらないことは言わないで、直接コードを貼ってください.
Arduinoは結局C言語の基礎です.だからプログラムの構造はやはり重要です.loop関数では,取得と具体的な処理を分ける書き方を持つ.これはプログラムの後続のメンテナンスにとって重要であるべきである.
もう1つは,C関数が配列を返すことである.この問題は従来のCで解決されたが,Arduino Cではやや異なるようだ.読者にもっと良い方法があれば、指摘を歓迎します.
次のくだらないことは言わないで、直接コードを貼ってください.
/**
*
* : 1、
* 2、
* 3、
* :1.0
* :
* :2015 12 18
*/
/* */
#define DHT_PIN 2 /* IO */
#define TRG_PIN 3 /* O */
#define ECH_PIN 12 /* I */
#define ALM_PIN 4 /* O */
#define HMC_PIN 8 /* I */
/* */
#define ALARM_COUNTER 180; /* ,15 */
void setup() {
Serial.begin(9600);
Serial.println("===SETUPED===");
}
void loop() {
/* 5 */
delay(5000);
/* */
int *DHT = getTemperatureAndHumidity();
/* */
int distance = getDistance();
/* */
int humanCheck = getHumanInfo();
/* , */
if(humanCheck <= 0){
digitalWrite(ALM_PIN, HIGH);
}else{
digitalWrite(ALM_PIN, LOW);
}
/* */
/* */
Serial.print("Distance:");
Serial.print(distance);
Serial.println("cm.");
/* */
Serial.print("Humidity:");
Serial.print(*DHT);
Serial.println("%.");
/* */
Serial.print("Temperature:");
Serial.print(*(DHT+1));
Serial.println("C.");
/* */
Serial.print("Nobody Check Counter:");
Serial.println(humanCheck);
/* */
delete[] DHT;
}
/**
*
* :
* :
* = ALARM_COUNTER
*
int getHumanInfo(){
static int alarmCounter = ALARM_COUNTER; //
/* */
pinMode(ALM_PIN, OUTPUT);
pinMode(HMC_PIN, INPUT);
/* , 。 */
if(digitalRead(HMC_PIN) == HIGH){
alarmCounter = ALARM_COUNTER;
}else{
/* , */
alarmCounter--;
/* */
if(alarmCounter <= 0){
alarmCounter = 0;
}
}
/* */
return alarmCounter;
}
/**
* DHT11
* :
* : [0] ,[1]
* :1.0
* : ,
*/
int* getTemperatureAndHumidity(){
int temperature; /* */
int humidity; /* */
int tokenCheck; /* */
int chr[40] = {0}; /* */
unsigned long time; /* */
int *DHT = new int[2]; /* */
/* , */
while(pushSingle4DHT11()){};
/* (40 )*/
for(int i = 0; i < 40; i++){
/* , */
while(digitalRead(DHT_PIN) == LOW){}
/* */
time = micros();
/* , */
while(digitalRead(DHT_PIN) == HIGH){}
/* 50um, 1, 0 */
if(micros() - time > 50){
chr[i] = 1;
}else{
chr[i] = 0;
}
}
/* */
humidity = chr[0] * 128 + chr[1] * 64 + chr[2] * 32 + chr[3] * 16 + chr[4] * 8 + chr[5] * 4 + chr[6] * 2 + chr[7];
/* */
temperature = chr[16] * 128 + chr[17] * 64 + chr[18] * 32 + chr[19] * 16 + chr[20] * 8 + chr[21] * 4 + chr[22] * 2 + chr[23];
/* */
tokenCheck = chr[32] * 128 + chr[33] * 64 + chr[34] * 32 + chr[35] * 16 + chr[36] * 8 + chr[37] * 4 + chr[38] * 2 + chr[39];
/* , */
if( humidity + temperature == tokenCheck){
DHT[0] = humidity;
DHT[1] = temperature;
}
/* */
return DHT;
}
/**
*
* :
* :true --
*/
boolean pushSingle4DHT11(){
int waitingCounter; /* */
/* 40 */
delay(40);
/* IO */
pinMode(DHT_PIN, OUTPUT);
/* 1、 20 */
digitalWrite(DHT_PIN, LOW);
delay(20);
/* 2、 40 */
digitalWrite(DHT_PIN, HIGH);
delayMicroseconds(40);
/* 3、 , */
digitalWrite(DHT_PIN, LOW);
pinMode(DHT_PIN, INPUT);
/* */
/* , , */
/* */
waitingCounter = 10000;
while(digitalRead(DHT_PIN) != HIGH){
if(waitingCounter-- == 0){
return true;
}
}
/* */
waitingCounter = 30000;
while(digitalRead(DHT_PIN) != LOW){
if(waitingCounter-- == 0){
return true;
}
}
}
/**
*
* :
* : , ,
*/
float getDistance(){
/* */
pinMode(TRG_PIN, OUTPUT);
pinMode(ECH_PIN, INPUT);
/* */
digitalWrite(TRG_PIN, LOW);
delayMicroseconds(2);
/* 10 */
digitalWrite(TRG_PIN, HIGH);
delayMicroseconds(10);
/* */
digitalWrite(TRG_PIN, LOW);
/* */
return pulseIn(ECH_PIN, HIGH) / 58.00;
}