Advertisement
Guest User

Untitled

a guest
Mar 12th, 2025
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.03 KB | Software | 0 0
  1. #include "driver/twai.h"
  2.  
  3.  
  4. #define RX_PIN        13
  5. #define TX_PIN        14
  6. #define CAN_RS        38
  7.  
  8.  
  9. #define CANPID_RPM    0x0C
  10. #define CANPID_SPEED  0x0D
  11. #define CANPID_TEMP   0x05
  12. #define CAN_REQST_ID  0x7DF
  13. #define CAN_REPLY_ID  0x7E8
  14.  
  15.  
  16. int speed = 0;
  17. int temp = 0;
  18. int RPM = 0;
  19.  
  20.  
  21. void setup() {
  22.   Serial.begin(115200);
  23.  
  24.   Serial.setTxTimeoutMs(0);   // prevent serial print delays if no usb
  25.  
  26.   pinMode(CAN_RS, OUTPUT);    // INPUT (high impedance) = slope control mode, OUTPUT = see next line
  27.   digitalWrite(CAN_RS, LOW);  // LOW = high speed mode, HIGH = low power mode (listen only)
  28.   Serial.println("RS LOW");
  29.   twai_general_config_t g_config = TWAI_GENERAL_CONFIG_DEFAULT((gpio_num_t)TX_PIN, (gpio_num_t)RX_PIN, TWAI_MODE_NORMAL);  // TWAI_MODE_NORMAL, TWAI_MODE_NO_ACK or TWAI_MODE_LISTEN_ONLY
  30.   twai_timing_config_t t_config  = TWAI_TIMING_CONFIG_500KBITS();
  31.   twai_filter_config_t f_config = {
  32.     .acceptance_code = (CAN_REPLY_ID << 21),  
  33.     .acceptance_mask = ~(0x7E8 << 21), // Only accept 0x7E8
  34.     .single_filter = true
  35.     };
  36.     // Install TWAI driver
  37.   if (twai_driver_install(&g_config, &t_config, &f_config) == ESP_OK) {
  38.     Serial.println("Driver installed");
  39.   } else {
  40.     Serial.println("Failed to install driver");
  41.     return;
  42.   }
  43.  
  44.   // Start TWAI driver
  45.   if (twai_start() == ESP_OK) {
  46.     Serial.println("Driver started");
  47.   } else {
  48.     Serial.println("Failed to start driver");
  49.     return;
  50.   }
  51.  
  52. }
  53.  
  54.  
  55. void loop() {
  56.  
  57.     can_sendrequest(CANPID_RPM);
  58.     can_receive();
  59.     can_sendrequest(CANPID_SPEED);
  60.     can_receive();
  61.     can_sendrequest(CANPID_TEMP);
  62.     can_receive();
  63.  
  64.     update(speed, temp, RPM);
  65.  
  66.     delay(200);
  67.  
  68. }
  69.  
  70. void update(int speed, int temp, int RPM) {
  71.  
  72.   Serial.print("RPM");
  73.   Serial.println(RPM);
  74.   Serial.print("temperature");
  75.   Serial.println(temp);
  76.   Serial.print("speed");
  77.   Serial.println(speed);
  78.  
  79.  
  80.  
  81. }
  82.  
  83.  
  84. void can_sendrequest (uint8_t obd2) {
  85.   twai_message_t message;
  86.   message.identifier = CAN_REQST_ID;
  87.   message.extd = 0;
  88.   message.rtr = 0;
  89.   message.data_length_code = 8;
  90.   message.data[0] = 2;
  91.   message.data[1] = 1;
  92.   message.data[2] = obd2;
  93.   message.data[3] = 0xAA;
  94.   message.data[4] = 0xAA;
  95.   message.data[5] = 0xAA;
  96.   message.data[6] = 0xAA;
  97.   message.data[7] = 0xAA;
  98.   twai_transmit(&message, pdMS_TO_TICKS(1));
  99. }
  100.  
  101.  
  102. void can_receive(void) {
  103.   twai_message_t message;
  104.   if (twai_receive(&message, pdMS_TO_TICKS(1)) == ESP_OK) {  // Wait up to 10ms for a message
  105.     if (message.identifier == CAN_REPLY_ID) { // Make sure it's the right reply
  106.       if (message.data[2] == CANPID_RPM) {
  107.         uint8_t rpmOBDH = message.data[3];
  108.         uint8_t rpmOBDL = message.data[4];
  109.         RPM = (uint16_t) ((256 * rpmOBDH) + rpmOBDL) / 4;
  110.       } else if (message.data[2] == CANPID_SPEED) {
  111.         speed = (uint16_t) message.data[3];  // Speed is a single byte
  112.       } else if (message.data[2] == CANPID_TEMP) {
  113.         temp = (uint16_t) message.data[3] - 40;  // Adjust for OBD-II temperature offset
  114.       }
  115.     }
  116.   }
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement