极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15167|回复: 3

OCROBOT进阶教程04——按键显示时间与温湿度

[复制链接]
发表于 2016-3-6 17:39:11 | 显示全部楼层 |阅读模式
办公环境或温暖,或寒冷,或潮湿,或干燥,在想要知道自己所处的环境温湿度的情况下,我堆叠了一些模块,做了一个带有显示屏的按键式的温湿度显示器。
温湿度检测,是最最普通的初学者应用之一,想要进阶,就必须要做一下这个小小的玩意儿。

硬件列表:
OCROBOT 8F328D-U
IIC/SPI 1602显示屏
温湿度传感器模块(OCROBOT ALPHA HTU-21)
实时时钟模块(OCROBOT ALPHA PCF8536)
微动开关模块(OCROBOT ALPHA 微动开关模块)
并行扩展板

堆叠效果如图(有了并行扩展板,多少板子堆起来都不是事儿)

  1. /*1602显示屏应用
  2.   按键1,显示实时时钟日期,
  3.   按键2,显示当前环境的温湿度
  4. */
  5. #include <Wire.h>
  6. #include <Rtc_Pcf8563.h>
  7. #include "HTU21D.h"
  8. #include "LiquidCrystal.h"

  9. HTU21D myHumidity;  //初始化HTU21温湿度
  10. Rtc_Pcf8563 rtc;  //初始化定义实时时钟
  11. LiquidCrystal lcd(0); //初始化1602显示屏

  12. const int buttonPin1 = 15;    //定义红色按键1、绿色按键2
  13. const int buttonPin2 = 16;

  14. int button  ;        //设置按键初始状态,默认为0
  15. int lastTime= 0;        //设置初始按键时间为0
  16. int lastbutton = LOW;   //设置上一次按键状态为LOW

  17. void setup()
  18. { pinMode(buttonPin1, INPUT);  //初始化按键模式为输入
  19.   pinMode(buttonPin2, INPUT);

  20.   rtc.initClock(); //设置一个起始时间
  21.   rtc.setDate(6, 7, 3, 0, 16);//日, 周, 月,世纪(1=1900, 0=2000), 年(0-99)
  22.   rtc.setTime(14, 22, 0);//小时,分钟,秒

  23.    myHumidity.begin(); //温湿度初始化
  24.   lcd.begin(16, 2);   //屏幕初始化,16X2,长16格,宽2格。
  25. }

  26. void loop()
  27. {
  28.   if (digitalRead(buttonPin1) != button) //如果红色按键按下,比较状态
  29.   {   lcd.clear();  //清屏
  30.     while(1)       //死循环
  31.        {
  32.          lcd.setCursor(2, 0);   //设置显示的数字在屏幕位置 ,从第一行第三格开始
  33.          lcd.print(rtc.formatDate());  //打印日期
  34.          lcd.setCursor(2, 1);          //设置显示的数字在屏幕位置 ,从第二行第三格开始
  35.          lcd.print(rtc.formatTime());  //打印时间
  36.      if (digitalRead(buttonPin2) != button)  //如果检测到按键2按下,则跳出死循环
  37.         { break;
  38.          }
  39.         }
  40.   }

  41.   if (digitalRead(buttonPin2) != lastbutton)   //如果检测到按键按下,比较上次状态,改变则是有按下
  42. {
  43.      lcd.clear();  //清屏
  44.         while(1)
  45.       {   
  46.          float humd = myHumidity.readHumidity();  //读取实时湿度,存储到变量
  47.          float temp = myHumidity.readTemperature(); //读取实时温度,存储到变量
  48.          lcd.setCursor(2, 0);     //设置显示的数字在屏幕位置 ,从第一行第三格开始
  49.          lcd.print("Tem:");      //打印Tem:
  50.          lcd.print(temp, 1);    //打印实时读取到的温度
  51.          lcd.print("C");         //打印单位
  52.          lcd.setCursor(2, 1);   //设置显示的数字在屏幕位置 ,从第二行第三格开始
  53.          lcd.print("Humi:");    //打印Humi:
  54.          lcd.print(humd, 1);    //打印读取到的实时湿度
  55.          lcd.print("%");        //打印单位
  56.         
  57.        if (digitalRead(buttonPin1) != button)   //检测按键1是否按下  这里如果不进行消抖,显示频率不稳定,用delay函数,会影响按键时间,有时候则会跳不出循环
  58.         {   int lastTime=millis();             //设置一个消抖时间,循环会重置
  59.           if ((millis() - lastTime) > 50)    //比较按键的相差时间,若大于消抖时间,则说明时间不管读取到什么,时间已经比消抖长,所以认定为真实状态
  60.           { if(digitalRead(buttonPin1)== HIGH)   //  如果读取到的按键状态为HIGH,则跳出死循环
  61.            lastbutton = digitalRead(buttonPin1);  //更新按键状态,准备下次比较。
  62.              break;
  63.            }
  64.          }
  65.        }
  66.    }
  67. }
复制代码

效果如图:

代码库:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2016-3-7 18:21:57 | 显示全部楼层
手机拍摄
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-8 10:02:23 | 显示全部楼层
幻生幻灭 发表于 2016-3-7 18:21
手机拍摄

恩,手机拍的
回复 支持 反对

使用道具 举报

发表于 2016-3-9 01:14:37 | 显示全部楼层
学习这个思路了,多按键多功能实现。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-26 09:17 , Processed in 0.043358 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表