Migrate to git
This commit is contained in:
parent
41557548c7
commit
b299b9cc12
|
@ -0,0 +1,5 @@
|
|||
.pio
|
||||
.vscode/.browse.c_cpp.db*
|
||||
.vscode/c_cpp_properties.json
|
||||
.vscode/launch.json
|
||||
.vscode/ipch
|
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
// See http://go.microsoft.com/fwlink/?LinkId=827846
|
||||
// for the documentation about the extensions.json format
|
||||
"recommendations": [
|
||||
"platformio.platformio-ide"
|
||||
]
|
||||
}
|
|
@ -1,3 +1,4 @@
|
|||
# CanTestProject
|
||||
|
||||
CAN Bus Test Project
|
||||
CAN Controller Testprojekt mit zwei Arduino MEGA, MCP2515 Can Modulen als Ausgabe eine GLCD und eine LED Matrix.
|
||||
|
||||
|
|
|
@ -0,0 +1,39 @@
|
|||
|
||||
This directory is intended for project header files.
|
||||
|
||||
A header file is a file containing C declarations and macro definitions
|
||||
to be shared between several project source files. You request the use of a
|
||||
header file in your project source file (C, C++, etc) located in `src` folder
|
||||
by including it, with the C preprocessing directive `#include'.
|
||||
|
||||
```src/main.c
|
||||
|
||||
#include "header.h"
|
||||
|
||||
int main (void)
|
||||
{
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
Including a header file produces the same results as copying the header file
|
||||
into each source file that needs it. Such copying would be time-consuming
|
||||
and error-prone. With a header file, the related declarations appear
|
||||
in only one place. If they need to be changed, they can be changed in one
|
||||
place, and programs that include the header file will automatically use the
|
||||
new version when next recompiled. The header file eliminates the labor of
|
||||
finding and changing all the copies as well as the risk that a failure to
|
||||
find one copy will result in inconsistencies within a program.
|
||||
|
||||
In C, the usual convention is to give header files names that end with `.h'.
|
||||
It is most portable to use only letters, digits, dashes, and underscores in
|
||||
header file names, and at most one dot.
|
||||
|
||||
Read more about using header files in official GCC documentation:
|
||||
|
||||
* Include Syntax
|
||||
* Include Operation
|
||||
* Once-Only Headers
|
||||
* Computed Includes
|
||||
|
||||
https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html
|
|
@ -0,0 +1,46 @@
|
|||
|
||||
This directory is intended for project specific (private) libraries.
|
||||
PlatformIO will compile them to static libraries and link into executable file.
|
||||
|
||||
The source code of each library should be placed in a an own separate directory
|
||||
("lib/your_library_name/[here are source files]").
|
||||
|
||||
For example, see a structure of the following two libraries `Foo` and `Bar`:
|
||||
|
||||
|--lib
|
||||
| |
|
||||
| |--Bar
|
||||
| | |--docs
|
||||
| | |--examples
|
||||
| | |--src
|
||||
| | |- Bar.c
|
||||
| | |- Bar.h
|
||||
| | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html
|
||||
| |
|
||||
| |--Foo
|
||||
| | |- Foo.c
|
||||
| | |- Foo.h
|
||||
| |
|
||||
| |- README --> THIS FILE
|
||||
|
|
||||
|- platformio.ini
|
||||
|--src
|
||||
|- main.c
|
||||
|
||||
and a contents of `src/main.c`:
|
||||
```
|
||||
#include <Foo.h>
|
||||
#include <Bar.h>
|
||||
|
||||
int main (void)
|
||||
{
|
||||
...
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
PlatformIO Library Dependency Finder will find automatically dependent
|
||||
libraries scanning project source files.
|
||||
|
||||
More information about PlatformIO Library Dependency Finder
|
||||
- https://docs.platformio.org/page/librarymanager/ldf.html
|
|
@ -0,0 +1,21 @@
|
|||
; PlatformIO Project Configuration File
|
||||
;
|
||||
; Build options: build flags, source filter
|
||||
; Upload options: custom upload port, speed and extra flags
|
||||
; Library options: dependencies, extra library storages
|
||||
; Advanced options: extra scripting
|
||||
;
|
||||
; Please visit documentation for the other options and examples
|
||||
; https://docs.platformio.org/page/projectconf.html
|
||||
|
||||
[env:megaatmega2560]
|
||||
platform = atmelavr
|
||||
board = megaatmega2560
|
||||
framework = arduino
|
||||
lib_deps =
|
||||
seeed-studio/CAN_BUS_Shield@^1.20
|
||||
Wire
|
||||
SPI
|
||||
arkhipenko/TaskScheduler@^3.2.0
|
||||
olikraus/U8g2@^2.28.8
|
||||
monitor_speed = 115200
|
|
@ -0,0 +1,47 @@
|
|||
#include <Arduino.h>
|
||||
#include <U8g2lib.h>
|
||||
|
||||
#ifdef U8X8_HAVE_HW_SPI
|
||||
#include <SPI.h>
|
||||
#endif
|
||||
#ifdef U8X8_HAVE_HW_I2C
|
||||
#include <Wire.h>
|
||||
#endif
|
||||
|
||||
#define Gu8g2_CS_PIN 48
|
||||
//U8G2_ST7920_128X64_1_HW_SPI lcd (U8G2_R0, Gu8g2_CS_PIN);
|
||||
U8G2_ST7920_128X64_2_8080 lcd(U8G2_R2, 5, 6, 7, 8, 9, 10, 11, 12, 4, U8X8_PIN_NONE, 3, 2);
|
||||
|
||||
void setup(void) {
|
||||
lcd.begin();
|
||||
|
||||
}
|
||||
uint8_t m = 24;
|
||||
|
||||
int lcd_welcome_count = 0;
|
||||
int lcd_screen = 0;
|
||||
int wert1 = 137, wert2 = 28495;
|
||||
|
||||
void loop(void) {
|
||||
if (lcd_welcome_count < 3) {
|
||||
lcd.firstPage();
|
||||
do {
|
||||
lcd.setFont(u8g2_font_10x20_tr);
|
||||
lcd.drawStr(0,30,"CAN Test");
|
||||
lcd.drawStr(48,50,"Project");
|
||||
} while ( lcd.nextPage() );
|
||||
lcd_welcome_count++;
|
||||
} else if (lcd_screen == 0) {
|
||||
lcd.firstPage();
|
||||
do {
|
||||
lcd.setFont(u8g2_font_6x10_tr);
|
||||
lcd.drawStr(13,9,"CAN Test Project");
|
||||
lcd.drawLine(4, 12, 124, 12);
|
||||
char buffer[10];
|
||||
lcd.drawStr(5,23, "Wert 1: "); lcd.drawStr(48,23, itoa(wert1, buffer, 10));
|
||||
lcd.drawStr(5,34, "Wert 2: "); lcd.drawStr(48,34, itoa(wert2, buffer, 10));
|
||||
} while ( lcd.nextPage() );
|
||||
lcd_welcome_count++;
|
||||
}
|
||||
delay(1000);
|
||||
}
|
|
@ -0,0 +1,233 @@
|
|||
#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;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,63 @@
|
|||
#include <Arduino.h>
|
||||
#include "mcp_can.h"
|
||||
|
||||
#define debug
|
||||
#define CAN_CS_PIN 49
|
||||
#define CAN_SPEED CAN_500KBPS
|
||||
|
||||
unsigned char Flag_Recv = 0;
|
||||
unsigned char len = 0;
|
||||
unsigned char buf[8];
|
||||
char str[20];
|
||||
|
||||
MCP_CAN CAN(CAN_CS_PIN);
|
||||
|
||||
|
||||
void setup()
|
||||
{
|
||||
#ifdef debug
|
||||
Serial.begin(115200);
|
||||
Serial.println("CAN Test Project - Sending 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;
|
||||
}
|
||||
}
|
||||
|
||||
void SendIntCAN(int canid, int value)
|
||||
{
|
||||
byte buf[2];
|
||||
buf[0] = value & 0x00FF;
|
||||
buf[1] = (value & 0xFF00) >> 8;
|
||||
|
||||
CAN.sendMsgBuf(canid, 0, 2, buf);
|
||||
}
|
||||
|
||||
int counter = 0, counter2 = 32767;
|
||||
|
||||
void loop()
|
||||
{
|
||||
counter++;
|
||||
SendIntCAN(1,counter);
|
||||
delay(100);
|
||||
counter2--;
|
||||
SendIntCAN(2,counter2);
|
||||
delay(500);
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
|
||||
This directory is intended for PlatformIO Unit Testing and project tests.
|
||||
|
||||
Unit Testing is a software testing method by which individual units of
|
||||
source code, sets of one or more MCU program modules together with associated
|
||||
control data, usage procedures, and operating procedures, are tested to
|
||||
determine whether they are fit for use. Unit testing finds problems early
|
||||
in the development cycle.
|
||||
|
||||
More information about PlatformIO Unit Testing:
|
||||
- https://docs.platformio.org/page/plus/unit-testing.html
|
Loading…
Reference in New Issue