0

我在 Arduino 的串行监视器上打印整数值时遇到问题,下面的代码是与本田汽车 ECU 通信,使用sevseg.setNumber()我能够ect在 7 段上显示变量,但相同的变量在串行上显示为零宣布...

我尝试使用所有其他变量并且都显示零(就像声明的那样)..

我在这里想念什么?

#include <SoftwareSerialWithHalfDuplex.h>
#include <SevSeg.h>
SevSeg sevseg;
/*
* DLC pin 12
*/
SoftwareSerialWithHalfDuplex dlcSerial(12, 12, false, false);

void dlcInit() {
  dlcSerial.write(0x68);
  dlcSerial.write(0x6a);
  dlcSerial.write(0xf5);
  dlcSerial.write(0xaf);
  dlcSerial.write(0xbf);
  dlcSerial.write(0xb3);
  dlcSerial.write(0xb2);
  dlcSerial.write(0xc1);
  dlcSerial.write(0xdb);
  dlcSerial.write(0xb3);
  dlcSerial.write(0xe9);
  delay(300);
}

int dlcCommand(byte cmd, byte num, byte loc, byte len, byte data[]) {
  byte crc = (0xFF - (cmd + num + loc + len - 0x01)); // checksum FF - (cmd + num + loc + len - 0x01)

  unsigned long timeOut = millis() + 250; // timeout @ 250 ms
  memset(data, 0, sizeof(data));

  dlcSerial.listen();

  dlcSerial.write(cmd);  // header/cmd read memory ??
  dlcSerial.write(num);  // num of bytes to send
  dlcSerial.write(loc);  // address
  dlcSerial.write(len);  // num of bytes to read
  dlcSerial.write(crc);  // checksum
  
  int i = 0;
  while (i < (len+3) && millis() < timeOut) {
    if (dlcSerial.available()) {
      data[i] = dlcSerial.read();
      i++;
    }
  }
  
  if (data[0] != 0x00 && data[1] != (len+3)) { // or use checksum?
    return 0; // error
    Serial.println("ECU readout error !");
  }
  if (i < (len+3)) { // timeout
    return 0; // error
    Serial.println("ECU readout timeout !");
  }
  return 1; // success
  Serial.println("ECU readout success [OK]");
}

void procdlcSerial(void) {
  byte data[20];
  unsigned int rpm=0,vss=0,ect=0,iat=0,maps=0,tps=0,volt=0, imap=0;

  if (dlcCommand(0x20,0x05,0x00,0x10,data)) { // row 1
    rpm = (data[2] * 256 + data[3]) / 4;
    vss = data[4];
  }
  
  if (dlcCommand(0x20,0x05,0x10,0x10,data)) { // row2
    float f;
    f = data[2];
    f = 155.04149 - f * 3.0414878 + pow(f, 2) * 0.03952185 - pow(f, 3) * 0.00029383913 + pow(f, 4) * 0.0000010792568 - pow(f, 5) * 0.0000000015618437;
    ect = round(f);
    f = data[3];
    f = 155.04149 - f * 3.0414878 + pow(f, 2) * 0.03952185 - pow(f, 3) * 0.00029383913 + pow(f, 4) * 0.0000010792568 - pow(f, 5) * 0.0000000015618437;
    iat = round(f);
    maps = data[4];
    tps = (data[6] - 24) / 2;
    f = data[9];
    f = (f / 10.45) * 10.0; // cV
    volt = round(f);
  }
  
  // IMAP = RPM * MAP / IAT / 2
  // MAF = (IMAP/60)*(VE/100)*(Eng Disp)*(MMA)/(R)
  // Where: VE = 80% (Volumetric Efficiency), R = 8.314 J/°K/mole, MMA = 28.97 g/mole (Molecular mass of air)
  float maf = 0.0;
  imap = (rpm * maps) / (iat + 273);
  // ve = 75, ed = 1.5.95, afr = 14.7
  maf = (imap / 120) * (80 / 100) * 1.595 * 28.9644 / 8.314472;
  
// Serial Print
   Serial.print("ECT    : ");
   Serial.println(ect);
   Serial.print("data 0 : ");
   Serial.println(data[0]);
   Serial.print("data 1 : ");
   Serial.println(data[1]);

// Display ECT 7 Segment
   sevseg.setNumber(ect, 2);
   sevseg.refreshDisplay();
  
}  

void setup() {
    byte numDigits = 3;
    byte digitPins[] = {13, 9, 8};
    byte segmentPins[] = {7, 6, 5, 4, 3, 2, 1, 0};

    bool resistorsOnSegments = true; 
    bool updateWithDelaysIn = false;
    byte hardwareConfig = COMMON_ANODE; 
    sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments);
    sevseg.setBrightness(90);
    
  Serial.begin(9600);
  dlcSerial.begin(9600);
  delay(200);
  dlcInit();
}

void loop() {
  procdlcSerial();
  delay(300);
}
4

0 回答 0