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>
- #include <LiquidCrystal.h> // Библиотека дисплея
- //#include <LiquidCrystal_I2C.h> // Библиотера дисплея I2C
- struct can_frame canMsg;
- 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);
- //LiquidCrystal_I2C lcd(0x27,16,2);
- //Переменные
- int tempExternal; //Внешняя температура
- int tempEngine; //Температура двигателя
- int tempOil; //Температура масла
- int autoRpm; //Обороты двигателя
- int autoSpeed; //Скорость
- int autoVoltage;
- int autoVoltageInt;
- int autoVoltageDec;
- //Часы из CAN шины
- int year;
- int month;
- int day;
- int hour;
- int minutes;
- int isIgnitionEnable;
- int canIlluminationBrightness;
- int canIlluminationEnable;
- int levelBrightness[16] = {5,7,10,13,19,24,30,35,60,80,120,150,190,220,240,255};
- int rightKey;
- int rightKeyFlag = 0;
- char lineDisplayOne[17];
- char lineDisplayTwo[17];
- int displayBrightness = 255;
- int screenDisplay = 1;
- unsigned long timingDelayPrint = 0;
- void setup(){
- Serial.begin(115200);
- //Инициализация CAN
- SPI.begin();
- mcp2515.reset();
- mcp2515.setBitrate(CAN_125KBPS);
- mcp2515.setFilterMask(MCP2515::MASK0, false, 0x0000000F); //mcp2515.setFilterMask(MCP2515::MASK0, false, 0xFFFFFFFF);
- mcp2515.setFilterMask(MCP2515::MASK1, false, 0xFFFFFFFF);
- mcp2515.setFilter(MCP2515::RXF0, false, 0x006); //mcp2515.setFilter(MCP2515::RXF0, false, 0x0F6);
- mcp2515.setFilter(MCP2515::RXF1, false, 0x000); //mcp2515.setFilter(MCP2515::RXF1, false, 0x0B6);
- mcp2515.setFilter(MCP2515::RXF2, false, 0x161);
- mcp2515.setFilter(MCP2515::RXF3, false, 0x221); //mcp2515.setFilter(MCP2515::RXF3, false, 0x276);
- mcp2515.setFilter(MCP2515::RXF4, false, 0x000); //mcp2515.setFilter(MCP2515::RXF4, false, 0x036);
- 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:
- isIgnitionEnable = (canMsg.data[0]&0x08);
- tempEngine = (canMsg.data[1] - 41);
- 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);
- canIlluminationEnable = (canMsg.data[3]&0x20>>5);
- break;
- case 0x221:
- rightKey = (canMsg.data[0]&0x01);
- break;
- case 0x0E6:
- autoVoltage = ((canMsg.data[5]+144)/2);
- break;
- }
- }
- // <<Обработка кнопки>>
- if (rightKey&&!rightKeyFlag){
- rightKeyFlag=1;
- screenDisplay = ++screenDisplay % 3;
- }
- if (!rightKey&&rightKeyFlag){
- rightKeyFlag=0;
- }
- //<<управление подсветкой>>
- if (isIgnitionEnable){
- displayBrightness = levelBrightness[canIlluminationBrightness];
- }
- else {
- displayBrightness = 0;
- }
- if (millis() - timingDelayPrint > 250){
- 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,"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,"%02d %02d.%01dv", canIlluminationBrightness, autoVoltage/10, autoVoltage%10);
- lcd.setCursor(0,1);
- lcd.print(lineDisplayTwo);
- break;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement