Ny design Virtuino.

Lagt in lite nya parametrar mest för skoj skull. NightPanel flik som bara visar utetemp och snöflinga.
Länk till dom gamla filerna : GoogleDrive
Bromsljus, dimljus, blinkers, farthållar indikering, recirkulation, dörr-bagage öppna mm. och lite förbrukningsvärden som uppdateras 1/min.
Lagt in en massa appar för att få Virtuino och Waze att starta vid start av surfplattan, laddning mm.
Använt AutoStart, MacroDroid och Trigger.

Arduino-Virtuino code

Senaste programvaran finns på Google Driven./2021-06-07

Virtuino istället för RemoteXY

Hittade detta alternativa program till Surfplattan.
Virtuino den har en liten annan uppbyggnad och med den fördelen att man kan använda bilder.

En första design.
Med och utan halvljuset på.
Dom vanliga tempvärdena och
la in dörrindikerings värden som
jag tänkte använda i version 2.
När man lägger i backen visas denna bild med avstånd och larm bild som ska dyka upp när den larmar.

Sen verkar den fungera bättre ihop med SID kommunikationen också.





Sitter med ett problem hur jag ska tolka dörr värdena, nivåerna är
Bagagelucka 4 ,  Höger bakdörr 8, Vänster bakdörr 16, Höger framdörr 32, Vänster framdörr 64
samt Olåst 128, Det blir en massa kombinationer.
T.ex 192 är olåst och vänster framdörr öppen med bagageluckan öppen blir det 196....osv.
Trir jag fixat det med denna lösning: (ny kod är upplagd)
    //------------------------     Checking door status DV10-15
if (DoorStatus-128 >= 0) { virtuino.vDigitalMemoryWrite(10,0); DoorStatus = DoorStatus-128; }  // door 128 = unlocked
           else { virtuino.vDigitalMemoryWrite(10,1); }          // door  = locked
if (DoorStatus-64 >= 0) { virtuino.vDigitalMemoryWrite(11,1); DoorStatus = DoorStatus-64; }  // Driversdoor 64 = open
           else { virtuino.vDigitalMemoryWrite(11,0); }        
if (DoorStatus-32 >= 0) { virtuino.vDigitalMemoryWrite(12,1); DoorStatus = DoorStatus-32; }  // Passangerdoor 32 = open
           else { virtuino.vDigitalMemoryWrite(12,0); }
if (DoorStatus-16 >= 0) { virtuino.vDigitalMemoryWrite(13,1); DoorStatus = DoorStatus-16; }  // LeftBacksdoor 16 = open
           else { virtuino.vDigitalMemoryWrite(13,0); }
if (DoorStatus-8 >= 0) { virtuino.vDigitalMemoryWrite(14,1); DoorStatus = DoorStatus-8; }  // RightBackdoor 8 = open
           else { virtuino.vDigitalMemoryWrite(14,0); }
if (DoorStatus-4 >= 0) { virtuino.vDigitalMemoryWrite(15,1); DoorStatus = DoorStatus-4; }  // Trunk 4 = open
           else { virtuino.vDigitalMemoryWrite(15,0); }

CanBus parametrar till Surfplattan via Blåtand.

Inspirerade av dessa "byggen": Car Dash Tablet och
Canbus-reverse-engineering-with-arduino-and-ios
Skaffade ett Blåtandskort (HC-06) till Canbus kortet för att kunna skicka parametrar till Surfplattan.
Tyvärr är man ingen Android programmerare så denna app RemoteXY får duga.
5 parametrer i den fria versionen så det blev 3 temp, långtext + batteri spänningen.

Man går in på RemoteXY hemsida och skapar sin design som man sedan kopierar in i Arduino
programmet (med lite modifikationer).
https://saab9000vector.blogspot.com/2018/12/remotexy-kod.html
Batterispänningen spänningsdelar jag ner till en analog ingång. (med 33k och ett 68 k motstånd)
Konverterar värdet i programet så att det stämmer hyfsat.

Det negativa är att SID meddelanderna inte funkar 100% försökt avlasta programet lite och
minus grader visas som 255 och under , får väl modifiera lite på koden...

RemoteXY kod.

// RemoteXY select connection mode and include library
#define REMOTEXY_MODE__SOFTSERIAL
#include <SoftwareSerial.h>
#include <RemoteXY.h>
// RemoteXY connection settings
#define REMOTEXY_SERIAL_RX 2
#define REMOTEXY_SERIAL_TX 3
#define REMOTEXY_SERIAL_SPEED 9600


// RemoteXY configurate 
#pragma pack(push, 1)
uint8_t RemoteXY_CONF[] =
  { 255,0,0,44,0,80,0,8,13,0,
  67,4,9,11,20,5,134,26,11,67,
  4,38,11,20,5,134,26,11,67,4,
  66,11,20,5,134,26,11,67,4,64,
  44,20,5,134,26,11,129,0,10,22,
  18,6,17,73,110,110,101,45,32,32,
  32,32,32,32,32,32,32,75,121,108,
  97,114,45,32,32,32,32,32,32,85,
  116,101,116,101,109,112,0 };
 
// this structure defines all the variables of your control interface
struct {

    // output variable
  char INtemp[11];  // string UTF8 end zero
  char Coolant[11];  // string UTF8 end zero
  char OUTtemp[11];  // string UTF8 end zero
  char Voltage[11];  // string UTF8 end zero
    // other variable
  uint8_t connect_flag;  // =1 if wire connected, else =0

} RemoteXY;
#pragma pack(pop)
//           END RemoteXY include          //
  double temp = 24;

void setup()
{
  RemoteXY_Init (); 
}

void loop()
{
  RemoteXY_Handler ();  
if(currentSek-rXYtime >= 4)   {   //uppdaterar rXY värderna vart 4dje sek.
  //      value, ? , decimals, rXY label   tillagt manuellt
  dtostrf(ITemp, 0, 0, RemoteXY.INtemp);  
  dtostrf(CTemp, 0, 0, RemoteXY.Coolant);
  dtostrf(OTemp, 0, 0, RemoteXY.OUTtemp);
  dtostrf(battVolt, 0, 1, RemoteXY.Voltage);
  rXYtime = currentSek;      }

//----------- batteri voltage
    battVolt = analogRead(battPin);     // 1024 = 5 volt = ca.15 volt
   //battVolt = 967 ;  // test
    battVolt = (5*battVolt)/1024 ;    // konverterar analoga värdet till volt 0-5 volt
    battVolt = ((33+68)/33 *battVolt)*10 ; // kontverterar 5 till 12 volt (analog in)
    battVolt = battVolt/10 ;
}

Styrning av Halvljus automatiken med ljussensorn för inst.panelen.

Tänkte rationalisera bort ljussensorena som styr halvljus automatiken.
Så tar ljussensorvärdet ifrån instrumentpanelen.
Det är 2 8bitars värden men jag använder bara ett,

case 0x410: //-------   Light Dimm Sensor values
                   // (Integer value is between about 1800h(6144 dec) to 2C00h(11264 dec))
value=3 ;CanbusRead(); LSensor0 = Rx;
value=4 ;CanbusRead(); LSensor1 = Rx;  // använder endast Lsensor1 värdet för styrning av halvljuset.

Sedan använder jag ganska grov hystres för att undvika flip-flopande lampor.

  if (LSensor1 <= 5  && lightOn == 0) {Status = 2; request = 1; lightOn = 1; digitalWrite(lightOnOUT,HIGH); }  // Halvljus På 01-05 hystres 
  if (LSensor1 >= 15 && lightOn == 1) {Status = 2; request = 1; lightOn = 0; digitalWrite(lightOnOUT,LOW); }  // Halvljus Av








Testningen går ju lite långsam eftersom det är kolsvart både till och från jobbet.
Och styrningen går via det gamla Arduino kortet tillsvidare. Ändringen i det gamla kortet.

pinMode(headLightPinCan, INPUT);    // halvljus Ingång, från Can-kortet
 //---------------------------- HALVLJUS AUTOMATIK
        headLightCan = digitalRead(headLightPinCan);
       if (headLightCan == 1 && lightOn == 0) {                                                          
                digitalWrite(headlightPin,HIGH);  // tänder halvljuset   
                delay(50); lightOn = 1; 
                headLightTimer = currentSekund ; // Sätter timer tid          
            } //{lightOn = 1;}
       if (headLightCan == 0 && lightOn == 1) {
                digitalWrite(headlightPin,LOW);
                delay(50); lightOn = 0; 
                headLightTimer = currentSekund ; // Sätter timer tid
              }

Grotta ner sig i CANbus med Arduino

Köpt på mig MCP2515 CANbus kort och ett Arduino Pro Micro kort.
Installtion av Arduino kortet hittar man här:
https://learn.sparkfun.com/tutorials/pro-micro--fio-v3-hookup-guide/all
och så här kopplar man inkl. 12 volts reg på RAW och GND.















Sen kan man krympa ner den mer än detta men som vanligt tar vi det senare......

Här är koden och tanken är att man filtrerar bort all information man inte vill ha med.
Det är ju mycket babbel på CANbusen.

// demo: CAN-BUS Shield, receive data
#include <mcp_can.h>
//#include <mcp_can_dfs.h>
#include <SPI.h>

long unsigned int rxId;
unsigned char len = 0;
unsigned char rxBuf[8];
unsigned long OLDmilliSek;
MCP_CAN CAN0(10);                // Set CS to pin 9
#define CAN0_INT 2                  //tillagt

void setup()
{
  Serial.begin(9600);
  //CAN0.begin(MCP_ANY, CAN_33K3BPS, MCP_16MHZ);
  //CAN0.begin(CAN_47K619BPS,2);              // init can bus :CAN_33K3BPS baudrate = 33.3(GMLAN) with 8MHZ change 2 to 1 run with 16mhz oscilator
  //CAN0.begin(CAN_33K3BPS,1);                // CAN0.begin(CAN_47K619BPS,1);   CANbus-I
  CAN0.begin(CAN_500KBPS,1);                // CANBUS-P powertrain
  //pinMode(CAN0_INT, INPUT);                            // Configuring pin for /INT input
  pinMode(2, INPUT);                            // Setting pin 2 for /INT input
  Serial.println("MCP2515 Library Receive CAN BUS Example...");
}

void loop(){
  unsigned long currentmilliSek = millis(); // / 1000 ;  //unsigned long värde i sekunder
    if(digitalRead(CAN0_INT)== LOW)                         // If pin 2 is low, read receive buffer
    {
      CAN0.readMsgBuf(&len, rxBuf);              // Read data: len = data length, buf = data byte(s)
      rxId = CAN0.getCanId();                    // Get message ID
      if(rxId == 0x439 ){ //  290= steeringwheel || rxId == 0x530 om Id = ACC 520 eller 530 0x280 crusies byte 4
        //filtrerar bort 439h - SPA distance
      } else {
      Serial.print("ID: ");
      Serial.print(rxId, HEX);
      Serial.print("  Data: ");
      for(int i = 0; i<len; i++)                // Print each byte of the data
      {
       if(rxBuf[0] < 0x80) {                     // shows changed Status
        if(rxBuf[i] < 0x10)                     // If data byte is less than 0x10, add a leading zero
        {
          Serial.print("0");
        }
        Serial.print(rxBuf[i], HEX);
        Serial.print(" ");
      }                                 // satus change end
      }
      Serial.print("  ");Serial.print(currentmilliSek-OLDmilliSek);Serial.println();
      OLDmilliSek=currentmilliSek;    // tidstämpel
    }                                     // filter end
    }
}