// This is a basic example to call RPM only.
// Try this as index.ino
// Use Serial Monitor with 115200 baudrate set in the Arduino IDE. This should match line 41.
#include "BluetoothSerial.h" // 包含BluetoothSerial库,用于与蓝牙通信
#include "ELMduino.h" // 包含ELMduino库,用于与OBDII设备通信
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "arduino_secrets.h" // 包含arduino_secrets.h文件,存储私密信息
char PASS[] = SECRET_PASS; // Bluetooth密码
uint8_t MAC_ADDRESS[6] = SECRET_MAC_ADRESS; // Bluetooth Mac地址
// LCD屏幕初始化设置,基于Adafruit_SSD1306 128x64示例。
#define SCREEN_WIDTH 128 // OLED显示屏宽度,像素
#define SCREEN_HEIGHT 64 // OLED显示屏高度,像素
#define OLED_RESET -1 // 复位引脚(如果与Arduino复位引脚共享则为-1)
#define SCREEN_ADDRESS 0x3C // 默认是0x3D,但这个值不起作用。使用03xC可以正常工作。
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); // 初始化SSD1306 OLED显示屏对象
BluetoothSerial SerialBT;
bool connected;
#define ELM_PORT SerialBT
#define DEBUG_PORT Serial
// Initial value for RPM.
uint32_t rpm = 0;
ELM327 myELM327;
void setup() {
#if LED_BUILTIN
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
#endif
DEBUG_PORT.begin(115200); // 初始化调试串口
SerialBT.setPin(PASS); // 设置蓝牙密码
ELM_PORT.begin("ArduHUD", true); // 初始化ELM327端口
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) { // 初始化SSD1306 OLED显示屏
Serial.println(F("SSD1306 allocation failed"));
for(;;); // 不继续执行,无限循环
}
// O
display.clearDisplay(); // 清空显示屏
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.setTextSize(5);
display.println(F("350z"));
display.setTextSize(1);
display.println(F("Elmduino"));
display.println(F("By Mike England"));
display.println(F("v0.0.1"));
display.display();
delay(3000);
// LCD INITIALIZE
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
// LCD PRINT
display.println(F("Connecting to ELM327"));
display.println(F("Car must be on for"));
display.println(F("full connection."));
display.println();
display.display();
if (! ELM_PORT.connect(MAC_ADDRESS)) { // 连接到ELM327设备
DEBUG_PORT.println(F("CONNECTION FAILED: OBDII device."));
display.println(F("CONNECTION FAILED:"));
display.println(F("OBDII device."));
display.println();
display.display();
while(1);
}
if (!myELM327.begin(ELM_PORT, true, 2000)) { // 初始化ELM327
Serial.println("Failed to connect to ELM327 port 35000");
display.println(F("CONNECTION FAILED:"));
display.println(F("ELM327 port 35000"));
display.println();
display.display();
while (1);
}
Serial.println("Connected to ELM327");
display.println(F("CONNECTED to ELM327"));
display.println(F("LOADING DATA..."));
display.println();
display.display();
}
void loop() {
while (true) {
float tempRPM = myELM327.rpm(); // 读取发动机转速
if (myELM327.nb_rx_state == ELM_SUCCESS) // 如果成功读取
{
rpm = (uint32_t)tempRPM;
Serial.print("RPM: "); Serial.println(rpm); // 打印发动机转速到串口
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.println(F("RPM:"));
display.println(rpm);
display.display();
}
}
}