Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Подключаем библиотеки
- #include <Wire.h> // Библиотека I2C
- #include <SPI.h> // Библиотека SPI
- //#include <can.h> // Библиотера CAN
- #include <mcp2515.h> //Библиотека CAN-SPI (MCP2515)
- #include <LiquidCrystal.h> // Библиотека дисплея
- #include <EEPROM.h>
- struct can_frame canMsg;
- struct can_frame canMsg1;
- MCP2515 mcp2515(10);
- const int rs = 7, en = 6, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
- LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
- //Переменные
- int tempExternal; //Внешняя температура
- int tempEngine; //Температура двигателя
- int tempOil; //Температура масла
- int autoRpm; //Обороты двигателя
- int autoSpeed; //Скорость
- int autoVoltage; //Напряжение бортсети
- int year; //Часы из CAN шины
- int month;
- int day;
- int hour;
- int minutes;
- int isEngineEnable; //Включени зажигания
- int isIlluminationEnable; //Включение подсветки
- int canIlluminationBrightness; //Яркость из КАН шины
- int canIlluminationDarkEnable; //Включения "Тёмная панель"
- int levelBrightness[16] = {5,7,10,13,19,24,30,35,60,80,120,150,190,220,240,255}; //Массив яркостей подсветки дисплея
- int rightKey;
- int rightKeyFlag = 0;
- unsigned long keyTimer = 0;
- unsigned long longKeyTime=1000;
- boolean keyActive = false;
- boolean longPressActive = false;
- int longKeyPress = 0;
- char lineDisplayOne[17];
- char lineDisplayTwo[17];
- int displayBrightness = 80;
- byte screenDisplay; //Стартовый экран
- unsigned long timingDelayPrint = 0;
- //Test
- unsigned long autoTest; //Пробег за поездку в см
- unsigned int autoTest1;
- void setup(){
- Serial.begin(115200);
- screenDisplay = EEPROM.read(0);
- if (screenDisplay > 10) screenDisplay = 0;
- //Инициализация CAN
- SPI.begin();
- mcp2515.reset();
- mcp2515.setBitrate(CAN_125KBPS);
- mcp2515.setFilterMask(MCP2515::MASK0, false, 0x0000000F); //Маска для RXF0,RXF1. 0-данные проходят, 1-смотреть фильтр
- mcp2515.setFilterMask(MCP2515::MASK1, false, 0xFFFFFFFF); //Маска для RXF2,RXF5.
- mcp2515.setFilter(MCP2515::RXF0, false, 0x006); //Пропускает ID xx6
- mcp2515.setFilter(MCP2515::RXF1, false, 0x000);
- mcp2515.setFilter(MCP2515::RXF2, false, 0x161);
- mcp2515.setFilter(MCP2515::RXF3, false, 0x221);
- mcp2515.setFilter(MCP2515::RXF4, false, 0x128);
- mcp2515.setFilter(MCP2515::RXF5, false, 0x000);
- mcp2515.setNormalMode();
- pinMode(9, OUTPUT); //Выход управления подсветкой
- //Инициализация дисплея
- lcd.begin(16, 2);
- analogWrite(9, displayBrightness);
- lcd.setCursor(4,0);
- lcd.print("Welcome");
- lcd.setCursor(2,1);
- lcd.print("to Citroen C4");
- delay (3000);
- lcd.clear();
- }
- void loop(){
- if(mcp2515.readMessage(&canMsg) == MCP2515::ERROR_OK){
- switch (canMsg.can_id){
- case 0x0F6:
- //isEngineEnable = (canMsg.data[0]&0x08); //Включение зажигания
- tempEngine = (canMsg.data[1] - 41); //Температура двигателя
- //-------------------------------------------------------------------------------------------
- if(canMsg.data[6]<=0x50){ //Температура внешняя
- tempExternal = ((canMsg.data[6]-0x50)/2);
- }
- else{
- tempExternal = ((canMsg.data[6]-0x4F)/2);
- }
- //tempExternal = (canMsg.data[6]/2 - 40); //Температура внешняя
- //-------------------------------------------------------------------------------------------
- break;
- case 0x0B6:
- autoRpm = ((canMsg.data[0]*256 + canMsg.data[1])>>3); //Обороты двигателя
- autoSpeed = ((canMsg.data[2]*256 + canMsg.data[3])/100); //Скорость авто
- break;
- case 0x161:
- tempOil = (canMsg.data[2] - 41); //Температура масла
- break;
- case 0x276:
- year = ((canMsg.data[0]&0x7F)+2000);
- month = (canMsg.data[1]&0x0F);
- day = (canMsg.data[2]&0x1F);
- hour = (canMsg.data[3]&0x1F);
- minutes = (canMsg.data[4]&0x3F);
- break;
- case 0x036:
- canIlluminationBrightness = (canMsg.data[3]&0x0F); //Яркость приборной панели 0-15
- canIlluminationDarkEnable = ((canMsg.data[3]&0x10)>>4); //Включение "Тёмная панель"
- break;
- case 0x221:
- rightKey = (canMsg.data[0]&0x01);
- break;
- case 0x0E6:
- autoVoltage = ((canMsg.data[5]+144)/2);
- //autoTest = (canMsg.data[0]*65536 + canMsg.data[1]*256 + canMsg.data[2]);
- //autoTest1 = (canMsg.data[3]*256 + canMsg.data[4]);
- break;
- case 0x128:
- isIlluminationEnable = (canMsg.data[6]&0x04);
- canMsg1.can_id = 0x128;
- canMsg1.can_dlc = 8;
- canMsg1.data[0] = (canMsg.data[0]);
- canMsg1.data[1] = (canMsg.data[1]);
- canMsg1.data[2] = (canMsg.data[2]);
- canMsg1.data[3] = (canMsg.data[3]);
- canMsg1.data[4] = (canMsg.data[4]);
- canMsg1.data[5] = (canMsg.data[5]);
- canMsg1.data[6] = (canMsg.data[6]);
- canMsg1.data[7] = (canMsg.data[7]|0x02);
- break;
- }
- }
- // <<Обработка кнопки>>
- /* if (rightKey&&!rightKeyFlag){
- rightKeyFlag=1;
- screenDisplay = ++screenDisplay % 3;
- EEPROM.write(0,screenDisplay);
- }
- if (!rightKey&&rightKeyFlag){
- rightKeyFlag=0;
- }
- */
- // <<Обработка кнопки, динное и короткое нажатие>>
- if (rightKey == 1){
- if (keyActive == false){
- keyActive = true;
- keyTimer = millis();
- }
- if ((millis() - keyTimer > longKeyTime) && (longPressActive == false)){
- longPressActive = true;
- mcp2515.sendMessage(&canMsg1); //послать в шину
- longKeyPress = longKeyPress +1;
- }
- } else {
- if (keyActive == true){
- if (longPressActive == true){
- longPressActive = false;
- } else {
- screenDisplay = ++screenDisplay % 4;
- EEPROM.write(0,screenDisplay);
- }
- keyActive = false;
- }
- }
- //<<управление подсветкой>>
- if (isIlluminationEnable&&!canIlluminationDarkEnable){
- displayBrightness = levelBrightness[canIlluminationBrightness];
- }
- else {
- displayBrightness = 10;
- }
- //Вывод на дисплей
- if (millis() - timingDelayPrint > 500){
- timingDelayPrint = millis();
- analogWrite(9, displayBrightness);
- switch (screenDisplay){
- case 0: //Первый экран. Дата время
- sprintf(lineDisplayOne,"%02d:%02d %02d-%02d-%04d", hour, minutes, day, month, year);
- lcd.setCursor(0,0);
- lcd.print(lineDisplayOne);
- sprintf(lineDisplayTwo,"%3d\xDF\C %3dkm/h", tempExternal, autoSpeed);
- lcd.setCursor(0,1);
- lcd.print(lineDisplayTwo);
- break;
- case 1: //Второй экран. Прогрев
- sprintf(lineDisplayOne,"%3d\xDF %02d:%02d %3d\xDF", tempEngine, hour, minutes, tempExternal);
- //sprintf(lineDisplayOne,"c:%3d\xDF\C e:%3d\xDF\C", tempEngine, tempExternal);
- lcd.setCursor(0,0);
- lcd.print(lineDisplayOne);
- sprintf(lineDisplayTwo,"%02d.%01dv %4drpm",autoVoltage/10, autoVoltage%10, autoRpm);
- lcd.setCursor(0,1);
- lcd.print(lineDisplayTwo);
- break;
- case 2: //Третий экран. Температуры
- sprintf(lineDisplayOne,"%3d\xDF %3d\xDF %3d\xDF", tempEngine, tempOil, tempExternal);
- lcd.setCursor(0,0);
- lcd.print(lineDisplayOne);
- sprintf(lineDisplayTwo,"%4drpm %02d.%01dv", autoRpm, autoVoltage/10, autoVoltage%10);
- lcd.setCursor(0,1);
- lcd.print(lineDisplayTwo);
- break;
- case 3: //Четвёртый экран. Тестовый
- sprintf(lineDisplayOne," %8d!", longKeyPress);
- lcd.setCursor(0,0);
- lcd.print(lineDisplayOne);
- sprintf(lineDisplayTwo," %6d!!", canMsg1.data[7]);
- lcd.setCursor(0,1);
- lcd.print(lineDisplayTwo);
- break;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement