LusoRobótica - Robótica em Português
Sistemas específicos => Arduino / AVR => Tópico iniciado por: Asilva em 07 de Dezembro de 2013, 18:41
-
estou a tentar ajustar o codigo da livraria waveRP no meu projecto e estou a ter um problema.
Na livraria tem este codigo:
void pauseResume(void) {
if (!Serial.available()) return;
uint8_t c = Serial.read();
while (Serial.read() >= 0) {}
if (c == 's') {
wave.stop();
} else if (c == 'p') {
wave.pause();
while (wave.isPaused()) {
PgmPrintln("\nPaused - type 's' to stop 'r' to resume");
while (!Serial.available()) {}
c = Serial.read();
if (c == 's') wave.stop();
if (c == 'r') wave.resume();
}
}
}
Só me interessa utilizar o "wave.stop()", e, como estou a utilizar botões que fazem leituras numa porta analógica, pensei que este codigo seria o suficiente:
void stopFile(void)
{
if ((wave.isPlaying()||wave.isRecording())&& analogRead(botaoMenu)>1000)
{
wave.stop();
}
}
Sendo que botaoMenu é a porta analógica.
Já tentei outras muitas coisas mas sem sucesso.
Este codigo é utilizado no seguinte contexto:
void recordManualControl(void) {
PgmPrintln("Recording - type 's' to stop 'p' to pause");
uint8_t nl = 0;
while (wave.isRecording()) {
#if DISPLAY_RECORD_LEVEL > 0
wave.adcClearRange();
delay(500);
#if DISPLAY_RECORD_LEVEL > 1
Serial.print(wave.adcGetMax(), DEC);
Serial.print(',');
Serial.println(wave.adcGetMin(), DEC);
#else // #if DISPLAY_RECORD_LEVEL > 1
Serial.print(wave.adcGetRange(), DEC);
if (++nl % 8) {
Serial.print(' ');
} else {
Serial.println();
}
#endif // DISPLAY_RECORD_LEVEL > 1
#endif // DISPLAY_RECORD_LEVEL > 0
// check for pause/stop
pauseResume();
}
}
E com o código que eu tento adaptar, começa a gravar mas logo no inicio os valores lidos pelo micro são apenas zeros.
-
Bem assim de repente a função que mostras parece estar bem... Mas não vejo é estares a chamá-la em lado nenhum no resto do código...
Já agora outra coisa que está um bocado mal explicada no Arduino é que as portas "Analog" podes usar normalmente como portas digitais, que é +- o que estas a fazer com:
analogRead(botaoMenu)>1000
As portas A0, A5 podes inicializar normalmente com pinMode e digitalRead etc etc... usando os pinos 14 a 19.
-
o código é imenso e só coloquei o essencial.
botaoMenu está defenido assim: "#define botaoMenu A1"
na porta A1 tenho um divisor de tensão com 5 botões que me permite fazer 5 leituras nessa porta.
penso que o problema está no facto de:
if (!Serial.available()) return;
uint8_t c = Serial.read();
while (Serial.read() >= 0) {}
fazer uma temporização, enquanto que:
if ((wave.isPlaying()||wave.isRecording())&& analogRead(botaoMenu)>1000)
não fazer a mesma temporização.
O problema não é a diferença no nome da função ou a sua aplicação(pois ai sei como fazer), o problema é o conteudo da mesma.
É possivel na minha função fazer a mesma temporização, com uma entrada analógica existe algo do genero |analog.available|.
depois á algo que me está a fazer confusão, se diz:
while (Serial.read() >= 0) {}
if (c == 's') {
wave.stop();
}
então se quando Serial.read() >=0 não faz nada, como é que se c=="s" faz qualquer coisa
eu sei que eu é que não estou a perceber isto, porque com o codigo da livraria waveRP funciona bem.
-
Oh boy..
Faltam ai uns básicos sobre linguagem C/C++, e programação no geral.
Primeiro, esse código não faz "temporização" nenhuma, se realmente queres desperdiçar clocks, mete um delay na função, mas o código original não está lá a perder tempo em sitio nenhum.
if (!Serial.available()) return;
uint8_t c = Serial.read();
while (Serial.read() >= 0) {}
Este pedaço de código vê se existem dados no buffer da porta serial, se existir lê um caracter do buffer e manda o resto para o lixo basicamente, basicamente serve para ler um caracter e depois consumir os /n ou /n/r que os terminais poderam ou não enviar, mas é basicamente para o código funcionar devidamente.
uint8_t c = Serial.read();
E como podes ver, a segunda linha tem esse código, que lê um caracter do buffer serial.
A leitura de uma porta analógica pode-se considerar instantanea, não é nada se seja ultra lento para a aplicação que lhe estás a dar.