Hey guys,
I have a problem turning some code from the HM55B tutorial (in the playground) into a library. For some reason, my library works up to the point where it tries to use a nested function/method (I'm not entirely clear on the differences between methods and functions).
In the CPP code, it stops at after printing "ready for nested method".
//HM55B::HM55B_Reset();
pinMode(DIO_pin, OUTPUT);
digitalWrite(EN_pin, LOW);
Serial.println("Ready for nested method");
ShiftOut(B0000, 3);
Serial.println("Finished nested method");
digitalWrite(EN_pin, HIGH);
Original working code:
#include <math.h>
int CLK_pin = 8; //clock sync pin
int EN_pin = 9; //enabler pin
int DIO_pin = 10; //digital IN OUT pin
int X_Data = 0;
int Y_Data = 0;
int angle;
int ledPin = 2;
int delayVal = 40;
void ShiftOut (int Value, int BitsCount) {
for(int i = BitsCount; i >= 0; i--) {
digitalWrite(CLK_pin, LOW);
if ((Value & 1 << i) == ( 1 << i)) {
digitalWrite(DIO_pin, HIGH);
//Serial.print("1");
}
else {
digitalWrite(DIO_pin, LOW);
//Serial.print("0");
}
digitalWrite(CLK_pin, HIGH);
delay(1);
}
//Serial.print(" ");
}
int ShiftIn(int BitsCount) {
int ShiftIn_result;
ShiftIn_result = 0;
pinMode(DIO_pin, INPUT);
for (int i = BitsCount; i >= 0; i--) {
digitalWrite(CLK_pin, HIGH);
delay(1);
if (digitalRead(DIO_pin) == HIGH) {
ShiftIn_result = (ShiftIn_result << 1) + 1;
//Serial.print("X");
}
else {
ShiftIn_result = (ShiftIn_result << 1) + 0;
//Serial.print(" ");
}
digitalWrite(CLK_pin, LOW);
delay(1);
}
//Serial.print (":");
if ((ShiftIn_result & 1 << 11) == 1 << 11) {
ShiftIn_result = (B11111000 << 8) | ShiftIn_result;
}
return ShiftIn_result;
}
void HM55B_Reset() {
pinMode(DIO_pin, OUTPUT);
digitalWrite(EN_pin, LOW);
ShiftOut(B0000, 3);
digitalWrite(EN_pin, HIGH);
}
void HM55B_StartMeasurementCommand() {
pinMode(DIO_pin, OUTPUT);
digitalWrite(EN_pin, LOW);
ShiftOut(B1000, 3);
digitalWrite(EN_pin, HIGH);
}
int HM55B_ReadCommand() {
int result = 0;
pinMode(DIO_pin, OUTPUT);
digitalWrite(EN_pin, LOW);
ShiftOut(B1100, 3);
result = ShiftIn(3);
return result;
}
void setup() {
Serial.begin(9600);
pinMode(EN_pin, OUTPUT);
pinMode(CLK_pin, OUTPUT);
pinMode(DIO_pin, INPUT);
pinMode(ledPin, OUTPUT);
HM55B_Reset();
}
void loop() {
getValue();
}
int getValue() {
HM55B_StartMeasurementCommand();
delay(delayVal);
Serial.println(HM55B_ReadCommand()); //cannot comment out
Serial.println("************************************");
//Serial.print(" ");
X_Data = ShiftIn(11);
Y_Data = ShiftIn(11);
//Serial.print(X_Data);
//Serial.print(" ");
//Serial.print(Y_Data);
//Serial.print(" ");
digitalWrite(EN_pin, HIGH);
angle = 180 * (atan2(-1 * Y_Data, X_Data) / M_PI); //angle is atan (-y/x)
if (angle < 0) {
angle = ( 360 + angle );
}
else{}
Serial.print("Angle: ");
Serial.println(angle);
Serial.println("************************************");
}
Header file:
/*
*HM55B.h - Library for using the HM55B compass module
*Library written by Chris 12/29/2010
*Released into the public domain.
*
*All credit goes to the authors of the code in the previous link
*All I did was just turn their code into an easy to use library.
*/
#ifndef HM55B_h
#define HM55B_h
#include "WProgram.h"
class HM55B
{
public:
int CLK_pin;
int EN_pin;
int DIO_pin;
HM55B(int CLK_pin, int EN_pin, int DIO_pin);
int getValue();
private:
//int CLK_pin;
//int EN_pin;
//int DIO_pin;
int X_Data;
int Y_Data;
int angle;
void ShiftOut(int Value, int BitsCount);
int ShiftIn(int BitsCount);
void HM55B_Reset();
void HM55B_StartMeasurementCommand();
int HM55B_ReadCommand();
};
#endif
CPP file:
/*
*HM55B.cpp - Library for using the HM55B compass module
*Use with HM55B.h
*Library written by Chris 12/29/2010
*Released into the public domain.
*
*All credit goes to the authors of the code in the previous link
*All I did was just turn their code into an easy to use library.
*/
#include "WProgram.h"
#include "Math.h"
#include "HM55B.h"
HM55B::HM55B(int CLK_pin, int EN_pin, int DIO_pin)
{
pinMode(CLK_pin, OUTPUT);
pinMode(EN_pin, OUTPUT);
pinMode(DIO_pin, INPUT);
//CLK_pin = clkPin;
//EN_pin = enPin;
//DIO_pin = dioPin;
Serial.begin(9600);
Serial.println("Library Works");
//HM55B::HM55B_Reset();
pinMode(DIO_pin, OUTPUT);
digitalWrite(EN_pin, LOW);
Serial.println("Ready for nested method");
ShiftOut(B0000, 3);
Serial.println("Finished nested method");
digitalWrite(EN_pin, HIGH);
Serial.println("Compass reset");
}
void HM55B::ShiftOut(int Value, int BitsCount)
{
for(int i = BitsCount; i >= 0; i--) {
digitalWrite(CLK_pin, LOW);
if ((Value & 1 << i) == ( 1 << i)) {
digitalWrite(DIO_pin, HIGH);
}
else {
digitalWrite(DIO_pin, LOW);
}
digitalWrite(CLK_pin, HIGH);
delay(1);
}
}
int HM55B::ShiftIn(int BitsCount)
{
int ShiftIn_result;
ShiftIn_result = 0;
pinMode(DIO_pin, INPUT);
for (int i = BitsCount; i >= 0; i--) {
digitalWrite(CLK_pin, HIGH);
delay(1);
if (digitalRead(DIO_pin) == HIGH) {
ShiftIn_result = (ShiftIn_result << 1) + 1;
}
else {
ShiftIn_result = (ShiftIn_result << 1) + 0;
}
digitalWrite(CLK_pin, LOW);
delay(1);
}
if ((ShiftIn_result & 1 << 11) == 1 << 11) {
ShiftIn_result = (B11111000 << 8) | ShiftIn_result;
}
return ShiftIn_result;
}
//void HM55B::HM55B_Reset()
//{
//pinMode(DIO_pin, OUTPUT);
//digitalWrite(EN_pin, LOW);
//HM55B::ShiftOut(B0000, 3);
//digitalWrite(EN_pin, HIGH);
//}
void HM55B::HM55B_StartMeasurementCommand()
{
pinMode(DIO_pin, OUTPUT);
digitalWrite(EN_pin, LOW);
HM55B::ShiftOut(B1000, 3);
digitalWrite(EN_pin, HIGH);
}
int HM55B::HM55B_ReadCommand()
{
int result = 0;
pinMode(DIO_pin, OUTPUT);
digitalWrite(EN_pin, LOW);
HM55B::ShiftOut(B1100, 3);
result = ShiftIn(3);
return result;
}
int HM55B::getValue()
{
HM55B::HM55B_StartMeasurementCommand();
delay(40);
Serial.println(HM55B::HM55B_ReadCommand()); //cannot comment out
X_Data = HM55B::ShiftIn(11);
Y_Data = HM55B::ShiftIn(11);
digitalWrite(EN_pin, HIGH);
angle = 180 * (atan2(-1 * Y_Data, X_Data) / M_PI); //angle is atan (-y/x)
if (angle < 0) {
angle = ( 360 + angle );
}
else{
}
return angle;
}
Example Application:
#include <HM55B.h>
HM55B myCompass = HM55B(8 , 10, 9);
int heading;
void setup()
{
Serial.begin(9600);
Serial.println("Initialized");
}
void loop()
{
heading = myCompass.getValue();
Serial.println(heading);
delay(2000);
}
What am I doing wrong?
Thanks in advance for any help. You guys are awesome on these forums!
-Chris