Projeto HUD Heltec - HudCarroHeltecTacometroV4

 /* Marelli GTS - Amparo

* Wilson R. Bueno - 03/07/25
* Base: https://www.circuitschools.com/diy-tachometer-using-arduino-esp8266-esp32-to-measure-accurate-rpm-with-ir-sensor/
* V0 - Projeto HUD Veículo Tacômetro - Ok
* V0.1 / 0.2 - progressivo * V0.3 - termopar e RTC * V0.4 - sem termopar - NOK - falha DUMP processador
* V0.5 - retirar termopar - NOK E (1897) i2c.master: I2C hardware NACK detected
* V0.6 - Progressivo - Ok * V1.0 - reinclusão termopar - Ok * V3.0 - inclusão display externo Led branco - base: HUD_T_U_Display_Led_AtMegaTacoV3 - Ok
* V3.1 - progressivo com cartão uSD - NOK * V3.2 - Retirada uSD e inclusão RTC - Ok * V3.3 - retirada do RTC porque achei que não vai ser útil e inclusão do sensor de rotação / velocidade - Ok
* V3.4 - inclusão display correndo - Ok, mas tempo de leitura do tacômetro de 5s
* V4.0 - Troca display por maior
*/

#include <Adafruit_SSD1306.h>
#include <Adafruit_AHT10.h>  // biblioteca sensor umidade e temperatura
#include <max6675.h>

// Define MAX6675 SPI Pins
int thermoSCK = 2;
int thermoCS = 13;
int thermoSO = 12;
MAX6675 thermocouple(thermoSCK, thermoCS, thermoSO);

int i = 0;  // progressivo para o display

//Display LED 64 x 32
#define OLED_RESET 16
//Adafruit_SSD1306 display(OLED_RESET);
Adafruit_SSD1306 display(128,64,&Wire,OLED_RESET);
//#define SCREEN_WIDTH 128 // OLED display width, in pixels
//#define SCREEN_HEIGHT 64 // OLED display height, in pixels
//Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

//Constantes tacômetro
volatile int cnt = 0;
#define hallPin 17
#define maxCnt 100

void count() {
  cnt++;
}  //tacômetro

#if (SSD1306_LCDHEIGHT != 32)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

//AHT10 card umidity and temperature
Adafruit_AHT10 aht;

//=====================================================================
void setup() {
  //Led de funcionamento
  pinMode(25, OUTPUT);
  //digitalWrite(25, HIGH);

  //Inicialização contagem tacômetro
  pinMode(hallPin, INPUT);
  attachInterrupt(digitalPinToInterrupt(hallPin), count, FALLING);

  Serial.begin(115200);

  if (!aht.begin()) {
    Serial.println(F("Could not find AHT10? Check wiring"));
    while (1) delayMicroseconds(10);
  }
  Serial.println(F("-------------------"));
  Serial.println(F("  AHT10 Card Ok"));
  Serial.println(F("-------------------"));

  //AHT10
  sensors_event_t humidity, temp;
  aht.getEvent(&humidity, &temp);  // Populate temp and humidity objects with fresh data

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  //Inicializa OLED com endereço I2C 0x3C (para 128x64)

  //Mostra logo da Adafruit
  display.display();
  delay(2000);

 
  display.clearDisplay();
 
  //id: 0 text 7
  display.setTextSize(3);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(1, 6);
  display.print(F("MARELLI"));
  //id: 1 text 8
  display.setTextSize(2);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(4, 33);
  display.print(F("MOTORSPORT"));
  //id: 2 text 9
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(72, 53);
  display.print(F("HUD CAR"));
  //id: 3 rect 12
  display.drawRect(1, 1, 122, 62, SSD1306_WHITE);
  display.display();
 
  /*
  display.setTextSize(1);
  display.setTextColor(WHITE);
 
  display.setTextSize(2);
  display.setCursor(5, 0);
  display.print("HudCar V4");
  display.setTextSize(1);
  display.setCursor(20, 30);
  display.print("  Marelli-EE");
  display.setCursor(10, 40);
  display.print("Hud Carro Taco V4");
  display.display();
*/
//inverte a tela
  //display.invertDisplay(true);
  //delay(1000);
  //display.invertDisplay(false);
  //delay(1000);

  Serial.println(F("-------------------"));
  Serial.println("Marelli GTS Amparo");
  Serial.print(__TIME__);
  Serial.print(F(">-<"));
  Serial.println(__DATE__);
  Serial.println(F("--------------------------"));
  Serial.println(F("Projeto HUD Tacometro V4.0"));
  Serial.println(F("--------------------------"));
  Serial.print(temp.temperature, 1);
  Serial.print(F(" oC : "));
  Serial.print(humidity.relative_humidity, 1);
  Serial.println(F(" %HR  "));
  Serial.println(F("--------------------------"));

  delay(2000);

 // digitalWrite(25, LOW);



}  //end setup


// ========================================================================================================

void loop() {

  digitalWrite(25, HIGH);  // turn the LED on (HIGH is the voltage level)

  //AHT10
  sensors_event_t humidity, temp;
  aht.getEvent(&humidity, &temp);  // Populate temp and humidity objects with fresh data

  // Read temperature from MAX6675
  float tempC = thermocouple.readCelsius();

  //Tacômetro
  unsigned long start = micros();
  while (cnt < maxCnt);
  float seconds = (micros() - start) / 1000000.0;
  int rpm = cnt / seconds * 60.0;

  Serial.print(rpm);
  Serial.println(" rpm");
  cnt = 0;

  //Serial.print(",");
  Serial.print(thermocouple.readCelsius(), 1);
  Serial.print(",");
  Serial.print(temp.temperature, 1);
  Serial.print(",");
  Serial.println(humidity.relative_humidity, 1);

  display.clearDisplay();
  display.setTextSize(2);
  display.setCursor(22, 0);
  display.setTextColor(WHITE);
  display.print(thermocouple.readCelsius(), 1);
  display.setCursor(75, 0);
  display.print(F("oC"));

  display.setTextSize(1);
  display.setCursor(20, 20);
  display.print(temp.temperature, 1);
  display.setCursor(45, 20);
  display.print(F(".C"));
  display.setCursor(65, 20);
  display.print(humidity.relative_humidity, 1);
  display.setCursor(90, 20);
  display.print(F("%HR"));
 
  display.setTextSize(2);
  display.setCursor(24, 40);
  display.print(rpm);
  display.print(F(" rpm"));

  if (i < 110) {
    i = i + 5;
    display.setTextSize(1);
    display.setCursor(i, 28);
    display.print("-");
    display.display();
  } else {
    i = 0;
  }

  digitalWrite(25, LOW);  // turn the LED off by making the voltage LOW
 

}  //end loop

Comentários