|
/*程序: 本程序目的是實(shí)現(xiàn)環(huán)境實(shí)時(shí)監(jiān)控以及操作自動(dòng)化,分為自動(dòng)化和藍(lán)牙控制兩部分
操作自動(dòng)化部分包括:1、溫度大于30自動(dòng)開(kāi)啟風(fēng)扇
2、土壤濕度小于300水泵自動(dòng)加水
3、亮度系數(shù)小于150打開(kāi)補(bǔ)光燈
3、超過(guò)以上限度開(kāi)啟警示燈
藍(lán)牙部分:用app inventor設(shè)計(jì)軟件通過(guò)藍(lán)牙控制使不在限制條件下手動(dòng)控制用電器開(kāi)關(guān)。包括:開(kāi)啟(關(guān)閉)風(fēng)扇、水泵、補(bǔ)光燈、警示燈、門(mén)
其他部分:12864OLED顯示溫度、濕度、MQ(煙霧)、亮度系數(shù)等*/
- #include <SPI.h>
- #include <SoftwareSerial.h>
- #include <Wire.h>
- #include <Adafruit_GFX.h>
- #include <Adafruit_SSD1306.h>
- #include <dht.h>
- #include <Servo.h>
- dht DHT;
- #define LOGO16_GLCD_HEIGHT 16 //定義顯示高度
- #define LOGO16_GLCD_WIDTH 16 //定義顯示寬度
- //#define YELLOW 1 //黃燈警報(bào)閃爍端口1
- #define GREEN 2 //綠燈警報(bào)閃爍端口2
- #define DUOJI 3 //舵機(jī)pwn端口口3
- #define OLED_RESET 4 //OLED復(fù)位端口4
- #define YELLOW 5 //煙霧端口5
- #define FAN 6 //風(fēng)扇端口6(pwn口 具體修改)
- #define DHT22_PIN 7 //溫濕度端口7
- #define PUMP 8 //水泵端口8
- #define HLED 9 //高光食人魚(yú)LED端口9
- #define RED 12 //紅燈警報(bào)閃爍端口12
- #define analogMoistue 0 //讀取藍(lán)牙監(jiān)測(cè)信息讀取端口0
- int TSignal=A0; //土壤信息端口A0
- int MQ=analogRead(A1); //煙霧信息端口A1
- int BSignal=A2; //亮度模塊端口A2
- int ck003 = 155; //亮度系數(shù)
- int turang = 300; //土壤濕度系數(shù)
- //int bluetooth=0; //定義藍(lán)牙接入開(kāi)關(guān)
- //char android=' ';
- int is_auto =1;
- int time_count;
- Servo myservo;
- SoftwareSerial I2CBT(10,11);
- byte serialA;
- Adafruit_SSD1306 display(OLED_RESET);
- static const unsigned char PROGMEM str_1[] =
- {
- 0x00,0x08,0x43,0xFC,0x32,0x08,0x12,0x08,
- 0x83,0xF8,0x62,0x08,0x22,0x08,0x0B,0xF8,
- 0x10,0x00,0x27,0xFC,0xE4,0xA4,0x24,0xA4,
- 0x24,0xA4,0x24,0xA4,0x2F,0xFE,0x20,0x00,
- };//溫
- static const unsigned char PROGMEM str_2[] =
- {
- 0x01,0x00,0x00,0x84,0x3F,0xFE,0x22,0x20,
- 0x22,0x28,0x3F,0xFC,0x22,0x20,0x23,0xE0,
- 0x20,0x00,0x2F,0xF0,0x22,0x20,0x21,0x40,
- 0x20,0x80,0x43,0x60,0x8C,0x1E,0x30,0x04,
- }; // 度
- static const unsigned char PROGMEM str_3[] =
- {
- 0x00,0x08,0x47,0xFC,0x34,0x08,0x14,0x08,
- 0x87,0xF8,0x64,0x08,0x24,0x08,0x0F,0xF8,
- 0x11,0x20,0x21,0x20,0xE9,0x24,0x25,0x28,
- 0x23,0x30,0x21,0x24,0x3F,0xFE,0x20,0x00,
- }; //濕
- static const unsigned char PROGMEM str_4[] =
- {
- 0x60,0x00,0x91,0xF4,0x96,0x0C,0x6C,0x04,0x08,0x04,0x18,0x00,0x18,0x00,0x18,0x00,
- 0x18,0x00,0x18,0x00,0x18,0x00,0x08,0x00,0x0C,0x04,0x06,0x08,0x01,0xF0,0x00,0x00
- }; //(℃)
- static const unsigned char PROGMEM str_5[] =
- {
- 0x00,0x00,0x00,0x00,0x70,0x00,0xD8,0x00,0xDA,0x00,0x76,0x00,0x0C,0x00,0x18,0x00,
- 0x30,0x00,0x6E,0x00,0x5B,0x00,0x1B,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00
- }; //(%)
- #if (SSD1306_LCDHEIGHT != 64)
- #error("Height incorrect, please fix Adafruit_SSD1306.h!"); //OLED顯示分高度
- #endif
- void setup()
- {
- myservo.attach(DUOJI);
- pinMode(FAN,OUTPUT);
- pinMode(PUMP,OUTPUT);
- pinMode(HLED,OUTPUT);
- pinMode(RED,OUTPUT);
- pinMode(YELLOW,OUTPUT);
- pinMode(GREEN,OUTPUT);
- pinMode(TSignal,INPUT);
- pinMode(BSignal,INPUT);
- digitalWrite(FAN,LOW);
- digitalWrite(PUMP,LOW);
- digitalWrite(HLED,LOW); ;
- digitalWrite(RED,LOW);
- digitalWrite(YELLOW,LOW);
- digitalWrite(GREEN,LOW);
- Serial.begin(9600); //輸出比特率
- I2CBT.begin(9600); //藍(lán)牙傳輸比特率
- display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //OLED顯示起始地址位
- display.clearDisplay();
- }
- void loop()
- {
- time_count+=1;
- oled_display();
- byte Data[3]; //顯示溫度
- byte cmmd[20];
- int insize;
- char str[256];
- int i=(int)(DHT.temperature*10);
- //serialA=I2CBT.read();
- Data[0]='a';
- Data[1]=i/256;
- Data[2]=i%256;
- if(is_auto==1)
- {
- AUTOFAN();
- AUTOBRIGHTNESS();
- AUTOPUMP();
- AUTOJINGGAO();
- AUTOYELLOW ();
- AUTOGREEN ();
- }
- if((insize=(I2CBT.available()))>0)
- {
- is_auto=0; //關(guān)閉自動(dòng)控制
- time_count=0;
- Serial.print("藍(lán)牙數(shù)據(jù)字節(jié)數(shù) = ");
- Serial.println(insize);
- for (int i=0; i<insize; i++)
- {
- Serial.print(cmmd[i]=char(I2CBT.read()),i);
- Serial.print("\n");
- }
- }
- else
- {
- cmmd[0]='z';
- if(time_count>3000)
- {
- is_auto=1;
- }
- }
- switch(cmmd[0]) //讀取第一個(gè)字節(jié)
- {case 49:
- Serial.println(DHT.temperature);
- I2CBT.write(Data[0]);
- I2CBT.write(Data[1]);
- I2CBT.write(Data[2]);
- break;
- case 'g': digitalWrite(RED, HIGH); break; //'g'開(kāi)警示燈
- case 'h': digitalWrite(RED, LOW); break; //‘h’關(guān)警示燈
- case 'k': analogWrite(FAN,255); break; //'k'開(kāi)風(fēng)扇
- case 'l': analogWrite(FAN,0); break; //‘l’關(guān)風(fēng)扇
- case 'i': myservo.write(0); break; //'i'開(kāi)門(mén)
- case 'j': myservo.write(90); break; //‘j’關(guān)門(mén)
- case 'e': digitalWrite(PUMP,HIGH);
- delay(5000); digitalWrite(PUMP,LOW); break; //'e'開(kāi)水泵
- // case 'f': digitalWrite(PUMP,LOW); break; //‘f’關(guān)水泵
- case 'c': digitalWrite(HLED,HIGH); break; //'i'開(kāi)補(bǔ)光燈
- case 'd': digitalWrite(HLED,LOW); break; //‘d’關(guān)補(bǔ)光燈
- case 'b': is_auto=1; break; //‘b’開(kāi)啟自動(dòng)化
- case 'z': break; //直接退出
- default: is_auto=1;
- }
- }
- void oled_display()
- {
- int chk = DHT.read22(DHT22_PIN); //讀取DH22數(shù)據(jù)
- display.setTextSize(1); //設(shè)置字體大小
- display.setTextColor(WHITE); //設(shè)置字體顏色白色
- display.setCursor(0,0); //設(shè)置字體的起始位置
- display.drawBitmap(0, 20, str_1, 16, 16, 1); //在坐標(biāo)X:0 Y:20的位置顯示中文字符溫
- display.drawBitmap(18, 20, str_2, 16, 16, 1); //在坐標(biāo)X:42 Y:16的位置顯示中文字符度
- display.drawBitmap(80, 20, str_4, 16, 16,1); //在坐標(biāo)X:42 Y:16的位置顯示中文字符℃
- display.setCursor(36,25); //設(shè)置字體的起始位置(36,25)
- display.setTextSize(1); //設(shè)置字體大小為1
- display.print(":"); //顯示符號(hào)“:”
- display.println((float)DHT.temperature, 2); //顯示實(shí)時(shí)溫度
- display.drawBitmap(0, 40, str_3, 16, 16, 1); //在坐標(biāo)X:0 Y:40的位置顯示中文字符濕
- display.drawBitmap(18, 40, str_2, 16, 16, 1); //在坐標(biāo)X:18 Y:40的位置顯示中文字符度
- display.drawBitmap(80, 40, str_5, 16, 16, 1); //在坐標(biāo)X:80 Y:40的位置顯示中文字符%
- display.setCursor(36,45); //設(shè)置字體的起始位置(36,25)
- display.setTextSize(1); //設(shè)置字體大小為1
- display.print(":"); //顯示符號(hào)“:”
- display.println((float)DHT.humidity, 2); //顯示實(shí)時(shí)濕度
- display.setCursor(5,5); //設(shè)置字體的起始位置(5,5)
- display.setTextSize(1); //設(shè)置字體大小為1
- display.println("MQ-2:"); //輸出字符"MQ-2:"并換行
- display.setCursor(33,5); //設(shè)置字體的起始位置(5,5)
- display.println(analogRead(A1),1); //顯示模擬口A1的數(shù)據(jù)并換行
- display.display(); //把緩存的都顯示
- display.clearDisplay();
- }
- void AUTOFAN()
- {
- if(DHT.temperature>30)
- {
- analogWrite(FAN,255); //溫度大于30℃打開(kāi)風(fēng)扇
- }
- else if(DHT.temperature<30)
- {
- analogWrite(FAN,0); //溫度小于30℃關(guān)閉風(fēng)扇
- }
- }
- void AUTOPUMP() //如土壤濕度不足開(kāi)啟水泵自動(dòng)加水
- {
- Serial.print("土壤濕度:");
- Serial.println(analogRead(A0));
- if(analogRead(A0) < turang)
- {
- digitalWrite(PUMP,HIGH);
- }
- else if(analogRead(A0) > turang)
- {
- digitalWrite(PUMP,LOW);
- }
- }
- void AUTOJINGGAO() //紅燈警告
- {
- if((analogRead(TSignal) < turang)) //判斷水是否足夠,不足則閃爍,足夠則不閃爍
- {
- digitalWrite(RED, HIGH);
- delay(300);
- digitalWrite(RED, LOW);
- delay(300);
- }
- else if((analogRead(TSignal) > turang))
- {
- digitalWrite(RED,LOW);
- }
- }
- void AUTOYELLOW ()
- {
- if(DHT.temperature>30) //判斷水是否足夠,不足則閃爍,足夠則不閃爍
- {
- digitalWrite(YELLOW, HIGH);
- delay(300);
- digitalWrite(YELLOW, LOW);
- delay(300);
- }
- else if(DHT.temperature<30)
- {
- digitalWrite(YELLOW,LOW);
- }
- }
- void AUTOGREEN()
- {
- if(analogRead(BSignal) < ck003) //判斷水是否足夠,不足則閃爍,足夠則不閃爍
- {
- digitalWrite(GREEN, HIGH);
- delay(300);
- digitalWrite(GREEN, LOW);
- delay(300);
- }
- else if(analogRead(BSignal) > ck003)
- {
- digitalWrite(GREEN,LOW);
- }
- }
- void AUTOBRIGHTNESS() //光度不夠時(shí)增加亮度呼吸燈
- {
- Serial.print("光度系數(shù):");
- Serial.println(analogRead(BSignal));
- if(analogRead(BSignal) < ck003)
- {
- digitalWrite(HLED,HIGH);
- delay(500);
- }
- else if(analogRead(BSignal) > ck003)
- {
- digitalWrite(HLED,LOW);
- }
- delay(500);
- }
復(fù)制代碼
/*
app inventor 部分
組間設(shè)計(jì):
邏輯設(shè)計(jì):
初始化
藍(lán)牙準(zhǔn)備與選擇
各種用電器
獲取數(shù)據(jù)
App inventor上述aia文件 (無(wú)密碼)
App inventor 可用網(wǎng)站 app.gzjkw點(diǎn)net/login/
問(wèn)題:1、無(wú)法通過(guò)藍(lán)牙控制用電器
2、程序劃線部分無(wú)法在arduino串口監(jiān)視器中觀察到由Android輸入的數(shù)據(jù)
思考(這樣思考是不是正確的):1、arduino是由收到Android手機(jī)發(fā)送的文本開(kāi)控制IO口的電位拉高或者置低。接受Android收的文本指令傳到串口,我們要做的就是讀取串口的數(shù)據(jù)(Serial .read),再輸出指令并執(zhí)行(Serial .println)。(即劃線部分)問(wèn)題在于打開(kāi)串口監(jiān)視器無(wú)法觀察到由Android端接受的指令。
2、顯示器不在自動(dòng)化與藍(lán)牙模式之內(nèi)。是否可以用中斷來(lái)減低運(yùn)存(僅思想,首要解決第一個(gè)問(wèn)題)。
*/
全部資料51hei下載地址:
arduino211.7z
(1.68 MB, 下載次數(shù): 72)
2018-5-29 23:12 上傳
點(diǎn)擊文件名下載附件
包括源碼和額外庫(kù)文件
|
|