Soul110 发表于 2016-3-6 17:39:11

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:57

手机拍摄

Soul110 发表于 2016-3-8 10:02:23

幻生幻灭 发表于 2016-3-7 18:21 static/image/common/back.gif
手机拍摄

恩,手机拍的

a461624201 发表于 2016-3-9 01:14:37

学习这个思路了,多按键多功能实现。
页: [1]
查看完整版本: OCROBOT进阶教程04——按键显示时间与温湿度