| 
  • If you are citizen of an European Union member nation, you may not use this service unless you are at least 16 years old.

  • Social distancing? Try a better way to work remotely on your online files. Dokkio, a new product from PBworks, can help your team find, organize, and collaborate on your Drive, Gmail, Dropbox, Box, and Slack files. Sign up for free.

View
 

KianaKavoosi_FinalProject_Code

Page history last edited by Kiana Kavoosi 6 years, 9 months ago

 

#include <SPI.h>

#include <LiquidCrystal.h>

#define ENC_A 9 //these need to be digital input pins

#define ENC_B 10

 

unsigned long time1=0;

unsigned long time2=0;

int change=0;

int alarmM=0;

int alarmH=0;

String alarm;

boolean alarmState=false;

boolean screenState=false;

const int  cs=8; //chip select 

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

 

void setup() {

  pinMode(ENC_A, INPUT_PULLUP);

  pinMode(ENC_B, INPUT_PULLUP);

  Serial.begin(9600);

 

  lcd.begin(16, 2);

 

  RTC_init();

  //day(1-31), month(1-12), year(0-99), hour(0-23), minute(0-59), second(0-59)

  SetTimeDate(18, 8, 13, 22, 41, 0); 

}

 

void loop() {

  if(alarmH==ReadHour() && alarmM==ReadMins() && alarmState){  

    tone(6, 440);

  }

 

  else{

    noTone(6);

  }

 

  if(!screenState){

    lcd.setCursor(0,0);

    lcd.print(ReadDate());

    lcd.setCursor(0,1);

    lcd.print(ReadTime());

  }

  if(alarmState){

 

    if(!screenState){

      lcd.setCursor(15, 1);

      lcd.print("*");

    }

 

 

 

  }

 

  if(screenState){

    if(change==0){

      lcd.setCursor(3,0);

      lcd.print("Set Alarm");

      lcd.setCursor(5,1);

      lcd.print(alarmH);

      lcd.print(":");

      if(alarmM<10){

        lcd.print("0");

      }

      lcd.print(alarmM);

    }

 

    static unsigned int counter4x = 0;      //the SparkFun encoders jump by 4 states from detent to detent

    static unsigned int counter = 0;

    static unsigned int prevCounter = 0;

    int tmpdata;

    tmpdata = read_encoder();

    if( tmpdata) {

      counter4x += tmpdata;

      counter = counter4x/4;

      if (prevCounter != counter){

        if(counter==0 && prevCounter==16383){

          change=1;

        }

        else if(counter==16383 && prevCounter==0){

          change=-1; 

        }

        else{

          change=prevCounter-counter; 

 

        }

 

        alarmM-=change;

 

        if(alarmM>59){

          alarmM=0;

          alarmH++;

        }

 

        if(alarmM<0){

          alarmM=59;

          alarmH--;

        }

 

        if(alarmH>23){

          alarmH=0;

        }

 

        if(alarmH<0){

          alarmH=23;

        }

 

        if(change!=0){

          lcd.clear();

          lcd.setCursor(3,0);

          lcd.print("Set Alarm");

 

          lcd.setCursor(5,1);

 

          lcd.print(alarmH);

          lcd.print(":");

          if(alarmM<10){

            lcd.print(0);

          }

          lcd.print(alarmM);

        }

 

      }

      prevCounter = counter;

    }

 

 

 

  }

 

  if(digitalRead(13)==HIGH && (millis()-time1)>400){

    Serial.println("trigger");

    time1=millis();

    alarmState=!alarmState;

    if(!screenState){

      lcd.clear();

    }

    else{

      lcd.setCursor(1, 15);

      lcd.print(" ");

    }

  }

 

  if(digitalRead(7)==HIGH && (millis()-time2)>400){

    Serial.println("trigger");

    time2=millis();

    screenState=!screenState;

    if(screenState){

      change=0;

    }

    lcd.clear();

  }

 

}

 

 

 

//=====================================

 

int read_encoder()

{

  static int enc_states[] = {

    0,-1,1,0,1,0,0,-1,-1,0,0,1,0,1,-1,0                                    };

  static byte ABab = 0;

  ABab *= 4;                   //shift the old values over 2 bits

  ABab = ABab%16;      //keeps only bits 0-3

  ABab += 2*digitalRead(ENC_A)+digitalRead(ENC_B); //adds enc_a and enc_b values to bits 1 and 0

  return ( enc_states[ABab]);

 

}

 

//=====================================

int RTC_init(){ 

  pinMode(cs,OUTPUT); // chip select

  // start the SPI library:

  SPI.begin();

  SPI.setBitOrder(MSBFIRST); 

  SPI.setDataMode(SPI_MODE1); // both mode 1 & 3 should work 

  //set control register 

  digitalWrite(cs, LOW);  

  SPI.transfer(0x8E);

  SPI.transfer(0x60); //60= disable Osciallator and Battery SQ wave @1hz, temp compensation, Alarms disabled

  digitalWrite(cs, HIGH);

  delay(10);

}

//=====================================

int SetTimeDate(int d, int mo, int y, int h, int mi, int s){ 

  int TimeDate [7]={

    s,mi,h,0,d,mo,y                                  };

  for(int i=0; i<=6;i++){

    if(i==3)

      i++;

    int b= TimeDate[i]/10;

    int a= TimeDate[i]-b*10;

    if(i==2){

      if (b==2)

        b=B00000010;

      else if (b==1)

        b=B00000001;

    }

    TimeDate[i]= a+(b<<4);

 

    digitalWrite(cs, LOW);

    SPI.transfer(i+0x80); 

    SPI.transfer(TimeDate[i]);        

    digitalWrite(cs, HIGH);

  }

}

//=====================================

 

int ReadHour(){

  int temp;

  digitalWrite(cs, LOW);

  SPI.transfer(2+0x00);

  unsigned int n = SPI.transfer (0x00);

  digitalWrite(cs,HIGH);

  int a=n & B00001111; 

  int b=(n & B00110000)>>4; //24 hour mode

  if(b==B00000010)

    b=20;        

  else if(b==B00000001)

    b=10;

  temp=a+b;

  return temp;

}

 

int ReadMins(){

  int temp;

  digitalWrite(cs, LOW);

  SPI.transfer(1+0x00); 

  unsigned int n = SPI.transfer(0x00);        

  digitalWrite(cs, HIGH);

  int a=n & B00001111;    

  int b=(n & B01110000)>>4;

  temp=a+b*10;

  return temp;

}

 

 

String ReadTimeDate(){

  String temp;

  int TimeDate [7]; //second,minute,hour,null,day,month,year

  for(int i=0; i<=6;i++){

    if(i==3)

      i++;

    digitalWrite(cs, LOW);

    SPI.transfer(i+0x00); 

    unsigned int n = SPI.transfer(0x00);        

    digitalWrite(cs, HIGH);

    int a=n & B00001111;    

    if(i==2){

      int b=(n & B00110000)>>4; //24 hour mode

      if(b==B00000010)

        b=20;        

      else if(b==B00000001)

        b=10;

      TimeDate[i]=a+b;

    }

    else if(i==4){

      int b=(n & B00110000)>>4;

      TimeDate[i]=a+b*10;

    }

    else if(i==5){

      int b=(n & B00010000)>>4;

      TimeDate[i]=a+b*10;

    }

    else if(i==6){

      int b=(n & B11110000)>>4;

      TimeDate[i]=a+b*10;

    }

    else{

      int b=(n & B01110000)>>4;

      TimeDate[i]=a+b*10;

    }

  }

  temp.concat(TimeDate[4]);

  temp.concat("/") ;

  temp.concat(TimeDate[5]);

  temp.concat("/") ;

  temp.concat(TimeDate[6]);

  temp.concat(" ") ;

  temp.concat(TimeDate[2]);

  temp.concat(":") ;

  temp.concat(TimeDate[1]);

  temp.concat(":") ;

  temp.concat(TimeDate[0]);

  return(temp);

}

 

String ReadDate(){

  String temp;

  int Date [3]; //day,month,year

  for(int i=0; i<=2;i++){

    digitalWrite(cs, LOW);

    SPI.transfer(i+0x04); 

    unsigned int n = SPI.transfer(0x04);        

    digitalWrite(cs, HIGH);

    int a=n & B00001111;    

    if(i==0){

      int b=(n & B00110000)>>4;

      Date[i]=a+b*10;

    }

    else if(i==1){

      int b=(n & B00010000)>>4;

      Date[i]=a+b*10;

    }

    else if(i==2){

      int b=(n & B11110000)>>4;

      Date[i]=a+b*10;

    }

    else{

      int b=(n & B01110000)>>4;

      Date[i]=a+b*10;

    }

  }

  temp.concat(Date[0]);

  temp.concat("/") ;

  temp.concat(Date[1]);

  temp.concat("/") ;

  temp.concat(Date[2]);

  return(temp);

}

 

 

int SetDate(int d, int mo, int y){ 

  int Date [3]={

    d,mo,y                                };

  for(int i=0; i<=2;i++){

    int b= Date[i]/10;

    int a= Date[i]-b*10;

    if(i==2){

      if (b==2)

        b=B00000010;

      else if (b==1)

        b=B00000001;

    }

    Date[i]= a+(b<<4);

 

    digitalWrite(cs, LOW);

    SPI.transfer(i+0x84); 

    SPI.transfer(Date[i]);        

    digitalWrite(cs, HIGH);

  }

}

 

int SetTime(int h, int mi, int s){ 

  int TimeDate [3]={

    s,mi,h                                };

  for(int i=0; i<=2;i++){

    if(i==3)

      i++;

    int b= TimeDate[i]/10;

    int a= TimeDate[i]-b*10;

 

    TimeDate[i]= a+(b<<4);

 

    digitalWrite(cs, LOW);

    SPI.transfer(i+0x80); 

    SPI.transfer(TimeDate[i]);        

    digitalWrite(cs, HIGH);

  }

}

 

String ReadTime(){

  String temp;

  int TimeDate [3]; //second,minute,hour

  for(int i=0; i<=2;i++){

    digitalWrite(cs, LOW);

    SPI.transfer(i+0x00); 

    unsigned int n = SPI.transfer(0x00);        

    digitalWrite(cs, HIGH);

    int a=n & B00001111;    

    if(i==2){

      int b=(n & B00110000)>>4; //24 hour mode

      if(b==B00000010)

        b=20;        

      else if(b==B00000001)

        b=10;

      TimeDate[i]=a+b;

    }

    else{

      int b=(n & B01110000)>>4;

      TimeDate[i]=a+b*10;

    }

  }

  temp.concat(TimeDate[2]);

  temp.concat(":") ;

  if(TimeDate[1]<10){

    temp.concat("0");

  }

  temp.concat(TimeDate[1]);

  temp.concat(":") ;

  if(TimeDate[0]<10){

    temp.concat("0"); 

  }

  temp.concat(TimeDate[0]);

  return(temp);

}

 

Comments (0)

You don't have permission to comment on this page.