Estou fazendo um codigo para transferencia de dados entre 2 Arduinos usando a biblioteca EasyTransfer por interrupção na Serial1 do Leonardo Beetle. Está fucionando OK com codigo abaixo. Mas quero colocar o envio de dados pelo ETout.sendData para ser executado logo apos o recebimento de dados dentro da interrupção. Porém se desabilitar a função que está dentro do loop() o contador timeout não zera quando ocorre a interrupção. Consigo confirmar que a interrupção ocorre porque os dados do outro Arduino são recebidos corretamente e o print "updated" funciona. O que pode estar ocorrendo ?
#include <EasyTransfer.h>
struct RECEIVE_DATA_STRUCTURE {
// Coloque suas definições de variáveis aqui para os dados que deseja receber
// ISSO DEVE SER EXATAMENTE IGUAL NO OUTRO ARDUINO
unsigned int data1rx;
long data2rx;
};
struct SEND_DATA_STRUCTURE {
// Coloque suas definições de variáveis aqui para os dados que deseja enviar
// ISSO DEVE SER EXATAMENTE IGUAL NO OUTRO ARDUINO
float data1tx;
unsigned int data2tx;
char message[50]; // container de string
};
// Inicializar as instâncias EasyTransfer
EasyTransfer ETin, ETout;
// Dar um nome ao grupo de dados
RECEIVE_DATA_STRUCTURE rxdata;
SEND_DATA_STRUCTURE txdata;
volatile bool newDataReceived = false;
String message;
unsigned int timeout;
void setup() {
Serial.begin(115200);
Serial1.begin(115200);// comunicação externa
while (!Serial) ; // necessario se quiser imprimir desde o setup 32u4
Serial.println ("///////////////////////////////////////////////////////////");
Serial.println (F("Software: ACEasyTransferInterrupt "));
Serial.println (F("Hardware: Arduino B "));
Serial.println (F("programado por ACJacques"));
Serial.println (F("Obs."));
const char compile_date[] = __DATE__ " " __TIME__;
Serial.print (F("Compilado em "));
Serial.println (compile_date);
Serial.println( F(__FILE__));
Serial.print(F( "Arduino IDE version: ")); Serial.println( ARDUINO, DEC);
Serial.println ("///////////////////////////////////////////////////////////");
delay (3000); // tempo para exibir
ETin.begin(details(rxdata), &Serial1);
ETout.begin(details(txdata), &Serial1);
pinMode(13, OUTPUT); //LED
attachInterrupt(digitalPinToInterrupt(0), receiveInterrupt, CHANGE); // Use o pino que desejar
}
///////////////////////////////////////
void receiveInterrupt() {
if (ETin.receiveData()) {
Serial.println("updated");
timeout = 0;
//ETout.sendData();
}
}
//////////////////////////////////////
void loop() {
// Serial.print("RX1: ");
// Serial.println(rxdata.data1rx);
// Serial.print("RX2: ");
// Serial.println(rxdata.data2rx);
digitalWrite(13, !digitalRead(13));// LED BLINK
// Defina os valores das variáveis
txdata.data1tx = 123.0874;
txdata.data2tx = 556;
message = "teste"; //
strcpy(txdata.message, message.c_str()); //container para a string
Serial.println(timeout);
// Envie os dados pela porta Serial1
ETout.sendData();
// Aguarde um curto período de tempo
delay(70);
timeout++;
}