|
采用了oled顯示屏,用于顯示設(shè)置菜單和數(shù)據(jù)可以設(shè)置定時澆花,背光,繼電器參數(shù)和智能澆花
通過多線程,做到精確定時和澆花時播放灑水車BGM
IMG_20180119_063657.jpg (3.75 MB, 下載次數(shù): 108)
下載附件
2018-1-19 23:11 上傳
實際測試
IMG_20180119_230431.jpg (3.53 MB, 下載次數(shù): 111)
下載附件
2018-1-19 23:11 上傳
啟動LOGO
D43]QU{MT57~G1Q~J{6V~9R.png (141.2 KB, 下載次數(shù): 119)
下載附件
2018-1-19 23:11 上傳
代碼片段
單片機源程序如下:
- #include <Metro.h>
- #include <Adafruit_GFX.h>
- #include <Adafruit_SSD1306.h>
- #define OLED_RESET 4
- Adafruit_SSD1306 display(OLED_RESET);
- #define LOGO16_GLCD_HEIGHT 16 //定義顯示高度
- #define LOGO16_GLCD_WIDTH 16 //定義顯示寬度
- #if (SSD1306_LCDHEIGHT != 64)
- #error("Height incorrect, please fix Adafruit_SSD1306.h!");
- #endif
- int h=0;
- int m=0;
- int s=0;
- int SOLEDT=300; //默認(rèn)背光時間為300刻
- int SRT=5; //設(shè)置澆灌時間為5 警告:如果為0將無限澆灌 導(dǎo)致水浸田
- int RT=0; //澆灌時間
- boolean RTM=false; //繼電器模式 默認(rèn)為True即VCC
- boolean WSP=false; //是否開啟缺水保護
- int SM=0; // 傳感器值的存儲變量
- int HC=50; // 濕度緩存
- int CST=0; //運行周期檢測一次泥土濕度
- int OLEDT=300; //OLED點亮?xí)r間
- int NKey=0; //按鍵數(shù)量
- int CL=1; //選擇圖標(biāo)位置
- String CM="SET"; //選擇處在模式
- String soil = "ERROR"; //土壤狀態(tài)初始化
- boolean DEBUG = false; //DEBUG模式
- boolean TR=false; //計時器默認(rèn)關(guān)閉 除非手動設(shè)置
- int TH=0; //默認(rèn)計時澆灌為0小時 除非手動設(shè)置
- //字符存儲區(qū)
- static const unsigned char PROGMEM choose[] = {0x18,0x38,0x78,0xF8,0xF8,0x78,0x38,0x18,}; //選擇圖案
- static const unsigned char PROGMEM logo[] = {
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- …………
- …………
- …………限于本文篇幅 字庫請從51黑下載附件…………
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}; //LOGO
- //請不要修改上面這一部分,尊重一下作者謝謝!
- //聲音合成器音調(diào)
- #define NOTE_G0 -1
- #define NOTE_G1 393
- #define NOTE_G2 441
- #define NOTE_G3 495
- #define NOTE_G4 556
- #define NOTE_G5 624
- #define NOTE_G6 661
- #define NOTE_G7 742
- #define NOTE_GL1 196
- #define NOTE_GL2 221
- #define NOTE_GL3 234
- #define NOTE_GL4 262
- #define NOTE_GL5 294
- #define NOTE_GL6 330
- #define NOTE_GL7 371
- #define NOTE_GH1 786
- #define NOTE_GH2 882
- #define NOTE_GH3 990
- #define NOTE_GH4 1049
- #define NOTE_GH5 1178
- #define NOTE_GH6 1322
- #define NOTE_GH7 1484
- #define WHOLE 1
- #define HALF 0.5
- #define QUARTER 0.25
- #define EIGHTH 0.25
- #define SIXTEENTH 0.625
- //列出所有節(jié)拍
- int tune[]= //根據(jù)簡譜列出各頻率
- {
- /*
- NOTE_GL3,NOTE_GL4,
- NOTE_GL5,NOTE_GL3,
- NOTE_G1,NOTE_G2,NOTE_G1,
-
- NOTE_G1,NOTE_GL7,
- NOTE_GL7,NOTE_GL2,NOTE_GL3,
- NOTE_GL4,NOTE_G2,
- NOTE_GL7,NOTE_G1,NOTE_GL7,
- NOTE_GL6,NOTE_GL5,
- NOTE_GL5,NOTE_GL3,NOTE_GL4,
- NOTE_GL5,NOTE_G1,NOTE_G2,
- NOTE_G3,NOTE_G2,NOTE_G1,
- NOTE_GL6,NOTE_G2,NOTE_G3,
- NOTE_G4,NOTE_G3,NOTE_G2,
- NOTE_GL5,NOTE_G4,
- NOTE_G3,NOTE_G2,
- NOTE_G1,
- NOTE_G1,
- */
- NOTE_G1,
- NOTE_G3,NOTE_G1,
- NOTE_G2,NOTE_G2,
- NOTE_G2,
- NOTE_G2,NOTE_G2,
- NOTE_G4,NOTE_G2,
- NOTE_G3,NOTE_G3,
- NOTE_G3,
- NOTE_G3,NOTE_G3,
- NOTE_G5,NOTE_G3,
- NOTE_G4,NOTE_G4,
- NOTE_G4,NOTE_G3,NOTE_G2,
- NOTE_GL5,
- NOTE_GL7,
- NOTE_G1,
- NOTE_G1,
- };
- float duration[]={1,2,2,3,1,4,3,1,2,2,3,1,4,3,1,2,2,3,1,2,1,1,4,4,4,2,};
- int length;//這里定義一個變量,后面用來表示共有多少個音符
- Metro T1 = Metro(0); //主程序
- Metro T2 = Metro(1000); //定時器
- void setup() {
- display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3D (for the 128x64)
- pinMode(12, OUTPUT); //繼電器GPIO
- pinMode(11, INPUT); //上GPIO
- pinMode(10, INPUT); //下GPIO
- pinMode(9, INPUT); //左GPIO
- pinMode(8, INPUT); //右GPIO
- pinMode(7, INPUT); //AGPIO
- pinMode(6, INPUT); //BGPIO
- digitalWrite(11,LOW);
- digitalWrite(10,LOW);
- digitalWrite(9,LOW);
- digitalWrite(8,LOW);
- digitalWrite(7,LOW);
- digitalWrite(6,LOW);
- display.clearDisplay();
- pinMode(5,OUTPUT);//設(shè)置蜂鳴器的pin為輸出模式
- length = sizeof(tune)/sizeof(tune[0]);//這里用了一個sizeof函數(shù),可以查出tone序列里有多少個音符
- display.drawBitmap(0, 0, logo, 128, 64, 1);
- display.display();
- delay(2000);
- }
- void loop() {
- if(T1.check()){
- //###############################################################
- //檢測按鍵 如果其中一個按鍵激活 那么點亮屏幕
- for (int i = 6; i < 12; i++) {
- if (digitalRead(i) == HIGH) {
- NKey +=1;
- OLEDT=SOLEDT; //設(shè)置OLED亮屏?xí)r間為多少個程序周期
- }
- }
- //###############################################################
- if (WSP == true) {
- if (CST > 30) {
- CST=0;
- //100個程序周期執(zhí)行一次
- SM = analogRead(A0); //獲取泥土濕度數(shù)據(jù)
- if (SM > 500) {
- soil = "wet";
- if (HC < 100) {
- HC +=1;
- }
- } else {
- soil = "dry";
- HC -=1;
- }
- if (HC < 1) {
- HC = 50;
- RT = 10;
- }
- }
- }
- //###############################################################
- //澆灌程序
- if (RT > 0) {
- for(int x=0;x<length;x++)//循環(huán)音符的次數(shù)
- {
- tone(5,tune[x]);//此函數(shù)依次播放tune序列里的數(shù)組,即每個音符
- delay(300*duration[x]);//每個音符持續(xù)的時間,即節(jié)拍duration,400是調(diào)整時間的越大,曲子速度越慢,越小曲子速度越快,自己掌握吧
- noTone(5);//停止當(dāng)前音符,進入下一音符
- }
- if (RTM == true) {digitalWrite(12,HIGH);} else {digitalWrite(12,LOW);}
- delay(1000*RT);
- RT=0;
- }
- if (RTM == true) {digitalWrite(12,LOW);} else {digitalWrite(12,HIGH);}
- //###############################################################
- //計算部分
- CST +=1; //土壤檢測器運行周期
- if (NKey == 2) {
- if (DEBUG == true) {DEBUG=false;}else{DEBUG=true;}
- delay(200);
- }
- NKey=0; //有多少個按鍵同時在按
- //菜單選擇按鈕移動
- if (digitalRead(11) == HIGH) {if (CL > 1) {CL -=1;}delay(100);} //按上鍵
- if (digitalRead(10) == HIGH) {CL +=1;delay(100);} //按下鍵
- if (CM == "SET") {if (CL > 4) CL=4;}
- if (CM == "RW") {if (CL > 3) CL=3;}
- if (CM == "BL") {if (CL > 1) CL=1;}
- if (CM == "R") {if (CL > 1) CL=1;}
- if (CM == "WSP") {if (CL > 1) CL=1;}
- //按下左鍵
- if (digitalRead(9) == HIGH) {
- if (CM == "RW") {if (CL == 2) {if (TH > 0) {TH -=1;TR=false;}}} //進入設(shè)置定時減一小時
- if (CM == "RW") {if (CL == 3) {if (SRT > 5) {SRT -=1;TR=false;}}} //進入設(shè)置定時-1s
- if (CM == "BL") {if (CL == 1) {if (SOLEDT > 10) {SOLEDT -=10 ;}}} //設(shè)置背光
- delay(50);
- }
- //按下右鍵
- if (digitalRead(8) == HIGH) {
- if (CM == "RW") {if (CL == 2) {if (TH < 999) {TH +=1;TR=false;}}} //進入設(shè)置定時加一小時
- if (CM == "RW") {if (CL == 3) {if (SRT < 999) {SRT +=1;TR=false;}}} //進入設(shè)置定時+1s
- if (CM == "BL") {if (CL == 1) {SOLEDT +=10;}} //設(shè)置背光
- delay(50);
- }
- //當(dāng)按下A鍵后
- if (digitalRead(7) == HIGH) {
- if (CM == "RW") {if (CL == 1) {if (TR == true) {TR=false;} else {if (TH > 0){TR=true;h=TH;}}}} //進入設(shè)置定時澆灌是否開啟
- if (CM == "R") {if (CL == 1) {if (RTM == true) {RTM=false;} else {RTM=true;}}} //設(shè)置繼電器觸發(fā)模式
- if (CM == "WSP") {if (CL == 1) {if (WSP == true) {WSP=false;} else {WSP=true;}}} //設(shè)置繼電器觸發(fā)模式
- if (CM == "SET") {if (CL == 1) {CM="RW";}} //進入設(shè)置定時器
- if (CM == "SET") {if (CL == 2) {CM="BL";}} //進入設(shè)置背光時間
- if (CM == "SET") {if (CL == 3) {CM="R";}} //進入設(shè)置繼電器
- if (CM == "SET") {if (CL == 4) {CM="WSP";}} //進入設(shè)置缺水保護
- delay(150);
- }
- //按下B鍵
- if (digitalRead(6) == HIGH) {CM="SET";delay(50);} //返回主菜單
- //如果定時澆花到時間就啟動澆灌
- //if (TR == true) {if (millis()/1000/3600 > TS) {TS=((millis()/1000/3600)+TH)-1; RT=SRT;}}
- //###############################################################
- //顯示部分
- display.clearDisplay();
- if (OLEDT > 0) {
- OLEDT -=1;
- display.setTextSize(1); //設(shè)置字體大小
- display.setTextColor(WHITE); //設(shè)置字體顏色白色
- display.setCursor(0,0); //設(shè)置字體的起始位置
- //DEBUG顯示
- if (DEBUG == true) {
- display.println(" DEBUG MODE"); //輸出字符
- display.print("soil moisture: "); //輸出字符
- display.println(soil); //輸出字符并換行
- display.print("HC: "); //輸出字符
- display.println(HC); //輸出字符并換行
- display.print("Running Time: "); //輸出字符并換行
- display.println(millis()/1000); //輸出字符并換行
- display.print(h);
- display.print(":");
- display.print(m);
- display.print(":");
- display.println(s);
- }else{
- //正常顯示區(qū)
- display.setTextSize(1); //設(shè)置字體大小
- //設(shè)置界面
- if (CM == "SET") {
- display.println(">>SET"); //輸出字符
- display.println("1.Regular watering");
- display.println("2.Backlight");
- display.println("3.Relay");
- display.println("4.Soil detector");
- display.println("");
- display.println("");
- display.println("2018-1-17 v2.1.1");
- display.drawBitmap(119, 8*CL, choose, 8, 8, 1);
- }
- //設(shè)置定時界面
- if (CM == "RW") {
- display.println(">>Regular Watering"); //輸出字符
- display.print("1.state: ");
- if (TR == true) {display.println("True");}else{display.println("False");}
- display.print("2.timing: ");
- display.print(TH);
- display.println(" Hours");
- display.println("3.Watering time: ");
- display.print(" ");
- display.print(SRT);
- display.println(" Sin");
- }
- //設(shè)置背光界面
- if (CM == "BL") {
- display.println(">>Backlight"); //輸出字符
- display.print("1.Time: ");
- display.print(SOLEDT);
- display.println(" t");
- }
- //設(shè)置繼電器界面
- if (CM == "R") {
- display.println(">>Relay"); //輸出字符
- display.print("1.Trigger mode: ");
- if (RTM == true) {display.println("HIGH");}else{display.println("LOW");}
- }
- //設(shè)置缺水保護界面
- if (CM == "WSP") {
- display.println(">>WSP"); //輸出字符
- display.print("1.state: ");
- if (WSP == true) {display.println("True");}else{display.println("False");}
- }
- //畫光標(biāo)
- display.drawBitmap(119, 8*CL, choose, 8, 8, 1);
- }
- }
- display.display(); //把緩存的都顯示
- }
- if(T2.check()){
- if (TR == true) {
- s -=1; //續(xù)一秒獻(xiàn)給長者
- if (s<0) {
- if (m>0) {
- m -=1;
- s=59;
- }else{
- if (h>0) {
- h -=1;
- m=59;
- s=59;
- }else{
- //時間到了澆花!
- h=TH-1;
- …………
- …………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
water.zip
(4.19 KB, 下載次數(shù): 95)
2018-1-19 23:13 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|