Hallo,
du weist der Variablen kmh den Wert 0 zu statt zu vergleichen.
Vergleiche mit == auf float 0.0 sind sowieso Mist. Entweder auf == 0 oder != 0 oder <= oder >= oder < oder > 0
Hallo,
du weist der Variablen kmh den Wert 0 zu statt zu vergleichen.
Vergleiche mit == auf float 0.0 sind sowieso Mist. Entweder auf == 0 oder != 0 oder <= oder >= oder < oder > 0
Das ist eine Zuweisung, kein Vergleich!
Das ist zwar syntaktisch möglich, tut aber nicht, was Du erwartest. Versuche stattdessen
(13 < geartranslation) && (geartranslation < 14.5)
Vermutlich bist Du von einer anderen Sprache als C++ beeinflußt.
Verzichte doch einfach auf die float Berechnung.
RPM / Speed ergibt doch eine viel schönere Ganzzahl!
Bedenke aber, dass die Drehzahl erst durch 4 geteilt werden muss, wenn das die Library noch nicht für Dich erledigt.
Und ich wüßte nicht weshalb Du mit den Nachkommastellen arbeiten "musst". Das stellt zwar das exakte Verhältnis der Primärübersetzung dar, aber Du möchtest doch nur ein Verhältnis haben.
Z.B.: 2000RPM / 20kmh = Faktor 100.
Dann prüfst Du von 90 bis 110 und hast den 1. Gang ![]()
Nach hinten raus wird es dann etwas enger.
// Copyright (c) Simon2008
// This Sketch should funkction as an OBD2-Soundgenerator and driving-data-monitor
#include <CAN.h>
// Most cars support 11-bit adddress, others (like Honda),
// require 29-bit (extended) addressing, set the next line
// to true to use extended addressing
const bool useStandardAddressing = true;
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Setup/////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
Serial.begin(9600);
Serial.println("CAN OBD-II Soundgenerator");
// start the CAN bus at 500 kbps
if (!CAN.begin(500E3)) {
Serial.println("Starting CAN failed!");
while (1);
}
// add filter to only receive the CAN bus ID's we care about
if (useStandardAddressing) {
CAN.filter(0x7e8);
} else {
CAN.filterExtended(0x18daf110);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Loop//////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop() {
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//vehicle speed/////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (useStandardAddressing) {
CAN.beginPacket(0x7df, 8);
} else {
CAN.beginExtendedPacket(0x18db33f1, 8);
}
CAN.write(0x02); // number of additional bytes
CAN.write(0x01); // show current data
CAN.write(0x0d); // vehicle speed
CAN.endPacket();
// wait for response
while (CAN.parsePacket() == 0 ||
CAN.read() < 2 || // correct length
CAN.read() != 0x41 || // correct mode
CAN.read() != 0x0d); // correct PID
float kmh = ((CAN.read()));
Serial.print("Speed = ");
Serial.println(kmh);
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//engine speed//////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (useStandardAddressing) {
CAN.beginPacket(0x7df, 8);
} else {
CAN.beginExtendedPacket(0x18db33f1, 8);
}
CAN.write(0x02); // number of additional bytes
CAN.write(0x01); // show current data
CAN.write(0x0c); // engine RPM
CAN.endPacket();
// wait for response
while (CAN.parsePacket() == 0 ||
CAN.read() < 3 || // correct length
CAN.read() != 0x41 || // correct mode
CAN.read() != 0x0c); // correct PID
float rpm = (((CAN.read())*256)/4);
Serial.print("Engine RPM = ");
Serial.println(rpm);
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Engine Load///////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (useStandardAddressing) {
CAN.beginPacket(0x7df, 8);
} else {
CAN.beginExtendedPacket(0x18db33f1, 8);
}
CAN.write(0x02); // number of additional bytes
CAN.write(0x01); // show current data
CAN.write(0x04); // engine load
CAN.endPacket();
// wait for response
while (CAN.parsePacket() == 0 ||
CAN.read() < 2 || // correct length
CAN.read() != 0x41 || // correct mode
CAN.read() != 0x04); // correct PID
float eload = ((CAN.read())/2.55);
Serial.print("Engine Load = ");
Serial.println(eload);
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//geartranslation///////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
float geartranslation = (rpm / ((kmh) / ((2.001) * 60)));
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//gear//////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//NEUTRAL
if (kmh == 0.0) {
Serial.println("Gear = N");
}
//GEAR 1
else if (((13 < (geartranslation)) && ((geartranslation) < 14.5))) {
Serial.println("Gear = 1");
}
//GEAR 2
else if (((7 < (geartranslation)) && ((geartranslation) < 8.5))) {
Serial.println("Gear = 2");
}
//GEAR 3
else if (((4.5 < (geartranslation)) && ((geartranslation) < 6))) {
Serial.println("Gear = 3");
}
//GEAR 4
else if (((3.5 < (geartranslation)) && ((geartranslation) < 4.3))) {
Serial.println("Gear = 4");
}
//GEAR 5
else if (((3 < (geartranslation)) && ((geartranslation) < 3.3))) {
Serial.println("Gear = 5");
}
//GEAR 6
else if (((2 < (geartranslation)) && ((geartranslation) < 2.8))) {
Serial.println("Gear = 6");
}
delay(500);
}
Hallo Leute,
Ich habe einige der letzten Anmerkungen umgesetzt;)
Nun ist der aktuelle Stand, dass bei der Ausgabe der Gang N für Neutral korrekt angezeigt wird, aber wenn ich in den ersten Gang gehe und fahre, dass dann kein Gang ausgegeben wird im Seriellen Monitor:/ Gehe ich aber wieder auf Neutral bei Geschwindigkeit 0kmh, dann kommt wieder korrekterweise N
Kann mir da jmd helfen?
Und übrigens, ich programmiere eher seltener in C++, bin eher bei HTML, AWL, SCL und Swift unterwegs ![]()
Mit Freundlichen Grüßen
Simon2008
Hallo,
dann bauen wir mal paar Debugausgaben ein. Am Besten gleich vor der NEUTRAL Abfrage einfügen.
Serial.print(F("rpm "); Serial.print(rpm);
Serial.print(F(" kmh "); Serial.print(kmh);
Serial.print(F(" geartranslation "); Serial.println(geartranslation);
und gibts uns mal paar Datensätze.
Also Du hast definitiv mehr Klammern, als notwendig.
Wenn ich das richtig verstanden habe, sollte das ausreichen:
float geartranslation = (rpm / (kmh / (2.001 * 60)));
Zur Definition der Variablen als float hat @TriB ja schon geschrieben.
Aber nu las ich die mal so.
Hier hast Du wieder mehr Klammern, als notwendig:
//GEAR 1
else if (((13 < (geartranslation)) && ((geartranslation) < 14.5))) {
Serial.println("Gear = 1");
Neu:
else if ((13 < geartranslation) && (geartranslation < 14.5))
Und dann mal als Kürzung ganz neu:
//NEUTRAL
if (kmh == 0.0) {
Serial.println("Gear = N");
}
else
{
Serial.print(F("Gearwert: "));
Serial.println(geartranslation)
switch (geartranslation)
{
//GEAR 1
case 13 ... 14.5:
Serial.println("Gear = 1");
break;
//GEAR 2
case 7 ... 8.5:
Serial.println("Gear = 2");
break;
//GEAR 3
case 4.5 ... 6:
Serial.println("Gear = 3");
break;
//GEAR 4
case 3.5 ... 4.3:
Serial.println("Gear = 4");
break;
//GEAR 5
case 3 ... 3.3:
Serial.println("Gear = 5");
break;
//GEAR 6
case 2 ... 2.8:
Serial.println("Gear = 6");
break;
}
}
delay(500);
}
// Copyright (c) Simon2008
// This Sketch should funkction as an OBD2-Soundgenerator and driving-data-monitor
#include <CAN.h>
// Most cars support 11-bit adddress, others (like Honda),
// require 29-bit (extended) addressing, set the next line
// to true to use extended addressing
const bool useStandardAddressing = true;
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Setup/////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
Serial.begin(9600);
Serial.println("CAN OBD-II Soundgenerator");
// start the CAN bus at 500 kbps
if (!CAN.begin(500E3)) {
Serial.println("Starting CAN failed!");
while (1);
}
// add filter to only receive the CAN bus ID's we care about
if (useStandardAddressing) {
CAN.filter(0x7e8);
} else {
CAN.filterExtended(0x18daf110);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Loop//////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop() {
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//vehicle speed/////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (useStandardAddressing) {
CAN.beginPacket(0x7df, 8);
} else {
CAN.beginExtendedPacket(0x18db33f1, 8);
}
CAN.write(0x02); // number of additional bytes
CAN.write(0x01); // show current data
CAN.write(0x0d); // vehicle speed
CAN.endPacket();
// wait for response
while (CAN.parsePacket() == 0 ||
CAN.read() < 2 || // correct length
CAN.read() != 0x41 || // correct mode
CAN.read() != 0x0d); // correct PID
float kmh = ((CAN.read()));
Serial.print("Speed = ");
Serial.println(kmh);
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//engine speed//////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (useStandardAddressing) {
CAN.beginPacket(0x7df, 8);
} else {
CAN.beginExtendedPacket(0x18db33f1, 8);
}
CAN.write(0x02); // number of additional bytes
CAN.write(0x01); // show current data
CAN.write(0x0c); // engine RPM
CAN.endPacket();
// wait for response
while (CAN.parsePacket() == 0 ||
CAN.read() < 3 || // correct length
CAN.read() != 0x41 || // correct mode
CAN.read() != 0x0c); // correct PID
float rpm = (((CAN.read())*256)/4);
Serial.print("Engine RPM = ");
Serial.println(rpm);
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Engine Load///////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (useStandardAddressing) {
CAN.beginPacket(0x7df, 8);
} else {
CAN.beginExtendedPacket(0x18db33f1, 8);
}
CAN.write(0x02); // number of additional bytes
CAN.write(0x01); // show current data
CAN.write(0x04); // engine load
CAN.endPacket();
// wait for response
while (CAN.parsePacket() == 0 ||
CAN.read() < 2 || // correct length
CAN.read() != 0x41 || // correct mode
CAN.read() != 0x04); // correct PID
float eload = ((CAN.read())/2.55);
Serial.print("Engine Load = ");
Serial.println(eload);
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//geartranslation///////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
float geartranslation = (rpm / (kmh / (2.001 * 60)));
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//gear//////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//NEUTRAL
if (kmh == 0.0) {
Serial.println("Gear = N");
}
else
{
Serial.print(F("Gearwert: "));
Serial.println(geartranslation);
switch (geartranslation)
{
//GEAR 1
case 13 ... 14.5:
Serial.println("Gear = 1");
break;
//GEAR 2
case 7 ... 8.5:
Serial.println("Gear = 2");
break;
//GEAR 3
case 4.5 ... 6:
Serial.println("Gear = 3");
break;
//GEAR 4
case 3.5 ... 4.3:
Serial.println("Gear = 4");
break;
//GEAR 5
case 3 ... 3.3:
Serial.println("Gear = 5");
break;
//GEAR 6
case 2 ... 2.8:
Serial.println("Gear = 6");
break;
}
}
delay(500);
}
Also ich habe deinen Code umgesetzt, nur leider lässt er mich das jetzt nicht anwenden, da ich beim Upload eine Fehlermeldung in Arduino IDE bekomme.
Das wird in der Konsole unten ausgegeben:
C:\Program Files (x86)\Arduino\arduino-builder -dump-prefs -logger=machine -hardware C:\Program Files (x86)\Arduino\hardware -hardware C:\Users\simon\AppData\Local\Arduino15\packages -tools C:\Program Files (x86)\Arduino\tools-builder -tools C:\Program Files (x86)\Arduino\hardware\tools\avr -tools C:\Users\simon\AppData\Local\Arduino15\packages -built-in-libraries C:\Program Files (x86)\Arduino\libraries -libraries C:\Users\Simon\Documents\Arduino\libraries -fqbn=arduino:avr:uno -vid-pid=2A03_0043 -ide-version=10813 -build-path C:\Users\simon\AppData\Local\Temp\arduino_build_731948 -warnings=none -build-cache C:\Users\simon\AppData\Local\Temp\arduino_cache_752181 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.avr-gcc.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avr-gcc-7.3.0-atmel3.6.1-arduino7.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avrdude.path=C:\Users\simon\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino17 -prefs=runtime.tools.avrdude-6.3.0-arduino17.path=C:\Users\simon\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino17 -prefs=runtime.tools.arduinoOTA.path=C:\Users\simon\AppData\Local\Arduino15\packages\arduino\tools\arduinoOTA\1.3.0 -prefs=runtime.tools.arduinoOTA-1.3.0.path=C:\Users\simon\AppData\Local\Arduino15\packages\arduino\tools\arduinoOTA\1.3.0 -verbose C:\Users\simon\Documents\Arduino\Soundgenerator_1.0_beta_1\Soundgenerator_1.0_beta_1.ino
C:\Program Files (x86)\Arduino\arduino-builder -compile -logger=machine -hardware C:\Program Files (x86)\Arduino\hardware -hardware C:\Users\simon\AppData\Local\Arduino15\packages -tools C:\Program Files (x86)\Arduino\tools-builder -tools C:\Program Files (x86)\Arduino\hardware\tools\avr -tools C:\Users\simon\AppData\Local\Arduino15\packages -built-in-libraries C:\Program Files (x86)\Arduino\libraries -libraries C:\Users\Simon\Documents\Arduino\libraries -fqbn=arduino:avr:uno -vid-pid=2A03_0043 -ide-version=10813 -build-path C:\Users\simon\AppData\Local\Temp\arduino_build_731948 -warnings=none -build-cache C:\Users\simon\AppData\Local\Temp\arduino_cache_752181 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.avr-gcc.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avr-gcc-7.3.0-atmel3.6.1-arduino7.path=C:\Program Files (x86)\Arduino\hardware\tools\avr -prefs=runtime.tools.avrdude.path=C:\Users\simon\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino17 -prefs=runtime.tools.avrdude-6.3.0-arduino17.path=C:\Users\simon\AppData\Local\Arduino15\packages\arduino\tools\avrdude\6.3.0-arduino17 -prefs=runtime.tools.arduinoOTA.path=C:\Users\simon\AppData\Local\Arduino15\packages\arduino\tools\arduinoOTA\1.3.0 -prefs=runtime.tools.arduinoOTA-1.3.0.path=C:\Users\simon\AppData\Local\Arduino15\packages\arduino\tools\arduinoOTA\1.3.0 -verbose C:\Users\simon\Documents\Arduino\Soundgenerator_1.0_beta_1\Soundgenerator_1.0_beta_1.ino
Using board 'uno' from platform in folder: C:\Program Files (x86)\Arduino\hardware\arduino\avr
Using core 'arduino' from platform in folder: C:\Program Files (x86)\Arduino\hardware\arduino\avr
Detecting libraries used...
"C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10813 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard" "C:\Users\simon\AppData\Local\Temp\arduino_build_731948\sketch\Soundgenerator_1.0_beta_1.ino.cpp" -o nul -DARDUINO_LIB_DISCOVERY_PHASE
Alternatives for CAN.h: [CAN@0.3.1]
ResolveLibrary(CAN.h)
-> candidates: [CAN@0.3.1]
"C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10813 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard" "-IC:\Users\Simon\Documents\Arduino\libraries\CAN\src" "C:\Users\simon\AppData\Local\Temp\arduino_build_731948\sketch\Soundgenerator_1.0_beta_1.ino.cpp" -o nul -DARDUINO_LIB_DISCOVERY_PHASE
Alternatives for SPI.h: [SPI@1.0]
ResolveLibrary(SPI.h)
-> candidates: [SPI@1.0]
"C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10813 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard" "-IC:\Users\Simon\Documents\Arduino\libraries\CAN\src" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SPI\src" "C:\Users\simon\AppData\Local\Temp\arduino_build_731948\sketch\Soundgenerator_1.0_beta_1.ino.cpp" -o nul -DARDUINO_LIB_DISCOVERY_PHASE
"C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10813 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard" "-IC:\Users\Simon\Documents\Arduino\libraries\CAN\src" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SPI\src" "C:\Users\Simon\Documents\Arduino\libraries\CAN\src\CANController.cpp" -o nul -DARDUINO_LIB_DISCOVERY_PHASE
"C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10813 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard" "-IC:\Users\Simon\Documents\Arduino\libraries\CAN\src" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SPI\src" "C:\Users\Simon\Documents\Arduino\libraries\CAN\src\ESP32SJA1000.cpp" -o nul -DARDUINO_LIB_DISCOVERY_PHASE
"C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10813 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard" "-IC:\Users\Simon\Documents\Arduino\libraries\CAN\src" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SPI\src" "C:\Users\Simon\Documents\Arduino\libraries\CAN\src\MCP2515.cpp" -o nul -DARDUINO_LIB_DISCOVERY_PHASE
"C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10813 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard" "-IC:\Users\Simon\Documents\Arduino\libraries\CAN\src" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SPI\src" "C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SPI\src\SPI.cpp" -o nul -DARDUINO_LIB_DISCOVERY_PHASE
Generating function prototypes...
"C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10813 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard" "-IC:\Users\Simon\Documents\Arduino\libraries\CAN\src" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SPI\src" "C:\Users\simon\AppData\Local\Temp\arduino_build_731948\sketch\Soundgenerator_1.0_beta_1.ino.cpp" -o "C:\Users\simon\AppData\Local\Temp\arduino_build_731948\preproc\ctags_target_for_gcc_minus_e.cpp" -DARDUINO_LIB_DISCOVERY_PHASE
"C:\Program Files (x86)\Arduino\tools-builder\ctags\5.8-arduino11/ctags" -u --language-force=c++ -f - --c++-kinds=svpf --fields=KSTtzns --line-directives "C:\Users\simon\AppData\Local\Temp\arduino_build_731948\preproc\ctags_target_for_gcc_minus_e.cpp"
Sketch wird kompiliert...
"C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10813 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard" "-IC:\Users\Simon\Documents\Arduino\libraries\CAN\src" "-IC:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SPI\src" "C:\Users\simon\AppData\Local\Temp\arduino_build_731948\sketch\Soundgenerator_1.0_beta_1.ino.cpp" -o "C:\Users\simon\AppData\Local\Temp\arduino_build_731948\sketch\Soundgenerator_1.0_beta_1.ino.cpp.o"
C:\Users\simon\Documents\Arduino\Soundgenerator_1.0_beta_1\Soundgenerator_1.0_beta_1.ino: In function 'void loop()':
Soundgenerator_1.0_beta_1:148:28: error: switch quantity not an integer
switch (geartranslation)
^
Soundgenerator_1.0_beta_1:151:19: error: could not convert '1.45e+1' from 'double' to ''
case 13 ... 14.5:
^~~~
Soundgenerator_1.0_beta_1:155:18: error: could not convert '8.5e+0' from 'double' to ''
case 7 ... 8.5:
^~~
Soundgenerator_1.0_beta_1:159:20: error: could not convert '4.5e+0' from 'double' to ''
case 4.5 ... 6:
^
Soundgenerator_1.0_beta_1:163:20: error: could not convert '3.5e+0' from 'double' to ''
case 3.5 ... 4.3:
^~~
Soundgenerator_1.0_beta_1:163:20: error: could not convert '4.30000019e+0' from 'double' to ''
Soundgenerator_1.0_beta_1:167:18: error: could not convert '3.29999995e+0' from 'double' to ''
case 3 ... 3.3:
^~~
Soundgenerator_1.0_beta_1:171:18: error: could not convert '2.79999995e+0' from 'double' to ''
case 2 ... 2.8:
^~~
Bibliothek CAN in Version 0.3.1 im Ordner: C:\Users\Simon\Documents\Arduino\libraries\CAN wird verwendet
Bibliothek SPI in Version 1.0 im Ordner: C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SPI wird verwendet
exit status 1
switch quantity not an integer
Kannst du oder jmd da helfen?![]()
MFG Simon2008
Ein falscher Datentyp, besser ganzzahlig:
switch (uint16_t(10 * geartranslation))
{
//GEAR 1
case 130 ... 145:
Serial.println("Gear = 1");
break;
//GEAR 2
case 70 ... 85:
Serial.println("Gear = 2");
break;
//GEAR 3
case 45 ... 60:
Serial.println("Gear = 3");
break;
//GEAR 4
case 35 ... 43:
Serial.println("Gear = 4");
break;
//GEAR 5
case 30 ... 33:
Serial.println("Gear = 5");
break;
//GEAR 6
case 20 ... 28:
Serial.println("Gear = 6");
break;
}
// Copyright (c) Simon2008
// This Sketch should funkction as an OBD2-Soundgenerator and driving-data-monitor
#include <CAN.h>
// Most cars support 11-bit adddress, others (like Honda),
// require 29-bit (extended) addressing, set the next line
// to true to use extended addressing
const bool useStandardAddressing = true;
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Setup/////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
Serial.begin(9600);
Serial.println("CAN OBD-II Soundgenerator");
// start the CAN bus at 500 kbps
if (!CAN.begin(500E3)) {
Serial.println("Starting CAN failed!");
while (1);
}
// add filter to only receive the CAN bus ID's we care about
if (useStandardAddressing) {
CAN.filter(0x7e8);
} else {
CAN.filterExtended(0x18daf110);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Loop//////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop() {
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//vehicle speed/////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (useStandardAddressing) {
CAN.beginPacket(0x7df, 8);
} else {
CAN.beginExtendedPacket(0x18db33f1, 8);
}
CAN.write(0x02); // number of additional bytes
CAN.write(0x01); // show current data
CAN.write(0x0d); // vehicle speed
CAN.endPacket();
// wait for response
while (CAN.parsePacket() == 0 ||
CAN.read() < 2 || // correct length
CAN.read() != 0x41 || // correct mode
CAN.read() != 0x0d); // correct PID
float kmh = ((CAN.read()));
Serial.print("Speed = ");
Serial.println(kmh);
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//engine speed//////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (useStandardAddressing) {
CAN.beginPacket(0x7df, 8);
} else {
CAN.beginExtendedPacket(0x18db33f1, 8);
}
CAN.write(0x02); // number of additional bytes
CAN.write(0x01); // show current data
CAN.write(0x0c); // engine RPM
CAN.endPacket();
// wait for response
while (CAN.parsePacket() == 0 ||
CAN.read() < 3 || // correct length
CAN.read() != 0x41 || // correct mode
CAN.read() != 0x0c); // correct PID
float rpm = (((CAN.read())*256)/4);
Serial.print("Engine RPM = ");
Serial.println(rpm);
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Engine Load///////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (useStandardAddressing) {
CAN.beginPacket(0x7df, 8);
} else {
CAN.beginExtendedPacket(0x18db33f1, 8);
}
CAN.write(0x02); // number of additional bytes
CAN.write(0x01); // show current data
CAN.write(0x04); // engine load
CAN.endPacket();
// wait for response
while (CAN.parsePacket() == 0 ||
CAN.read() < 2 || // correct length
CAN.read() != 0x41 || // correct mode
CAN.read() != 0x04); // correct PID
float eload = ((CAN.read())/2.55);
Serial.print("Engine Load = ");
Serial.println(eload);
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//geartranslation///////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
float geartranslation = (rpm / ((kmh*1000) / (2.001 * 60)));
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//gear//////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//NEUTRAL
if (kmh == 0.0) {
Serial.println("Gear = N");
}
else
{
Serial.print(F("Gearwert: "));
Serial.println(geartranslation);
switch (uint16_t(10*geartranslation))
{
//GEAR 1
case 130 ... 150:
Serial.println("Gear = 1");
break;
//GEAR 2
case 70 ... 85:
Serial.println("Gear = 2");
break;
//GEAR 3
case 45 ... 60:
Serial.println("Gear = 3");
break;
//GEAR 4
case 35 ... 43:
Serial.println("Gear = 4");
break;
//GEAR 5
case 30 ... 33:
Serial.println("Gear = 5");
break;
//GEAR 6
case 20 ... 28:
Serial.println("Gear = 6");
break;
}
}
delay(500);
}
Also, im Code war noch ein kleiner Fehler meinerseits, denn bei der Formel für die Geartranslation muss die Geschwindigkeit noch mit dem Faktor 1000 multipliziert werden. Aber jetzt funktioniert alles hinsichtlich Geschwindikeit, Gang, Motordrehzahl und Motorlast:)
Jetzt ist der nächste Schritt, die Ausgabe des Motorsounds über Lautsprecher. Hat da jmd Ideen? Die Lautsprecher hab ich schon sowie den DFPlayer Mini, die SD-Karte und das Digitale Poti X9C104.
Bitte um Ideen, Ratschläge etc:)
MFG Simon2008
Mein Tipp: Verwende den Pin BUSY für die Endeerkennung anstelle der Bibliotheksfunktion, denn die hat bei mir Störgeräusche erzeugt.
Da sich das Motorgeräusch kontinuierlich ändert, benötigst Du zur Nachbildung vermutlich sehr viele MP3-Dateien.
Für eine sprechende Uhr habe ich mit Sprachausgabe auch über DACs experimentiert, allerdings mit Teensy 3.2 (mehr Speicher und schneller) und ESP32 (wegen der Zeit aus dem Internet). Da geht dann beispielsweise sam->Say(out, " 12 59 o'clock!");. Ob I2S neben Sprache auch Motorgeräusche wiedergeben kann, hat mich nicht interessiert.
Also hast du den DFPlayer Mini auch verwendet? Mit dem Teensy 4.1 hab ichs schon versucht, aber der funktioniert mit den Bibliotheken nicht von OBD2
Na klar, wer nicht? Die gesprochenen Zahlen einer Uhr sind ja auch hinsichtlich der Anzahl übersichtlich und der Klang ist deutlich. Der ESP32 hat allerdings ein eigenes Dateisystem, wenn man möchte, kann man die mp3-Dateien auch dort speichern.
Mit einem Teensy 3.2 läuft der CAN-BUS, wie im Thema UNO - Mega - Teensy mittels CAN-Bus verbinden nachzulesen. Einen 4.1 hatte ich noch nicht in der Hand.
Aber wie verbinde ich den Teensy mit meinem shield? Hab das nämlich mal probiert und der Teensy ist daraufhin durchgebrannt, wie ich die OBD2 Spannung verbunden habe auf Vin
Wie schnell wechselt der DFPlayer Mini die Tracks?
Der Teensy hat CAN-BUS eingebaut, Du brauchst nur einen Interface-Baustein wie TJA1050. Das Shield hat auch nur MCP2515 und MCÜ2551 drauf.
Du kannst auch mit dem Mega2560 auf den CAN-BUS hören und mit dem Teensy Töne erzeugen, beide mit einer Schnittstelle wie UART verbunden.
Ich möchte Dich aber nicht zu irgendwas überreden, denn wie man ein Motorgeräusch macht, weiß ich auch nicht. Alles nur Ideen, danach hattest Du gefragt ![]()
Ist fraglich ob das überhaupt funktioniert. Das "Motorgeräusch" soll sich ja mit der Drehzahl ändern. Normalerweise nimmt man da einen DSP und erzeugt den Sound direkt. Mit dem MP3 Player kann man ja die Geschwindigkeit nicht anpassen, oder doch? Wenn nein, müsste man ja z.B. für jede 20 Umdrehungen mehr eine eigene MP3 generieren und die dann je nach Drehzahl abspielen, abbrechen, nächste abspielen...
Ob die dann allerdings nahtlos abgespielt werden, ist eine andere Frage.
Gruß, Jürgen
Richtig, weshalb ich den Player auch für nicht optimal halte.
Das geht für eine Zeitansage hinreichend gut, aber nicht nahtlos.
Vom Videoschnitt weiß ich, daß der Ton gegenüber dem Bild kritischer wahrgenommen wird. Daher halte ich den Player für den nicht so guten oder gar falschen Ansatz.
// Copyright (c) Simon2008
// This Sketch should funkction as an OBD2-Soundgenerator and driving-data-monitor
/*
What´s new?
1.0 beta 1
o reading of the engine speed, vehicle speed, engine load and the gear
1.0 beta 2
o reading of the engine speed, vehicle speed, engine load and the gear
o Engine Startup Sound
1.0 beta 3
o reading of the engine speed, vehicle speed, engine load and the gear
o Engine Startup Sound
o Gear Changing Sound
1.0 beta 4
o reading of the engine speed, vehicle speed, engine load and the gear
o Engine Startup Sound
o Gear Changing Sound
o Launch-Control Sound with Engine-Load and Vehicle-Speed
1.0 beta 5
o reading of the engine speed, vehicle speed, engine load and the gear
o Engine Startup Sound
o Gear Changing Sound
o Launch-Control Sound with Engine-Load and Vehicle-Speed
o Thrust Cut-Off Sound
Coming Soon
1.0 beta 6
o reading of the engine speed, vehicle speed, engine load and the gear
o Engine Startup Sound
o Gear Changing Sound
o Launch-Control Sound with Engine-Load and Vehicle-Speed
o Thrust Cut-Off Sound
o Engine Sound with Engine-Speed and Engine-Load
*/
#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>
SoftwareSerial mySerial(11, 10); //(RX, TX);
#include <CAN.h>
// Most cars support 11-bit adddress, others (like Honda),
// require 29-bit (extended) addressing, set the next line
// to true to use extended addressing
const bool useStandardAddressing = true;
float Umfang = 2.001;
int gear=1;
int gearold=1;
int eloadold=0;
int eloadint=0;
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Setup/////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
Serial.begin(9600);
Serial.println("CAN OBD-II Soundgenerator");
// start the CAN bus at 500 kbps
if (!CAN.begin(500E3)) {
Serial.println("Starting CAN failed!");
while (1);
}
// add filter to only receive the CAN bus ID's we care about
if (useStandardAddressing) {
CAN.filter(0x7e8);
} else {
CAN.filterExtended(0x18daf110);
}
mySerial.begin(9600);
mp3_set_serial (mySerial);
delay(10);
mp3_set_volume (30);
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Startup-Sound/////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
mp3_play(1);
////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Loop//////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop() {
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//vehicle speed/////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (useStandardAddressing) {
CAN.beginPacket(0x7df, 8);
} else {
CAN.beginExtendedPacket(0x18db33f1, 8);
}
CAN.write(0x02); // number of additional bytes
CAN.write(0x01); // show current data
CAN.write(0x0d); // vehicle speed
CAN.endPacket();
// wait for response
while (CAN.parsePacket() == 0 ||
CAN.read() < 2 || // correct length
CAN.read() != 0x41 || // correct mode
CAN.read() != 0x0d); // correct PID
float kmh = ((CAN.read()));
Serial.print("Speed = ");
Serial.println(kmh);
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//engine speed//////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (useStandardAddressing) {
CAN.beginPacket(0x7df, 8);
} else {
CAN.beginExtendedPacket(0x18db33f1, 8);
}
CAN.write(0x02); // number of additional bytes
CAN.write(0x01); // show current data
CAN.write(0x0c); // engine RPM
CAN.endPacket();
// wait for response
while (CAN.parsePacket() == 0 ||
CAN.read() < 3 || // correct length
CAN.read() != 0x41 || // correct mode
CAN.read() != 0x0c); // correct PID
float rpm = (((CAN.read())*256)/4);
Serial.print("Engine RPM = ");
Serial.println(rpm);
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Engine Load///////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
int eloadold = eloadint;
if (useStandardAddressing) {
CAN.beginPacket(0x7df, 8);
} else {
CAN.beginExtendedPacket(0x18db33f1, 8);
}
CAN.write(0x02); // number of additional bytes
CAN.write(0x01); // show current data
CAN.write(0x04); // engine load
CAN.endPacket();
// wait for response
while (CAN.parsePacket() == 0 ||
CAN.read() < 2 || // correct length
CAN.read() != 0x41 || // correct mode
CAN.read() != 0x04); // correct PID
float eload = ((CAN.read())/2.55);
int eloadint = (int)eload;
Serial.print("Engine Load = ");
Serial.println(eload);
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//geartranslation///////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
float geartranslation = (rpm / ((kmh*1000) / (Umfang * 60)));
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//gear//////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
gearold=gear;
//NEUTRAL
if (kmh == 0.0) {
Serial.println("Gear = N");
}
else
{
Serial.print(F("Gearwert: "));
Serial.println(geartranslation);
switch (uint16_t(10*geartranslation))
{
//GEAR 1
case 130 ... 150:
Serial.println("Gear = 1");
gear=1;
break;
//GEAR 2
case 70 ... 85:
Serial.println("Gear = 2");
gear=2;
break;
//GEAR 3
case 45 ... 60:
Serial.println("Gear = 3");
gear=3;
break;
//GEAR 4
case 35 ... 43:
Serial.println("Gear = 4");
gear=4;
break;
//GEAR 5
case 30 ... 33:
Serial.println("Gear = 5");
gear=5;
break;
//GEAR 6
case 20 ... 28:
Serial.println("Gear = 6");
gear=6;
break;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Gear-Changing Sound///////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
if((gearold != gear) && (kmh > 10))
{
mp3_play(2);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Launch-Control Sound//////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
if((eload >= 98.0) && (kmh == 0.0))
{
mp3_play(3);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Thrust-Cut-Off Sound//////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
if((eloadold > (eloadint + 5)) && (gearold == gear))
{
mp3_play(4);
}
}
Hallo Leute,
Ich habe mich jetzt aus kostengründen für einen Versuch mit dem DFPlayer und einem Arduino Due entschieden, da ich diese schon bereits habe. Man kann ja zu einem späteren Zeitpunkt auch noch auf Teensy und DSP umsteigen:)
Jetzt habe ich den Code bereits zu einem Großteil geschrieben und wollte wissen ob es irgendwelche Anmerkungen und Verbesserungsvorschläge dafür gibt. Über ein Feedback würde ich mich freuen;)
Aktuell bei den Funktionen von beta 5 und ich werde bald den X9C104 miteinbinden für die Lautstärkeregelung.
Mit freundlichen Grüßen
Simon2008
Der Due hat Serial1, Serial2 und Serial3 in Hardware, die solltest Du nutzen.
Viele nutzlose Zeilen im Code machen ihn m. E. nicht lesbarer ![]()
Wenn Du weißt, was Du brauchst, kannst Du die Bedingungen rauswerfen.
Strg-t in der IDE macht den Code lesbarer. So sieht das falsch aus.
Wie hört sich das denn an? Sehr gut, brauchbar oder gruselig?
// Copyright (c) Simon2008
// This Sketch should funkction as an OBD2-Soundgenerator and driving-data-monitor
/*
What´s new?
1.0 beta 1
o reading of the engine speed, vehicle speed, engine load and the gear
1.0 beta 2
o reading of the engine speed, vehicle speed, engine load and the gear
o Engine Startup Sound
1.0 beta 3
o reading of the engine speed, vehicle speed, engine load and the gear
o Engine Startup Sound
o Gear Changing Sound
1.0 beta 4
o reading of the engine speed, vehicle speed, engine load and the gear
o Engine Startup Sound
o Gear Changing Sound
o Launch-Control Sound with Engine-Load and Vehicle-Speed
1.0 beta 5
o reading of the engine speed, vehicle speed, engine load and the gear
o Engine Startup Sound
o Gear Changing Sound
o Launch-Control Sound with Engine-Load and Vehicle-Speed
o Thrust Cut-Off Sound
Coming Soon
1.0 beta 6
o reading of the engine speed, vehicle speed, engine load and the gear
o Engine Startup Sound
o Gear Changing Sound
o Launch-Control Sound with Engine-Load and Vehicle-Speed
o Thrust Cut-Off Sound
o Engine Sound with Engine-Speed and Engine-Load
*/
#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>
SoftwareSerial mySerial(11, 10); //(RX, TX);
#include <CAN.h>
// Most cars support 11-bit adddress, others (like Honda),require 29-bit (extended) addressing, set the next line to true to use extended addressing
const bool useStandardAddressing = true;
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Variablen/////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
float Umfang = 2.001;
int gear = 1;
int gearold = 1;
int eloadold = 0;
int eloadint = 0;
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Setup/////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
Serial.begin(9600);
Serial.println("CAN OBD-II Soundgenerator");
if (!CAN.begin(500E3)) { // start the CAN bus at 500 kbps
Serial.println("Starting CAN failed!");
while (1);
}
// add filter to only receive the CAN bus ID's we care about
if (useStandardAddressing) { // add filter to only receive the CAN bus ID's we care about
CAN.filter(0x7e8);
} else {
CAN.filterExtended(0x18daf110);
}
mySerial.begin(9600);
mp3_set_serial (mySerial);
delay(10);
mp3_set_volume (30);
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Startup-Sound/////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
mp3_play(1);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Loop//////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop() {
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//vehicle speed/////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (useStandardAddressing) {
CAN.beginPacket(0x7df, 8);
} else {
CAN.beginExtendedPacket(0x18db33f1, 8);
}
CAN.write(0x02); // number of additional bytes
CAN.write(0x01); // show current data
CAN.write(0x0d); // vehicle speed
CAN.endPacket();
while (CAN.parsePacket() == 0 || // wait for response
CAN.read() < 2 || // correct length
CAN.read() != 0x41 || // correct mode
CAN.read() != 0x0d); // correct PID
float kmh = ((CAN.read()));
Serial.print("Speed = ");
Serial.println(kmh);
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//engine speed//////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (useStandardAddressing) {
CAN.beginPacket(0x7df, 8);
} else {
CAN.beginExtendedPacket(0x18db33f1, 8);
}
CAN.write(0x02); // number of additional bytes
CAN.write(0x01); // show current data
CAN.write(0x0c); // engine RPM
CAN.endPacket();
while (CAN.parsePacket() == 0 || // wait for response
CAN.read() < 3 || // correct length
CAN.read() != 0x41 || // correct mode
CAN.read() != 0x0c); // correct PID
float rpm = (((CAN.read()) * 256) / 4);
Serial.print("Engine RPM = ");
Serial.println(rpm);
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Engine Load///////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
int eloadold = eloadint;
if (useStandardAddressing) {
CAN.beginPacket(0x7df, 8);
} else {
CAN.beginExtendedPacket(0x18db33f1, 8);
}
CAN.write(0x02); // number of additional bytes
CAN.write(0x01); // show current data
CAN.write(0x04); // engine load
CAN.endPacket();
while (CAN.parsePacket() == 0 || // wait for response
CAN.read() < 2 || // correct length
CAN.read() != 0x41 || // correct mode
CAN.read() != 0x04); // correct PID
float eload = ((CAN.read()) / 2.55);
int eloadint = (int)eload;
Serial.print("Engine Load = ");
Serial.println(eload);
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//geartranslation///////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
float geartranslation = (rpm / ((kmh * 1000) / (Umfang * 60)));
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//gear//////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
gearold = gear;
//NEUTRAL
if (kmh == 0.0) {
Serial.println("Gear = N");
}
else
{
Serial.print(F("Gearwert: "));
Serial.println(geartranslation);
switch (uint16_t(10 * geartranslation))
{
//GEAR 1
case 130 ... 150:
Serial.println("Gear = 1");
gear = 1;
break;
//GEAR 2
case 70 ... 85:
Serial.println("Gear = 2");
gear = 2;
break;
//GEAR 3
case 45 ... 60:
Serial.println("Gear = 3");
gear = 3;
break;
//GEAR 4
case 35 ... 43:
Serial.println("Gear = 4");
gear = 4;
break;
//GEAR 5
case 30 ... 33:
Serial.println("Gear = 5");
gear = 5;
break;
//GEAR 6
case 20 ... 28:
Serial.println("Gear = 6");
gear = 6;
break;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Gear-Changing Sound///////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
if ((gearold != gear) && (kmh > 10))
{
mp3_play(2);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Launch-Control Sound//////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
if ((eload >= 98.0) && (kmh == 0.0))
{
mp3_play(3);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Thrust-Cut-Off Sound//////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////
if ((eloadold > (eloadint + 5)) && (gearold == gear))
{
mp3_play(4);
}
}
Weil du von Hardware Serial redest, wie steuer ich das genau an und ist beim Uno das nicht vorhanden? Falls doch, wie dann beim Uno? Bin gerade neugierig geworden😊
Und oben ist mein neuer Code
UNO kennt nur Serial, der Due mehr, siehe Serial.
Serial3.begin(9600);
mp3_set_serial (Serial3);