此項目沒有使用中斷,代碼可以運行
為了讀者有更好的體驗,筆者進行了詳細的注釋

創作不易,請讀者給個小心心吧

所有庫文件筆者已經打包請在上面的文件下載

2021 12 31
by-王思源
Arduino源程序如下:
- #include "pitches.h"//調用蜂鳴器頭文件
- #include "dht11.h"//調用溫濕度頭文件
- #include "new.h" //調用頭文件
- #include "Wire.h"//調用總線文件
- #include "Servo.h"//調用伺服馬達文件
- #include "LiquidCrystal_I2C.h"//調用1602文件
- #define DHT11PIN A0 //定意溫濕度的I/O口是A0
- dht11 dht11; //初始化dhrll
- Servo myservo; //初始化伺服電機
- int ledpin = 3;
- int TrigPin = 4; //定義超聲波的接口
- int EchoPin = 5;
- int tonepin = 6;
- int dianji = 7;
- int lighttrail = A1;
- int mx =A2;
- float distance;
- int swi = A4;
- int mxq;
- LiquidCrystal_I2C mylcd(0x27, 16, 2);//、、、、、、、、、、、、、、、用了scl和sda、、、、、、、、、0和1接口不能用、、、、、、、、、、、、、
- //初始化1602
- int pp;
- void tempearture(int temp) {
- Serial.println(temp);
- if (temp > 15) {
- digitalWrite(dianji, LOW);
- digitalWrite(ledpin, HIGH);
- // int length = sizeof(tune) / sizeof(tune[0]);//、、、、、、、、、、數組長度提取
- // for (int x = 0; x < length; x++) //循環音符的次數
- // {
- // tone(tonepin, tune[x]); //依次播放tune數組元素,即每個音符
- // delay(400 * duration[x]); //每個音符持續的時間,即節拍duration,400是調整時間的越大,曲子速度越慢,越小曲子速度越快
- // noTone(tonepin);//停止當前音符,進入下一音符
- // }
- if (!temp) {
- digitalWrite(dianji, LOW);
- }
- } else
- {
- digitalWrite(dianji, HIGH);
- }
- }
- void dis(float distance,float mqx) {
- Serial.print(distance);
- Serial.print("m");
- Serial.println();
- if (distance < 0.5)
- {
- digitalWrite(ledpin, HIGH);
- Serial.println("燈亮");
- for (int thisNote = 0; thisNote < 8; thisNote++) {
- int noteDuration = 1000 / noteDurations[thisNote];
- tone(tonepin, tune[thisNote], noteDuration);
- int pauseBetweenNotes = noteDuration * 1.30;
- delay(pauseBetweenNotes);
- noTone(17);
- }
- }
- if (mqx >20)
- {
- digitalWrite(ledpin, HIGH);
- Serial.println("燈亮");
- for (int thisNote = 0; thisNote < 8; thisNote++) {
- int noteDuration = 1000 / noteDurations[thisNote];
- tone(tonepin, tune[thisNote], noteDuration);
- int pauseBetweenNotes = noteDuration * 1.30;
- delay(pauseBetweenNotes);
- noTone(17);
- }
- }
- else
- {
- digitalWrite(ledpin, LOW);
- Serial.println("燈滅");
- }
- }
- void tempss(int pp, int hump, float distance) {
- mylcd.setCursor(0, 0);
- mylcd.print("T :");
- mylcd.setCursor(4, 0);
- mylcd.print(pp);
- mylcd.setCursor(0, 1);
- mylcd.print("H :");
- mylcd.setCursor(4, 1);
- mylcd.print(hump);
- mylcd.setCursor(7, 0);
- mylcd.print("D :");
- mylcd.setCursor(10, 0);
- mylcd.print(distance);
- }
- void setup() //建立函數
- {
- mylcd.init(); //、、、、、、、、、、、、、、、、、、、、、、、初始化liquidcrytal_2c
- mylcd.backlight();
- myservo.attach(9);
- pinMode(dianji, OUTPUT);
- pinMode(ledpin, OUTPUT);
- pinMode(TrigPin, OUTPUT);
- pinMode(EchoPin, INPUT);
- pinMode(mx, INPUT);
- pinMode(swi,INPUT);
- Serial.begin(9600);
- Serial.println();
- }
- void loop() //、、、、、、、、、、、、、、、、、、、、、、、、主函數
- {
- int cc = analogRead(swi);
- int mxq = analogRead(mx);
- pp= (swi*0.0048828125*100);
- Serial.println("lailia");
- Serial.println(pp);
- digitalWrite(TrigPin, LOW);
- delayMicroseconds(2);
- digitalWrite(TrigPin, HIGH);
- delayMicroseconds(10);
- digitalWrite(TrigPin, LOW);
- distance = pulseIn(EchoPin, HIGH) / 58.00 / 100;//、、、、、、、、、、距離計算
- Serial.println("\n");
- dht11.read(DHT11PIN); //、、、、、、、、、、、、、、、、、、、、、、讀取dth11的溫度以便于復賦值
- Serial.print("濕度 (%): ");
- Serial.println((float)dht11.humidity, 4);
- Serial.print("溫度 (oC): ");
- Serial.println((float)dht11.temperature, 4);
- // int temp = (float)dht11.temperature;
- int hump = (float)dht11.humidity;
- tempearture(pp); //、、、、、、、、、、、、、、、、、、、、、👉溫度控制如果溫度過高會開啟溫度過高保護
- tempss(pp, hump, distance); //、、、、、、、、、、、、、、、、、 👉液晶屏顯示,船了三個參數,分別是溫度濕度還有距離
- dis(distance,mxq); //、、、、、、、、、、、、、、、、、、、、、👉距離函數如果距離過高會開啟蜂鳴器
- int val = analogRead(lighttrail); // reads the value of the potentiometer (value between 0 and 1023)
- val = map(val, 0, 100, 100, 0); // scale it for use with the servo (value between 0 and 180)
- myservo.write(val);
- delay(900);
- }
復制代碼 new.h
- double Fahrenheit(double celsius)
- {
- return 1.8 * celsius + 32;
- } //攝氏溫度度轉化為華氏溫度
-
- double Kelvin(double celsius)
- {
- return celsius + 273.15;
- } //攝氏溫度轉化為開氏溫度
-
- // 露點(點在此溫度時,空氣飽和并產生露珠)
- // 參考: http://wahiduddin.net/calc/density_algorithms.htm
- double dewPoint(double celsius, double humidity)
- {
- double A0= 373.15/(273.15 + celsius);
- double SUM = -7.90298 * (A0-1);
- SUM += 5.02808 * log10(A0);
- SUM += -1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ;
- SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ;
- SUM += log10(1013.246);
- double VP = pow(10, SUM-3) * humidity;
- double T = log(VP/0.61078); // temp var
- return (241.88 * T) / (17.558-T);
- }
-
- // 快速計算露點,速度是5倍dewPoint()
- // 參考: http://en.wikipedia.org/wiki/Dew_point
- double dewPointFast(double celsius, double humidity)
- {
- double a = 17.271;
- double b = 237.7;
- double temp = (a * celsius) / (b + celsius) + log(humidity/100);
- double Td = (b * temp) / (a - temp);
- return Td;
- }
復制代碼
pitches.h
- #define NOTE_B0 31
- #define NOTE_C1 33
- #define NOTE_CS1 35
- #define NOTE_D1 37
- #define NOTE_DS1 39
- #define NOTE_E1 41
- #define NOTE_F1 44
- #define NOTE_FS1 46
- #define NOTE_G1 49
- #define NOTE_GS1 52
- #define NOTE_A1 55
- #define NOTE_AS1 58
- #define NOTE_B1 62
- #define NOTE_C2 65
- #define NOTE_CS2 69
- #define NOTE_D2 73
- #define NOTE_DS2 78
- #define NOTE_E2 82
- #define NOTE_F2 87
- #define NOTE_FS2 93
- #define NOTE_G2 98
- #define NOTE_GS2 104
- #define NOTE_A2 110
- #define NOTE_AS2 117
- #define NOTE_B2 123
- #define NOTE_C3 131
- #define NOTE_CS3 139
- #define NOTE_D3 147
- #define NOTE_DS3 156
- #define NOTE_E3 165
- #define NOTE_F3 175
- #define NOTE_FS3 185
- #define NOTE_G3 196
- #define NOTE_GS3 208
- #define NOTE_A3 220
- #define NOTE_AS3 233
- #define NOTE_B3 247
- #define NOTE_C4 262
- #define NOTE_CS4 277
- #define NOTE_D4 294
- #define NOTE_DS4 311
- #define NOTE_E4 330
- #define NOTE_F4 349
- #define NOTE_FS4 370
- #define NOTE_G4 392
- #define NOTE_GS4 415
- #define NOTE_A4 440
- #define NOTE_AS4 466
- #define NOTE_B4 494
- #define NOTE_C5 523
- #define NOTE_CS5 554
- #define NOTE_D5 587
- #define NOTE_DS5 622
- #define NOTE_E5 659
- #define NOTE_F5 698
- #define NOTE_FS5 740
- #define NOTE_G5 784
- #define NOTE_GS5 831
- #define NOTE_A5 880
- #define NOTE_AS5 932
- #define NOTE_B5 988
- #define NOTE_C6 1047
- #define NOTE_CS6 1109
- #define NOTE_D6 1175
- #define NOTE_DS6 1245
- #define NOTE_E6 1319
- #define NOTE_F6 1397
- #define NOTE_FS6 1480
- #define NOTE_G6 1568
- #define NOTE_GS6 1661
- #define NOTE_A6 1760
- #define NOTE_AS6 1865
- #define NOTE_B6 1976
- #define NOTE_C7 2093
- #define NOTE_CS7 2217
- #define NOTE_D7 2349
- #define NOTE_DS7 2489
- #define NOTE_E7 2637
- #define NOTE_F7 2794
- #define NOTE_FS7 2960
- #define NOTE_G7 3136
- #define NOTE_GS7 3322
- #define NOTE_A7 3520
- #define NOTE_AS7 3729
- #define NOTE_B7 3951
- #define NOTE_C8 4186
- #define NOTE_CS8 4435
- #define NOTE_D8 4699
- #define NOTE_DS8 4978
- #define NOTE_D0 -1
- #define NOTE_D1 294
- #define NOTE_D2 330
- #define NOTE_D3 350
- #define NOTE_D4 393
- #define NOTE_D5 441
- #define NOTE_D6 495
- #define NOTE_D7 556
- #define NOTE_DL1 147
- #define NOTE_DL2 165
- #define NOTE_DL3 175
- #define NOTE_DL4 196
- #define NOTE_DL5 221
- #define NOTE_DL6 248
- #define NOTE_DL7 278
- #define NOTE_DH1 589
- #define NOTE_DH2 661
- #define NOTE_DH3 700
- #define NOTE_DH4 786
- #define NOTE_DH5 882
- #define NOTE_DH6 990
- #define NOTE_DH7 112
- #define WHOLE 1
- #define HALF 0.5
- #define QUARTER 0.25
- #define EIGHTH 0.25
- #define SIXTEENTH 0.625
- int melody[] = {
- NOTE_C4, NOTE_G3, NOTE_GS3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_DS8
- };
- int noteDurations[] = {
- 4, 8, 8, 4, 4, 4, 4, 4
- };
- int tune[] =
- {
- NOTE_DH1, NOTE_D6, NOTE_D5, NOTE_D6, NOTE_D0,
- NOTE_DH1, NOTE_D6, NOTE_D5, NOTE_DH1, NOTE_D6, NOTE_D0, NOTE_D6,
- NOTE_D6, NOTE_D6, NOTE_D5, NOTE_D6, NOTE_D0, NOTE_D6,
- NOTE_DH1, NOTE_D6, NOTE_D5, NOTE_DH1, NOTE_D6, NOTE_D0,
- NOTE_D1, NOTE_D1, NOTE_D3,
- NOTE_D1, NOTE_D1, NOTE_D3, NOTE_D0,
- NOTE_D6, NOTE_D6, NOTE_D6, NOTE_D5, NOTE_D6,
- NOTE_D5, NOTE_D1, NOTE_D3, NOTE_D0,
- NOTE_DH1, NOTE_D6, NOTE_D6, NOTE_D5, NOTE_D6,
- NOTE_D5, NOTE_D1, NOTE_D2, NOTE_D0,
- NOTE_D7, NOTE_D7, NOTE_D5, NOTE_D3,
- NOTE_D5,
- NOTE_DH1, NOTE_D0, NOTE_D6, NOTE_D6, NOTE_D5, NOTE_D5, NOTE_D6, NOTE_D6,
- NOTE_D0, NOTE_D5, NOTE_D1, NOTE_D3, NOTE_D0,
- NOTE_DH1, NOTE_D0, NOTE_D6, NOTE_D6, NOTE_D5, NOTE_D5, NOTE_D6, NOTE_D6,
- NOTE_D0, NOTE_D5, NOTE_D1, NOTE_D2, NOTE_D0,
- NOTE_D3, NOTE_D3, NOTE_D1, NOTE_DL6,
- NOTE_D1,
- NOTE_D3, NOTE_D5, NOTE_D6, NOTE_D6,
- NOTE_D3, NOTE_D5, NOTE_D6, NOTE_D6,
- NOTE_DH1, NOTE_D0, NOTE_D7, NOTE_D5,
- NOTE_D6,
- };
- //曲子的節拍,即音符持續時間
- float duration[] =
- {
- 1, 1, 0.5, 0.5, 1,
- 0.5, 0.5, 0.5, 0.5, 1, 0.5, 0.5,
- 0.5, 1, 0.5, 1, 0.5, 0.5,
- 0.5, 0.5, 0.5, 0.5, 1, 1,
- 1, 1, 1 + 1,
- 0.5, 1, 1 + 0.5, 1,
- 1, 1, 0.5, 0.5, 1,
- 0.5, 1, 1 + 0.5, 1,
- 0.5, 0.5, 0.5, 0.5, 1 + 1,
- 0.5, 1, 1 + 0.5, 1,
- 1 + 1, 0.5, 0.5, 1,
- 1 + 1 + 1 + 1,
- 0.5, 0.5, 0.5 + 0.25, 0.25, 0.5 + 0.25, 0.25, 0.5 + 0.25, 0.25,
- 0.5, 1, 0.5, 1, 1,
- 0.5, 0.5, 0.5 + 0.25, 0.25, 0.5 + 0.25, 0.25, 0.5 + 0.25, 0.25,
- 0.5, 1, 0.5, 1, 1,
- 1 + 1, 0.5, 0.5, 1,
- 1 + 1 + 1 + 1,
- 0.5, 1, 0.5, 1 + 1,
- 0.5, 1, 0.5, 1 + 1,
- 1 + 1, 0.5, 0.5, 1,
- 1 + 1 + 1 + 1
- };
復制代碼 |