Advertisement
Guest User

Untitled

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