找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

arduino Uno lcd1602,4*4鍵盤,DHT11溫度傳感,28BYJ-48步進(jìn)電機(jī)綜合案例

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:57512 發(fā)表于 2018-5-25 06:00 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
這個(gè)是arduino綜合案例,希望有助于大家做畢設(shè),或者自己玩玩。
原名“溫控流量混合裝置”
作用:一個(gè)水管出熱水,一個(gè)水管出冷水,檢測(cè)混合之后的溫度和流量,混合之后出溫水。顯示目標(biāo)溫度和目標(biāo)流量,當(dāng)前溫度和當(dāng)前流量。


//////////////////////////////////////////////可以忽略上面的內(nèi)容/////////////////////////////////


簡(jiǎn)化后:“溫控混合裝置”,供大家學(xué)習(xí)
簡(jiǎn)圖如下
主要所需材料:arduinoUno主板,lcd1602,4*4薄膜鍵盤,dht11溫度傳感,ULN2003(用于驅(qū)動(dòng)步進(jìn)電機(jī)),28BYJ-48步進(jìn)電機(jī)
ArduinoUno上的A0到A5引腳就是14到19引腳。
原理圖和我的程序在引腳分配上稍有不同,請(qǐng)萬分注意。!
請(qǐng)自行按需分配引腳。
刪除代碼里面的沒用的代碼,程序看起來會(huì)更加清晰。
#include所包含的庫文件,自行百度解決,或咨詢找我要我也行。
建議每個(gè)都會(huì)使用了,再建立綜合項(xiàng)目

電路原理圖如下:


arduino Uno源程序如下:
  1. //時(shí)間:2018-5-25
  2. //地點(diǎn):貴州
  3. //作者:0721的
  4. //不懂的地方請(qǐng)?jiān)儐枺?25470791

  5. #include <LiquidCrystal.h>//包含驅(qū)動(dòng)LCD1602所需要的定義及函數(shù)
  6. #include "DHT.h"//包含溫度計(jì)所需的定義及函數(shù)
  7. #include <Keypad.h>//包含鍵盤所需的定義及函數(shù)
  8. #include <Stepper.h> //包含步進(jìn)電機(jī)所需的定義及函數(shù)



  9. ///////////////////////////////LCD1602部分//////////////////////////////////////////////
  10. const int rs = 13, rw = 12, en = 11, d4 = 10, d5 = 9, d6 = 8, d7 = 7;               //定義驅(qū)動(dòng)LCD1602需要的引腳
  11. LiquidCrystal lcd(rs, rw, en, d4, d5, d6, d7);                              //聲明一個(gè)名字為lcd的1602對(duì)象,在以后用這個(gè)實(shí)例調(diào)用函數(shù)來顯示字符

  12. ///////////////////////////////DHT11溫度傳感器部分/////////////////////////////////////////
  13. // Uncomment whatever type you're using!
  14. #define DHTPIN 2                           // 將引腳X指定為溫度計(jì)輸入口,此處指定為PIN2,即引腳2.  
  15. #define DHTTYPE DHT11                      // 定義溫度計(jì)型號(hào)為DHT11
  16. //#define DHTTYPE DHT22                    // 取消定義溫度計(jì)型號(hào)為DHT 22  (AM2302), AM2321
  17. //#define DHTTYPE DHT21                    // 取消定義溫度計(jì)型號(hào)為DHT 21 (AM2301)
  18. DHT dht(DHTPIN, DHTTYPE);                  //實(shí)例化一個(gè)DHT溫度計(jì),取名為dht

  19. //////////////////////////////////key按鍵部分///////////////////////////////////*/
  20. const byte ROWS = 4;                       //定義鍵盤為四行
  21. const byte COLS = 4;                       //定義鍵盤為四列
  22. char hexaKeys[ROWS][COLS] = {
  23.   {'1', '2', '3', 'A'},
  24.   {'4', '5', '6', 'B'},
  25.   {'7', '8', '9', 'C'},
  26.   {'*', '0', '#', 'D'}
  27. };
  28. byte rowPins[ROWS] = {6, 5, 4, 3};      //連接到行掃描的輸入輸出端口  //此處很有規(guī)律,請(qǐng)自行發(fā)現(xiàn)
  29. byte colPins[COLS] = {18, 1, 0, 19};    //連接到列掃描的輸入輸出端口
  30. Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);//創(chuàng)建一個(gè)鍵盤實(shí)例取名字為customKeypad

  31. /////////////////////////////////步進(jìn)電機(jī)部分////////////////////////////////////
  32. const int stepsPerRevolution = 48;  //
  33. Stepper myStepper(stepsPerRevolution, 14, 16, 15, 17);

  34. /*/////////////////////////////////流量計(jì)部分////////////////////////////////////
  35.   //F=8.1Q-3
  36.   //Q=(F+3)/8.1 //流量計(jì)算公式
  37.   #define Q1PIN 2   //定義第一個(gè)流量傳感器外部中斷引腳 UNO板子只有2、3兩個(gè)引腳可作為中斷
  38.   #define Q2PIN 3   //定義第二個(gè)流量傳感器外部中斷引腳 UNO板子只有2、3兩個(gè)引腳可作為中斷
  39.   volatile long Q1count =0;
  40.   volatile long Q2count =0;
  41.   ///////////////////////////////////////////////////////////////////////////////*/


  42. //////////////////////////////////初始化部分/////////////////////////////////////
  43. void setup() {

  44.   dht.begin();//開始運(yùn)行溫度檢測(cè)程序
  45.   // set up the LCD's number of columns and rows:
  46.   lcd.begin(16, 2);//將lcd初始化為16列2行
  47.   // Print a message to the LCD.
  48.   lcd.print("Welcome to use ");//初始化歡迎界面
  49.   lcd.setCursor(0,1);
  50.   lcd.print("      ^_^       ");
  51.   delay(3000);//延時(shí)顯示時(shí)間
  52.   myStepper.setSpeed(60);//設(shè)置步進(jìn)速度
  53.   //pinMode(Q1PIN,INPUT);
  54.   //pinMode(Q2PIN,INPUT);
  55.   //attachInterrupt(0,Q1INT,FALLING);    //定義下降沿中斷端口及要執(zhí)行的函數(shù) 0對(duì)應(yīng)引腳2
  56.   //attachInterrupt(1,Q2INT,FALLING);    //定義下降沿中斷端口及要執(zhí)行的函數(shù) 1對(duì)應(yīng)引腳3
  57. }
  58. /////////////////////////////////初始化部分結(jié)束/////////////////////////////////




  59. /////////////////////////////////程序循環(huán)部分///////////////////////////////////
  60. void loop() {
  61.   int trgT = displayT();
  62.   int trgQ = displayQ();
  63.   int nowT, nowQ;
  64.   displayQT(trgT, trgQ, nowT, nowQ);
  65.   while (1) {

  66.     float h = dht.readHumidity();//濕度讀取,并不影響我們仿真
  67.     float t = dht.readTemperature();//攝氏度值
  68.     displayQT(trgT, trgQ, (int)t, trgQ);
  69.     if (trgT < (int)t) {
  70.       myStepper.step(-stepsPerRevolution *5);
  71.     }
  72.     else {
  73.       myStepper.step(stepsPerRevolution*5);
  74.     }
  75.   }

  76.   /*/讀取溫度計(jì)的攝氏溫度代碼如下
  77.     float h = dht.readHumidity();//濕度讀取,并不影響我們仿真
  78.     // Read temperature as Celsius (the default)
  79.     float t = dht.readTemperature();//攝氏度值
  80.     // Read temperature as Fahrenheit (isFahrenheit = true)
  81.     float f = dht.readTemperature(true);//攝氏度轉(zhuǎn)華氏度值

  82.     // 檢查溫度傳感器是否工作正常
  83.     if (isnan(h) || isnan(t) || isnan(f)) {
  84.       Serial.println("讀取溫度傳感器失!");
  85.       return;
  86.     }*/

  87.   /*
  88.     //讀取流量傳感器代碼如下
  89.     //attachInterrupt(0,Q1INT,FALLING);    //定義下降沿中斷端口及要執(zhí)行的函數(shù) 0對(duì)應(yīng)引腳2
  90.     //attachInterrupt(1,Q2INT,FALLING);    //定義下降沿中斷端口及要執(zhí)行的函數(shù) 1對(duì)應(yīng)引腳3
  91.     delay(1000);
  92.     //detachInterrupt(0);
  93.     //detachInterrupt(1);
  94.     delay(100);
  95.     //int Qall = GetQall();


  96.     //lcd顯示溫度流量代碼如下
  97.     lcd.setCursor(0, 1);//設(shè)置顯示器顯示坐標(biāo)
  98.     // print the number of seconds since reset:
  99.     lcd.setCursor(0, 0);
  100.     lcd.print("Q Of Flow(Q)");//在lcd第一行顯示"quantityOfFlow(Q)"表示流量
  101.     lcd.print(Qall, DEC);
  102.     lcd.setCursor(0, 1);
  103.     lcd.print("Temperature(C)");//在lcd第二行顯示"Temperature(C)"表示當(dāng)前溫度
  104.     lcd.print(t, DEC);            //顯示溫度變量,后面的DEC表示十進(jìn)制(可填寫B(tài)IN表示二進(jìn)制,DEC表示十進(jìn)制,OTC表示8進(jìn)制,HEX表示十六進(jìn)制)

  105.     char customKey = customKeypad.getKey();//讀取鍵盤值
  106.     myStepper.step(20);//步進(jìn)電機(jī)運(yùn)動(dòng)
  107.   */
  108. }
  109. void displayQT(int trgT, int trgQ, int nowT, int nowQ) {
  110.   lcd.clear();
  111.   lcd.setCursor(0, 0);//設(shè)置顯示位置為0列0行
  112.   lcd.print("trgT:"); lcd.print(trgT); lcd.setCursor(8, 0); lcd.print("nowT:"); lcd.print(nowT);  //其中設(shè)置顯示位置為8列0行
  113.   lcd.setCursor(0, 1);
  114.   lcd.print("trgQ:"); lcd.print(trgQ); lcd.setCursor(8, 1); lcd.print("nowQ:"); lcd.print(nowQ);  //其中設(shè)置顯示位置為8列1行


  115. }
  116. int displayQ() {

  117.   lcd.setCursor(0, 1);
  118.   lcd.print("Q Of Flow:");
  119.   char customKey = ' ';
  120.   int data1;
  121.   int data;
  122.   int keycount = 0;
  123.   while (keycount != 2) {  //進(jìn)入死循環(huán),等待按兩次數(shù)字鍵
  124.     customKey = customKeypad.getKey();
  125.     switch (customKey) {
  126.       case '0': data = 0; keycount++;
  127.         break;
  128.       case '1': data = 1; keycount++;
  129.         break;
  130.       case '2': data = 2; keycount++;
  131.         break;
  132.       case '3': data = 3; keycount++;
  133.         break;
  134.       case '4': data = 4; keycount++;
  135.         break;
  136.       case '5': data = 5; keycount++;
  137.         break;
  138.       case '6': data = 6; keycount++;
  139.         break;
  140.       case '7': data = 7; keycount++;
  141.         break;
  142.       case '8': data = 8; keycount++;
  143.         break;
  144.       case '9': data = 9; keycount++;
  145.         break;
  146.       default:
  147.         break;
  148.     }
  149.     customKey = ' ';
  150.     if (keycount == 1)data1 = data;
  151.     if (keycount == 2)data1 = data1 * 10 + data;

  152.   }
  153.   lcd.print(data1, DEC);
  154.   return data1;   //按鍵按兩次數(shù)字鍵,返回一個(gè)兩位數(shù)
  155. }
  156. int displayT() {
  157.   lcd.clear();      //比displayQ多了這個(gè)clesr(),用于清除屏幕,
  158.   lcd.setCursor(0, 0);
  159.   lcd.print("temperature:");
  160.   char customKey = ' ';
  161.   int data1;
  162.   int data;
  163.   int keycount = 0;
  164.   while (keycount != 2) {   //進(jìn)入死循環(huán),等待按兩次數(shù)字鍵
  165.     customKey = customKeypad.getKey();
  166.     switch (customKey) {
  167.       case '0': data = 0; keycount++;
  168.         break;
  169.       case '1': data = 1; keycount++;
  170.         break;
  171.       case '2': data = 2; keycount++;
  172.         break;
  173.       case '3': data = 3; keycount++;
  174.         break;
  175.       case '4': data = 4; keycount++;
  176.         break;
  177.       case '5': data = 5; keycount++;
  178.         break;
  179.       case '6': data = 6; keycount++;
  180.         break;
  181.       case '7': data = 7; keycount++;
  182.         break;
  183.       case '8': data = 8; keycount++;
  184.         break;
  185.       case '9': data = 9; keycount++;
  186.         break;
  187.       default:
  188.         break;
  189.     }
  190.     customKey = ' ';
  191.     if (keycount == 1)data1 = data;
  192.     if (keycount == 2)data1 = data1 * 10 + data;

  193.   }
  194.   lcd.print(data1, DEC);
  195.   return data1;  //按鍵按兩次數(shù)字鍵,返回一個(gè)兩位數(shù)
  196. }

復(fù)制代碼


所有資料51hei提供下載:
分享并進(jìn)步.zip (193.6 KB, 下載次數(shù): 30)


評(píng)分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表