|
办公环境或温暖,或寒冷,或潮湿,或干燥,在想要知道自己所处的环境温湿度的情况下,我堆叠了一些模块,做了一个带有显示屏的按键式的温湿度显示器。
温湿度检测,是最最普通的初学者应用之一,想要进阶,就必须要做一下这个小小的玩意儿。
硬件列表:
OCROBOT 8F328D-U
IIC/SPI 1602显示屏
温湿度传感器模块(OCROBOT ALPHA HTU-21)
实时时钟模块(OCROBOT ALPHA PCF8536)
微动开关模块(OCROBOT ALPHA 微动开关模块)
并行扩展板
堆叠效果如图(有了并行扩展板,多少板子堆起来都不是事儿)
- /*1602显示屏应用
- 按键1,显示实时时钟日期,
- 按键2,显示当前环境的温湿度
- */
- #include <Wire.h>
- #include <Rtc_Pcf8563.h>
- #include "HTU21D.h"
- #include "LiquidCrystal.h"
- HTU21D myHumidity; //初始化HTU21温湿度
- Rtc_Pcf8563 rtc; //初始化定义实时时钟
- LiquidCrystal lcd(0); //初始化1602显示屏
- const int buttonPin1 = 15; //定义红色按键1、绿色按键2
- const int buttonPin2 = 16;
-
- int button ; //设置按键初始状态,默认为0
- int lastTime= 0; //设置初始按键时间为0
- int lastbutton = LOW; //设置上一次按键状态为LOW
- void setup()
- { pinMode(buttonPin1, INPUT); //初始化按键模式为输入
- pinMode(buttonPin2, INPUT);
- rtc.initClock(); //设置一个起始时间
- rtc.setDate(6, 7, 3, 0, 16);//日, 周, 月,世纪(1=1900, 0=2000), 年(0-99)
- rtc.setTime(14, 22, 0);//小时,分钟,秒
-
- myHumidity.begin(); //温湿度初始化
- lcd.begin(16, 2); //屏幕初始化,16X2,长16格,宽2格。
- }
- void loop()
- {
- if (digitalRead(buttonPin1) != button) //如果红色按键按下,比较状态
- { lcd.clear(); //清屏
- while(1) //死循环
- {
- lcd.setCursor(2, 0); //设置显示的数字在屏幕位置 ,从第一行第三格开始
- lcd.print(rtc.formatDate()); //打印日期
- lcd.setCursor(2, 1); //设置显示的数字在屏幕位置 ,从第二行第三格开始
- lcd.print(rtc.formatTime()); //打印时间
- if (digitalRead(buttonPin2) != button) //如果检测到按键2按下,则跳出死循环
- { break;
- }
- }
- }
- if (digitalRead(buttonPin2) != lastbutton) //如果检测到按键按下,比较上次状态,改变则是有按下
- {
- lcd.clear(); //清屏
- while(1)
- {
- float humd = myHumidity.readHumidity(); //读取实时湿度,存储到变量
- float temp = myHumidity.readTemperature(); //读取实时温度,存储到变量
- lcd.setCursor(2, 0); //设置显示的数字在屏幕位置 ,从第一行第三格开始
- lcd.print("Tem:"); //打印Tem:
- lcd.print(temp, 1); //打印实时读取到的温度
- lcd.print("C"); //打印单位
- lcd.setCursor(2, 1); //设置显示的数字在屏幕位置 ,从第二行第三格开始
- lcd.print("Humi:"); //打印Humi:
- lcd.print(humd, 1); //打印读取到的实时湿度
- lcd.print("%"); //打印单位
-
- if (digitalRead(buttonPin1) != button) //检测按键1是否按下 这里如果不进行消抖,显示频率不稳定,用delay函数,会影响按键时间,有时候则会跳不出循环
- { int lastTime=millis(); //设置一个消抖时间,循环会重置
- if ((millis() - lastTime) > 50) //比较按键的相差时间,若大于消抖时间,则说明时间不管读取到什么,时间已经比消抖长,所以认定为真实状态
- { if(digitalRead(buttonPin1)== HIGH) // 如果读取到的按键状态为HIGH,则跳出死循环
- lastbutton = digitalRead(buttonPin1); //更新按键状态,准备下次比较。
- break;
- }
- }
- }
- }
- }
复制代码
效果如图:
代码库:
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|