Se fecho a janela Serial na IDE do Arduino o programa carregado no Arduino Beetle (Leonardo 32u4) para de funcionar ou funciona muito lentamente paracendo que aguarda algum timeout. Preciso utilizar o módulo apenas com a Serial1 e a alimentação sem estar conectado no computador e sem estar com a Serial de inteface aberta.
Sem vermos o código parece-me difícil de sabermos o que se está a passar...
Concordo.
Em todo caso, muitas vezes em que isso acontece é por causa dessa linha no programa:
while(!Serial);
Dê uma olhada se tem essa linha no seu e apague ela.
Se desabilitar o while ai mesmo é que não roda. Enquanto a tela serial da IDE está aberta o programa roda com o loop em cerca de 30Hz. Se fecho a janela serial o programa fica super lento só atualizando a cada 3 ou 4 segundos. O processador é o Leonardo Beetle (32u4) mini que a propria placa é o conector USB.
#include <LiquidCrystal_I2C.h> //para o LCD I2C
#define TX_PIN 11 // Saída do pulso trigger
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
unsigned int Data = 0;
unsigned long currentMillis = 0;
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
pinMode(TX_PIN, OUTPUT);
digitalWrite(TX_PIN, HIGH); // Inicialmente HIGH
Serial.begin(115200);
while (!Serial) ; // se não habilitar nem inicia
Serial1.begin(115200); //leonardo beetle
lcd.begin (16, 2);
delay(1000);
lcd.clear();
lcd.setBacklight(HIGH);
lcd.setCursor(0, 0); //linha 1
lcd.print("Hydratec");
lcd.setCursor(0, 1);
lcd.print("UW Sonar");
delay(700);
lcd.setCursor(0, 0); //linha 1
lcd.print("Alti Sub");
printHeader(); // imprime os dados do programa
} // setup
//////////////////////////////
void loop() {
currentMillis = millis();
//
blinkled(); // pisca o LED
// Envia pulso LOW de 2ms
digitalWrite(TX_PIN, LOW);
delay(2);//pulso trigger
digitalWrite(TX_PIN, HIGH);
unsigned long startTime = millis();
while (Serial1.available() < 4 && millis() - startTime < 200) {
// Aguarda até 4 bytes ou timeout de 200ms
}
// Leitura dos 4 bytes, se disponíveis
if (Serial1.available() >= 4) {
byte header = Serial1.read();
byte highByte = Serial1.read();
byte lowByte = Serial1.read();
byte checksum = Serial1.read();
// Verifica header e checksum
if (header == 0xFF) { //default header
byte calculated = (header + highByte + lowByte) & 0xFF; // Soma com preâmbulo e pega LSB
if (checksum == calculated) {
Data = (highByte << 8) | lowByte;
Serial.print(Data);
Serial.println("mm");
lcd.setCursor(0, 1); //linha 2
lcd.print(" ");
if (Data < 1000) {
lcd.print(" ");
}
if (Data < 100) {
lcd.print(" ");
}
if (Data < 10) {
lcd.print(" ");
}
lcd.print(Data);
lcd.print(" mm");
} else {
//Serial.println("Checksum inválido");
}
}
delay(5);//delay ajustado para 25hz
}
printLooptime();
} // loop
////////////////////////////////////////////////////////////////////////////////
void blinkled () {
int DELAY = 6;
digitalWrite(13, !digitalRead(13)); //toggle LED
delay(DELAY / 2);
digitalWrite(13, !digitalRead(13)); //toggle LED
delay(DELAY / 2);
}
//////////////////////////////////////////////////////////////////////////////
void printHeader() {
Serial.println (F("///////////////////////////////////////////////////////////"));
Serial.println (F("Software: "));
Serial.println (F("Hardware:"));
Serial.println (F("programado por ACJacques"));
Serial.println (F("Obs."));
Serial.println (F("Obs."));
Serial.println( F(__FILE__));
Serial.print (F("Compilado em "));
Serial.print (F(__DATE__ ));
Serial.println (F(" "__TIME__ ));
//Serial.print(F( "Arduino IDE version: ")); Serial.println( ARDUINO, DEC);
//Serial.println (F( "C++: " )) ;
//Serial. println ( __cplusplus ) ; // Versão C++ (201103 = ISO C++ 2011)
Serial.println (F("///////////////////////////////////////////////////////////"));
delay (1000); // tempo para exibir
}
///////////////////////////
void printLooptime() {
unsigned long period = millis() - currentMillis;
Serial.print(F("Looptime "));
Serial.print(period);
Serial.print(F("ms "));
Serial.print(1000.0 / period, 2); // para imprimir a parte fracionaria
Serial.println(F("Hz"));
}
Essa linha não bate com o comentário. No caso ela aguarda 4 bytes e 200ms. Contudo, isso não deveria sofrer influência da outra serial.
A Serial1 só é usada para receber os dados do sensor e não tem relação com o problema. O problema é que se não iniciar a janela serial da IDE (Serial comum da interface) o programa não roda. E se abrir a janela o programa parte e roda normalmente. Se fechar a janela ele fica rodando o loop ultralento em 4 segundos....quero poder usar o processador standalone .
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.