بسم الله الرحمن الرحيم
السلام عليكم و رحمة الله و بركاته
اليكم اخوانى البرنامج :
المترجم : avr studio
اللغة : C/C++ + arduino
كود:
#include <Arduino.h>
#include <Adafruit_LiquidCrystal.h>
#include "Wire.h"
#include <EEPROM.h>
#define DS1307_I2C_ADDRESS 0b1101000
#define but_up ~PIND & 1<<PIND0
#define but_dn ~PIND & 1<<PIND1
#define but_st ~PIND & 1<<PIND2
#define but_CLASS ~PIND & 1<<PIND3
#define alarmON PORTA = 1
#define alarmOFF PORTA = 0
#define addressof_totalWorkday 0
#define addressof_Firstworkday 1
#define addressof_FirstworkdayClassNo 2
#define addressof_FirstworkdayTimes 3
class Days_Classes //: public Adafruit_LiquidCrystal
{
public:
Adafruit_LiquidCrystal lcd;
Days_Classes():lcd(8,9,10,11,12,13) {lcd.begin(16,2);}
~Days_Classes(){};
char keypressed ;
char week[8][10] = {"0","FRIDAY ","SATURDAY ","SUNDAY " ,"MONDAY " ,"TUESDAY " ,"WEDNESDAY", "THURSDAY "};
typedef struct {
byte second,minute, hour, dayofweek, dayofmonth, month, year;
} RTCtype;
void clearEEprom(){
int i ;
for (i=0; i<=300;i++)
{ // to not clear all bytes every restart of MCU , only first time operation.
if(EEPROM.read(i) > 59) EEPROM.write(i,0);
}
}
byte decToBcd (byte dec){
return ( (dec/10)*16+dec%10 );
}
byte bcdToDec (byte bcd){
return ( (bcd/16)*10+bcd%16 );
}
void RTC_display(){
RTCtype myRTC ; //struct
RTCtype* myRTCaddress;
myRTCaddress = &myRTC ;
RTC_read(myRTCaddress);
// display date
lcd.setCursor(0,0);
lcd.print("Date: : :20");
lcd.setCursor(5,0); // day
if(myRTC.dayofmonth<10)lcd.print("0");
lcd.print(myRTC.dayofmonth);
lcd.setCursor(8,0);// month
if(myRTC.month<10)lcd.print("0");
lcd.print(myRTC.month);
lcd.setCursor(13,0); // year
lcd.print(myRTC.year);
// display time
lcd.setCursor(0,1);
lcd.print("Time: : : ");
lcd.setCursor(5,1); // hour
if(myRTC.hour<10)lcd.print("0");
lcd.print(myRTC.hour);
lcd.setCursor(8,1); // minute
if(myRTC.minute<10)lcd.print("0");
lcd.print(myRTC.minute);
lcd.setCursor(11,1);// second
if(myRTC.second<10)lcd.print("0");
lcd.print(myRTC.second);
}
void RTC_read( RTCtype* myRTCaddress){
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0);
Wire.endTransmission();
Wire.requestFrom(DS1307_I2C_ADDRESS,7);
myRTCaddress->second = bcdToDec(Wire.read() & 0x7f);
myRTCaddress->minute = bcdToDec(Wire.read());
myRTCaddress->hour = bcdToDec(Wire.read() & 0x3f);
myRTCaddress->dayofweek = bcdToDec(Wire.read());
myRTCaddress->dayofmonth = bcdToDec(Wire.read());
myRTCaddress->month = bcdToDec(Wire.read());
myRTCaddress->year = bcdToDec(Wire.read());
}
char key_input (){
if (but_up ) {delay(250) ;return 'u'; }
if (but_dn ) {delay(250) ;return 'd'; }
if (but_st ) {delay(250) ;return 's'; }
if (but_CLASS) {delay(250) ;return 'C'; }
else return 0;
}
void Rtc_Update(){
char keypressed=0 ;
byte element=0 ; // increment / dec. values
RTCtype myRTC;
RTC_read (&myRTC);
byte* alldataddress[7] = {&myRTC.year, &myRTC.month, &myRTC.dayofmonth, &myRTC.dayofweek, &myRTC.hour, &myRTC.minute, &myRTC.second};
char week[7][10]= {"FRIDAY ","SATURDAY ","SUNDAY " ,"MONDAY " ,"TUESDAY " ,"WEDNESDAY", "THURSDAY " };
lcd.clear();
lcd.print("DATE : YEAR = ") ;
while(1){
// Print date/time variable
lcd.setCursor(6,1);
if(element == 3 /*dayofweek*/){ lcd.print(week[myRTC.dayofweek-1]);}
else{
if((*alldataddress[element])<10) lcd.print("0");
lcd.print((*alldataddress[element])) ;
}
keypressed=key_input();
switch (keypressed){
case 'C': break;
case 'u': { (*alldataddress[element])++ ;break;}
case 'd': { (*alldataddress[element])-- ;break;}
case 's': {
element++;
if(element == 1 /*month*/ ) { lcd.clear();lcd.setCursor(0,0); lcd.print("DATE : MONTH = ") ;}
else if(element == 2 /*dayofmonth*/ ) { lcd.clear();lcd.setCursor(0,0); lcd.print("DATE : DAY = ") ;}
else if(element == 3 /*myRTC.dayofweek*/ ) { lcd.clear();lcd.setCursor(0,0); lcd.print("DATE : WEEKDAY= ") ;}
else if(element == 4 /*myRTC.hour */ ) { lcd.clear();lcd.setCursor(0,0); lcd.print("TIME : HOUR = ") ;}
else if(element == 5 /*myRTC.minute */ ) { lcd.clear();lcd.setCursor(0,0); lcd.print("TIME : MINUTE = ") ;}
else if(element == 6 /*myRTC.second */ ) { lcd.clear();lcd.setCursor(0,0); lcd.print("TIME : SECOND = ") ;}
else {return ;}
break;
}
}
if((*alldataddress[element] == myRTC.year ) && myRTC.year<16) { myRTC.year = 16 ;}
if((*alldataddress[element] == myRTC.month ) && (myRTC.month<=1 || myRTC.month>12)) { myRTC.month =1 ;} // MONTH LIMIT
if((*alldataddress[element] == myRTC.dayofmonth ) && (myRTC.dayofmonth <=1 || myRTC.dayofmonth >31)) { myRTC.dayofmonth =1;} // MONTH LIMIT
if((*alldataddress[element] == myRTC.dayofweek ) && (myRTC.dayofweek <=1 || myRTC.dayofweek >7 )) { myRTC.dayofweek =1 ;} // MONTH LIMIT
if((*alldataddress[element] == myRTC.hour ) && (myRTC.hour ==0 || myRTC.hour >23)) { myRTC.hour =0 ;} // MONTH LIMIT
if((*alldataddress[element] == myRTC.minute ) && (myRTC.minute ==0 || myRTC.minute >59)) { myRTC.minute =0 ;} // MONTH LIMIT
if((*alldataddress[element] == myRTC.second ) && (myRTC.second ==0 || myRTC.second >59) ) { myRTC.second =0 ;} // MONTH LIMIT
RTC_write(&myRTC);
}
}
void RTC_write(RTCtype* RTCnew){
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0);
Wire.write(decToBcd(RTCnew->second));
Wire.write(decToBcd(RTCnew->minute ));
Wire.write(decToBcd(RTCnew->hour));
Wire.write(decToBcd(RTCnew->dayofweek));
Wire.write(decToBcd(RTCnew->dayofmonth));
Wire.write(decToBcd(RTCnew->month));
Wire.write(decToBcd(RTCnew->year));
Wire.endTransmission();
}
void get_allworkingDays(){ // all working days
lcd.begin(16,2);
byte daynameID=1 , element=0 , eepromStep =0 ;
char workdaysNames[8][8]={"FIRST ", "SECOND ", "THIRD ", "FORTH ", "FIFTH ", "SIXTH ", "SEVENTH"} ;
lcd.clear();
lcd.setCursor(0,0); lcd.print(workdaysNames[element]); lcd.print("work day");
while(1){
keypressed=key_input();
switch (keypressed){
case 'C': { lcd.clear() ;lcd.setCursor(0,0); lcd.print("Total Work Days");
lcd.setCursor(6,1); lcd.print(EEPROM.read(addressof_totalWorkday));delay(2000); return; break;
}
case 'u': { daynameID++ ;break;}
case 'd': { daynameID-- ;break;}
case 's': {
element++; if(element>6)return ;
EEPROM.write(addressof_Firstworkday + eepromStep, daynameID);
eepromStep+=3;
EEPROM.write(addressof_totalWorkday,eepromStep/3);
lcd.setCursor(0,0); lcd.print(workdaysNames[element]); lcd.print("work day");
break;
}
}
if(daynameID>7 || daynameID<1) daynameID=1;
lcd.setCursor(6,1); lcd.print(week[daynameID]);
}
}
void get_classesperDays(){
byte num_of_class = EEPROM.read(addressof_FirstworkdayClassNo) , eepromStep = 0 ; // eeprom address for addressof_Firstworkday classes numbers = 1
byte numberofDays = 1 , daynameID = 1 ;
lcd.clear();
lcd.setCursor(0,0); lcd.print(week[EEPROM.read(addressof_Firstworkday)]); lcd.print("ClssNo");
while(1){
keypressed=key_input();
switch (keypressed){
case 'C': break;
case 'u': { num_of_class++ ; break;}
case 'd': { num_of_class-- ; break;}
case 's': {
EEPROM.write(addressof_FirstworkdayClassNo + eepromStep, num_of_class); eepromStep+=3;
numberofDays++; if(numberofDays > (EEPROM.read(addressof_totalWorkday)))return ;
num_of_class = EEPROM.read(addressof_FirstworkdayClassNo + eepromStep);
break;
}
}
if(num_of_class>=100) num_of_class=0;
lcd.setCursor(0,0); lcd.print(week[EEPROM.read(addressof_Firstworkday + eepromStep)]); lcd.print("ClssNo");
lcd.setCursor(6,1);
if(num_of_class<10) lcd.print("0");
lcd.print(num_of_class);
}
}
void defineTimeslocations(){
byte eepromStep = 0 , i ;
EEPROM.write(addressof_FirstworkdayTimes + eepromStep , 20); // start of times =20
for (i=2; i<= EEPROM.read(addressof_totalWorkday) ; i++){
eepromStep+=3;
EEPROM.write(addressof_FirstworkdayTimes + eepromStep , 20 + EEPROM.read(addressof_FirstworkdayClassNo)*4);
}
}
void get_classesTimePerDay(){
signed char time = 0 , time_address = 20 ;
byte eepromAddrstep = 0 ;
byte nextDay = EEPROM.read(addressof_Firstworkday);
byte lcd_position = 5 ;
byte class_NO =1 ;
lcd.clear();
lcd.setCursor(0,0); lcd.print(week[EEPROM.read(addressof_Firstworkday + eepromAddrstep)]);
lcd.setCursor(10,0); lcd.print("CLAS-");lcd.print(class_NO); // FIRST LINE
lcd.setCursor(0,1); lcd.print("TIME: : > : ");
while(1){
keypressed=key_input();
switch (keypressed){
case 'C': break;
case 'u': { time++ ; break;}
case 'd': { time-- ; break;}
case 's': { EEPROM.write(time_address,time);time=0; time_address++; lcd_position+=3;
if (lcd_position>14) {
class_NO++ ;
lcd_position=5;
lcd.setCursor(0,1); lcd.print("TIME: : > : ");
}
if(class_NO > EEPROM.read(addressof_FirstworkdayClassNo + eepromAddrstep)){ // check total classes per day finished
eepromAddrstep+=3;
if(eepromAddrstep >= EEPROM.read(addressof_totalWorkday)*3){lcd.clear(); return;} // check total days
class_NO =1; lcd_position=5; time=0;
lcd.clear();
lcd.setCursor(0,0);lcd.print(week[EEPROM.read(addressof_Firstworkday + eepromAddrstep)]);
lcd.setCursor(10,0); lcd.print("CLAS-");
lcd.setCursor(0,1); lcd.print("TIME: : > : ");
}
break;
}
}
lcd.setCursor(15,0); lcd.print(class_NO);
lcd.setCursor(lcd_position,1);
if(time>59 || time<=0) time=0;
if(time<10) lcd.print("0");
lcd.print(time);
}
}
bool alarm (){
byte i = 1 , eepromStep = 0 ;
int location ;
byte second, minute, hour, dayofweek, dayofmonth, month, year;
for (i=1; i<= EEPROM.read(addressof_totalWorkday) ; i++){
if(dayofweek == EEPROM.read(addressof_Firstworkday + eepromStep) ) break;
eepromStep+=3;
}
location = EEPROM.read(addressof_FirstworkdayTimes + eepromStep) ;
for(i=1; i<=EEPROM.read(addressof_FirstworkdayClassNo + eepromStep); i++){
if(hour == EEPROM.read(location) && minute == EEPROM.read(location+1)) return true ;
else location+=4;
}
return false;
}
};
void setup() {
Days_Classes alldays ;
alldays.clearEEprom();
Wire.begin();
PORTD = 0xFF;
DDRD = 0x00;
DDRA = 0xff;
PORTA = 0;
DDRB = 0;
PORTB = 0xff;
}
void loop() {
unsigned long previos=0 , current=0 ;
byte halfminute = 0;
Days_Classes alldays ;
while(true){
current = millis();
if((current-previos)>=1000 ){alldays.RTC_display(); previos = current; halfminute++ ;}
if(halfminute>=30 && alldays.alarm()) {alarmON; halfminute=0 ; delay(10000);}
else alarmOFF;
if (but_st) { delay(200); ; alldays.Rtc_Update(); }
if (but_CLASS) {delay(200) ;
alldays.get_allworkingDays();
alldays.get_classesperDays();
alldays.defineTimeslocations();
alldays.get_classesTimePerDay();
}
}
}
الحمد الذى بنعمته تتم الصالحات
الله مولانا ولا مولى لهم
انى عذت بربى و ربكم ان ترجمون
الله ينصرك سوريا و سائر بلادنا - كلنا حلب و غزة