I've a problem to print integer value on serial monitor of Arduino, below codes are to communicate with Honda car ECU, using sevseg.setNumber()
I'm able to display ect
variable on the 7-segment, but the same variable is showing Zero on the serial as declared ...
I tried to use all other variables and all are showing Zeros (just as declared)..
What am I missing here ??
#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("RPM : ");
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);
}