OCROBOT进阶教程04——按键显示时间与温湿度
办公环境或温暖,或寒冷,或潮湿,或干燥,在想要知道自己所处的环境温湿度的情况下,我堆叠了一些模块,做了一个带有显示屏的按键式的温湿度显示器。温湿度检测,是最最普通的初学者应用之一,想要进阶,就必须要做一下这个小小的玩意儿。
硬件列表:
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;
}
}
}
}
}
效果如图:
代码库:
手机拍摄 幻生幻灭 发表于 2016-3-7 18:21 static/image/common/back.gif
手机拍摄
恩,手机拍的 学习这个思路了,多按键多功能实现。
页:
[1]