mingxu976 发表于 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);
}
}





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

wing 发表于 2017-5-31 23:17:30

这个想法不错,不过是否能稳定运行呢?

PINKWALKMAN 发表于 2017-6-1 10:51:36

继电器一定要买质量好的。安全第一哈。

弘毅 发表于 2017-6-1 11:13:01

。。。。。两路电网

mm168 发表于 2017-6-1 12:02:50

家中可接入两路电网?? 你在那市?

mingxu976 发表于 2017-6-1 21:31:23

PINKWALKMAN 发表于 2017-6-1 10:51
继电器一定要买质量好的。安全第一哈。

继电器控制交流接触器,所以还好

mingxu976 发表于 2017-6-2 09:50:13

mm168 发表于 2017-6-1 12:02
家中可接入两路电网?? 你在那市?

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

迷你强 发表于 2017-6-2 14:19:49

:funk:l双电网

mondaywoo 发表于 2017-6-6 20:48:34

初学者学习。我也用继电器控制电器,可能是继电器火花干扰吧,板子有时就死机了,最后用了看门狗解决。
页: [1]
查看完整版本: 自动换电