Guest User

medianav bic multiview arduino 4x4 eco temperature

a guest
Sep 30th, 2018
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Arduino 11.14 KB | None | 0 0
  1. #include <mcp_can.h>
  2. #include <SPI.h>
  3. #include "MPU6050_6Axis_MotionApps20.h"
  4. #include <EEPROM.h>
  5. #include <sav_button.h>
  6.  
  7. // время показа данных на магнитоле
  8. #define TIME_MOT 6000UL //   6 секунд отображения температуры ОЖ, можно поставить свои значения
  9. #define TIME_EXT 6000UL //   6 секунд отображения наружной температуры, можно поставить свои значения
  10. #define TIME_VOLT 6000UL //   6 секунд отображения напряжения, можно поставить свои значения
  11. #define TIME_FUEL 6000UL //   6 секунд отображения уровня топлива, можно поставить свои значения
  12. #define DELAY_DATA 10UL // задержка перед записью новых данных 10 мс
  13. #define DELAY_DATA2 2000UL //время  2 сек.,через которое в магнитолу записываются  старые данные  и время обновления показаний, чтоб не было постоянных скачков.
  14. #define DELAY_MPU 200UL //задержка при отправки данных с гироскопа
  15. #define TEMP_LIMIT 100UL // температура ОЖ, при которой выводится предупреждение в верхней строке
  16.  
  17. MPU6050 mpu;
  18. uint8_t mpuIntStatus;   // holds actual interrupt status byte from MPU
  19. uint16_t packetSize;    // expected DMP packet size (default is 42 bytes)
  20. uint16_t fifoCount;     // count of all bytes currently in FIFO
  21. uint8_t fifoBuffer[64]; // FIFO storage buffer
  22. // orientation/motion vars
  23. Quaternion q;           // [w, x, y, z]         quaternion container
  24. VectorFloat gravity;    // [x, y, z]            gravity vector
  25. float ypr[3];           // [yaw, pitch, roll]   yaw/pitch/roll container and gravity vector
  26. int pitch, roll, pitch2, roll2 =0;
  27. unsigned long timeMpu, timeData, delayData, delayData2, time2, time3   = 0;
  28. long unsigned int rxId,rxId2;
  29. unsigned int data, newData, engTemp, extTemp, batVolt, fuelLev, flag2 = 0x0;
  30. bool refreshData = false;
  31. bool refreshData2 = true; //разрешаем обновление данных
  32. byte flag, flag3;
  33. int address = 0; // Переменная для хранения адреса
  34. int address2 = 10; // Переменная для хранения адреса
  35. int address3 = 20; // Переменная для хранения адреса
  36. int corroll, corpitch;
  37.  
  38. SButton button1(9,50,2000,4000,500); // пин,время антидребезга мс, время длинного нажатия мс, время следующего длиного нажатия, время двойного клика
  39.  
  40. unsigned char len, len2 = 0;
  41. unsigned char rxBuf[8], rxBuf2[8];
  42. unsigned char stmp[8],info44[8],stmp4[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // шаблон сообщения
  43. unsigned char stmp2[8] = {0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00}; // шаблон сообщения
  44. unsigned char stmp3[8] = {0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00}; // шаблон сообщения
  45. MCP_CAN CAN1(5); // Устанавливаем CS для приёма с 1 шины на пин 5
  46. MCP_CAN CAN2(10); // Устанавливаем CS для отправки на 2 шину на пин 10
  47.  
  48. void setup(){
  49.      while (CAN_OK != CAN1.begin(CAN_500KBPS, MCP_8MHz));
  50.      while (CAN_OK != CAN2.begin(CAN_500KBPS, MCP_8MHz));
  51.      mpu.dmpInitialize();
  52.   // supply your own gyro offsets here, scaled for min sensitivity
  53.     mpu.setXGyroOffset(220);
  54.     mpu.setYGyroOffset(76);
  55.     mpu.setZGyroOffset(-85);
  56.     mpu.setZAccelOffset(1788); // 1688 factory default for my test chip
  57.     mpu.setDMPEnabled(true);
  58.       // get expected DMP packet size for later comparison
  59.     packetSize = mpu.dmpGetFIFOPacketSize();
  60.  
  61.  
  62.  
  63.     EEPROM.get(address, corroll); // считываем из памяти коррекцию roll
  64.     address += sizeof(int);
  65.     EEPROM.get(address, corpitch); // считываем из памяти коррекцию pitch
  66.     address = 0;
  67.     flag3=EEPROM.read(20);
  68.     if(flag3>1){flag3=1;}
  69.     if(flag3==1){flag=1;}
  70.     else{flag=EEPROM.read(10);}
  71.     if(flag>4){flag=1;}
  72.  
  73.     button1.begin();
  74. }
  75.  
  76. void loop(){
  77.     CAN1.readMsgBuf(&len, rxBuf); // Чтение данных: len = data length, buf = data byte(s)      
  78.         rxId = CAN1.getCanId(); //Получаем ID сообщения
  79.         if(rxId == 0x646){CAN2.sendMsgBuf(0x314, 0, 8, rxBuf); stmp4[1]=rxBuf[1]; CAN2.sendMsgBuf(0x548, 0, 8, stmp4);}// Driving ECO2
  80.         if(rxId == 0x699){CAN2.sendMsgBuf(0x31B, 0, 8, rxBuf);}// Отправляем данные климат контроля
  81.         if(rxId == 0x5DA){engTemp=rxBuf[0];}//температура двигателя
  82.         if(rxId == 0x3B7){extTemp=rxBuf[0];}//внешняя температура
  83.         if(rxId == 0x4AC){batVolt=(rxBuf[1]*0.6)+100;}//напряжение АКБ
  84.         if(rxId == 0x6FB){fuelLev=(rxBuf[3]/2.0)+40;}//уровень топлива
  85.         if(rxId == 0x699){flag2=rxBuf[2];}
  86.  
  87.      // переключение показаний в зависимости от установленных значений времени
  88.      if(flag3==1){
  89.        if(flag==1){
  90.         if(timeData + TIME_MOT <= millis()) {refreshData2 = true; flag = 2; timeData=millis();}
  91.       }
  92.        if(flag==2){
  93.         if(timeData + TIME_EXT <= millis()) {refreshData2 = true; flag = 3; timeData=millis();}
  94.       }
  95.        if(flag==3){
  96.         if(timeData + TIME_VOLT <= millis()) {refreshData2 = true; flag = 4; timeData=millis();}
  97.       }
  98.        if(flag==4){
  99.         if(timeData + TIME_FUEL <= millis()) {refreshData2 = true; flag = 1; timeData=millis();}
  100.       }
  101.     }
  102.  
  103.         if(flag==1){newData=engTemp;}
  104.         if(flag==2){newData=extTemp;}
  105.         if(flag==3){newData=batVolt;}
  106.         if(flag==4){newData=fuelLev;}
  107.  
  108.        
  109.  
  110.     // Если данные изменились , то перед посылом новых, обнуляем показания, проверяем это раз в 2 секунды, а не постоянно, ибавляемся от скачков
  111.       if (!refreshData &&(refreshData2 || delayData2+DELAY_DATA2 <= millis())){
  112.         if (refreshData2){refreshData2=false;}
  113.         delayData2=millis();
  114.         if(newData != data){
  115.           refreshData=true;//разрешаем запись новых данных
  116.           stmp[2]=0xFF;
  117.           CAN2.sendMsgBuf(0x558, 0, 8, stmp); //  сброс
  118.           delayData=millis();      
  119.          }
  120.    }
  121.       if(refreshData) { // если разрешено обновить данные
  122.           if(delayData+DELAY_DATA <= millis()) { //то ждём  10 мс, не останавливая общий цикл работы
  123.           refreshData=false;
  124.           data=newData; // пишем новые данные
  125.           stmp[2]=data;
  126.           CAN2.sendMsgBuf(0x558, 0, 8, stmp);    //отправляем данные в MediaNav.
  127.           delayData2=millis();
  128.           delayData=millis();
  129.        }  
  130.       }else{
  131.      
  132.   /*записываем старые данные, если не прописались новые, раз в 2 секунды
  133.   т.к.если в течении 4 секунд магнитола не получает хоть какие нибудь данные, получаем прочерки,
  134.   не долбим магнитолу постоянно бесполезными одинаковыми данными
  135.   */
  136.      if(delayData+DELAY_DATA2 <= millis()){CAN2.sendMsgBuf(0x558, 0, 8, stmp);delayData=millis();}
  137.     }
  138.  
  139.     if((engTemp-40)>TEMP_LIMIT){// если температура ОЖ превысила порог, то выводим сообщение, каждые 4 секунды.
  140.      if(time2+4000<= millis()){time2= millis(); stmp2[1]=(engTemp-40)*2.0; stmp2[2]=flag2; CAN2.sendMsgBuf(0x31B, 0, 8, stmp2);}
  141.   }
  142.  
  143.   // секция сброса Driving ECO2
  144.      if(time3 + 1000 < millis()){
  145.      CAN2.readMsgBuf(&len2, rxBuf2); // Чтение данных: len = data length, buf = data byte(s)      
  146.         rxId2 = CAN2.getCanId(); //Получаем ID сообщения
  147.         if(rxId2 == 0x31C && rxBuf2[2]==0x80){
  148.           CAN1.sendMsgBuf(0x433, 0, 8, rxBuf2);
  149.           time3 = millis();
  150.        }
  151.     }
  152.  
  153.          //Секция гироскопа
  154.  
  155.     mpuIntStatus = mpu.getIntStatus();
  156.     // get current FIFO count
  157.     fifoCount = mpu.getFIFOCount();
  158.  
  159.     // check for overflow (this should never happen unless our code is too inefficient)
  160.     if ((mpuIntStatus & 0x10) || fifoCount == 1024) {
  161.         // reset so we can continue cleanly
  162.         mpu.resetFIFO();
  163.         // otherwise, check for DMP data ready interrupt (this should happen frequently)
  164.     } else if (mpuIntStatus & 0x02) {
  165.         // wait for correct available data length, should be a VERY short wait
  166.         while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount();
  167.         mpu.getFIFOBytes(fifoBuffer, packetSize);
  168.         // track FIFO count here in case there is > 1 packet available
  169.         // (this lets us immediately read more without waiting for an interrupt)
  170.         fifoCount -= packetSize;
  171.             // display Euler angles in degrees
  172.         mpu.dmpGetQuaternion(&q, fifoBuffer);
  173.         mpu.dmpGetGravity(&gravity, &q);
  174.         mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
  175.       if(timeMpu+DELAY_MPU <= millis()){
  176.         timeMpu=millis();
  177.         pitch = -ypr[1] * 180/M_PI;
  178.         roll = ypr[2] * 180/M_PI;
  179.         roll2 = roll*2-corroll*2;
  180.         pitch2 = pitch*2-corpitch*2;
  181.       if(roll2>60){roll2=60;}
  182.       if(pitch2>40){pitch2=40;}
  183.       if(roll2<-60){roll2=-60;}
  184.       if(pitch2<-40){pitch2=-40;}
  185.  
  186.        info44[0]=0x78+roll2;
  187.        info44[1]=0x78+pitch2;
  188.     // отправляем pitch и roll
  189.     CAN2.sendMsgBuf(0x407, 0, 8, info44);
  190.     }
  191.    }
  192.    // секция кнопки
  193.    switch( button1.Loop() ){
  194.     case CLICK:
  195.     if(flag3==1){flag3=0;}
  196.     flag=flag+1;
  197.     if(flag>4){
  198.      flag=1;
  199.      }
  200.     stmp3[2]=flag2;
  201.     if(flag==1){stmp3[3]=0x18;}
  202.     if(flag==2){stmp3[3]=0x28;}
  203.     if(flag==3){stmp3[3]=0x38;}
  204.     if(flag==4){stmp3[3]=0x48;}
  205.     CAN2.sendMsgBuf(0x31B, 0, 8, stmp3);
  206.     refreshData2 = true;
  207.     break;
  208.  
  209.     case DOUBLE_CLICK:
  210.     if(flag3==0){flag3=1;}
  211.     stmp3[2]=flag2;
  212.     stmp3[3]=0x58;
  213.     CAN2.sendMsgBuf(0x31B, 0, 8, stmp3);
  214.     break;
  215.  
  216.     case LONG_CLICK:
  217.     stmp3[2]=flag2;
  218.     for (int i = 0; i < 113; i = i + 16){
  219.     stmp3[3]=0x18+i;
  220.     CAN2.sendMsgBuf(0x31B, 0, 8, stmp3);
  221.     delay(100);  
  222.    }
  223.     break;
  224.    
  225.     case LONG_CLICK_OFF:
  226.     EEPROM.update(20,flag3);
  227.     if(flag3==0){EEPROM.update(10,flag);}
  228.     break;
  229.    
  230.     case AUTO_CLICK:
  231.     corroll = roll;
  232.     corpitch = pitch;
  233.    EEPROM.put(address, corroll);
  234.     address += sizeof(int);
  235.    EEPROM.put(address, corpitch);
  236.    address=0;
  237.    stmp3[2]=flag2;
  238.    for (int i = 0; i < 113; i = i + 16){
  239.     stmp3[3]=0x18+i;
  240.     CAN2.sendMsgBuf(0x31B, 0, 8, stmp3);
  241.     delay(100);  
  242.    }
  243.      break;
  244.    }
  245.   }
Add Comment
Please, Sign In to add comment