Advertisement
Technics66

CAN_Trip_v0.4

Jun 27th, 2018
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.78 KB | None | 0 0
  1. //Подключаем библиотеки
  2. #include <Wire.h>               // Библиотека I2C
  3. #include <SPI.h>                // Библиотека SPI
  4. //#include <can.h>                // Библиотера CAN
  5. #include <mcp2515.h>            //Библиотека CAN-SPI (MCP2515)
  6. #include <LiquidCrystal.h>      // Библиотека дисплея
  7. #include <EEPROM.h>
  8.  
  9. struct can_frame canMsg;
  10. struct can_frame canMsg1;
  11. MCP2515 mcp2515(10);
  12.  
  13. const int rs = 7, en = 6, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
  14. LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
  15. //Переменные
  16. int tempExternal;               //Внешняя температура
  17. int tempEngine;                 //Температура двигателя
  18. int tempOil;                    //Температура масла
  19. int autoRpm;                    //Обороты двигателя
  20. int autoSpeed;                  //Скорость
  21. int autoVoltage;                //Напряжение бортсети
  22. int year;                       //Часы из CAN шины
  23. int month;
  24. int day;
  25. int hour;
  26. int minutes;
  27. int isEngineEnable;              //Включени зажигания
  28. int isIlluminationEnable;        //Включение подсветки
  29. int canIlluminationBrightness;   //Яркость из КАН шины
  30. int canIlluminationDarkEnable;   //Включения "Тёмная панель"
  31. int levelBrightness[16] = {5,7,10,13,19,24,30,35,60,80,120,150,190,220,240,255}; //Массив яркостей подсветки дисплея
  32. int rightKey;
  33. int rightKeyFlag = 0;
  34. unsigned long keyTimer = 0;
  35. unsigned long longKeyTime=1000;
  36. boolean keyActive = false;
  37. boolean longPressActive = false;
  38. int longKeyPress = 0;
  39. char lineDisplayOne[17];
  40. char lineDisplayTwo[17];
  41. int displayBrightness = 80;
  42. byte screenDisplay;               //Стартовый экран
  43. unsigned long timingDelayPrint = 0;
  44. //Test
  45. unsigned long autoTest;         //Пробег за поездку в см
  46. unsigned int autoTest1;
  47.  
  48.  
  49.  
  50. void setup(){
  51.   Serial.begin(115200);
  52.   screenDisplay = EEPROM.read(0);
  53.   if (screenDisplay > 10) screenDisplay = 0;
  54.  
  55.   //Инициализация CAN
  56.   SPI.begin();
  57.   mcp2515.reset();
  58.   mcp2515.setBitrate(CAN_125KBPS);
  59.   mcp2515.setFilterMask(MCP2515::MASK0, false, 0x0000000F); //Маска для RXF0,RXF1. 0-данные проходят, 1-смотреть фильтр
  60.   mcp2515.setFilterMask(MCP2515::MASK1, false, 0xFFFFFFFF); //Маска для RXF2,RXF5.
  61.   mcp2515.setFilter(MCP2515::RXF0, false, 0x006); //Пропускает ID xx6
  62.   mcp2515.setFilter(MCP2515::RXF1, false, 0x000);
  63.   mcp2515.setFilter(MCP2515::RXF2, false, 0x161);
  64.   mcp2515.setFilter(MCP2515::RXF3, false, 0x221);
  65.   mcp2515.setFilter(MCP2515::RXF4, false, 0x128);
  66.   mcp2515.setFilter(MCP2515::RXF5, false, 0x000);
  67.   mcp2515.setNormalMode();
  68.  
  69.   pinMode(9, OUTPUT);             //Выход управления подсветкой
  70.  
  71. //Инициализация дисплея
  72.   lcd.begin(16, 2);
  73.   analogWrite(9, displayBrightness);
  74.   lcd.setCursor(4,0);
  75.   lcd.print("Welcome");
  76.   lcd.setCursor(2,1);
  77.   lcd.print("to Citroen C4");
  78.   delay (3000);
  79.   lcd.clear();
  80. }
  81.  
  82. void loop(){
  83.     if(mcp2515.readMessage(&canMsg) == MCP2515::ERROR_OK){
  84.     switch (canMsg.can_id){
  85.       case 0x0F6:
  86.         //isEngineEnable = (canMsg.data[0]&0x08);             //Включение зажигания
  87.         tempEngine = (canMsg.data[1] - 41);                         //Температура двигателя
  88. //-------------------------------------------------------------------------------------------
  89.         if(canMsg.data[6]<=0x50){                                   //Температура внешняя
  90.            tempExternal = ((canMsg.data[6]-0x50)/2);
  91.            }
  92.         else{
  93.            tempExternal = ((canMsg.data[6]-0x4F)/2);
  94.            }
  95.         //tempExternal = (canMsg.data[6]/2 - 40);                     //Температура внешняя
  96. //-------------------------------------------------------------------------------------------
  97.         break;
  98.       case 0x0B6:
  99.         autoRpm = ((canMsg.data[0]*256 + canMsg.data[1])>>3);       //Обороты двигателя
  100.         autoSpeed = ((canMsg.data[2]*256 + canMsg.data[3])/100);    //Скорость авто
  101.         break;
  102.       case 0x161:
  103.         tempOil = (canMsg.data[2] - 41);                            //Температура масла
  104.         break;
  105.       case 0x276:
  106.         year = ((canMsg.data[0]&0x7F)+2000);
  107.         month = (canMsg.data[1]&0x0F);
  108.         day = (canMsg.data[2]&0x1F);
  109.         hour = (canMsg.data[3]&0x1F);
  110.         minutes = (canMsg.data[4]&0x3F);
  111.         break;
  112.       case 0x036:
  113.         canIlluminationBrightness = (canMsg.data[3]&0x0F);          //Яркость приборной панели 0-15
  114.         canIlluminationDarkEnable = ((canMsg.data[3]&0x10)>>4);     //Включение "Тёмная панель"
  115.         break;
  116.       case 0x221:
  117.         rightKey = (canMsg.data[0]&0x01);
  118.         break;
  119.       case 0x0E6:
  120.         autoVoltage = ((canMsg.data[5]+144)/2);
  121.         //autoTest = (canMsg.data[0]*65536 + canMsg.data[1]*256 + canMsg.data[2]);
  122.         //autoTest1 = (canMsg.data[3]*256 + canMsg.data[4]);
  123.         break;
  124.       case 0x128:
  125.         isIlluminationEnable = (canMsg.data[6]&0x04);
  126.         canMsg1.can_id  = 0x128;
  127.         canMsg1.can_dlc = 8;
  128.         canMsg1.data[0] = (canMsg.data[0]);
  129.         canMsg1.data[1] = (canMsg.data[1]);
  130.         canMsg1.data[2] = (canMsg.data[2]);
  131.         canMsg1.data[3] = (canMsg.data[3]);
  132.         canMsg1.data[4] = (canMsg.data[4]);
  133.         canMsg1.data[5] = (canMsg.data[5]);
  134.         canMsg1.data[6] = (canMsg.data[6]);
  135.         canMsg1.data[7] = (canMsg.data[7]|0x02);
  136.         break;
  137.     }
  138.   }
  139. // <<Обработка кнопки>>
  140. /*  if (rightKey&&!rightKeyFlag){
  141.     rightKeyFlag=1;
  142.     screenDisplay = ++screenDisplay % 3;
  143.     EEPROM.write(0,screenDisplay);    
  144.   }
  145.   if (!rightKey&&rightKeyFlag){
  146.     rightKeyFlag=0;
  147.   }
  148. */
  149. // <<Обработка кнопки, динное и короткое нажатие>>
  150.   if (rightKey == 1){
  151.     if (keyActive == false){
  152.       keyActive = true;
  153.       keyTimer = millis();
  154.     }
  155.     if ((millis() - keyTimer > longKeyTime) && (longPressActive == false)){
  156.       longPressActive = true;
  157.       mcp2515.sendMessage(&canMsg1); //послать в шину
  158.       longKeyPress = longKeyPress +1;
  159.      
  160.     }
  161.   } else {
  162.     if (keyActive == true){
  163.       if (longPressActive == true){
  164.         longPressActive = false;
  165.       } else {
  166.         screenDisplay = ++screenDisplay % 4;
  167.         EEPROM.write(0,screenDisplay);
  168.       }
  169.       keyActive = false;
  170.     }
  171.   }
  172.  
  173. //<<управление подсветкой>>    
  174.     if (isIlluminationEnable&&!canIlluminationDarkEnable){
  175.       displayBrightness = levelBrightness[canIlluminationBrightness];
  176.       }
  177.       else {
  178.         displayBrightness = 10;
  179.         }
  180. //Вывод на дисплей    
  181.     if (millis() - timingDelayPrint > 500){
  182.       timingDelayPrint = millis();
  183.       analogWrite(9, displayBrightness);
  184.       switch (screenDisplay){
  185.         case 0: //Первый экран. Дата время
  186.           sprintf(lineDisplayOne,"%02d:%02d %02d-%02d-%04d", hour, minutes, day, month, year);
  187.           lcd.setCursor(0,0);
  188.           lcd.print(lineDisplayOne);
  189.           sprintf(lineDisplayTwo,"%3d\xDF\C    %3dkm/h", tempExternal, autoSpeed);
  190.           lcd.setCursor(0,1);
  191.           lcd.print(lineDisplayTwo);
  192.           break;
  193.         case 1: //Второй экран. Прогрев
  194.           sprintf(lineDisplayOne,"%3d\xDF %02d:%02d  %3d\xDF", tempEngine, hour, minutes, tempExternal);
  195.           //sprintf(lineDisplayOne,"c:%3d\xDF\C  e:%3d\xDF\C", tempEngine, tempExternal);
  196.           lcd.setCursor(0,0);
  197.           lcd.print(lineDisplayOne);
  198.           sprintf(lineDisplayTwo,"%02d.%01dv    %4drpm",autoVoltage/10, autoVoltage%10, autoRpm);
  199.           lcd.setCursor(0,1);
  200.           lcd.print(lineDisplayTwo);
  201.           break;
  202.         case 2: //Третий экран. Температуры
  203.           sprintf(lineDisplayOne,"%3d\xDF  %3d\xDF  %3d\xDF", tempEngine, tempOil, tempExternal);
  204.           lcd.setCursor(0,0);
  205.           lcd.print(lineDisplayOne);
  206.           sprintf(lineDisplayTwo,"%4drpm    %02d.%01dv", autoRpm, autoVoltage/10, autoVoltage%10);
  207.           lcd.setCursor(0,1);
  208.           lcd.print(lineDisplayTwo);
  209.           break;
  210.  
  211.         case 3: //Четвёртый экран. Тестовый
  212.           sprintf(lineDisplayOne,"       %8d!", longKeyPress);
  213.           lcd.setCursor(0,0);
  214.           lcd.print(lineDisplayOne);
  215.           sprintf(lineDisplayTwo,"        %6d!!", canMsg1.data[7]);
  216.           lcd.setCursor(0,1);
  217.           lcd.print(lineDisplayTwo);
  218.           break;
  219.  
  220.         }
  221.       }
  222. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement