电子发烧友App

硬声App

0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示
电子发烧友网>电子资料下载>电子资料>用于激活设备的可编程定时器-第三部分

用于激活设备的可编程定时器-第三部分

2022-12-16 | zip | 0.88 MB | 次下载 | 免费

资料介绍

描述

介绍

在第三部分中,我们实现了几个步骤来创建几个函数,如 ReadKeyPad、AdjustHour 和 ActivationHour。

通过这些功能,我们创建了项目的第一部分。第二部分可以在以下链接中访问:访问文章的第二部分

现在,我们实现项目的新功能。

开发项目

通过到目前为止已实现的功能,在这第三部分中,我们将实现新功能以提高项目的质量。

此后,将介绍新功能:

  • 实现 DeactivationHour() 函数;
  • 实现一个逻辑系统来比较时钟以激活和停用连接在继电器中的设备;
  • 实现信号化以指示按下的键。

基于新功能,实现了如图 2 所示的新电路。

 
pYYBAGOYtGGAP_y_AAH1M9glNy0897.png
图 2 - 电路的电子原理图。
 

首先,我们将介绍新函数 DeactivateHour()。此函数等同于函数 ActivateHour。

唯一的区别是用于保存停用设备的小时和分钟的 EEPROM 位置。

现在,我们将看到 DeactivateHour 函数。

实现 DeactivateHour 函数()

通过这段代码,您可以看到在 ActivateHour 函数处代码是相等的。所有逻辑编程都在第二部分——访问第二部分中介绍

void DeactivationHour(void)
{
   int times[6];
   int  DadosTempo[7];
   bool controle = 0;
   bool EstadoSobe = 0, EstadoDesce = 0;
   byte cont = 0;
   byte number = 0;
   int digitos[6];
   byte PosCursor = 0;
   bool Validate = 0;
  
   lcd.clear();
  
         for(byte i = 0; i < 6; i++)
         {
           digitos[i] = 0;
         }
  
         do
         {  
             lcd.setCursor(0,0);
             lcd.print("                ");
             lcd.setCursor(1,0);  
             lcd.print("Shutdown Hour:");
             lcd.setCursor(0,1);
             lcd.print("                ");
             lcd.setCursor(5,1);
             lcd.print("00:00h");
             PosCursor = 5;
             Validate = 0;
          
           do
           {
             number = ReadKeyPad();
             delay(100);
  
             if( (number >= 0 && number <= 9) && (controle == 0) && (cont < 4) )
             {
               digitos[cont] = number;  
               cont++;
               controle = 1;
               lcd.setCursor(PosCursor,1);
               lcd.print(number);                
               PosCursor++;
               
               if(cont == 2 || cont == 4)
               {
                 PosCursor = PosCursor + 1;
               }
             }
  
             if(number == 16 && controle == 1)
             {
               controle = 0;
             }
  
             if(number == 12)
             { 
                 for(cont = 0; cont < 4; cont++)
                 {
                   digitos[cont] = 0;
                 }  
  
               lcd.setCursor(0,1);
               lcd.print("                ");
               lcd.setCursor(5,1);
               lcd.print("00:00h");
               PosCursor = 5;
               cont = 0;
  
               for(int i = 4; i < 6; i++)
               {
                 times[i] = 0;  
               }
  
             }
  
           }while(number != 13);  
  
           times[4] = (digitos[0]*10) + digitos[1];
           times[5] = (digitos[2]*10) + digitos[3];
  
           EEPROM.write(3, times[4]);
           EEPROM.write(4, times[5]);
  
           if((times[4] < 0 || times[4] > 23) || (times[5] < 0 || times[5] > 59))
           {
             lcd.clear();
             lcd.setCursor(4,0);
             lcd.print("Invalid");
             lcd.setCursor(6,1);  
             lcd.print("Hour");
  
             delay(2000);
  
             Validate = 1;
             lcd.clear();
  
             lcd.setCursor(0,0);
             lcd.print("                ");
             lcd.setCursor(1,0);
             lcd.print("Shutdown Hour:");
  
             lcd.setCursor(0,1);
             lcd.print("                ");
             lcd.setCursor(5,1);
             lcd.print("00:00h");
             sprintf(tempo, "%02d:%02dh", 0, 0);
             PosCursor = 5;              
  
             cont = 0;
  
             for(cont = 0; cont < 4; cont++)
             {
              digitos[cont] = 0;
             }
           }
         }while(Validate == 1);
  
             do
             {
               number = ReadKeyPad();
               delay(200);
             }while(number != 16);
}

唯一的区别是用于保存小时和分钟的 EEPROM 位置,如前所述。

EEPROM.write(3, times[4]);
EEPROM.write(4, times[5]);

此后将在图 3 中执行该功能时显示在屏幕上。

 
poYBAGOYtGOAL3BTAAGUJ99Nw0I51.jpeg
图 3 - 调整关机时间。
 

在此屏幕中,用户将配置您的设备停用的时间。用户插入小时后,系统将验证,如项目的第二部分所示

之后,系统将返回 void 循环函数并执行块代码。

当 73 值保存在位置 MEMORY 中时,存储在 EEPROM 位置 1、2、3 和 4 中的值保存在两个向量中:TimeActiveDevice 和 TimeDeactiveDevice。

这两个向量用于存储定时器以激活和停用连接在继电器中的设备。

void loop()
{
   if(EEPROM.read(MEMORY) != 73)
   {
     AdjustTime();
     lcd.clear();
     ActivationHour();
     lcd.clear();
     DeactivationHour();
     lcd.clear();
     EEPROM.write(MEMORY, 73);
  
     TimeActiveDevice[0] = EEPROM.read(1);
     TimeActiveDevice[1] = EEPROM.read(2);
     TimeDeactiveDevice[0] = EEPROM.read(3);
     TimeDeactiveDevice[1] = EEPROM.read(4);
   }
  
   DS1307.getDate(DataTime);    
   SegAtual = DataTime[6];
  
   if(ReadKeyPad() == 10)
   {
     AdjustTime();
     lcd.clear();
     ActivationHour();
     lcd.clear();
   }
  
   if(abs(SegAtual - SegAnt) >= 1)
   {
     sprintf(tempo, "%02d:%02d:%02d", DataTime[4], DataTime[5], DataTime[6]);
     sprintf(data, "%02d/%02d/%02d", DataTime[2], DataTime[1], DataTime[0]);
     lcd.setCursor(4,1);
     lcd.print(tempo);
     lcd.setCursor(4,0);
     lcd.print(data);
     SegAnt = SegAtual;
   }
  
   //Active and Deactive the device according to the time
   if(DataTime[4] == TimeActiveDevice[0] && DataTime[5] == TimeActiveDevice[1])
   {
     digitalWrite(RELAY, LOW);
   }
  
   if(DataTime[4] == TimeDeactiveDevice[0] && DataTime[5] == TimeDeactiveDevice[1])
   {
     digitalWrite(RELAY, HIGH);
   }
}

因此,在此之后,系统将在LCD中显示小时和日期并且,此后,将当前小时和分钟与向量的值进行比较。

这样,继电器将根据一天中的时间激活或停用。

最后,我们将实现一个蜂鸣器,以指示用户按下了一个键。

蜂鸣器指示按键被按下

蜂鸣器对于指示用户按下了键非常重要。通常,用户不确定是否输入了值。这样,蜂鸣器会提示按键已被按下。

byte ReadKeyPad(void)
{   
 byte teclado[4][4] = {
 {1,2,3,10},
 {4,5,6,11},
 {7,8,9,12},
 {14,0,15,13}};
   byte coluna[4] = {8,9,10,11};
   byte linha[4]  = {12,13,14,15};
   bool tecla;
   byte digito_tecla = 16;
   for(byte y = 0; y <= 3; y++)
   {
     digitalWrite(coluna[y], LOW);
   }
   for(byte y = 0; y <= 3; y++)
   {
     digitalWrite(coluna[y], HIGH);
  
       for(byte x = 0; x <= 3; x++)
       {
           tecla = digitalRead(linha[x]);  
           if(tecla == 1)
           {
             digito_tecla = teclado[x][y];
               digitalWrite(BUZZER, HIGH);  
               delay(100);
               digitalWrite(BUZZER, LOW);
             return digito_tecla;
           }             
       }
    digitalWrite(coluna[y], LOW);
   }
   return digito_tecla;
}

在 for 循环内部,蜂鸣器会启动 400 毫秒以向用户发出信号。

现在,您将根据时间看到继电器的工作情况。

激活继电器

为了执行继电器激活测试,继电器被编程为在上午 10:46 激活。从图 4 中可以看出,继电器已停用。

此状态由绿色LED表示

 
poYBAGOYtI-AcOX2AA8NnA5u0Hc206.jpg
 

现在,在图 5 中,继电器被激活,绿色LED被启动以表示继电器的激活。

 
poYBAGOYtLGAO4b3AA5fFEoLQo4332.jpg
 

最后,我们已经能够实现主要功能以在预定时间执行继电器的激活。

现在您可以使用整个项目来应用到需要在预定时间触发的设备。

我们很快就会为我们的设备创建新功能。

 


下载该资料的人也在下载 下载该资料的人还在阅读
更多 >

评论

查看更多

下载排行

本周

  1. 1山景DSP芯片AP8248A2数据手册
  2. 1.06 MB  |  532次下载  |  免费
  3. 2RK3399完整板原理图(支持平板,盒子VR)
  4. 3.28 MB  |  339次下载  |  免费
  5. 3TC358743XBG评估板参考手册
  6. 1.36 MB  |  330次下载  |  免费
  7. 4DFM软件使用教程
  8. 0.84 MB  |  295次下载  |  免费
  9. 5元宇宙深度解析—未来的未来-风口还是泡沫
  10. 6.40 MB  |  227次下载  |  免费
  11. 6迪文DGUS开发指南
  12. 31.67 MB  |  194次下载  |  免费
  13. 7元宇宙底层硬件系列报告
  14. 13.42 MB  |  182次下载  |  免费
  15. 8FP5207XR-G1中文应用手册
  16. 1.09 MB  |  178次下载  |  免费

本月

  1. 1OrCAD10.5下载OrCAD10.5中文版软件
  2. 0.00 MB  |  234315次下载  |  免费
  3. 2555集成电路应用800例(新编版)
  4. 0.00 MB  |  33566次下载  |  免费
  5. 3接口电路图大全
  6. 未知  |  30323次下载  |  免费
  7. 4开关电源设计实例指南
  8. 未知  |  21549次下载  |  免费
  9. 5电气工程师手册免费下载(新编第二版pdf电子书)
  10. 0.00 MB  |  15349次下载  |  免费
  11. 6数字电路基础pdf(下载)
  12. 未知  |  13750次下载  |  免费
  13. 7电子制作实例集锦 下载
  14. 未知  |  8113次下载  |  免费
  15. 8《LED驱动电路设计》 温德尔著
  16. 0.00 MB  |  6656次下载  |  免费

总榜

  1. 1matlab软件下载入口
  2. 未知  |  935054次下载  |  免费
  3. 2protel99se软件下载(可英文版转中文版)
  4. 78.1 MB  |  537798次下载  |  免费
  5. 3MATLAB 7.1 下载 (含软件介绍)
  6. 未知  |  420027次下载  |  免费
  7. 4OrCAD10.5下载OrCAD10.5中文版软件
  8. 0.00 MB  |  234315次下载  |  免费
  9. 5Altium DXP2002下载入口
  10. 未知  |  233046次下载  |  免费
  11. 6电路仿真软件multisim 10.0免费下载
  12. 340992  |  191187次下载  |  免费
  13. 7十天学会AVR单片机与C语言视频教程 下载
  14. 158M  |  183279次下载  |  免费
  15. 8proe5.0野火版下载(中文版免费下载)
  16. 未知  |  138040次下载  |  免费