找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5866|回复: 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, 下载次数: 71)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:450830 发表于 2018-12-20 16:02 | 只看该作者
不错学习了
回复

使用道具 举报

板凳
ID:670099 发表于 2019-12-21 20:52 | 只看该作者
很想做一个,好好学一下
回复

使用道具 举报

地板
ID:658819 发表于 2020-1-6 22:21 | 只看该作者
楼主好作品,相关模块和接线都有吗
回复

使用道具 举报

5#
ID:445248 发表于 2020-6-10 16:42 | 只看该作者
ghost98 发表于 2019-12-21 20:52
很想做一个,好好学一下

你好 你有楼主的app文件吗 我现在看 已近被删除
回复

使用道具 举报

6#
ID:76497 发表于 2020-7-10 14:10 | 只看该作者
难点在于APP部分
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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