这个是arduino综合案例,希望有助于大家做毕设,或者自己玩玩。
原名“温控流量混合装置” 作用:一个水管出热水,一个水管出冷水,检测混合之后的温度和流量,混合之后出温水。显示目标温度和目标流量,当前温度和当前流量。
左边是原理图中的电位器可以调节1602的显示
//////////////////////////////////////////////可以忽略上面的内容/////////////////////////////////
简化后:“温控混合装置”,供大家学习 简图如下 主要所需材料:arduinoUno主板,lcd1602,4*4薄膜键盘,dht11温度传感,ULN2003(用于驱动步进电机),28BYJ-48步进电机 ArduinoUno上的A0到A5引脚就是14到19引脚。 原理图和我的程序在引脚分配上稍有不同,请万分注意!!! 请自行按需分配引脚。 删除代码里面的没用的代码,程序看起来会更加清晰。 #include所包含的库文件,自行百度解决,或咨询找我要我也行。 建议每个都会使用了,再建立综合项目
电路原理图如下:
arduino Uno源程序如下:
- //时间:2018-5-25
- //地点:贵州
- //作者:0721的
- //不懂的地方请询问:825470791
- #include <LiquidCrystal.h>//包含驱动LCD1602所需要的定义及函数
- #include "DHT.h"//包含温度计所需的定义及函数
- #include <Keypad.h>//包含键盘所需的定义及函数
- #include <Stepper.h> //包含步进电机所需的定义及函数
- ///////////////////////////////LCD1602部分//////////////////////////////////////////////
- const int rs = 13, rw = 12, en = 11, d4 = 10, d5 = 9, d6 = 8, d7 = 7; //定义驱动LCD1602需要的引脚
- LiquidCrystal lcd(rs, rw, en, d4, d5, d6, d7); //声明一个名字为lcd的1602对象,在以后用这个实例调用函数来显示字符
- ///////////////////////////////DHT11温度传感器部分/////////////////////////////////////////
- // Uncomment whatever type you're using!
- #define DHTPIN 2 // 将引脚X指定为温度计输入口,此处指定为PIN2,即引脚2.
- #define DHTTYPE DHT11 // 定义温度计型号为DHT11
- //#define DHTTYPE DHT22 // 取消定义温度计型号为DHT 22 (AM2302), AM2321
- //#define DHTTYPE DHT21 // 取消定义温度计型号为DHT 21 (AM2301)
- DHT dht(DHTPIN, DHTTYPE); //实例化一个DHT温度计,取名为dht
- //////////////////////////////////key按键部分///////////////////////////////////*/
- const byte ROWS = 4; //定义键盘为四行
- const byte COLS = 4; //定义键盘为四列
- char hexaKeys[ROWS][COLS] = {
- {'1', '2', '3', 'A'},
- {'4', '5', '6', 'B'},
- {'7', '8', '9', 'C'},
- {'*', '0', '#', 'D'}
- };
- byte rowPins[ROWS] = {6, 5, 4, 3}; //连接到行扫描的输入输出端口 //此处很有规律,请自行发现
- byte colPins[COLS] = {18, 1, 0, 19}; //连接到列扫描的输入输出端口
- Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);//创建一个键盘实例取名字为customKeypad
- /////////////////////////////////步进电机部分////////////////////////////////////
- const int stepsPerRevolution = 48; //
- Stepper myStepper(stepsPerRevolution, 14, 16, 15, 17);
- /*/////////////////////////////////流量计部分////////////////////////////////////
- //F=8.1Q-3
- //Q=(F+3)/8.1 //流量计算公式
- #define Q1PIN 2 //定义第一个流量传感器外部中断引脚 UNO板子只有2、3两个引脚可作为中断
- #define Q2PIN 3 //定义第二个流量传感器外部中断引脚 UNO板子只有2、3两个引脚可作为中断
- volatile long Q1count =0;
- volatile long Q2count =0;
- ///////////////////////////////////////////////////////////////////////////////*/
- //////////////////////////////////初始化部分/////////////////////////////////////
- void setup() {
- dht.begin();//开始运行温度检测程序
- // set up the LCD's number of columns and rows:
- lcd.begin(16, 2);//将lcd初始化为16列2行
- // Print a message to the LCD.
- lcd.print("Welcome to use ");//初始化欢迎界面
- lcd.setCursor(0,1);
- lcd.print(" ^_^ ");
- delay(3000);//延时显示时间
- myStepper.setSpeed(60);//设置步进速度
- //pinMode(Q1PIN,INPUT);
- //pinMode(Q2PIN,INPUT);
- //attachInterrupt(0,Q1INT,FALLING); //定义下降沿中断端口及要执行的函数 0对应引脚2
- //attachInterrupt(1,Q2INT,FALLING); //定义下降沿中断端口及要执行的函数 1对应引脚3
- }
- /////////////////////////////////初始化部分结束/////////////////////////////////
- /////////////////////////////////程序循环部分///////////////////////////////////
- void loop() {
- int trgT = displayT();
- int trgQ = displayQ();
- int nowT, nowQ;
- displayQT(trgT, trgQ, nowT, nowQ);
- while (1) {
- float h = dht.readHumidity();//湿度读取,并不影响我们仿真
- float t = dht.readTemperature();//摄氏度值
- displayQT(trgT, trgQ, (int)t, trgQ);
- if (trgT < (int)t) {
- myStepper.step(-stepsPerRevolution *5);
- }
- else {
- myStepper.step(stepsPerRevolution*5);
- }
- }
- /*/读取温度计的摄氏温度代码如下
- float h = dht.readHumidity();//湿度读取,并不影响我们仿真
- // Read temperature as Celsius (the default)
- float t = dht.readTemperature();//摄氏度值
- // Read temperature as Fahrenheit (isFahrenheit = true)
- float f = dht.readTemperature(true);//摄氏度转华氏度值
- // 检查温度传感器是否工作正常
- if (isnan(h) || isnan(t) || isnan(f)) {
- Serial.println("读取温度传感器失败!");
- return;
- }*/
- /*
- //读取流量传感器代码如下
- //attachInterrupt(0,Q1INT,FALLING); //定义下降沿中断端口及要执行的函数 0对应引脚2
- //attachInterrupt(1,Q2INT,FALLING); //定义下降沿中断端口及要执行的函数 1对应引脚3
- delay(1000);
- //detachInterrupt(0);
- //detachInterrupt(1);
- delay(100);
- //int Qall = GetQall();
- //lcd显示温度流量代码如下
- lcd.setCursor(0, 1);//设置显示器显示坐标
- // print the number of seconds since reset:
- lcd.setCursor(0, 0);
- lcd.print("Q Of Flow(Q)");//在lcd第一行显示"quantityOfFlow(Q)"表示流量
- lcd.print(Qall, DEC);
- lcd.setCursor(0, 1);
- lcd.print("Temperature(C)");//在lcd第二行显示"Temperature(C)"表示当前温度
- lcd.print(t, DEC); //显示温度变量,后面的DEC表示十进制(可填写BIN表示二进制,DEC表示十进制,OTC表示8进制,HEX表示十六进制)
- char customKey = customKeypad.getKey();//读取键盘值
- myStepper.step(20);//步进电机运动
- */
- }
- void displayQT(int trgT, int trgQ, int nowT, int nowQ) {
- lcd.clear();
- lcd.setCursor(0, 0);//设置显示位置为0列0行
- lcd.print("trgT:"); lcd.print(trgT); lcd.setCursor(8, 0); lcd.print("nowT:"); lcd.print(nowT); //其中设置显示位置为8列0行
- lcd.setCursor(0, 1);
- lcd.print("trgQ:"); lcd.print(trgQ); lcd.setCursor(8, 1); lcd.print("nowQ:"); lcd.print(nowQ); //其中设置显示位置为8列1行
- }
- int displayQ() {
- lcd.setCursor(0, 1);
- lcd.print("Q Of Flow:");
- char customKey = ' ';
- int data1;
- int data;
- int keycount = 0;
- while (keycount != 2) { //进入死循环,等待按两次数字键
- customKey = customKeypad.getKey();
- switch (customKey) {
- case '0': data = 0; keycount++;
- break;
- case '1': data = 1; keycount++;
- break;
- case '2': data = 2; keycount++;
- break;
- case '3': data = 3; keycount++;
- break;
- case '4': data = 4; keycount++;
- break;
- case '5': data = 5; keycount++;
- break;
- case '6': data = 6; keycount++;
- break;
- case '7': data = 7; keycount++;
- break;
- case '8': data = 8; keycount++;
- break;
- case '9': data = 9; keycount++;
- break;
- default:
- break;
- }
- customKey = ' ';
- if (keycount == 1)data1 = data;
- if (keycount == 2)data1 = data1 * 10 + data;
- }
- lcd.print(data1, DEC);
- return data1; //按键按两次数字键,返回一个两位数
- }
- int displayT() {
- lcd.clear(); //比displayQ多了这个clesr(),用于清除屏幕,
- lcd.setCursor(0, 0);
- lcd.print("temperature:");
- char customKey = ' ';
- int data1;
- int data;
- int keycount = 0;
- while (keycount != 2) { //进入死循环,等待按两次数字键
- customKey = customKeypad.getKey();
- switch (customKey) {
- case '0': data = 0; keycount++;
- break;
- case '1': data = 1; keycount++;
- break;
- case '2': data = 2; keycount++;
- break;
- case '3': data = 3; keycount++;
- break;
- case '4': data = 4; keycount++;
- break;
- case '5': data = 5; keycount++;
- break;
- case '6': data = 6; keycount++;
- break;
- case '7': data = 7; keycount++;
- break;
- case '8': data = 8; keycount++;
- break;
- case '9': data = 9; keycount++;
- break;
- default:
- break;
- }
- customKey = ' ';
- if (keycount == 1)data1 = data;
- if (keycount == 2)data1 = data1 * 10 + data;
- }
- lcd.print(data1, DEC);
- return data1; //按键按两次数字键,返回一个两位数
- }
复制代码
所有资料51hei提供下载:
分享并进步.zip
(193.6 KB, 下载次数: 30)
|