You are here: Home Interaction SnoRRRhea Arduino Sketch

Arduino Sketch

snoRRRhea.pde.txt — Plain Text, 4Kb

File contents

#undef int() //hack for arduino 0011 to allow use of stdio:
#include <stdio.h> //gives us function sprintf
#include <LCD4Bit.h>

#define HEARTBEAT 13
#define BUTTON1 5
#define BUTTON2 6
#define MODE_NORMAL 0
#define MODE_SETAHOUR 1
#define MODE_SETAMIN 2
#define ALARM_OFF 0
#define ALARM_ON 1
#define MSG_ALARM_OFF "0"
#define MSG_ALARM_ON "1"
#define MSG_ALARM_TRIGGER "T"

int mode = MODE_NORMAL;
int alarm = ALARM_OFF;

int sec=30;
int min=54;
int hour=23; //keep track of time

int amin=15;
int ahour=8; //keep track of alarmtime

// count how many millis have passed since
// we increased the seconds last time
long delta=0;

char buffer[9];

//create object to control an LCD.  
LCD4Bit lcd = LCD4Bit(2); //2 lines

void time_changed() {
  // call this after every increment of 1
  // to any of the three time values
  if(sec==60) {
    min=min+1;
    sec=0;
  }  
  if(min==60) {
    hour=hour+1;
    min=0; 
  }
  if(hour==24) {
   hour=0; 
  }
}

void atime_changed() {
  // call this after every increment to alarm time values
  if(amin>=60) {
    amin=amin - 60; 
  }
  if(ahour>=24) {
   ahour=ahour - 24; 
  }
}

void send_msg(char* msg) {
  Serial.print(msg);
}

void button1_onpress() {
  mode++;
  if (mode > MODE_SETAMIN)
    mode = MODE_NORMAL;
  update_lcd_mode();
}

void button2_onpress() {
  if (mode == MODE_NORMAL) {
    if (alarm == ALARM_ON) {
      alarm = ALARM_OFF;
      send_msg(MSG_ALARM_OFF);
    }
    else if (alarm == ALARM_OFF) {
      alarm = ALARM_ON;
      send_msg(MSG_ALARM_ON);
    }
    update_lcd_mode();
  }

  else if (mode == MODE_SETAHOUR) {
    ahour = ahour + 1;
    atime_changed();
    update_lcd_atime();
  }
  else if (mode == MODE_SETAMIN) {
    amin = amin + 1;
    atime_changed();
    update_lcd_atime();
  }
}

void update_lcd_time() {
  if (sec % 2 == 0) { //true if sec is even number
    sprintf(buffer, "%2d %2d:%2d", hour, min, sec);
  } else {
    sprintf(buffer, "%2d:%2d %2d", hour, min, sec); // : are off every uneven sec
  }

  lcd.cursorTo(1, 0); //line=1, x=0.
  lcd.printIn(buffer);

  if(ahour==hour && amin==min && alarm == ALARM_ON) {
    // Animate snoRRRhea when alarm goes off; for 60 secs
    lcd.cursorTo(2, 0);
    lcd.printIn("snoRRRhea");
    lcd.cursorTo(2, sec%9); // sec%9 is rest of integer division sec/9
    lcd.printIn(" "); //moving space sign that covers the letters
  }
}

void update_lcd_atime() {
  lcd.cursorTo(2, 11);
  sprintf(buffer, "%2d:%2d", ahour, amin);
  lcd.printIn(buffer);
}

void update_lcd_mode() {
  lcd.cursorTo(1, 11);
  lcd.printIn("     ");
  if (mode == MODE_NORMAL) {
    lcd.cursorTo(1, 12);
    if (alarm == ALARM_ON)
      lcd.printIn(" ON");
    else
      lcd.printIn("off");
  } else if (mode == MODE_SETAHOUR) {
    lcd.cursorTo(1, 11);
    lcd.printIn("**");
  } else if (mode == MODE_SETAMIN) {
    lcd.cursorTo(1, 14);
    lcd.printIn("**");
  }
}

void setup() { 
  pinMode(HEARTBEAT, OUTPUT); //we'll use the debug LED to output a heartbeat
  Serial.begin(9600);
 
  lcd.init();
  lcd.clear();

  update_lcd_mode();
  update_lcd_atime();
  lcd.cursorTo(2, 0);
  lcd.printIn("snoRRRhea");
}

void loop() {
  int b1State, b2State;
  unsigned long beforems, afterms;

  digitalWrite(HEARTBEAT, LOW); //light the debug LED 

  beforems = millis();
  
  b1State = digitalRead(BUTTON1);
  b2State = digitalRead(BUTTON2);
  
  delay(10);

  if (b1State == LOW && digitalRead(BUTTON1) == HIGH)
    button1_onpress();
  else if (b2State == LOW && digitalRead(BUTTON2) == HIGH)
    button2_onpress();

  digitalWrite(HEARTBEAT, HIGH); //light the debug LED 

  afterms=millis();
  if (afterms < beforems)
    //millis reset to zero after 9 hours
    delta += 20; // let's make an educated guess
  else
    delta += (afterms - beforems);
  
  if (delta > 1000) {
    beforems = millis();
    sec += 1;
    time_changed();
    update_lcd_time();

    if (alarm == ALARM_ON && hour == ahour && min == amin && sec == 0)
      send_msg(MSG_ALARM_TRIGGER);
    
    // this still needs a bit of adjustment; it's not very accurate
    delta = delta - 1000 - (millis() - beforems);
  }
 }
 
Document Actions