久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6699|回復: 5
打印 上一主題 下一主題
收起左側

arduino智能培養大棚

[復制鏈接]
跳轉到指定樓層
樓主
/*程序: 本程序目的是實現環境實時監控以及操作自動化,分為自動化和藍牙控制兩部分
操作自動化部分包括:1、溫度大于30自動開啟風扇
                    2、土壤濕度小于300水泵自動加水
                    3、亮度系數小于150打開補光燈
                    3、超過以上限度開啟警示燈
藍牙部分:用app inventor設計軟件通過藍牙控制使不在限制條件下手動控制用電器開關。包括:開啟(關閉)風扇、水泵、補光燈、警示燈、門
其他部分:12864OLED顯示溫度、濕度、MQ(煙霧)、亮度系數等*/

  1. #include <SPI.h>
  2. #include <SoftwareSerial.h>
  3. #include <Wire.h>  
  4. #include <Adafruit_GFX.h>  
  5. #include <Adafruit_SSD1306.h>  
  6. #include <dht.h>
  7. #include <Servo.h>
  8. dht DHT;
  9. #define LOGO16_GLCD_HEIGHT 16 //定義顯示高度  
  10. #define LOGO16_GLCD_WIDTH  16 //定義顯示寬度  
  11. //#define YELLOW  1               //黃燈警報閃爍端口1
  12. #define GREEN  2              //綠燈警報閃爍端口2
  13. #define DUOJI 3              //舵機pwn端口口3
  14. #define OLED_RESET 4          //OLED復位端口4
  15. #define YELLOW 5              //煙霧端口5
  16. #define FAN 6                //風扇端口6(pwn口 具體修改)
  17. #define DHT22_PIN 7            //溫濕度端口7
  18. #define PUMP  8              //水泵端口8
  19. #define HLED  9               //高光食人魚LED端口9
  20. #define RED  12               //紅燈警報閃爍端口12   
  21. #define analogMoistue 0       //讀取藍牙監測信息讀取端口0  
  22. int TSignal=A0;              //土壤信息端口A0  
  23. int MQ=analogRead(A1);       //煙霧信息端口A1
  24. int BSignal=A2;            //亮度模塊端口A2
  25. int ck003 = 155;           //亮度系數
  26. int turang = 300;            //土壤濕度系數
  27. //int bluetooth=0;                   //定義藍牙接入開關
  28. //char  android=' ';
  29. int is_auto =1;
  30. int time_count;
  31. Servo myservo;
  32. SoftwareSerial I2CBT(10,11);   
  33. byte serialA;                  
  34. Adafruit_SSD1306 display(OLED_RESET);
  35. static const unsigned char PROGMEM str_1[] =  
  36. {   
  37. 0x00,0x08,0x43,0xFC,0x32,0x08,0x12,0x08,
  38.       0x83,0xF8,0x62,0x08,0x22,0x08,0x0B,0xF8,
  39.       0x10,0x00,0x27,0xFC,0xE4,0xA4,0x24,0xA4,
  40.       0x24,0xA4,0x24,0xA4,0x2F,0xFE,0x20,0x00,
  41.   };//溫


  42. static const unsigned char PROGMEM str_2[] =  
  43. {   
  44. 0x01,0x00,0x00,0x84,0x3F,0xFE,0x22,0x20,
  45.       0x22,0x28,0x3F,0xFC,0x22,0x20,0x23,0xE0,
  46.       0x20,0x00,0x2F,0xF0,0x22,0x20,0x21,0x40,
  47.       0x20,0x80,0x43,0x60,0x8C,0x1E,0x30,0x04,
  48.   };  // 度


  49. static const unsigned char PROGMEM str_3[] =  
  50. {   
  51. 0x00,0x08,0x47,0xFC,0x34,0x08,0x14,0x08,
  52.       0x87,0xF8,0x64,0x08,0x24,0x08,0x0F,0xF8,
  53.       0x11,0x20,0x21,0x20,0xE9,0x24,0x25,0x28,
  54.       0x23,0x30,0x21,0x24,0x3F,0xFE,0x20,0x00,
  55.   }; //濕

  56.   static const unsigned char PROGMEM str_4[] =  
  57. {   
  58. 0x60,0x00,0x91,0xF4,0x96,0x0C,0x6C,0x04,0x08,0x04,0x18,0x00,0x18,0x00,0x18,0x00,
  59. 0x18,0x00,0x18,0x00,0x18,0x00,0x08,0x00,0x0C,0x04,0x06,0x08,0x01,0xF0,0x00,0x00
  60.   }; //(℃)

  61.   static const unsigned char PROGMEM str_5[] =  
  62. {   
  63. 0x00,0x00,0x00,0x00,0x70,0x00,0xD8,0x00,0xDA,0x00,0x76,0x00,0x0C,0x00,0x18,0x00,
  64. 0x30,0x00,0x6E,0x00,0x5B,0x00,0x1B,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00
  65.   }; //(%)  
  66. #if (SSD1306_LCDHEIGHT != 64)  
  67. #error("Height incorrect, please fix Adafruit_SSD1306.h!");  //OLED顯示分高度
  68. #endif  

  69. void setup()   
  70. {  
  71. myservo.attach(DUOJI);
  72. pinMode(FAN,OUTPUT);  
  73. pinMode(PUMP,OUTPUT);
  74. pinMode(HLED,OUTPUT);
  75. pinMode(RED,OUTPUT);
  76. pinMode(YELLOW,OUTPUT);
  77. pinMode(GREEN,OUTPUT);
  78. pinMode(TSignal,INPUT);
  79. pinMode(BSignal,INPUT);
  80. digitalWrite(FAN,LOW);
  81. digitalWrite(PUMP,LOW);         
  82. digitalWrite(HLED,LOW);  ;
  83. digitalWrite(RED,LOW);
  84. digitalWrite(YELLOW,LOW);
  85. digitalWrite(GREEN,LOW);              
  86. Serial.begin(9600);                        //輸出比特率
  87. I2CBT.begin(9600);                          //藍牙傳輸比特率  
  88. display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //OLED顯示起始地址位
  89. display.clearDisplay();  
  90. }  

  91. void loop()
  92. {   
  93.   time_count+=1;
  94.   oled_display();
  95.   byte Data[3]; //顯示溫度           
  96.   byte cmmd[20];
  97.   int insize;
  98.   char str[256];
  99.   int i=(int)(DHT.temperature*10);
  100.     //serialA=I2CBT.read();
  101.     Data[0]='a';
  102.     Data[1]=i/256;      
  103.   Data[2]=i%256;  
  104.   if(is_auto==1)
  105.   {
  106.   AUTOFAN();
  107.     AUTOBRIGHTNESS();
  108.     AUTOPUMP();
  109.     AUTOJINGGAO();
  110.     AUTOYELLOW ();
  111.   AUTOGREEN ();
  112.   }
  113.     if((insize=(I2CBT.available()))>0)  
  114.     {
  115.       is_auto=0;  //關閉自動控制
  116.       time_count=0;
  117.       Serial.print("藍牙數據字節數 = ");
  118.       Serial.println(insize);
  119.       for (int i=0; i<insize; i++)
  120.       {
  121.       Serial.print(cmmd[i]=char(I2CBT.read()),i);
  122.       Serial.print("\n");
  123.       }
  124.     }
  125.     else
  126.   {
  127.     cmmd[0]='z';
  128.       if(time_count>3000)
  129.     {   
  130.         is_auto=1;
  131.       }
  132.     }


  133.     switch(cmmd[0])     //讀取第一個字節
  134.     {case 49:
  135.     Serial.println(DHT.temperature);
  136.         I2CBT.write(Data[0]);
  137.         I2CBT.write(Data[1]);
  138.         I2CBT.write(Data[2]);
  139.      break;

  140.      case 'g': digitalWrite(RED, HIGH); break;  //'g'開警示燈


  141.      case 'h': digitalWrite(RED, LOW);  break;  //‘h’關警示燈


  142.      case 'k': analogWrite(FAN,255);  break;  //'k'開風扇


  143.      case 'l': analogWrite(FAN,0);    break;  //‘l’關風扇


  144.      case 'i': myservo.write(0);    break;  //'i'開門


  145.      case 'j': myservo.write(90);     break;  //‘j’關門


  146.      case 'e': digitalWrite(PUMP,HIGH);
  147.      delay(5000); digitalWrite(PUMP,LOW); break;  //'e'開水泵


  148.     // case 'f': digitalWrite(PUMP,LOW);   break;  //‘f’關水泵


  149.      case 'c': digitalWrite(HLED,HIGH); break;  //'i'開補光燈


  150.      case 'd': digitalWrite(HLED,LOW);  break;  //‘d’關補光燈


  151.      case 'b': is_auto=1;         break;  //‘b’開啟自動化


  152.    case 'z':                break;  //直接退出

  153.    default: is_auto=1;
  154.      }
  155.   }



  156. void oled_display()
  157. {
  158.   int chk = DHT.read22(DHT22_PIN);        //讀取DH22數據
  159.   display.setTextSize(1);               //設置字體大小  
  160.   display.setTextColor(WHITE);            //設置字體顏色白色  
  161.   display.setCursor(0,0);                 //設置字體的起始位置
  162.   display.drawBitmap(0, 20, str_1, 16, 16, 1);  //在坐標X:0   Y:20的位置顯示中文字符溫
  163.   display.drawBitmap(18, 20, str_2, 16, 16, 1); //在坐標X:42  Y:16的位置顯示中文字符度
  164.   display.drawBitmap(80, 20, str_4, 16, 16,1);  //在坐標X:42  Y:16的位置顯示中文字符℃
  165.   display.setCursor(36,25);             //設置字體的起始位置(36,25)
  166.   display.setTextSize(1);             //設置字體大小為1
  167.   display.print(":");                   //顯示符號“:”  
  168.   display.println((float)DHT.temperature, 2); //顯示實時溫度
  169.   display.drawBitmap(0, 40, str_3, 16, 16, 1);  //在坐標X:0   Y:40的位置顯示中文字符濕
  170.   display.drawBitmap(18, 40, str_2, 16, 16, 1); //在坐標X:18  Y:40的位置顯示中文字符度
  171.   display.drawBitmap(80, 40, str_5, 16, 16, 1); //在坐標X:80  Y:40的位置顯示中文字符%
  172.   display.setCursor(36,45);             //設置字體的起始位置(36,25)
  173.   display.setTextSize(1);                 //設置字體大小為1
  174.   display.print(":");                     //顯示符號“:”
  175.   display.println((float)DHT.humidity, 2);    //顯示實時濕度
  176.   display.setCursor(5,5);               //設置字體的起始位置(5,5)
  177.   display.setTextSize(1);                 //設置字體大小為1
  178.   display.println("MQ-2:");               //輸出字符"MQ-2:"并換行
  179.   display.setCursor(33,5);                //設置字體的起始位置(5,5)
  180.   display.println(analogRead(A1),1);        //顯示模擬口A1的數據并換行
  181.   display.display();                      //把緩存的都顯示
  182.   display.clearDisplay();
  183. }

  184. void AUTOFAN()
  185. {
  186.   if(DHT.temperature>30)
  187.   {
  188.     analogWrite(FAN,255);               //溫度大于30℃打開風扇
  189.   }
  190.   else if(DHT.temperature<30)
  191.   {
  192.     analogWrite(FAN,0);                 //溫度小于30℃關閉風扇         
  193.   }
  194. }


  195.   void AUTOPUMP()                       //如土壤濕度不足開啟水泵自動加水
  196.   {
  197.     Serial.print("土壤濕度:");
  198.   Serial.println(analogRead(A0));
  199.     if(analogRead(A0) < turang)
  200.     {
  201.       digitalWrite(PUMP,HIGH);
  202.     }
  203.     else if(analogRead(A0) > turang)
  204.     {
  205.       digitalWrite(PUMP,LOW);
  206.     }
  207.   }


  208. void AUTOJINGGAO()                        //紅燈警告
  209. {
  210.    if((analogRead(TSignal) < turang))     //判斷水是否足夠,不足則閃爍,足夠則不閃爍
  211.   {
  212.   digitalWrite(RED, HIGH);  
  213.   delay(300);         
  214.   digitalWrite(RED, LOW);  
  215.   delay(300);  
  216.   }
  217. else if((analogRead(TSignal) > turang))
  218.   {
  219.   digitalWrite(RED,LOW);  
  220.   }
  221. }
  222. void AUTOYELLOW ()
  223. {
  224. if(DHT.temperature>30)     //判斷水是否足夠,不足則閃爍,足夠則不閃爍
  225.   {
  226.   digitalWrite(YELLOW, HIGH);  
  227.   delay(300);         
  228.   digitalWrite(YELLOW, LOW);  
  229.   delay(300);  
  230.   }
  231. else if(DHT.temperature<30)
  232.   {
  233.   digitalWrite(YELLOW,LOW);  
  234.   }
  235.   }

  236.    void AUTOGREEN()
  237.    {
  238.    if(analogRead(BSignal) < ck003)     //判斷水是否足夠,不足則閃爍,足夠則不閃爍
  239.   {
  240.   digitalWrite(GREEN, HIGH);  
  241.   delay(300);         
  242.   digitalWrite(GREEN, LOW);  
  243.   delay(300);  
  244.   }
  245. else if(analogRead(BSignal) > ck003)
  246.   {
  247.   digitalWrite(GREEN,LOW);  
  248.   }
  249. }

  250. void AUTOBRIGHTNESS()                 //光度不夠時增加亮度呼吸燈
  251. {
  252.   Serial.print("光度系數:");
  253.   Serial.println(analogRead(BSignal));   
  254.   if(analogRead(BSignal) < ck003)
  255.   {

  256.   digitalWrite(HLED,HIGH);   
  257.   delay(500);
  258.   }
  259.   else  if(analogRead(BSignal) > ck003)
  260.   {
  261.   digitalWrite(HLED,LOW);   
  262.   }
  263.   delay(500);
  264. }
復制代碼


/*

app inventor 部分  
組間設計:
邏輯設計:
初始化

藍牙準備與選擇
各種用電器

獲取數據

App inventor上述aia文件  (無密碼)
App inventor 可用網站     app.gzjkw點net/login/
問題:1、無法通過藍牙控制用電器
      2、程序劃線部分無法在arduino串口監視器中觀察到由Android輸入的數據
思考(這樣思考是不是正確的):1、arduino是由收到Android手機發送的文本開控制IO口的電位拉高或者置低。接受Android收的文本指令傳到串口,我們要做的就是讀取串口的數據(Serial .read),再輸出指令并執行(Serial .println)。(即劃線部分)問題在于打開串口監視器無法觀察到由Android端接受的指令。
2、顯示器不在自動化與藍牙模式之內。是否可以用中斷來減低運存(僅思想,首要解決第一個問題)。

*/



全部資料51hei下載地址:
arduino211.7z (1.68 MB, 下載次數: 72)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:450830 發表于 2018-12-20 16:02 | 只看該作者
不錯學習了
回復

使用道具 舉報

無效樓層,該帖已經被刪除
地板
ID:670099 發表于 2019-12-21 20:52 | 只看該作者
很想做一個,好好學一下
回復

使用道具 舉報

5#
ID:658819 發表于 2020-1-6 22:21 | 只看該作者
樓主好作品,相關模塊和接線都有嗎
回復

使用道具 舉報

6#
ID:445248 發表于 2020-6-10 16:42 | 只看該作者
ghost98 發表于 2019-12-21 20:52
很想做一個,好好學一下

你好 你有樓主的app文件嗎 我現在看 已近被刪除
回復

使用道具 舉報

7#
ID:76497 發表于 2020-7-10 14:10 | 只看該作者
難點在于APP部分
回復

使用道具 舉報

8#
無效樓層,該帖已經被刪除
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91久久久久久久久久久久久 | 久草网站 | 欧美日韩一二三区 | 男女午夜激情视频 | 日韩成人专区 | 在线观看日本高清二区 | 日韩a在线 | 亚洲欧美在线一区 | 91精品国产综合久久婷婷香蕉 | 国产精品视频在线播放 | 一区二区三区亚洲视频 | 在线高清免费观看视频 | 久久成人国产精品 | 男女下面一进一出网站 | 欧美综合一区 | 中文字幕 亚洲一区 | 好好的日在线视频 | 成人在线 | 久久国产精品一区二区三区 | 久久久激情 | 宅男伊人 | 午夜视频网站 | 亚洲一区二区三区免费 | 亚洲成人精品免费 | 国产精品久久福利 | 欧洲一级毛片 | 综合久久亚洲 | 欧美亚洲在线视频 | 国产一区二区三区四区区 | 祝你幸福电影在线观看 | 中文字幕成人 | 激情伊人网| 一区二区高清 | 中文在线一区二区 | 黄色成人免费在线观看 | 伊人久久综合 | 99久久国产 | 亚洲精品无 | 久久小视频| 国产三级日本三级 | 在线色网址 |