CanTestProject/src/main.cpp

234 lines
8.1 KiB
C++

#include <Arduino.h>
#include <SPI.h>
#include "mcp_can.h"
#include <U8g2lib.h>
#include <TaskScheduler.h>
#define debug
#define CAN_CS_PIN 49
#define CAN_SPEED CAN_500KBPS
#define GLCD_CS_PIN 48
Scheduler task;
MCP_CAN CAN(CAN_CS_PIN);
U8G2_ST7920_128X64_1_8080 lcd(U8G2_R2, 5, 6, 7, 8, 9, 10, 11, 12, 4, U8X8_PIN_NONE, 3, 2);
#define Solarpanel_width 64
#define Solarpanel_height 56
static unsigned char Solarpanel_bits[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x88, 0x07, 0x00, 0x00, 0x00,
0x00, 0x00, 0x1f, 0x7c, 0x08, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x90, 0x0f,
0x08, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x70, 0x10, 0x18, 0x00, 0x00, 0x00,
0xf0, 0x18, 0x0e, 0x10, 0x1e, 0x00, 0x00, 0x00, 0x0e, 0xf0, 0x09, 0xe0,
0x21, 0x00, 0x00, 0x00, 0x02, 0x1e, 0x10, 0x78, 0x40, 0x00, 0x00, 0x00,
0x02, 0x02, 0x10, 0x4f, 0x40, 0x00, 0x00, 0x00, 0x04, 0x03, 0xf0, 0x80,
0xf0, 0x00, 0x00, 0x00, 0xe4, 0x02, 0x38, 0x80, 0x0d, 0x01, 0x00, 0x00,
0x18, 0x84, 0x47, 0x80, 0x03, 0x01, 0x00, 0x00, 0x08, 0x6c, 0x40, 0x60,
0x01, 0xf2, 0x0f, 0x00, 0x10, 0x18, 0x80, 0x18, 0x82, 0x01, 0x10, 0x00,
0x10, 0x08, 0x80, 0x07, 0x64, 0x00, 0x20, 0x00, 0x10, 0x1e, 0xc0, 0x01,
0x1c, 0x00, 0x20, 0x00, 0xe0, 0x11, 0x30, 0x01, 0x06, 0x00, 0x20, 0x00,
0x20, 0x20, 0x0c, 0x82, 0x01, 0x00, 0x20, 0x00, 0x40, 0xa0, 0x03, 0x62,
0x00, 0x00, 0x20, 0x00, 0x40, 0xc0, 0x00, 0x1c, 0x00, 0xf0, 0xff, 0x3f,
0x80, 0x70, 0x00, 0x07, 0x00, 0x10, 0x00, 0x20, 0x80, 0x8c, 0x80, 0x01,
0x00, 0x10, 0x00, 0x20, 0x80, 0x83, 0x60, 0x00, 0x00, 0x90, 0x4b, 0x2f,
0x00, 0x00, 0x1d, 0x00, 0x00, 0x50, 0x48, 0x21, 0x00, 0x00, 0x07, 0x00,
0x00, 0x50, 0x48, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x78, 0x2d,
0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x48, 0x29, 0x00, 0x00, 0x00, 0x00,
0x00, 0x50, 0x48, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x4b, 0x2f,
0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x20, 0x00, 0xe0, 0x01, 0x78,
0x00, 0x10, 0x00, 0x20, 0x00, 0x10, 0x02, 0x84, 0x00, 0x10, 0x00, 0x20,
0x00, 0x10, 0x02, 0x84, 0x00, 0xf0, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x20, 0x00, 0x00, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x20, 0x00,
0x80, 0x01, 0x00, 0x00, 0x18, 0x00, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00,
0x10, 0x00, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, 0x10, 0x00, 0x20, 0x00,
0x80, 0x00, 0x00, 0x00, 0x10, 0x00, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00,
0x10, 0x00, 0x20, 0x00, 0x80, 0x00, 0x00, 0x00, 0x10, 0x08, 0x20, 0x00,
0x80, 0x00, 0x00, 0x30, 0x10, 0x08, 0x20, 0x00, 0x80, 0x00, 0x00, 0x30,
0x10, 0x0c, 0x10, 0x00, 0x80, 0xf8, 0x03, 0xfc, 0x10, 0xfe, 0x0f, 0x00,
0x80, 0xf8, 0x03, 0xfc, 0x10, 0x0c, 0x00, 0x00, 0x80, 0x00, 0x00, 0x30,
0x10, 0x08, 0x00, 0x00, 0x80, 0x00, 0x00, 0x30, 0x10, 0x08, 0x00, 0x00,
0x80, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
0x10, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
0x80, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
0x10, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
0x00, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00 };
#define up_width 7
#define up_height 7
static unsigned char up_bits[] = {
0x00, 0x08, 0x14, 0x22, 0x41, 0x00, 0x00 };
#define down_width 7
#define down_height 7
static unsigned char down_bits[] = {
0x00, 0x41, 0x22, 0x14, 0x08, 0x00, 0x00 };
unsigned char len = 0;
unsigned char buf[8];
bool CANtimeout = false; bool CANtimeout_blink = false;
unsigned long previousMillis = 0;
unsigned long currentMillis = 0;
//char str[20];
int lcd_categeory = 0;
int lcd_screen = 0;
int lcd_zahl, lcd_comma;
int c100_charger_cell_voltage = 0;
int c101_charger_cell_current = 0;
int c102_charger_cell_power = 0;
int c103_charger_battery_voltage = 0;
int c104_charger_battery_current = 0;
int c105_charger_cell_peakpower = 0;
int c106_charger_work_today = 0;
int c107_charger_work_yesterday = 0;
int c108_charger_work_total = 0;
int c109_charger_co2 = 0;
bool c10a_charger_error = 0;
void lcd_format_int(int a){
lcd_zahl = a/10;
lcd_comma = a%10;
}
void lcd_category_0() {
lcd.setFont(u8g2_font_6x10_tr);
lcd.drawStr(2,7,"PV-Module");
lcd.drawLine(0, 8, 128, 8);
lcd.drawLine(100, 0, 100, 8);
lcd.drawXBM(106,0, down_width, down_height, down_bits);
lcd.drawXBM(116,0, up_width, up_height, up_bits);
}
void lcd_print() {
//Print LCD Variables
if (CANtimeout == true && CANtimeout_blink == true) {
lcd.firstPage();
do {
lcd.setFont(u8g2_font_10x20_tr);
lcd.drawStr(0,20,"CAN Test");
lcd.drawStr(48,35,"Project");
lcd.setFont(u8g2_font_6x10_tr);
lcd.drawStr(0,60,"CAN: NO DATA received");
CANtimeout_blink = false;
} while ( lcd.nextPage() );
}
else if (CANtimeout == true && CANtimeout_blink == false) {
//CAN Timeout - Error
lcd.firstPage();
do {
lcd.setFont(u8g2_font_10x20_tr);
lcd.drawStr(0,20,"CAN Test");
lcd.drawStr(48,35,"Project");
lcd.drawBox(0, 50, 126, 14);
lcd.setColorIndex(0);
lcd.setFont(u8g2_font_6x10_tr);
lcd.drawStr(0,60,"CAN: NO DATA received");
lcd.setColorIndex(1);
CANtimeout_blink = true;
} while ( lcd.nextPage() );
}
if (CANtimeout == false && lcd_categeory == 0 && lcd_screen == 0) {
//Solarzellen
lcd.firstPage();
do {
lcd_category_0();
lcd.drawXBM(0,9, Solarpanel_width, Solarpanel_height, Solarpanel_bits);
//lcd_format_int(wert1);
lcd.setCursor(80,18); lcd.print(lcd_zahl); lcd.print("."); lcd.print(lcd_comma); lcd.print("V");
//lcd_format_int(wert2);
lcd.setCursor(80,28); lcd.print(lcd_zahl); lcd.print("."); lcd.print(lcd_comma); lcd.print("W");
} while ( lcd.nextPage() );
}
}
Task t1(1000, TASK_FOREVER, &lcd_print);
void setup()
{
#ifdef debug
Serial.begin(115200);
Serial.println("CAN Test Project - Display Unit");
delay(1000);
Serial.println("Init MCP2515 CAN Controller...");
#endif
START_INIT:
if(CAN_OK == CAN.begin(CAN_SPEED))
{
#ifdef debug
Serial.println("Sucessfully initialized.");
#endif
}
else
{
#ifdef debug
Serial.println("Initialization failed, try again.");
#endif
delay(100);
goto START_INIT;
}
#ifdef debug
Serial.println("Init lcd...");
#endif
lcd.begin();
lcd.firstPage();
do {
lcd.setFont(u8g2_font_10x20_tr);
lcd.drawStr(0,20,"CAN Test");
lcd.drawStr(48,35,"Project");
lcd.setFont(u8g2_font_6x10_tr);
lcd.drawStr(0,52,"by Carsten Schmiemann");
lcd.drawStr(30,60,"2021, for Kaubi");
} while ( lcd.nextPage() );
delay(2000);
//lcd.clear();
#ifdef debug
Serial.println("Init threads...");
#endif
task.init();
task.addTask(t1);
t1.enable();
}
void loop()
{
task.execute();
currentMillis = millis();
//Read CAN Messages
if(CAN_MSGAVAIL == CAN.checkReceive())
{
CAN.readMsgBuf(&len, buf);
int canid = CAN.getCanId();
#ifdef debug
Serial.print("CAN packet received with ID "); Serial.println(canid);
#endif
currentMillis = millis();
previousMillis = currentMillis; //Reset Timeout Counter
CANtimeout = false; //Reset Timeout Counter
switch (canid)
{
case 1:
//wert1 = buf[0] + (buf[1] << 8);
#ifdef debug
Serial.print("Known CAN-ID: "); Serial.print(canid); Serial.print(", Value: "); //Serial.println(wert1);
#endif
break;
case 2:
//wert2 = buf[0] + (buf[1] << 8);
#ifdef debug
Serial.print("Known CAN-ID: "); Serial.print(canid); Serial.print(", Value: "); //Serial.println(wert2);
#endif
break;
}
}
if (currentMillis - previousMillis > 8000) {
CANtimeout = true;
}
}