本帖最后由 弘毅 于 2016-9-7 21:04 编辑
都在极客工坊逛了快半年了,没注册过用户,更没发过帖子.是不是太说不过去了.
昨天注册了, 各位前辈们请拍板砖吧!
花费了近两个小时才焊上
arduino 库 DigSegTime 下载(这是我第一次写 arduino 库)
https://github.com/pamisisi/arduino-DigSegTime/archive/master.zip
(为啥我不能直接上传png的图片, 也不能上链接呢,)
- // myClock.ino
- /* 4位数码管引脚
- 1 a f 2 3 b
- 12 11 10 9 8 7
-
- D4 D5 D6 D7 D8 D9
- 2 9 10 11 12 13
-
- 28 27 26 25 24 23
- A5 A4 A3 A2 A1 A0
-
- 1 2 3 4 5 6
- e d dp c g 4
- */
- #include <EEPROM.h>
- #include <DigSegTime.h>
- #include <DS1302.h>
- #include <IRremote.h>
- #include <OneWire.h>
- #include <DallasTemperature.h>
- /***************************************************/
- /* 数码管引脚 首个参数 true 代表共阳, false 代表共阴 */
- /***************************************************/
- DigSegTime dst(false, 4,7,8,A0, 5,9,A2,A4,A5,6,A1,A3);
- /***************************************************/
- /* DS1302引脚 */
- /***************************************************/
- DS1302 rtc(10, 11, 12);
- /***************************************************/
- /* DS18B20引脚 */
- /***************************************************/
- OneWire oneWire(2);
- DallasTemperature sensors(&oneWire);
- /***************************************************/
- /* IR引脚 */
- /***************************************************/
- IRrecv irrecv(3);
- decode_results results;
- /***************************************************/
- /* 临时变量 */
- /***************************************************/
- // 系统运行时间
- unsigned long timer, mils;
- // 一秒标记
- boolean oneSec;
- // 临时的秒从 DS1302 读取 一分钟读取一次 用于刷新时间
- uint8_t tmpSec;
- // 数码管亮度 & 数码管亮度EEPROM地址
- uint8_t dstBrightness = 1, dstBrightness_add = 0;
- // 温度
- uint8_t temperatures;
- // date & time
- int rtc_year;
- byte rtc_month, rtc_date, rtc_day, rtc_hour, rtc_min, rtc_sec;
- // 好复杂的组合菜单 一项伟大的工程
- uint8_t menu, clockModel = 1, clockModel_add = 1, setting = 1;
- const uint8_t menuShowClock = 0, menuShowTemperature = 1, menuShowSetting = 2;
- const uint8_t settingShowModel = 1, settingDstBrightness = 2, settingDSyear =3,
- settingDSmonth = 4, settingDSdate = 5, settingDSday = 6, settingDShour = 7,
- settingDSmin = 8, settingDSsec = 9;
- // 我开机啦
- void setup() {
- // Serial.begin(9600);
- // 从 EEPROM 读取亮度
- dstBrightness = EEPROM.read(dstBrightness_add);
- // 如果EEPROM 亮度值大于10 代表着 不是本程序想要的值
- if(dstBrightness > 10){
- // 写个1 再保存吧
- dstBrightness = 1;
- EEPROM.write(dstBrightness_add,dstBrightness);
- }
- // 设置数码管亮度 (1 to 10);
- dst.brightness(dstBrightness);
- // 从 EEPROM 读取时钟模式
- clockModel = EEPROM.read(clockModel_add);
- if(clockModel > 10){
- clockModel = 1;
- EEPROM.write(clockModel_add, clockModel);
- }
- // 读取 DS1302 时间
- Time t =rtc.time();
- //Serial.println(t.yr);
- // 当年为 2000 时,代表着DS1302还没有设置过时间喔 设置本程序的出厂日期吧!
- if(t.yr == 2000){
- rtc.writeProtect(false); // 写保护 关
- rtc.halt(false); // 时间停止 关
- Time t(2014, 3, 7, 00, 38, 00, Time::kWednesday);
- rtc.time(t);
- rtc.writeProtect(true); // 写保护 开
- }
- //t =rtc.time();
- //Serial.println(t.yr);
- irrecv.enableIRIn(); //开启红外
- timer=millis();
- }
- // 我拼命的干活
- void loop() {
- dst.scan(); // 我拼命的扫描
- scanIR(); // 没事你可以玩玩遥控器上的扫雷,命中就从此发生
- mils=millis();
- // 你是想要显示时间呢,还是显示度度呢, 还是想要设置我
- switch (menu) {
- case menuShowClock:
- showClock();
- break;
- case menuShowTemperature:
- showTemperature();
- break;
- case menuShowSetting:
- showSetting();
- break;
- }
- }
- // 时间其时有很多种花样的 1 HH:MM , 2 时间+度度 (交替显示), 3, 只显示分:秒 (用于检验DS1302过快或者快慢)
- void showClock() {
- if(mils - timer >= 500) {
- timer = mils;
- oneSec = !oneSec;
- switch (clockModel) {
- case 1: // 只有时间
- if(oneSec) {
- if(tmpSec == 0 || tmpSec >= 59){
- Time t =rtc.time();
- tmpSec = t.sec;
- dst.printTime(t.hr, t.min);
- }
- tmpSec++;
- dst.printDp(0); // 灭掉点点
- }
- else{
- dst.printDp(2); // 点点亮
- }
- break;
- case 2: // 时间 + 温度
- if(oneSec) {
- if(tmpSec == 0 || tmpSec > 8){ // 每8秒后显示一下温度
- Time t =rtc.time();
- rtc_hour = t.hr;
- rtc_min = t.min;
- tmpSec = 1;
- //获取温度
- sensors.requestTemperatures();
- temperatures = sensors.getTempCByIndex(0);
- //显示温度
- dst.printTime(temperatures,"C ");
- dst.printDp(1);
- }
- else{
- dst.printTime(rtc_hour, rtc_min);
- }
- dst.printDp(2);
- tmpSec++;
- }
- else{
- dst.printDp(0);
- }
- break;
- case 3: // MM:SS
- if(oneSec) {
- Time t =rtc.time();
- dst.printTime(t.min, t.sec);
- dst.printDp(0);
- }
- else{
- dst.printDp(2);
- }
- break;
- }
- }
- }
- // 显示温度 3秒后 自动回到时间模式
- void showTemperature() {
- if(mils - timer >= 1000) {
- timer = mils;
- if(tmpSec == 0){
- sensors.requestTemperatures();
- temperatures = sensors.getTempCByIndex(0);
- dst.printHr(temperatures);
- dst.printMin("C ");
- dst.printDp(1);
- }
- tmpSec++;
- if(tmpSec >= 3) {
- menu = menuShowClock;
- tmpSec = 0;
- }
- }
- }
- // 设置
- void showSetting() {
- // 500 ms 时
- if(mils - timer >= 500) {
- timer = mils;
- oneSec = !oneSec;
- // 1秒时
- if(oneSec) {
- switch (setting) {
- case settingShowModel:
- dst.printTime("C-", clockModel);
- break;
- case settingDstBrightness:
- dst.printTime("B-", dstBrightness);
- break;
- case settingDSyear:
- dst.print(rtc_year);
- break;
- case settingDSmonth:
- dst.printTime(rtc_month, rtc_date);
- dst.printDp(1);
- break;
- case settingDSdate:
- dst.printTime(rtc_month, rtc_date);
- dst.printDp(1);
- break;
- case settingDSday:
- dst.printTime("D-", rtc_day);
- dst.printDp(0);
- break;
- case settingDShour:
- dst.printTime(rtc_hour, rtc_min);
- dst.printDp(2);
- break;
- case settingDSmin:
- dst.printTime(rtc_hour, rtc_min);
- dst.printDp(2);
- break;
- case settingDSsec:
- dst.printTime(rtc_min,rtc_sec);
- dst.printDp(3);
- break;
- }
- // 500 ms 时
- }
- else {
- switch (setting) {
- case settingShowModel:
- dst.printTime("C-", " ");
- break;
- case settingDstBrightness:
- dst.print("B- ");
- break;
- case settingDSyear:
- dst.printTime(" ", " ");
- break;
- case settingDSmonth:
- dst.printTime(" ", rtc_date);
- break;
- case settingDSdate:
- dst.printTime(rtc_month, " ");
- break;
- case settingDSday:
- dst.printTime("D-", " ");
- break;
- case settingDShour:
- dst.printTime(" ", rtc_min);
- break;
- case settingDSmin:
- dst.printTime(rtc_hour, " ");
- break;
- case settingDSsec:
- dst.printTime(rtc_min, " ");
- break;
- }
- }
- }
- }
- // 红外判断
- void scanIR() {
- if (irrecv.decode(&results)) {
- //Serial.println(results.value,HEX);
- switch (results.value) {
- case 0xFF629D: // CH 进入菜单红外编码
- if(++menu >= 3) menu = 0;
- // 进入调时模式
- if(menu == 2){
- Time t =rtc.time();
- rtc_year = t.yr;
- rtc_month = t.mon;
- rtc_date = t.date;
- rtc_day = t.day;
- rtc_hour = t.hr;
- rtc_min = t.min;
- rtc_sec = t.sec;
- }
- dst.print(" ");
- dst.printDp(0);
- tmpSec = 0;
- break;
- case 0xFF02FD: // >>| 下一项 红外编码
- switch (menu) {
- case menuShowSetting:
- if(++setting == 10){
- setting = 1;
- menu = 0;
- tmpSec = 0;
- rtc.writeProtect(false);
- rtc.year(rtc_year);
- rtc.month(rtc_month);
- rtc.date(rtc_date);
- rtc.hour(rtc_hour);
- rtc.minutes(rtc_min);
- rtc.seconds(rtc_sec);
- switch (rtc_day) {
- case 1:
- rtc.day(Time::kSunday);
- break;
- case 2:
- rtc.day(Time::kMonday);
- break;
- case 3:
- rtc.day(Time::kTuesday);
- break;
- case 4:
- rtc.day(Time::kWednesday);
- break;
- case 5:
- rtc.day(Time::kThursday);
- break;
- case 6:
- rtc.day(Time::kFriday);
- break;
- case 7:
- rtc.day(Time::kSaturday);
- break;
- }
- rtc.halt(false);
- rtc.writeProtect(true);
- }
- break;
- }
- break;
- case 0xFF22DD: // |<< 上一项 红外编码
- switch (menu) {
- case menuShowSetting:
- if(--setting == 0) setting = 9;
- break;
- }
- break;
- case 0xFFA857: // + 红外编码
- switch (menu) {
- case menuShowSetting:
- switch (setting) {
- case settingShowModel:
- clockModel++;
- if(clockModel > 3)
- clockModel = 1;
- EEPROM.write(clockModel_add,clockModel);
- break;
- case settingDstBrightness:
- dstBrightness++;
- if(dstBrightness > 10) {
- dstBrightness = 1;
- }
- dst.brightness(dstBrightness);
- EEPROM.write(dstBrightness_add,dstBrightness);
- break;
- case settingDSyear:
- if(++rtc_year > 2090) rtc_year = 2014;
- break;
- case settingDSmonth:
- if(++rtc_month > 12) rtc_month = 1;
- break;
- case settingDSdate:
- if(++rtc_date > 31) rtc_date = 1;
- break;
- case settingDSday:
- if(++rtc_day > 7) rtc_day = 1;
- break;
- case settingDShour:
- if(++rtc_hour > 23) rtc_hour = 0;
- break;
- case settingDSmin:
- if(++rtc_min > 59) rtc_min = 0;
- break;
- case settingDSsec:
- if(++rtc_sec > 59) rtc_sec = 0;
- break;
- }
- break;
- }
- break;
- case 0xFFE01F: // - 红外编码
- switch (menu) {
- case menuShowSetting:
- switch (setting) {
- case settingShowModel:
- clockModel--;
- if(clockModel == 0)
- clockModel = 3;
- EEPROM.write(clockModel_add,clockModel);
- break;
- case settingDstBrightness:
- dstBrightness--;
- if(dstBrightness == 0) {
- dstBrightness = 10;
- }
- dst.brightness(dstBrightness);
- EEPROM.write(dstBrightness_add,dstBrightness);
- break;
- case settingDSyear:
- if(--rtc_year < 2014) rtc_year = 2090;
- break;
- case settingDSmonth:
- if(--rtc_month < 1) rtc_month = 12;
- break;
- case settingDSdate:
- if(--rtc_date < 1) rtc_date = 31;
- break;
- case settingDSday:
- if(--rtc_day < 1) rtc_day = 7;
- break;
- case settingDShour:
- if(--rtc_hour == 255) rtc_hour = 23;
- break;
- case settingDSmin:
- if(--rtc_min == 255) rtc_min = 59;
- break;
- case settingDSsec:
- if(--rtc_sec == 255) rtc_sec = 59;
- break;
- }
- break;
- }
- break;
- }
- irrecv.resume(); // Receive the next value
- }
- }
复制代码 |