Ir para conteúdo
  • Cadastre-se

dúvida RPM por pulso de bobina, ESP32

Avalie este tópico:


gustavo boçon

Posts em destaque

Estou desenvolvendo um sensor de rpm e marcador de combustível para o meu carro usando esp32, este usa os pulsos negativos da bobina para fazer a medição de rpm e um medidor de tensão que mede a tensão depois de passar pela boia de combustível, porem estou tendo problemas com o código. Se alguém puder me ajudar com isso agradeço.

 

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2); // Endereço 0x27, 16 colunas, 2 linhas

const int ignitionPin = 2; // Pino de leitura do pulso da bobina de ignição
const int fuelSensorPin = A0; // Pino de leitura do sensor de combustível

volatile int rpmCount = 0;
int rpm = 0;
float fuelVoltage = 0.0;
float fuelLevel = 0.0;

unsigned long lastMillis = 0;

void setup() {
  Serial.begin(115200);
  
  attachInterrupt(digitalPinToInterrupt(ignitionPin), countRPM, FALLING);

  lcd.begin(16, 2);  // Inicializa o LCD
  lcd.init();
  lcd.backlight();
}

void loop() {
  unsigned long currentMillis = millis();

  if (currentMillis - lastMillis >= 1000) {
    rpm = rpmCount * 60 / 2; // Calcular RPM
    fuelVoltage = analogRead(fuelSensorPin) * (5.0 / 1023.0); // Converter leitura analógica para tensão
    fuelLevel = map(fuelVoltage, 0.0, 5.0, 0.0, 100.0); // Mapear tensão para porcentagem de combustível

    Serial.print("RPM: ");
    Serial.println(rpm);

    Serial.print("FUEL: ");
    Serial.print(fuelLevel);
    Serial.println("%");

    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("RPM: ");
    lcd.print(rpm);
    lcd.setCursor(0, 1);
    lcd.print("FUEL: ");
    lcd.print(fuelLevel);
    lcd.print("%");

    rpmCount = 0; // Resetar contagem de RPM
    lastMillis = currentMillis;
  }
}

void countRPM() {
  rpmCount++;
}

Editado: por gustavo boçon
Link para o comentário
Compartilhar em outros sites

  • gustavo boçon alterou o título para RPM por pulso de bobina, ESP32
  • 1 mês depois...
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);

const int ignitionPin = 2;
const int fuelSensorPin = A0;
const unsigned long updateInterval = 1000; // Atualização a cada 1000 ms (1 segundo)
const unsigned long debounceInterval = 10; // Intervalo de debounce para a contagem de RPM

volatile int rpmCount = 0;
int rpm = 0;
float fuelLevel = 0.0;

unsigned long lastMillis = 0;
unsigned long lastRPMInterrupt = 0;

void setup() {
  Serial.begin(115200);
  pinMode(ignitionPin, INPUT);
  attachInterrupt(digitalPinToInterrupt(ignitionPin), countRPM, FALLING);

  lcd.begin();
  lcd.backlight();
}

void loop() {
  unsigned long currentMillis = millis();

  if (currentMillis - lastMillis >= updateInterval) {
    calculateAndDisplay();
    lastMillis = currentMillis;
  }
}

void calculateAndDisplay() {
    rpm = rpmCount * 60 / 2; // Calcular RPM
    rpmCount = 0; // Resetar contagem de RPM

    float fuelVoltage = analogRead(fuelSensorPin) * (5.0 / 1023.0);
    fuelLevel = map(fuelVoltage, 0, 5.0, 0, 100); // Mapear tensão para porcentagem de combustível

    // Enviar para Serial
    Serial.print("RPM: ");
    Serial.println(rpm);
    Serial.print("FUEL: ");
    Serial.print(fuelLevel);
    Serial.println("%");

    // Atualizar LCD
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("RPM: ");
    lcd.print(rpm);
    lcd.setCursor(0, 1);
    lcd.print("FUEL: ");
    lcd.print(fuelLevel);
    lcd.print("%");
}

void countRPM() {
  unsigned long currentMillis = millis();
  if (currentMillis - lastRPMInterrupt > debounceInterval) {
    rpmCount++;
    lastRPMInterrupt = currentMillis;
  }
}

amigo se puder ser mais especifico vai ajudar mais 

Link para o comentário
Compartilhar em outros sites

Participe agora da conversa!

Você pode postar agora e se cadastrar mais tarde. Se você tiver uma conta, faça login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Restaurar formatação

  Apenas 75 emoticons máximos são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir apenas como um link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Você não pode colar imagens diretamente. Envie ou insira imagens do URL.

SOBRE O ELETRÔNICABR

EletrônicaBR é o melhor fórum técnico online, temos o maior e mais atualizado acervo de Esquemas, Bios e Firmwares da internet. Através de nosso sistema de créditos, usuários participativos têm acesso totalmente gratuito. Os melhores técnicos do mundo estão aqui!
Técnico sem o EletrônicaBR não é um técnico completo! Leia Mais...
×
×
  • Criar Novo...