极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15240|回复: 8

自动换电

[复制链接]
发表于 2017-5-31 16:25:30 | 显示全部楼层 |阅读模式
背景:电费分阶段收费
条件:家中可接入两路电网
作用:节省电费,使用电路停电时可自动切换
材料: arduino uno r3 ,1pcs
          ds3231时钟模块,1pcs
          小型面包板,3pcs
          1602lcd液晶屏,1pcs
          杜邦线若干
          5V继电器,4pcs
          紧急电源,1pcs

原理图:(鉴于个人刚开始学pcb设计,图画得比较渣,上面也才会用面包板)
javascript:;

接线:如图,有需要的话再写

程序
#include <Wire.h>
#include <DS3231.h>
#include <LiquidCrystal.h>

int i=1;
int j=1;
int e=0;//断电计数
int LEDone=10;//电源输出1
int LEDtow=9;//电源输出0
int dianyuan0=0;//电路输入0
int dianyuan1=1;//电源输入1
int jingbao=13;//断电报警,太吵了,后来没用上,放着也不影响就不管了
int dian0=0;
int dian1=0;

LiquidCrystal lcd(12,11,5,4,3,2);//lcd四线接法pin脚定义
DS3231 Clock;
bool Century=false;
bool h12;
bool PM;
byte ADay, AHour, AMinute, ASecond, ABits;
bool ADy, A12h, Apm;
byte year, month, date, DoW, hour, minute, second;



void setup()
{
  lcd.begin(16,2);//lcd初始化
  Serial.begin(9600);
  // 设置时间后, 需要注释掉设置时间的代码,并重新烧录一次. 以免掉电重新执行setup中的时间设置函数.

        // 初始化i2c库
        Wire.begin();
        /*
        Clock.setSecond(0);//配置秒
        Clock.setMinute(20);//配置分钟
        Clock.setHour(16);  //配置小时(24小时制)
        Clock.setDoW(7);    //配置星期
        Clock.setDate(28);  //配置日
        Clock.setMonth(5);  //配置月
        Clock.setYear(17);  //配置年 (仅最后两位)
        */
  
  pinMode(LEDone,OUTPUT);  
  pinMode(LEDtow,OUTPUT);

  digitalWrite(LEDone,LOW);
  digitalWrite(LEDtow,LOW);
  pinMode(dianyuan0,INPUT);
  pinMode(dianyuan1,INPUT);
  pinMode(jingbao,OUTPUT);

}
void loop()
{
  getdatetime();
  clockdate();
  huandian();
  delay(1000);
}
void getdatetime()//上传时间至串口
{
  int second,minute,hour,date,month,year;
  second=Clock.getSecond();
  minute=Clock.getMinute();
  hour=Clock.getHour(h12, PM);
  date=Clock.getDate();
  month=Clock.getMonth(Century);
  year=Clock.getYear();
  
  Serial.print("20");
  Serial.print( year,DEC);
  Serial.print('-');
  Serial.print( month,DEC);
  Serial.print('-');
  Serial.print( date,DEC);
  Serial.print(' ');
  Serial.print( hour,DEC);
  Serial.print(':');
  Serial.print( minute,DEC);
  Serial.print(':');
  Serial.print( second,DEC);
  Serial.print('\n');

}
void clockdate()//1602显示时间
{         

        int second,minute,hour,date,month,year;
        second=Clock.getSecond();
        minute=Clock.getMinute();
        hour=Clock.getHour(h12, PM);
        date=Clock.getDate();
        month=Clock.getMonth(Century);
        year=Clock.getYear();
        lcd.clear(); //清屏
        lcd.setCursor(0,0);
        lcd.print("20");
        lcd.setCursor(2,0);
        lcd.print( year,DEC);
        lcd.setCursor(4,0);
        lcd.print("-");
        lcd.setCursor(5,0);
        lcd.print( month/10,DEC);
        lcd.setCursor(6,0);
        lcd.print( month%10,DEC);
        lcd.setCursor(7,0);
        lcd.print("-");
        lcd.setCursor(8,0) ;
        lcd.print( date/10,DEC);
        lcd.setCursor(9,0) ;
        lcd.print( date%10,DEC);
        lcd.setCursor(0, 1) ;                                                                                                                                                                                                              
        lcd.print( hour/10,DEC);
        lcd.setCursor(1, 1) ;                                                                                                                                                                                                              
        lcd.print( hour%10,DEC);        
        lcd.setCursor(2, 1) ;
        lcd.print(":");
        lcd.setCursor(3, 1) ;
        lcd.print( minute/10,DEC);
        lcd.setCursor(4, 1) ;
        lcd.print( minute%10,DEC);
        lcd.setCursor(5, 1) ;
        lcd.print(":");
        lcd.setCursor(6, 1) ;
        lcd.print( second/10,DEC);
        lcd.setCursor(7, 1) ;
        lcd.print( second%10,DEC);                     
}
  void huandian ()//换电程序
{
  int second,minute,hour,date,month,year;
  second=Clock.getSecond();
  minute=Clock.getMinute();
  hour=Clock.getHour(h12, PM);
  date=Clock.getDate();
  month=Clock.getMonth(Century);
  year=Clock.getYear();


if (digitalRead(dianyuan1)==HIGH)
{
  dian1=1;

}
  else
{
  dian1=0;

}
if (digitalRead(dianyuan0)==HIGH)

{
  dian0=1;

}
else
{
  dian0=0;

}



if (dian0==1&&dian1==1)//两路电源皆有电,每1号和15号换一次电
{
  digitalWrite(jingbao,HIGH);
if (date>14&&i!=0)//i的作用,使if判断仅执行一次。下面的就、同理
    {
      digitalWrite(LEDone,LOW);
      
      j=1;
     e++;
     if (e>1)
      {  
        digitalWrite(LEDtow,HIGH);
        i=0;
        e=0;
      }
    }
    if (date<=14&&j!=0)
    {
      i=1;
      e++;  
      digitalWrite(LEDtow,LOW);      
      if (e>1)
      {
      digitalWrite(LEDone,HIGH);
      j=0;
      e=0;
      }
    }
}


if (dian0==1&&dian1==0)//电源0没电的情况使用电源1
{
      digitalWrite(LEDone,LOW);
  j=1;
  i=0;
        digitalWrite(LEDtow,HIGH);
        digitalWrite(jingbao,LOW);
}


if (dian0==0&&dian1==1)//电源1没电的情况使用电源0
{
      digitalWrite(LEDtow,LOW);
     i=1;
    j=0;  
        digitalWrite(LEDone,HIGH);
        digitalWrite(jingbao,LOW);
}
}





图片视频什么的,没办法直接拖放进来,烦就算了

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2017-5-31 23:17:30 | 显示全部楼层
这个想法不错,不过是否能稳定运行呢?
回复 支持 反对

使用道具 举报

发表于 2017-6-1 10:51:36 | 显示全部楼层
继电器一定要买质量好的。安全第一哈。
回复 支持 反对

使用道具 举报

发表于 2017-6-1 12:02:50 | 显示全部楼层
家中可接入两路电网?? 你在那市?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-1 21:31:23 | 显示全部楼层
PINKWALKMAN 发表于 2017-6-1 10:51
继电器一定要买质量好的。安全第一哈。


继电器控制交流接触器,所以还好
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-2 09:50:13 | 显示全部楼层
mm168 发表于 2017-6-1 12:02
家中可接入两路电网?? 你在那市?

农村,夏季容易限电,本村和隔壁村限电时间还不一样,两路一路就是本村,一路隔壁村,缴费要交两个账号就是了
回复 支持 反对

使用道具 举报

发表于 2017-6-6 20:48:34 | 显示全部楼层
初学者学习。我也用继电器控制电器,可能是继电器火花干扰吧,板子有时就死机了,最后用了看门狗解决。
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-3-28 17:45 , Processed in 0.047428 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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