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
Postar um comentário