找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 363|回复: 1
收起左侧

寒假做的一套基于arduino的简易智能家居 源程序

[复制链接]
ID:1033693 发表于 2022-6-17 09:20 | 显示全部楼层 |阅读模式
此项目没有使用中断,代码可以运行

为了读者有更好的体验,笔者进行了详细的注释

创作不易,请读者给个小心心吧

所有库文件笔者已经打包请在上面的文件下载


2021 12  31
by-王思源

1898874c9adab358d29f8f8c7b4d7d3.jpg


6008c2622cee78fa090d130508de8ba.jpg


bc58021b7d176e4482eb80ee92086e8.jpg

Arduino源程序如下:
  1. #include "pitches.h"//调用蜂鸣器头文件
  2. #include "dht11.h"//调用温湿度头文件
  3. #include "new.h" //调用头文件
  4. #include "Wire.h"//调用总线文件
  5. #include "Servo.h"//调用伺服马达文件
  6. #include "LiquidCrystal_I2C.h"//调用1602文件
  7. #define DHT11PIN A0 //定意温湿度的I/O口是A0
  8. dht11 dht11; //初始化dhrll
  9. Servo myservo; //初始化伺服电机
  10. int ledpin = 3;
  11. int TrigPin = 4;   //定义超声波的接口
  12. int EchoPin = 5;
  13. int tonepin = 6;
  14. int dianji = 7;
  15. int lighttrail = A1;
  16. int mx =A2;
  17. float distance;
  18. int swi = A4;
  19. int mxq;
  20. LiquidCrystal_I2C mylcd(0x27, 16, 2);//、、、、、、、、、、、、、、、用了scl和sda、、、、、、、、、0和1接口不能用、、、、、、、、、、、、、
  21. //初始化1602
  22. int pp;
  23. void tempearture(int temp) {
  24.   Serial.println(temp);
  25.   if (temp > 15) {
  26.     digitalWrite(dianji, LOW);
  27.     digitalWrite(ledpin, HIGH);
  28.     //    int length = sizeof(tune) / sizeof(tune[0]);//、、、、、、、、、、数组长度提取
  29.     //    for (int x = 0; x < length; x++) //循环音符的次数
  30.     //  {
  31.     //    tone(tonepin, tune[x]); //依次播放tune数组元素,即每个音符
  32.     //    delay(400 * duration[x]); //每个音符持续的时间,即节拍duration,400是调整时间的越大,曲子速度越慢,越小曲子速度越快
  33.     //    noTone(tonepin);//停止当前音符,进入下一音符
  34.     //  }
  35.     if (!temp) {
  36.       digitalWrite(dianji, LOW);
  37.     }
  38.   } else
  39.   {
  40.     digitalWrite(dianji, HIGH);
  41.   }
  42. }
  43. void dis(float distance,float mqx) {
  44.   Serial.print(distance);
  45.   Serial.print("m");
  46.   Serial.println();
  47.   if (distance < 0.5)
  48.   {
  49.    digitalWrite(ledpin, HIGH);
  50.     Serial.println("灯亮");
  51.     for (int thisNote = 0; thisNote < 8; thisNote++) {
  52.       int noteDuration = 1000 / noteDurations[thisNote];
  53.       tone(tonepin, tune[thisNote], noteDuration);
  54.       int pauseBetweenNotes = noteDuration * 1.30;
  55.       delay(pauseBetweenNotes);
  56.       noTone(17);
  57.     }
  58.   }
  59.     if (mqx >20)
  60.   {
  61.    digitalWrite(ledpin, HIGH);
  62.     Serial.println("灯亮");
  63.     for (int thisNote = 0; thisNote < 8; thisNote++) {
  64.       int noteDuration = 1000 / noteDurations[thisNote];
  65.       tone(tonepin, tune[thisNote], noteDuration);
  66.       int pauseBetweenNotes = noteDuration * 1.30;
  67.       delay(pauseBetweenNotes);
  68.       noTone(17);
  69.     }
  70.   }
  71.   else
  72.   {
  73.     digitalWrite(ledpin, LOW);
  74.     Serial.println("灯灭");
  75.   }
  76. }
  77. void tempss(int pp, int hump, float distance) {
  78.   mylcd.setCursor(0, 0);
  79.   mylcd.print("T :");
  80.   mylcd.setCursor(4, 0);
  81.   mylcd.print(pp);
  82.   mylcd.setCursor(0, 1);
  83.   mylcd.print("H :");
  84.   mylcd.setCursor(4, 1);
  85.   mylcd.print(hump);
  86.   mylcd.setCursor(7, 0);
  87.   mylcd.print("D :");
  88.   mylcd.setCursor(10, 0);
  89.   mylcd.print(distance);

  90. }
  91. void setup()                                      //建立函数
  92. {
  93.   mylcd.init();            //、、、、、、、、、、、、、、、、、、、、、、、初始化liquidcrytal_2c
  94.   mylcd.backlight();
  95.   myservo.attach(9);
  96.   pinMode(dianji, OUTPUT);
  97.   pinMode(ledpin, OUTPUT);
  98.   pinMode(TrigPin, OUTPUT);
  99.   pinMode(EchoPin, INPUT);
  100.   pinMode(mx, INPUT);
  101.   pinMode(swi,INPUT);
  102.   Serial.begin(9600);
  103.   Serial.println();
  104. }
  105. void loop()                   //、、、、、、、、、、、、、、、、、、、、、、、、主函数
  106. {
  107.   int cc = analogRead(swi);
  108.    int mxq = analogRead(mx);


  109.    pp= (swi*0.0048828125*100);  
  110.   Serial.println("lailia");
  111.   Serial.println(pp);
  112.   digitalWrite(TrigPin, LOW);
  113.   delayMicroseconds(2);
  114.   digitalWrite(TrigPin, HIGH);
  115.   delayMicroseconds(10);
  116.   digitalWrite(TrigPin, LOW);
  117.   distance = pulseIn(EchoPin, HIGH) / 58.00 / 100;//、、、、、、、、、、距离计算
  118.   Serial.println("\n");
  119.   dht11.read(DHT11PIN);    //、、、、、、、、、、、、、、、、、、、、、、读取dth11的温度以便于复赋值
  120.   Serial.print("湿度 (%): ");
  121.   Serial.println((float)dht11.humidity, 4);
  122.   Serial.print("温度 (oC): ");
  123.   Serial.println((float)dht11.temperature, 4);
  124. //  int temp = (float)dht11.temperature;
  125.   int hump = (float)dht11.humidity;

  126.   tempearture(pp);   //、、、、、、、、、、、、、、、、、、、、、&#128073;温度控制如果温度过高会开启温度过高保护
  127.   tempss(pp, hump, distance); //、、、、、、、、、、、、、、、、、 &#128073;液晶屏显示,船了三个参数,分别是温度湿度还有距离
  128.   dis(distance,mxq);      //、、、、、、、、、、、、、、、、、、、、、&#128073;距离函数如果距离过高会开启蜂鸣器

  129.   int  val = analogRead(lighttrail);            // reads the value of the potentiometer (value between 0 and 1023)
  130.   val = map(val, 0, 100, 100, 0);     // scale it for use with the servo (value between 0 and 180)
  131.   myservo.write(val);




  132.   delay(900);

  133. }
复制代码
new.h
  1. double Fahrenheit(double celsius)
  2. {
  3.         return 1.8 * celsius + 32;
  4. }    //摄氏温度度转化为华氏温度

  5. double Kelvin(double celsius)
  6. {
  7.         return celsius + 273.15;
  8. }     //摄氏温度转化为开氏温度

  9. // 露点(点在此温度时,空气饱和并产生露珠)
  10. // 参考: http://wahiduddin.net/calc/density_algorithms.htm
  11. double dewPoint(double celsius, double humidity)
  12. {
  13.         double A0= 373.15/(273.15 + celsius);
  14.         double SUM = -7.90298 * (A0-1);
  15.         SUM += 5.02808 * log10(A0);
  16.         SUM += -1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ;
  17.         SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ;
  18.         SUM += log10(1013.246);
  19.         double VP = pow(10, SUM-3) * humidity;
  20.         double T = log(VP/0.61078);   // temp var
  21.         return (241.88 * T) / (17.558-T);
  22. }

  23. // 快速计算露点,速度是5倍dewPoint()
  24. // 参考: http://en.wikipedia.org/wiki/Dew_point
  25. double dewPointFast(double celsius, double humidity)
  26. {
  27.         double a = 17.271;
  28.         double b = 237.7;
  29.         double temp = (a * celsius) / (b + celsius) + log(humidity/100);
  30.         double Td = (b * temp) / (a - temp);
  31.         return Td;
  32. }
复制代码

pitches.h
  1. #define NOTE_B0  31
  2. #define NOTE_C1  33
  3. #define NOTE_CS1 35
  4. #define NOTE_D1  37
  5. #define NOTE_DS1 39
  6. #define NOTE_E1  41
  7. #define NOTE_F1  44
  8. #define NOTE_FS1 46
  9. #define NOTE_G1  49
  10. #define NOTE_GS1 52
  11. #define NOTE_A1  55
  12. #define NOTE_AS1 58
  13. #define NOTE_B1  62
  14. #define NOTE_C2  65
  15. #define NOTE_CS2 69
  16. #define NOTE_D2  73
  17. #define NOTE_DS2 78
  18. #define NOTE_E2  82
  19. #define NOTE_F2  87
  20. #define NOTE_FS2 93
  21. #define NOTE_G2  98
  22. #define NOTE_GS2 104
  23. #define NOTE_A2  110
  24. #define NOTE_AS2 117
  25. #define NOTE_B2  123
  26. #define NOTE_C3  131
  27. #define NOTE_CS3 139
  28. #define NOTE_D3  147
  29. #define NOTE_DS3 156
  30. #define NOTE_E3  165
  31. #define NOTE_F3  175
  32. #define NOTE_FS3 185
  33. #define NOTE_G3  196
  34. #define NOTE_GS3 208
  35. #define NOTE_A3  220
  36. #define NOTE_AS3 233
  37. #define NOTE_B3  247
  38. #define NOTE_C4  262
  39. #define NOTE_CS4 277
  40. #define NOTE_D4  294
  41. #define NOTE_DS4 311
  42. #define NOTE_E4  330
  43. #define NOTE_F4  349
  44. #define NOTE_FS4 370
  45. #define NOTE_G4  392
  46. #define NOTE_GS4 415
  47. #define NOTE_A4  440
  48. #define NOTE_AS4 466
  49. #define NOTE_B4  494
  50. #define NOTE_C5  523
  51. #define NOTE_CS5 554
  52. #define NOTE_D5  587
  53. #define NOTE_DS5 622
  54. #define NOTE_E5  659
  55. #define NOTE_F5  698
  56. #define NOTE_FS5 740
  57. #define NOTE_G5  784
  58. #define NOTE_GS5 831
  59. #define NOTE_A5  880
  60. #define NOTE_AS5 932
  61. #define NOTE_B5  988
  62. #define NOTE_C6  1047
  63. #define NOTE_CS6 1109
  64. #define NOTE_D6  1175
  65. #define NOTE_DS6 1245
  66. #define NOTE_E6  1319
  67. #define NOTE_F6  1397
  68. #define NOTE_FS6 1480
  69. #define NOTE_G6  1568
  70. #define NOTE_GS6 1661
  71. #define NOTE_A6  1760
  72. #define NOTE_AS6 1865
  73. #define NOTE_B6  1976
  74. #define NOTE_C7  2093
  75. #define NOTE_CS7 2217
  76. #define NOTE_D7  2349
  77. #define NOTE_DS7 2489
  78. #define NOTE_E7  2637
  79. #define NOTE_F7  2794
  80. #define NOTE_FS7 2960
  81. #define NOTE_G7  3136
  82. #define NOTE_GS7 3322
  83. #define NOTE_A7  3520
  84. #define NOTE_AS7 3729
  85. #define NOTE_B7  3951
  86. #define NOTE_C8  4186
  87. #define NOTE_CS8 4435
  88. #define NOTE_D8  4699
  89. #define NOTE_DS8 4978

  90. #define NOTE_D0 -1
  91. #define NOTE_D1 294
  92. #define NOTE_D2 330
  93. #define NOTE_D3 350
  94. #define NOTE_D4 393
  95. #define NOTE_D5 441
  96. #define NOTE_D6 495
  97. #define NOTE_D7 556

  98. #define NOTE_DL1 147
  99. #define NOTE_DL2 165
  100. #define NOTE_DL3 175
  101. #define NOTE_DL4 196
  102. #define NOTE_DL5 221
  103. #define NOTE_DL6 248
  104. #define NOTE_DL7 278

  105. #define NOTE_DH1 589
  106. #define NOTE_DH2 661
  107. #define NOTE_DH3 700
  108. #define NOTE_DH4 786
  109. #define NOTE_DH5 882
  110. #define NOTE_DH6 990
  111. #define NOTE_DH7 112

  112. #define WHOLE 1
  113. #define HALF 0.5
  114. #define QUARTER 0.25
  115. #define EIGHTH 0.25
  116. #define SIXTEENTH 0.625



  117. int melody[] = {
  118.   NOTE_C4, NOTE_G3, NOTE_GS3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_DS8
  119. };
  120. int noteDurations[] = {
  121.   4, 8, 8, 4, 4, 4, 4, 4
  122. };
  123. int tune[] =
  124. {
  125.   NOTE_DH1, NOTE_D6, NOTE_D5, NOTE_D6, NOTE_D0,
  126.   NOTE_DH1, NOTE_D6, NOTE_D5, NOTE_DH1, NOTE_D6, NOTE_D0, NOTE_D6,
  127.   NOTE_D6, NOTE_D6, NOTE_D5, NOTE_D6, NOTE_D0, NOTE_D6,
  128.   NOTE_DH1, NOTE_D6, NOTE_D5, NOTE_DH1, NOTE_D6, NOTE_D0,

  129.   NOTE_D1, NOTE_D1, NOTE_D3,
  130.   NOTE_D1, NOTE_D1, NOTE_D3, NOTE_D0,
  131.   NOTE_D6, NOTE_D6, NOTE_D6, NOTE_D5, NOTE_D6,
  132.   NOTE_D5, NOTE_D1, NOTE_D3, NOTE_D0,
  133.   NOTE_DH1, NOTE_D6, NOTE_D6, NOTE_D5, NOTE_D6,
  134.   NOTE_D5, NOTE_D1, NOTE_D2, NOTE_D0,
  135.   NOTE_D7, NOTE_D7, NOTE_D5, NOTE_D3,
  136.   NOTE_D5,
  137.   NOTE_DH1, NOTE_D0, NOTE_D6, NOTE_D6, NOTE_D5, NOTE_D5, NOTE_D6, NOTE_D6,
  138.   NOTE_D0, NOTE_D5, NOTE_D1, NOTE_D3, NOTE_D0,
  139.   NOTE_DH1, NOTE_D0, NOTE_D6, NOTE_D6, NOTE_D5, NOTE_D5, NOTE_D6, NOTE_D6,
  140.   NOTE_D0, NOTE_D5, NOTE_D1, NOTE_D2, NOTE_D0,
  141.   NOTE_D3, NOTE_D3, NOTE_D1, NOTE_DL6,
  142.   NOTE_D1,
  143.   NOTE_D3, NOTE_D5, NOTE_D6, NOTE_D6,
  144.   NOTE_D3, NOTE_D5, NOTE_D6, NOTE_D6,
  145.   NOTE_DH1, NOTE_D0, NOTE_D7, NOTE_D5,
  146.   NOTE_D6,
  147. };

  148. //曲子的节拍,即音符持续时间
  149. float duration[] =
  150. {
  151.   1, 1, 0.5, 0.5, 1,
  152.   0.5, 0.5, 0.5, 0.5, 1, 0.5, 0.5,
  153.   0.5, 1, 0.5, 1, 0.5, 0.5,
  154.   0.5, 0.5, 0.5, 0.5, 1, 1,

  155.   1, 1, 1 + 1,
  156.   0.5, 1, 1 + 0.5, 1,
  157.   1, 1, 0.5, 0.5, 1,
  158.   0.5, 1, 1 + 0.5, 1,
  159.   0.5, 0.5, 0.5, 0.5, 1 + 1,
  160.   0.5, 1, 1 + 0.5, 1,
  161.   1 + 1, 0.5, 0.5, 1,
  162.   1 + 1 + 1 + 1,
  163.   0.5, 0.5, 0.5 + 0.25, 0.25, 0.5 + 0.25, 0.25, 0.5 + 0.25, 0.25,
  164.   0.5, 1, 0.5, 1, 1,
  165.   0.5, 0.5, 0.5 + 0.25, 0.25, 0.5 + 0.25, 0.25, 0.5 + 0.25, 0.25,
  166.   0.5, 1, 0.5, 1, 1,
  167.   1 + 1, 0.5, 0.5, 1,
  168.   1 + 1 + 1 + 1,
  169.   0.5, 1, 0.5, 1 + 1,
  170.   0.5, 1, 0.5, 1 + 1,
  171.   1 + 1, 0.5, 0.5, 1,
  172.   1 + 1 + 1 + 1
  173. };
复制代码

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:1033693 发表于 2022-6-17 09:22 | 显示全部楼层
避坑操作:
首先没有中断,就没有优先级
优先级有问题,就会导致当蜂鸣器响起时,超声波就会不工作
光感传感器就不会工作,
温湿度也会不工作
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表