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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8398|回復(fù): 11
打印 上一主題 下一主題
收起左側(cè)

arduino 澆花機 oled菜單

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:277903 發(fā)表于 2018-1-19 23:17 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
采用了oled顯示屏,用于顯示設(shè)置菜單和數(shù)據(jù)可以設(shè)置定時澆花,背光,繼電器參數(shù)和智能澆花
通過多線程,做到精確定時和澆花時播放灑水車BGM

實際測試

啟動LOGO

代碼片段

單片機源程序如下:
  1. #include <Metro.h>  
  2. #include <Adafruit_GFX.h>  
  3. #include <Adafruit_SSD1306.h>  
  4. #define OLED_RESET 4  
  5. Adafruit_SSD1306 display(OLED_RESET);  
  6. #define LOGO16_GLCD_HEIGHT 16 //定義顯示高度  
  7. #define LOGO16_GLCD_WIDTH  16 //定義顯示寬度  
  8. #if (SSD1306_LCDHEIGHT != 64)  
  9. #error("Height incorrect, please fix Adafruit_SSD1306.h!");  
  10. #endif
  11. int h=0;
  12. int m=0;
  13. int s=0;
  14. int SOLEDT=300; //默認(rèn)背光時間為300刻
  15. int SRT=5; //設(shè)置澆灌時間為5 警告:如果為0將無限澆灌 導(dǎo)致水浸田
  16. int RT=0; //澆灌時間
  17. boolean RTM=false; //繼電器模式 默認(rèn)為True即VCC
  18. boolean WSP=false; //是否開啟缺水保護
  19. int SM=0;  // 傳感器值的存儲變量
  20. int HC=50; // 濕度緩存
  21. int CST=0; //運行周期檢測一次泥土濕度
  22. int OLEDT=300; //OLED點亮?xí)r間
  23. int NKey=0; //按鍵數(shù)量
  24. int CL=1; //選擇圖標(biāo)位置
  25. String CM="SET"; //選擇處在模式
  26. String soil = "ERROR"; //土壤狀態(tài)初始化
  27. boolean DEBUG = false; //DEBUG模式
  28. boolean TR=false; //計時器默認(rèn)關(guān)閉  除非手動設(shè)置
  29. int TH=0; //默認(rèn)計時澆灌為0小時  除非手動設(shè)置
  30. //字符存儲區(qū)
  31. static const unsigned char PROGMEM choose[] =  {0x18,0x38,0x78,0xF8,0xF8,0x78,0x38,0x18,}; //選擇圖案
  32. static const unsigned char PROGMEM logo[] =  {
  33. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  34. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  35. …………
  36. …………
  37. …………限于本文篇幅 字庫請從51黑下載附件…………
  38. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  39. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}; //LOGO
  40. //請不要修改上面這一部分,尊重一下作者謝謝!
  41. //聲音合成器音調(diào)
  42. #define NOTE_G0 -1
  43. #define NOTE_G1 393
  44. #define NOTE_G2 441
  45. #define NOTE_G3 495
  46. #define NOTE_G4 556
  47. #define NOTE_G5 624
  48. #define NOTE_G6 661
  49. #define NOTE_G7 742

  50. #define NOTE_GL1 196
  51. #define NOTE_GL2 221
  52. #define NOTE_GL3 234
  53. #define NOTE_GL4 262
  54. #define NOTE_GL5 294
  55. #define NOTE_GL6 330
  56. #define NOTE_GL7 371

  57. #define NOTE_GH1 786
  58. #define NOTE_GH2 882
  59. #define NOTE_GH3 990
  60. #define NOTE_GH4 1049
  61. #define NOTE_GH5 1178
  62. #define NOTE_GH6 1322
  63. #define NOTE_GH7 1484

  64. #define WHOLE 1  
  65. #define HALF 0.5  
  66. #define QUARTER 0.25  
  67. #define EIGHTH 0.25  
  68. #define SIXTEENTH 0.625  
  69. //列出所有節(jié)拍  
  70. int tune[]=                 //根據(jù)簡譜列出各頻率  
  71. {  
  72.   /*
  73.   NOTE_GL3,NOTE_GL4,
  74.   NOTE_GL5,NOTE_GL3,
  75.   NOTE_G1,NOTE_G2,NOTE_G1,
  76.   
  77.   NOTE_G1,NOTE_GL7,
  78.   NOTE_GL7,NOTE_GL2,NOTE_GL3,
  79.   NOTE_GL4,NOTE_G2,

  80.   NOTE_GL7,NOTE_G1,NOTE_GL7,
  81.   NOTE_GL6,NOTE_GL5,
  82.   NOTE_GL5,NOTE_GL3,NOTE_GL4,

  83.   NOTE_GL5,NOTE_G1,NOTE_G2,
  84.   NOTE_G3,NOTE_G2,NOTE_G1,
  85.   NOTE_GL6,NOTE_G2,NOTE_G3,

  86.   NOTE_G4,NOTE_G3,NOTE_G2,
  87.   NOTE_GL5,NOTE_G4,
  88.   NOTE_G3,NOTE_G2,

  89.   NOTE_G1,
  90.   NOTE_G1,
  91.   */
  92.   NOTE_G1,

  93.   NOTE_G3,NOTE_G1,
  94.   NOTE_G2,NOTE_G2,
  95.   NOTE_G2,
  96.   NOTE_G2,NOTE_G2,
  97.   NOTE_G4,NOTE_G2,

  98.   NOTE_G3,NOTE_G3,
  99.   NOTE_G3,
  100.   NOTE_G3,NOTE_G3,
  101.   NOTE_G5,NOTE_G3,
  102.   NOTE_G4,NOTE_G4,

  103.   NOTE_G4,NOTE_G3,NOTE_G2,
  104.   NOTE_GL5,
  105.   NOTE_GL7,
  106.   NOTE_G1,
  107.   NOTE_G1,
  108. };  
  109. 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,};  
  110. int length;//這里定義一個變量,后面用來表示共有多少個音符

  111. Metro T1 = Metro(0);   //主程序
  112. Metro T2 = Metro(1000); //定時器
  113. void setup()   {      
  114.   display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3D (for the 128x64)  
  115.   pinMode(12, OUTPUT); //繼電器GPIO
  116.   pinMode(11, INPUT); //上GPIO
  117.   pinMode(10, INPUT); //下GPIO
  118.   pinMode(9, INPUT); //左GPIO
  119.   pinMode(8, INPUT); //右GPIO
  120.   pinMode(7, INPUT); //AGPIO
  121.   pinMode(6, INPUT); //BGPIO
  122.   digitalWrite(11,LOW);
  123.   digitalWrite(10,LOW);
  124.   digitalWrite(9,LOW);
  125.   digitalWrite(8,LOW);
  126.   digitalWrite(7,LOW);
  127.   digitalWrite(6,LOW);
  128.   display.clearDisplay();
  129.   pinMode(5,OUTPUT);//設(shè)置蜂鳴器的pin為輸出模式
  130.   length = sizeof(tune)/sizeof(tune[0]);//這里用了一個sizeof函數(shù),可以查出tone序列里有多少個音符
  131.   display.drawBitmap(0, 0, logo, 128, 64, 1);
  132.   display.display();
  133.   delay(2000);
  134. }
  135. void loop() {  
  136.    if(T1.check()){
  137.   //###############################################################
  138.   //檢測按鍵 如果其中一個按鍵激活 那么點亮屏幕
  139.    for (int i = 6; i < 12; i++) {
  140.   if (digitalRead(i) == HIGH) {
  141.     NKey +=1;
  142.     OLEDT=SOLEDT; //設(shè)置OLED亮屏?xí)r間為多少個程序周期
  143.     }
  144.    }
  145.   //###############################################################
  146. if (WSP == true) {
  147.   if (CST > 30) {
  148.     CST=0;
  149.   //100個程序周期執(zhí)行一次
  150.   SM = analogRead(A0); //獲取泥土濕度數(shù)據(jù)
  151. if (SM > 500) {
  152.     soil = "wet";
  153.     if (HC < 100) {
  154.     HC +=1;
  155.     }
  156.   } else {
  157.     soil = "dry";
  158.     HC -=1;
  159.   }
  160. if (HC < 1) {
  161.   HC = 50;
  162.   RT = 10;
  163.   }
  164. }
  165. }
  166. //###############################################################
  167. //澆灌程序
  168. if (RT > 0) {
  169.   for(int x=0;x<length;x++)//循環(huán)音符的次數(shù)
  170.    {
  171.        tone(5,tune[x]);//此函數(shù)依次播放tune序列里的數(shù)組,即每個音符
  172.        delay(300*duration[x]);//每個音符持續(xù)的時間,即節(jié)拍duration,400是調(diào)整時間的越大,曲子速度越慢,越小曲子速度越快,自己掌握吧
  173.        noTone(5);//停止當(dāng)前音符,進入下一音符
  174.    }
  175.   if (RTM == true) {digitalWrite(12,HIGH);} else {digitalWrite(12,LOW);}
  176.   delay(1000*RT);
  177.   RT=0;
  178. }
  179. if (RTM == true) {digitalWrite(12,LOW);} else {digitalWrite(12,HIGH);}
  180. //###############################################################
  181.   //計算部分
  182.   CST +=1; //土壤檢測器運行周期
  183.   if (NKey == 2) {
  184.     if (DEBUG == true) {DEBUG=false;}else{DEBUG=true;}
  185.     delay(200);
  186.     }
  187.   NKey=0;  //有多少個按鍵同時在按
  188.   //菜單選擇按鈕移動
  189.   if (digitalRead(11) == HIGH) {if (CL > 1) {CL -=1;}delay(100);} //按上鍵
  190.   if (digitalRead(10) == HIGH) {CL +=1;delay(100);} //按下鍵
  191.   if (CM == "SET") {if (CL > 4) CL=4;}
  192.   if (CM == "RW") {if (CL > 3) CL=3;}
  193.   if (CM == "BL") {if (CL > 1) CL=1;}
  194.   if (CM == "R") {if (CL > 1) CL=1;}
  195.   if (CM == "WSP") {if (CL > 1) CL=1;}
  196.   //按下左鍵
  197.   if (digitalRead(9) == HIGH) {
  198.     if (CM == "RW") {if (CL == 2) {if (TH > 0) {TH -=1;TR=false;}}}  //進入設(shè)置定時減一小時
  199.     if (CM == "RW") {if (CL == 3) {if (SRT > 5) {SRT -=1;TR=false;}}}  //進入設(shè)置定時-1s
  200.     if (CM == "BL") {if (CL == 1) {if (SOLEDT > 10) {SOLEDT -=10 ;}}}  //設(shè)置背光
  201.     delay(50);
  202.     }
  203.   //按下右鍵
  204.   if (digitalRead(8) == HIGH) {
  205.     if (CM == "RW") {if (CL == 2) {if (TH < 999) {TH +=1;TR=false;}}}  //進入設(shè)置定時加一小時
  206.     if (CM == "RW") {if (CL == 3) {if (SRT < 999) {SRT +=1;TR=false;}}}  //進入設(shè)置定時+1s
  207.     if (CM == "BL") {if (CL == 1) {SOLEDT +=10;}}  //設(shè)置背光
  208.     delay(50);
  209.     }
  210.   //當(dāng)按下A鍵后
  211.   if (digitalRead(7) == HIGH) {
  212.   if (CM == "RW") {if (CL == 1) {if (TR == true) {TR=false;} else {if (TH > 0){TR=true;h=TH;}}}}  //進入設(shè)置定時澆灌是否開啟
  213.   if (CM == "R") {if (CL == 1) {if (RTM == true) {RTM=false;} else {RTM=true;}}}  //設(shè)置繼電器觸發(fā)模式
  214.   if (CM == "WSP") {if (CL == 1) {if (WSP == true) {WSP=false;} else {WSP=true;}}}  //設(shè)置繼電器觸發(fā)模式
  215.   if (CM == "SET") {if (CL == 1) {CM="RW";}} //進入設(shè)置定時器
  216.   if (CM == "SET") {if (CL == 2) {CM="BL";}} //進入設(shè)置背光時間
  217.   if (CM == "SET") {if (CL == 3) {CM="R";}} //進入設(shè)置繼電器
  218.   if (CM == "SET") {if (CL == 4) {CM="WSP";}} //進入設(shè)置缺水保護
  219.   delay(150);
  220.   }
  221.   //按下B鍵
  222.   if (digitalRead(6) == HIGH) {CM="SET";delay(50);} //返回主菜單
  223.   //如果定時澆花到時間就啟動澆灌
  224.   //if (TR == true) {if (millis()/1000/3600 > TS) {TS=((millis()/1000/3600)+TH)-1; RT=SRT;}}
  225.   //###############################################################
  226.   //顯示部分
  227.   display.clearDisplay();
  228.   if (OLEDT > 0) {
  229.   OLEDT -=1;
  230.   display.setTextSize(1);             //設(shè)置字體大小  
  231.   display.setTextColor(WHITE);        //設(shè)置字體顏色白色  
  232.   display.setCursor(0,0);             //設(shè)置字體的起始位置
  233.   //DEBUG顯示
  234.   if (DEBUG == true) {
  235.   display.println("     DEBUG MODE");   //輸出字符
  236.   display.print("soil moisture: ");   //輸出字符
  237.   display.println(soil);   //輸出字符并換行
  238.   display.print("HC:  ");   //輸出字符
  239.   display.println(HC);   //輸出字符并換行
  240.   display.print("Running Time: ");   //輸出字符并換行
  241.   display.println(millis()/1000);   //輸出字符并換行
  242.   display.print(h);
  243.   display.print(":");
  244.   display.print(m);
  245.   display.print(":");  
  246.   display.println(s);
  247.   }else{
  248.     //正常顯示區(qū)
  249.     display.setTextSize(1);             //設(shè)置字體大小  
  250.     //設(shè)置界面
  251.     if (CM == "SET") {
  252.     display.println(">>SET");   //輸出字符
  253.     display.println("1.Regular watering");
  254.     display.println("2.Backlight");
  255.     display.println("3.Relay");
  256.     display.println("4.Soil detector");
  257.     display.println("");
  258.     display.println("");
  259.     display.println("2018-1-17 v2.1.1");
  260.     display.drawBitmap(119, 8*CL, choose, 8, 8, 1);
  261.     }
  262.     //設(shè)置定時界面
  263.     if (CM == "RW") {
  264.     display.println(">>Regular Watering");   //輸出字符
  265.     display.print("1.state: ");
  266.     if (TR == true) {display.println("True");}else{display.println("False");}
  267.     display.print("2.timing: ");
  268.     display.print(TH);
  269.     display.println("  Hours");
  270.     display.println("3.Watering time: ");
  271.     display.print("        ");
  272.     display.print(SRT);
  273.     display.println("  Sin");
  274.     }
  275.     //設(shè)置背光界面
  276.     if (CM == "BL") {
  277.     display.println(">>Backlight");   //輸出字符
  278.     display.print("1.Time: ");
  279.     display.print(SOLEDT);
  280.     display.println("  t");
  281.     }
  282.     //設(shè)置繼電器界面
  283.     if (CM == "R") {
  284.     display.println(">>Relay");   //輸出字符
  285.     display.print("1.Trigger mode: ");
  286.    if (RTM == true) {display.println("HIGH");}else{display.println("LOW");}
  287.     }
  288.     //設(shè)置缺水保護界面
  289.     if (CM == "WSP") {
  290.     display.println(">>WSP");   //輸出字符
  291.     display.print("1.state: ");
  292.     if (WSP == true) {display.println("True");}else{display.println("False");}
  293.     }
  294.     //畫光標(biāo)
  295.     display.drawBitmap(119, 8*CL, choose, 8, 8, 1);
  296.     }
  297.     }
  298.   display.display();                  //把緩存的都顯示
  299.    }
  300.         if(T2.check()){
  301.           if (TR == true) {
  302.           s -=1; //續(xù)一秒獻(xiàn)給長者
  303.         if (s<0) {
  304.           if (m>0) {
  305.             m -=1;
  306.             s=59;
  307.             }else{
  308.               if (h>0) {
  309.                 h -=1;
  310.                 m=59;
  311.                 s=59;
  312.                 }else{
  313.                   //時間到了澆花!
  314.                   h=TH-1;
  315. …………
  316. …………
  317. …………限于本文篇幅 余下代碼請從51黑下載附件…………

復(fù)制代碼

所有資料51hei提供下載:
water.zip (4.19 KB, 下載次數(shù): 95)


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:44037 發(fā)表于 2018-1-20 10:28 | 只看該作者
謝謝分享   學(xué)習(xí)一下
回復(fù)

使用道具 舉報

板凳
ID:195161 發(fā)表于 2018-1-21 12:16 | 只看該作者
學(xué)習(xí)了。
回復(fù)

使用道具 舉報

地板
ID:209742 發(fā)表于 2018-5-22 13:38 | 只看該作者
厲害了!澆花都能智能了
回復(fù)

使用道具 舉報

5#
ID:353002 發(fā)表于 2018-6-16 21:08 | 只看該作者
66666!!!懶人的福音。。。
回復(fù)

使用道具 舉報

6#
ID:367080 發(fā)表于 2019-8-7 10:02 | 只看該作者
樓主真實高手,澆花都用水自動化了,羨慕羨慕。
回復(fù)

使用道具 舉報

7#
ID:171746 發(fā)表于 2019-9-5 06:37 | 只看該作者
編輯出Arduino:1.8.9 (Windows 7), 開發(fā)板:"Arduino/Genuino Uno"

water:1:21: error: Metro.h: No such file or directory

compilation terminated.

exit status 1
Metro.h: No such file or directory

在文件 -> 首選項開啟
“編譯過程中顯示詳細(xì)輸出”選項
這份報告會包含更多信息。
請問 這是哪的問題?
回復(fù)

使用道具 舉報

8#
ID:809322 發(fā)表于 2020-7-29 17:43 | 只看該作者
lucq7896 發(fā)表于 2019-9-5 06:37
編輯出Arduino:1.8.9 (Windows 7), 開發(fā)板:"Arduino/Genuino Uno"

water:1:21: error: Metro.h: No suc ...

沒有安裝Metro.h包,那個選項會把編譯時執(zhí)行日志全部顯示,如果打開輸出會非常多,所以報告長度增加屬正,F(xiàn)象
回復(fù)

使用道具 舉報

9#
ID:171746 發(fā)表于 2021-2-28 16:45 | 只看該作者
本帖最后由 lucq7896 于 2021-3-10 18:18 編輯


#error("Height incorrect, please fix Adafruit_SSD1306.h!");  
    這地方通不過  實在不懂啊
回復(fù)

使用道具 舉報

10#
ID:171746 發(fā)表于 2021-2-28 16:45 | 只看該作者
hit-road 發(fā)表于 2020-7-29 17:43
沒有安裝Metro.h包,那個選項會把編譯時執(zhí)行日志全部顯示,如果打開輸出會非常多,所以報告長度增加屬正 ...

謝謝   
回復(fù)

使用道具 舉報

11#
ID:171746 發(fā)表于 2021-3-8 06:28 | 只看該作者
本帖最后由 lucq7896 于 2021-3-10 18:20 編輯

樓主: #error("Height incorrect, please fix Adafruit_SSD1306.h!")   求各位幫忙解決下。謝謝
回復(fù)

使用道具 舉報

12#
ID:171746 發(fā)表于 2021-3-8 06:33 | 只看該作者
本帖最后由 lucq7896 于 2021-3-10 18:16 編輯

#error("Height incorrect, please fix Adafruit_SSD1306.h!") 這句通不過
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 成人一区二区三区 | 亚洲欧美国产精品一区二区 | 日韩精品一区二区三区视频播放 | 午夜欧美| 亚洲成人二区 | 日韩精品一区二 | 国产精品亚洲一区 | 91色在线| 久久里面有精品 | 福利视频大全 | 国产做a爱片久久毛片 | 日韩视频一区二区三区 | 亚洲草草视频 | 久久伊人青青草 | 黄色国产在线播放 | 中国一级特黄毛片大片 | 九九视频在线观看视频6 | 91麻豆产精品久久久久久 | 午夜一级黄色片 | 亚洲国产偷 | 91成人午夜性a一级毛片 | 一区在线播放 | 天天弄天天操 | 久久夜夜 | 久久高清 | 久久久精品网站 | 男女av| 日韩欧美在线观看 | 中文字幕精品视频 | 欧美在线视频一区二区 | 一区二区三区四区国产精品 | 午夜激情一区 | 国产精品视频网址 | 一级做a爰片性色毛片16 | 香蕉视频在线播放 | 日韩a视频| av在线一区二区三区 | 日本精品一区二区三区在线观看视频 | 喷潮网站 | 亚洲精品乱码久久久久久蜜桃91 | 日本成人中文字幕 |