Nya DRLer + spolning

DRL lever ett hårt liv efter vintern så hade en fått en stenskott och dom var både skitiga och slitna.
Beställde ny och bytte ut dom samtidigt så kopplade jag in elen där det redan fanns framdraget el för dimljusen. Stiftade in 2 kablar vit kabel blev jord och blå-grön DRL spänning.

När jag hade fronten borta så passade jag på att koppla in
spolning på DRL ljusen ska även skaffa skyddsfilm för
dom så får vi se om dom överlever lite bättre.
Kopplade in spolningen för den vanliga vindrutespolningen.
2 T-stycken och 2 L-kopplingar + spolmunstycken som
är till Volvo. 



9000 utbyte av passagerarkrockkudde till handskfack.

Har alltid stört mig på passagerarkrockkudden och avsaknaden av handskfack.
Så nu flev det ett utbyte. Monterade fem 10 ohms motstånd parallellt för att ersätta krockkudden.
(mätte upp 2,1 ohm). Två buntband för fixering och 2 kabelskor 1,5 mm till kontakten.
Sedan bar det iväg till skroten för att borra bort fästen.
Montage av fästena :
Och med lite trixande (gäller att få kabelstammen på plats) fick man handskfacket på plats.
Det jag saknar nu är sparkskyddet under det som fanns på skroten var lite väl mosad.
Passade på att fräsha upp en av strålkastarna som blivit mossig. Övre och undre reflektor delen fick lite silverfärg (borde varit värmetålig färg men, men). Har beställt 2 nya för att kunna byta framöver.
Jag får lägga till att jag kommer montera tillbaks kudden iochmed att besiktningen kräver att
kudden måste finns kvar oavsett den är inkopplad eller inte.

Ny Surfplatta

lite större och mycket snabbare...tyvärr så är det svårt att hitta en större surfplatta som passar i
ramen för gamla stereon. Men det blev en bra infästning med skruvarna för gamla stereon och
gummi packningar. Och Av/På knappen hamnade på ovansidan som man måste vänja sig vid.
Surfplattan
 Och ramen fick modifieras för att passa (det återstår lite filande)  



SID text Canbus Del 2 +,+

Det har ju blivit vintertid så då måste man fixa SID tiden (med en snabb fix).
case 0x730 : //        ID   Byte 0  Byte 1  Byte 2  Byte 3  Byte 4  Byte 5  Byte 6  Byte 7
              //      730h   -       SEC     MIN     HOUR    DAY     MONTH   ENGCOLD   -
value=3 ;  CanbusRead(); Rx = Rx-1; //  byte 3 Hour  (Rx = Rx-1;) ger vintertid
Convert(); HourA=RxA; HourB=RxB;  // Serial.println("Time Recived! ");


Sedan passade jag på att lägga in en HalkVarning som ploppar upp vid nollgrader eller kallare.
Fungerar i Night Panel läget (man har ju ingen Temp. kontroll då).

Läser av Canbus och konv. värdet:

case 0x7A0:                                   //  Outside temp
value=2 ;CanbusRead(); OTemp0 = Rx;
value=1 ;CanbusRead(); OTemp1 = Rx;
OTemp = (OTemp1 * 256)+OTemp0 ;   // konv. 2 8bit till 16 bit och Decimal
OTemp = OTemp/10-40;  Serial.print("Outside Temp ");Serial.println(OTemp);
Rx=OTemp; Convert(); OTempA=RxA; OTempB=RxB;
break;

Kontrollerar om ute temp är noll eller lägre:
if (OTemp <= 0 && currentSekund >= 60 && Cold == 0) {request = 1; Status=4; Cold=1;      // Outside temp =< 0
                byte sndStat = CAN0.sendMsgBuf(0x430, 0, 8, dataB);delay(30);} // send Beep 430 when Outside temp =< 0
      if (OTemp > 1)  Cold = 0;  // liten hystres: +2 innan halk varning kan återkomma

SID texten:
byte dataD1[8]= {0x02, 0x96, 0x02, 0x48, 0x61, 0x6C, 0x6B, 0x2E};  //  Halk.  
byte dataD2[8]= {0x01, 0x96, 0x02, 0x61, 0x72, 0x6E, 0x56, 0x2D,};  //  Varn-
byte dataD3[8]= {0x00, 0x96, 0x02, OTempB, OTempA,0x20, 0x20, 0x20};  //  Outside temp. values


2017-12
Lite modifieringar så att man kan trycka på CLR knappen när Parkeringshjälpen varnar och om man tryckt på SET-knappen
och vill nolla något. Satt tiden  till 10 sek,

case 0x439:  //-------------------- SPA är aktiv
CLRtime = currentSek ;  // nollar CLR timer = inaktiverar request i 10 sek.
Serial.println("SPA aktiv  ");
break;


case 0x290: //-------------------set eller clr button pressed
  value=3 ;   //// 80 = vol-   && (rxBuf[5] == 0x80)
  CanbusRead();
     if (Rx == 0x40) CLRtime = currentSek ;  // vid SET nollar CLR timer = inaktiverar CLR request i 10 sek.  
     if (Rx == 0x80 && currentSek-CLRtime >= 10 && currentSek >= 40) {request = 1; Status=0;}   // inakriverar clr funktionen under 30 sek.
break;


Rattknappsbelysning v.2

Har ju tryckt in 2 gröna lysdioder på 2,5 volt som strömmatas ifrån pullup motståndet i SID enheten.
Man får dra en extra kabel emellan knappsatserna.
Placeringen på dioden försökte jag få så
centralt placerad som möjligt. Nackdelen är att den lyser igenom lite mellan knapp och ram.

 Försökte få lite bilder på resultatet.















Uppdatering 2018-08: Orginal knapparna fick dubbla ytmonterade dioder i sig. Det är lite knepigt med placeringen så att dom inte kommer ivägen för knapparna när man trycker. Lite epoxylim fixerar dom på plats. Och röd är jord och svart är 5 volt, självklart....och jorden finns tillgänglig på andra sidan så det är bara en extra kabel +5volt som måste dras över dit.







SID text Canbus Del 2

Nu har Canbus kortet fått 3 kopplingar till mitt andra kort som gör att om något förändras
på den så som Halvljus automatiken , AQS sensorn + SID pling när den aktiveras eller Baksätesvärmen så visas det i SIDen.
Tyvärr så har jag inte hittat å,ä,ö har provat en massa Hex värden men Saab verkar inte använt
den utökade ASCII standarden. Hittade en massa pilar och klocksymboler bara.
 


Sedan så tar Canbus kortet och läser av Inne temperaturen och Kylvätske temp.
Man skulle kunna visa något annat , försökt leta efter batterspänningen som jag saknar ifrån 9000.
Presenterar det ihop med tid och datum. (Som jag ställde in med orginal stereon.
behövde bara koppla 12 volt, jord och GMLAN1 för att sedan ställa in tid och datum.
Nästa gång får jag försöka sniffa trafiken.)
Den informationen visas när man trycker på CLR knappen på rattknapparna.


SID text Del 2 Arduino/Canbus mjukvaran

// Skickar fråga till SID att skriva på 2 rader. När man trycker på CLR knappen på ratten.
// Hämtar SID tid och datum, kylvatten temp och inne temp. konverterar till HEX och delar upp det per byte.
// Och skickar det till SIDen. 3 ingångar från det andra UNO kortet för att indikera för ändringar
// för AQS, Halvljus och Baksätes värmen.

#include <mcp_can.h>
#include <SPI.h>
int request = 0 ;
MCP_CAN CAN0(10);     // Set CS to pin 10
//-----recive
long unsigned int rxId;
unsigned char len = 0;
unsigned char rxBuf[8];
int value=0 ; byte Rx=0; byte RxA = 0; byte RxB = 0;byte RxC = 0;byte RxP = 0; 
       
byte Hour = 0;  byte HourA = 0;  byte HourB = 0; byte MinA = 0;  byte MinB = 0;
byte Day = 0; byte Month = 0; byte DayA = 0; byte MonthA = 0; byte DayB = 0; byte MonthB = 0;
byte CTemp = 0; byte CTempA = 0; byte CTempB = 0;
byte ITemp = 0; byte ITempA = 0; byte ITempB = 0;       
//---------------AQS-sensorn
int airSensorIN = 6;    //ok 6,7,8,9,12 ingång AQS ej 10, 11, 13
int AQSstatus = 0;
int Smell = 0;           // 0=  low 1 = High 2 = normal ,25, värde för dålig luft normal 15-17
int lightOn = 0; 
int bHeat = 0;
int Status = 0;  // display status
#define CAN0_INT 2  //tillagt
byte dataA[8] = {0x11, 0x00, 0x03, 0x19, 0x00, 0x00, 0x00, 0x00};  //0x348 SID audio text request from "IHU"
              //       rad    *     19                              //*FF=inget meddelande,prio.nivå  b3(19=IHU 12=SPA 23=ACC)
//[2]: request type: 1 = Engineering test; 2 = Emergency; 3 = Driver action; 4 = ECU action; 5 = Static text; 0xFF = We don't want to write on SID  
byte dataB[8] = {0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};    // SID beep just for test

void setup()
{
  Serial.begin(9600);
  if(CAN0.begin(CAN_47K619BPS,1) == CAN_OK) Serial.println("MCP2515 Initialized Successfully!");
  else Serial.println("Error Initializing MCP2515...");
  pinMode(2, INPUT);                            // Setting pin 2 for /INT input
//----AQS
pinMode(airSensorIN, INPUT);    // AQS ingång INPUT_PULLUP
}
void loop()
{               //ordning från  rad  ascII-----------------------
byte data1[8] = {0x45, 0x96, 0x01, HourB, HourA, 0x3A, MinB, MinA};  //  1 message 1    01 = rad 1 alt. 81= uppdaterad rad 1
byte data2[8] = {0x04, 0x96, 0x01, 0x20, 0x20, DayB, DayA, 0x2F};  //  day/  "SAAB" S=53 A=41 B=42 20=_
byte data3[8] = {0x03, 0x96, 0x01, MonthB, MonthA, 0x20, 0x20, 0x20};  //Month "SAAB" S=53 A=41 B=42 3 SISTA BYTE SYNS EJ PÅ sid

byte dataA1[8]= {0x02, 0x96, 0x02, 0x41, 0x51, 0x53, 0x20, 0x52};  //  AQS_R 
byte dataA2[8]= {0x01, 0x96, 0x02, 0x63, 0x69, 0x72, 0x6B, 0x20};  //  cirk_ 

byte dataB1[8]= {0x02, 0x96, 0x02, 0x48, 0x61, 0x6C, 0x76, 0x6C};  //  Halvl
byte dataB2[8]= {0x01, 0x96, 0x02, 0x6A, 0x75, 0x73, 0x20, 0x20};  //  jus__

byte dataC1[8]= {0x02, 0x96, 0x02, 0x42, 0x61, 0x6B, 0x73, 0x2E};  //  Baks.  
byte dataC2[8]= {0x01, 0x96, 0x02, 0x76, 0x61, 0x72, 0x6D, 0x20};  //  varm_   D1=å ?

byte dataL[8] = {0x00, 0x96, 0x02, 0x41, 0x56, 0x00, 0x00, 0x00};  //328 Av  SID text
byte dataH[8] = {0x00, 0x96, 0x02, 0x50, 0xE1, 0x00, 0x00, 0x00};  //328 På SID text   E1=Å D7=Ö (D1=Ä)

byte data4[8] = {0x02, 0x96, 0x02, 0x49, 0x6E, ITemp, ITempB, ITempA};  //   In CTemp+- message 0 "SAAB" S=53 A=41 B=42 20=_
byte data5[8] = {0x01, 0x96, 0x02, 0x20, 0x4B, 0x79, 0x6C, CTemp};  //  Kyl 328 SID audio text   0 message 0 "SAAB" S=53 A=41 B=42 3 SISTA BYTE SYNS EJ PÅ sid
byte data6[8] = {0x00, 0x96, 0x02, CTempB, CTempA, 0x20, 0x20};  //328 SID audio text   0 message 0 "SAAB" S=53 A=41 B=42 3 SISTA BYTE SYNS EJ PÅ sid
             //order   SID   row   ASCII-------------------
   unsigned long currentSekund = millis()/ 1000 ;  //unsigned long värde i sekunder
//----------Kontrollerar vad digi-ingångarna för AQS,bHeat och Halvljus
      AQSstatus = digitalRead(airSensorIN);
      if (AQSstatus == 1 && Smell == 0) {request = 1; Smell = 1; Status=1;  // AQS hög  Status = 1;  ingång 6
     
              sndStat = CAN0.sendMsgBuf(0x430, 0, 8, dataB);delay(30);}     // send Beep 430 when AQS go High
     
if (AQSstatus == 0 && Smell == 1) {request = 1; Smell = 0; Status=1;}  // AQS låg  Status = 11;
      if (digitalRead(7) == 1 && lightOn == 0) {Status = 2; request = 1; lightOn = 1;}  // Halvljus På ingång 7
      if (digitalRead(7) == 0 && lightOn == 1) {Status = 2; request = 1;lightOn = 0;}  // Halvljus Av
      if (digitalRead(8) == 1 && bHeat == 0)   {Status = 3; request = 1; bHeat = 1;}  // BaksätesVärme På ingång 8
      if (digitalRead(8) == 0 && bHeat == 1)   {Status = 3; request = 1; bHeat = 0;}  // BaksätesVärme Av
     
            // Serial.print("\t");                // print a tab character   
             
//------ send data:  ID = 0x100, Standard CAN Frame, Data length = 8 bytes, 'data' = array of data bytes to send
  if (request == 1) { // if request is active
  byte sndStat = CAN0.sendMsgBuf(0x348, 0, 8, dataA);delay(10);      //0x348 SID audio text
     // Serial.println("Request Sent Successfully!");
    }  
//  -----receive SID okey
 if(digitalRead(CAN0_INT)== LOW && request == 1)   {                      // 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 == 0x368 ){ //   får OK från SID att skicka
       for(int i = 0; i<len; i++)                // Print each byte of the data
       {
       if ((rxBuf[0] == 0x00) && (rxBuf[1] == 0x19)) {    //rad 0=1+2 ledig 0x19 IHU får ok 0x12 SPA
//--------------skickar SID texter
   byte sndStat = CAN0.sendMsgBuf(0x328, 0, 8, data1);delay(30);      //0x328 SID audio text skickas //0x357 SPA
        sndStat = CAN0.sendMsgBuf(0x328, 0, 8, data2);delay(30);      //0x328 SID audio text skickas
        sndStat = CAN0.sendMsgBuf(0x328, 0, 8, data3);delay(30);      //0x328 SID audio text skickas
                //sndStat = CAN0.sendMsgBuf(0x328, 0, 8, data3);delay(30);      //0x328 SID audio text skickas
      if (Smell == 0&&Status==1) {sndStat = CAN0.sendMsgBuf(0x328, 0, 8, dataA1);delay(30);
                                  sndStat = CAN0.sendMsgBuf(0x328, 0, 8, dataA2);delay(30);
                                  sndStat = CAN0.sendMsgBuf(0x328, 0, 8, dataL);delay(30);  }    //0x328 SID audio text skickas
      if (Smell == 1&&Status==1) {sndStat = CAN0.sendMsgBuf(0x328, 0, 8, dataA1);delay(30);
                                  sndStat = CAN0.sendMsgBuf(0x328, 0, 8, dataA2);delay(30);
                                  sndStat = CAN0.sendMsgBuf(0x328, 0, 8, dataH);delay(30);
}      //0x328 SID audio text skickas
     if (lightOn == 0&&Status==2){sndStat = CAN0.sendMsgBuf(0x328, 0, 8, dataB1);delay(30);   
                                 sndStat = CAN0.sendMsgBuf(0x328, 0, 8, dataB2);delay(30);
                                 sndStat = CAN0.sendMsgBuf(0x328, 0, 8, dataL);delay(30);  }      // Halvljus AV
    if (lightOn == 1&&Status==2){sndStat = CAN0.sendMsgBuf(0x328, 0, 8, dataB1);delay(30);   
                                 sndStat = CAN0.sendMsgBuf(0x328, 0, 8, dataB2);delay(30);
                                 sndStat = CAN0.sendMsgBuf(0x328, 0, 8, dataH);delay(30);  }      // Halvljus På
      if (bHeat == 0&&Status==3){sndStat = CAN0.sendMsgBuf(0x328, 0, 8, dataC1);delay(30);
                                 sndStat = CAN0.sendMsgBuf(0x328, 0, 8, dataC2);delay(30);   // BaksätesVärme   
                                 sndStat = CAN0.sendMsgBuf(0x328, 0, 8, dataL);delay(30); }     //0x328 SID audio text skickas
      if (bHeat == 1&&Status==3){sndStat = CAN0.sendMsgBuf(0x328, 0, 8, dataC1);delay(30);
                                 sndStat = CAN0.sendMsgBuf(0x328, 0, 8, dataC2);delay(30);   // BaksätesVärme   
                                 sndStat = CAN0.sendMsgBuf(0x328, 0, 8, dataH);delay(30); }     //0x328 SID audio text skickas

      if (Status==0)     {sndStat = CAN0.sendMsgBuf(0x328, 0, 8, data4);delay(30);      //0x328 SID audio text skickas
                          sndStat = CAN0.sendMsgBuf(0x328, 0, 8, data5);delay(30);      //0x328 SID audio text skickas
                          sndStat = CAN0.sendMsgBuf(0x328, 0, 8, data6);delay(30);      //0x328 SID audio text skickas
          }
          request = 0;  // message sent new requste needs
          Serial.println("Message Sent Successfully!");Serial.print(request);
          delay(850);  // 1 sek mellan medellandet skickas (alt.1000-3*34(102)=>898ms)    
        } } } } 
///-----------läser av CAnbusen
           if(digitalRead(CAN0_INT)== LOW && request == 0)  {               // read clock and CLR button 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       
switch (rxId) {
case 0x290: //clr button pressed
value=3 ;   //// 80 = vol-   && (rxBuf[5] == 0x80)
CanbusRead();
   if (Rx == 0x80) {request = 1; Status=0;}   // åiergå till normal status


break; 
case 0x5C0: // ECU coolant Temp 5C0h   -   COOLANT   PRES1   PRES0
value=1 ;   // vilken byte som ska läsas av
CanbusRead();
CTemp=Rx;
    Rx = CTemp-40 ;  //0x28=40dec 40 ;
//   Serial.print("Coolant Temp Recived Successfully! ");Serial.println(Rx);
Convert();
CTempA=RxA; CTempB=RxB; CTemp=RxP;   Serial.print(RxA);Serial.println(RxB);
break;
case 0x520 : //-------Reciving ACC Inside Temp 520h  -   ACC   -   -   -   TEMP
  value=5 ;   // vilken byte som ska läsas av
CanbusRead();//  byte 5
  ITemp=Rx;
   Rx = ITemp-40 ;  //28=40dec
//   Serial.print("Inside Temp Recived Successfully! ");Serial.println(Rx);
Convert();       
ITempA = RxA; ITempB = RxB; ITemp=RxP;        Serial.print(RxA);Serial.println(RxB);
break;
case 0x730 : //        ID   Byte 0  Byte 1  Byte 2  Byte 3  Byte 4  Byte 5  Byte 6  Byte 7
              //      730h   -       SEC     MIN     HOUR    DAY     MONTH   ENGCOLD   -
value=3 ;  CanbusRead();//  byte 3 Hour
Convert(); HourA=RxA; HourB=RxB;  // Serial.println("Time Recived Successfully!");
value=2 ;  CanbusRead();//  byte 2 Min
Convert(); MinA=RxA; MinB=RxB;
value=5 ;  CanbusRead();//  byte 5 Month
Convert(); MonthA=RxA; MonthB=RxB;
value=4 ;  CanbusRead();//  byte 4 Day
Convert(); DayA=RxA; DayB=RxB;
// Serial.print(HourA); Serial.print(HourB);Serial.print(" : ");Serial.print(MinA);Serial.println(MinB);   
break;
}     } }
 void CanbusRead(){
        for(int i = 0; i<len; i++)   {              // Print each byte of the data
            Rx=(rxBuf[value]);         // läser 1  byte som är Tempen
       }    }
void Convert(){   //---------Convert and splitt value and with prefix +/-  C-A-B     
  if (Rx >= 0 ){RxP = 0x20;} else {RxP = 0x2D; Rx=-Rx;} // 2D Minus tecken 2B Plus tecken
            //--------hundratal
      if (Rx<900 && Rx >= 800) {RxC=0x38; Rx=Rx-800;} if (Rx >= 900)           {RxC=0x39; Rx=Rx-900;}
      if (Rx<700 && Rx >= 600) {RxC=0x36; Rx=Rx-600;} if (Rx<800 && Rx >= 700) {RxC=0x37; Rx=Rx-700;}
      if (Rx<500 && Rx >= 400) {RxC=0x34; Rx=Rx-400;} if (Rx<600 && Rx >= 500) {RxC=0x35; Rx=Rx-500;}
      if (Rx<300 && Rx >= 200) {RxC=0x32; Rx=Rx-200;} if (Rx<400 && Rx >= 300) {RxC=0x33; Rx=Rx-300;}     
      if (Rx<100)              {RxC=0x30; Rx=Rx;}     if (Rx<200 && Rx >= 100) {RxC=0x31; Rx=Rx-100;} 
      //--------tiotal
if (Rx<90 && Rx >= 80) {RxB=0x38; RxA=Rx-80;} if (Rx >= 90)          {RxB=0x39; RxA=Rx-90;}
      if (Rx<70 && Rx >= 60) {RxB=0x36; RxA=Rx-60;} if (Rx<80 && Rx >= 70) {RxB=0x37; RxA=Rx-70;}
      if (Rx<50 && Rx >= 40) {RxB=0x34; RxA=Rx-40;} if (Rx<60 && Rx >= 50) {RxB=0x35; RxA=Rx-50;}
      if (Rx<30 && Rx >= 20) {RxB=0x32; RxA=Rx-20;} if (Rx<40 && Rx >= 30) {RxB=0x33; RxA=Rx-30;}     
      if (Rx<10)             {RxB=0x30; RxA=Rx;}    if (Rx<20 && Rx >= 10) {RxB=0x31; RxA=Rx-10;} 
        //-----ental
        if (RxA==0)RxA=0x30;if (RxA==1)RxA=0x31;if (RxA==2)RxA=0x32;if (RxA==3)RxA=0x33;if (RxA==4)RxA=0x34;
        if (RxA==5)RxA=0x35;if (RxA==6)RxA=0x36;if (RxA==7)RxA=0x37;if (RxA==8)RxA=0x38;if (RxA==9)RxA=0x39;
             }
/*********************************************************************************************************
*********************************************************************************************************/