Estou criando um código para ser um contador de giros, usando um sensor indutivo PNP 5v, o código que fiz ta abaixo(tenho pouco experiência com Arduino). A ideia é enviar na serial para a leitura do numero de voltas que ta sendo dado. Não tenho certeza se seria melhor usar interrupção, não sei se seria mais eficiente que usar a leitura no loop... gostaria de uma ajuda para entender por que não bate certo as voltas, talvez por ser rapido o giro e o arduino não consegue acompanhar... imagino que estaja sendo umas 30 a 40 voltas por segundo. Agradeço qualquer ajuda!!!!
const int pinoSensor1 = 2; //PINO DIGITAL UTILIZADO PELO SENSOR
int cont1 = 0;
int contEnv = 1;
int mudou1 = 0;
String p1;
void setup(){
pinMode(pinoSensor1, INPUT); //DEFINE O PINO COMO ENTRADA
Serial.begin(115200); // abre a porta serial a 115200bps:
}
void loop(){
if (digitalRead(pinoSensor1) == HIGH){ //SE A LEITURA DO PINO FOR IGUAL A LOW, FAZ
if (mudou1 == 0) {
cont1++;
mudou1 = 1;
if ((cont1 % 8) == 0) {
String p1 = "1:" + String(contEnv);
Serial.println(p1);
contEnv++;
}
}
}else{
if (mudou1 == 1){
mudou1 = 0;
}
}
}
Tens pull up no pino de entrada? Sem pull up é possível de apanhares mais ruído e contares de forma errada.
Não uses String.
podes alterar a lógica para ser mais simples, por exemplo.
unsigned long updateT = 0;
botAgora = digitalRead(pinoSensor1);
if ( botAgora == HIGH && botAntes ==LOW ){ //SE A LEITURA DO PINO FOR IGUAL A LOW, FAZ
cont1++;
}
botAntes = botAgora; // mantém um registo.
if (millis() - updateT > 2000) {
Serial.print("1:");
Serial.println(cont);
updateT = millis();
}
Se usares interrupção tens de garantir que o sinal é limpo... e depois ter uma rotina de interrupção muito, muito pequena... essencialmente algo assim:
Bubulindo, o que percebi é que usando o Arduino IDE o serial monitor funciona bem, mas a aplicação que fiz em Delphi ta atrasando as leituras. Vou ver o que consigo mudar aqui. Eu tenho dois arduinos, um em cada porta serial, ja para evitar perda de leitura em processamento identico. Mas to apanhando aqui... vou fazer mais uns testes e depois digo o resultado.