Source

Compass Hat / hat.pde

/*

LED and haptic buzzer display for an HMC6352 compass.  GPL v3.
 
*/

#include <hmc6352.h>
#include <Wire.h>

Hmc6352 hmc6352;

int buzzerPin = 3;

//Pin connected to latch pin (ST_CP) of 74HC595
const int latchPin = 8;
//Pin connected to clock pin (SH_CP) of 74HC595
const int clockPin = 12;
////Pin connected to Data in (DS) of 74HC595
const int dataPin = 11;

int heading =  3;

//Largest angle in degrees to either side that buzzer starts (less than 180)
int buzzerlim = 90;


// The setup() method runs once, when the sketch starts
  
void setup()   {
  //setup for the compass
  Serial.begin(9600);
  delay(100);
  
  Serial.print("RST\r\n");delay(100);  
 
  // initialize the digital pin as an output:
  pinMode(buzzerPin, OUTPUT);
  analogWrite(buzzerPin, LOW);
  
  //set pins to output because they are addressed in the main loop
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);  
  pinMode(clockPin, OUTPUT);

}

// the loop() method runs over and over again,
// as long as the Arduino has power

void loop()                     
{  
  hmc6352.wake();
  float heading = hmc6352.getHeading();
  hmc6352.sleep();
 
  Serial.print(heading,DEC);
  Serial.print(" raw heading\r\n");
  //0 - 7 (may need floor)
  int headingLED = (int)((heading - 22.5)/45.0);
  
  Serial.print(headingLED,DEC);
  Serial.print(" comparison\r\n");
  
  // write to the shift register with the correct bit set high:
  registerWrite(headingLED, HIGH);
  
  float negheading = 360.0 - heading;
  //Between 0-255 for PWM
  int buzzerness = 0;
  
  if(heading == 0) {
    buzzerness = 255;
  } else if(heading <= buzzerlim) {
    buzzerness = (int)((buzzerlim - heading)/buzzerlim * 65.0) + 190;
  } else if(negheading <= buzzerlim) {
    buzzerness = (int)((buzzerlim - negheading)/buzzerlim * 65.0) + 190;
  }
  
  analogWrite(buzzerPin, buzzerness);
  }

// This method sends bits to the shift register:
void registerWrite(int whichPin, int whichState) {
// the bits you want to send
  byte bitsToSend = 0;

  // turn off the output so the pins don't light up
  // while you're shifting bits:
  digitalWrite(latchPin, LOW);

  // turn on the next highest bit in bitsToSend:
  bitWrite(bitsToSend, whichPin, whichState);

  // shift the bits out:
  shiftOut(dataPin, clockPin, MSBFIRST, bitsToSend);

    // turn on the output so the LEDs can light up:
  digitalWrite(latchPin, HIGH);
}
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.