Hello, I have an application that is using my HMC5883L module with HMC5883L.h library. The problem I have is that when I do this code in the setup, the serial1 not work. Use Arduino Mega 2560
bussola = HMC5883L();
bussola.SetScale(1.3);
bussola.SetMeasurementMode(Measurement_Continuous);
Full code
#include <HMC5883L.h>
#include <Wire.h> //I2C Arduino Library
#define address 0x1E //0011110b, I2C 7bit address of HMC5883
boolean bEnviarGPS;
boolean bEnviarAzimute = false;
boolean bRecebendoDados = false;
boolean bDebug = false;
boolean bEmMovimento = false;
boolean bPararZerar = false;
/* Comunicação */
boolean stringComplete = false;
String linhaSerial = "";
int iCRC = 0;
char strTemp;
HMC5883L bussola;
int i; //Variável para contagem
float graus; //Variável para armazenar o valor aferido
float precisao; //Variável parar o melhorar a precisao do valor aferido
volatile int state = LOW;
int led52 = 52;
/* Direção das portas */
int direcaoMotor01a = 46;
int direcaoMotor01b = 48;
int motor01Pulso = 50;
int direcaoMotor02a = 45;
int direcaoMotor02b = 47;
int motor02Pulso = 51;
void setup()
{
bEnviarGPS = false;
Serial.begin(4800);
Serial1.begin(4800);
linhaSerial.reserve(200);
/* Inicialização da bussóla */
Wire.begin();
// bussola = HMC5883L();
// bussola.SetScale(1.3);
// bussola.SetMeasurementMode(Measurement_Continuous);
/*
//Put the HMC5883 IC into the correct operating mode
Wire.beginTransmission(address); //open communication with HMC5883
Wire.write(0x02); //select mode register
Wire.write(0x00); //continuous measurement mode
Wire.endTransmission();
/* Fim da inicialização da bussóla */
pinMode(direcaoMotor01a, OUTPUT);
pinMode(direcaoMotor01b, OUTPUT);
pinMode(direcaoMotor02a, OUTPUT);
pinMode(direcaoMotor02b, OUTPUT);
pinMode(motor01Pulso, OUTPUT);
pinMode(motor02Pulso, OUTPUT);
delay(1000);
digitalWrite(direcaoMotor01a, HIGH );
digitalWrite(direcaoMotor01b, HIGH );
digitalWrite(direcaoMotor02a, HIGH );
digitalWrite(direcaoMotor02b, HIGH );
delay(1000);
digitalWrite(direcaoMotor01a, LOW );
digitalWrite(direcaoMotor01b, LOW );
digitalWrite(direcaoMotor02a, LOW );
digitalWrite(direcaoMotor02b, LOW );
/* Testes */
pinMode(led52, OUTPUT);
pinMode(53, OUTPUT);
digitalWrite(led52, HIGH );
digitalWrite(53, LOW );
attachInterrupt(0, blink, FALLING);
}
void loop() {
if (stringComplete) {
if (bDebug)
{
Serial.println(linhaSerial);
}
// clear the string:
linhaSerial = "";
stringComplete = false;
}
if (bEnviarAzimute){
LerAzimute();
}
digitalWrite(53, state);
}
void serialEvent1(){
/* Enviar os dados do GPS */
if (bEnviarGPS) {
strTemp = Serial1.read();
Serial.println(strTemp);
}
}
void serialEvent(){
while (Serial.available()) {
// Lendo o byte recebido
char inChar = (char)Serial.read();
// Adicioando a linha
linhaSerial += inChar;
// Calculo do CRC
if ((bRecebendoDados) && (inChar != '*'))
{
iCRC = iCRC + (int)inChar;
}
if (linhaSerial == "$GEO")
{
linhaSerial = "";
iCRC = 0;
bRecebendoDados = true;
Serial.println("Iniciou");
}
// Finalizou o envio
if (inChar == '*') {
bRecebendoDados = false;
stringComplete = true;
byte resultCRC = lowByte(iCRC);
if (resultCRC == 0x00)
Serial.println("CRC-OK");
else
Serial.println("CRC-NOK");
if (linhaSerial.indexOf("MOTOR") > 0)
{
Serial.println("Inicio motor");
Serial.println(linhaSerial);
CMDMotor(linhaSerial);
Serial.println("Fim motor");
}
if (linhaSerial.indexOf("ZERAR") > 0)
{
Serial.println("Inicio Zerar");
CMDZerar(linhaSerial);
Serial.println("Fim Zerar");
}
if (linhaSerial.indexOf("EnviarGPS") > 0)
{
Serial.println("Enviar GPS");
bEnviarGPS = true;
}
if (linhaSerial.indexOf("PararGPS") > 0)
{
Serial.println("Parar GPS");
bEnviarGPS = false;
}
if (linhaSerial.indexOf("EnviarAzimute") > 0)
{
Serial.println("Enviar Azimute");
bEnviarAzimute = true;
}
if (linhaSerial.indexOf("PararAzimute") > 0)
{
Serial.println("Parar Azimute");
bEnviarAzimute = false;
}
}
}
/*
loByte = lowByte(intValue);
strTemp = Serial.read();
dados[posicao++] = strTemp;
posicao = posicao + sizeof(strTemp) + 1;
Serial.println(posicao);
if (posicao > 15)
{
Serial.println(dados);
memset(dados, 0, 255);
posicao = 0;
}
/*
int i;
for (i = 0; i < sizeof(strTemp) - 1; i = i + 1) {
dados[posicao] = (char)strTemp[i];
posicao++;
}
*/
//Serial.println(91);
}
/* Recebe a linha e processa os dados gerando pulsos */
void CMDMotor(String linha){
bEmMovimento = true;
String dados = "";
int posicao = 0;
String motor = "";
String direcao = "";
int pulso = 0;
int i;
int portaMotor = 0;
/* Pegando os dados enviados */
for (i = 0; i < linha.length() - 1; i++){
if ((char)linha[i] == ',')
{
if (posicao == 1)
motor = dados;
if (posicao == 2)
direcao = dados;
if (posicao == 3)
pulso = dados.toInt();
posicao++;
dados = "";
}
else
dados += (char)linha[i];
}
if (motor == "motor01")
{
portaMotor = motor01Pulso;
if (direcao == "D")
{
digitalWrite(direcaoMotor01a, LOW );
digitalWrite(direcaoMotor01b, HIGH );
}
else if (direcao == "E")
{
digitalWrite(direcaoMotor01a, HIGH );
digitalWrite(direcaoMotor01b, LOW );
}
}
if (motor == "motor02")
{
portaMotor = motor02Pulso;
if (direcao == "D")
{
digitalWrite(direcaoMotor02a, LOW );
digitalWrite(direcaoMotor02b, HIGH );
}
else if (direcao == "E")
{
digitalWrite(direcaoMotor02a, HIGH );
digitalWrite(direcaoMotor02b, LOW );
}
}
if (bDebug)
{
Serial.println(motor);
Serial.println(direcao);
Serial.println(pulso);
}
boolean alto = false;
for (i = 0; i < (pulso * 2); i++){
if (alto)
{
digitalWrite (portaMotor, LOW );
alto = false;
}
else
{
digitalWrite (portaMotor, HIGH );
alto = true;
}
delay(5);
}
bEmMovimento = false;
digitalWrite(direcaoMotor01a, LOW );
digitalWrite(direcaoMotor01b, LOW );
digitalWrite(direcaoMotor02a, LOW );
digitalWrite(direcaoMotor02b, LOW );
}
void CMDZerar(String linha){
}
void LerAzimute(){
precisao = 0; //Zera a variável para uma nova leitura
for(i=0;i<100;i++) //Faz a leitura 100 e armazenar a somatória
{
//Pega os dados necessários para o cálculo da bússola digital
MagnetometerScaled scaled = bussola.ReadScaledAxis();
int MilliGauss_OnThe_XAxis = scaled.XAxis;
float heading = atan2(scaled.YAxis, scaled.XAxis);
float declinationAngle = -0.3011; //Compensação dos polos (São Paulo)
heading += declinationAngle;
//===========================================================
//Converte o valor aferido para angulo
if(heading < 0)
{
heading += 2*PI;
}
if(heading > 2*PI)
{
heading -= 2*PI;
}
graus = heading * 180/M_PI;
//===================================
precisao = precisao + graus;
delay(1);
}
graus = precisao/100;
Serial.print("$GEO#RespNorte,");
Serial.print(graus);
Serial.print("*");
/*
int x,y,z;
Wire.beginTransmission(address);
Wire.write(0x03);
Wire.endTransmission();
Wire.requestFrom(address, 6);
if(6<=Wire.available()){
x = Wire.read()<<8; //X msb
x |= Wire.read(); //X lsb
z = Wire.read()<<8; //Z msb
z |= Wire.read(); //Z lsb
y = Wire.read()<<8; //Y msb
y |= Wire.read(); //Y lsb
}
Serial.print("$GEO#RespNorte,");
//Serial.print("x: ");
Serial.print(x);
Serial.print("*");
//Serial.print(" y: ");
//Serial.print(y);
//Serial.print(" z: ");
//Serial.println(z);*/
}
void blink()
{
state = !state;
}