kleines DUE-Projekt

Hallo zusammen, ich habe mich heute hier angemeldet, lese aber schon länger mit.
Ich bin der Detlef aus NRW und geh nächsten Monat in Rente.
Programmieren gehört nicht zu den täglichen Arbeiten in meinem Leben.
Ich habe mir vorgenommen, ein Dashboard für mein Boot zu bauen.
Für die Datenaufbereitung kommt ein DUE zum Einsatz.
Die Darstellung übernimmt ein Raspi2, als Programmiersprache zunächst Gambas.
Ausgabe über einen 10" Monitor(läuft bereits).
Nun zum Due
Motordaten werden über ein CAN-shield(Eigenbau) eingelesen(NMEA2000).
Zeit und Datum kommen über eine RTC DS3231.
Temperatur und Luftdruck über BMP180
Noch zu integrieren: Fishfinder mit RS232 NMEA0183.

Da es für den DUE nicht sehr viele Infos gibt, möchte ich meinen Sketch hier
mal posten und mich über Verbesserungen freuen. Vielleicht kann ja jemand
Teile gebrauchen.

Verbesserung der Ausgabe über print sollte ausgegliedert werden, da RTC- und
Sensor-Daten nur gesendet werden, wenn CAN-Daten anstehen.

Hier nun mein Sketch

/***********************************************************************************
Arduino Due project with CAN(NMEA2000), RTC and BMP180 - NMEA0183 still to integrate
version 1.0 10.02.2018
author: Detlef Bauer dkbauer@arcor.de
************************************************************************************/
#include "variant.h"
#include <due_can.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP085_U.h>
#define DS3231_I2C_ADDRESS 0x68

Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085);
CAN_FRAME EngParRap;
CAN_FRAME EngParDyn;


String gbUhrzeit, gbWochentag, gbDatum;
byte gbTrim, gbLbMottemp, dataId;
word gbRpm, gbMottemp, gbLadespg, gbVerbr, gbLbBetrstd, gbLuftdr, gbLufttemp;
unsigned long gbBetrstd;
byte bcdToDec(byte val)
{
  return( (val/16*10) + (val%16) );
}

int cron_1 = 1;  //1 Seconds intervall for timer 1;
int cron_2 = 5; //5 Seconds intervall for timer 2;
long t1;
long t2;

void setup()
{
  EngParRap.id = 0x9f20000;
  EngParDyn.id = 0x9f20100;
  Serial.begin(115200);
  Can0.begin(CAN_BPS_250K);
  Can0.watchForRange(0x9f20000,0x9f20100);
  Can0.setCallback(0, gotFrameMB0);
   /* Initialise the sensor */
  if(!bmp.begin())
  {
    /* There was a problem detecting the BMP085 ... check your connections */
    Serial.print("Ooops, no BMP085 detected ... Check your wiring or I2C ADDR!");
    while(1);
  }
 
}

void divideFrame(CAN_FRAME *frame, int filter) {
  if (frame->id == EngParRap.id)
    {
     gbRpm=uint16_t((frame->data.byte[2]<<8) + (frame->data.byte[1]));
     gbTrim=uint8_t(frame->data.byte[5]);     
    }
  if (frame->id == EngParDyn.id)
  {
    dataId=3&(frame->data.byte[0]);
    switch(dataId){
      case 0:
        gbLbMottemp=(frame->data.byte[7]);
        break;
      case 1:
        gbMottemp=(frame->data.byte[1]<<8)+gbLbMottemp;
        gbLadespg=(frame->data.byte[2]) + (frame->data.byte[3]<<8);
        gbVerbr=(frame->data.byte[4]) + (frame->data.byte[5]<<8);
        gbLbBetrstd=(frame->data.byte[6]) + (frame->data.byte[7]<<8);
        break;
      case 2:
        gbBetrstd=(frame->data.byte[1]<<16) + gbLbBetrstd;
        break;
      default:
        break;
    }
    Serial.print("!,");
    Serial.print(gbRpm);
    Serial.print(",");
    Serial.print(gbTrim);
    Serial.print(",");
    Serial.print(gbMottemp);
    Serial.print(",");
    Serial.print(gbLadespg);
    Serial.print(",");
    Serial.print(gbVerbr);
    Serial.print(",");
    Serial.print(gbBetrstd);
    Serial.print(",");
    Serial.print(gbLuftdr);
    Serial.print(",");
    Serial.print(gbLufttemp);
    Serial.print(",");
    Serial.print(gbUhrzeit);
    Serial.print(",");
    Serial.print(gbWochentag);
    Serial.print(",");
    Serial.println(gbDatum);
  }
}

void gotFrameMB0(CAN_FRAME *frame) 
{
  divideFrame(frame, 0);
}

void loop()
{ 
  cronjob();
}

void readBMP(void)
{
  sensors_event_t event;
  bmp.getEvent(&event); 
  if (event.pressure)
  {    
    gbLuftdr=(int(event.pressure));    
    float temperature;
    bmp.getTemperature(&temperature);
    gbLufttemp=(int(temperature*10));    
  }
  else
  {
    Serial.println("Sensor error");
  }
  
}

void readDS3231time(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set DS3231 register pointer to 00h
  Wire.endTransmission();
  Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
  // request seven bytes of data from DS3231 starting from register 00h
  *second = bcdToDec(Wire.read() & 0x7f);
  *minute = bcdToDec(Wire.read());
  *hour = bcdToDec(Wire.read() & 0x3f);
  *dayOfWeek = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month = bcdToDec(Wire.read());
  *year = bcdToDec(Wire.read());
}

void makeTimeDate()
{  
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  // retrieve data from DS3231
  readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
  &year);
  if (hour<10)
  {
    gbUhrzeit = "0" + String(hour,DEC);
  }
  else
  {
    gbUhrzeit = String(hour,DEC);
  }
  
  if (minute<10)
  {
    gbUhrzeit = gbUhrzeit + "0" + String(minute,DEC);    
  }
  else
  {
    gbUhrzeit = gbUhrzeit + String(minute,DEC);    
  }
  
  if (second<10)
  {
    gbUhrzeit = gbUhrzeit + "0" + String(second,DEC);
  }
  else
  {
    gbUhrzeit = gbUhrzeit + String(second,DEC); 
  }
  
  gbWochentag = dayOfWeek;
  if (dayOfMonth<10)
  {
    gbDatum = "0" + String(dayOfMonth,DEC);
  }
  else
  {
    gbDatum = String(dayOfMonth,DEC);
  }
  
  if (month<10)
  {
    gbDatum = gbDatum + "0" + String(month,DEC);
  }
  else
  {
    gbDatum = gbDatum + String(month,DEC); 
  }
  
  gbDatum = gbDatum + String(year,DEC);
}

void cron1()
{
  makeTimeDate();
}
void cron2()
{
   readBMP();
}
void cronjob() {
  long tmp = millis();
  if ((t1 + (cron_1 * 1000)) <= tmp) {
    cron1();
    t1 = millis();
  }
  if ((t2 + (cron_2 * 1000)) <= tmp) {
    cron2();
    t2 = millis();
  }
}