|
背景:电费分阶段收费
条件:家中可接入两路电网
作用:节省电费,使用电路停电时可自动切换
材料: 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
|