Advertisement
Guest User

Untitled

a guest
Mar 20th, 2025
16
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.21 KB | None | 0 0
  1. #include <Adafruit_NeoPixel.h>
  2. #include "driver/twai.h"
  3.  
  4.  
  5. #define LED_PIN 10 //Neopixel led Nasimovy's-board: 10 macchina-A0: 2
  6. #define LED_EN -1 //Neopixel led ENABLE Nasimovy's-board: -1 macchina-A0: 13
  7. Adafruit_NeoPixel pixels(1, LED_PIN, NEO_GRB + NEO_KHZ800);
  8.  
  9. #define GREEN_LED 11 //Nasimovy's-board: 11 macchina-A0: -1
  10. #define RX_PIN 13 //Nasimovy's-board: 13 macchina-A0: 4
  11. #define TX_PIN 14 //Nasimovy's-board: 14 macchina-A0: 5
  12. #define CAN_RS 38 //Nasimovy's-board: 38 macchina-A0: 21
  13.  
  14.  
  15. #define FORCE_ON 47 //Nasimovy's-board: 47 macchina-A0: -1
  16. #define SENSE_V_ANA 9 //Nasimovy's-board: 9 macchina-A0: 35
  17.  
  18. #define SECONDS_TO_STAY_ON 60 //unused for macchina-A0
  19.  
  20. #define CANPID_RPM 0x0C
  21. #define CANPID_SPEED 0x0D
  22. #define CANPID_TEMP 0x05
  23. #define CAN_REQST_ID 0x7DF
  24. #define CAN_REPLY_ID1 0x7E8
  25. #define CAN_REPLY_ID2 0x7E9
  26. #define CAN_REPLY_ID3 0x7EA
  27. #define CAN_REPLY_ID4 0x7EB
  28.  
  29.  
  30. int speed = 0;
  31. int temp = 0;
  32. int RPM = 0;
  33. int voltage = 0;
  34.  
  35.  
  36. void setup() {
  37. Serial.begin(115200);
  38. Serial.setTxTimeoutMs(0); // prevent serial print delays if no usb
  39. pinMode(FORCE_ON, OUTPUT); // OUTPUT = see next line
  40. digitalWrite(FORCE_ON, HIGH); // HIGH = keeps boards power sypply on
  41. pinMode(GREEN_LED, OUTPUT); // OUTPUT
  42. pinMode(LED_EN, OUTPUT); // OUTPUT = see next line
  43. digitalWrite(LED_EN, HIGH); // HIGH = neopixel enabled?
  44. pinMode(CAN_RS, OUTPUT); // OUTPUT = see next line
  45. digitalWrite(CAN_RS, LOW); // LOW = high speed mode, HIGH = low power mode (listen only)
  46. Serial.println("RS LOW");
  47. pixels.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)
  48. pixels.show(); // Turn OFF all pixels ASAP
  49. pixels.setBrightness(50); // Set BRIGHTNESS to about 1/5 (max = 255)
  50.  
  51. 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
  52. twai_timing_config_t t_config = TWAI_TIMING_CONFIG_500KBITS();
  53. twai_filter_config_t f_config = TWAI_FILTER_CONFIG_ACCEPT_ALL();
  54. // Install TWAI driver
  55. if (twai_driver_install(&g_config, &t_config, &f_config) == ESP_OK) {
  56. Serial.println("Driver installed");
  57. } else {
  58. Serial.println("Failed to install driver");
  59. return;
  60. }
  61.  
  62. // Start TWAI driver
  63. if (twai_start() == ESP_OK) {
  64. Serial.println("Driver started");
  65. } else {
  66. Serial.println("Failed to start driver");
  67. return;
  68. }
  69. update(0, 0, 0, 0); // Initial values
  70.  
  71. }
  72.  
  73.  
  74. void loop() {
  75.  
  76. shutdowncounter();
  77. digitalWrite(GREEN_LED, analogRead(SENSE_V_ANA)>3200);
  78.  
  79. can_sendrequest(CANPID_RPM);
  80. can_receive();
  81. can_sendrequest(CANPID_SPEED);
  82. can_receive();
  83. can_sendrequest(CANPID_TEMP);
  84. can_receive();
  85.  
  86. voltage = analogRead(SENSE_V_ANA);
  87.  
  88. update(speed, temp, RPM, voltage);
  89.  
  90. delay(20);
  91.  
  92. }
  93.  
  94. void update(int speed, int temp, int RPM, int voltage) {
  95. Serial.print("speed: ");
  96. Serial.println(speed);
  97. Serial.print("temperature: ");
  98. Serial.println(temp);
  99. Serial.print("RPM: ");
  100. Serial.println(RPM);
  101. Serial.print("voltage: ");
  102. Serial.println(voltage);
  103.  
  104. }
  105.  
  106. void shutdowncounter(void) {
  107. static unsigned long timestamp;
  108. static bool countdown = false;
  109. unsigned long now = millis();
  110.  
  111. if( analogRead(SENSE_V_ANA)<3200 ) {
  112. if ( countdown == false ) {
  113. countdown = true;
  114. timestamp = now;
  115. pixels.setPixelColor(0, pixels.Color(150, 0, 0));
  116. pixels.show();
  117. }
  118. }
  119. else {
  120. countdown = false;
  121. pixels.setPixelColor(0, pixels.Color(0, 0, 150));
  122. pixels.show();
  123. }
  124. if ( countdown && now - timestamp >= SECONDS_TO_STAY_ON * 1000 ) {
  125. digitalWrite(FORCE_ON, LOW);
  126. pixels.setPixelColor(0, pixels.Color(150, 0, 150));
  127. pixels.show();
  128. }
  129. }
  130.  
  131. void can_sendrequest (uint8_t obd2) {
  132. twai_message_t message;
  133. message.identifier = CAN_REQST_ID;
  134. message.extd = 0;
  135. message.rtr = 0;
  136. message.data_length_code = 8;
  137. message.data[0] = 2;
  138. message.data[1] = 1;
  139. message.data[2] = obd2;
  140. message.data[3] = 0xAA;
  141. message.data[4] = 0xAA;
  142. message.data[5] = 0xAA;
  143. message.data[6] = 0xAA;
  144. message.data[7] = 0xAA;
  145. twai_transmit(&message, pdMS_TO_TICKS(1));
  146. }
  147.  
  148.  
  149. void can_receive(void) {
  150. twai_message_t message;
  151. if (twai_receive(&message, pdMS_TO_TICKS(10)) == ESP_OK) { // Wait up to 10ms for a message
  152. if (message.identifier == CAN_REPLY_ID1||message.identifier == CAN_REPLY_ID2
  153. ||message.identifier == CAN_REPLY_ID3||message.identifier == CAN_REPLY_ID4) { // Make sure it's the right reply
  154. if (message.data[2] == CANPID_RPM) {
  155. uint8_t rpmOBDH = message.data[3];
  156. uint8_t rpmOBDL = message.data[4];
  157. RPM = (uint16_t) ((256 * rpmOBDH) + rpmOBDL) / 4;
  158. } else if (message.data[2] == CANPID_SPEED) {
  159. speed = (uint16_t) message.data[3]; // Speed is a single byte
  160. } else if (message.data[2] == CANPID_TEMP) {
  161. temp = (uint16_t) message.data[3] - 40; // Adjust for OBD-II temperature offset
  162. }
  163. }
  164. }
  165. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement